# TODO (archived)

> **Archived (2026-07-13).** This file's content is historical — it was the
> root-level task/roadmap tracker before task management fully moved to
> GitHub Issues. For the current roadmap see
> [docs/release-roadmap.md](../release-roadmap.md); for current tasks see
> `gh issue list --state open`. Kept here for historical reference only, not
> maintained going forward.

Spec-locked decisions are tracked in `docs/spec/decisions.md`.
Completed items are archived in `docs/archive/DONE.md`.
タスクの一次管理は GitHub Issues (`gh issue` / MCP)。本ファイルはロードマップ概要。

## バージョンロードマップ (2026-07-12, ADR-0067)

**GA = 0.3.0**（旧 1.0 GA を renumber）。詳細は
[docs/release-roadmap.md](../release-roadmap.md)「バージョンロードマップ」。

- **0.2.0（現在地）** — 既知バグが一通り吐き出せている段階。0.1.0 からの
  継続的バグ修正・小機能追加（ADR-0066）。
- **0.3.0（GA、tracking #805）** — ① パッケージレジストリの完成（ADR-0065）
  ② 冗長な文法の削除 ③ トップレベル副作用の制限 + `fn main {}` エントリ
  ポイント特殊化（`_start`/`main` 混在の解消）④ エフェクトシステムの精緻化
  （#639/#640、#418/#629）⑤ REPL ⑥ doctest + 実行可能な `*.vibe.md`
  ⑦ inline wasm（WAT S 式の直接記述、最適化用）⑧ `@vibe/core` コアライブラリ
  拡充 ⑨ `let` → `fn` 移行の完遂（ADR-0064）⑩ WASI p3 動作保証（#821、
  wasmtime 45/46 matrix の guarantee gate + ratified 0.3.0 cutover）。
  タグ運用も #805（旧 1.0 GA タグ issue #647 は close 済み）。
  取り込み候補の PL 研究サーベイは [docs/pl-survey-2026-07.md](../pl-survey-2026-07.md)
  （evidence-passing handler #817 / structured concurrency #818 /
  doctest 様式 #819 / エージェント向け構造化診断 #820）。
- **0.4.0（tracking #806）** — ① スレッドを念頭に置いた設計 — Go channel /
  Elixir 風軽量プロセスが目標モデル（ADR-0068、#488）。以後の全設計は
  ADR-0068 の制約（グローバル可変状態を増やさない等）に従う
  ② 形式化を念頭に置いた型システムの設計 ③ 専用のエージェントハーネス
  （前身: 言語評価ループ `eval/lang-review/`）。

## 次の一手 (2026-07-02 時点)

現況スナップショット。**selfhost-only 移行は完了**（#594、`src/` MoonBit host 退役、
tag `moonbit-host-final-2026-06-23`）。**RC self-hosting は green**: #707→#708→#709→#715
系譜の free-list 破壊は #715 の 6 修正で全て解消し、RC 自己コンパイルされた
コンパイラが任意のプログラムを正しくコンパイル・実行できる（selfhost gate の
rc-bootstrap fixpoint + shape corpus で常時検証）。

### 現状サマリ

- **selfhost-only gate green** (`pkf run release-check` → `scripts/selfhost_only_gate.sh`、40+ steps)。
- **RC self-hosting fixpoint green**: whole-compiler-as-one-unit RC build、stage2==stage3、
  RC reclamation leak guard (heap_used=424B at N=20000)、V128 under RC。
- **#715 closed (2026-07-02)**: ETuple/EArray/ERecord/ctor の borrowed-element retention、
  sibling same-name binding の uniquify、`let mut` の Perceus dup budget
  （宣言時 + 再代入時）、EForIn loop-borrow parity。
- **再発防止機構 landed**: `VIBE_RC=shadow`（shadow-liveness trap、gate 40f が
  #715 shape corpus を常時実行）+ `#cfg(flag)` 条件コンパイル（gate 40g）。
  debugging 手順は #715 スレッドと docs/cheatsheet.md 参照。

### 🔴 アクティブ

- [x] **#705 残タスク (判断済み 2026-07-02)**: `VIBE_RC=0` pin は**性能上の
  既定値として維持**。#715/#720 の RC codegen バグ 3 件 (ネストパターン非
  short-circuit / ローカル let 注釈の未分配 / rc 24-bit オーバーフロー) を
  修正し、RC self-hosting は fixpoint まで完全 green (正しさの blocker は消滅)。
  最終ベンチ: bump 4.8s/791KB vs RC バイナリ 8.2s/2.31MB (+71% wall, 2.9×) で
  「顕著に遅い」に該当。RC ランタイム最適化 (dup 飽和チェックの single-load
  化、entry-dup 予算の branch-aware 化) 後に再測定。
- [x] **#716** merge layer の import 可視性 — ambiguous な export（複数ファイル
  同名 / builtin 名衝突）を merge 時に `name_exp_<path>` へ rename し、import
  している側の参照だけ書き換える（re-export facade 追従、entry の export 面と
  linked-library ABI は不変）。全 export の完全な可視性強制（未 import 名の
  非 ambiguous な leak 解消）も seed bump `merge-visibility-716-2026-07-03`
  を経て 2026-07-03 に landing 済み（非 entry の exported def は全 rename）。
  残件: committed flat bundle は Python flattener 製で merge machinery を
  通らず 45 dup def が残る → 別 issue。副産物として
  top-level 関数エイリアス (`export let eq = float_eq`) の呼び出しが不正 wasm を
  生むバグと、RC lane の float 型 param `==` がポインタ比較になるバグも修正
  （rc-corpus default-pass 22→27）。
- [x] **Module System v2 (ADR-0063/0064, docs/module-system-v2.md)** —
  **A–G 全フェーズの中核を実装済み (2026-07-04)**。E where 契約 =
  常時 runtime assert(release strip は後続)、F publish semver 機械検証、
  G seed bump `module-system-v2-2026-07-04` + compiler source の fn 移行
  開始(cache/sha1.vibe、stage byte 同一)。後続: ネットワーク add/update、
  Fs::ReadDir、型封印、全ツリー export 撤去の機械移行。旧記述:
  契約ファースト・パッケージシステム。**A `fn` 構文 #727 と B `module {}`
  削除 #728 は完了（2026-07-03）**。C #729 は C-1 照合エンジン / C-2
  index.vibei 解決+facade 脱糖 / C-3 入方向境界強制まで landing 済み
  （残: Fs::ReadDir 自動発見、opaque type、subpath、.vibei 直エントリ、
  escape 規則）。
  D content-addressed `require` #730、E `where` 契約 Phase 1 #731、
  F/G publish 検証 + export 撤去 + compiler source 移行 #732。
  残件 #726（Python flattener → merge machinery）は G の前提整備。
- [x] **@vibe/core パッケージ切り出し (2026-07-04)** — moonbitlang/core を参考に、
  `vibe/collection/{list,set}` / `vibe/sha1` / `vibe/leb128` を
  `lib/@vibe/core/`（ADR-0063 契約パッケージ、`index.vibei` 82 fn decl +
  `type List[T]` / `type StringSet`）へ統合。`vibe/collection` は maps 専用
  facade に縮小。compiler 内部の sha1 は vendored twin
  (`lib/@vibe/compiler/cache/sha1.vibe`) を gate 6e で canonical と diff 同期。
  store 配布は `scripts/vibe_core_install.sh`。副産物のエンジン強化:
  契約照合の any-match 化（同名 private 兄弟の許容）、bodyless
  `type Name[T]` = transparent re-export 宣言、persistent cache 再構築
  lane の ingestion 統一（pin-blank + .vibei 脱糖が cache lane を
  バイパスするバグ修正）。残: compiler 本体が @vibe/core を require で
  消費する形への移行（#726/#730 系）、prelude の重複 helper 整理。
- [x] **vibe/collection を @vibe/core へ統合 (#766, 2026-07-07)** — maps 専用に
  縮小していた `vibe/collection` を撤去し、`map.vibe`/`maps.vibe` を
  `lib/@vibe/core/` へ物理統合。`get`/`get_or`/`get_or_else`/`has_key`/
  `keys`/`values`（trait 不要な素の `Map[String, V]` 操作）は
  `map_get.vibe` に切り出して `index.vibei` の正式契約 fn に昇格。
  `[K: Hash]` 版（`get_by` 等）と `Hash` trait 自体は contract 文法が
  まだ trait を宣言できないため非契約のまま `map.vibe` に残置（package
  境界内からのみ到達可能）。`length`/`is_empty` も List/StringSet の
  同名契約 fn と衝突するため同様に非契約のまま。副産物: `index.vibei`
  契約を持つディレクトリは境界強制（#729）により外部から直接ファイル
  import できないことを実地確認。
- [x] **@vibex の純粋アルゴリズム4件を @vibe/core へ統合 (#766, 2026-07-07)**
  — `base64`/`math`(+`math_double`)/`diff`/`uuid`（消費者ゼロの純粋関数
  パッケージ）を物理統合し `index.vibei` に正式契約 fn として追加。
  `math.vibe` の `sum(Array[Int])` は `List[Int]` 版と bare 名が衝突する
  ため `math_extra.vibe` に分離し非契約のまま。移行の副産物として発見・
  修正: `diff.vibe` の `text[idx] == "\n"`（Char/String 型不一致、
  `String::char_code_at` 未使用）が実は一度も CI battery で検証されて
  いなかった潜在バグだった（`diff` は移行前 allowlist 未登録）。
  さらに2件、CI 未検証のまま残っていた既存バグを発見(未修正・スコープ外
  として allowlist から除外): `math_double.vibe` の `sin(0.0)` が
  `normalize_angle` 内で wasm メモリ OOB クラッシュ、`math_prop_test.vibe`
  が `@vibex/quickcheck` 自体の `check_int`/`is_ok` 内で unreachable
  trap。`@vibex/collect`（effect ベースの map/filter、trait 制約と異なる
  設計）と `@vibex/regexp`/`@vibex/zlib`（大規模・専門的すぎる）は今回の
  統合対象から除外。
- [x] **#767〜#778 + #672: allowlist 除外ファイルの解消 (2026-07-07 完了)** —
  `--scan` 監査で allowlist 未登録の 122 ファイルを分類し issue を12件作成、
  全件マージ済み・push 済み(`claude/vibe-lang-compiler-issues-rdck8b`、
  fixpoint 確認・301/301 allowlist green)。**#672(構造的 `==` が集約型で
  常に false になる silent miscompile)は同時並行で発見された旧
  abandoned branch から #724 の slot 追跡設計を拡張する形で本体側に再実装、
  fully green で close。** 各 issue の close/status コメントに詳細:
  - close 済み: #672・#765(fuzz liveness-bias 生成 + delta-debug reducer)・
    #772(math_double sin OOB)・#773(quickcheck unreachable — 実は
    #773 の初回修正自体が `sub` 等を局所変数として使う #777/#778 の
    string.vibe と組み合わせた際に同種のバグを再発させ、callee 位置限定の
    再修正が必要だった)・#774(http Effect 宣言+wasm tag-index バグ)・
    #775(FixedArray::make linear codegen 欠落)・#777(shell 雑多3件)。
  - 部分完了で open 継続: #767(examples 24件中2件のみ完全修復、
    重複定義の実バグを副産物として発見・修正)・#768(Fs/Env 宣言漏れ
    1/19 修復、残りは linear-backend host-import 配線が必要)・
    #769(import-alias parse bug 修正、6件中2件回収)・#770(トップレベル
    mut 二重チェックバグ修正、20件中4件回収)・#771(17件中10件を現行
    builtin surface に追従、`string_parser.vibe` 実バグ修正 — closure が
    String upvalue を capture すると RC backend で trap する深いバグを
    新規発見)・#776(vibex 10件中8件回収、regexp_test 自体と
    scan_root_import_test は未解決)・#778(3件中1件回収)。
  - **統合時に2件の相互作用バグを発見・修正**（単一 issue の pre-merge
    テストでは踏めない、複数 fix の組み合わせでのみ再現）: (1) 新規
    `Int::abs`/`Int::signum` 等の builtin 登録が `lib/@vibe/prelude/int.vibe`
    の既存ユーザー定義実装を無条件でシャドーし、overflow 時の saturating
    semantics を壊した（削除）。(2) `collect_free_vars_expr` の
    inlined-builtin skip が bare identifier 全般に効いてしまい、
    `sub`/`add`/`not` 等を実パラメータ名として使う関数（`string.vibe` の
    `sub: String` 引数）のクロージャ capture を壊した — callee 位置限定
    (`ECall(EIdent(...), ...)`) に修正。
- [x] **#726 bundle flatten を merge machinery 化 (2026-07-04)** — Python
  flattener を廃止し、`lib/@vibe/compiler/emit_merged_source_entry.vibe`(seed で
  FS-compile される単体ツール)が ExportRenamePlan + private namespacing の
  実 merge で flat source を生成する。**dup top-level def 45 → 0**(生成時に
  0 を強制 assert)。副産物: compiler source が **FS-compile clean** になった
  (roulette が隠していた import 可視性違反・二重定義・チェーン re-export・
  printer round-trip バグ(EFloat 整数化 / IIFE 括弧)を全修正)。
  発見バグ: 深い再帰内 perform の resume 破壊は #737。
- [ ] **#415** codegen builtin registry 化（linear↔wasm-gc parity、Phase B）。
- [ ] **#418 / #629 (ADR-0060)** mut の region capability 統一 — 設計は ADR-0060、
  実装は effect row 基盤に依存。

### 🟡 機能 / 品質

- [x] **#535** post-cutover branch coverage gate 復帰 — `scripts/coverage_selfhost_suite.sh`
  (allowlist を `vibe test --coverage` で回して fn/branch/case rate を集計、
  `selfhost_suite.report.json` を出力し ratchet 閾値で gate)。CI の
  selfhost-only-gate job に組み込み + report artifact。baseline: fn 38.11% /
  branch 9.57% / case 98.88%(閾値 37/9/97、上げる方向にのみ動かす)
- [ ] **#538** WASM-GC selfbuild — P4 compile E2E + **P4.5 run E2E + self-compile fixpoint 達成**（gc-compiled compiler がコンパイラ全体を byte 一致で再現）。残: P5 size
- [x] **#537** WASI P3: effect → WIT mapping + `vibe serve` — `vibe compile --wit` / `vibe serve` (launcher + adapter VIBE_EMIT_WIT / VIBE_SERVE_COMPONENT)、packed-string trampoline で selfhost componentize、wac plug + wasmtime serve。契約: docs/effect-wit-mapping.md、gate 40i/40j + test_wasi_http_p3_full_gate.sh
- [ ] **#683** wasm-gc backend の実行検証ハーネス
- [ ] **#639/#640** effect 診断の fix-it / Error の algebraic effect 化
- [ ] **#644/#645/#646** post-GA debugger/diagnostics 残タスク

### 🔵 リファクタ / 長期

- [ ] **#534** `vibe/types/` / `vibe/parser/` 分離
- [x] **#533** linked artifact の contains 線形走査解消 — whole-graph の visited/scheduled set を bucketed `path_set` 化（merge 再帰 / FS collect / manifest worklist×3、collect フェーズ -41% @450 modules）。per-module の `contains_name`/`contains_path` は小 N のため意図的に線形のまま。副産物: inline `__to_string` の copy-before-grow OOB crash 修正（cold-cache 大規模 FS compile が deterministic に落ちていた）
- [ ] **#488** shared-everything-threads 実験基盤
- [ ] **#805** GA (0.3.0) タグ / version bump（リリース運用判断。GA は
  1.0 → 0.3 に renumber、ADR-0067。旧 1.0 GA タグ issue #647 は close 済み）
- [ ] `#cfg` をコンパイラ自身のソースで使えるようにする seed bump
  （docs/selfhost-bootstrap.md 手順、現状は user code 専用）

---

## 次の一手 (2026-06-09 時点) — historical

> 注: 以下は selfhost cutover 進行中 (2026-06-09) の整理。cutover と `src/` 退役は
> 完了済み (#594)。#402 (cutover tracking) / #584 (seed 復旧) も解決済み。
> 最新は上の「2026-07-02 時点」を参照。

現況スナップショット。selfhost cutover は「移行開始可」。以後は
wasmtime runner 層と compiler wasm artifact 層を分け、compiler/checker/codegen
と CLI 挙動は `lib/@vibe/compiler/` 側で実装する。MoonBit `src/` は legacy
bootstrap / fallback として通常開発では触らない。

### 現状サマリ

- **selfhost release/cutover gates は green** (`pkf run release-selfhost-gates`)。
- **#402 perf KPI (wasmtime-aot, RUNS=3, check daemon, 2026-06-09 local)**:
  - **TOTAL compile = 1.557× ✅** (gate ≤ 2.5×)
  - **TOTAL check = 0.115× ✅** (gate ≤ 1.33×)
  - per-case spike は診断情報のみ。CI は TOTAL ratio を gate する。
- **peak RSS KPI (wasmtime-aot, 2026-06-09 local)**:
  - **compile = 1.398× ✅**, **check = 0.933× ✅** (gate ≤ 2.0×)
- **corpus check-parity REAL = 0 ✅** (`scripts/test_selfhost_corpus_gate.sh --gate`)。

### 🔴 Cutover work — wasmtime runner と compiler wasm を分ける

- [ ] **wasmtime runner 層**: `runtime/moonrun_wasmtime` / `scripts/wasmtime_run.sh`
  / cwasm cache / CI perf-RSS gate を「実行基盤」として整理する。
- [ ] **compiler wasm artifact 層**: `lib/@vibe/compiler/` の selfhost CLI/component/check
  entry と `scripts/build_selfhost_dist.sh` を canonical 配布物として整理する。
  - `selfhost-generation` 管理層は追加済み (`bootstrap/seed.json`,
    `scripts/selfhost_generations.sh`)。seed → stage1 → stage2 → stage3 は
    pinned seed のまま deterministic に通る状態に復旧済み (**#584** 解決)。
    真因は seed 非互換ではなく、#557/#558 (WASI 0.3 async) が
    `checker/builtins_async.vibe` と `component_codegen.vibe` を
    `selfhost_sources_manifest.tsv` に登録し忘れ、flat bundle が定義欠落の
    dangling ref を含んでいたこと + 新 prelude (`String::replace_all`) /
    nested pattern を seed 非互換に使っていたこと。manifest 追記と
    seed 互換書き換えで解消 (seed bump 不要)。
- [ ] **MoonBit `src/` 退役**: 通常の compile/check/test/CLI 経路を selfhost
  wasm + runner へ向ける。新機能や CLI 挙動変更は `src/` に入れない。削除は
  parity/cutover gate が CI で継続 green になってから段階的に行う。

### 🟠 open issues (一次ソース)

- [ ] **#402** selfhost cutover tracking — perf/RSS/corpus gate は通過。残りは移行配線。
- [ ] **#584** pinned seed が `perform <Effect> > n` (order 比較) を含む現 source を build できず stage1 で trap。修正は bootstrap bump (seed 再生成 → adopt → bump gate)。#529 first blocker の切り出し。
- [ ] **#482** host `mizchi/ripple` verifier の O(n²) memo scan — **upstream publish 待ちで bump のみ**。host typecheck hot path に効く(selfhost 側 ripple は #483 で O(N) 化済)。`moon.mod` の `mizchi/ripple` を修正版公開後に bump。
- [ ] **#415** codegen builtin を 2 backend 共有 registry に refactor (Phase B) — linear↔wasm-gc の parity 117 件ずれ、新 builtin 追加時の silent regression 温床。3-6 週、namespace 単位の小 PR 5-7 本。wasm-gc default 化 (Phase D) の前提。
- [ ] **#418** ADR-0052 Phase 2/3 — `mut` struct field の `state_local` effect 分類 + escape 検査。ADR-0017 `state_local` 実装が前提。大規模・既存コード影響大。
- [x] **#581** selfhost linear backend の indexed for-in (`for i, x in arr`) で index 変数が束縛されない — gc 側の index binding を `compile_expr_tail2.vibe` に移植して解消（RC 時は `<<1`）。selfbuild + async gate green。
- [x] **#582** `for await` = pull-only を**言語仕様として確定**（spec 収束）。selfhost は parser マーカーで強制済み。host は現状型ベースの permissive 実装のままとし（spec 適合プログラムは両者一致）、host の hard enforcement は ROI 低で見送り。docs (spec/cheatsheet/ADR-0012) 更新済み。

### 🟡 機能 / 品質 (issue 化候補、TODO 内に詳細あり)

- [ ] **CI branch coverage 70% gate** + normalize/DCE/loader テスト拡充 (§カバレッジ)
- [ ] **SIMD codegen 本番化** — 0xFD prefix emit + `simd_skip_ws`/`simd_scan_alnum` builtin 化 (§lib/@vibex/wasm)
- [ ] **#59 WASM-GC selfbuild 小型配布形** — P4 compile E2E 達成 (966KB valid, #538)。P4.5 run E2E + self-compile fixpoint も達成。残: P5 DCE + wasm-opt。サイズ目標は初回リリース後に現実的な値を再設定（旧 ~350KB 目標は撤回）
- [x] **WASI P3**: effect → WIT マッピング + `vibe serve` (#537, docs/effect-wit-mapping.md)
- [ ] selfhost accumulator 残 2 sites (`linked_helpers.vibe` の `contains_name` 線形走査) — vibe runtime の Map が hash table 化するまで保留 (ROI ≪、§accumulator 撲滅)

### 🔵 リファクタ / 長期

- [ ] `vibe/types/` `vibe/parser/` 分離、`lib/@vibe/compiler` 論理分割
- [ ] MoonBit host CLI を bootstrap 専用へ縮退し、CLI 実装の source of truth を
  `lib/@vibe/compiler/` へ固定
- [ ] MoonBit host 重複削減 (§similarity-mbt、残: `src/runtime/db.mbt` の `set_source`/`set_binary_source`)

---

## 次の一手 (2026-05-05 時点) — historical

> 注: 以下は 2026-05-05 時点の整理。`just` は pkfire (`pkf`) に移行済み。最新の優先順は上の「2026-05-31 時点」を参照。各 §詳細は下に残置。

優先順。各項目は該当セクションに詳細あり。

### 🔴 0.1.0 release blocker

- [x] **`just test-vibe-package-suite` compiled-only parity** — 1,455 / 1,455 tests pass（2026-05-03、PR #354）。元の 424 fail から段階的に消化:
  - examples/effects 系の lambda effect propagation: 解消（#352）
  - fs / io / path / time / shell: runtime/effect support 配線完了（#352, #353, #354）
  - examples/syntax: 0/59 → 59/59
  - derive(Eq) enum payload deep 比較: 実装（#341 value_eq runtime helper）
  - Array view writethrough / fs_readdir Array[String] / 文字列 lex compare（#354）

### 🟠 近場の重要

- [ ] **normalize / DCE / loader テスト拡充** — #298 で一部着手、カバー範囲を埋める
- [ ] **CI カバレッジ gate** — branch coverage 70% target
- [ ] **selfhost bootstrap / selfbuild KPI を CI shard 専用 gate 化**
- [ ] **selfhost O(N²) accumulator hotspots を一掃 (#366)** — `claude/benchmark-self-hosted-Pt9Y3` ブランチで survey、commit `7a67c39` (StringBuilder 5 sites) + `0f843b8` (Array push 19 sites) で着手。残タスクは下の §[selfhost accumulator 撲滅](#selfhost-accumulator-撲滅-on²-→-on) を参照

### 🟡 機能追加

- [x] **WASI P3: effect → WIT マッピング + `vibe serve`** (#537)
- [ ] **SIMD codegen 本番化** — selfhost codegen の 0xFD prefix emit + `simd_skip_ws` / `simd_scan_alnum` 組込
- [ ] **#59 WASM-GC selfbuild 小型配布形** — P4 compile E2E 達成 (966KB valid, #538)。P4.5 run E2E + self-compile fixpoint も達成。残: P5 DCE + wasm-opt。サイズ目標は初回リリース後に現実的な値を再設定（旧 ~350KB 目標は撤回）
- [x] **pkfire / pkspec 全面導入** — `justfile` を完全削除し `pkfire/Taskfile.pkl` (238 tasks) が canonical。複雑な多行レシピは `scripts/pkfire/*.sh` に抽出。CI は `pkf run` 経由 + `~/.cache/pkfire` を `actions/cache` でキャッシュ。`pkspec/{VibeSpec,VibeTest}.pkl` で `pkspec check` 通る、PR 用 informational gate あり。次は (a) `pkf affected --since=origin/main 'test:*'` を CI の PR 高速化パスに組み込む (b) `pkspec exec` で `moon test` を pkspec 経由で回す

### 🔵 リファクタ / 長期

- [ ] `vibe/types/` / `vibe/parser/` 分離
- [ ] `lib/@vibe/compiler` 論理分割
- [ ] MoonBit host CLI を bootstrap 専用へ縮退
- [ ] selfhost perf gap cutover 水準まで（素材: `claude/chunk-compile-experiment` ブランチに hash-bucket lookup / sorted index / O(n) string dedup 等 23 commits、#295）。wasmtime AOT runtime は `runtime/moonrun_wasmtime` で実装済、bench-selfhost-perf-wasmtime task で 5 cases 平均 compile ratio 5.7 → 1.2（~5× 改善）。残課題は algorithmic な hash-bucket / dedup 系
- [ ] MoonBit host 重複削減（similarity-mbt 抽出、§[MoonBit host 重複削減](#moonbit-host-重複削減-similarity-mbt-ベース)）

### ⚪ upstream / infra 待ち

- なし（#293/#294 は 2026-04-19 に再現せずクローズ）

### 既知ギャップ（issue として追跡中）

- ~~`just test-wasm-heavy` の wasm_opt / wasm_runtime に 17 fail~~（#356 → PR #357 + #358 で 129/129 ✅）
- **selfhost checker parity 6 件（#364）** — `selfhost-bootstrap-gate`（PR #362）が surface した pre-existing failure。`lib/@vibe/compiler/checker_parity_advanced_test.vibe` で 37/43。host CLI では通る src を selfhost checker が reject (struct destructuring let / is expression / let else / trait impl / struct field type mismatch / derive unknown)。informational gate なので blocker ではないが、selfhost compiler の feature gap として要修正。
- ~~derive(Eq) enum with payload の deep 比較~~（#341 で実装済）

## 0.2.0 roadmap: wasm-gc main backend gate (2026-03-27)

- [x] `just test-wasm-gc-mainlane-e2e` を green にする
  - この acceptance suite を通せたら `wasm-gc` を main backend 候補として扱う
  - 現在の gate: closure capture / returned closure call / `for-in` runtime / string runtime
  - 実体: `src/tests/vibe_wasm_gc_mainlane_e2e_test.mbt`
- [x] 上記 gate を通した変更で `--wasm` の既定を `wasm-gc` に切り替える
  - `--wasm` → `WasmGc`, 旧 linear は `--wasm-linear` で利用可能
- [x] gate 緑化後に `just test` / CI shard へ組み込み、experimental 扱いを解除する

## 0.1.0 release sign-off (2026-03-24)

単一 `.wasm` artifact で build/check/compile/run の主要導線が通る状態までは来ている。
直近の Main lane は実装追加より release sign-off の確定が中心。

### 実装単純化 (2026-03-24)

- [x] effect surface を `TyFn/CtFn + with {Name}` に寄せ、named effect を canonical 表現にする
- [x] `module_graph/path` helper を共通化し、loader/runtime/selfhost entry の path 解決重複を削除
- [x] loader の `_build/debug_*` / manifest helper debug 書き込みを撤去
- [x] `special_manifest_header_deps` を撤去し、manifest 依存は実ソース header から組み立てる
- [x] persistent module header / type env codec を shared helper に統一
- [x] `index.vibe` の probe / `cli_cache` 重複 export を削減し、cache helper 経由へ寄せる
- [x] probe export は `selfhost_cli_probe_entry` に分離し、0.1.0 canonical entry は直接実行可能な `selfhost_cli_support.vibe` とする

### 直近の完了

- [x] `test-selfhost-bootstrap`
- [x] `test-selfhost-wasi-selfbuild-kpi`
- [x] `test-selfhost-cli-core`
- [x] `test-selfhost-cli-component-preview2`
- [x] `test-selfhost-cli-preview2-package`
- [x] `test-selfhost-cli-command-component`
- [x] `test-selfhost-cli-command-parity`
- [x] `test-selfhost-cli-direct-component`
- [x] `test-selfhost-cli-direct-parity`
- [x] `test-selfhost-check-preview2-package`
- [x] `test-selfhost-check-command-component`
- [x] `test-selfhost-check-command-parity`
- [x] `test-selfhost-check-direct-component`
- [x] `test-selfhost-check-direct-parity`
- [x] `test-selfhost-cutover`
- [x] `test-golden-wat`
- [x] `just ci-contract-moon`
- [x] `just ci-contract-native`
- [x] `.github/workflows/ci.yml` の `selfhost-gates` を `just release-selfhost-gates` 基準に揃える
- [x] component/direct selfhost gate 用の CI 前提 (`Rust + wasm32 + wasm-tools + wac`) を明示する

### 残タスク

- [x] `0.1.0` までの進め方をこの順で固定する
  - [x] `build-selfhost-dist` の raw selfhost wasm validation failure を直し、strict cold-host 条件で再確認する (#17)
  - [x] GitHub Actions 上で bootstrap shard の最終ログを固定する (#16, 2026-04-04 closed)
  - [x] `Error` surface を `Result::Ok/Err` に寄せる整理を仕様・stdlib・diagnostics まで確定する (#275, 2026-04-09 commit `719c176`)
  - [x] `main` の required checks / ruleset を release 前に有効化する (#120)
- [x] 実使用ベースの `0.1.0` usability sign-off を 1 周通す
  - `docs/archive/report/0-1-0-usability-signoff.md`
  - [x] `vibe shell`
  - [x] `vibe check`
  - [x] `vibe run`
  - [x] `vibe build`
  - [x] stale `index.lock` recovery / migration の扱いを決める
  - [x] selfhost dist sample compile/run
- [x] GitHub Actions 上で `just ci-selfhost-gates-shard bootstrap` を通し、selfhost bootstrap の最終ログを固定（#16）
- [x] `just release-check` を最新 HEAD で通す
  - local `release-check` は 0.1.0 supported surface に絞る
  - broad compiled package sweep は `just test-vibe-package-suite` へ分離
  - heavy `wasm_opt` / `wasm_runtime` suite は `just test-wasm-heavy` に残し、release gate からは外す
- [x] `build-selfhost-dist` を latest HEAD で cold build し、sample compile/run を再確認
  - raw selfhost wasm validation failure は修正済み
  - strict な cold-host 条件（既存 host CLI / dist artifact 非依存）でも再確認済み
- [x] `0.1.0` の supported surface を文書化して freeze
  - `docs/adr.md` (ADR-0033)
  - linear/WASM selfhost dist を正式対象
  - GC backend は experimental
  - advanced effect/WIT mapping は experimental
- [x] selfhost check parity の host `Abort trap: 6` を原因特定して潰す
  - 2026-04-08 時点で release host / stage1 selfhost checker の exit status は parity cases 11 件で一致
  - 次は `bench/golden/selfhost_check_parity_snapshot.json` と allowlist を現状へ追従させる
  - `scripts/test_selfhost_check_parity.sh`
- [x] `Error` surface を `Result::Ok/Err` に寄せる 0.1.0 前整理方針を確定し、syntax / diagnostics / stdlib migration を揃える (#275, 2026-04-09 完了)
  - 結論: public library API は `Result[T, E]` canonical / `throw` + `handle with Error` は boundary 用 / `?` は現行の Error rethrow sugar のまま freeze
  - 反映先: `vibe/json/`, `docs/{cheatsheet,language-tour,vibe,spec/decisions}.md`, `src/checker/typecheck_errors.mbt` (resume / partial handle hint 追加)

### 0.1.0 gate 外に出した broad package sweep

- [ ] `just test-vibe-package-suite` の compiled-only parity を戻す（2026-04-19 計測: 59 files / 424 tests fail）
  - runtime/effect 系 unsupported:
    `vibe/path`, `vibe/io`, `vibe/fs`, `vibe/time`, `vibe/process`,
    `vibe/shell`, `vibe/x/rlm`, `vibe/socket`
  - 旧来 listed regressions は **全て pass**（`examples/string_add_test.vibe`, `vibe/json/test_json_import.vibe`, `vibe/json/jsonrpc_test.vibe`, `vibe/x/url_test.vibe`）
  - 新たに表面化した主要 failure カテゴリ:
    - **examples/effects 系**: lambda body への effect annotation 伝播抜け（"effect requirements not satisfied: throw" + 既に `with { Error }` 宣言済みでも fail）
    - **examples/syntax**: 0/59 — surface 移行で全失効
    - **examples/cheatsheet_*_test**: 全失効。docs ↔ examples 同期切れ
    - **examples/{enum,record,struct,generic,pattern_match,module_advanced}_test**: 0/N — 仕様変更追従漏れ

## ビルドパイプライン

### 既知の制約

- funcref table の cross-module 共有は未実装（HOF inline で回避済み）
- wasmtime `--preload` 自体は library module に WASI instance を提供できない
  linked debug build では preload-unsafe な dep を自動 inline して回避済み

### 残タスク

- [x] cross-module string concat の修正
- [x] `vibe build --debug` を selfhost compiler で使えるようにする（後述）
- [x] prelude を core module として事前コンパイル（builtin 関数の分離が必要）
- [x] typecheck のインクリメンタル化（import surface query + ripple verifier 修正）

## Selfhost compiler の debug build 対応

`lib/@vibe/compiler/` で linked debug build が動作するようになった (2026-03-20)。
ReExport チェーン解決、linked import alias re-export、func_import_count 修正済み。

### 既知のバグ

- [x] **WASI dep inline + linked import の codegen 不整合** —
  effect op import index の再計算が linked import 数を差し引いておらず、
  inline された `perform Fs::*` が別 library 関数に誤着地していた。
  linked build の effect import base を修正して解消。

- [x] **wasmtime --preload が WASI import を解決できない** —
  preload-unsafe (`Fs`/`Env`/WASI import 持ち) dep を library 化せず inline することで
  selfhost compiler の linked debug build は通るようになった。
  cached fast path は cached linked imports だけで再構成できない場合があるため、
  そのときは full compile にフォールバックする。

### 残タスク

- [x] Phase 1: transitive import 対応 (ReExport チェーン解決) — MoonBit host
- [x] Phase 2: prelude 分離（builtin でない関数のみ library 化）
- [x] Phase 3: HOF 選択的 inline
- [x] Phase 4: selfhost codegen の linked build 対応（下記）
- [x] WASI dep の inline codegen バグ修正
- [x] wasmtime preload の WASI 解決

### Phase 4: selfhost codegen の linked build 対応

selfhost compiler (`lib/@vibe/compiler/`) の codegen は monolithic のみ。
linked debug build を selfhost でも生成するには以下の移植が必要:

- [x] linked import の wasm import セクション生成 (`codegen/wasi/index.vibe`)
- [x] linked import の call 命令: fn_names/fn_indices 登録で resolve_func 対応
- [x] library mode: `library_mode=true` で全ユーザー関数 export
- [x] linked bundler: `compile_file_wasi_linked` (dep 分離 + linked imports)
- [x] library コンパイル: `compile_file_wasi_library` (dep を library .wasm に)
- [x] ReExport チェーン解決 (`resolve_reexport_chain` — 型定義 inline + 関数 linked import)
- [x] linked import alias 伝搬 (`let x = linked_fn` の capture/last 使用でも関数値化)
- [x] linked import alias の re-export (ExportLet + Ident → import re-export)
- [x] selfhost CLI で `build --debug` コマンド統合

目標: cached `vibe run lib/@vibe/compiler/index.vibe` を ~100ms に。

## Selfhost CLI parity

- [x] `selfhost_cli_command_component`
  command-shaped component の gate は復旧済み。
  parity は same-instance adapter ではなく preview2 export を fresh invoke する経路で確認する。
  `scripts/test_selfhost_cli_command_parity.sh` は `no-dce` の代表ケースだけを残して runtime を抑える。

- [x] `selfhost_cli_direct_component`
  `Fs.Exists` import leak と closure payload decode/byte handling を修正済み。
  `scripts/test_selfhost_cli_direct_component.sh` と
  `scripts/test_selfhost_cli_direct_parity.sh` の両方が pass。

## Selfhost check parity

- [x] `selfhost_check_preview2_package`
  check surface の preview2 package は復旧済み。

- [x] `selfhost_check_command_component`
  command-shaped check component と parity gate は pass。

- [x] `selfhost_check_direct_component`
  direct filesystem check component と parity gate は pass。

## CI 最適化

### CI プロファイル (2026-03-20)

9 並列ジョブ、wall time ~14min。

| ジョブ | 時間 | ステータス |
|--------|------|-----------|
| test (moon test + build parity + linked debug) | ~3min | 全 pass |
| wasm-compile-e2e (pattern match + WASM E2E) | ~14min | 全 pass (律速) |
| selfhost-gates (bootstrap, cutover, perf KPI) | ~4min | 全 pass |
| wasm-codegen-quick (probe, WAT, HTTP gates) | ~4min | 全 pass |
| 他5ジョブ | ~1-2min each | 全 pass |

### 完了

- [x] CI で wasm-codegen-integrity を3並列ジョブに分割 (16min → 14min)
- [x] `test-build-parity` を CI に追加
- [x] `test-fixtures-isolation` を CI に追加
- [x] `test-linked-debug-build` を CI に追加

### 残タスク

- [x] wasm-compile-e2e の高速化（3-shard 並列化で ~5min に短縮）
- [x] selfhost dist validation 修正（`build_selfhost_dist.sh` の sample compile/run が通る）
- [x] P3: minify_zlib 個別対策 (#13) — テスト有効化、CI ジョブ追加

## selfhost accumulator 撲滅 (O(N²) → O(N))

Tracking issue: **#366**.

`claude/benchmark-self-hosted-Pt9Y3` で実施した survey 結果。selfhost
compiler の hot path に残る `String::concat(out, ...)` /
`Array::concat(out, [x])` の累積パターンを順次 in-place push (or
StringBuilder/ArrayBuilder) に置換する。

**Microbench で確認済の効果範囲** (`bench/bench_string_builder_vs_concat.vibe`,
`bench/bench_array_concat_vs_push.vibe`):

| op | N | concat | push/SB | speedup |
| --- | --- | --- | --- | --- |
| String concat → SB | 64 | 24.2 μs | 1.7 μs | 14.5× |
| String concat → SB | 256 | 151 μs | 5.6 μs | 27.2× |
| Array concat → push | 32 | 72 μs | 1.5 μs | 49× |
| Array concat → push | 128 | 363 μs | 1.9 μs | 192× |
| Array concat → push | 512 | 3,391 μs | 3.1 μs | **1095×** |

### 着手済 (このブランチ)

- [x] `lib/@vibe/compiler/cache/persistent_cache.vibe :: bytes_to_hex` — StringBuilder 化 (#TBD `7a67c39`)
- [x] `lib/@vibe/compiler/loader/{manifest_sources,index}.vibe :: join_header_values` — StringBuilder 化
- [x] `lib/@vibe/compiler/coverage_selfhost_suite_lib.vibe :: join_str` — StringBuilder 化
- [x] `lib/@vibe/compiler/codegen/common_base/index.vibe :: resolve_local 診断ビルダー` — StringBuilder 化
- [x] `lib/@vibe/compiler/monoify.vibe :: collect_call_sites_*` — out-param walker 化 (10 sites; #TBD `0f843b8`)
- [x] `lib/@vibe/compiler/runtime/eval_loader/index.vibe :: collect_exports` — push 化 (5 sites)
- [x] `lib/@vibe/compiler/runtime/index.vibe :: upsert_source_cache` / `add_dep` / `db_grouped_merged_source` — push 化 (4 sites)

### 着手済 (続き)

- [x] `lib/@vibe/compiler/runtime/typecheck_fs.vibe` — recursive `Array::concat(acc, [x])` 4 sites → `Array::push` 化
- [x] `lib/@vibe/compiler/runtime/index.vibe` — recursive `resolve_nested` の dep_acc / stack を `Array::push` + `Array::truncate` 化
- [x] `vibe/parser/parser.vibe` — `parse_trait_stmt` の super-traits 累積を `Array::push` 化（残る `pipe_desugar` の単発 prepend はループ累積ではないため対象外）
- [x] `vibe/x/diff/diff.vibe` — backtrace を `ops_rev` push + in-place reverse 化

### 未着手 (要設計)

- [ ] `lib/@vibe/compiler/entry/source_compile/wasi_only/linked_helpers.vibe` — `contains_name` 線形走査 3 sites (要パターン精査: 線形 contains は selfhost runtime では Map[String, Bool] にしても改善しないので、別アプローチ要)
- [ ] `lib/@vibe/compiler/entry/source_compile/wasi_only/linked_artifacts.vibe` — `contains_path` 線形走査 2 sites (同上)

### 一旦スキップ (理由付き)

- `lib/@vibe/compiler/checker_warning.vibe` (5 sites)、`checker_capture.vibe` (2 sites)、`core/dce.vibe` (2 sites): `if !contains(out, n) { Array::push(out, n) }` 系の dedup。`Map[String, Bool]` set に置換しても、selfhost runtime の `Map::has_key` 自体が線形走査なので効果ゼロ。host CLI 側 (MoonBit) では効くが、selfhost wasm では効かない (vibe runtime の Map が hash table になるまで保留)。詳細は `bench/selfhost_perf/README.md` 参照
- `vibe/json/jsonrpc.vibe` などの `Map::has_key` + `Map::get` パターン (Tier B、~10 sites): 同上の理由でスキップ

### 関連

- `bench/selfhost_perf/README.md` — survey と microbench 結果の詳細
- TODO #295 (selfhost perf gap cutover) — このアキュムレータ最適化はその一部

## カバレッジ

目標: branch coverage 70%

- [x] checker/parser/printer/lexer/builtins の全 variant カバー (全 Expr/Stmt/Pat/Type variant が全パスで処理済み)
- [ ] normalize/DCE/loader のテスト拡充
- [ ] CI にカバレッジ gate を組み込み

## Effect System

- [x] 関数呼び出しを跨ぐ perform の handler dispatch — インタプリタ完了
- [x] 関数呼び出しを跨ぐ perform の handler dispatch — インタプリタ + WASM compiled 両方で動作
- [x] throw(x) → Perform("Error", "Throw", [x]) desugar
- [x] suberror の throw を Error effect 経由に統一
- [x] Net → fine-grained capability effects (Http, Socket 個別化、Net は super-effect)
- [x] WASI P3: effect → WIT マッピング、vibe serve コマンド (#537)

## lib/@vibex/wasm ツールチェーン

- [x] wasm_opt: directize, call forwarding, signature pruning (remove_unused_types で実装済み)
- [x] wasm_runtime: テスト拡充 (64→81テスト、i64 ops + type conv + control flow)
- [x] wat_encoder: S 式完全対応（f32/f64, table/elem, br_table, call_indirect, float tokenizer）
- [ ] SIMD codegen: v128 命令の emit + lexer intrinsic 化
  - [x] SIMD scan primitives 実験 (skip_ws 7.7x, scan_ident 18x, find_byte 6.3x, memcmp 4.2x)
  - [ ] selfhost codegen に 0xFD prefix SIMD 命令 emit を追加
  - [ ] simd_skip_ws / simd_scan_alnum を builtin 化

## 言語仕様の整合性

- [x] function type / effect 表現の AST 統一 (Raise→Perform 統一で解消)
- [x] method syntax の仕様固定 (expr.field = property access, expr.method() = error, Type::method() = static call)
- [x] 演算子型規則の checker/evaluator 一致
- [x] 文字列補間を typed AST 化 (Expr::StringInterp)

## MoonBit host 重複削減 (similarity-mbt ベース)

2026-04-17 に `nix develop -c similarity-mbt src/` で計測（326 files）。
閾値 0.98 で pairs 14,392。ただし `parser/syntax_kind.mbt` 7626 / `codegen/wasm_codegen_emit.mbt` 3677 / `codegen/wasm_gc_codegen.mbt` 1506 / `flatbuffers_generated.mbt` 636 は「各 token/opcode の同形 3 行 boilerplate」「自動生成コード」が主因で構造上の偽陽性。

ノイズを除いた中規模ファイル (5–100 pairs) が現実的な refactor 候補:

- [x] `src/runtime/store.mbt` — `get_by_addr` / `get_alias` / `pure_cache_get` / `pure_cache_set` / `get_module` は未使用 helper だったので削除（`Runtime::get` は公開 API で残存）
- [x] `src/backend/http_wasm.mbt` vs `src/backend/http_js.mbt` (30 pairs each) — 2 つの target-specific stub を `src/backend/http_stub.mbt` (multi-target) に統合（`exec_stub.mbt` と同パターン）
- [x] `src/benches/advanced_graph_bench.mbt` — parse 6 本を `decode_graph_or_abort[T]` に集約、`bench_graph_watch_realtime_save_rolling_{cbor,flexbuffer}` を `rolling_impl(encode, decode)` で共通化
- [x] `src/codegen/wasm_codegen_rc.mbt` — `emit_rc_init_impl(emit_size closure)` に共通化、`emit_rc_call_or_inline_i64(emit_inline closure)` で dup/drop の分岐を抽出
- [x] `src/cmd/vibe/cli_repl.mbt` — `repl_vibe_view_json` / `repl_vibe_peek_json` は `repl_vibe_symbol_lookup_json` に集約、`repl_is_*` は `Array::contains` へ、`compiled_repl_temp_{source,wasm}_path` は共通 `compiled_repl_temp_path(ext)` 経由
- [x] `src/cmd/vibe/cli_test_cmd.mbt` — `sort_test_entry_paths_for_batching` / `sort_test_entry_batch_units` を `test_entry_selection_sort[T]` 共通 helper に統合
- [ ] `src/runtime/db.mbt` — `set_source` / `set_binary_source` (99%) の共通化（String/Bytes の差をどう吸収するか要検討）。`set_version_ref` / `set_symbol_ref` / `set_path_ref` は `set_ref` 共通 helper 経由に移行済み
- [x] `src/runtime_compile/ir_sexp.mbt` — `sort_map_fields_expr` / `sort_record_fields_expr` / `sort_type_ctors` / `sort_record_type_keys` を `sort_by_key[T]` に統合
- [x] 計測を CI に載せる — `similarity-mbt-report` job を informational として追加（閾値 0.98、sim-report.txt を artifact、`ci-informational` 集約経由）

## モジュール分離

- [x] ルート制約の緩和（兄弟ディレクトリ import 許可）
- [ ] `vibe/types/`, `vibe/parser/` の分離

## Self-Host Compiler

- [ ] MoonBit host CLI を bootstrap 専用へ縮退
- [ ] selfhost perf gap を cutover 水準まで詰める
- [ ] GC backend セルフコンパイルで小型配布形 (#59) — サイズ目標は初回リリース後に現実的な値を再設定（旧 ~350KB は撤回）
  - [x] **P0: Enum/Variant codegen** — per-variant struct `[i32 tag, payload...]`, ref.test + ref.cast pattern match
  - [x] **P1: Bytes mutable ops** — struct `(len, cap, data)` wrapper, 12 ops (new/push/set/get/append/blit/fill/slice/concat/from_array/to_array/length)
  - [x] **P2: Record/Struct pattern** — Pat::Struct or-pattern with Pat::Record, Tuple binding
  - [x] **P3: String ops** — 9 ops (index_of/last_index_of/contains/starts_with/ends_with/trim/replace/split/join)
  - [x] **B1: Bitwise ops** — __bit_and/or/xor/not/lshift/rshift (i64 instructions)
  - [x] **B2: Array ops** — Array::length/get/set/push/slice/concat, ArrayBuilder::new/push/freeze (#64 修正済)
  - [x] **B3: Type conversions** — Int::to_string, Bool::to_string, __to_string, Int::to_double, Double::to_int, String::from_char_code, Double::to_i64_bits
  - [x] **B4: Func return type** — enum_ctor_names を free-var filter に追加, let rec pre-bind
  - [x] **B5: Type coercion** — if kind mismatch → gc_common_kind, unknown Named type → EqRef fallback
  - [x] **B6: Effect system** — throw/handle の GC codegen、非 Error perform は trap fallback
  - [x] **B7: let rec closure self-ref** — lifted fctx に closure_call_types 伝搬 + call name capture + Assign tracking + let rec free-var bind-before-scan
  - [x] **B8: MapBuilder** — Map::new/set/freeze/get/has_key/keys の GC 表現
  - [x] **B9: Pipe operator** — `|>` は parser でデシュガー済み、GC codegen 追加不要
  - [x] **B10: Additional codegen** — StringInterp, TupleIndex, Break/Continue, LetPat, IndexAssign, __rshift/__lshift/__set_index, string pattern, Array::truncate, for-in EqRef fallback
  - [x] **B11: Function-as-value** — top-level 関数の closure wrapper (ref.func + env)、function alias (let f = g) 解決
  - [x] **B12: Module-level globals** — Int/Bool 定数は immutable global、Call/String/Array 等は mutable EqRef global + run body で global.set
  - [x] **B13: Polymorphic Option** — builtin Some/None enum 登録、polymorphic Some with EqRef boxing、nested Ctor pattern bind
  - [x] **B14: HOF parameters** — Type::Func パラメータの closure_call_types 登録、Named 型 alias の generic closure call fallback
  - [x] **P4: selfhost compile E2E** — **達成 (2026-07, #538)**: probe 10/10 pass +
    **full bundle (コンパイラ全体) が gc backend でコンパイル成功・wasm-tools validate 通過
    (966KB、linear stage2 2.57MB 比 -62%)**。`pkf run test-gc-selfbuild` が常設計測。
    (旧 260/263 集計は退役 host のもので無効。) 達成に入れた修正:
    gc_ctor_table rename (#722 root cause) / linear string-ops ボディ再利用 (9 ops + eq) /
    StringBuilder・FixedArray・print/assert 系 call-site / Map eq placeholder 修正 + Map::set /
    nested ctor pattern の再帰 test+bind (+tuple bind offset 修正) / module-level 定数+計算 global /
    tuple index `.0` / EMap・ELabeledArg / Fs・Env・Profiler host imports (group-gated, index shift hbo) /
    perform → canonical builtin lowering / resolve 済み call の env 引数 (user-shadowed builtin 対応) /
    ref cell の linear-memory 化 (mut-capture closure) / Error handle の try_table + throw tag (#721 gating)
  - [x] **P4.5: run E2E + self-compile fixpoint** — **達成 (2026-07, #538)**: gc-compiled compiler が
    実プログラムをコンパイルし (出力は linear コンパイラと byte 一致)、さらに**コンパイラ全体を
    self-compile して linear 版と byte 一致の出力を再現** (~5s)。達成に入れた修正:
    `==`/`!=` の eq builtin 経由化 + tuple/ctor 構造比較 (emit_gc_eq_value) / for-in 内包表記の
    値収集 (旧実装は値を drop) / `__to_string` の実行時 string-vs-int dispatch (interp が全 `\{x}` を
    ここに通す; user 定義 __to_string の shadow も解決) / Array::truncate no-op stub 除去 /
    float 演算の f64 化 (shape-based floatish 追跡) / gc pipeline に trait-dict desugar +
    interp 展開 + generic strip を接続 / entry・__heap_ptr export。
    `pkf run test-gc-selfbuild` が probe / bundle / run E2E / self-compile fixpoint を常設計測。
  - [ ] **P5: DCE + wasm-opt** — baseline 確保: raw 966KB (-62% vs linear)。縮小手段は
    `core/dce.vibe` を gc path に適用 + `lib/@vibe/optimizer` post-pass
    (compiler への直接結合は +700KB & seed 不能 — docs/wasm-opt-dogfood.md)。
    数値目標は置かない（初回リリース後に現実的な値を設定）。
    メモ: wasm_opt の FS-linked compile は linear lane の FixedArray::make 未解決で現状ブロック
- [ ] `lib/@vibe/compiler` の論理分割
  - [x] `loader/index.vibe` の manifest traversal を shared helper に寄せ、source list/source groups の二重 BFS を削減する

## Interpreter 廃止

- [x] `vibe run` / `vibe test` の既定 backend を compiled に寄せる
- [x] interpreter backend を `VIBE_ENABLE_INTERPRETER=1` の明示 opt-in にする
- [x] `bench` の interpreter backend / fallback も `VIBE_ENABLE_INTERPRETER=1` 前提に寄せる
- [x] one-shot CLI でも `run/test` の wasm cache を使って compiled 固定費を減らす
- [x] `bench` の generated wasm も content-addressed cache で再利用する
- [x] compiled test 失敗時の詳細取得を per-case compiled fallback に寄せる
- [x] internal `session-json` worker で同一 process の `check/test` cache 再利用口を作る
- [x] `run/check/test` は localhost session worker を既定利用し、`VIBE_USE_SESSION_HTTP=0` で無効化できるようにする
- [x] 長寿命 process で incremental compile cache を常用化
- [x] interpreter の public CLI surface を撤去
  - [x] `run/test` の自動 interpreter fallback を撤去する
  - [x] `bench` の自動 interpreter fallback を撤去する
  - [x] fallback 互換 env の参照を削除する
  - [x] `run/test` の明示 interpreter backend も削除する
  - [x] `bench --backend interpreter` を削除する
  - [x] `bench` の legacy expr mode (`--expr`, `--case`, `--cases`) を削除する
- [x] compiled parity が揃ったので evaluator / interpreter 実装を削除
  - [x] `wasm-shell-stdin` で scalar let / late import / bool 行が stateful に動く
  - [x] 関数値 `let` 束縛は placeholder 表示に degrade して shell を継続する
  - [x] String 値は compiled REPL の repr transport で表示する
  - [x] Array / Map など composite 値の表示 transport を追加する
  - [x] 通常の `vibe shell` / `shell-stdin` を compiled session backend に切り替える
  - [x] `shell --ai` / `shell --tui` の evaluator 依存を整理する
  - [x] `cli_repl_js` の evaluator 依存を廃止する
  - [x] public CLI の `--syntax posix-*` shell 導線を閉じる
  - [x] `eval` command を public CLI から外す
  - [x] active runtime surface / docs から `Runtime::eval_script_with_mode` 記述を外す
  - [x] host / selfhost evaluator 実装と専用 test を削除する
  - [x] 不要になった selfhost fixture smoke test を削除する
    - [x] `lib/@vibe/compiler/fixture_selfhost_test.vibe`
    - [x] `lib/@vibe/compiler/fixture_selfhost_roundtrip_test.vibe`
    - [x] `lib/@vibe/compiler/fixture_parse_test_support.vibe`
  - [x] 不要になった interpreter/evaluator 専用 test を棚卸しして段階削除する
    - [x] `src/runtime/eval_effects_wbtest.mbt` を削除し、compiled shell / scratch-db 側の coverage に寄せる
    - [x] `src/tests/vibe_wasm_eval_test.mbt` の interpreter parity 前提を外し、WASM decode / effect capture の mainline test に寄せる
    - [x] `lib/@vibe/compiler/eval_*` の fixed-string smoke / wrapper test は削除済みで、fixture/mainline test 側へ整理した
    - [x] `test-selfhost-cache-probe` は standalone probe のまま維持し、release gate から外して運用する
    - [x] `lib/@vibe/compiler/fixture_*_test_support.vibe` の export 面は `parse_ok` / `roundtrip_ok` / `parse_fixture_spec` に絞り、fixture test を集約した
    - [x] host / selfhost で重複していた evaluator smoke test は削除済みで、compiled mainline test (`src/tests/vibe_wasm_eval_test.mbt` / CLI scratch-db coverage) へ統合した
    - [x] coverage / bootstrap gate は compiled-only 前提に揃え、古い interpreter backend 前提を除去した

## Release 運用メモ

- [x] local の `just release-selfhost-gates` は bootstrap を外し、日常の sign-off を軽く保つ
- [x] local の `just release-selfhost-gates` は selfbuild KPI も外し、bootstrap lane は CI と明示 target に閉じる
- [ ] selfhost bootstrap (`test-selfhost-bootstrap`) と selfbuild KPI (`test-selfhost-wasi-selfbuild-kpi`) は CI shard 専用 gate として運用する

## ユーザビリティ改善

- [x] 軽量 struct リテラル sugar `Type { ... }`
- [x] `String` を `for-in` 対象にする
- [x] トレイトにメソッドシグネチャを許可 (trait Name { method(Type) -> Type })
- [x] `?` 演算子 (expr? → handle { expr } with Error { Throw(e) => throw(e) })
