Phase 20.32 — Runner 移行(Hakorune 側への薄いゲート)
目的
- Rust Runner への依存を段階的に縮小し、Hakorune 側に「薄い Runner ファサード(Gate‑C 相当)」を実装する。
- 既存の VM/Core 実装(MIR 実行器)は維持。境界(JSON v0 受理→MIR 構築→実行)の一部を Hako 側に寄せる。
非目標(本フェーズではやらない)
- using 解決(AST/ファイル)全移行、プラグインローダ全置換、大規模 CLI/ENV 互換カバー。
- 既定経路の全面切替(既定は Rust を維持。Hako Runner は opt‑in)。
設計原則(抜粋)
- Box‑First / Fail‑Fast を継続。副作用境界(ファイル/ENV/プロセス)は箱で隔離、静かなフォールバックは禁止。
- 既定 OFF のトグルで段階導入。ロールバック容易(小差分・可逆)。
- 仕様不変:VM の意味論は Rust Builder→NyVM(Core) に依存。Hako Runner は橋渡しのみ。
範囲(Phase 20.32)
- Hako Runner 薄層(lang/src/runner/runner_facade.hako を拡張)
- 入力: JSON v0(
--json-file/--ny-parser-pipe相当)。 - 出力: 数値 Result を exit code へ反映。Quiet/Noise の ENV を最小受理(
NYASH_QUIETなど)。 - 依存: 既存の Core Dispatcher / Interpreter へ委譲。extern は追加しない。
- 入力: JSON v0(
- Rust Runner 側トグル
HAKO_SCRIPT_RUNNER=1(既定OFF)で Hako Runner を呼び出す経路を追加(呼出し/戻りは既存の Gate‑C と同等)。
- スモーク
- Gate‑C(file/pipe) の最小 canary(return/binop/if)を Runner(Hako) 経由でも PASS 確認(opt‑in)。
実装項目(MVP)
- Hako: runner_facade.hako を Gate‑C 最小対応へ拡張
- 受理: JSON v0 文字列/ファイルパス
- 実行: 既存 Core VM の JSON→実行(間接呼び)
- 退出: 数値→exit code、非数値→Fail‑Fast
- Rust: トグルで Hako Runner を経由
HAKO_SCRIPT_RUNNER=1で file/pipe 両方の分岐に Hako 呼出しを追加
- ENV 整理
- 既定 OFF の静音:
NYASH_QUIET=1/HAKO_QUIET=1、NYASH_CLI_VERBOSE=0 - plugins は OFF 既定で通す(本フェーズでプラグイン依存を持ち込まない)
- 既定 OFF の静音:
- スモーク
- quick/core に opt‑in 追加:
SMOKES_ENABLE_HAKO_RUNNER=1 - 代表 2 本: file/pipe(return 7 / if→1)
- quick/core に opt‑in 追加:
次フェーズ(予告: 20.33+)
- CLI/ENV の薄い受理(引数配列・基本オプション)
- using/前処理の一部箱化(ファイル境界のみ、AST結合は後続)
- 子プロセス・再帰ガードを Hako へ移設(Rust との並走期間は短期)
受け入れ基準
- 既定経路(Rust Runner)は不変。Hako Runner 経路は opt‑in で quick 緑。
- Gate‑C 対称(file/pipe)で数値結果→exit code が一致。
- ノイズ最小(quiet on)かつ Fail‑Fast(非数値や不正入力は安定診断)。
トグル一覧(本フェーズ追加)
HAKO_SCRIPT_RUNNER=1(Rust→Hako Runner 経路に切替)SMOKES_ENABLE_HAKO_RUNNER=1(スモーク opt‑in)
リスクと対策
- 実行器の二重解釈: すべて JSON→MIR→既存 VM/Core 実行に統一し、Hako 側で独自実行はしない。
- ノイズ差: quiet 環境変数を強制し、Result 行のみ/exit code 対称性を確認。
参考
lang/src/runner/runner_facade.hakosrc/runner/pipe_io.rs(Gate‑C 既存挙動)lang/src/vm/core/json_v0_reader.hako(JSON v0 解析ユーティリティ)