Files
hakorune/CURRENT_TASK.md
nyash-codex f6c5dc9e43 Phase 22.x WIP: LLVM backend improvements + MIR builder enhancements
LLVM backend improvements:
- Add native LLVM backend support (NYASH_LLVM_BACKEND=native)
- Add crate backend selector with priority (crate > llvmlite)
- Add native_llvm_builder.py for native IR generation
- Add NYASH_LLVM_NATIVE_TRACE=1 for IR dump

MIR builder enhancements:
- Refactor lower_if_compare_* boxes for better code generation
- Refactor lower_return_* boxes for optimized returns
- Refactor lower_loop_* boxes for loop handling
- Refactor lower_method_* boxes for method calls
- Update pattern_util_box for better pattern matching

Smoke tests:
- Add phase2100 S3 backend selector tests (17 new tests)
- Add phase2120 native backend tests (4 new tests)
- Add phase2034 MIR builder internal tests (2 new tests)
- Add phase2211 TLV shim parity test

Documentation:
- Update ENV_VARS.md with LLVM backend variables
- Update CURRENT_TASK.md with progress
- Update README.md and CHANGELOG.md

Config:
- Add NYASH_LLVM_BACKEND env support in src/config/env.rs
- Update ny_mir_builder.sh for backend selection
- Update dispatch.rs for backend routing

Tools:
- Add tools/native_llvm_builder.py
- Update smokes/v2/profiles/quick/core/phase2100/run_all.sh

Known: Many Hako builder internal files modified for optimization
2025-11-09 23:40:36 +09:00

717 lines
51 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Current Task — Phase 21.10LLVM line crate backend print EXE
Status (22.3 wrap)
- 22.3 締め: 最小Cランタイム設計/Cシンボル整合nyash.console.*→nyash_console_*)を反映。
- Hako-first MIR emit は wrapper 経由で安定StageB 出力の RC 混入を抑止、Hako→失敗時は Rust CLI にフォールバック)。
- 緑条件は quick 代表セット + phase2231 canaryrc=42で確認済み。
Next (this phase) — 22.x continuation
1) TLV配線既定OFF+ parityカナリア
- 既存の `nyash-tlv`optional / feature `tlv-shim`)を `src/runtime/plugin_ffi_common.rs` に薄く配線。
- 制御: feature + `HAKO_TLV_SHIM=1`(トレース `HAKO_TLV_SHIM_TRACE{,_DETAIL}`)。
- 受け入れ: ON/OFF で実行/rc 同一parity+ トレース観測が可能。
2) SSOTメッセージ・相対推定の整形 + 代表カナリアの常時化
- 曖昧時のメッセージ統一(件数+先頭N、legacy委譲の明記
- cwd vs using_paths 優先の明文化・軽量canaryを quick 常時化。
3) ビルダーの JsonFragBox / PatternUtilBox 採用(差分小さい箇所から)
- 手書きスキャンの置換を段階導入。If/Compare VarInt / Return BinOp VarVar 周辺を優先。
4) Ccore 一点通しMap.set+ parity維持既定OFF
- feature+ENV で noop 経路を通し、ON/OFF parity をカナリアで検証。
目的(このフェーズで到達するゴール)
- Hako ParserMVPで 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 perphase 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 は corero 相当で運用。
Quick update — Green Conditions & Togglesquick
- Green baselinequick
- Builder: Hako registry/internal = ON既定。必要時のみ `=0` でOFF。
- hv1 inline PRIMARY = ON直列も緑。必要時のみ `HAKO_PHASE2100_ENABLE_HV1=0`
- S3 reps: 任意(`NYASH_LLVM_S3=1` かつ LLVM18 環境時。未満は自動SKIP。
- EXEfirst: 任意(`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
- EXEfirst: `SMOKES_ENABLE_SELFHOST=1`既定OFF
- TLV: `--features tlv-shim` + `HAKO_TLV_SHIM=1`既定OFF/配線は無害な identity
- Using SSOT: `HAKO_USING_SSOT=1`MVP は現行解決ロジックを経由しつつタグ出力)
- ENV consolidation既定不変
- NY compiler: 主 `NYASH_USE_NY_COMPILER`、alias `NYASH_DISABLE_NY_COMPILER`/`HAKO_DISABLE_NY_COMPILER`(受理+警告、一度だけ)
- LLVM opt: 主 `NYASH_LLVM_OPT_LEVEL`、alias `HAKO_LLVM_OPT_LEVEL`(受理+警告、一度だけ)
- GateC: 主 `NYASH_GATE_C_CORE`、alias `HAKO_GATE_C_CORE`(受理+警告、一度だけ)
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 (followup tasks)
- SSOT ctx 拡張(段階導入・既定不変)
- [ ] Bridge→Hako 箱で `using_paths`/`cwd` を活用した相対推定のMVPIOはRunner側で制御
- [ ] Runner 側の ctx 渡しを拡張し、パス推定に必要な情報(呼出元ディレクトリ、プロファイル)を追加。
- 受け入れ: パリティcanarymodules命名あり維持 + 代表ケースで `using_paths` 提示時に解決成功既定OFF/トグルONのみ
- TLV shim 観測タグ既定OFF・安全
- [x] `HAKO_TLV_SHIM_TRACE=1` で shim 経由のコールに `[tlv/shim:<Box>.<method>]` を出力(既定は `MapBox.set` のみ)。
- [x] `HAKO_TLV_SHIM_FILTER=MapBox.set` などで対象コールを限定(カンマ区切り可)。
- 受け入れ: canary で `MapBox.set` の単発コール時にタグが現れるfeature有効ENV時、既定OFFではログ増加なし。
22.1 exit (criteria)
- SSOTrelative 推定の仕上げ)
- Unique: `phase2211/ssot_relative_unique_canary_vm.sh` が常時 PASScwd 優先、短時間で終了)。
- Ambiguous+strict: `phase2211/ssot_relative_ambiguous_strict_canary_vm.sh` が PASSstrict=1 時は legacy 委譲)。
- Recursion guard: `HAKO_USING_SSOT_HAKO=1` を含む実行でも無限再帰は発生しない(子プロセスへ SSOT を強制OFFINVOKING=1
- TLV/Extern観測統合
- `HAKO_CALL_TRACE=1` で plugin/extern 双方に `[call:<target>.<method>]` が観測可能。
- `HAKO_CALL_TRACE_FILTER` で method 名/`<target>.<method>` の双方が機能(例: `MapBox.set,env.console.log`)。
- 既定挙動は不変新機能はすべてトグルOFFで無影響
22.2 progress (today) — Core Thinning I
- Docs/plan: docs/private/roadmap/phases/phase-22.2/PLAN.mdT0/T1/T2・ABI契約・受け入れ規準
- C-core crate設計: crates/nyash_c_corefeature c-core=OFF 既定)
- 導線既定OFF: cwrap/c-core タグENV。対象は MapBox.set / ArrayBox.push / ArrayBox.get / ArrayBox.size(len/length)。
- Parity canariesON/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
- Exit22.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 → SKIPllvmlite未導入環境では自動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 & Registryoptin: docs/private/roadmap/phases/phase-21.6/PLAN.md
- 21.7 — VM mir_call state & Primary Flipguarded: docs/private/roadmap/phases/phase-21.7/PLAN.md
- 21.8 — Hako Check: Refactor & QuickFixMVP: 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 > HC011Box 全体が dead の場合、個別メソッドの unreachable は抑制)。
- 既定の閾値: HC012=warning、HC011=infoCLI 側で 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 の抑制を集約段で適用。
AcceptanceFooting 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 = SKIPUTF8 byte-level 支援待ち)
- CLI: `--rules`/`--skip-rules` で単体/組合せ検証を高速化、JSON_ONLY で純出力。
Phase 21.7 — VM mir_call state & Primary Flipgreen
- T0最小・安定化
- length stateperreceiver可: 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、perrecv差分、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 & QuickFixMVP
- T0 QuickFix--fix-dry-run, text-scope
- HC002 include→using安全置換HC003 using 非引用→引用化HC016 未使用 alias 行削除HC014 空スタブ提案。
- 統一diff---/+++/@@で標準出力。既定OFFdry-run時のみ
- T1 AST Rename同一ファイル
- --rename-box <Old> <New>--rename-method <Box> <Old> <New> を追加。
- 定義は AST span 行で安全置換、呼出は `<Box>.<Method>(` を置換。--fix-dry-run で diff 出力。
- T2 Plan 出力
- --fix-plan で refactor_plan.json と sed 雛形apply_scriptを出力手動レビュー想定
- 既定挙動は不変。適用は別フェーズwrite-capable providerで検討。
Phase 21.9 — DeRustNonPluginChecklist
- [x] Docs: Roadmap docs/development/strategies/de-rust-roadmap.md原則/ゲート/リバータブル)
- [x] Docs: Gap Analysis docs/development/strategies/de-rust-gap-analysis.mdPhase1/2の具体
- [x] Script: Phase0 archive helper tools/de_rust/archive_rust_llvm_backend.shRESTORE.md 自動生成)
- [x] Phase0: Rust LLVM backend を archive/ へ移動(既定ビルド影響なし・リバータブル)
- [ ] hv1_inline optout トグルHAKO_VERIFY_DISABLE_INLINE=1追加任意
- [ ] TLV C shimFFI雛形往復テスト最小
- [ ] 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 Integrationend 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 bugold 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/<rule>/)を 3 ルール分用意
6) 限定 `--fix`HC002/003/500
7) DOT エッジ ONcalls→edges, cluster by box
8) FileBox provider 実装リング0/1/選択ポリシーと最小スモーク追加corero/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/<rule>/ を3ルール分
- [ ] 限定 --fixHC002/HC003/HC500
- B. DOT 改善
- [ ] calls→edges 検証と代表追加ケースcluster は既存を維持)
- C. Ring1/Plugins polish未了のみ
- [ ] Using/modules SSOT 確認modules優先→相対推定→not found=警告/verbose詳細
- [x] Capability introspectionFileBox provider caps(read/write) を Shim から参照→未サポート操作は FailFast
- 実装: `src/runtime/provider_lock.rs:get_filebox_caps()` を追加、`src/boxes/file/mod.rs` で caps.write を参照し明示エラー
- [ ] Provider modes スモークの継続auto/corero/pluginonly + failure injection
Phase 21.6 — Hako MIR Builder MVP & RegistryCOMPLETE
- [x] Registry 経路optinを MirBuilderBox に実装既定OFF
- [x] registry 専用 canary 一式を PASSReturn/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 Flipkickoff
- 目的: VM に最小 stateArray/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 配線と canarypush→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 から取得・FailFastの可否を明示
- [x] スモーク追加: corero(open/read/close)/auto(フォールバック)/plugin-only(厳格)/analyzer(json-lsp純出力) の代表ケース
- [x] Docs 同期: FILEBOX_PROVIDER.md / ENV_VARS.md / hako_check README を最終状態に更新
- [x] フォールバック保証: プラグインのロード失敗だけでなく「create_box 失敗時」にも ring1/corero へ自動フォールバックauto モード。pluginonly では FailFast。
- [x] 失敗時スモーク: ArrayBox の plugin が存在するが creation に失敗するケースを再現し、ring1/corero で生成できることを確認。
FollowupsAnalyzer polish
- [x] HC012 JSON 安定化using alias 依存排除、itoa ローカル化)
- [x] HC017 一時 disableUTF8バイト操作対応後に復活
- [x] using の不要宣言削除Str aliasの掃除使用ファイル以外から撤去
- [x] ルール実行エラーの可視化stderr ログを明確にrule名・ファイル名・行
- [x] テスト運用のENVまとめを README に明示Disable Plugins / FactoryPolicy / Disable NyCompiler / JSON_ONLY
Phase 21.4 — Completion
- FileBox SSOTprovider_lock / provider_registry / CoreRo / BoxShim / feature builtin-filebox: COMPLETE
- Analyzer 安定化HC012 修復、HC017 skip、ENV明文化、json-lsp純出力: COMPLETE
Phase 22 — Proposed Focus
- Unicode SupportHC017 復活): ByteArrayBox / UTF8 encode/decode helpers / 文字プロパティ
- Plugin 完全化: dynamic plugin.soでの create_box 安定化、bid/registry の暫定停止解除
- ENV Migration 完了: 旧ENV 警告の全面展開→削除
- Error Logging 強化: error() extern 経由の統一ロギング、ルール/テキスト系への横展開
Completed — FileBox Provider WiringC: 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 を readonly で実装threadsafe
- 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 errorline表示の不整合。FileBox配線とは無関係。HC012 JSON安定化の一環で対応予定。
Next (handoff to Claude Code)
- HC012 JSON 安定化cli.hako
- jsonlsp時は stdout を純JSON、ログは stderr の規約徹底fmt判定ガードの再確認
- parse error の発生箇所を修正(構文境界/コメント/Stage3トグル周り
- `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/選択ポリシーと最小スモーク追加corero/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 失敗時は FailFast
- 決定性とハッシュ
- いまは size 決定性を優先hash はオプション。TargetMachine へ移行後に `NYASH_HASH_STRICT=1` を既定 ON に切替予定。
Nearterm TODO21.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 の安定化を維持しつつ、CAPI の純API移行nyllvmc 経由を段階縮小)計画を作成
- reps の決定性3×を phase2100 aggregator にも追加検討
- Hakofirst 方針Rust変更最小化
- Rust は Kernel/ABIシンボル/リンク)に集中。解釈/解決は Hako 側の Adapter/Policy に段階移行。
- dev は Adapter 登録や byname fallback を許容トグル、prod は Adapter 必須FailFast
Next Steps (immediate)
1) A仕上げ: HC012 line 精度span_line/ README 追随 / CLI I/F最終確認
2) BParser強化: tokenizer 文字列エスケープ/位置情報、parser_core 複数行・alias 抽出
3) C可視化: DOT 改善box cluster / 孤立ノード)と quick スモーク追加
Context Compression Notes
- A診断I/F抑制は実装済み。文字列診断→型付き変換あり。
- BAST: 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: NonASCII Quotes — “ ” 等の fancy quotes を検出し ASCII へ置換提案
- HC018: Toplevel local in prelude — 先頭 `local` を検出merge 前提のクリーンアップ漏れ)
- HC021: Analyzer IO Safety — CLI 経路での FileBox 使用を警告(`--source-file` 利用を提案)
- HC022: Stage3 Gate — while/for を含む .hako を Nyash VM へ流す危険の検出gate フラグ提示)
- HC031: Brace Heuristics — `{`/`}` の粗い不整合検出(早期警告)
5) `--format json-lsp` の最小実装(既存配線に診断配列を流し込む)
Previous Achievement
- ✅ Phase 20.44 COMPLETEprovider emit/codegen reps 緑)
- ✅ Phase 20.4546: PRIMARY 切替のための品質・整流env_bool・MethodAliasPolicy・MirBuilder prefer reps の整備)
- ✅ Phase 20.48 COMPLETEDeterministic Bootstrap & Parity: run_all 緑 / repeat 3回一致
- ✅ Phase 20.49 COMPLETESSOT & 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) README20.48)へ Quick Verify の項目拡張typeop_check/cast と multirecv を追記済)
Close Ready20.48
- 条件:
- s1s2s3_repeat_*const/compare/logical/typeopが3回一致
- PRIMARY repsIf/Logical/Loop/Array/Map/TypeOpが PASSnofallback
- run_allphase2048が緑S3 は LLVM18 環境で自動、NYASH_LLVM_S3=0 で明示無効)
Hotfix Plan — Using/Prelude Unification (SelfHost)
- 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 経路に入れないFailFast
Action Items (20.38)
- P1 CABI ブリッジ既定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 反映
- phase20.38 のトグル/受け入れ条件/撤去予定のシムを反映。φ entry SSOT は IR 完了後に更新。
- extern タグ用シムの現状と撤去条件hv1 inline 安定後に除去)を明記。
Acceptancephase 21.2
- HAKO_CAPI_PURE=1 で repsternary=44 / map=1が PASS、各3回一致obj/rc
- 21.1 repsCAPI 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` で CAPI 経路を有効化。
- `libhako_llvmc_ffi.so` を dlopen し、`hako_llvmc_compile_json` を呼び出して `.o` を生成。
- plugins feature 未有効時は明示エラーFailFast
---
# Next Task — Phase 20.49Resolver SSOT & Compiler Bringup
目的(このフェーズで到達するゴール)
- using/プレリュード統合の SSOT を dev/prod で確定include は prod で非対応)
- dev では toml なしの最短導線(相対パス using / preincludeで“すぐ動く”を保証
- コンパイラ自走に必要な hv1 inline の最小カバレッジを reps で固定
Focus20.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` で実行
Acceptance20.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: perrecv size state 実装trace。
- test_runner: HAKO_VERIFY_V1_FORCE_HAKOVM=1 を追加hv1 ラッパーで v1 実行)。
- hv1 inline reps: 代表を整備perrecv second は暫定 rc=1
Changes (this pass)
- 20.44 を ✅ COMPLETE にマーク
- 20.47/20.48 のフェーズ文書を追加(自己ホストの工程と受け入れを明文化)
- 拡張子統一(.hako/.nyash 等価): 仕様の明文化 + 実装反映
- FailFastHako in Nyash VM既定OFFHAKO_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 が MiniVM の rc に反映)
- quick/core phase2047: Using alias 代表を追加
- tools/smokes/v2/profiles/quick/core/phase2047/using_alias_selfhost_vm_entry_canary_vm.shPASS
- alias 解決の実行確認crossbox static call → rc=0
- tools/smokes/v2/profiles/quick/core/phase2047/using_alias_string_helpers_canary_vm.shPASS
- shared/helpers の alias 解決を実行確認(静的呼び出し)
- SelfHosting S1/S2builder 直行)
- gen: tools/selfhost/gen_v1_from_builder.shemit_return_int2(42) → v1 JSON 出力)
- canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_canary_vm.shPASS
- provider 雛形: tools/selfhost/gen_v1_from_provider.shCABI 連携は段階導入)
- Provider v1 強制(最終化)
- src/host_providers/mir_builder.rs: emit前後で v1 を強制NYASH_JSON_SCHEMA_V1=1 一時設定 + 読み戻し時の v1 ラップ)
- hv1 inline 実装の強化
- Array と Map の perreceiver サイズ状態を分離(独立マップ: arr/map
- MapBox: set→size を rc で検証可能first=1/second=0 reps と整合)
- Docs 更新
- phase20.48 の README に “Quick Verify” セクションを追加run_all と S3 トグルの手順)
- canary 追加: tools/smokes/v2/profiles/quick/core/phase2047/provider_v1_shape_canary_vm.shPASS
- SSOT の徹底strip.rs 連携)
- src/runner/modes/common_util/resolve/strip.rs: is_path 判定と dev-file 候補判定を SSOT に寄せpath_util
- S1/S2 拡張 repsbuilder
- 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.shPASS/環境で整合)
- S3 repsllvmlite, NyRTリンク, 実行)
- phase2047/s3_link_run_llvmlite_compare_{cfg,ret}_canary_vm.shrc=1
- phase2047/s3_link_run_llvmlite_const42_canary_vm.shrc=42
- phase2047/s3_link_run_llvmlite_branch_ret_44_canary_vm.shrc=44
- 生成器: tools/selfhost/gen_v1_from_builder_branch_ret_44.sh
- PRIMARY nofallback repshv1 inline
- phase2047/primary_no_fallback_v1_const_rc_canary_vm.shrc=42
- phase2047/primary_no_fallback_v1_compare_branch_rc_canary_vm.shrc=1
- phase2047/primary_no_fallback_v1_jump_rc_canary_vm.shrc=7
- S1/S2 拡張 repsbuilder
- 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.shPASS/環境で整合)
- S3 代表llvmlite, NyRTリンク, 実行)
- phase2047/s3_link_run_llvmlite_compare_cfg_canary_vm.shNYASH_LLVM_S3=1 で有効、SKIPガードあり
- SelfHosting 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 (Step1)
- Loop lowerssimple/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 を確認。
// Step2/3 generalization (count_param)
- step 一般化: Int 2,3,… と Local Var 由来の step を受理。'-' は負の step に正規化Add + 負値)。
- 降順対応: i > / i >= limit を cmp=Gt/Ge で build2 へ伝達。
- init/limit 起源の拡大: Local VarInt由来を逆引きで受理。
- Canaries: step=2 / step(Local) / 降順('-'/ limit(Local) / init(Local) を追加し PASS。
// Step4部分 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 追加予定。
Whats green (20.34)
- Loop/PHI unify (phi_core) in JSON v0 bridge — unified path used (toggle exposed).
- Program(JSON v0) PHItrace 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
- MiniVMhakovmrc==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=0verify 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 helpersbinop_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=1v1 FLOW 実行)
- HAKO_V1_EXTERN_PROVIDER=1Hako 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=1resolver dev
How to run (quick)
- Build: `cargo build --release`
- Program v0 PHItrace (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 canaries20.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`
MiniVM policy20.34
- 実装は維持alias/ret/phi 最小系を今後整える)。ただし quick の canary は Core へ寄せて緑化。
- 20.36 で verify primary を hakovm に段階的に切替、MiniVM green を進める。
Next (20.35 — scoped; behavior unchanged)
1) MIR JSON v1 loader expansionMethod/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, CABI scaffold)
- Verify primary 切替(段階): hakovm → Core fallback
- preinclude 非推奨化quick から撤去)
- MiniVM の最小状態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
- CABI 設計docs + ヘッダ雛形)
Known open itemstracked to 20.36
- MiniVM: using/alias の推移解決selfhost.vm.helpers.* 連鎖)
- MiniVM: 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 & CABI)
1) HakoruneExternProviderBox を拡張warn/error/emit の最小タグ/空文字挙動)— 完了
2) HAKO_V1_EXTERN_PROVIDER=1 の canary 追加(構造緑固定)— 完了
3) CABI 導線の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 linksperphase 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 `"" + <int>` 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).
Whats 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 phase2043.
- 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 安定化internallower ラッパー側で MIR を `/tmp` に保存→ハーネスが読むpipe 揺れを回避)。
5) Delegate route20.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)
---