Files
hakorune/CURRENT_TASK.md
Selfhosting Dev fdc889ed58 selfhost: Integrate ChatGPT's using system parser fixes
- Fix using paths in mini_vm_prints.nyash and mini_vm_core.nyash
- Convert multi-line JSON literal to single-line in empty args smoke test
- Remove extra closing brace in mini_vm_core.nyash
- Add verbose logging for using system visited file tracking

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-23 02:15:53 +09:00

381 lines
26 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 — Stability Polish (Concise)
Updated: 20250922
## Compressed Snapshot (Short)
- Strings (UTF8/CP vs Byte): baseline done
- [x] PyVM CP smokes (length/indexOf/lastIndexOf/substring)
- [x] ASCII Byte smoke
- [x] Rust CP gate (`NYASH_STR_CP=1`) for length/indexOf/lastIndexOf
- [x] Docs: blueprint updated with CP gate
- MiniVM BinOp(+): stabilization in progresssafe pathのみで緑化へ
- [x] Removed global digit-sum fallbacksハング源を除去
- [x] Added typed/token/value-pair probes仕様不変
- [x] Expressionbounded extractorPrint.expression の `{…}` で value×2 決定的抽出)
- [x] Main.fastpath: BinaryOp('+') を早期に 2 値抽出→加算→即 return
- [x] PyVM: `__me__` ディスパッチ同一Box内メソッド呼びの安全化
- [x] PyVM: `String.substring` の None 引数を安全化None→既定値
- [x] MiniVM 内の me 呼びを完全撤去(関数呼びに統一)/ substring 前の index ガード徹底
- [x] 代表スモークint+int=46を緑化print_prints_in_slice の無限ループ回避を含む)
- CI: keep min-gate light (MacroCtx/selfhost-preexpand/UTF8/ScopeBox) — all green
This page is trimmed to reflect the active work only. The previous long form has been archived at `CURRENT_TASK_restored.md`.
Principles (featurepause)
- Selfhosting first. Macro normalization preMIR; PyVM semantics are authoritative.
- Big feature additions are paused until Nyash VM bootstrap completes. Bug fixes, docs, smokes/goldens, CI polish, robustness (specpreserving) continue.
- Keep changes minimal/local; no spec changes unless to fix critical issues, and guard any optional paths behind defaultOFF flags.
### Delta (since last update)
- SelfHost Ny ExecutorMIR→Ny 実行器計画を追加既定OFF・段階導入
- Docs 追加: `docs/development/roadmap/selfhosting-ny-executor.md`
- 目的/原則/フラグ/段階計画/受け入れ/ロールバック/リスクを整理
- 既定は PyVM。`NYASH_SELFHOST_EXEC=1` で Ny Executor に委譲(当面 noop→順次実装
- Stage 0 実装: スカフォールド + ランナー配線既定OFF/noop
- 追加: `apps/selfhost-runtime/{runner.nyash,mir_loader.nyash,ops_core.nyash,ops_calls.nyash,boxes_std.nyash}`(雛形)
- 配線: `src/runner/modes/pyvm.rs``NYASH_SELFHOST_EXEC=1` 検出時の Ny ランナー呼び出し(子には同フラグを継承しない)
- 受け入れ: cargo check 緑。既定挙動不変。フラグONで noop 実行exit 0可能。
- Stage 1 一部: MIR(JSON v0) の最小ローダ実装(要約抽出のみ)
- `apps/selfhost-runtime/mir_loader.nyash`: FileBox で読込→JsonDocBox で parse→version/kind/body_len を要約
- `apps/selfhost-runtime/runner.nyash`: args[0] の JSON を読み、{version:0, kind:"Program"} を検証NGは非0exit
- v0 とハーネスJSON{"functions":…})の両フォーマットを受理。`--trace` で v0 要約/stmt数、ハーネス要約functions数を出力
- **P1 標準箱のlib化完了**既定OFF・段階導入
- 薄ラッパlib実装: `apps/lib/boxes/{console_std.nyash,string_std.nyash,array_std.nyash,map_std.nyash}`(恒等の薄ラッパ)
- 自己ホスト実行器の導線: `src/runner/modes/pyvm.rs``--box-pref=ny|plugin` 子引数伝達(既定=plugin
- BoxCall ディスパッチ骨格: `apps/selfhost-runtime/{runner.nyash,ops_calls.nyash}` でpref解析・初期化
- **ScopeBox/LoopForm 前処理完了**恒等・導線ON
- 前処理本体恒等apply: `apps/lib/{scopebox_inject.nyash,loopform_normalize.nyash}`
- Selfhost Compiler適用: `apps/selfhost/compiler/compiler.nyash``--scopebox/--loopform` 受理→apply後emit
- Runner env→子引数マップ: `src/runner/selfhost.rs``NYASH_SCOPEBOX_ENABLE=1``--scopebox` 変換
- Smoke 追加(任意実行): `tools/test/smoke/selfhost/selfhost_runner_smoke.sh`
- **恒等性確認スモーク追加**:
- ScopeBox恒等: `tools/test/smoke/selfhost/scopebox_identity_smoke.sh`
- LoopForm恒等: `tools/test/smoke/selfhost/loopform_identity_smoke.sh`
- Identity 確認スモークSelfhost Compiler 直呼び)
- ScopeBox: `tools/test/smoke/selfhost/scopebox_identity_smoke.sh`
- LoopForm: `tools/test/smoke/selfhost/loopform_identity_smoke.sh`
- Selfhost Compiler 前処理導線既定OFF
- 追加: `apps/lib/{scopebox_inject.nyash,loopform_normalize.nyash}`(恒等版・将来拡張の足場)
- 配線: `apps/selfhost/compiler/compiler.nyash``--scopebox`/`--loopform` を受理して JSON を前処理
- Runner 側: `src/runner/selfhost.rs` が env→子引数にマップ`NYASH_SCOPEBOX_ENABLE=1``--scopebox``NYASH_LOOPFORM_NORMALIZE=1``--loopform`
- 任意: `NYASH_SELFHOST_CHILD_ARGS` で追加引数を透過
- ループ内 if 合流の PHI 決定を MIR で正規化(仕様不変・堅牢化)
- 変更: `src/mir/loop_builder.rs`
- then/else の代入変数を再帰収集→合流で変数ごとに PHI/直バインドを決定
- 到達ブランチのみ incoming に採用break/continue 終端は除外)
- `no_phi_mode` では到達 pred に対して edgecopy を生成(意味論等価)
- 効果: i/printed 等のキャリア変数が合流後に正しく統一。無限ループ/古い SSA 値混入の根治
- MiniVmPrintsJSON 経路): 出力総数のカウントを安定化(仕様不変)
- 各 Print ステートメントでの実出力回数を 1 回だけ加算するよう整理Compare を 1/0 直接 print に)
- 代表プローブ: A/B/7/1/7/5 → count=6 を確認PyVM と一致)
- JSON provideryyjsonベンダリング完了・切替はランタイム
- `plugins/nyash-json-plugin/c/yyjson/{yyjson.h,yyjson.c,LICENSE}` を同梱し、`build.rs + cc` で自己完結ビルド。
- env `NYASH_JSON_PROVIDER=serde|yyjson`(既定=serde。nyash.toml の [env] からも設定可能。
- yyjson 経路で parse/root/get/size/at/str/int/bool を実装TLVタグは従来準拠。失敗時は安全に serde にフォールバック。
- JSON スモークparse_ok/err/nested/collect_printsは serde/yyjson 両経路で緑。専用の yyjson CI ジョブは追加しない(不要)。
- MiniVmPrints 揺れ対応の既定OFF化
- BinaryOp('+') の 2 値抽出や未知形スキップのフォールバックは「開発用トグル」のみ有効化既定OFF
- 本線は JSON Box 経路に統一collect_prints_mixed は JSON ベースのアプリに切替)。
- Plugin v2 (TypeBox) — resolve→invoke 経路の堅牢化(仕様不変)
- v2 ローダが perBox TypeBox FFI の `resolve(name)->method_id` を保持し、`nyash.toml` 未定義メソッドでも動的解決→キャッシュ
- Unified Host の `resolve_method` も config→TypeBox.resolve の順で解決
- 影響範囲はローダ/ホストのみ。既定動作不変、失敗時のフォールバック精度が向上
- JSON Boxbringup
- 追加: `plugins/nyash-json-plugin`JsonDocBox/JsonNodeBox、serde_json backend
- `nyash.toml` に JsonDocBox/JsonNodeBox の methods を登録birth/parse/root/error, kind/get/size/at/str/int/bool/fini
- PyVM 経路: `src/llvm_py/pyvm/ops_box.py` に最小シムJsonDoc/JsonNodeを追加parse/root/get/size/at/str/int/bool
- Smoke: `tools/test/smoke/selfhost/jsonbox_collect_prints.sh`A/B/7/1/7/5を追加し緑を確認
- Using inliner/seam (dev toggles defaultOFF)
- Resolver seam join normalized; optional brace safety valve addedstrings/comments除外カウント
- Python combineroptional hook: `tools/using_combine.py` を追加(--fix-braces/--seam-debug など)
- mini_vm_core の末尾ブレースを整合(未閉じ/余剰の解消)
- MiniVm.collect_prints の未知形スキップを Print オブジェクト全体に拡張(停滞防止)
- Docs
- Added strings blueprint: `docs/blueprints/strings-utf8-byte.md`
- Refreshed docs index with clear "Start here" links (blueprints/strings, EBNF, strings reference)
- Clarified operator/loop sugar policy in `guides/language-core-and-sugar.md` ("!" adopted, dowhile not adopted)
- Concurrency docs (design-only): box model, semantics, and patterns/checklist added
- `docs/proposals/concurrency/boxes.md`
- `docs/reference/concurrency/semantics.md`
- `docs/guides/box-patterns.md`, `docs/guides/box-design-checklist.md`
- CI/Smokes
- Added UTF8 CP smoke (PyVM): `tools/test/smoke/strings/utf8_cp_smoke.sh` using `apps/tests/strings/utf8_cp_demo.nyash` (green)
- Wired into mingate CI alongside MacroCtx smoke (green)
- Added using mix smoke (PyVM, using ON): `tools/test/smoke/selfhost/collect_prints_using_mixed.sh` — green
- Fix: MiniVmBinOp.try_print_binop_sum_any gains a lightweight typeddirect fallback scoped to the current Print slice when expression bounds are missing. Spec unchanged; only robustness improved.
- Repro flags: default (NYASH_RESOLVE_FIX_BRACES/NYASH_PARSER_STATIC_INIT_STRICT remain available but not required)
- Added loaderpath dev smoke (MiniVm.collect_prints focus): `tools/test/smoke/selfhost/collect_prints_loader.sh`(任意/開発用)
- Added emptyargs using smoke (PyVM, using ON): `tools/test/smoke/selfhost/collect_empty_args_using_smoke.sh` (uses seam brace safety valve; defaultOFF)
- Runtime (Rust)
- StringBox.length: CP/Byte gate via env `NYASH_STR_CP=1` (default remains byte length; pausesafe)
- StringBox.indexOf/lastIndexOf: CP gate via env `NYASH_STR_CP=1`既定はByte index; PyVMはCP挙動
Notes / Risks
- PyVM はプラグイン未連携のため、JsonBox は最小シムで対応仕様不変、既定OFFの機能変更なし。将来的に PyVM→Host ブリッジを導入する場合はデフォルトOFFで段階導入。
- 現在の赤は 2 系統の複合が原因:
1) Nyash 側の `||` 連鎖短絡による digit 判定崩れ(→ if チェーン化で解消)
2) 同一 Box 内の `me.*` 呼びが PyVM で未解決(→ `__me__` ディスパッチ導入)。
付随して、`substring(None, …)` 例外や `print_prints_in_slice` のステップ超過が発生。
ここを「me 撤去index ガード+ループ番兵」で仕上げる。
### Design DecisionStrings & Delegation
- Keep `StringBox` as the canonical text type (UTF8 / Code Point semantics). Do NOT introduce a separate "AnsiStringBox".
- Separate bytes explicitly via `ByteCursorBox`/buffer types (byte semantics only).
- Unify operations through a cursor/strategy interface (length/indexOf/lastIndexOf/substring). `StringBox` delegates to `Utf8Cursor` internally; byte paths use `ByteCursor` explicitly.
- Gate for transition (Rust only): `NYASH_STR_CP=1` enables CP semantics where legacy byte behavior exists.
## Implementation Order12 days
1) Strings CP/Byte baselinefoundation
- [x] CP smokePyVM: length/indexOf/lastIndexOf/substringapps/tests/strings/utf8_cp_demo.nyash
- [x] ASCII byte smokePyVM: length/indexOf/substringapps/tests/strings/byte_ascii_demo.nyash
- [x] Rust CP gate: length/indexOf/lastIndexOf → `NYASH_STR_CP=1` でCP既定はByte
- [x] Docs note: CP gate env (`NYASH_STR_CP=1`) を strings blueprint に明記
2) MiniVM BinOp(+安定化StageB 内部置換)
- [x] 広域フォールバック(全数値合算)を削除(安全化)
- [x] typed/token/value-pair の局所探索を導入(非破壊)
- [x] 式境界Print.expression`{…}` 内で `value`×2 を確実抽出→加算(決定化)
- [x] Main.fastpath を追加(先頭で確定→即 return
- [x] PyVM`__me__` ディスパッチ追加/`substring` None ガード
- [x] MiniVMme 呼びの全面撤去(関数呼びへ統一)
- [x] `substring` 呼び前の index>=0 ガード徹底・`print_prints_in_slice` に番兵を追加
- [x] 代表スモークint+int=46を緑化
3) JSON ローダ分離(導線のみ・互換維持)
- [x] MiniJsonLoader薄ラッパ経由に集約の導線を適用prints/単一intの抽出に使用→ 後で `apps/libs/json_cur.nyash` に差し替え可能
- [x] スモークは現状維持stdin/argv 供給とも緑)
- [x] loaderpath の検証用スモーク追加dev 任意)
4) Nyash 箱の委譲(内部・段階導入)
- [ ] StringBox 公開API → Utf8CursorBoxlength/indexOf/substringへ委譲互換を保つ
- [ ] Byte 系は ByteCursorBox を明示利用(混線防止)
5) CI/Docs polish軽量維持
- [x] README/blueprint に CP gate を追記
- [ ] Min-gate は軽量を維持MacroCtx/前展開/UTF8/Scope系のみ
## MiniVMStageB 進行中)
目的: Nyash で書かれた極小VMMiniVMを段階育成し、PyVM 依存を徐々に薄める。まずは “読む→解釈→出力” の最小パイプを安定化。
現状(達成)
- stdin ローダ(ゲート): `NYASH_MINIVM_READ_STDIN=1`
- Print(Literal/FunctionCall)、BinaryOp("+") の最小実装とスモーク
- Compare 6種<, <=, >, >=, ==, !=)と int+int の厳密抽出
- Ifリテラル条件片側分岐の走査
次にやる(順)
1) JSON ローダの分離(`apps/libs/json_cur.nyash` 採用準備)
2) if/loop の代表スモークを 12 本追加PyVM と出力一致)
- [x] Ifリテラル条件: T/F の分岐出力mini_vm_if_literal_branch_smoke
- [x] Loop 相当(連続 Print の順序): a,b,c,1,2 の順序確認mini_vm_print_sequence_smoke
3) MiniVM を関数形式へ移行(トップレベル MVP から段階置換)
- [x] Entry を薄くargs→json 決定→core.run へ委譲)
- [x] core.run の単発 Literalstring/int対応を内製
- [x] 純関数 API 追加: MiniVm.collect_prints(json)(最小: literal対応
受け入れStageB
- stdin/argv から供給した JSON 入力で Print/分岐が正しく動作(スモーク緑)
## UTF8 計画UTF8 First, Bytes Separate
目的: String の公開 API を UTF8 カーソルへ委譲し、文字列処理の一貫性と可観測性を確保(性能最適化は後続)。
現状
- Docs: `docs/reference/language/strings.md`
- MVP Box: `apps/libs/utf8_cursor.nyash`, `apps/libs/byte_cursor.nyash`
段階導入(内部置換のみ)
1) StringBox の公開 API を段階的に `Utf8CursorBox` 委譲(`length/indexOf/substring`
2) MiniVM/macro 内の簡易走査を `Utf8CursorBox`/`ByteCursorBox` に置換(機能同値、内部のみ)
3) Docs/スモークの更新(出力は不変;必要時のみ観測ログを追加)
Nyash スクリプトの基本ボックス(標準 libs
- 既存: `json_cur.nyash`, `string_ext.nyash`, `array_ext.nyash`, `string_builder.nyash`, `test_assert.nyash`, `utf8_cursor.nyash`, `byte_cursor.nyash`
- 追加候補(機能追加ポーズ遵守: libs 配下・任意採用・互換保持)
- MapExtBoxkeys/values/entries
- PathBox minidirname/join の最小)
- PrintfExt`StringBuilderBox` 補助)
## CI/Gates — Green vs Pending
Alwayson期待値: 緑)
- rustcheck: `cargo check --all-targets`
- pyvmsmoke: `tools/pyvm_stage2_smoke.sh`
- macrogolden: identity/strings/array/map/loopformkeyorder insensitive
- macrosmokeslite:
- match guardliteral OR / type minimal
- MIR hintsScope/Join/Loop
- ScopeBoxnoop
- MacroCtx ctx JSON追加済み
- selfhostpreexpandsmoke: upper_stringauto engage 確認)
Pending / Skipped未導入・任意
- Match guard: 追加ゴールデンtype最小形
- LoopForm: break/continue 降下の観測スモーク
- MiniVM StageB: JSON ローダ分離 + if/loop 代表スモーク(継続的に強化)
- UTF8 委譲: StringBox→Utf8CursorBox の段階置換(内部のみ;ゲート)
- UTF8 CP gate (Rust): indexOf/lastIndexOf envgated CP semantics既定OFF
- LLVM 重テスト: 手動/任意ジョブのみ(常時スキップ)
## 80/20 Plan小粒で高効果
JSON / Plugin v2現状に追記
- [x] v2 resolve→invoke 配線TypeBox.resolve フォールバック + キャッシュ)
- [x] JsonBox methods を nyash.toml に登録
- [x] PyVM 最小シムJsonDoc/JsonNodeを追加
- [x] JSON collect_prints スモーク追加(緑)
- [x] yyjson ベンダリングード操作実装parse/root/get/size/at/str/int/bool
- [x] ランタイム切替env `NYASH_JSON_PROVIDER`)— 既定は serde。yyjson 専用 CI は追加しない。
- [ ] TLV void タグ整合(任意:共通ヘルパへ寄せる)
- [ ] method_id キャッシュの統一化loader 内で Box単位の LRU/Hash で維持)
- [x] MiniVmPrints フォールバックは開発用トグルのみ既定OFF
### Box Std Liblib化計画・共通化
目的
- VM/PyVM/自己ホスト実行器で共通に使える“最小面の標準箱”を apps/lib に蒸留し、名前と戻り値を統一する意味論不変・既定OFF
置き場Ny libs
- `apps/lib/boxes/{console_std.nyash,string_std.nyash,array_std.nyash,map_std.nyash,path_std.nyash,json_std.nyash}`(段階追加)
導線/トグル既定OFF
- 優先度切替(自己ホスト実行器のみ):`NYASH_SELFHOST_BOX_PREF=plugin|ny`(既定=plugin
- `plugin`: 既存のプラグイン/シムを優先(後方互換)
- `ny`: lib/boxes 実装を優先(プラグイン未定義メソッドは安全フォールバック)
- 導入は include/using ベース(採用側のみ差し替え、広域リネームは行わない)
優先順位(段階導入)
1) P1高頻度・最小面
- ConsoleBox: `print/println/log` → i64status
- String: `length/substring/indexOf/lastIndexOf/esc_json`
- ArrayBox: `size/len/get/set/push/toString`
- MapBox: `size/has/get/set/toString`
2) P2周辺ユーティリティ
- PathBox: `dirname/join`POSIX 風)
- JsonDocBox/JsonNodeBox adaptor: plugin へ薄ラップPyVM シムと同名)
3) P3補助
- StringBuilderBox最小/ Pattern helpers既存 libs を整理)
受け入れ基準
- 既定OFFで挙動不変pref=plugin`pref=ny` 時も VM/LLVM/PyVM の出力一致。
- 代表スモークstrings/array/map/path/jsonを green。未実装メソッドは no-op/None で安全に退避。
ロールバック/リスク
- ロールバックは `NYASH_SELFHOST_BOX_PREF=plugin` で即時復帰。
- 命名衝突は採用側の include/using に限定(既存ファイルの広域変更は行わない)。
TODO段階タスク
- [x] P1: console_std/string_std/array_std/map_std の雛形を追加apps/lib/boxes/
- [x] P1: 自己ホスト実行器の BoxCall ディスパッチに `NYASH_SELFHOST_BOX_PREF` を導入(既定=plugin
- [x] ScopeBox/LoopForm 前処理(恒等版)実装+スモーク
- [ ] **今すぐ推奨**: 恒等性スモーク実行(実装検証)
- `tools/test/smoke/selfhost/scopebox_identity_smoke.sh`
- `tools/test/smoke/selfhost/loopform_identity_smoke.sh`
- `tools/test/smoke/selfhost/selfhost_runner_smoke.sh`
- [ ] P1: strings/array/map の最小スモークを selfhost 経路で追加pref=ny
- [ ] P2: path_std/json_std の雛形とアダプタ(プラグイン優先のラップ)
- [ ] P2: path/json のスモークdirname/join、parse/root/get/size/at/str/int/bool
- [ ] P3: string_builder_std と tests の軽量追加(任意)
**次フェーズ推奨順序**(小粒・安全):
1. ScopeBox 前処理実装安全包み込み。JSON v0互換維持、If/Loop に "ヒント用余剰キー" 付与)
2. LoopForm 前処理実装(キー順正規化→安全な末尾整列)
3. P1 箱スモークpref=ny での一致確認)
4. Stage2自己ホスト実行器: const/ret/branch 骨格exit code パリティ
Checklist更新済み
- [x] Selfhost 前展開の固定スモーク 1 本upper_string
- [x] MacroCtx ctx JSON スモーク 1 本CI 組み込み)
- [ ] Match 正規化: 追加テストは当面維持(必要時にのみ追加)
- [x] プロファイル運用ガイド追記(`--profile dev|lite`
- [ ] LLVM 重テストは常時スキップ(手動/任意ジョブのみ)
- [ ] 警告掃除は次回リファクタで一括(今回は非破壊)
Acceptance
- 上記 2 本preexpand/MacroCtx常時緑、既存 smokes/goldens 緑
- README/ガイドにプロファイル説明が反映済み
- UTF8 CP smoke is green under PyVM; Rust CP gate remains optin
## Repo / Branches (private)
- Active: `selfhost`(作業用), `main`(既定)
- Cleanup: 古い開発ブランチacademic-papers / feat/match-type-pattern / selfhosting-devを整理。必要なら再作成可。
## SelfHosting — Stage A要約
Scope最小
- JSON v0 ローダ(ミニセット)/ MiniVM最小命令/ スモーク 2 本print / if
Progress
- [x] MiniVM MVPprint literal / if branch
- [x] PyVM P1: `String.indexOf` 追加
- [x] Entry 統一(`Main.main`/ ネスト関数リフト
- Nextクリーン経路
- [x] MiniVM: 入口薄化MiniVm.run 呼び一択)— `apps/selfhost-vm/mini_vm.nyash` を薄いラッパに再編using 前置に依存)
- [x] MiniVM: collect_prints の混在ケース用スモーク追加echo/itoa/compare/binop`tools/test/smoke/selfhost/collect_prints_mixed.sh`
- [x] MiniVM: JSON ローダ呼び出しの段階統一digits/quoted/whitespace を MiniJson に寄せる・第一弾完了)
- [x] Dev sugar: 行頭 @ = local のプリエクスパンドをランナー前処理に常時組込み(ゼロセマンティクス)
- [x] MiniVM ソースの @ 採用apps/selfhostvm 配下の入口/補助を段階 @ 化)
- [x] Runner CLI: clap ArgActionbool フラグを一通り点検・SetTrue 指定panic 回避)
- [ ] Docs: invariants/constraints/testingmatrix へ反映追加(前処理: using前置/@正規化
- [x] Docs: Using→Loader 統合メモ(短尺)— docs/design/using-loader-integration.mdREADMEにリンク済
### Guardrailsactive
- 参照実行: PyVM が常時緑、マクロ正規化は preMIR で一度だけ
- 前展開: `NYASH_MACRO_SELFHOST_PRE_EXPAND=auto`dev/CI
- テスト: VM/goldens は軽量維持、IR は任意ジョブ
## PostBootstrap BacklogDocs only
- Language: Scope reuse blocksdesign — docs/proposals/scope-reuse.md
- Language: Flow blocks & `->` pipingdesign — docs/design/flow-blocks.md
- Guards: Range/CharClass sugarreference — docs/reference/language/match-guards.md
- Strings: `toDigitOrNull` / `toIntOrNull`design note — docs/reference/language/strings.md
- Concurrency: Box modelRoutine/Channel/Select/Scope — docs/proposals/concurrency/boxes.md
- Concurrency semanticsblocking/close/select/trace — docs/reference/concurrency/semantics.md
## Nyash VM めど後 — 機能追加リンク(備忘)
- スコープ再利用ブロックMVP 提案): docs/proposals/scope-reuse.md
- 矢印フロー × 匿名ブロック(設計草案): docs/design/flow-blocks.md
- Match Guard の Range/CharClass参照・設計: docs/reference/language/match-guards.md
- String 便利関数toDigit/Int; 設計): docs/reference/language/strings.md
Trigger: nyash_vm の安定主要スモーク緑・自己ホスト経路が日常運用。達成後に検討→MVP 実装へ。
## Next Up (Parity & Using Edge Smokes)
- Parity quick harness任意: `tools/smokes/parity_quick.sh` で代表 apps/tests を PyVM vs llvmlite で比較
- Using エッジケース: 相互依存/相対パス混在/alias のスモーク追加apps/tests + tools/test/smoke/using/edge_cases.sh
- Using 混在スモークの緑化仕上げPyVM
- MiniVmPrints.print_prints_in_slice の binop/compare/int リテラル境界obj_end/p_obj_endを調整
- ArrayBox 経路の size/get 依存を避け、直接 print する経路の安定化を優先
- 再現フラグ(開発のみ): `NYASH_RESOLVE_FIX_BRACES=1 NYASH_PARSER_STATIC_INIT_STRICT=1`
### Next Up (JSON line)
- TLV void タグの統一(任意)
- method_id 解決キャッシュの整備・計測
- YYJSON backend のスケルトン追加既定OFF・プラグイン切替可能設計
- JSON smokes をCI最小ゲートへ追加
- SelfHost自己ホスト実行器
- [ ] Stage 0: フラグ/ランナー配線のみnoop Ny runner
- [ ] Stage 1: MIR ローダJSON→構造体
- [ ] Stage 2: コア命令const/binop/compare/branch/jump/ret/phi
- [ ] Stage 3: call/externcall/boxcallMVP
- [ ] Stage 4: Array/Map 最小メソッド
- [ ] Stage 5: using/seam 代表ケース安定化
- [ ] Stage 6: パリティハーネス/CI非ブロッキング→昇格
### SelfHost フラグ/戻し手順(記録)
- フラグ既定OFF
- `NYASH_SELFHOST_EXEC=1`: Ny Executor を有効化
- `NYASH_SELFHOST_TRACE=1`: 追跡ログ
- `NYASH_SELFHOST_STEP_MAX`: ステップ上限
- `NYASH_SELFHOST_STRICT=1`: 厳格モード
- ロールバック: フラグ OFF で即 PyVM に復帰(既定)。差分は最小・局所で導入。
### Notes (Stage 0 wiring)
- Rust 側は MIR(JSON) を `tmp/nyash_selfhost_mir.json` に出力→Ny ランナーapps/selfhost-runtime/runner.nyashへ引き渡し。
- 子プロセスへは `NYASH_SELFHOST_EXEC` を伝播しない(再帰配線を防止)。
- 現段階の Ny ランナーは noop で 0 を返す。次ステージでローダ/ディスパッチを追加。