2025-11-07 21:04:01 +09:00
# Current Task — Phase 21.4( Hako Parser → Analyzer / Self‑ Host)
2025-11-06 15:41:52 +09:00
目的(このフェーズで到達するゴール)
2025-11-07 21:04:01 +09:00
- Hako Parser( MVP) で AST JSON v0 を出力し、Analyzer の一次入力に採用( text は fallback 維持)。
- 代表ルール( HC001/002/003/010/011/020) を AST 入力で正確化。
- JSON(LSP) 出力を用意し、エディタ統合の下地を整備。
2025-11-03 23:21:48 +09:00
This document is intentionally concise (≤ 500 lines). Detailed history and per‑ phase plans are kept under docs/private/roadmap/. See links below.
2025-11-07 21:04:01 +09:00
Focus (now) - 🎯 Parser/Analyzer の骨格と I/F を先に
- tools/hako_parser/* に Tokenizer/Parser/AST emit/CLI を実装( MVP)
- Analyzer は AST JSON を優先入力に切替( Text fallback は保持)
- 代表ルールの AST 化と LSP 出力、簡易テスト基盤を確立
2025-11-05 18:57:03 +09:00
2025-11-06 22:34:18 +09:00
Update (today)
2025-11-07 21:04:01 +09:00
- 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 を追加(テスト雛形)
2025-11-08 00:46:34 +09:00
- Runner: plugin_guard 導入( vm/vm_fallback から共通化)
- String API: size() を length() のエイリアスとして VM で受理
- Analyzer CLI: --format/--debug/--source-file を順不同で処理
- Analyzer IR: AST 空時の methods をテキスト走査でフォールバック
2025-11-06 22:34:18 +09:00
2025-11-08 02:59:54 +09:00
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 が緑。
2025-11-07 21:04:01 +09:00
Remaining (21.4)
2025-11-08 02:59:54 +09:00
1) Hako Parser MVP 実装( tokenizer/parser_core/ast_emit/cli) 【A/B 完了、微修整残り】
2) Analyzer AST 入力切替( analysis_consumer.hako) 【C: ensure_array 完了、AST優先の薄化継続】
2025-11-07 21:04:01 +09:00
3) 代表ルール AST 化( HC001/002/003/010/011/020)
2025-11-08 02:59:54 +09:00
4) `--format json-lsp` 出力【CLI整備済み、追加テスト】
2025-11-07 21:04:01 +09:00
5) テスト駆動( tests/< rule > /)を 3 ルール分用意
6) 限定 `--fix` ( HC002/003/500)
7) DOT エッジ ON( calls→edges, cluster by box)
2025-11-06 22:34:18 +09:00
2025-11-08 00:46:34 +09:00
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 デバッグに出力される
2025-11-07 19:32:44 +09:00
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 に切替予定。
2025-11-07 21:04:01 +09:00
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 出力の雛形
2025-11-06 22:34:18 +09:00
Next (21.2 — TBD)
- 21.1 の安定化を維持しつつ、C‑ API の純API移行( ny‑ llvmc 経由を段階縮小)計画を作成
- reps の決定性( 3× ) を phase2100 aggregator にも追加検討
2025-11-07 19:32:44 +09:00
- Hako‑ first 方針( Rust変更最小化)
- Rust は Kernel/ABI( シンボル/リンク)に集中。解釈/解決は Hako 側の Adapter/Policy に段階移行。
- dev は Adapter 登録や by‑ name fallback を許容( トグル) 、prod は Adapter 必須( Fail‑ Fast) 。
Next Steps (immediate)
2025-11-08 02:59:54 +09:00
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+ 抑制) は実装済み。文字列診断→型付き変換あり。
- B( AST: 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.
2025-11-08 00:46:34 +09:00
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` の最小実装(既存配線に診断配列を流し込む)
2025-11-05 18:57:03 +09:00
2025-11-06 15:41:52 +09:00
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 ゲート整備)
2025-11-04 16:33:04 +09:00
2025-11-04 20:51:15 +09:00
Next Steps (ordered)
2025-11-06 15:41:52 +09:00
1) repeat reps: TypeOp を追加(済)
2) PRIMARY reps: Array/Map 三受信者の独立性(追加済)
2025-11-06 16:59:34 +09:00
3) S3 reps を1本追加( 3ブロック系、LLVM18 検出で自動実行)
2025-11-06 15:41:52 +09:00
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)
2025-11-06 16:59:34 +09:00
- run_all( phase2048) が緑( S3 は LLVM18 環境で自動、NYASH_LLVM_S3=0 で明示無効)
2025-11-04 20:51:15 +09:00
2025-11-04 16:33:04 +09:00
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 安定後に除去)を明記。
2025-11-06 22:34:18 +09:00
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) 。
2025-11-06 15:41:52 +09:00
---
# 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 が緑
2025-11-04 16:33:04 +09:00
2025-11-05 18:57:03 +09:00
Changes (recent)
2025-11-06 15:41:52 +09:00
- 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( 正規化ハッシュ一致)
2025-11-04 20:46:43 +09:00
// 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 追加予定。
2025-11-03 23:21:48 +09:00
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
2025-11-04 16:33:04 +09:00
- 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。
2025-11-03 23:21:48 +09:00
Open (pending)
2025-11-04 20:46:43 +09:00
- SSOT helpers( binop_lower / loop_common) の導入と呼び出し置換( Builder/Bridge) 。
- Continue ‘ !=’ else の builder 経路の MIR 生成整流( rc=8 固定化)。
2025-11-04 16:33:04 +09:00
- P1〜P4 の実装・緑化(上記 Action Items) 。
2025-11-03 23:21:48 +09:00
Active toggles (debug/verify)
2025-11-04 16:33:04 +09:00
- 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)
2025-11-03 23:21:48 +09:00
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 が確実に数値化されるよう整備(継続確認)
2025-11-04 16:33:04 +09:00
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 のポリシーを維持。
2025-11-03 23:21:48 +09:00
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( 開発時のみ)
2025-11-04 16:33:04 +09:00
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` .
2025-11-05 18:57:03 +09:00
# 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)
---