Files
hakorune/CURRENT_TASK.md
nyash-codex 6255877e48 Phase 21.4: HC012 Dead Static Box + HC013 Duplicate Method実装完了
## 実装内容

### HC012: Dead Static Box
- 未参照static boxを検出
- IR boxes配列活用、calls情報から参照チェック
- テスト: HC012_dead_static_box/{ok,ng}.hako + expected.json

### HC013: Duplicate Method
- 同名・同arityメソッド重複検出
- Box内でメソッド署名の一意性チェック
- テスト: HC013_duplicate_method/{ok,ng}.hako + expected.json

### 🔥 Critical Bug Fix: parser_core.hako arity計算修正
- **問題**: arityが「カンマの数」を返していた(add(a,b) → 1)
- **修正**: `if any == 1 { arity = arity + 1 }` に変更
- **影響**: 全メソッドのarity計算が正しくなった(HC015等に波及)

### Infrastructure改善
- analysis_consumer.hako: _ensure_array()ヘルパー導入
  - MapBox.get().push()問題の根本解決
  - uses/methods/calls/boxes全てで安全なpush実現
- run_tests.sh: NYASH_JSON_ONLY=1で出力純度確保
- cli.hako: HC012/HC013統合、デバッグ出力追加

## テスト結果
 HC011_dead_methods: OK
 HC012_dead_static_box: OK
 HC013_duplicate_method: OK
 HC016_unused_alias: OK
[TEST/SUMMARY] all green

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 02:59:54 +09:00

473 lines
33 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.4Hako Parser → Analyzer / SelfHost
目的(このフェーズで到達するゴール)
- 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 をテキスト走査でフォールバック
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 が緑。
Remaining (21.4)
1) Hako Parser MVP 実装tokenizer/parser_core/ast_emit/cli【A/B 完了、微修整残り】
2) Analyzer AST 入力切替analysis_consumer.hako【C: ensure_array 完了、AST優先の薄化継続】
3) 代表ルール AST 化HC001/002/003/010/011/020
4) `--format json-lsp` 出力【CLI整備済み、追加テスト】
5) テスト駆動tests/<rule>/)を 3 ルール分用意
6) 限定 `--fix`HC002/003/500
7) DOT エッジ ONcalls→edges, cluster by box
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) C: AST優先取り込みの最終化text fallback を最小に)
2) C: calls の arity 推定(実装済み)に基づく HC015 足場準備
3) C: HC012 line 精度span_line適用後回し可
4) `--format json-lsp` の代表テスト追加OK/NG/edge
Context Compression Notes
- A診断I/F抑制は実装済み。文字列診断→型付き変換あり。
- BAST: span_line/is_static=boolは実装済み。methods.arity は既に出力。
- C は ensure_array と calls arity 推定を反映。残は AST優先の徹底と HC012 line 精度。
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)
---