Skip to content

[debt] doeff run の入力形式ごとの実行意味を単一 runtime 契約へ統一する #536

Description

@proboscis

結論

doeff run は、同じ Program を指定しても、入力形式と --runner の有無によって、入るハンドラと scheduler が変わります。利用者から見た「Program を実行する」という一つの操作に複数の意味があり、入力形式の変更だけで効果の処理結果が変わり得ます。

ここでいう runtime は、Program を実値へ評価する interpreter、handler stack、scheduler、env 解決を合わせた実行境界です。

確認済みの事実

2026-07-16 の main (b69f77b7) で確認しました。

  • --program と通常の -cresolve_context -> execute -> interpreter を通り、既定では default_interpreter が標準ハンドラと scheduled(...) を入れます。
    • doeff/cli/run_services.py:146-215
    • doeff/cli/run_services.py:215-292
  • --hy--runner を明示しなくても _dispatch_runner を通り、既定の doeff.runners.local.run_local は bare な run(program) を呼びます。
    • doeff/__main__.py:310-367
    • doeff/runners/local.py:13-35
  • --program / -c で非既定 runner を指定した場合も、env、transform、apply、interpreter の通常経路を使わず runner 側へ分岐します。
    • doeff/__main__.py:368-403
  • runner のテストは Pure(42) だけで同値性を確認しており、Ask、時間、並行処理、外部 promise を使う Program の意味が同じことは検証していません。
    • tests/cli/test_cli_runner.py:43-64

影響

  • source form を --program から --hy へ変えただけで、Ask や scheduler effect が処理不能になり得ます。
  • remote runner が通常経路の env / transform / interpreter 契約を再実装する必要があります。
  • doeff.runners.local の説明する「従来経路と同一」が、効果を持つ Program では成立しません。
  • 実行時の問題が Program 自体ではなく入口の違いに依存するため、必要な修正箇所が予測しにくくなります。

望ましい設計

入力形式は Program の作り方だけを担当し、その後は一つの runtime request と一つの実行契約へ合流させます。

概念上は次の形です。

--program / --hy / -c
        |
        v
 Program + RunRequest
        |
        v
runner (local / remote)
        |
        v
runtime(program, env=?, ctx=?)

runner は実行場所を選び、runtime は handler / scheduler / env の意味を所有します。同じ local runtime を通る限り、入力形式によって意味が変わらないことを構造的に保証します。

完了条件

  • --program--hy-c が同じ中間契約へ合流する。
  • local runner が通常の interpreter/runtime 契約を迂回して bare run(program) を呼ばない。
  • env、--set--apply--transformDoeffRunContext の扱いが入口間で明文化され、意図的に同一または明示的に拒否される。
  • AskSpawn/GatherWait、missing env の各 Program を全入力形式で実行し、意味の同値性を検証する。
  • custom/remote runner 向け契約を公開し、CLI 引数の再解析を不要にする。
  • 既存の --runner と interpreter の責任重複を整理し、移行・廃止方針を文書化する。

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions