# 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 は追加しない。 - 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) 1) Hako: runner_facade.hako を Gate‑C 最小対応へ拡張 - 受理: JSON v0 文字列/ファイルパス - 実行: 既存 Core VM の JSON→実行(間接呼び) - 退出: 数値→exit code、非数値→Fail‑Fast 2) Rust: トグルで Hako Runner を経由 - `HAKO_SCRIPT_RUNNER=1` で file/pipe 両方の分岐に Hako 呼出しを追加 3) ENV 整理 - 既定 OFF の静音: `NYASH_QUIET=1`/`HAKO_QUIET=1`、`NYASH_CLI_VERBOSE=0` - plugins は OFF 既定で通す(本フェーズでプラグイン依存を持ち込まない) 4) スモーク - quick/core に opt‑in 追加: `SMOKES_ENABLE_HAKO_RUNNER=1` - 代表 2 本: file/pipe(return 7 / if→1) 次フェーズ(予告: 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.hako` - `src/runner/pipe_io.rs`(Gate‑C 既存挙動) - `lang/src/vm/core/json_v0_reader.hako`(JSON v0 解析ユーティリティ)