Files
hakorune/CURRENT_TASK.md
nyash-codex 772149c86d Analyzer安定化完了: NYASH_DISABLE_PLUGINS=1復元 + plugin無効化根治
## 修正内容
1. **hako_check.sh/run_tests.sh**: NYASH_DISABLE_PLUGINS=1 + NYASH_BOX_FACTORY_POLICY=builtin_first追加
2. **src/box_factory/plugin.rs**: NYASH_DISABLE_PLUGINS=1チェック追加
3. **src/box_factory/mod.rs**: plugin shortcut pathでNYASH_DISABLE_PLUGINS尊重
4. **tools/hako_check/render/graphviz.hako**: smart quotes修正(parse error解消)

## 根本原因
- NYASH_USE_PLUGIN_BUILTINS=1が自動設定され、ArrayBox/MapBoxがplugin経由で生成を試行
- bid/registry.rsで"Plugin loading temporarily disabled"の状態でも試行されエラー
- mod.rs:272のshortcut pathがNYASH_DISABLE_PLUGINSを無視していた

## テスト結果
- 10/11 PASS(HC011,13-18,21-22,31)
- HC012: 既存issue(JSON安定化未完)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:49:25 +09:00

37 KiB
Raw Blame History

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 をテキスト走査でフォールバック
  • 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 相当で運用。

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=1JSON/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/boxespush 前に必ず確保。
    • 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)

  • 11/11 green: HC011/012/013/014/015/016/017/018/021/022/031run_tests.sh
  • CLI: --rules/--skip-rules で単体/組合せ検証を高速化、JSON_ONLY で純出力。

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. 限定 --fixHC002/003/500
  7. DOT エッジ ONcalls→edges, cluster by box
  8. FileBox provider 実装リング0/1/選択ポリシーと最小スモーク追加corero/auto/plugin-only【COMPLETE】

Checklist — Ring1/Plugins polishこのフェーズで完了

  • Env 統一(二重解消): NYASH_FILEBOX_MODE/NYASH_DISABLE_PLUGINS に一本化し、 旧 NYASH_USE_PLUGIN_BUILTINS / NYASH_PLUGIN_OVERRIDE_TYPES は非推奨(互換ブリッジは維持)
  • 初期化順のSSOT: register_builtin_fileboxfeature→ dynamic登録toml→ provider選択→ FILEBOX_PROVIDER 設定vm/vm_fallback 共通)
  • Provider 登録口の一本化: static/dynamic/builtin を同じ ProviderFactory 登録APIに集約select は registry のみ)
  • FileBox 公開の一本化: basic/file_box.rs を再エクスポート/委譲化し、公開は BoxShim委譲に揃える重複実装撤去
  • Using/modules のSSOT確認: modules優先→相対ファイル推定→not found警告; verboseで詳細を維持
  • JSON_ONLY 監査: json-lsp時は stdout 純JSON・ログは stderr の規約を plugin_guard/loader を含む全経路で確認
  • AST/IR ゲート最終化: _needs_ast/_needs_ir の方針を docs と実装で一致させるASTは最小; 既定 no-ast
  • Capability introspection: FILEBOX_PROVIDER の caps(read/write) を BoxShim から取得・FailFastの可否を明示
  • スモーク追加: corero(open/read/close)/auto(フォールバック)/plugin-only(厳格)/analyzer(json-lsp純出力) の代表ケース
  • Docs 同期: FILEBOX_PROVIDER.md / ENV_VARS.md / hako_check README を最終状態に更新
  • フォールバック保証: プラグインのロード失敗だけでなく「create_box 失敗時」にも ring1/corero へ自動フォールバックauto モード。pluginonly では FailFast。
  • 失敗時スモーク: ArrayBox の plugin が存在するが creation に失敗するケースを再現し、ring1/corero で生成できることを確認。

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_envselect_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 で個別検証可能)
  1. 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 — {/} の粗い不整合検出(早期警告)
  1. --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 をパス指定から aliasusing 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)