# Phase 29y (future, post self-host / docs-first): MIR lifecycle vocab freeze（RC/weak/ABI）

Status: Ready (P0 complete - docs-first SSOT finalized)
Scope: self-host 後に "脱Rustランタイム（NyRT/.hako）" を進める前提で、MIR の lifecycle/RC/weak を **どこまで語彙として固定**し、どこからを **runtime ABI（NyRT）**に委譲するかを SSOT 化する。

## Entry

- 相談パケット（SSOT）: `docs/development/current/main/investigations/phase-29y-mir-lifecycle-vocab-consult.md`
- ~~次の指示書（P0, docs-only）~~ ✅ 完了: `docs/development/current/main/phases/phase-29y/P0-DOCS-FINALIZE-INSTRUCTIONS.md`

## Non-goals (Phase 29y ではやらない)

- MIR 命令語彙の大改造（所有モデルを型に埋め込む等）
- self-host 前の NyRT の .hako 化（実装は別フェーズ）
- GC/finalizer の新規実装（境界の明文化まで）

## Deliverables (最大 3 つに切る)

Phase 29y を “締める” 条件は実装ではなく、次フェーズへ切れること。

1. **ABI SSOT**: NyRT ABI（最小セット）+ 関数 ABI（args borrowed / return owned など）を docs に固定
2. **RC insertion SSOT**: retain/release/weak_drop の発火点を “1箇所” に寄せる設計（Frag 前後）を docs に固定
3. **Observability SSOT**: hidden root を追える観測点（root面の定義、診断API、smokeは exit code SSOT）を docs に固定

Docs（Phase 29y 内の SSOT - ✅ P0 complete, all Ready）:
- ABI SSOT: `docs/development/current/main/phases/phase-29y/10-ABI-SSOT.md` ✅ Ready
- RC insertion SSOT: `docs/development/current/main/phases/phase-29y/20-RC-INSERTION-SSOT.md` ✅ Ready
- Observability SSOT: `docs/development/current/main/phases/phase-29y/30-OBSERVABILITY-SSOT.md` ✅ Ready

## Implementation Pilot (Phase 29y.1)

Phase 29y は docs-first が主目的だが、後続の実装フェーズへ迷わず切るために “最小の導線” を先に用意する。

- Task 1: NyRT handle ABI shim（lifecycle）
  - `crates/nyash_kernel/src/ffi/lifecycle.rs`
  - `crates/nyash_kernel/src/ffi/mod.rs`
  - `crates/nyash_kernel/src/lib.rs`
  - fixture: `apps/tests/phase29y_handle_abi.hako`
  - smokes: `tools/smokes/v2/profiles/integration/apps/phase29y_handle_abi_{vm,llvm}.sh`
- Task 2: RC insertion pass 入口（skeleton, no-op）
  - `src/mir/passes/rc_insertion.rs`
  - `src/mir/passes/mod.rs`
  - `src/mir/mod.rs`（compiler pipeline に接続）
- Task 3: Observability MVP（root categories: handles のみ）
  - `src/runtime/leak_tracker.rs`
  - Phase 1 limitation を明示（locals/temps/heap_fields/singletons は exit-time では未可視）

## Current Recommendation (consultation summary)

- **実体**: RC の値と Alive/Dead/Freed 判定は runtime（NyRT）に置く
- **発火点**: retain/release/weak_drop は分散せず、CFG確定後の “1回だけ” の挿入パスで SSOT 化
- **関数ABI**: args borrowed / return owned（borrowed を保存/返す場合のみ retain）
- **weak identity**: alloc_id + generation token を SSOT 化（ログも token 表示）

## Next Steps（実装フェーズへ切るための最小タスク）

Phase 29y は docs-first を完了し、次フェーズ（Phase 29x/29z など）へ迷わず移れる状態になった。

以下の実装タスク（最大3つ）を次フェーズで進める:

1. **RC insertion pass の最小動作化**
   - 現状: `src/mir/passes/rc_insertion.rs` は no-op skeleton
   - 次: 保持・解放の1ケースだけを実装（上書き時の release のみ）
   - 目的: CFG確定後の挿入点を実証し、SSOT（20-RC-INSERTION-SSOT.md）の妥当性を検証

2. **ABI borrowed/owned conformance smoke 追加**
   - 現状: `phase29y_handle_abi_{vm,llvm}.sh` は最小ケース（1 fixture のみ）
   - 次: borrowed args / owned return の conformance を1本追加
   - 目的: 関数ABI契約（10-ABI-SSOT.md §3）を実際の smoke で固定

3. **Observability root categories 拡張**
   - 現状: `leak_tracker.rs` は handles のみ可視（Phase 1 limitation）
   - 次: locals または temps のいずれか1つを root summary に追加
   - 目的: root面カテゴリ（30-OBSERVABILITY-SSOT.md §1）の観測実装を1段進める

**受け入れ基準**:
- quick 154/154 PASS 維持
- integration smokes の phase29y_* が green 維持
- 恒常ログ増加なし

**Next Phase 候補**: Phase 29z（RC insertion minimal）または Phase 29x（De-Rust runtime）

## Related

- lifecycle semantics SSOT: `docs/reference/language/lifecycle.md`
- Phase 285（weak conformance / hidden root 根治）: `docs/development/current/main/phases/phase-285/README.md`
