docs(lifecycle): Phase 285 P0 - Box lifecycle/weakref/GC SSOT 固定

## 言語 SSOT との境界明文化
- lifecycle/weak/fini: lifecycle.md
- null/void/truthiness: types.md
- Phase 285 は実装状況・差分追跡のみ(言語SSOT書き換えなし)

## 用語・禁止事項固定
- Roots/Strong/Weak/Finalizer/GC 定義
- 禁止: finalizer 再入・例外・allocation・silent fallback

## VM/LLVM 差分分類
- (A) 仕様通り: weak/weak_to_strong/leak report
- (B) 未実装: finalizer/GC cycle collection

## P1/P2 導線
- P1: 棚卸し対象ファイル一覧(value.rs, finalization.rs等)
- P2: smoke 候補(weak_basic, weak_to_strong_fail, leak_report)

quick smoke 154/154 PASS

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-26 10:51:17 +09:00
parent 03f9bbe1aa
commit 5ec0056059
2 changed files with 92 additions and 9 deletions

View File

@ -1,8 +1,13 @@
# Self Current Task — Now (main)
## Current Focus: Phase 285 P0 (docs-only)
## Current Focus: Phase 285 P1/P2 / Phase 287 計画
Box lifecycle / weakref / finalization / GC の “実装が仕様” を止めるため、まず docs-only で SSOT と差分運用VM/LLVMを固定する
Phase 284 P2 + Phase 285 P0 完了。次は Phase 285 P1棚卸しまたは Phase 287Normalizer Hygiene
**2025-12-26: Phase 285 P0 完了**
- 言語 SSOT との境界明文化lifecycle.md, types.md
- 用語・禁止事項・VM/LLVM差分分類を固定
- P1/P2 への導線を箇条書きで追加
**2025-12-26: Phase 284 P2 完了**
- return を含む loopPattern5を VM で smoke 固定

View File

@ -1,6 +1,13 @@
# Phase 285: Box lifecycle / weakref / finalization / GC conformance
Status: In progress (A1 series implemented; LLVM sub-phases ongoing)
Status: P0 COMPLETE (2025-12-26); A1 series + LLVM sub-phases implemented
## Next (P0 docs-only → P1/P2)
- P0 手順書: `docs/development/current/main/phases/phase-285/P0-INSTRUCTIONS.md`
- 言語レベルSSOT:
- lifecycle/weak/fini/GC: `docs/reference/language/lifecycle.md`
- `null`/`void`/truthiness: `docs/reference/language/types.md`
## LLVM Sub-Phases Status
@ -80,7 +87,57 @@ See `docs/development/current/main/phases/phase-285/phase-285a1-boxification.md`
- **Roots**: 解放/GC から保護される参照集合stack/local/global/handle/plugin
- **Finalizer**: 解放に伴う最終化処理(もし存在するなら)
## P0 decisions (docs-only)
## P0 decisions (docs-only) ✅ COMPLETE (2025-12-26)
### 言語 SSOT との境界
| 関心事 | SSOT | Phase 285 での扱い |
|--------|------|-------------------|
| Lifecycle/weak/fini | `docs/reference/language/lifecycle.md` | 実装状況・差分追跡のみ |
| null/void/truthiness | `docs/reference/language/types.md` | 実装状況・差分追跡のみ |
| VM/LLVM 差分 | このファイル | 「未対応/既知バグ/保留」として分類 |
**原則**: Phase 285 は言語 SSOT を書き換えない。実装の棚卸しと差分追跡を行う。
### 用語(固定)
| 用語 | 定義 |
|------|------|
| **Roots** | 解放/GC から保護される参照集合stack/local/global/handle/plugin |
| **Strong reference** | 所有参照(`Arc` 等で Box を保持、解放を遅延) |
| **Weak reference** | 非所有参照(`Weak` / `weak_to_strong()` が失敗しうる) |
| **Weak-to-strong** | weak → strong の昇格(成功/失敗が意味論、失敗時は `null` |
| **Finalizer (`fini`)** | 解放に伴う論理的終了処理(物理解放とは別) |
| **Collection (GC)** | 到達不能オブジェクトの回収(意味論ではなく補助) |
### 禁止事項
| 禁止事項 | 理由 |
|----------|------|
| Finalizer 内での再入 | デッドロック/無限再帰のリスク |
| Finalizer 内での例外送出 | 終了処理の信頼性を損なう |
| Finalizer 内での allocation | GC サイクル中の新規割当は危険 |
| Silent fallback黙殺 | 未対応は `Err` または理由付き SKIP で固定 |
| 新しい環境変数トグル | 既存の診断導線の範囲で対応 |
### VM/LLVM 差分分類
| 機能 | VM (Rust) | LLVM harness | 分類 |
|------|-----------|--------------|------|
| `weak <expr>` | ✅ 実装済み | ✅ 実装済み | (A) 仕様通り |
| `weak_to_strong()` | ✅ 実装済み | ✅ 実装済み | (A) 仕様通り |
| Weak field contract | ✅ 実装済み | ✅ 実装済み | (A) 仕様通り |
| Finalizer (`fini`) | ⚠️ 未実装 | ⚠️ 未実装 | (B) 未実装 |
| GC (cycle collection) | ⚠️ RC のみ | ⚠️ RC のみ | (B) 未実装 |
| Exit-time leak report | ✅ 診断あり | ✅ 診断あり | (A) 仕様通り |
**分類凡例**:
- (A) 仕様通り: VM/LLVM 両方で動作
- (B) 未実装: 言語仕様にあるが実装されていない
- (C) 既知バグ: 実装はあるが動作が仕様と異なる
- (D) 仕様外: 禁止されている
### Core decisions
- Weak の観測は `weak_to_strong()` で行い、失敗値は `null`= runtime `Void` の別名)。
- `cleanup`Stage3 block-postfixが「出口で必ず走る」決定的 cleanup を保証する(`catch` の有無に関係なく、常に実行)。
@ -112,14 +169,35 @@ If any of the following are missing, treat weak smokes as **unsupported** and sc
### P1investigation
- Rust VM の現状実装の棚卸し(どこで roots が形成され、どこで解放/最終化されるか)
- LLVM harness の現状調査(弱参照/GC が無い場合は差分として記録)
**目的**: Rust VM の現状実装の棚卸し(どこで roots が形成され、どこで解放/最終化されるか)
**棚卸し対象ファイル**:
| ファイル | 観測ポイント |
|----------|-------------|
| `src/value.rs` | `NyashValue::WeakBox` 生成箇所、`weak_to_strong()` 失敗時の観測方法 |
| `src/finalization.rs` | finalizer 存在確認、登録・呼び出しタイミング・順序 |
| `src/box_trait.rs` | Box の所有モデルArc/Weak の境界、roots の形成点)|
| `src/scope_tracker.rs` | Box の登録/スコープ管理 |
**LLVM harness 調査**:
- `src/llvm_py/` で weakref/finalizer の相当機能を確認
- 無いなら「無い」を明文化し、smoke を SKIP にする
### P2smoke
- weakref の最小 fixture/smoke を作り、挙動を固定する
- VM: stdout/exit code で固定
- LLVM: 未対応なら “スキップ理由” を smoke で明示
**目的**: weakref の最小 fixture/smoke を作り、挙動を固定する
**smoke 候補2-3本**:
| smoke | 内容 | 期待値 |
|-------|------|--------|
| `phase285_weak_basic_vm.sh` | 既存 weak basic smoke | PASS既に存在|
| `phase285_weak_to_strong_fail_vm.sh` | weak_to_strong 失敗観測 | PASSnull 確認)|
| `phase285_leak_report_vm.sh` | exit-time leak report | PASS既に存在|
**LLVM 扱い**:
- VM と同一動作: PASS
- 未対応: 理由付き SKIP`test_skip "reason"`
- silent fallback 禁止
## Non-goals