# Current Task — Phase 21.4(Hako Parser → Analyzer / Self‑Host) 目的(このフェーズで到達するゴール) - Hako Parser(MVP)で AST JSON v0 を出力し、Analyzer の一次入力に採用(text は fallback 維持)。 - 代表ルール(HC001/002/003/010/011/020)を AST 入力で正確化。 - JSON(LSP) 出力を用意し、エディタ統合の下地を整備。 This document is intentionally concise (≤ 500 lines). Detailed history and per‑phase plans are kept under docs/private/roadmap/. See links below. Focus (now) - 🎯 Parser/Analyzer の骨格と I/F を先に - tools/hako_parser/* に Tokenizer/Parser/AST emit/CLI を実装(MVP) - Analyzer は AST JSON を優先入力に切替(Text fallback は保持) - 代表ルールの AST 化と LSP 出力、簡易テスト基盤を確立 Update (today) - docs/private/roadmap/phases/phase-21.4/PLAN.md を追加(優先順の実行計画) - tools/hako_parser/* の MVP スケルトン確認(CLI/Emitter/Parser/Tokenizer) - tools/hako_check/tests/README.md と run_tests.sh を追加(テスト雛形) - Runner: plugin_guard 導入(vm/vm_fallback から共通化) - String API: size() を length() のエイリアスとして VM で受理 - Analyzer CLI: --format/--debug/--source-file を順不同で処理 - Analyzer IR: AST 空時の methods をテキスト走査でフォールバック - HC021/HC031: 実装完了。PHI 調査は一旦収束(AST path は既定OFF、`--force-ast` でオン)。 - CLI: `--rules`/`--skip-rules` を追加し、ルール単体/組合せ検証を高速化。`--no-ast` 既定化。 - Runtime: `NYASH_SCRIPT_ARGS_HEX_JSON` を導入(HEX経由で改行・特殊文字を安全搬送)。 - File I/O: FileBox provider 設計(SSOT + 薄いラッパ + 選択ポリシー)を文書化(docs/development/runtime/FILEBOX_PROVIDER.md)。 - ENV: `NYASH_FILEBOX_MODE=auto|core-ro|plugin-only` を追加(ENV_VARS.md)。Analyzer/CI は core‑ro 相当で運用。 Quick update — Green Conditions & Toggles(quick) - Green baseline(quick) - Builder: Hako registry/internal = ON(既定)。必要時のみ `=0` でOFF。 - hv1 inline PRIMARY = ON(直列も緑)。必要時のみ `HAKO_PHASE2100_ENABLE_HV1=0`。 - S3 reps: 任意(`NYASH_LLVM_S3=1` かつ LLVM18 環境時)。未満は自動SKIP。 - EXE‑first: 任意(`SMOKES_ENABLE_SELFHOST=1`)。重いのでデフォルトOFF。 - TLV smoke: 常時(nyash-tlv のみを -p でビルド/テスト)。本体未配線でも安全。 Toggles quicklist - Builder: `HAKO_MIR_BUILDER_INTERNAL=0/1`(既定=1), `HAKO_MIR_BUILDER_REGISTRY=0/1`(既定=1) - hv1: `HAKO_PHASE2100_ENABLE_HV1=0/1`(既定=1) - S3: `NYASH_LLVM_S3=0/1`(既定=auto; LLVM18検出でON) - EXE‑first: `SMOKES_ENABLE_SELFHOST=1`(既定OFF) - TLV: `--features tlv-shim` + `HAKO_TLV_SHIM=1`(既定OFF/配線は無害な identity) - Using SSOT: `HAKO_USING_SSOT=1`(MVP は現行解決ロジックを経由しつつタグ出力) 22.1 progress (today) - TLV配線(最小導線・既定OFF) - 追加: ルート `Cargo.toml` に `nyash-tlv`(optional)と feature `tlv-shim` - 追加: `src/runtime/plugin_ffi_common.rs` に `maybe_tlv_roundtrip()` を実装し、`encode_args()` の末尾で呼び出し(ENV `HAKO_TLV_SHIM=1` かつ feature 有効時のみ動作) - スモーク: `tools/tlv_roundtrip_smoke.sh` を SKIP→常時 PASS に変更(`-p nyash-tlv` 固定) - Resolver/Using SSOT(薄い導線・トグル) - 追加: `HAKO_USING_SSOT=1` 時に SSOT ブリッジを呼び出し(modules のみを ctx として渡す)。未解決時は既存ロジックにフォールバック - ctx: `{ modules, using_paths, cwd }`(MVPは modules のみ有効) - トレース: `NYASH_RESOLVE_TRACE=1` で `[using/ssot]` タグを出力 - スモーク: `tools/smokes/v2/profiles/quick/core/phase2211/using_ssot_parity_canary_vm.sh` を追加(ON/OFF で出力同一を検証) 22.1 next (follow‑up tasks) - SSOT ctx 拡張(段階導入・既定不変) - [ ] Bridge→Hako 箱で `using_paths`/`cwd` を活用した相対推定のMVP(IOはRunner側で制御)。 - [ ] Runner 側の ctx 渡しを拡張し、パス推定に必要な情報(呼出元ディレクトリ、プロファイル)を追加。 - 受け入れ: パリティcanary(modules命名あり)維持 + 代表ケースで `using_paths` 提示時に解決成功(既定OFF/トグルONのみ)。 - TLV shim 観測タグ(既定OFF・安全) - [x] `HAKO_TLV_SHIM_TRACE=1` で shim 経由のコールに `[tlv/shim:.]` を出力(既定は `MapBox.set` のみ)。 - [x] `HAKO_TLV_SHIM_FILTER=MapBox.set` などで対象コールを限定(カンマ区切り可)。 - 受け入れ: canary で `MapBox.set` の単発コール時にタグが現れる(feature有効+ENV時)、既定OFFではログ増加なし。 22.1 exit (criteria) - SSOT(relative 推定の仕上げ) - Unique: `phase2211/ssot_relative_unique_canary_vm.sh` が常時 PASS(cwd 優先、短時間で終了)。 - Ambiguous+strict: `phase2211/ssot_relative_ambiguous_strict_canary_vm.sh` が PASS(strict=1 時は legacy 委譲)。 - Recursion guard: `HAKO_USING_SSOT_HAKO=1` を含む実行でも無限再帰は発生しない(子プロセスへ SSOT を強制OFF+INVOKING=1)。 - TLV/Extern(観測統合) - `HAKO_CALL_TRACE=1` で plugin/extern 双方に `[call:.]` が観測可能。 - `HAKO_CALL_TRACE_FILTER` で method 名/`.` の双方が機能(例: `MapBox.set,env.console.log`)。 - 既定挙動は不変(新機能はすべてトグルOFFで無影響)。 22.2 progress (today) — Core Thinning I - Docs/plan: docs/private/roadmap/phases/phase-22.2/PLAN.md(T0/T1/T2・ABI契約・受け入れ規準) - C-core crate(設計): crates/nyash_c_core(feature c-core=OFF 既定) - 導線(既定OFF): cwrap/c-core タグ&ENV。対象は MapBox.set / ArrayBox.push / ArrayBox.get / ArrayBox.size(len/length)。 - Parity canaries(ON/OFF 完全一致): - phase2220/c_core_map_set_parity_canary_vm.sh → PASS - phase2220/c_core_array_push_parity_canary_vm.sh → PASS - phase2220/c_core_array_len_length_parity_canary_vm.sh → PASS - Exit(22.2): 既定OFFで挙動不変/ON/OFF parityが緑/失敗時フォールバック(Rust経路) Next — Phase 22.3 (Kernel Minimal C Runtime) - Docs skeleton added: docs/private/roadmap/phases/phase-22.3/PLAN.md - No behavior change; future toggle: NYASH_KERNEL_C_MIN (reserved). - Crate present: `crates/nyash_kernel_min_c` (staticlib) with `nyash_console_log` and a few handle stubs. - Canary: `tools/smokes/v2/profiles/quick/core/phase2230/kernel_min_c_build_canary.sh` → PASS(ビルドのみ、未リンク) - Note: LLVM extern lowering maps `nyash.console.*` → `nyash_console_*` for C linkage (dots→underscores). LLVM line (21.10 prework) - Added backend selector to tools/ny_mir_builder.sh via `NYASH_LLVM_BACKEND=llvmlite|crate|native` (default llvmlite). - Added crate path canaries: - obj (dummy): phase2100/s3_backend_selector_crate_obj_canary_vm.sh → PASS - exe (dummy): phase2100/s3_backend_selector_crate_exe_canary_vm.sh → PASS - exe (print): phase2100/s3_backend_selector_crate_exe_print_canary_vm.sh → SKIP(llvmlite未導入環境では自動SKIP/名称整合は済) - Extern lowering updated: `nyash.console.*` is emitted as `nyash_console_*` to match C symbols (`nyash-kernel-min-c`). Roadmap links (21.5→21.7) - 21.5 — Unicode & Provider Polish(現行計画): docs/private/roadmap/phases/phase-21.5/PLAN.md - 21.6 — Hako MIR Builder MVP & Registry(opt‑in): docs/private/roadmap/phases/phase-21.6/PLAN.md - 21.7 — VM mir_call state & Primary Flip(guarded): docs/private/roadmap/phases/phase-21.7/PLAN.md - 21.8 — Hako Check: Refactor & QuickFix(MVP): docs/private/roadmap/phases/phase-21.8/PLAN.md Footing update (A→B→C, today) — 仕様と入口をまず固定 - A. 仕様/インターフェース(hako_check 診断 I/F と出力規約) - 診断スキーマ(型付き)を明文化: `{rule, message, line, severity?, quickFix?}`。 - 互換性: ルールが文字列を `out.push("[HCxxx] ...")` で返す場合も受理(CLI 側で string→diag 変換)。 - 抑制ルール: HC012 > HC011(Box 全体が dead の場合、個別メソッドの unreachable は抑制)。 - 既定の閾値: HC012=warning、HC011=info(CLI 側で override 可能に)。 - Quiet/JSON: `NYASH_JSON_ONLY=1`(JSON/LSP 生成時は冗長ログ抑止)、plugin_guard 出力は stderr のみ。 - B. AST 拡張(解析に必要な最小メタ) - `parser_core.hako`: `boxes[].span_line`(定義開始行)、`methods[].arity`(引数個数)、`is_static` を bool で統一。 - `tokenizer.hako`: 行・桁の位置情報を維持(ブロックコメント除去後も一貫)。 - C. Analyzer 適用(初期化の堅牢化と AST 優先) - `analysis_consumer.hako`: `_ensure_array(ir, key)` を導入し、`methods/calls/boxes` へ `push` 前に必ず確保。 - AST 取り込みを優先(`boxes/uses/includes` と `*_arr` の二系統に両対応)、欠落時のみ簡易テキスト走査にフォールバック。 - CLI: ルール出力をそのまま透過(typed diag を優先、string は変換)、HC012>HC011 の抑制を集約段で適用。 Acceptance(Footing A→B→C) - A: `tools/hako_check/run_tests.sh` が `--format json-lsp` で純 JSON を返し、HC012/HC011 混在入力で抑制が働く。 - B: `parser_core.hako` の AST に `span_line`/`arity` が入り、ダンプで確認可能(最小ケース2件)。 - C: `analysis_consumer.hako` が未初期化 IR に対しても `push` で落ちず、AST 経路で HC011/HC012 が緑。 Status (HC rules) - 10/11 pass, 1 skipped: HC011/012/013/014/015/016/018/021/022/031 = PASS、HC017 = SKIP(UTF‑8 byte-level 支援待ち) - CLI: `--rules`/`--skip-rules` で単体/組合せ検証を高速化、JSON_ONLY で純出力。 Phase 21.7 — VM mir_call state & Primary Flip(green) - T0(最小・安定化) - length state(per‑receiver可): size/len/push, Map.set(new-key) 実装済み(Hakorune VM + Rust hv1_inline 両ルート)。 - フラグ: HAKO_VM_MIRCALL_SIZESTATE=1(既定OFF), HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1(任意)。 - T1(検証導線) - Primary 切替(verify_mir_rc)配線済み(既定=hakovm)。 - Canary 拡充(phase2170/*): push×N、alias、per‑recv差分、flow跨ぎ。Map dup-key 非増分・value_state set→get も緑化。 - 実行: bash tools/smokes/v2/profiles/quick/core/phase2170/run_all.sh → 全PASS。 Phase 21.8 — Hako Check: Refactor & QuickFix(MVP) - T0 QuickFix(--fix-dry-run, text-scope) - HC002 include→using(安全置換)/HC003 using 非引用→引用化/HC016 未使用 alias 行削除/HC014 空スタブ提案。 - 統一diff(---/+++/@@)で標準出力。既定OFF(dry-run時のみ)。 - T1 AST Rename(同一ファイル) - --rename-box /--rename-method を追加。 - 定義は AST span 行で安全置換、呼出は `.(` を置換。--fix-dry-run で diff 出力。 - T2 Plan 出力 - --fix-plan で refactor_plan.json と sed 雛形(apply_script)を出力(手動レビュー想定)。 - 既定挙動は不変。適用は別フェーズ(write-capable provider)で検討。 Phase 21.9 — De‑Rust(Non‑Plugin)Checklist - [x] Docs: Roadmap – docs/development/strategies/de-rust-roadmap.md(原則/ゲート/リバータブル) - [x] Docs: Gap Analysis – docs/development/strategies/de-rust-gap-analysis.md(Phase1/2の具体) - [x] Script: Phase‑0 archive helper – tools/de_rust/archive_rust_llvm_backend.sh(RESTORE.md 自動生成) - [x] Phase‑0: Rust LLVM backend を archive/ へ移動(既定ビルド影響なし・リバータブル) - [ ] hv1_inline opt‑out トグル(HAKO_VERIFY_DISABLE_INLINE=1)追加(任意) - [ ] TLV C shim(FFI)雛形+往復テスト(最小) - [ ] MIR Interpreter の診断化(Primary=Hakovm を確認、envで明示切替) - [ ] Resolver/Using SSOT ドキュメントを運用ガイド化(Runner/Analyzer 一致) - [x] LLVM harness: object 出力(tmp/nyash_llvm_run.o)確認 - [ ] LLVM link: NyRT 静的ライブラリ(crates/nyash_kernel)ビルド → EXE リンクの確認 CI Integration(end of phase) - [ ] Add optional CI job: selfhost EXE-first smoke - Steps: install LLVM18; prebuild nyash(llvm)/ny-llvmc/nyash_kernel; run `tools/exe_first_smoke.sh` and `tools/exe_first_runner_smoke.sh`. - Policy: non-blocking initially(`continue-on-error` or separate optional workflow); promote later when stable. - [ ] Fix legacy CI workflow bug(old workflow failing) - Audit existing `.github/workflows/*` for broken steps/env; update to use `hakorune` binary and new env toggles. - Ensure LLVM/S3 gates respect environment (skip when LLVM18 absent). Remaining (21.4) 1) Hako Parser MVP 実装(tokenizer/parser_core/ast_emit/cli)【微修整】 2) Analyzer AST 入力の安定化(必要時のみ AST を使用) 3) 代表ルール AST 化(HC001/002/003/010/011/020) 4) `--format json-lsp` 追加ケース(OK/NG/edge) 5) テスト駆動(tests//)を 3 ルール分用意 6) 限定 `--fix`(HC002/003/500) 7) DOT エッジ ON(calls→edges, cluster by box) 8) FileBox provider 実装(リング0/1/選択ポリシー)と最小スモーク追加(core‑ro/auto/plugin-only)【COMPLETE】 Remaining (21.4 → 21.5 handoff, concise) - A. Parser/Analyzer まわり - [ ] Hako Parser MVP 微修整(tokenizer/parser_core/ast_emit/cli) - [ ] Analyzer AST 入力安定化(必要時のみ AST、_needs_ast/_needs_ir 調整) - [ ] 代表ルール AST 化(HC001/002/003/010/011/020) - [ ] json-lsp 追加ケース(OK/NG/edge) - [ ] テスト駆動(tests// を3ルール分) - [ ] 限定 --fix(HC002/HC003/HC500) - B. DOT 改善 - [ ] calls→edges 検証と代表追加ケース(cluster は既存を維持) - C. Ring1/Plugins polish(未了のみ) - [ ] Using/modules SSOT 確認(modules優先→相対推定→not found=警告/verbose詳細) - [x] Capability introspection(FileBox provider caps(read/write) を Shim から参照→未サポート操作は Fail‑Fast) - 実装: `src/runtime/provider_lock.rs:get_filebox_caps()` を追加、`src/boxes/file/mod.rs` で caps.write を参照し明示エラー - [ ] Provider modes スモークの継続(auto/core‑ro/plugin‑only + failure injection) Phase 21.6 — Hako MIR Builder MVP & Registry(COMPLETE) - [x] Registry 経路(opt‑in)を MirBuilderBox に実装(既定OFF) - [x] registry 専用 canary 一式を PASS(Return/Int, If/Compare[Int/Int|Var/Int|Var/Var], Return(Binary Int/Int), Return(Logical OR/AND Var/Var)) - [x] PatternUtilBox の find_local_* を“次の Local まで”で安全化 - [x] MirBuilderBox チェーン fallback を厳格化(Binary/IntInt, Return/Int) - Return(BinOp Var/Int) は registry が先に一致(rc=42) - Logical AND(Var/Var) は JSON v0 bool=0/1 に合わせて一致(rc=0) 受け入れ(21.6) - [x] phase2111 の registry canary 全緑 - [x] 既定OFF・互換維持(トグルON時のみ影響) Phase 21.7 — VM mir_call state & Primary Flip(kickoff) - 目的: VM に最小 state(Array/Map length)を導入し、primary 切替(core|hakovm)で Core と同値検証(既定OFF)。 - スコープ(T0→T1) - T0: state map(受信者ID合成・length管理)、size/len 実値、push で length++、get/set は安定タグ維持 - T1: HAKO_VERIFY_PRIMARY=core|hakovm 配線と canary(push→size 増分、primary=hakovm でも rc一致) - トグル/既定 - HAKO_VM_MIRCALL_STUB=1(既定ON: 非対象は0返し+タグ) - HAKO_VERIFY_PRIMARY=core(既定) - Checklist — Ring1/Plugins polish(このフェーズで完了) - [x] Env 統一(二重解消): `NYASH_FILEBOX_MODE`/`NYASH_DISABLE_PLUGINS` に一本化し、 旧 `NYASH_USE_PLUGIN_BUILTINS` / `NYASH_PLUGIN_OVERRIDE_TYPES` は非推奨(互換ブリッジは維持) - [x] 初期化順のSSOT: `register_builtin_filebox`(feature)→ dynamic登録(toml)→ provider選択→ FILEBOX_PROVIDER 設定(vm/vm_fallback 共通) - [x] Provider 登録口の一本化: static/dynamic/builtin を同じ ProviderFactory 登録APIに集約(select は registry のみ) - [x] FileBox 公開の一本化: `basic/file_box.rs` を再エクスポート/委譲化し、公開は BoxShim(委譲)に揃える(重複実装撤去) - [ ] Using/modules のSSOT確認: modules優先→相対ファイル推定→not found(警告; verboseで詳細)を維持 - [x] JSON_ONLY 監査: json-lsp時は stdout 純JSON・ログは stderr の規約を plugin_guard/loader を含む全経路で確認 - [x] AST/IR ゲート最終化: `_needs_ast`/`_needs_ir` の方針を docs と実装で一致させる(ASTは最小; 既定 no-ast) - [ ] Capability introspection: FILEBOX_PROVIDER の `caps(read/write)` を BoxShim から取得・Fail‑Fastの可否を明示 - [x] スモーク追加: core‑ro(open/read/close)/auto(フォールバック)/plugin-only(厳格)/analyzer(json-lsp純出力) の代表ケース - [x] Docs 同期: FILEBOX_PROVIDER.md / ENV_VARS.md / hako_check README を最終状態に更新 - [x] フォールバック保証: プラグインのロード失敗だけでなく「create_box 失敗時」にも ring1/core‑ro へ自動フォールバック(auto モード)。plugin‑only では Fail‑Fast。 - [x] 失敗時スモーク: ArrayBox の plugin が存在するが creation に失敗するケースを再現し、ring1/core‑ro で生成できることを確認。 Follow‑ups(Analyzer polish) - [x] HC012 JSON 安定化(using alias 依存排除、itoa ローカル化) - [x] HC017 一時 disable(UTF‑8バイト操作対応後に復活) - [x] using の不要宣言削除(Str aliasの掃除:使用ファイル以外から撤去) - [x] ルール実行エラーの可視化(stderr ログを明確に:rule名・ファイル名・行) - [x] テスト運用のENVまとめを README に明示(Disable Plugins / FactoryPolicy / Disable NyCompiler / JSON_ONLY) Phase 21.4 — Completion - FileBox SSOT(provider_lock / provider_registry / CoreRo / BoxShim / feature builtin-filebox): COMPLETE - Analyzer 安定化(HC012 修復、HC017 skip、ENV明文化、json-lsp純出力): COMPLETE Phase 22 — Proposed Focus - Unicode Support(HC017 復活): ByteArrayBox / UTF‑8 encode/decode helpers / 文字プロパティ - Plugin 完全化: dynamic plugin(.so)での create_box 安定化、bid/registry の暫定停止解除 - ENV Migration 完了: 旧ENV 警告の全面展開→削除 - Error Logging 強化: error() extern 経由の統一ロギング、ルール/テキスト系への横展開 Completed — FileBox Provider Wiring(C: Feature と静的/動的の選択を1本化) - 目的: File I/O を SSOT 抽象(FileIo)+ 薄いラッパ(FileBoxShim)+ provider_registry で一本化し、静的/動的/コアRO の選択を ENV で制御する。 - 完了内容: - provider_lock: `FILEBOX_PROVIDER` を追加し、グローバルに選択結果を保持 - vm 起動時に `read_filebox_mode_from_env` → `select_file_provider` で provider を決定・登録 - CoreRoFileIo を read‑only で実装(thread‑safe) - FileBox を provider 経由の委譲へ寄せ、basic/file_box.rs は deprecate 化 - Cargo.toml に `builtin-filebox` feature を追加 - Docs/ENV を同期(FILEBOX_PROVIDER.md / ENV_VARS.md) - 既知の非関連課題(別タスク扱い): - hako_check/cli.hako の parse error(line表示の不整合)。FileBox配線とは無関係。HC012 JSON安定化の一環で対応予定。 Next (handoff to Claude Code) - HC012 JSON 安定化(cli.hako) - json‑lsp時は stdout を純JSON、ログは stderr の規約徹底(fmt判定ガードの再確認) - parse error の発生箇所を修正(構文境界/コメント/Stage‑3トグル周り) - `NYASH_JSON_ONLY=1 ./tools/hako_check.sh --format json-lsp tools/hako_check/tests/HC012_dead_static_box` が純JSONを返すこと - Analyzer run_tests 全緑の維持(--rules/--skip-rules で個別検証可能) 8) FileBox provider 実装(リング0/1/選択ポリシー)と最小スモーク追加(core‑ro/auto/plugin-only) Roadmap (A→B→C) — 必ずこの順序で進める - A. HC011 をまず緑にする(AST 非依存の安全経路)【COMPLETE】 - 実装: `--no-ast` 追加、IR に `source` 格納、methods/calls のテキスト走査フォールバック、整形 JSON-LSP - 受け入れ: `tools/hako_check/run_tests.sh` → [TEST/OK] HC011_dead_methods 緑(期待JSON一致) - 影響範囲: tools/hako_check/{cli,analysis_consumer,rules/rule_dead_methods}.hako(既定は AST、`--no-ast` で切替) - B. plugin_guard の仕上げと一貫化 - 目的: すべての runner モードで不足プラグイン報告を共通APIに統一(strict/quiet のポリシー遵守) - 受け入れ条件: vm/vm_fallback 以外に残る ad-hoc 出力が 0、メッセージは stderr のみ(quiet 時) - C. AST/Tokenizer の精緻化(AST 経路へ戻す) - 目的: parser_core/tokenizer を強化して `boxes[].methods[]` を安定抽出、HC011 を AST 入力で PASS - 受け入れ条件: `HAKO_CHECK_NO_AST=0`(既定)で run_tests.sh が緑、methods/calls 数が IR デバッグに出力される Open Issues (Map semantics) - Map.get の戻り値セマンティクス未確定 - 現状: kernel 側の get_h の値/存在判定の定義が曖昧。reps は has を優先して固定(rc=1)。 - 決めたいこと: get_h の戻り(値 or sentinel)/キー不存在時の扱い(0/-1/None 相当)/rc への反映規約。 - 提案: reps を2段階で導入(has→get)。get は「存在しない場合は 0(未使用値)」を一旦の規約とし、将来 Option 風のタグに拡張可能にする。 - ランタイムシンボルの最小集合の確認 - nyash.map.{birth_h,set_h,size_h,has_h,get_h} が kernel に存在することを常時確認(link 失敗時は Fail‑Fast)。 - 決定性とハッシュ - いまは size 決定性を優先(hash はオプション)。TargetMachine へ移行後に `NYASH_HASH_STRICT=1` を既定 ON に切替予定。 Near‑term TODO(21.4 準備) - tokenizer: 文字列/数値/識別子/記号/位置情報 - parser_core: using/box/static method/assign/簡易block - ast_emit: boxes/uses/methods/calls(min) を JSON 化 - cli: ファイル→AST JSON - Analyzer: AST→IR 変換の経路を優先 - 代表ルールの AST 実装と LSP 出力の雛形 Next (21.2 — TBD) - 21.1 の安定化を維持しつつ、C‑API の純API移行(ny‑llvmc 経由を段階縮小)計画を作成 - reps の決定性(3×)を phase2100 aggregator にも追加検討 - Hako‑first 方針(Rust変更最小化) - Rust は Kernel/ABI(シンボル/リンク)に集中。解釈/解決は Hako 側の Adapter/Policy に段階移行。 - dev は Adapter 登録や by‑name fallback を許容(トグル)、prod は Adapter 必須(Fail‑Fast)。 Next Steps (immediate) 1) A(仕上げ): HC012 line 精度(span_line)/ README 追随 / CLI I/F最終確認 2) B(Parser強化): tokenizer 文字列エスケープ/位置情報、parser_core 複数行・alias 抽出 3) C(可視化): DOT 改善(box cluster / 孤立ノード)と quick スモーク追加 Context Compression Notes - A(診断I/F+抑制)は実装済み。文字列診断→型付き変換あり。 - B(AST: span_line/is_static=bool)は実装済み。methods.arity は既に出力。 - C は ensure_array と calls arity 推定を反映。残は AST優先の徹底と HC012 line 精度。 - HC021/HC031 は完了。PHI は AST パス限定で再発可能性があるため、当面 `--no-ast` 既定(`--force-ast` で明示オン)。 - ルール検証は `--rules`/`--skip-rules` で二分探索可能。 TODO (short-term, non-HC0) - AST-first intake: minimize text fallback; ensure analyzer never uses FileBox in tests. - DOT edges: keep unique edges; add box clusters (optional, post-21.4). - Quiet JSON: enforce NYASH_JSON_ONLY=1 in wrappers; stderr-only plugin hints. - HC015 prep: rely on inferred call arity for arity mismatch rule later. Rules Backlog(候補・優先提案) - HC012: Dead Static Box — 定義のみで参照/呼出ゼロの static box を検出 - HC013: Duplicate Method — 同一 box 内の重複メソッド名/arity を検出 - HC014: Missing Entrypoint — Main.main/0 不在を警告(プロファイル可) - HC015: Arity Mismatch (MVP) — 明確な `Name.method()` 呼び出しの引数個数不一致を検出(0/1の最小版) - HC016: Unused Using/Alias — `using ... as Alias` の未使用を検出 - HC017: Non‑ASCII Quotes — “ ” ‘ ’ 等の fancy quotes を検出し ASCII へ置換提案 - HC018: Top‑level local in prelude — 先頭 `local` を検出(merge 前提のクリーンアップ漏れ) - HC021: Analyzer IO Safety — CLI 経路での FileBox 使用を警告(`--source-file` 利用を提案) - HC022: Stage‑3 Gate — while/for を含む .hako を Nyash VM へ流す危険の検出(gate フラグ提示) - HC031: Brace Heuristics — `{`/`}` の粗い不整合検出(早期警告) 5) `--format json-lsp` の最小実装(既存配線に診断配列を流し込む) Previous Achievement - ✅ Phase 20.44 COMPLETE(provider emit/codegen reps 緑) - ✅ Phase 20.45‑46: PRIMARY 切替のための品質・整流(env_bool・MethodAliasPolicy・MirBuilder prefer reps の整備) - ✅ Phase 20.48 COMPLETE(Deterministic Bootstrap & Parity: run_all 緑 / repeat 3回一致) - ✅ Phase 20.49 COMPLETE(SSOT & hv1 inline 最小:phase2049/run_all 緑、S3 reps ゲート整備) Next Steps (ordered) 1) repeat reps: TypeOp を追加(済) 2) PRIMARY reps: Array/Map 三受信者の独立性(追加済) 3) S3 reps を1本追加(3ブロック系、LLVM18 検出で自動実行) 4) README(20.48)へ Quick Verify の項目拡張(typeop_check/cast と multi‑recv を追記済) Close Ready(20.48) - 条件: - s1s2s3_repeat_*(const/compare/logical/typeop)が3回一致 - PRIMARY reps(If/Logical/Loop/Array/Map/TypeOp)が PASS(no‑fallback) - run_all(phase2048)が緑(S3 は LLVM18 環境で自動、NYASH_LLVM_S3=0 で明示無効) Hotfix Plan — Using/Prelude Unification (Self‑Host) - Problem: .hako を NyashParser に通す経路でパース落ち(Invalid expression)。 - Decision: プレリュードは“テキスト統合(merge_prelude_text)”に一本化。AST マージは撤退。 - Resolver 入口は共通(alias/modules/packages/builtin)。 - 以降はメインの言語に応じて実行器へ渡す(Hako→Hakorune VM / MIR→Core)。 - NyashParser は Nyash コードのみ。Hako は Nyash VM 経路に入れない(Fail‑Fast)。 Action Items (20.38) - P1 C‑ABI ブリッジ(既定OFF) - Hako provider→Rust extern_provider へ最小接続(emit/codegen)。 - ハーネスのタグ用シム(test_runner)を撤去できる状態にする。 - P2 v1 Dispatcher IR 完了+φテーブル堅牢化 - V1SchemaBox.get_function_ir を構造IRで返却(blocks/phi_table)。 - ループは IR 反復に完全切替、φ は entry 適用(命令ループから除去)。 - 複数φ/複数incoming/空白改行混在を canary で固定。 - P3 Verify 既定整流(完了) - v1→Hakorune を既定ON、Core は診断 fallback。末尾数値抽出で rc を一意化。 - include ポリシー quick=ERROR を維持(ドキュメントと一致)。 - P4 Resolver/alias 仕上げ - lang/src/vm/** の alias を監査し、直参照を払拭。normalize/trace ログは最小に整流。 - P5 Docs 反映 - phase‑20.38 のトグル/受け入れ条件/撤去予定のシムを反映。φ entry SSOT は IR 完了後に更新。 - extern タグ用シムの現状と撤去条件(hv1 inline 安定後に除去)を明記。 Acceptance(phase 21.2) - HAKO_CAPI_PURE=1 で reps(ternary=44 / map=1)が PASS、各3回一致(obj/rc)。 - 21.1 reps(C‑API fallback)と既存 llvmlite 経路は緑維持。 New (21.1 wiring) - Rust provider 切替の実装(src/host_providers/llvm_codegen.rs) - `NYASH_LLVM_USE_CAPI=1` + `HAKO_V1_EXTERN_PROVIDER_C_ABI=1` で C‑API 経路を有効化。 - `libhako_llvmc_ffi.so` を dlopen し、`hako_llvmc_compile_json` を呼び出して `.o` を生成。 - plugins feature 未有効時は明示エラー(Fail‑Fast)。 --- # Next Task — Phase 20.49(Resolver SSOT & Compiler Bring‑up) 目的(このフェーズで到達するゴール) - using/プレリュード統合の SSOT を dev/prod で確定(include は prod で非対応) - dev では toml なしの最短導線(相対パス using / preinclude)で“すぐ動く”を保証 - コンパイラ自走に必要な hv1 inline の最小カバレッジを reps で固定 Focus(20.49) - Resolver/Runner: using 解決と prelude 統合の一本化(dev/prod トグルを明文化) - Reps: using/alias/nested prelude の代表追加(dev/prod 両系) - hv1 inline: 命令/extern の最小セットを reps から埋める(不足は段階実装) - S3(任意): ternary / map set→size 等のE2E代表を `NYASH_LLVM_S3=1` で実行 Acceptance(20.49) - dev: toml無し一発経路でコンパイラ一式の v1 生成が成功(S1/S2 繰り返し一致) - prod: alias/modules 経路のみで run_all が緑(include=ERROR) - hv1 inline: 代表で本体必要最小命令/extern が緑 Changes (recent) - Core executor: v1 優先実行(schema_version 検出時)。 - hv1 mir_call handler: per‑recv size state 実装+trace。 - test_runner: HAKO_VERIFY_V1_FORCE_HAKOVM=1 を追加(hv1 ラッパーで v1 実行)。 - hv1 inline reps: 代表を整備(per‑recv second は暫定 rc=1)。 Changes (this pass) - 20.44 を ✅ COMPLETE にマーク - 20.47/20.48 のフェーズ文書を追加(自己ホストの工程と受け入れを明文化) - 拡張子統一(.hako/.nyash 等価): 仕様の明文化 + 実装反映 - Fail‑Fast(Hako in Nyash VM)既定OFF(HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=1 のみON) - using はテキスト・プレリュード統合を既定に(AST統合は任意) - using 解決は .hako 優先→.nyash 次点。using.paths に lang/src を追加 - ドキュメント更新: docs/guides/source-extensions.md を等価性ポリシーに刷新 - runner: env_bool 横展開(common_util/strip.rs, modes/pyvm.rs, modes/common.rs, hv1_inline.rs) - vm: MirCallV1HandlerBox trace の受信者IDログ修正 - quick/core phase2036: v1_minivm_size_stub_off_canary_vm を修正 - using をパス指定から alias(`using selfhost.vm.entry as MiniVmEntryBox`)へ切替 - `NYASH_PREINCLUDE=1` を注入してプレリュードをテキスト統合(prod プロファイルの path using 限制を回避) - 結果: rc=0 で PASS(スタブ時の size=0 が Mini‑VM の rc に反映) - quick/core phase2047: Using alias 代表を追加 - tools/smokes/v2/profiles/quick/core/phase2047/using_alias_selfhost_vm_entry_canary_vm.sh(PASS) - alias 解決の実行確認(cross‑box static call → rc=0) - tools/smokes/v2/profiles/quick/core/phase2047/using_alias_string_helpers_canary_vm.sh(PASS) - shared/helpers の alias 解決を実行確認(静的呼び出し) - Self‑Hosting S1/S2(builder 直行) - gen: tools/selfhost/gen_v1_from_builder.sh(emit_return_int2(42) → v1 JSON 出力) - canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_canary_vm.sh(PASS) - provider 雛形: tools/selfhost/gen_v1_from_provider.sh(C‑ABI 連携は段階導入) - Provider v1 強制(最終化) - src/host_providers/mir_builder.rs: emit前後で v1 を強制(NYASH_JSON_SCHEMA_V1=1 一時設定 + 読み戻し時の v1 ラップ) - hv1 inline 実装の強化 - Array と Map の per‑receiver サイズ状態を分離(独立マップ: arr/map) - MapBox: set→size を rc で検証可能(first=1/second=0 reps と整合) - Docs 更新 - phase‑20.48 の README に “Quick Verify” セクションを追加(run_all と S3 トグルの手順) - canary 追加: tools/smokes/v2/profiles/quick/core/phase2047/provider_v1_shape_canary_vm.sh(PASS) - SSOT の徹底(strip.rs 連携) - src/runner/modes/common_util/resolve/strip.rs: is_path 判定と dev-file 候補判定を SSOT に寄せ(path_util) - S1/S2 拡張 reps(builder) - gen: tools/selfhost/gen_v1_from_builder_compare_{cfg,ret}.sh - canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_compare_{cfg,ret}_canary_vm.sh(PASS/環境で整合) - S3 reps(llvmlite, NyRTリンク, 実行) - phase2047/s3_link_run_llvmlite_compare_{cfg,ret}_canary_vm.sh(rc=1) - phase2047/s3_link_run_llvmlite_const42_canary_vm.sh(rc=42) - phase2047/s3_link_run_llvmlite_branch_ret_44_canary_vm.sh(rc=44) - 生成器: tools/selfhost/gen_v1_from_builder_branch_ret_44.sh - PRIMARY no‑fallback reps(hv1 inline) - phase2047/primary_no_fallback_v1_const_rc_canary_vm.sh(rc=42) - phase2047/primary_no_fallback_v1_compare_branch_rc_canary_vm.sh(rc=1) - phase2047/primary_no_fallback_v1_jump_rc_canary_vm.sh(rc=7) - S1/S2 拡張 reps(builder) - gen: tools/selfhost/gen_v1_from_builder_compare_{cfg,ret}.sh - canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_compare_{cfg,ret}_canary_vm.sh(PASS/環境で整合) - S3 代表(llvmlite, NyRTリンク, 実行) - phase2047/s3_link_run_llvmlite_compare_cfg_canary_vm.sh(NYASH_LLVM_S3=1 で有効、SKIPガードあり) - Self‑Hosting S1/S2 実行例(雛形)を追加 - tools/selfhost/examples/gen_v1_const42.sh(最小 v1 を出力) - `tools/selfhost/bootstrap_s1_s2.sh --cmd1 'bash tools/selfhost/examples/gen_v1_const42.sh' --cmd2 'bash tools/selfhost/examples/gen_v1_const42.sh'` → PASS(正規化ハッシュ一致) // Loop compares normalization (Step‑1) - Loop lowers(simple/count_param/sum_bc): Compare 受理を拡張し Lt 形へ正規化。 - i < L / i <= L は既存通り(<= は L+1)。 - L > i / L >= i は左右スワップで受理(>= は L+1)。 - i != L は init=0, step=1 の単純カウントに限り i < L と同値として受理。 - Canaries: phase2039 に追加(swapped > / >=, !=)し、Core verify で PASS を確認。 // Step‑2/3 generalization (count_param) - step 一般化: Int 2,3,… と Local Var 由来の step を受理。'-' は負の step に正規化(Add + 負値)。 - 降順対応: i > / i >= limit を cmp=Gt/Ge で build2 へ伝達。 - init/limit 起源の拡大: Local Var(Int)由来を逆引きで受理。 - Canaries: step=2 / step(Local) / 降順('-')/ limit(Local) / init(Local) を追加し PASS。 // Step‑4(部分) break/continue 検出の堅牢化(sum_bc) - 'i==X' に加え 'X==i' も受理。専用カナリー(swapped equals) PASS。 - If(var != X) else [Break] の最小サブセットを受理(loop_scan_box へ委譲)。専用カナリー PASS。 - If(var != Y) else [Continue] は検出実装あり(inline)が未検証→次段で helper へ移設しつつ canary 追加予定。 What’s green (20.34) - Loop/PHI unify (phi_core) in JSON v0 bridge — unified path used (toggle exposed). - Program(JSON v0) PHI‑trace canaries — PASS. - Core exec canaries (builder → emit → Core) — now routed and PASS: - mirbuilder_internal_core_exec_canary_vm (rc=10) - mirbuilder_internal_loop_core_exec_canary_vm (rc=3) - mirbuilder_internal_loop_count_param_core_exec_canary_vm (rc=6) - mirbuilder_internal_loop_sum_bc_core_exec_canary_vm (rc=8) Recent changes (summary) - Added MIR JSON v0 loader (minimal): src/runner/mir_json_v0.rs - Supports const/compare/branch/jump/phi/ret/copy - Promoted --mir-json-file to “execute + exit(rc)” - v1 → try_parse_v1_to_module; v0 → minimal loader; executes via Core interpreter - rc mapping unified in execute_mir_module_quiet_exit - verify_mir_rc improvements (tools/smokes/v2/lib/test_runner.sh) - Core primary: MIR(JSON) uses --mir-json-file, Program(JSON v0) uses --json-file - Mini‑VM(hakovm)rc==1 ヒューリスティックを削除し、経路評価を素直化(v1はCore、v0はhakovmに整流) - Hako JSON reader minor fix - lang/src/vm/core/json_v0_reader.hako: r# raw を通常文字列に統一(Hako生文字列の互換性向上) - MIR JSON v1 bridge extended - parse_const_value now handles f64/float, bool, string, and handle(StringBox) → ConstValue::String - Direct extern names supported in VM interpreter: env.mirbuilder.emit, env.codegen.emit_object - New v1 canaries (Core route) - tools/smokes/v2/profiles/quick/core/phase2035/v1_method_string_indexof_canary_vm.sh - tools/smokes/v2/profiles/quick/core/phase2035/v1_extern_mirbuilder_emit_canary_vm.sh - tools/smokes/v2/profiles/quick/core/phase2035/v1_method_string_substring_1arg_canary_vm.sh - tools/smokes/v2/profiles/quick/core/phase2035/v1_method_string_substring_2args_canary_vm.sh - tools/smokes/v2/profiles/quick/core/phase2035/v1_array_push_size_canary_vm.sh - (map) tools/smokes/v2/profiles/quick/core/phase2035/v1_map_set_get_size_canary_vm.sh - Note: returns size (1) for rc stability; get-path validated structurally - 20.38 extern bring-up (Hakorune primary) - Hakorune provider tags: prints `[extern/c-abi:mirbuilder.emit]` / `[extern/c-abi:codegen.emit_object]` when `HAKO_V1_EXTERN_PROVIDER_C_ABI=1`(既定OFF) - Core extern provider: when `HAKO_V1_EXTERN_PROVIDER=1`, `env.mirbuilder.emit` / `env.codegen.emit_object` return empty string (stub) to keep rc=0(verify fallbackの安定化) - Dispatcher(FLOW): minor cleanup to avoid stray scanning code; ret-path returns value and does not emit trailing prints - Canaries: phase2038 emit/codegen → PASS(タグ+rc=0 を固定)。phi 追加ケース(then→jump combo3)も PASS。 Open (pending) - SSOT helpers(binop_lower / loop_common)の導入と呼び出し置換(Builder/Bridge)。 - Continue ‘!=’ else の builder 経路の MIR 生成整流(rc=8 固定化)。 - P1〜P4 の実装・緑化(上記 Action Items)。 Active toggles (debug/verify) - HAKO_VERIFY_PRIMARY=hakovm|core(既定 hakovm、Coreは診断) - HAKO_V1_DISPATCHER_FLOW=1(v1 FLOW 実行) - HAKO_V1_EXTERN_PROVIDER=1(Hako extern provider 有効) - HAKO_V1_EXTERN_PROVIDER_C_ABI=1(タグ/ブリッジ実験。既定OFF) - HAKO_V1_PHI_STRICT=1 / HAKO_V1_PHI_TOLERATE_VOID=1(φポリシー) - NYASH_RESOLVE_TRACE=1 / NYASH_RESOLVE_NORMALIZE=1(resolver dev) How to run (quick) - Build: `cargo build --release` - Program v0 PHI‑trace (debug): - `SMOKES_ENABLE_DEBUG=1 bash tools/smokes/v2/profiles/quick/core/phase2034/program_v0_if_phi_trace_vm.sh` - `SMOKES_ENABLE_DEBUG=1 bash tools/smokes/v2/profiles/quick/core/phase2034/program_v0_loop_phi_trace_vm.sh` - Core exec canaries(20.34 緑対象): - `bash tools/smokes/v2/profiles/quick/core/phase2034/mirbuilder_internal_core_exec_canary_vm.sh` - `bash tools/smokes/v2/profiles/quick/core/phase2034/mirbuilder_internal_loop_core_exec_canary_vm.sh` - `bash tools/smokes/v2/profiles/quick/core/phase2034/mirbuilder_internal_loop_count_param_core_exec_canary_vm.sh` - `bash tools/smokes/v2/profiles/quick/core/phase2034/mirbuilder_internal_loop_sum_bc_core_exec_canary_vm.sh` Mini‑VM policy(20.34) - 実装は維持(alias/ret/phi 最小系を今後整える)。ただし quick の canary は Core へ寄せて緑化。 - 20.36 で verify primary を hakovm に段階的に切替、Mini‑VM green を進める。 Next (20.35 — scoped; behavior unchanged) 1) MIR JSON v1 loader expansion(Method/Extern/BoxCall — 最小) - callee.type=Method → BoxCall 復元(box_name/method/receiver/args) - callee.type=Extern → ExternCall 復元(env.get/env.codegen.emit_object/env.mirbuilder.emit/console.log など) - effects 未指定は PURE 既定、WRITE 系は最小でフラグ化(実害ゼロ) - v1 canary 追加(string indexOf/substring、array push/size、map set/get/size、extern env.get) 2) Using/alias の推移解決の堅牢化(深さ/循環/キャッシュ) - 実装済み(DFS 深さ上限=10、循環検知、キャッシュ)。strict では曖昧解決をエラー扱い。 3) ドキュメント:今回の経路(Core/verify)を roadmap に反映(DONE) Structure cleanups (20.35 A→B→C) - A) v1 mir_call 両対応(flat/nested): 実装済(ローダで互換吸収)。 - B) Extern provider 単一点化: 実装済(handlers/extern_provider.rs)。calls.rs/externals.rs から委譲。 - C) Const パース共通化: 実装済(src/runner/mir_json/common.rs)。まず v1 から採用(v0 は次段)。 Next (20.36 — verify primary → hakovm, preinclude removal, C‑ABI scaffold) - Verify primary 切替(段階): hakovm → Core fallback - preinclude 非推奨化(quick から撤去) - Mini‑VM の最小状態(len/size/push の簡易 state)を flag ガードで導入(デフォルトOFF)— 導入済 - 受信者別サイズ管理フラグ `HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1` を導入(canary 追加済) - HAKO_VM_MIRCALL_SIZESTATE=1 は緑化済(push 2回→size=2)。次は受信者別管理を flag で導入: HAKO_VM_MIRCALL_SIZESTATE_PER_RECV=1 - C‑ABI 設計(docs + ヘッダ雛形) Known open items(tracked to 20.36) - Mini‑VM: using/alias の推移解決(selfhost.vm.helpers.* 連鎖) - Mini‑VM: ret/phi の最小ケースで rc が確実に数値化されるよう整備(継続確認) Next (20.37 — v1 Dispatcher & Phi) 1) V1SchemaBox: get_function_ir(JSON→IR) を拡張(blocks/insts/phi_table を一括) 2) NyVmDispatcherV1Box: IR反復へ切替(スキャナ依存の最終撤去)、今は二重化(IR優先/scan後退互換) 3) Resolver/inline: AST prelude マージで推移usingを一次収束(Claude codeで進行)、ランナーは既存fallback維持 Next (Hotfix — Using/Prelude Unification) 1) vm.rs: using_ast 経路を `merge_prelude_text` に一本化(ASTマージ撤去) 2) vm.rs: Hako 構文検出で Hakorune VM へ切替(NyashParser をバイパス) 3) strip.rs: `.hako` の AST パース抑止と診断ガイド 4) verify: extern canary を PASS 化(末尾 rc 抽出の安定化) Docs: - docs/development/architecture/phi-entry-in-hako.md に φ entry 設計のSSOTを記載(不変条件/flags/テスト) Next (20.38 — extern provider & C‑ABI) 1) HakoruneExternProviderBox を拡張(warn/error/emit の最小タグ/空文字挙動)— 完了 2) HAKO_V1_EXTERN_PROVIDER=1 の canary 追加(構造緑固定)— 完了 3) C‑ABI 導線のPoC接続(emit/codegen、既定OFF)— 完了(タグ+rc=0) 4) hv1 inline 安定化(残): -c 経路の using resolver に modules.workspace を強制ロードするか、dispatcher の using を dev 限定で path 化。 5) include 撤去の計画(dev → 本線): - まず stub カナリーの include は撤去済み(rc=0 のみ確認)。 - hv1 inline カナリーの prelude include は暫定(dev専用)。-c/alias 安定後に alias へ移行して include を撤去する。 - ランナー側では merge_prelude_text を既定経路とし、include は quick=ERROR のポリシーを維持。 Roadmap links(per‑phase docs) - Index: docs/private/roadmap/README.md - Phase 20.34: docs/private/roadmap/phases/phase-20.34/README.md - Phase 20.35: docs/private/roadmap/phases/phase-20.35/README.md - Phase 20.36: docs/private/roadmap/phases/phase-20.36/README.md Appendix — Toggle quick reference - NYASH_MIR_UNIFY_LOOPFORM=1|0 … Loop/PHI 統一(既定ON) - HAKO_VERIFY_PRIMARY=hakovm|core … verify 実行経路(今は core 優先で緑化) - NYASH_VM_TRACE_PHI=1 … VM PHI 適用トレース - HAKO_PHI_VERIFY=1 | NYASH_PHI_VERIFY=1 … ビルダー側の PHI inputs 検証 - HAKO_VM_PHI_STRICT=0(互換:NYASH_VM_PHI_STRICT=0) … 実行時 PHI 厳格 OFF(開発時のみ) Updates (2025-11-04) - hv1 inline: alias-only route stabilized (no include/preinclude). vm.rs wrapper now uses `using selfhost.vm.hv1.dispatch` and relaxes fail-fast for child. - Verify harness: include+preinclude fallback for v1 removed in `verify_mir_rc`; alias-only hv1 is the standard path. - Concat-safety (hv1 scope): replaced `"" + ` coercions with `StringHelpers.int_to_str(...)` in `lang/src/vm/hakorune-vm/dispatcher_v1.hako` and `lang/src/vm/boxes/mir_call_v1_handler.hako`. # Handoff — 20.43 Kickoff (15h progress) Focus (next) - Start Phase 20.43: MIR generation coverage for call/method/newbox/load/store/typeop, with minimal Array/Map bridge (structure-first, no behavior change). What’s landed this session (DONE) - NewBox → Constructor (minimal lower) - Added: `lang/src/mir/builder/internal/lower_newbox_constructor_box.hako` - Wired in: `lang/src/mir/builder/MirBuilderBox.hako` (try_lower early) and alias in `nyash.toml`. - Direct canary (PASS): `tools/smokes/v2/profiles/quick/core/phase2043/lower_newbox_constructor_direct_core_exec_canary_vm.sh`. - Method(size) → structural MIR (Array) - Added: `lang/src/mir/builder/internal/lower_method_array_size_box.hako` + alias in `nyash.toml`. - Direct structural canary (PASS): `tools/smokes/v2/profiles/quick/core/phase2043/lower_method_array_size_direct_struct_canary_vm.sh`. - Method(push) → structural MIR (Array) - Added: `lang/src/mir/builder/internal/lower_method_array_push_box.hako` + alias in `nyash.toml`. - Direct structural canary (PASS): `tools/smokes/v2/profiles/quick/core/phase2043/lower_method_array_push_direct_struct_canary_vm.sh`. - New → Constructor (direct) and Method(size/push) canaries all green under phase‑2043. - Array get/set - Added: `lang/src/mir/builder/internal/lower_method_array_get_set_box.hako` + alias. - Direct structural canary (PASS): `tools/smokes/v2/profiles/quick/core/phase2043/lower_method_array_get_set_direct_struct_canary_vm.sh`. - Map size/get/set - Added: `lang/src/mir/builder/internal/lower_method_map_size_box.hako`, `lower_method_map_get_set_box.hako` + aliases. - Direct structural canaries (PASS): `lower_method_map_size_direct_struct_canary_vm.sh`, `lower_method_map_get_set_direct_struct_canary_vm.sh`. - Load/Store(最小) - Added: `lang/src/mir/builder/internal/lower_load_store_local_box.hako` + alias。 - Direct structural canary (PASS): `lower_load_store_local_direct_struct_canary_vm.sh`。 - TypeOp Check(最小) - Added: `lang/src/mir/builder/internal/lower_typeop_check_box.hako` + alias。 - Direct structural canary (PASS): `lower_typeop_check_direct_struct_canary_vm.sh`。 - TypeOp Cast(最小) - Added: `lang/src/mir/builder/internal/lower_typeop_cast_box.hako` + alias。 - Direct structural canary (PASS): `lower_typeop_cast_direct_struct_canary_vm.sh`。 - Builder internal route stabilized for simple New → Core via runner_min - Added: `lang/src/mir/builder/internal/runner_min_box.hako` + alias。 - `verify_program_via_builder_to_core` uses runner_min first, with markers + optional full MirBuilder fallback. - Harness improvements - Builder output extraction with markers `[MIR_OUT_BEGIN]/[MIR_OUT_END]` in `tools/smokes/v2/lib/test_runner.sh`. - Debug tails for stdout/stderr when `HAKO_MIR_BUILDER_DEBUG=1`. - Enabled using for inline runs: `NYASH_ENABLE_USING=1` / `HAKO_ENABLE_USING=1`. Open items / blockers - Builder (internal/delegate) inline route still unstable for JSON capture; `phase2043/program_new_array_delegate_struct_canary_vm.sh` fails (no JSON in stdout). - Plan: switch builder to write MIR to a temp file (FileBox) and let harness read it; or adopt provider route in 20.44 (`env.mirbuilder.emit`). - Remaining lowers for 20.43 not yet added: method(push/get/set/len), load/store (local), typeop(is/as) minimal; builder wiring after direct lowers pass. Next-up checklist (20.43) 1) MirBuilder wiring: 上記 direct lowers を `MirBuilderBox` から段階採用(Return系フォールバック前)→ 一部(Array/Map/LoadStore/TypeOp)採用済み。 2) New(Map) は Constructor lower で既に生成可能(direct PASS)。Builder経路へ採用。 3) TypeOp: `Cast` 採用済(構造lower→canary→配線)。 4) Builder route 安定化(internal):lower ラッパー側で MIR を `/tmp` に保存→ハーネスが読む(pipe 揺れを回避)。 5) Delegate route(20.44 に接続):`env.mirbuilder.emit` を provider 経由に切替(構造は共通)。 6) Delegate route (optional): use provider `env.mirbuilder.emit` (20.44 scope) to make canaries robust. How to run - All new phase 20.43 canaries: - `bash tools/smokes/v2/run.sh --profile quick --filter phase2043` - Single tests: - NewBox direct: `tools/smokes/v2/profiles/quick/core/phase2043/lower_newbox_constructor_direct_core_exec_canary_vm.sh` - Method(size) direct: `tools/smokes/v2/profiles/quick/core/phase2043/lower_method_array_size_direct_struct_canary_vm.sh` Toggles (dev) - Inline Hako: `HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=0 NYASH_ENABLE_USING=1 HAKO_ENABLE_USING=1` - Builder internal: `HAKO_MIR_BUILDER_INTERNAL=1` (and `HAKO_MIR_BUILDER_DEBUG=1` for tails) Pointers - New lowers: `lang/src/mir/builder/internal/lower_newbox_constructor_box.hako`, `lang/src/mir/builder/internal/lower_method_array_size_box.hako` - Wiring: `lang/src/mir/builder/MirBuilderBox.hako` (try_lower order) and `nyash.toml` aliases - Harness: `tools/smokes/v2/lib/test_runner.sh` (marker extraction / debug tails) ---