docs: shrink now/backlog/current_task entrypoints
This commit is contained in:
226
CURRENT_TASK.md
226
CURRENT_TASK.md
@ -5,228 +5,4 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu
|
||||
|
||||
- Now: `docs/development/current/main/10-Now.md`
|
||||
- Backlog: `docs/development/current/main/30-Backlog.md`
|
||||
|
||||
---
|
||||
|
||||
## Handoff (current)
|
||||
|
||||
### 状況(SSOT)
|
||||
|
||||
**JoinIR 回帰 SSOT**
|
||||
`./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` が唯一の integration gate。phase143_* は対象外(legacy pack で隔離)。phase286_pattern9_* は legacy pack (SKIP) で運用。
|
||||
|
||||
**CorePlan migration 道筋 SSOT**
|
||||
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
|
||||
|
||||
**Next implementation (Phase 29ao P32)**
|
||||
- 目的: Pattern2 real-world strict/dev shadow adopt
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md`
|
||||
- After P32: TBD
|
||||
|
||||
**2025-12-30: Phase 29ao P31 COMPLETE (shadow adopt routing SSOT)**
|
||||
shadow adopt の判定/Fail-Fast/タグを composer 側に集約し、router を薄くした(仕様不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P30 COMPLETE (Shadow adopt composer SSOT)**
|
||||
Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退した(挙動不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)**
|
||||
Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P27 COMPLETE (Pattern6 subset strict/dev adopt from facts)**
|
||||
Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P28 COMPLETE (Shadow adopt observability tags + gate smokes)**
|
||||
strict/dev shadow adopt が実際に踏まれていることを安定タグと回帰スモークで検証できるようにした(仕様不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P29 COMPLETE (Shadow adopt tag coverage)**
|
||||
regression gate に含まれる全パターンで shadow adopt のタグを必須化した(仕様不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P26 COMPLETE (Pattern2 subset strict/dev adopt from facts)**
|
||||
Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P24 COMPLETE (Pattern7 strict/dev adopt from facts)**
|
||||
Pattern7(SplitScan)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P23 COMPLETE (Pattern3 strict/dev adopt from facts)**
|
||||
Pattern3(If‑Phi)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P22 COMPLETE (Pattern1 CoreLoop dedup)**
|
||||
Pattern1 の CoreLoop 構築を SSOT で 1 箇所に統一し、DomainPlan/Facts の二重化を解消した。
|
||||
|
||||
**2025-12-30: Phase 29ao P21 COMPLETE (Pattern1 subset step-only gate)**
|
||||
Pattern1 subset を body=step のみに引き締め、strict/dev shadow adopt の誤マッチを遮断した。
|
||||
|
||||
**2025-12-30: Phase 29ao P20 COMPLETE (CoreLoop ExitMap composition SSOT)**
|
||||
CoreLoop の ExitMap/Cleanup/ValueJoin 合成規約を SSOT 化し、合成境界と Fail-Fast ルールを固定した(docs-only)。
|
||||
|
||||
**2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)**
|
||||
CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。
|
||||
|
||||
**2025-12-30: Phase 29ao P12 COMPLETE (Pattern7 SplitScan step join via block_params)**
|
||||
Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の step PHI を撤去した。
|
||||
|
||||
**2025-12-30: Phase 29ao P18 COMPLETE (single_planner outcome plumbing)**
|
||||
single_planner が planner outcome を返す SSOT に寄せ、router の二重 planner 実行を撤去した。
|
||||
|
||||
**2025-12-30: Phase 29ao P17 COMPLETE (Pattern1 strict/dev shadow adopt)**
|
||||
strict/dev のみ Facts→CorePlan(skeleton) を採用し、既定経路は維持した。
|
||||
|
||||
**2025-12-30: Phase 29ao P14 COMPLETE (Pattern2 Break exit join via block_params)**
|
||||
Pattern2 Break の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の after PHI を撤去した。
|
||||
|
||||
**2025-12-30: Phase 29ao P16 COMPLETE (Pattern5 Break exit join via block_params)**
|
||||
Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の exit PHI を撤去した。
|
||||
|
||||
**2025-12-29: Phase 29am P1 COMPLETE (CoreLoopPlan.body Seq flatten)**
|
||||
CoreLoopPlan.body の `Seq([Effect...])` を再帰で flatten して emit できるようにした(Effect-only制約は維持)。
|
||||
|
||||
**2025-12-29: Phase 29am P2 COMPLETE (Verifier: Loop.body Effect-only)**
|
||||
Loop.body に If/Exit/Loop が混入したら PlanVerifier で fail-fast([V12])。Seq-of-effects は許可。
|
||||
|
||||
**2025-12-29: Phase 29am P3 COMPLETE (Exit alignment: “Exit is last” rule)**
|
||||
CorePlan 内の Exit の乱用を抑制し、Frag/ExitMap と整合する表現へ寄せた([V11])。
|
||||
|
||||
**PlanRuleOrder SSOT**
|
||||
single_planner の順序/名前 SSOT は `src/mir/builder/control_flow/plan/single_planner/rule_order.rs` に固定。PlannerContext で Pattern1 facts の抑制を開始し、残りの guard/filter は段階移行。
|
||||
|
||||
**2025-12-29: Phase 29aj P6 COMPLETE (JoinIR regression gate SSOT)**
|
||||
JoinIR 回帰の integration gate を phase29ae pack に固定し、phase143_* を legacy pack で隔離。
|
||||
|
||||
**2025-12-29: Phase 29aj P7 COMPLETE (Pattern8 planner-first)**
|
||||
Pattern8 BoolPredicateScan の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29ak P0 COMPLETE (PlanRuleOrder + PlannerContext plumbing)**
|
||||
PlanRuleOrder を SSOT 化し、PlannerContext を配線(未使用)。single_planner の手書きテーブルを撤去。
|
||||
|
||||
**2025-12-29: Phase 29ak P1 COMPLETE (Pattern1 facts guard via planner)**
|
||||
Pattern1 以外のループで pattern1_simplewhile facts 抽出を抑制。single_planner 側の guard は安全策として維持。
|
||||
|
||||
**2025-12-29: Phase 29ak P2 COMPLETE (Pattern8 static box filter via planner)**
|
||||
static box では Pattern8 facts 抽出を抑制。single_planner 側の filter は安全策として維持。
|
||||
|
||||
**2025-12-29: Phase 29ak P3 COMPLETE (remove Pattern8 filter in single_planner)**
|
||||
Pattern8 static box filter を single_planner から撤去し、planner/facts 側 SSOT に一本化。
|
||||
|
||||
**2025-12-29: Phase 29ak P4 COMPLETE (remove Pattern1 guard in single_planner)**
|
||||
Pattern1 guard を single_planner から撤去し、planner/facts 側 SSOT と fallback 抑制に統一。
|
||||
|
||||
**2025-12-29: Phase 29ak P5 COMPLETE (planner candidate ctx gate)**
|
||||
Pattern1/8 の候補抑制を planner 側に集約し、single_planner の Pattern1 抑制を撤去。
|
||||
|
||||
**2025-12-29: Phase 29al P0 COMPLETE (Skeleton/Feature model SSOT, docs-only)**
|
||||
CorePlan を骨格→特徴→合成で説明する SSOT を追加し、Freeze taxonomy に unstructured を追加。
|
||||
|
||||
**2025-12-29: Phase 29al P1 COMPLETE (post-phi final form SSOT, docs-only)**
|
||||
join 値(PHI相当)の最終表現(layout/mapping/pred分類/verify)を 1 枚 SSOT として固定。
|
||||
|
||||
**2025-12-29: Phase 29al P2 COMPLETE (effect classification SSOT, docs-only)**
|
||||
effect 分類(Pure/Mut/Io/Control)と “許される変形” の最小法典を SSOT 化。
|
||||
|
||||
**2025-12-29: Phase 29al P3 COMPLETE (exitkind/cleanup/effect contract SSOT, docs-only)**
|
||||
cleanup を ExitKind 語彙として扱い、Control/Io を跨いだ移動や DCE 消去の事故を防ぐ境界を SSOT 化。
|
||||
|
||||
**2025-12-29: Phase 29aj P10 COMPLETE (single_planner unified shape)**
|
||||
single_planner を全パターンで planner-first → extractor フォールバックの共通形に統一(挙動不変)。
|
||||
|
||||
**2025-12-29: Phase 29aj P9 COMPLETE (phase286 pattern9 legacy isolation)**
|
||||
phase286_pattern9_frag_poc を legacy pack (SKIP) に隔離し、JoinIR 回帰 SSOT を phase29ae pack に固定。
|
||||
|
||||
**2025-12-29: Phase 29aj P8 COMPLETE (Pattern9 planner-first)**
|
||||
Pattern9 AccumConstLoop の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29ai P15 COMPLETE (Pattern2 promotion hint observe)**
|
||||
strict/dev 時のみ `[plan/pattern2/promotion_hint:{TrimSeg|DigitPos}]` を観測できるようにし、次は promotion hint の Plan/Frag 吸収残作業(P16候補)。
|
||||
|
||||
**2025-12-29: Phase 29aj P0 COMPLETE (PlannerOutcome observability SSOT)**
|
||||
planner outcome(facts+plan)を SSOT 化し、single_planner の観測が planner facts のみに依存するように統一。
|
||||
|
||||
**2025-12-29: Phase 29aj P1 COMPLETE (Remove legacy_rules)**
|
||||
single_planner の legacy_rules を撤去し、Pattern1/3/4/5/8/9 の抽出を plan/extractors に統一。
|
||||
|
||||
**2025-12-29: Phase 29aj P2 COMPLETE (Pattern1 planner-first)**
|
||||
chosen_rule を撤去し、Pattern1 SimpleWhile の Facts→Planner-first を導入(仕様不変)。
|
||||
|
||||
**2025-12-29: Phase 29aj P3 COMPLETE (Pattern3 planner-first)**
|
||||
Pattern3 If-Phi の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29aj P4 COMPLETE (Pattern4 planner-first)**
|
||||
Pattern4 Continue の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29aj P5 COMPLETE (Pattern5 planner-first)**
|
||||
Pattern5 Infinite Early Exit の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-27: Phase 188.3 / Phase 287 P2 COMPLETE (Pattern6 nested loop: merge/latch fixes)**
|
||||
Pattern6(1-level nested loop)の JoinIR→bridge→merge 経路で発生していた `undefined ValueId` と `vm step budget exceeded`(無限ループ)を解消。`apps/tests/phase1883_nested_minimal.hako` が RC=9 を返し、quick 154 PASS を維持。
|
||||
|
||||
- SSOT(mergeの契約):
|
||||
- latch_incoming を記録してよいのは `TailCallKind::BackEdge` のみ(LoopEntry は上書き禁止)
|
||||
- entry-like 判定は “JoinIR MAIN のみ” を対象にする(block-id 推測はしない): `src/mir/builder/control_flow/joinir/merge/contract_checks/entry_like_policy.rs`
|
||||
- latch 二重設定は `debug_assert!` で fail-fast(回帰検知)
|
||||
- 変更箇所:
|
||||
- `src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs`
|
||||
- `src/mir/builder/control_flow/joinir/merge/loop_header_phi_info.rs`
|
||||
- 検証(DONE):
|
||||
- [x] 再現とPHI確認(Pattern6)
|
||||
- [x] latch記録条件を修正(BackEdgeのみ)
|
||||
- [x] デバッグ出力を撤去(恒常出力なし)
|
||||
- [x] quick/fixtureで検証(quick 154 PASS / fixture RC=9)
|
||||
- [x] docsを締めて次の指示書を用意(refactor挟み込み用)
|
||||
|
||||
**2025-12-26: Phase 286 P2.2 COMPLETE (Hygiene: extractor重複排除 + router小整理)**
|
||||
Pattern1/Pattern4 の Plan/Frag PoC 完了後、extractor の `extract_loop_increment_plan` を `common_helpers.rs` に統一、router の 3行パターン(normalize→verify→lower)を `lower_via_plan()` ヘルパーで共通化。~65行削減、quick 154 PASS 維持。
|
||||
|
||||
**2025-12-26: Phase 286 P2.3 COMPLETE (Pattern9 AccumConstLoop Plan化 PoC)**
|
||||
Pattern9 (AccumConstLoop) を Plan/Frag SSOT に移行完了。PHI 2本(loop_var, acc_var)、const/var 両方 OK。Pattern9 は Pattern1 より先にチェック(より具体的なパターン)。quick 154 PASS 維持。
|
||||
|
||||
- 現行の入口: `docs/development/current/main/10-Now.md`
|
||||
- Phase 286 詳細: `docs/development/current/main/phases/phase-286/README.md`
|
||||
- 次の候補: `docs/development/current/main/30-Backlog.md`
|
||||
- Design goal: `docs/development/current/main/design/join-explicit-cfg-construction.md`
|
||||
|
||||
### 直近の道筋(JoinIR / Normalized)
|
||||
|
||||
### 設計方針メモ(SSOT候補)
|
||||
|
||||
- ExprLowererBox(式SSOT)
|
||||
- 役割: `AST(expr)` → `(prelude: Vec<Inst>, value: ValueId)`(ANF含む)
|
||||
- pure/impure/whitelist/strict の契約を集約(入口SSOT)
|
||||
- ConditionLowererBox(条件→分岐SSOT)
|
||||
- 役割: `AST(cond)` → `BranchPlan`(短絡なら分岐語彙で組む)
|
||||
- 評価順は ExprLowererBox に委譲(ANFで順序固定)
|
||||
- `&&/||` は制御として扱い、式で無理しない
|
||||
- ControlLowererBox(制御SSOT)
|
||||
- 役割: `StepNode/ControlTree` → JoinIR(継続 + env)
|
||||
- `if/loop` はここ、条件の中身は ConditionLowererBox に委譲
|
||||
|
||||
- Phase 139: if-only `post_k` の return lowering を `ReturnValueLowererBox` に統一(DONE)
|
||||
- `docs/development/current/main/phases/phase-139/README.md`
|
||||
- Phase 140: `NormalizedExprLowererBox` 初版(pure expression のみ)(DONE)
|
||||
- SSOT: `docs/development/current/main/design/normalized-expr-lowering.md`
|
||||
- `docs/development/current/main/phases/phase-140/README.md`
|
||||
- Phase 141 P0: impure 拡張点(contract)を SSOT 化(Call/MethodCall はまだ out-of-scope)(DONE)
|
||||
- `docs/development/current/main/phases/phase-141/README.md`
|
||||
- Phase 141 P1: “既知 intrinsic だけ” を許可して段階投入(DONE)
|
||||
- `docs/development/current/main/phases/phase-141/README.md`
|
||||
- Phase 141 P1.5: known intrinsic registry + available_inputs 3-source merge + diagnostics(DONE)
|
||||
- `docs/development/current/main/phases/phase-141/README.md`
|
||||
- Phase 142-loopstmt P0: 正規化単位を statement(loop 1個)へ寄せる(DONE)
|
||||
- `docs/development/current/main/phases/phase-142-loopstmt/README.md`
|
||||
- Phase 142-loopstmt P1: LLVM EXE smoke(同 fixture)を追加(DONE)
|
||||
- `docs/development/current/main/phases/phase-142-loopstmt/README.md`
|
||||
- Phase 141 P2+: Call/MethodCall(effects + typing)を分離して段階投入
|
||||
- Historical context: `docs/development/current/main/investigations/joinir-generalization-study.md`
|
||||
- Phase 143-loopvocab P0/P1: loop 内 if/break/continue の語彙追加(DONE)
|
||||
- `docs/development/current/main/phases/phase-143-loopvocab/README.md`
|
||||
- Phase 143-loopvocab P2: else 対称化(B-C / C-B)(DONE)
|
||||
- `docs/development/current/main/phases/phase-143-loopvocab/README.md`
|
||||
- Phase 145-anf P0/P1/P2: ANF(impure hoist + 再帰的線形化)(DONE)
|
||||
- `docs/development/current/main/phases/phase-145-anf/README.md`
|
||||
- Phase 146(in progress): Loop/If 条件式へ ANF を横展開(順序固定と診断)
|
||||
- `docs/development/current/main/phases/phase-146/README.md`
|
||||
|
||||
## Resolved (historical)
|
||||
|
||||
### WSL EXDEV / cargo build failure (resolved)
|
||||
|
||||
- 2025-12-18: `Invalid cross-device link (os error 18)` により `cargo build` が失敗する事象があったが、`wsl --shutdown` 再起動後に復旧。
|
||||
- 再発時のワークアラウンド: `tools/build_llvm.sh` は EXDEV を避けるため `TMPDIR` を `target/...` 配下へ寄せる。
|
||||
- Archive(過去ログ): `docs/development/current/main/phases/phase-29ao/CURRENT_TASK-archive.md`
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,442 +1,18 @@
|
||||
# Self Current Task — Backlog (main)
|
||||
|
||||
Status: Active
|
||||
Scope: 「次にやる候補」を短く列挙するメモ。現状は `docs/development/current/main/10-Now.md` を入口にする。
|
||||
Related:
|
||||
- `docs/development/current/main/10-Now.md`
|
||||
- `docs/development/current/main/DOCS_LAYOUT.md`
|
||||
Scope: 「次にやる候補」を短く列挙するメモ。入口は `docs/development/current/main/10-Now.md`。
|
||||
|
||||
## 直近(JoinIR/selfhost)
|
||||
## Active
|
||||
|
||||
- **Phase 29an(✅ COMPLETE): Skeleton/Feature Facts(SSOT)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29an/README.md`
|
||||
- 状況: P0–P14 ✅ 完了 / P15 closeout ✅
|
||||
- Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`(Next: P32)
|
||||
|
||||
- **Phase 29ao(active): CorePlan composition from Skeleton/Feature**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
- 状況: P0–P31 ✅ 完了 / Next: P32(Pattern2 real-world strict/dev shadow adopt)
|
||||
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md`
|
||||
## Near-Term Candidates
|
||||
|
||||
- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT**
|
||||
- 入口: `docs/development/current/main/phases/phase-29af/README.md`
|
||||
- JoinIR regression gate SSOT: `docs/development/current/main/phases/phase-29ae/README.md`
|
||||
- CorePlan hardening (docs-first): `docs/development/current/main/phases/phase-29al/README.md`
|
||||
- CorePlan lowerer/verifier: `docs/development/current/main/phases/phase-29am/README.md`
|
||||
|
||||
- **Phase 29ag(✅ COMPLETE): JoinIR merge SSOT unification**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ag/README.md`
|
||||
## Archive
|
||||
|
||||
- **Phase 29ah(✅ COMPLETE): JoinIR regression pack expansion(real-world coverage)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ah/README.md`
|
||||
|
||||
- **Phase 29aj(candidate): PlannerOutcome observability SSOT**
|
||||
- 入口: `docs/development/current/main/phases/phase-29aj/README.md`
|
||||
- 状況: P0/P1/P2/P3/P4/P5/P6/P7/P8/P9/P10 ✅ 完了
|
||||
- Next: Phase 29aj P11(TBD)
|
||||
- 運用: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ)
|
||||
- 運用: phase286_pattern9_* は legacy pack (SKIP) を使う
|
||||
|
||||
- **Phase 29ak(candidate): PlanRuleOrder SSOT + PlannerContext plumbing**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ak/README.md`
|
||||
- 状況: P0/P1/P2/P3/P4/P5 ✅ 完了
|
||||
- Next: None(phase-29al へ)
|
||||
|
||||
- **Phase 29al(candidate): CorePlan composition hardening (docs-first)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29al/README.md`
|
||||
- 状況: P0/P1/P2/P3 ✅ 完了(docs-only)
|
||||
- Next: P4(unwind を含む ExitKind 拡張: design only)
|
||||
- 道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
|
||||
- **Phase 29am(✅ COMPLETE): CorePlan Step-A implementation (lowerer/verifier)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29am/README.md`
|
||||
- 状況: P0/P1/P2/P3 ✅ 完了
|
||||
- Next: Phase 29an
|
||||
- Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
- **Phase 29ai(candidate): Plan/Frag single-planner(Facts SSOT)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ai/README.md`
|
||||
- Next: Phase 29ai P16(TBD: promotion hint を JoinIR 側の orchestrator へ配線、挙動不変)
|
||||
|
||||
- **Phase 29ae P1(✅ COMPLETE): JoinIR Regression Pack (SSOT固定)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ae/README.md`
|
||||
|
||||
- **Phase 29ad(✅ COMPLETE): Naming SSOT for Pattern6/7 fixtures**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ad/README.md`
|
||||
|
||||
- **Phase 29ac(✅ COMPLETE): De-freeze Pattern6/7**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ac/README.md`
|
||||
|
||||
- **Phase 29ab(✅ COMPLETE): JoinIR completion triage**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ab/README.md`
|
||||
|
||||
- **Phase 288(✅ P0–P3 + 288.1 complete): REPL mode**
|
||||
- 入口: `docs/development/current/main/phases/phase-288/README.md`
|
||||
- SSOT: `docs/reference/language/repl.md`
|
||||
- 次: Phase 288.2+(任意): REPL UX improvements(history / multiline / load 等)
|
||||
|
||||
- **Phase 287(✅ COMPLETE): Developer Hygiene(意味論不変)**
|
||||
- 状況: P0–P9 ✅ 完了(big files / facade / SSOT / docs guard / closeout)
|
||||
- 成果: merge/mod.rs (1,555→1,053行), ast_feature_extractor (1,148→135行), plan.rs (741→120行)
|
||||
- 入口: `docs/development/current/main/phases/phase-287/README.md`
|
||||
|
||||
- **Phase 284(✅ COMPLETE): Return as ExitKind SSOT(patternに散らさない)**
|
||||
- 目的: `return` を “pattern最適化の個別実装” にせず、`ExitKind` と `compose::*` / `emit_frag()` に収束させる
|
||||
- ねらい: 移行期間中の「二重ルール」「検出の穴」を減らし、将来の pattern 増殖を防ぐ
|
||||
- 入口: `docs/development/current/main/phases/phase-284/README.md`
|
||||
- P0(docs-only): `docs/development/current/main/phases/phase-284/P0-INSTRUCTIONS.md`
|
||||
- SSOT:
|
||||
- Composition: `src/mir/builder/control_flow/edgecfg/api/compose/mod.rs`
|
||||
- Terminator emission: `emit_frag()`(`src/mir/builder/control_flow/edgecfg/api/emit.rs`)
|
||||
- Frag docs: `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
- 進め方:
|
||||
- P0(docs-only)で “return の意味” と “Ok(None)/Err” の境界を固定
|
||||
- P1+ で Rust/LLVM の実装を SSOT に収束(pattern側に例外実装を増やさない)
|
||||
|
||||
- **Phase 285(✅ COMPLETE): Box lifecycle / weakref / finalization / GC SSOT**
|
||||
- 目的: Box の生存期間(強参照/弱参照/解放/最終化)を SSOT として固定し、「実装が仕様」になっている箇所を潰す
|
||||
- ねらい:
|
||||
- VM 側の weakref/finalization を仕様化(テストで固定)
|
||||
- LLVM harness 側の未対応/差分を “仕様として明文化” し、将来の実装計画を切る
|
||||
- 入口: `docs/development/current/main/phases/phase-285/README.md`
|
||||
- 状況(完了):
|
||||
- P0/P1/P2 ✅ 完了(weak 成功パターンは smoke 固定)
|
||||
- P2.1 ✅ 完了: hidden root を根治し、weak-fail smoke を PASS に復帰
|
||||
- P2.2 ✅ 完了: KeepAlive の二重責務を命令分離で解消(`KeepAlive`/`ReleaseStrong`)
|
||||
- P3.1/P3.2 ✅ 完了: LLVM 検出 + quick SSOT(`--features llvm` でも quick の意味が変わらない)
|
||||
- P4 ✅ 完了: `phase285_weak_basic_llvm` を PASS に復帰(quick 154/154)
|
||||
- 参考(現状の入口候補):
|
||||
- weakref 表現: `src/value.rs`(`NyashValue::WeakBox`)
|
||||
- finalization: `src/finalization.rs`
|
||||
- 追加(syntax cleanup, small & focused):
|
||||
- `weak` の表面構文を `weak <expr>` に収束(`weak(<expr>)` を持ち込まない)
|
||||
- `let weak w;` / `let weak w = e` の糖衣を検討(概念を増やさず `let w = weak e` にデシュガー)
|
||||
- fixture/smoke は `apps/tests/*.hako` を SSOT にして VM/LLVM で共通化(必要なら LLVM 側は SKIP で理由を固定)
|
||||
|
||||
- **Phase 29y(✅ P0 COMPLETE, docs-first SSOT finalized): MIR lifecycle vocab freeze(RC/weak/ABI)**
|
||||
- 状況: P0 ✅ 完了(docs-first SSOT finalized: ABI/RC insertion/Observability)
|
||||
- 成果: 3つのSSOT文書(10/20/30)Ready、pilot実装固定、Next steps明文化
|
||||
- 入口: `docs/development/current/main/phases/phase-29y/README.md`
|
||||
- 次: Phase 29z(RC insertion minimal)または Phase 29x(De-Rust runtime)候補
|
||||
|
||||
- **Phase 29z(P2 CLOSEOUT準備中, implementation-minimal): RC insertion minimal**
|
||||
- 進捗: P1まで完了(上書き+Store null+Return終端cleanup で ReleaseStrong 挿入、単一block・安全ガード付き)
|
||||
- ガード: Cargo feature `rc-insertion-minimal`(既定OFF、env var 新設なし)
|
||||
- 検証: quick 154/154 PASS 維持 + `rc_insertion_selfcheck`(opt-in)
|
||||
- 残課題(P2で方針化→次フェーズへ)
|
||||
- null伝搬の精度向上(copy以外の伝搬パターン追加を段階的に)
|
||||
- Branch/Jump 終端での cleanup をどう安全に扱うかの設計
|
||||
- PHI/loop/early-exit の安全な cleanup 設計(誤release防止)
|
||||
- 入口: `docs/development/current/main/phases/phase-29z/README.md`
|
||||
- 指示書: `docs/development/current/main/phases/phase-29z/P0-RC_INSERTION_MINIMAL-INSTRUCTIONS.md`
|
||||
|
||||
- **Phase 29aa(✅ COMPLETE): RC insertion safety expansion(CFG-aware)**
|
||||
- 進捗: P2 ✅ 完了(Jump/Branch 終端で cleanup を入れない契約の SSOT 化)
|
||||
- 進捗: P3 ✅ 完了(Jump→Return single-predecessor state 伝播)
|
||||
- 進捗: P4 ✅ 完了(Jump-chain propagation to Return)
|
||||
- 進捗: P5 ✅ 完了(Multi-predecessor Return join: state完全一致のみ)
|
||||
- 進捗: P6 ✅ 完了(Multi-predecessor Return join: intersection)
|
||||
- 進捗: P7 ✅ 完了(Deterministic ReleaseStrong ordering)
|
||||
- 進捗: P8 ✅ 完了(Null propagation across CFG; Copy-only)
|
||||
- 入口: `docs/development/current/main/phases/phase-29aa/README.md`
|
||||
|
||||
- **Phase 29x(planned, post self-host): De-Rust runtime for LLVM execution**
|
||||
- 目的: LLVM 実行経路のランタイム依存を段階的に Rust から切り離す(脱Rust)。
|
||||
- 前提: self-host ラインが安定し、VM/LLVM conformance(Phase 285)が十分に固まっていること。
|
||||
- 方針:
|
||||
- 仕様SSOT(strong/weak/fini/cleanup/void)は維持し、実装だけを差し替え可能にする。
|
||||
- まず ABI 境界(例: `nyrt_*`)を “将来置換する契約” として固定し、独立ランタイムに差し替える。
|
||||
- 受け入れ条件(最小):
|
||||
- 既存の `apps/tests/*.hako` fixture を再利用し、VM/LLVM parity のスモークが維持される。
|
||||
- weak の語彙(`weak <expr>` / `weak_to_strong()`)が同じ意味で動作する(cycleは当面リーク仕様でも可)。
|
||||
|
||||
- **Phase 29y(planned, post self-host / docs-first): MIR lifecycle vocab freeze(RC/weak/ABI)**
|
||||
- 目的: 参照カウント(strong/weak)を “どこで” 実装するか(MIR語彙 vs runtime ABI)を設計SSOT化し、脱Rust実装の土台にする
|
||||
- 前提: self-host 後/Phase 285(weak conformance + hidden root 根治)が落ち着いていること
|
||||
- 入口(phase): `docs/development/current/main/phases/phase-29y/README.md`
|
||||
- 入口(相談パケット): `docs/development/current/main/investigations/phase-29y-mir-lifecycle-vocab-consult.md`
|
||||
- 進捗(pilot, 仕様不変):
|
||||
- docs SSOT(ABI/RC insertion/observability)を phase-29y 配下に集約
|
||||
- Phase 29y.1: “最小導線” の実装だけ先行(意味論は変更しない)
|
||||
- NyRT handle ABI shim(`crates/nyash_kernel/src/ffi/lifecycle.rs`)
|
||||
- RC insertion pass 入口(no-op)
|
||||
- leak report に root categories(handlesのみ)を追加(Phase 1 limitation 明記)
|
||||
|
||||
- **Phase 286(✅ complete): JoinIR Line Absorption(JoinIR→CorePlan/Frag 収束)**
|
||||
- 目的: 移行期間に残っている「2本の lowering(Plan line / JoinIR line)」を、構造で 1 本に収束させる
|
||||
- ねらい: `return/break/continue` のような “大きな出口語彙” の実装場所が揺れない状態にする
|
||||
- 入口: `docs/development/current/main/phases/phase-286/README.md`
|
||||
- P0(docs-only): `docs/development/current/main/phases/phase-286/P0-INSTRUCTIONS.md`
|
||||
- 状況: Pattern1–9 の主要ループ形が Plan/Frag SSOT に吸収され、quick gate は green を維持。
|
||||
- 将来の設計相談(Phase 286 の範囲外で、別フェーズでSSOT化してから): `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md`
|
||||
- SSOT:
|
||||
- Plan/Frag: `compose::*` + `emit_frag()`(Phase 280/281)
|
||||
- JoinIR line 共通入口: `src/mir/builder/control_flow/joinir/patterns/conversion_pipeline.rs`
|
||||
|
||||
- (✅ done)**Phase 282**: Router shrinkage + detection SSOT + extractor refactor
|
||||
- 完了: `docs/development/current/main/phases/phase-282/README.md`
|
||||
|
||||
(✅ done)**Phase 279 P0**: Type propagation pipeline SSOT 統一(lifecycle / JoinIR / LLVM の二重化解消)
|
||||
- 完了: `docs/development/current/main/phases/phase-279/README.md`
|
||||
|
||||
- **Phase 272(✅ complete): Pattern6/7 を Frag+emit_frag へ吸収(段階適用)**
|
||||
- 目的: scan系 loop の CFG 構築を `Frag/ExitKind` 合成へ寄せ、pattern列挙の増殖を止める
|
||||
- 完了: P0.1(Pattern6)✅ + P0.2(Pattern7)✅
|
||||
- 入口: fixture/smoke を SSOT として固定(Pattern6→Pattern7 の順で段階適用)
|
||||
- 詳細: `phases/phase-272/README.md`
|
||||
|
||||
- (✅ done)**Phase 273**: Plan line SSOT(Pattern6/7)
|
||||
- 完了: `docs/development/current/main/phases/phase-273/README.md`
|
||||
|
||||
- (✅ done)**Phase 280**: Frag composition SSOT positioning
|
||||
- 完了: `docs/development/current/main/phases/phase-280/README.md`
|
||||
|
||||
- (✅ done)**Phase 281**: compose adoption(Pattern6/7, P0–P3)
|
||||
- 完了: `docs/development/current/main/phases/phase-281/README.md`
|
||||
|
||||
- (✅ done)**Phase 277/278**: PHI strict + env var 収束
|
||||
- 完了: `docs/development/current/main/phases/phase-277/README.md`
|
||||
- 完了: `docs/development/current/main/phases/phase-278/README.md`
|
||||
|
||||
|
||||
- **Phase 274(active, design-first): Type SSOT Alignment(local + dynamic runtime)**
|
||||
- 入口SSOT: `docs/reference/language/types.md`
|
||||
- P1(✅完了): Rust VM が `TypeOp(Check/Cast)` を実行可能(`is/as` が動く)
|
||||
- P2(✅完了): LLVM ライン(llvmlite harness)の `TypeOp` を SSOT に合わせる
|
||||
- P3(decision): truthiness / equality / compare / `+` の coercion を SSOT として固定(必要なら “仕様変更フェーズ” を追加)
|
||||
- 詳細: `phases/phase-274/README.md`
|
||||
|
||||
- **Phase 270(✅ 完了): JoinIR-only minimal loop SSOT**
|
||||
- `apps/tests/phase270_p0_loop_min_const.hako` + VM smoke で “最小 const loop” を固定(exit=3)
|
||||
- Pattern1 は test-only stub のため不適合 → Pattern9(AccumConstLoop)を橋渡しとして追加
|
||||
- 詳細: `phases/phase-270/README.md`
|
||||
|
||||
- **Phase 271(✅ 完了, docs-only): Bridge pattern 撤去条件SSOT**
|
||||
- 対象: bridge pattern(例: `Pattern9_AccumConstLoop`)
|
||||
- 目的: 「汎用化しない」「Frag 合成へ吸収して削除する」を SSOT 化
|
||||
- 成果物:
|
||||
- `docs/development/current/main/design/edgecfg-fragments.md` の `Bridge patterns(撤去条件SSOT)` に “bridge contract” テンプレを追加
|
||||
- `Pattern9_AccumConstLoop` の撤去条件(fixture/smoke/手順)を同セクションに明文化
|
||||
- SSOT: `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
|
||||
- **Phase 269 P1(✅ 完了): Pattern8 を EdgeCFG で実装(SSA を閉じる)**
|
||||
- 方針: emission 入口で Frag 構築(break/continue 無しなので `compose::loop_()` は使わず手配線)
|
||||
- 完了: header に `i` の PHI を追加して SSA を閉じた(`i_current = phi [i_init, preheader], [i_next, step]`)
|
||||
- early-exit の `return false` は Return wire、`return true` は loop 後 AST に任せる
|
||||
- Pattern8 の返り値は当面 `void`(loop-statement 扱い)
|
||||
- 補足(DONE): static box の `this/me` は MethodCall 共通入口で static call に正規化済み(Pattern8 は現状 static box 文脈を対象外)
|
||||
- 詳細: `phases/phase-269/README.md`
|
||||
|
||||
- **Phase 270+(planned): Pattern6/7 への Frag 適用**
|
||||
- Pattern6: Match scan(index_of 系)
|
||||
- Pattern7: Split scan(split 系)
|
||||
- 統一的なループ処理パターン確立
|
||||
- Pattern 分岐削減
|
||||
|
||||
- **収束方針(SSOT案): Expr/Condition/Control の 3 箱分割**
|
||||
- ExprLowererBox(式SSOT): `AST(expr)` → `(prelude, value)`(ANF含む)。pure/impure/whitelist/strict を集約(入口SSOT)。
|
||||
- ConditionLowererBox(条件→分岐SSOT): `AST(cond)` → `BranchPlan`。評価順は ExprLowererBox に委譲し、`&&/||` は制御語彙で扱う。
|
||||
- ControlLowererBox(制御SSOT): `StepNode/ControlTree` → JoinIR(継続 + env)。`if/loop` を担当し、条件は ConditionLowererBox に委譲。
|
||||
|
||||
- **Phase 141 P2+(planned): Call/MethodCall(effects + typing を分離して段階投入)**
|
||||
- ねらい: pure/impure 境界を壊さずに、impure lowering を段階投入する。
|
||||
- 前提(DONE):
|
||||
- Phase 141 P1.5: known intrinsic allowlist + available_inputs 3-source merge + diagnostics
|
||||
- 受け入れ条件:
|
||||
- out-of-scope は `Ok(None)` でフォールバック(既定挙動不変)
|
||||
- effects の順序付けは SSOT で固定してから解禁(by-name 増殖禁止)
|
||||
|
||||
- **Phase 144-anf(planned): impure 式導入の順序固定(ANF)**
|
||||
- ねらい: `x + f(y)` 等の “pure + impure 混在” で評価順が仕様になる前に、ANF で順序固定を SSOT 化する
|
||||
- 入口: `docs/development/current/main/phases/phase-144-anf/INSTRUCTIONS.md`
|
||||
- 受け入れ条件:
|
||||
- impure を lowering できない場合は `Ok(None)` でフォールバック(既定挙動不変)
|
||||
- dev/strict では「順序固定の欠落」を Fail-Fast(診断に順序ログを含める)
|
||||
|
||||
- **Phase 143-loopvocab R0(planned): Contract SSOT 抽出(refactor P0 → modular components)**
|
||||
- 目的: loop_true_if_break_continue.rs を「検出/契約/変換」に分割し、P1/P2 での if分岐増殖を防ぐ
|
||||
- 実装:
|
||||
- 新ファイル: `src/mir/control_tree/normalized_shadow/common/loop_if_exit_contract.rs`
|
||||
- `enum LoopIfExitThen { Break, Continue }`
|
||||
- `struct LoopIfExitShape { has_else: bool, then: LoopIfExitThen, else_: Option<LoopIfExitThen>, cond_scope: ExprLoweringScope }`
|
||||
- `enum OutOfScopeReason { NotLoopTrue, BodyNotSingleIf, ThenNotExit, ElseNotSupported, CondOutOfScope(...) }`
|
||||
- Refactor: loop_true_if_break_continue.rs は「shape抽出 → lower」だけに縮退(SSOT は contract側)
|
||||
- Tests: unit test を dedicated module へ分離(test maintainability)
|
||||
- 受け入れ条件:
|
||||
- cargo check ✅(no errors)
|
||||
- P1/P2 での if分岐を防ぐ(contract で決定性を保証)
|
||||
- out-of-scope は `Ok(None)` で一貫(既定挙動不変)
|
||||
|
||||
- **Phase 143-loopvocab P1(planned): continue 語彙追加**
|
||||
- 対象: `loop(true) { if(cond_pure) continue }` を same lowering に通す
|
||||
- 実装:
|
||||
- LoopIfExitShape で `LoopIfExitThen::Continue` を許可
|
||||
- JoinModule: if true → loop_step (continue semantics)
|
||||
- Fixtures: `phase143_loop_true_if_continue_min.hako`
|
||||
- Smoke: VM + LLVM EXE
|
||||
- Out-of-scope は `Ok(None)` のまま
|
||||
|
||||
(DONE)Phase 143-loopvocab P2: else 対称化(B-C / C-B)
|
||||
- 記録: `docs/development/current/main/10-Now.md`
|
||||
|
||||
- **Phase 143-loopvocab P3+(planned): impure conditions 対応**
|
||||
- 目的: `if(cond_impure) break/continue` を ANF/順序固定の上で段階投入する
|
||||
- 方針: Phase 145-anf の契約(hoist + left-to-right)を条件式にも適用
|
||||
|
||||
- **Phase 263+(planned): Pattern2 LoopBodyLocal promotion(seg)**
|
||||
- 目的: Stage‑B compile(bundle_resolver系)で露出している Pattern2 `LoopBodyLocal(seg)` を受理し、quick の first FAIL を進める
|
||||
- 受け入れ条件:
|
||||
- 最小再現 fixture + smoke で固定(先に失敗を SSOT 化)
|
||||
- Pattern2 が不成立のときは “部分続行” せず `Ok(None)` で fallback(既定挙動不変)
|
||||
|
||||
- **(DONE)Phase 263 P0.2: Pattern2 PromoteDecision API hardening**
|
||||
- 入口SSOT: `src/mir/builder/control_flow/joinir/patterns/pattern2/api/`
|
||||
- `PromoteDecision::{Promoted, NotApplicable, Freeze}` と `try_promote(...)` に参照点を収束(Option揺れを撤去)
|
||||
|
||||
- **Phase 264(✅ 入口作成完了): EdgeCFG Fragment 入口作成(design-first)**
|
||||
- **ステータス**: ✅ 入口作成完了(適用は次フェーズ)
|
||||
- **実装内容**:
|
||||
- `edgecfg/api/` フォルダに SSOT 入口作成
|
||||
- `ExitKind`, `EdgeStub`, `Frag` の型定義
|
||||
- `seq`, `if_`, `loop_`, `cleanup` のシグネチャ固定(pub(crate))
|
||||
- 最小ユニットテスト 3個
|
||||
- ドキュメント連動(edgecfg-fragments.md)
|
||||
- **制約遵守**:
|
||||
- 既存 pattern6/7/8 未改変
|
||||
- merge/EdgeCFG 未改変
|
||||
- cargo test -p nyash-rust --lib --no-run 成功確認
|
||||
- **次フェーズへの橋渡し**:
|
||||
- Phase 265 で Pattern8 適用時に `compose::loop_` を実装
|
||||
- 再利用確認後、pattern番号分岐を段階的に削減
|
||||
|
||||
- **Phase 265 P0(✅ 完了): compose/verify 最小実装**
|
||||
- **目的**: 入口SSOTの形を固める(迷子防止)
|
||||
- **実装**:
|
||||
- compose::loop_() 最小実装(exit集合分類のみ、配線なし)
|
||||
- verify_frag_invariants() 最小実装(デバッグガード付き)
|
||||
- compose::loop_() ユニットテスト 2個追加
|
||||
- **制約**:
|
||||
- Pattern8 未改変(P0では触らない、偽Frag回避)
|
||||
- 配線ロジックは P1 以降
|
||||
- **次**: Phase 265 P1 で配線ロジック + Pattern8適用
|
||||
|
||||
- **Phase 265 P1(✅ 完了): compose 配線ロジック実装**
|
||||
- **目的**: Frag/ExitKind の配線能力を BasicBlockId 層で証明
|
||||
- **実装**:
|
||||
- EdgeStub.target 追加(Option<BasicBlockId>)
|
||||
- compose::loop_() 配線ロジック(Continue → header, Break → after)
|
||||
- verify_frag_invariants() 配線契約検証
|
||||
- test-only PoC(5個のテスト: 既存2個更新 + 新規3個追加)
|
||||
- **配線契約**:
|
||||
- Continue(loop_id) の EdgeStub.target = Some(header)
|
||||
- Break(loop_id) の EdgeStub.target = Some(after)
|
||||
- Normal/Return/Unwind の EdgeStub.target = None(上位へ伝搬)
|
||||
- **制約**:
|
||||
- MIR 命令生成なし(Frag 層のみ)
|
||||
- NormalizedShadow 未適用(Phase 267 に繰り越し)
|
||||
|
||||
- **(✅ 完了)Phase 265 P2: seq/if_ 実装(wires/exits 分離)**
|
||||
- **目的**: 「解決済み配線(wires)」と「未解決 exit(exits)」を分離し、Frag 合成の基本パターンを完成
|
||||
- **完了内容**:
|
||||
- Frag に `wires: Vec<EdgeStub>` 追加
|
||||
- wires/exits 分離設計確立(exits = target None, wires = target Some)
|
||||
- loop_() を wires 対応に更新
|
||||
- seq(a, b) 実装(a.Normal → wires)
|
||||
- if_(header, cond, t, e, join_frag) 実装(t/e.Normal → wires)
|
||||
- verify 強化(wires/exits 分離契約、警告のみ)
|
||||
- 全テスト PASS(13個: frag 3 + compose 9 + verify 1)
|
||||
- **設計判断**:
|
||||
- wires/exits 分離で再配線バグ防止
|
||||
- if_ は join_frag: Frag で「join 以降」を明確化
|
||||
- verify は警告のみ(Err 化は Phase 266 の strict 版で段階導入)
|
||||
- **次**: Phase 266 で MIR 命令生成 PoC(emit_wires)、Phase 267 で NormalizedShadow/JoinIR へ実適用
|
||||
|
||||
- **(✅ 完了)Phase 266: wires → MIR terminator 生成(最小 PoC)**
|
||||
- **目的**: wires を MIR terminator に変換する最小 PoC を実装し、Phase 267 での本格適用に備える
|
||||
- **完了内容**:
|
||||
- emit.rs 作成(emit_wires 実装 + unit test 4個)
|
||||
- verify_frag_invariants_strict() 追加(段階導入を壊さない)
|
||||
- Jump/Return 対応(Branch は Phase 267)
|
||||
- mod.rs 更新(emit module エクスポート)
|
||||
- 全テスト PASS(1392 passed: 既存 1388 + 新規 4個)
|
||||
- **核心原則**:
|
||||
- from ごとにグループ化して1本だけ許可(1 block = 1 terminator 制約)
|
||||
- Return は target=None を許可(意味を持たない)
|
||||
- verify_frag_invariants() は変更なし(警告のまま、strict 版を別名で用意)
|
||||
- Phase 260 terminator 語彙ルールを厳守
|
||||
- **設計判断**:
|
||||
- from グループ化で terminator 上書きバグ防止
|
||||
- Return は target 不要(呼び出し元に戻る)
|
||||
- verify strict 版で段階導入を壊さない
|
||||
- **次**: Phase 267 で JoinIR Pattern への適用
|
||||
|
||||
- **(✅ P0 完了)Phase 267: BranchStub + emit_frag(Branch の第一級化)**
|
||||
- **目的**: Frag に Branch を第一級で追加し、wires(Jump/Return)と同様に MIR terminator へ落とす入口を作る
|
||||
- **完了内容(P0)**:
|
||||
- `BranchStub` 追加 + `Frag.branches` 追加
|
||||
- `compose::if_` が header→then/else の BranchStub を生成
|
||||
- `emit_frag(function, frag)` を追加(`emit_wires` + `set_branch_with_edge_args`)
|
||||
- 1 block = 1 terminator(wire/branch の衝突)を Fail-Fast
|
||||
- unit tests + `cargo test -p nyash-rust --lib` PASS
|
||||
- **P1(延期)**:
|
||||
- "層を跨がない実適用"は候補が抽象化層へ委譲済みのため、Phase 268 で体系的に適用する方針
|
||||
- **詳細**: `docs/development/current/main/phases/phase-267/README.md`
|
||||
|
||||
- **(✅ 完了)Phase 268: if_form.rs への Frag 適用 + entry edge-args SSOT化**
|
||||
- **目的**: EdgeCFG Fragment を層を跨がずに実戦投入し、compose::if_() の edge-args を SSOT 化
|
||||
- **完了内容(P0)**:
|
||||
- emission/branch.rs に emit_conditional_edgecfg() 追加(薄いラッパー)
|
||||
- if_form.rs を Frag+emit_frag 経由に変更(emit_conditional + emit_jump を削除)
|
||||
- emission 層経由で層が綺麗に保たれる
|
||||
- **完了内容(P1)**:
|
||||
- compose::if_() シグネチャ変更(then_entry_args, else_entry_args 追加)
|
||||
- emission/branch.rs から空 EdgeArgs を渡す
|
||||
- EdgeCFG テスト更新(compose.rs 2箇所、emit.rs 1箇所)
|
||||
- TODO コメント削除完了(Phase 267 P2+ TODO 解消)
|
||||
- **テスト結果**:
|
||||
- cargo build --release: 成功
|
||||
- cargo test --lib --release: 1444/1444 PASS
|
||||
- quick smoke: 45/46 PASS(既存状態維持)
|
||||
- **核心原則**:
|
||||
- emission 層経由で Frag 構築を MirBuilder 層から分離
|
||||
- SSOT 原則: compose::if_() は edge-args を内部生成しない
|
||||
- **次**: Phase 269 で Pattern6/7/8 への Frag 適用 + fixture/smoke test
|
||||
- **詳細**: `docs/development/current/main/phases/phase-268/README.md`
|
||||
|
||||
- **real-app loop regression の横展開(VM + LLVM EXE)**
|
||||
- ねらい: 実コード由来ループを 1 本ずつ最小抽出して fixture/smoke で固定する(段階投入)。
|
||||
- 現状: Phase 107(find_balanced_array/object / json_cur 由来)まで固定済み。
|
||||
- 次候補: JsonLoader/JsonCur から 1 本ずつ(fixture + integration smoke)で増やす。
|
||||
|
||||
- **P5b “完全E2E”**(escape skip の実ループを end-to-end で固定)
|
||||
- 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。
|
||||
- 入口: `docs/development/current/main/phases/phase-94/README.md`
|
||||
|
||||
- **制御の再帰合成(docs-only → dev-only段階投入)**
|
||||
- ねらい: `loop/if` ネストの "構造" を SSOT(ControlTree/StepTree)で表せるようにする
|
||||
- 注意: canonicalizer は観測/構造SSOTまで(ValueId/PHI配線は Normalized 側へ)
|
||||
- 現状: Phase 119–128(if-only Normalized: reads/inputs/unknown-read/partial-assign keep/merge)まで完了
|
||||
- ✅ 完了: Phase 129-C(post-if を post_k continuation で表現)
|
||||
- 入口: `docs/development/current/main/design/control-tree.md`
|
||||
|
||||
## 中期(ループ在庫の残り)
|
||||
|
||||
- **P5(guard-bounded)**: 大型ループを “小粒度” に割ってから取り込む(分割 or 新契約)
|
||||
- **P6(nested loops)**: capability guard で Fail-Fast 維持しつつ、解禁時の契約を先に固定
|
||||
|
||||
## 中期(制御の表現力)
|
||||
|
||||
北極星: `docs/development/current/main/design/join-explicit-cfg-construction.md`
|
||||
設計メモ: `docs/development/current/main/design/exception-cleanup-async.md`
|
||||
|
||||
- **catch/cleanup(Invoke)**
|
||||
- 追加語彙を `Invoke(ok_edge, err_edge)` に絞って例外 edge を明示する(例外値は edge-args で運ぶ)。
|
||||
- 実装タイミング: Phase 260(edge-args terminator 収束)の P1〜P2 以降が推奨。
|
||||
- **cleanup/defer(cleanup normalizer)**
|
||||
- Return/Throw/Break/Continue を cleanup に寄せる “脱出 edge 正規化” を箱化する(finally の後継としての cleanup)。
|
||||
- 実装タイミング: catch/cleanup の次(例外 edge も含めて正規化するため)。
|
||||
- **async/await(state machine lowering)**
|
||||
- CFG語彙に混ぜず、AsyncLowerBox で state machine 化してから MIR に落とす。
|
||||
- 実装タイミング: finally/defer の後(cancel/drop と cleanup の接続を先に固める)。
|
||||
|
||||
## ドキュメント運用
|
||||
|
||||
- 重複が出たら「設計 SSOT(design)」に集約し、Phaseログ(phases)は “何をやったか/検証したか” に限定する
|
||||
- 調査ログ(investigations)は結論を SSOT に反映してから Historical 化する
|
||||
- 旧 backlog(肥大化防止のためアーカイブ): `docs/development/current/main/phases/phase-29ao/30-Backlog-archive.md`
|
||||
|
||||
2233
docs/development/current/main/phases/phase-29ao/10-Now-archive.md
Normal file
2233
docs/development/current/main/phases/phase-29ao/10-Now-archive.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,442 @@
|
||||
# Self Current Task — Backlog (archive)
|
||||
|
||||
Status: Active
|
||||
Scope: 「次にやる候補」を短く列挙するメモ。現状は `docs/development/current/main/10-Now.md` を入口にする。
|
||||
Related:
|
||||
- `docs/development/current/main/10-Now.md`
|
||||
- `docs/development/current/main/DOCS_LAYOUT.md`
|
||||
|
||||
## 直近(JoinIR/selfhost)
|
||||
|
||||
- **Phase 29an(✅ COMPLETE): Skeleton/Feature Facts(SSOT)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29an/README.md`
|
||||
- 状況: P0–P14 ✅ 完了 / P15 closeout ✅
|
||||
- Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
- **Phase 29ao(active): CorePlan composition from Skeleton/Feature**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
- 状況: P0–P31 ✅ 完了 / Next: P32(Pattern2 real-world strict/dev shadow adopt)
|
||||
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md`
|
||||
|
||||
- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT**
|
||||
- 入口: `docs/development/current/main/phases/phase-29af/README.md`
|
||||
|
||||
- **Phase 29ag(✅ COMPLETE): JoinIR merge SSOT unification**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ag/README.md`
|
||||
|
||||
- **Phase 29ah(✅ COMPLETE): JoinIR regression pack expansion(real-world coverage)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ah/README.md`
|
||||
|
||||
- **Phase 29aj(candidate): PlannerOutcome observability SSOT**
|
||||
- 入口: `docs/development/current/main/phases/phase-29aj/README.md`
|
||||
- 状況: P0/P1/P2/P3/P4/P5/P6/P7/P8/P9/P10 ✅ 完了
|
||||
- Next: Phase 29aj P11(TBD)
|
||||
- 運用: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ)
|
||||
- 運用: phase286_pattern9_* は legacy pack (SKIP) を使う
|
||||
|
||||
- **Phase 29ak(candidate): PlanRuleOrder SSOT + PlannerContext plumbing**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ak/README.md`
|
||||
- 状況: P0/P1/P2/P3/P4/P5 ✅ 完了
|
||||
- Next: None(phase-29al へ)
|
||||
|
||||
- **Phase 29al(candidate): CorePlan composition hardening (docs-first)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29al/README.md`
|
||||
- 状況: P0/P1/P2/P3 ✅ 完了(docs-only)
|
||||
- Next: P4(unwind を含む ExitKind 拡張: design only)
|
||||
- 道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
|
||||
- **Phase 29am(✅ COMPLETE): CorePlan Step-A implementation (lowerer/verifier)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29am/README.md`
|
||||
- 状況: P0/P1/P2/P3 ✅ 完了
|
||||
- Next: Phase 29an
|
||||
- Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
- **Phase 29ai(candidate): Plan/Frag single-planner(Facts SSOT)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ai/README.md`
|
||||
- Next: Phase 29ai P16(TBD: promotion hint を JoinIR 側の orchestrator へ配線、挙動不変)
|
||||
|
||||
- **Phase 29ae P1(✅ COMPLETE): JoinIR Regression Pack (SSOT固定)**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ae/README.md`
|
||||
|
||||
- **Phase 29ad(✅ COMPLETE): Naming SSOT for Pattern6/7 fixtures**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ad/README.md`
|
||||
|
||||
- **Phase 29ac(✅ COMPLETE): De-freeze Pattern6/7**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ac/README.md`
|
||||
|
||||
- **Phase 29ab(✅ COMPLETE): JoinIR completion triage**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ab/README.md`
|
||||
|
||||
- **Phase 288(✅ P0–P3 + 288.1 complete): REPL mode**
|
||||
- 入口: `docs/development/current/main/phases/phase-288/README.md`
|
||||
- SSOT: `docs/reference/language/repl.md`
|
||||
- 次: Phase 288.2+(任意): REPL UX improvements(history / multiline / load 等)
|
||||
|
||||
- **Phase 287(✅ COMPLETE): Developer Hygiene(意味論不変)**
|
||||
- 状況: P0–P9 ✅ 完了(big files / facade / SSOT / docs guard / closeout)
|
||||
- 成果: merge/mod.rs (1,555→1,053行), ast_feature_extractor (1,148→135行), plan.rs (741→120行)
|
||||
- 入口: `docs/development/current/main/phases/phase-287/README.md`
|
||||
|
||||
- **Phase 284(✅ COMPLETE): Return as ExitKind SSOT(patternに散らさない)**
|
||||
- 目的: `return` を “pattern最適化の個別実装” にせず、`ExitKind` と `compose::*` / `emit_frag()` に収束させる
|
||||
- ねらい: 移行期間中の「二重ルール」「検出の穴」を減らし、将来の pattern 増殖を防ぐ
|
||||
- 入口: `docs/development/current/main/phases/phase-284/README.md`
|
||||
- P0(docs-only): `docs/development/current/main/phases/phase-284/P0-INSTRUCTIONS.md`
|
||||
- SSOT:
|
||||
- Composition: `src/mir/builder/control_flow/edgecfg/api/compose/mod.rs`
|
||||
- Terminator emission: `emit_frag()`(`src/mir/builder/control_flow/edgecfg/api/emit.rs`)
|
||||
- Frag docs: `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
- 進め方:
|
||||
- P0(docs-only)で “return の意味” と “Ok(None)/Err” の境界を固定
|
||||
- P1+ で Rust/LLVM の実装を SSOT に収束(pattern側に例外実装を増やさない)
|
||||
|
||||
- **Phase 285(✅ COMPLETE): Box lifecycle / weakref / finalization / GC SSOT**
|
||||
- 目的: Box の生存期間(強参照/弱参照/解放/最終化)を SSOT として固定し、「実装が仕様」になっている箇所を潰す
|
||||
- ねらい:
|
||||
- VM 側の weakref/finalization を仕様化(テストで固定)
|
||||
- LLVM harness 側の未対応/差分を “仕様として明文化” し、将来の実装計画を切る
|
||||
- 入口: `docs/development/current/main/phases/phase-285/README.md`
|
||||
- 状況(完了):
|
||||
- P0/P1/P2 ✅ 完了(weak 成功パターンは smoke 固定)
|
||||
- P2.1 ✅ 完了: hidden root を根治し、weak-fail smoke を PASS に復帰
|
||||
- P2.2 ✅ 完了: KeepAlive の二重責務を命令分離で解消(`KeepAlive`/`ReleaseStrong`)
|
||||
- P3.1/P3.2 ✅ 完了: LLVM 検出 + quick SSOT(`--features llvm` でも quick の意味が変わらない)
|
||||
- P4 ✅ 完了: `phase285_weak_basic_llvm` を PASS に復帰(quick 154/154)
|
||||
- 参考(現状の入口候補):
|
||||
- weakref 表現: `src/value.rs`(`NyashValue::WeakBox`)
|
||||
- finalization: `src/finalization.rs`
|
||||
- 追加(syntax cleanup, small & focused):
|
||||
- `weak` の表面構文を `weak <expr>` に収束(`weak(<expr>)` を持ち込まない)
|
||||
- `let weak w;` / `let weak w = e` の糖衣を検討(概念を増やさず `let w = weak e` にデシュガー)
|
||||
- fixture/smoke は `apps/tests/*.hako` を SSOT にして VM/LLVM で共通化(必要なら LLVM 側は SKIP で理由を固定)
|
||||
|
||||
- **Phase 29y(✅ P0 COMPLETE, docs-first SSOT finalized): MIR lifecycle vocab freeze(RC/weak/ABI)**
|
||||
- 状況: P0 ✅ 完了(docs-first SSOT finalized: ABI/RC insertion/Observability)
|
||||
- 成果: 3つのSSOT文書(10/20/30)Ready、pilot実装固定、Next steps明文化
|
||||
- 入口: `docs/development/current/main/phases/phase-29y/README.md`
|
||||
- 次: Phase 29z(RC insertion minimal)または Phase 29x(De-Rust runtime)候補
|
||||
|
||||
- **Phase 29z(P2 CLOSEOUT準備中, implementation-minimal): RC insertion minimal**
|
||||
- 進捗: P1まで完了(上書き+Store null+Return終端cleanup で ReleaseStrong 挿入、単一block・安全ガード付き)
|
||||
- ガード: Cargo feature `rc-insertion-minimal`(既定OFF、env var 新設なし)
|
||||
- 検証: quick 154/154 PASS 維持 + `rc_insertion_selfcheck`(opt-in)
|
||||
- 残課題(P2で方針化→次フェーズへ)
|
||||
- null伝搬の精度向上(copy以外の伝搬パターン追加を段階的に)
|
||||
- Branch/Jump 終端での cleanup をどう安全に扱うかの設計
|
||||
- PHI/loop/early-exit の安全な cleanup 設計(誤release防止)
|
||||
- 入口: `docs/development/current/main/phases/phase-29z/README.md`
|
||||
- 指示書: `docs/development/current/main/phases/phase-29z/P0-RC_INSERTION_MINIMAL-INSTRUCTIONS.md`
|
||||
|
||||
- **Phase 29aa(✅ COMPLETE): RC insertion safety expansion(CFG-aware)**
|
||||
- 進捗: P2 ✅ 完了(Jump/Branch 終端で cleanup を入れない契約の SSOT 化)
|
||||
- 進捗: P3 ✅ 完了(Jump→Return single-predecessor state 伝播)
|
||||
- 進捗: P4 ✅ 完了(Jump-chain propagation to Return)
|
||||
- 進捗: P5 ✅ 完了(Multi-predecessor Return join: state完全一致のみ)
|
||||
- 進捗: P6 ✅ 完了(Multi-predecessor Return join: intersection)
|
||||
- 進捗: P7 ✅ 完了(Deterministic ReleaseStrong ordering)
|
||||
- 進捗: P8 ✅ 完了(Null propagation across CFG; Copy-only)
|
||||
- 入口: `docs/development/current/main/phases/phase-29aa/README.md`
|
||||
|
||||
- **Phase 29x(planned, post self-host): De-Rust runtime for LLVM execution**
|
||||
- 目的: LLVM 実行経路のランタイム依存を段階的に Rust から切り離す(脱Rust)。
|
||||
- 前提: self-host ラインが安定し、VM/LLVM conformance(Phase 285)が十分に固まっていること。
|
||||
- 方針:
|
||||
- 仕様SSOT(strong/weak/fini/cleanup/void)は維持し、実装だけを差し替え可能にする。
|
||||
- まず ABI 境界(例: `nyrt_*`)を “将来置換する契約” として固定し、独立ランタイムに差し替える。
|
||||
- 受け入れ条件(最小):
|
||||
- 既存の `apps/tests/*.hako` fixture を再利用し、VM/LLVM parity のスモークが維持される。
|
||||
- weak の語彙(`weak <expr>` / `weak_to_strong()`)が同じ意味で動作する(cycleは当面リーク仕様でも可)。
|
||||
|
||||
- **Phase 29y(planned, post self-host / docs-first): MIR lifecycle vocab freeze(RC/weak/ABI)**
|
||||
- 目的: 参照カウント(strong/weak)を “どこで” 実装するか(MIR語彙 vs runtime ABI)を設計SSOT化し、脱Rust実装の土台にする
|
||||
- 前提: self-host 後/Phase 285(weak conformance + hidden root 根治)が落ち着いていること
|
||||
- 入口(phase): `docs/development/current/main/phases/phase-29y/README.md`
|
||||
- 入口(相談パケット): `docs/development/current/main/investigations/phase-29y-mir-lifecycle-vocab-consult.md`
|
||||
- 進捗(pilot, 仕様不変):
|
||||
- docs SSOT(ABI/RC insertion/observability)を phase-29y 配下に集約
|
||||
- Phase 29y.1: “最小導線” の実装だけ先行(意味論は変更しない)
|
||||
- NyRT handle ABI shim(`crates/nyash_kernel/src/ffi/lifecycle.rs`)
|
||||
- RC insertion pass 入口(no-op)
|
||||
- leak report に root categories(handlesのみ)を追加(Phase 1 limitation 明記)
|
||||
|
||||
- **Phase 286(✅ complete): JoinIR Line Absorption(JoinIR→CorePlan/Frag 収束)**
|
||||
- 目的: 移行期間に残っている「2本の lowering(Plan line / JoinIR line)」を、構造で 1 本に収束させる
|
||||
- ねらい: `return/break/continue` のような “大きな出口語彙” の実装場所が揺れない状態にする
|
||||
- 入口: `docs/development/current/main/phases/phase-286/README.md`
|
||||
- P0(docs-only): `docs/development/current/main/phases/phase-286/P0-INSTRUCTIONS.md`
|
||||
- 状況: Pattern1–9 の主要ループ形が Plan/Frag SSOT に吸収され、quick gate は green を維持。
|
||||
- 将来の設計相談(Phase 286 の範囲外で、別フェーズでSSOT化してから): `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md`
|
||||
- SSOT:
|
||||
- Plan/Frag: `compose::*` + `emit_frag()`(Phase 280/281)
|
||||
- JoinIR line 共通入口: `src/mir/builder/control_flow/joinir/patterns/conversion_pipeline.rs`
|
||||
|
||||
- (✅ done)**Phase 282**: Router shrinkage + detection SSOT + extractor refactor
|
||||
- 完了: `docs/development/current/main/phases/phase-282/README.md`
|
||||
|
||||
(✅ done)**Phase 279 P0**: Type propagation pipeline SSOT 統一(lifecycle / JoinIR / LLVM の二重化解消)
|
||||
- 完了: `docs/development/current/main/phases/phase-279/README.md`
|
||||
|
||||
- **Phase 272(✅ complete): Pattern6/7 を Frag+emit_frag へ吸収(段階適用)**
|
||||
- 目的: scan系 loop の CFG 構築を `Frag/ExitKind` 合成へ寄せ、pattern列挙の増殖を止める
|
||||
- 完了: P0.1(Pattern6)✅ + P0.2(Pattern7)✅
|
||||
- 入口: fixture/smoke を SSOT として固定(Pattern6→Pattern7 の順で段階適用)
|
||||
- 詳細: `phases/phase-272/README.md`
|
||||
|
||||
- (✅ done)**Phase 273**: Plan line SSOT(Pattern6/7)
|
||||
- 完了: `docs/development/current/main/phases/phase-273/README.md`
|
||||
|
||||
- (✅ done)**Phase 280**: Frag composition SSOT positioning
|
||||
- 完了: `docs/development/current/main/phases/phase-280/README.md`
|
||||
|
||||
- (✅ done)**Phase 281**: compose adoption(Pattern6/7, P0–P3)
|
||||
- 完了: `docs/development/current/main/phases/phase-281/README.md`
|
||||
|
||||
- (✅ done)**Phase 277/278**: PHI strict + env var 収束
|
||||
- 完了: `docs/development/current/main/phases/phase-277/README.md`
|
||||
- 完了: `docs/development/current/main/phases/phase-278/README.md`
|
||||
|
||||
|
||||
- **Phase 274(active, design-first): Type SSOT Alignment(local + dynamic runtime)**
|
||||
- 入口SSOT: `docs/reference/language/types.md`
|
||||
- P1(✅完了): Rust VM が `TypeOp(Check/Cast)` を実行可能(`is/as` が動く)
|
||||
- P2(✅完了): LLVM ライン(llvmlite harness)の `TypeOp` を SSOT に合わせる
|
||||
- P3(decision): truthiness / equality / compare / `+` の coercion を SSOT として固定(必要なら “仕様変更フェーズ” を追加)
|
||||
- 詳細: `phases/phase-274/README.md`
|
||||
|
||||
- **Phase 270(✅ 完了): JoinIR-only minimal loop SSOT**
|
||||
- `apps/tests/phase270_p0_loop_min_const.hako` + VM smoke で “最小 const loop” を固定(exit=3)
|
||||
- Pattern1 は test-only stub のため不適合 → Pattern9(AccumConstLoop)を橋渡しとして追加
|
||||
- 詳細: `phases/phase-270/README.md`
|
||||
|
||||
- **Phase 271(✅ 完了, docs-only): Bridge pattern 撤去条件SSOT**
|
||||
- 対象: bridge pattern(例: `Pattern9_AccumConstLoop`)
|
||||
- 目的: 「汎用化しない」「Frag 合成へ吸収して削除する」を SSOT 化
|
||||
- 成果物:
|
||||
- `docs/development/current/main/design/edgecfg-fragments.md` の `Bridge patterns(撤去条件SSOT)` に “bridge contract” テンプレを追加
|
||||
- `Pattern9_AccumConstLoop` の撤去条件(fixture/smoke/手順)を同セクションに明文化
|
||||
- SSOT: `docs/development/current/main/design/edgecfg-fragments.md`
|
||||
|
||||
- **Phase 269 P1(✅ 完了): Pattern8 を EdgeCFG で実装(SSA を閉じる)**
|
||||
- 方針: emission 入口で Frag 構築(break/continue 無しなので `compose::loop_()` は使わず手配線)
|
||||
- 完了: header に `i` の PHI を追加して SSA を閉じた(`i_current = phi [i_init, preheader], [i_next, step]`)
|
||||
- early-exit の `return false` は Return wire、`return true` は loop 後 AST に任せる
|
||||
- Pattern8 の返り値は当面 `void`(loop-statement 扱い)
|
||||
- 補足(DONE): static box の `this/me` は MethodCall 共通入口で static call に正規化済み(Pattern8 は現状 static box 文脈を対象外)
|
||||
- 詳細: `phases/phase-269/README.md`
|
||||
|
||||
- **Phase 270+(planned): Pattern6/7 への Frag 適用**
|
||||
- Pattern6: Match scan(index_of 系)
|
||||
- Pattern7: Split scan(split 系)
|
||||
- 統一的なループ処理パターン確立
|
||||
- Pattern 分岐削減
|
||||
|
||||
- **収束方針(SSOT案): Expr/Condition/Control の 3 箱分割**
|
||||
- ExprLowererBox(式SSOT): `AST(expr)` → `(prelude, value)`(ANF含む)。pure/impure/whitelist/strict を集約(入口SSOT)。
|
||||
- ConditionLowererBox(条件→分岐SSOT): `AST(cond)` → `BranchPlan`。評価順は ExprLowererBox に委譲し、`&&/||` は制御語彙で扱う。
|
||||
- ControlLowererBox(制御SSOT): `StepNode/ControlTree` → JoinIR(継続 + env)。`if/loop` を担当し、条件は ConditionLowererBox に委譲。
|
||||
|
||||
- **Phase 141 P2+(planned): Call/MethodCall(effects + typing を分離して段階投入)**
|
||||
- ねらい: pure/impure 境界を壊さずに、impure lowering を段階投入する。
|
||||
- 前提(DONE):
|
||||
- Phase 141 P1.5: known intrinsic allowlist + available_inputs 3-source merge + diagnostics
|
||||
- 受け入れ条件:
|
||||
- out-of-scope は `Ok(None)` でフォールバック(既定挙動不変)
|
||||
- effects の順序付けは SSOT で固定してから解禁(by-name 増殖禁止)
|
||||
|
||||
- **Phase 144-anf(planned): impure 式導入の順序固定(ANF)**
|
||||
- ねらい: `x + f(y)` 等の “pure + impure 混在” で評価順が仕様になる前に、ANF で順序固定を SSOT 化する
|
||||
- 入口: `docs/development/current/main/phases/phase-144-anf/INSTRUCTIONS.md`
|
||||
- 受け入れ条件:
|
||||
- impure を lowering できない場合は `Ok(None)` でフォールバック(既定挙動不変)
|
||||
- dev/strict では「順序固定の欠落」を Fail-Fast(診断に順序ログを含める)
|
||||
|
||||
- **Phase 143-loopvocab R0(planned): Contract SSOT 抽出(refactor P0 → modular components)**
|
||||
- 目的: loop_true_if_break_continue.rs を「検出/契約/変換」に分割し、P1/P2 での if分岐増殖を防ぐ
|
||||
- 実装:
|
||||
- 新ファイル: `src/mir/control_tree/normalized_shadow/common/loop_if_exit_contract.rs`
|
||||
- `enum LoopIfExitThen { Break, Continue }`
|
||||
- `struct LoopIfExitShape { has_else: bool, then: LoopIfExitThen, else_: Option<LoopIfExitThen>, cond_scope: ExprLoweringScope }`
|
||||
- `enum OutOfScopeReason { NotLoopTrue, BodyNotSingleIf, ThenNotExit, ElseNotSupported, CondOutOfScope(...) }`
|
||||
- Refactor: loop_true_if_break_continue.rs は「shape抽出 → lower」だけに縮退(SSOT は contract側)
|
||||
- Tests: unit test を dedicated module へ分離(test maintainability)
|
||||
- 受け入れ条件:
|
||||
- cargo check ✅(no errors)
|
||||
- P1/P2 での if分岐を防ぐ(contract で決定性を保証)
|
||||
- out-of-scope は `Ok(None)` で一貫(既定挙動不変)
|
||||
|
||||
- **Phase 143-loopvocab P1(planned): continue 語彙追加**
|
||||
- 対象: `loop(true) { if(cond_pure) continue }` を same lowering に通す
|
||||
- 実装:
|
||||
- LoopIfExitShape で `LoopIfExitThen::Continue` を許可
|
||||
- JoinModule: if true → loop_step (continue semantics)
|
||||
- Fixtures: `phase143_loop_true_if_continue_min.hako`
|
||||
- Smoke: VM + LLVM EXE
|
||||
- Out-of-scope は `Ok(None)` のまま
|
||||
|
||||
(DONE)Phase 143-loopvocab P2: else 対称化(B-C / C-B)
|
||||
- 記録: `docs/development/current/main/10-Now.md`
|
||||
|
||||
- **Phase 143-loopvocab P3+(planned): impure conditions 対応**
|
||||
- 目的: `if(cond_impure) break/continue` を ANF/順序固定の上で段階投入する
|
||||
- 方針: Phase 145-anf の契約(hoist + left-to-right)を条件式にも適用
|
||||
|
||||
- **Phase 263+(planned): Pattern2 LoopBodyLocal promotion(seg)**
|
||||
- 目的: Stage‑B compile(bundle_resolver系)で露出している Pattern2 `LoopBodyLocal(seg)` を受理し、quick の first FAIL を進める
|
||||
- 受け入れ条件:
|
||||
- 最小再現 fixture + smoke で固定(先に失敗を SSOT 化)
|
||||
- Pattern2 が不成立のときは “部分続行” せず `Ok(None)` で fallback(既定挙動不変)
|
||||
|
||||
- **(DONE)Phase 263 P0.2: Pattern2 PromoteDecision API hardening**
|
||||
- 入口SSOT: `src/mir/builder/control_flow/joinir/patterns/pattern2/api/`
|
||||
- `PromoteDecision::{Promoted, NotApplicable, Freeze}` と `try_promote(...)` に参照点を収束(Option揺れを撤去)
|
||||
|
||||
- **Phase 264(✅ 入口作成完了): EdgeCFG Fragment 入口作成(design-first)**
|
||||
- **ステータス**: ✅ 入口作成完了(適用は次フェーズ)
|
||||
- **実装内容**:
|
||||
- `edgecfg/api/` フォルダに SSOT 入口作成
|
||||
- `ExitKind`, `EdgeStub`, `Frag` の型定義
|
||||
- `seq`, `if_`, `loop_`, `cleanup` のシグネチャ固定(pub(crate))
|
||||
- 最小ユニットテスト 3個
|
||||
- ドキュメント連動(edgecfg-fragments.md)
|
||||
- **制約遵守**:
|
||||
- 既存 pattern6/7/8 未改変
|
||||
- merge/EdgeCFG 未改変
|
||||
- cargo test -p nyash-rust --lib --no-run 成功確認
|
||||
- **次フェーズへの橋渡し**:
|
||||
- Phase 265 で Pattern8 適用時に `compose::loop_` を実装
|
||||
- 再利用確認後、pattern番号分岐を段階的に削減
|
||||
|
||||
- **Phase 265 P0(✅ 完了): compose/verify 最小実装**
|
||||
- **目的**: 入口SSOTの形を固める(迷子防止)
|
||||
- **実装**:
|
||||
- compose::loop_() 最小実装(exit集合分類のみ、配線なし)
|
||||
- verify_frag_invariants() 最小実装(デバッグガード付き)
|
||||
- compose::loop_() ユニットテスト 2個追加
|
||||
- **制約**:
|
||||
- Pattern8 未改変(P0では触らない、偽Frag回避)
|
||||
- 配線ロジックは P1 以降
|
||||
- **次**: Phase 265 P1 で配線ロジック + Pattern8適用
|
||||
|
||||
- **Phase 265 P1(✅ 完了): compose 配線ロジック実装**
|
||||
- **目的**: Frag/ExitKind の配線能力を BasicBlockId 層で証明
|
||||
- **実装**:
|
||||
- EdgeStub.target 追加(Option<BasicBlockId>)
|
||||
- compose::loop_() 配線ロジック(Continue → header, Break → after)
|
||||
- verify_frag_invariants() 配線契約検証
|
||||
- test-only PoC(5個のテスト: 既存2個更新 + 新規3個追加)
|
||||
- **配線契約**:
|
||||
- Continue(loop_id) の EdgeStub.target = Some(header)
|
||||
- Break(loop_id) の EdgeStub.target = Some(after)
|
||||
- Normal/Return/Unwind の EdgeStub.target = None(上位へ伝搬)
|
||||
- **制約**:
|
||||
- MIR 命令生成なし(Frag 層のみ)
|
||||
- NormalizedShadow 未適用(Phase 267 に繰り越し)
|
||||
|
||||
- **(✅ 完了)Phase 265 P2: seq/if_ 実装(wires/exits 分離)**
|
||||
- **目的**: 「解決済み配線(wires)」と「未解決 exit(exits)」を分離し、Frag 合成の基本パターンを完成
|
||||
- **完了内容**:
|
||||
- Frag に `wires: Vec<EdgeStub>` 追加
|
||||
- wires/exits 分離設計確立(exits = target None, wires = target Some)
|
||||
- loop_() を wires 対応に更新
|
||||
- seq(a, b) 実装(a.Normal → wires)
|
||||
- if_(header, cond, t, e, join_frag) 実装(t/e.Normal → wires)
|
||||
- verify 強化(wires/exits 分離契約、警告のみ)
|
||||
- 全テスト PASS(13個: frag 3 + compose 9 + verify 1)
|
||||
- **設計判断**:
|
||||
- wires/exits 分離で再配線バグ防止
|
||||
- if_ は join_frag: Frag で「join 以降」を明確化
|
||||
- verify は警告のみ(Err 化は Phase 266 の strict 版で段階導入)
|
||||
- **次**: Phase 266 で MIR 命令生成 PoC(emit_wires)、Phase 267 で NormalizedShadow/JoinIR へ実適用
|
||||
|
||||
- **(✅ 完了)Phase 266: wires → MIR terminator 生成(最小 PoC)**
|
||||
- **目的**: wires を MIR terminator に変換する最小 PoC を実装し、Phase 267 での本格適用に備える
|
||||
- **完了内容**:
|
||||
- emit.rs 作成(emit_wires 実装 + unit test 4個)
|
||||
- verify_frag_invariants_strict() 追加(段階導入を壊さない)
|
||||
- Jump/Return 対応(Branch は Phase 267)
|
||||
- mod.rs 更新(emit module エクスポート)
|
||||
- 全テスト PASS(1392 passed: 既存 1388 + 新規 4個)
|
||||
- **核心原則**:
|
||||
- from ごとにグループ化して1本だけ許可(1 block = 1 terminator 制約)
|
||||
- Return は target=None を許可(意味を持たない)
|
||||
- verify_frag_invariants() は変更なし(警告のまま、strict 版を別名で用意)
|
||||
- Phase 260 terminator 語彙ルールを厳守
|
||||
- **設計判断**:
|
||||
- from グループ化で terminator 上書きバグ防止
|
||||
- Return は target 不要(呼び出し元に戻る)
|
||||
- verify strict 版で段階導入を壊さない
|
||||
- **次**: Phase 267 で JoinIR Pattern への適用
|
||||
|
||||
- **(✅ P0 完了)Phase 267: BranchStub + emit_frag(Branch の第一級化)**
|
||||
- **目的**: Frag に Branch を第一級で追加し、wires(Jump/Return)と同様に MIR terminator へ落とす入口を作る
|
||||
- **完了内容(P0)**:
|
||||
- `BranchStub` 追加 + `Frag.branches` 追加
|
||||
- `compose::if_` が header→then/else の BranchStub を生成
|
||||
- `emit_frag(function, frag)` を追加(`emit_wires` + `set_branch_with_edge_args`)
|
||||
- 1 block = 1 terminator(wire/branch の衝突)を Fail-Fast
|
||||
- unit tests + `cargo test -p nyash-rust --lib` PASS
|
||||
- **P1(延期)**:
|
||||
- "層を跨がない実適用"は候補が抽象化層へ委譲済みのため、Phase 268 で体系的に適用する方針
|
||||
- **詳細**: `docs/development/current/main/phases/phase-267/README.md`
|
||||
|
||||
- **(✅ 完了)Phase 268: if_form.rs への Frag 適用 + entry edge-args SSOT化**
|
||||
- **目的**: EdgeCFG Fragment を層を跨がずに実戦投入し、compose::if_() の edge-args を SSOT 化
|
||||
- **完了内容(P0)**:
|
||||
- emission/branch.rs に emit_conditional_edgecfg() 追加(薄いラッパー)
|
||||
- if_form.rs を Frag+emit_frag 経由に変更(emit_conditional + emit_jump を削除)
|
||||
- emission 層経由で層が綺麗に保たれる
|
||||
- **完了内容(P1)**:
|
||||
- compose::if_() シグネチャ変更(then_entry_args, else_entry_args 追加)
|
||||
- emission/branch.rs から空 EdgeArgs を渡す
|
||||
- EdgeCFG テスト更新(compose.rs 2箇所、emit.rs 1箇所)
|
||||
- TODO コメント削除完了(Phase 267 P2+ TODO 解消)
|
||||
- **テスト結果**:
|
||||
- cargo build --release: 成功
|
||||
- cargo test --lib --release: 1444/1444 PASS
|
||||
- quick smoke: 45/46 PASS(既存状態維持)
|
||||
- **核心原則**:
|
||||
- emission 層経由で Frag 構築を MirBuilder 層から分離
|
||||
- SSOT 原則: compose::if_() は edge-args を内部生成しない
|
||||
- **次**: Phase 269 で Pattern6/7/8 への Frag 適用 + fixture/smoke test
|
||||
- **詳細**: `docs/development/current/main/phases/phase-268/README.md`
|
||||
|
||||
- **real-app loop regression の横展開(VM + LLVM EXE)**
|
||||
- ねらい: 実コード由来ループを 1 本ずつ最小抽出して fixture/smoke で固定する(段階投入)。
|
||||
- 現状: Phase 107(find_balanced_array/object / json_cur 由来)まで固定済み。
|
||||
- 次候補: JsonLoader/JsonCur から 1 本ずつ(fixture + integration smoke)で増やす。
|
||||
|
||||
- **P5b “完全E2E”**(escape skip の実ループを end-to-end で固定)
|
||||
- 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。
|
||||
- 入口: `docs/development/current/main/phases/phase-94/README.md`
|
||||
|
||||
- **制御の再帰合成(docs-only → dev-only段階投入)**
|
||||
- ねらい: `loop/if` ネストの "構造" を SSOT(ControlTree/StepTree)で表せるようにする
|
||||
- 注意: canonicalizer は観測/構造SSOTまで(ValueId/PHI配線は Normalized 側へ)
|
||||
- 現状: Phase 119–128(if-only Normalized: reads/inputs/unknown-read/partial-assign keep/merge)まで完了
|
||||
- ✅ 完了: Phase 129-C(post-if を post_k continuation で表現)
|
||||
- 入口: `docs/development/current/main/design/control-tree.md`
|
||||
|
||||
## 中期(ループ在庫の残り)
|
||||
|
||||
- **P5(guard-bounded)**: 大型ループを “小粒度” に割ってから取り込む(分割 or 新契約)
|
||||
- **P6(nested loops)**: capability guard で Fail-Fast 維持しつつ、解禁時の契約を先に固定
|
||||
|
||||
## 中期(制御の表現力)
|
||||
|
||||
北極星: `docs/development/current/main/design/join-explicit-cfg-construction.md`
|
||||
設計メモ: `docs/development/current/main/design/exception-cleanup-async.md`
|
||||
|
||||
- **catch/cleanup(Invoke)**
|
||||
- 追加語彙を `Invoke(ok_edge, err_edge)` に絞って例外 edge を明示する(例外値は edge-args で運ぶ)。
|
||||
- 実装タイミング: Phase 260(edge-args terminator 収束)の P1〜P2 以降が推奨。
|
||||
- **cleanup/defer(cleanup normalizer)**
|
||||
- Return/Throw/Break/Continue を cleanup に寄せる “脱出 edge 正規化” を箱化する(finally の後継としての cleanup)。
|
||||
- 実装タイミング: catch/cleanup の次(例外 edge も含めて正規化するため)。
|
||||
- **async/await(state machine lowering)**
|
||||
- CFG語彙に混ぜず、AsyncLowerBox で state machine 化してから MIR に落とす。
|
||||
- 実装タイミング: finally/defer の後(cancel/drop と cleanup の接続を先に固める)。
|
||||
|
||||
## ドキュメント運用
|
||||
|
||||
- 重複が出たら「設計 SSOT(design)」に集約し、Phaseログ(phases)は “何をやったか/検証したか” に限定する
|
||||
- 調査ログ(investigations)は結論を SSOT に反映してから Historical 化する
|
||||
@ -0,0 +1,232 @@
|
||||
# CURRENT_TASK (archive)
|
||||
|
||||
Status: SSOT
|
||||
Scope: Repo root の旧リンク互換。現行の入口は `docs/development/current/main/10-Now.md`。
|
||||
|
||||
- Now: `docs/development/current/main/10-Now.md`
|
||||
- Backlog: `docs/development/current/main/30-Backlog.md`
|
||||
|
||||
---
|
||||
|
||||
## Handoff (current)
|
||||
|
||||
### 状況(SSOT)
|
||||
|
||||
**JoinIR 回帰 SSOT**
|
||||
`./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` が唯一の integration gate。phase143_* は対象外(legacy pack で隔離)。phase286_pattern9_* は legacy pack (SKIP) で運用。
|
||||
|
||||
**CorePlan migration 道筋 SSOT**
|
||||
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
|
||||
|
||||
**Next implementation (Phase 29ao P32)**
|
||||
- 目的: Pattern2 real-world strict/dev shadow adopt
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md`
|
||||
- After P32: TBD
|
||||
|
||||
**2025-12-30: Phase 29ao P31 COMPLETE (shadow adopt routing SSOT)**
|
||||
shadow adopt の判定/Fail-Fast/タグを composer 側に集約し、router を薄くした(仕様不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P30 COMPLETE (Shadow adopt composer SSOT)**
|
||||
Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退した(挙動不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)**
|
||||
Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P27 COMPLETE (Pattern6 subset strict/dev adopt from facts)**
|
||||
Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P28 COMPLETE (Shadow adopt observability tags + gate smokes)**
|
||||
strict/dev shadow adopt が実際に踏まれていることを安定タグと回帰スモークで検証できるようにした(仕様不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P29 COMPLETE (Shadow adopt tag coverage)**
|
||||
regression gate に含まれる全パターンで shadow adopt のタグを必須化した(仕様不変)。
|
||||
|
||||
**2025-12-30: Phase 29ao P26 COMPLETE (Pattern2 subset strict/dev adopt from facts)**
|
||||
Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P24 COMPLETE (Pattern7 strict/dev adopt from facts)**
|
||||
Pattern7(SplitScan)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P23 COMPLETE (Pattern3 strict/dev adopt from facts)**
|
||||
Pattern3(If‑Phi)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P22 COMPLETE (Pattern1 CoreLoop dedup)**
|
||||
Pattern1 の CoreLoop 構築を SSOT で 1 箇所に統一し、DomainPlan/Facts の二重化を解消した。
|
||||
|
||||
**2025-12-30: Phase 29ao P21 COMPLETE (Pattern1 subset step-only gate)**
|
||||
Pattern1 subset を body=step のみに引き締め、strict/dev shadow adopt の誤マッチを遮断した。
|
||||
|
||||
**2025-12-30: Phase 29ao P20 COMPLETE (CoreLoop ExitMap composition SSOT)**
|
||||
CoreLoop の ExitMap/Cleanup/ValueJoin 合成規約を SSOT 化し、合成境界と Fail-Fast ルールを固定した(docs-only)。
|
||||
|
||||
**2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)**
|
||||
CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。
|
||||
|
||||
**2025-12-30: Phase 29ao P12 COMPLETE (Pattern7 SplitScan step join via block_params)**
|
||||
Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の step PHI を撤去した。
|
||||
|
||||
**2025-12-30: Phase 29ao P18 COMPLETE (single_planner outcome plumbing)**
|
||||
single_planner が planner outcome を返す SSOT に寄せ、router の二重 planner 実行を撤去した。
|
||||
|
||||
**2025-12-30: Phase 29ao P17 COMPLETE (Pattern1 strict/dev shadow adopt)**
|
||||
strict/dev のみ Facts→CorePlan(skeleton) を採用し、既定経路は維持した。
|
||||
|
||||
**2025-12-30: Phase 29ao P14 COMPLETE (Pattern2 Break exit join via block_params)**
|
||||
Pattern2 Break の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の after PHI を撤去した。
|
||||
|
||||
**2025-12-30: Phase 29ao P16 COMPLETE (Pattern5 Break exit join via block_params)**
|
||||
Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の exit PHI を撤去した。
|
||||
|
||||
**2025-12-29: Phase 29am P1 COMPLETE (CoreLoopPlan.body Seq flatten)**
|
||||
CoreLoopPlan.body の `Seq([Effect...])` を再帰で flatten して emit できるようにした(Effect-only制約は維持)。
|
||||
|
||||
**2025-12-29: Phase 29am P2 COMPLETE (Verifier: Loop.body Effect-only)**
|
||||
Loop.body に If/Exit/Loop が混入したら PlanVerifier で fail-fast([V12])。Seq-of-effects は許可。
|
||||
|
||||
**2025-12-29: Phase 29am P3 COMPLETE (Exit alignment: “Exit is last” rule)**
|
||||
CorePlan 内の Exit の乱用を抑制し、Frag/ExitMap と整合する表現へ寄せた([V11])。
|
||||
|
||||
**PlanRuleOrder SSOT**
|
||||
single_planner の順序/名前 SSOT は `src/mir/builder/control_flow/plan/single_planner/rule_order.rs` に固定。PlannerContext で Pattern1 facts の抑制を開始し、残りの guard/filter は段階移行。
|
||||
|
||||
**2025-12-29: Phase 29aj P6 COMPLETE (JoinIR regression gate SSOT)**
|
||||
JoinIR 回帰の integration gate を phase29ae pack に固定し、phase143_* を legacy pack で隔離。
|
||||
|
||||
**2025-12-29: Phase 29aj P7 COMPLETE (Pattern8 planner-first)**
|
||||
Pattern8 BoolPredicateScan の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29ak P0 COMPLETE (PlanRuleOrder + PlannerContext plumbing)**
|
||||
PlanRuleOrder を SSOT 化し、PlannerContext を配線(未使用)。single_planner の手書きテーブルを撤去。
|
||||
|
||||
**2025-12-29: Phase 29ak P1 COMPLETE (Pattern1 facts guard via planner)**
|
||||
Pattern1 以外のループで pattern1_simplewhile facts 抽出を抑制。single_planner 側の guard は安全策として維持。
|
||||
|
||||
**2025-12-29: Phase 29ak P2 COMPLETE (Pattern8 static box filter via planner)**
|
||||
static box では Pattern8 facts 抽出を抑制。single_planner 側の filter は安全策として維持。
|
||||
|
||||
**2025-12-29: Phase 29ak P3 COMPLETE (remove Pattern8 filter in single_planner)**
|
||||
Pattern8 static box filter を single_planner から撤去し、planner/facts 側 SSOT に一本化。
|
||||
|
||||
**2025-12-29: Phase 29ak P4 COMPLETE (remove Pattern1 guard in single_planner)**
|
||||
Pattern1 guard を single_planner から撤去し、planner/facts 側 SSOT と fallback 抑制に統一。
|
||||
|
||||
**2025-12-29: Phase 29ak P5 COMPLETE (planner candidate ctx gate)**
|
||||
Pattern1/8 の候補抑制を planner 側に集約し、single_planner の Pattern1 抑制を撤去。
|
||||
|
||||
**2025-12-29: Phase 29al P0 COMPLETE (Skeleton/Feature model SSOT, docs-only)**
|
||||
CorePlan を骨格→特徴→合成で説明する SSOT を追加し、Freeze taxonomy に unstructured を追加。
|
||||
|
||||
**2025-12-29: Phase 29al P1 COMPLETE (post-phi final form SSOT, docs-only)**
|
||||
join 値(PHI相当)の最終表現(layout/mapping/pred分類/verify)を 1 枚 SSOT として固定。
|
||||
|
||||
**2025-12-29: Phase 29al P2 COMPLETE (effect classification SSOT, docs-only)**
|
||||
effect 分類(Pure/Mut/Io/Control)と “許される変形” の最小法典を SSOT 化。
|
||||
|
||||
**2025-12-29: Phase 29al P3 COMPLETE (exitkind/cleanup/effect contract SSOT, docs-only)**
|
||||
cleanup を ExitKind 語彙として扱い、Control/Io を跨いだ移動や DCE 消去の事故を防ぐ境界を SSOT 化。
|
||||
|
||||
**2025-12-29: Phase 29aj P10 COMPLETE (single_planner unified shape)**
|
||||
single_planner を全パターンで planner-first → extractor フォールバックの共通形に統一(挙動不変)。
|
||||
|
||||
**2025-12-29: Phase 29aj P9 COMPLETE (phase286 pattern9 legacy isolation)**
|
||||
phase286_pattern9_frag_poc を legacy pack (SKIP) に隔離し、JoinIR 回帰 SSOT を phase29ae pack に固定。
|
||||
|
||||
**2025-12-29: Phase 29aj P8 COMPLETE (Pattern9 planner-first)**
|
||||
Pattern9 AccumConstLoop の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29ai P15 COMPLETE (Pattern2 promotion hint observe)**
|
||||
strict/dev 時のみ `[plan/pattern2/promotion_hint:{TrimSeg|DigitPos}]` を観測できるようにし、次は promotion hint の Plan/Frag 吸収残作業(P16候補)。
|
||||
|
||||
**2025-12-29: Phase 29aj P0 COMPLETE (PlannerOutcome observability SSOT)**
|
||||
planner outcome(facts+plan)を SSOT 化し、single_planner の観測が planner facts のみに依存するように統一。
|
||||
|
||||
**2025-12-29: Phase 29aj P1 COMPLETE (Remove legacy_rules)**
|
||||
single_planner の legacy_rules を撤去し、Pattern1/3/4/5/8/9 の抽出を plan/extractors に統一。
|
||||
|
||||
**2025-12-29: Phase 29aj P2 COMPLETE (Pattern1 planner-first)**
|
||||
chosen_rule を撤去し、Pattern1 SimpleWhile の Facts→Planner-first を導入(仕様不変)。
|
||||
|
||||
**2025-12-29: Phase 29aj P3 COMPLETE (Pattern3 planner-first)**
|
||||
Pattern3 If-Phi の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29aj P4 COMPLETE (Pattern4 planner-first)**
|
||||
Pattern4 Continue の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-29: Phase 29aj P5 COMPLETE (Pattern5 planner-first)**
|
||||
Pattern5 Infinite Early Exit の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。
|
||||
|
||||
**2025-12-27: Phase 188.3 / Phase 287 P2 COMPLETE (Pattern6 nested loop: merge/latch fixes)**
|
||||
Pattern6(1-level nested loop)の JoinIR→bridge→merge 経路で発生していた `undefined ValueId` と `vm step budget exceeded`(無限ループ)を解消。`apps/tests/phase1883_nested_minimal.hako` が RC=9 を返し、quick 154 PASS を維持。
|
||||
|
||||
- SSOT(mergeの契約):
|
||||
- latch_incoming を記録してよいのは `TailCallKind::BackEdge` のみ(LoopEntry は上書き禁止)
|
||||
- entry-like 判定は “JoinIR MAIN のみ” を対象にする(block-id 推測はしない): `src/mir/builder/control_flow/joinir/merge/contract_checks/entry_like_policy.rs`
|
||||
- latch 二重設定は `debug_assert!` で fail-fast(回帰検知)
|
||||
- 変更箇所:
|
||||
- `src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs`
|
||||
- `src/mir/builder/control_flow/joinir/merge/loop_header_phi_info.rs`
|
||||
- 検証(DONE):
|
||||
- [x] 再現とPHI確認(Pattern6)
|
||||
- [x] latch記録条件を修正(BackEdgeのみ)
|
||||
- [x] デバッグ出力を撤去(恒常出力なし)
|
||||
- [x] quick/fixtureで検証(quick 154 PASS / fixture RC=9)
|
||||
- [x] docsを締めて次の指示書を用意(refactor挟み込み用)
|
||||
|
||||
**2025-12-26: Phase 286 P2.2 COMPLETE (Hygiene: extractor重複排除 + router小整理)**
|
||||
Pattern1/Pattern4 の Plan/Frag PoC 完了後、extractor の `extract_loop_increment_plan` を `common_helpers.rs` に統一、router の 3行パターン(normalize→verify→lower)を `lower_via_plan()` ヘルパーで共通化。~65行削減、quick 154 PASS 維持。
|
||||
|
||||
**2025-12-26: Phase 286 P2.3 COMPLETE (Pattern9 AccumConstLoop Plan化 PoC)**
|
||||
Pattern9 (AccumConstLoop) を Plan/Frag SSOT に移行完了。PHI 2本(loop_var, acc_var)、const/var 両方 OK。Pattern9 は Pattern1 より先にチェック(より具体的なパターン)。quick 154 PASS 維持。
|
||||
|
||||
- 現行の入口: `docs/development/current/main/10-Now.md`
|
||||
- Phase 286 詳細: `docs/development/current/main/phases/phase-286/README.md`
|
||||
- 次の候補: `docs/development/current/main/30-Backlog.md`
|
||||
- Design goal: `docs/development/current/main/design/join-explicit-cfg-construction.md`
|
||||
|
||||
### 直近の道筋(JoinIR / Normalized)
|
||||
|
||||
### 設計方針メモ(SSOT候補)
|
||||
|
||||
- ExprLowererBox(式SSOT)
|
||||
- 役割: `AST(expr)` → `(prelude: Vec<Inst>, value: ValueId)`(ANF含む)
|
||||
- pure/impure/whitelist/strict の契約を集約(入口SSOT)
|
||||
- ConditionLowererBox(条件→分岐SSOT)
|
||||
- 役割: `AST(cond)` → `BranchPlan`(短絡なら分岐語彙で組む)
|
||||
- 評価順は ExprLowererBox に委譲(ANFで順序固定)
|
||||
- `&&/||` は制御として扱い、式で無理しない
|
||||
- ControlLowererBox(制御SSOT)
|
||||
- 役割: `StepNode/ControlTree` → JoinIR(継続 + env)
|
||||
- `if/loop` はここ、条件の中身は ConditionLowererBox に委譲
|
||||
|
||||
- Phase 139: if-only `post_k` の return lowering を `ReturnValueLowererBox` に統一(DONE)
|
||||
- `docs/development/current/main/phases/phase-139/README.md`
|
||||
- Phase 140: `NormalizedExprLowererBox` 初版(pure expression のみ)(DONE)
|
||||
- SSOT: `docs/development/current/main/design/normalized-expr-lowering.md`
|
||||
- `docs/development/current/main/phases/phase-140/README.md`
|
||||
- Phase 141 P0: impure 拡張点(contract)を SSOT 化(Call/MethodCall はまだ out-of-scope)(DONE)
|
||||
- `docs/development/current/main/phases/phase-141/README.md`
|
||||
- Phase 141 P1: “既知 intrinsic だけ” を許可して段階投入(DONE)
|
||||
- `docs/development/current/main/phases/phase-141/README.md`
|
||||
- Phase 141 P1.5: known intrinsic registry + available_inputs 3-source merge + diagnostics(DONE)
|
||||
- `docs/development/current/main/phases/phase-141/README.md`
|
||||
- Phase 142-loopstmt P0: 正規化単位を statement(loop 1個)へ寄せる(DONE)
|
||||
- `docs/development/current/main/phases/phase-142-loopstmt/README.md`
|
||||
- Phase 142-loopstmt P1: LLVM EXE smoke(同 fixture)を追加(DONE)
|
||||
- `docs/development/current/main/phases/phase-142-loopstmt/README.md`
|
||||
- Phase 141 P2+: Call/MethodCall(effects + typing)を分離して段階投入
|
||||
- Historical context: `docs/development/current/main/investigations/joinir-generalization-study.md`
|
||||
- Phase 143-loopvocab P0/P1: loop 内 if/break/continue の語彙追加(DONE)
|
||||
- `docs/development/current/main/phases/phase-143-loopvocab/README.md`
|
||||
- Phase 143-loopvocab P2: else 対称化(B-C / C-B)(DONE)
|
||||
- `docs/development/current/main/phases/phase-143-loopvocab/README.md`
|
||||
- Phase 145-anf P0/P1/P2: ANF(impure hoist + 再帰的線形化)(DONE)
|
||||
- `docs/development/current/main/phases/phase-145-anf/README.md`
|
||||
- Phase 146(in progress): Loop/If 条件式へ ANF を横展開(順序固定と診断)
|
||||
- `docs/development/current/main/phases/phase-146/README.md`
|
||||
|
||||
## Resolved (historical)
|
||||
|
||||
### WSL EXDEV / cargo build failure (resolved)
|
||||
|
||||
- 2025-12-18: `Invalid cross-device link (os error 18)` により `cargo build` が失敗する事象があったが、`wsl --shutdown` 再起動後に復旧。
|
||||
- 再発時のワークアラウンド: `tools/build_llvm.sh` は EXDEV を避けるため `TMPDIR` を `target/...` 配下へ寄せる。
|
||||
Reference in New Issue
Block a user