phase29ai(p15): observe pattern2 promotion hint under strict
This commit is contained in:
@ -1,64 +1,65 @@
|
||||
# Phase 29ai P15: Observe Pattern2 promotion hint(SSOT, 仕様不変)
|
||||
# Phase 29ai P15: Observe Pattern2 promotion hint (strict/dev)
|
||||
|
||||
Date: 2025-12-29
|
||||
Status: Ready for execution
|
||||
Scope: P14 で追加した `Pattern2BreakPlan.promotion` を “観測可能” にする(挙動不変)
|
||||
Goal: 次の「Plan/Frag に promotion を吸収する」フェーズ前に、hint が正しく付与されていることを fixture/smoke で固定する
|
||||
Scope: Pattern2 LoopBodyLocal promotion hint を strict/dev 限定で観測可能にする(仕様不変)
|
||||
Goal: promotion hint が付与されている事実を stable tag で固定し、次の Plan/Frag 吸収フェーズへ進む前提を揃える
|
||||
|
||||
## Objective
|
||||
|
||||
P14 で planner は LoopBodyLocal facts があるときだけ `Pattern2BreakPlan.promotion` を付与できるようになった。
|
||||
しかし現状は “hint が付いているか” を実行経路で検証できない。
|
||||
- Pattern2 LoopBodyLocal facts が取れるときだけ、strict/dev 限定で安定タグを出して観測できるようにする
|
||||
- 既定(非 strict)ではログ増やさない・挙動/エラー文字列は不変
|
||||
|
||||
P15 では:
|
||||
- dev-only / strict-only の観測ログ(安定タグ)を 1 箇所に追加し
|
||||
- 代表 fixture(seg/digit_pos)で hint が付与されていることを smoke で固定する
|
||||
## SSOT / Preconditions
|
||||
|
||||
## Non-goals
|
||||
|
||||
- 実際の promotion 実装の変更(挙動変更は禁止)
|
||||
- 新しい env var の追加(既存の strict フラグだけ使う)
|
||||
- by-name 分岐の追加(禁止)
|
||||
- production 既定でログ増加(strict/dev のみ)
|
||||
- strict 判定は既存の `HAKO_JOINIR_STRICT=1` / `NYASH_JOINIR_STRICT=1` のみ(新 env var 禁止)
|
||||
- `filter_noise()` は `^[joinir/` や `^[trace:` を落とすため、タグは `[plan/` で出す
|
||||
|
||||
## Implementation Steps
|
||||
|
||||
### Step 1: 観測の入口(1箇所)を決める
|
||||
### Step 1: タグ出力を追加(planner採用時のみ)
|
||||
|
||||
推奨:
|
||||
- `src/mir/builder/control_flow/joinir/patterns/router.rs` の “plan 採用ログ” 直前
|
||||
- 理由: `DomainPlan` が確定しており、Pattern2BreakPlan を直接見られる
|
||||
ファイル:
|
||||
- `src/mir/builder/control_flow/plan/single_planner/rules.rs`
|
||||
|
||||
出力フォーマット(安定タグ、strict/dev のみ):
|
||||
- `[plan/pattern2/promotion_hint:<TrimSeg|DigitPos>]`
|
||||
実装位置:
|
||||
- `try_build_domain_plan()` の `if let Some(domain_plan) = plan_opt { ... }` 直前付近
|
||||
|
||||
ガード条件(全部満たすときだけ出す):
|
||||
- `entry.kind` が `RuleKind::Pattern2`
|
||||
- `crate::config::env::joinir_strict_enabled()` が true
|
||||
- `Pattern2LoopBodyLocalFacts` が取れる(planner 由来の promotion か、facts 直抽出)
|
||||
|
||||
出力するタグ(stderr 推奨、1行固定):
|
||||
- TrimSeg: `[plan/pattern2/promotion_hint:TrimSeg]`
|
||||
- DigitPos: `[plan/pattern2/promotion_hint:DigitPos]`
|
||||
|
||||
注意:
|
||||
- `promotion == None` の場合は出力しない(ノイズを増やさない)
|
||||
- `promotion == Some` の場合だけ 1 行(strict/dev のみ)
|
||||
- `trace::trace()` は `filter_noise()` で落ちるので `eprintln!` を使う
|
||||
|
||||
### Step 2: smoke で固定
|
||||
### Step 2: integration smoke をタグ検証に昇格
|
||||
|
||||
対象 fixture(既存を使う):
|
||||
- `apps/tests/phase29ab_pattern2_loopbodylocal_seg_min.hako`(TrimSeg)
|
||||
- `apps/tests/phase29ab_pattern2_loopbodylocal_min.hako`(DigitPos)
|
||||
対象ファイル(既存2本の強化):
|
||||
- `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_seg_min_vm.sh`
|
||||
- `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_min_vm.sh`
|
||||
|
||||
追加 smoke(integration):
|
||||
- `tools/smokes/v2/profiles/integration/apps/phase29ai_pattern2_promotion_hint_seg_vm.sh`
|
||||
- `tools/smokes/v2/profiles/integration/apps/phase29ai_pattern2_promotion_hint_digitpos_vm.sh`
|
||||
変更内容:
|
||||
- 既存の `RC=2`/出力チェックは維持
|
||||
- 追加で `OUTPUT_CLEAN` にタグが含まれることを必須条件にする
|
||||
|
||||
判定:
|
||||
- strict で実行し、stdout にタグが含まれることを確認(exit code は既存の期待を維持)
|
||||
期待:
|
||||
- seg_min: `[plan/pattern2/promotion_hint:TrimSeg]`
|
||||
- digit_pos_min: `[plan/pattern2/promotion_hint:DigitPos]`
|
||||
|
||||
### Step 3: Docs 更新
|
||||
### Step 3: Docs + CURRENT_TASK 更新
|
||||
|
||||
- `docs/development/current/main/phases/phase-29ai/README.md`
|
||||
- `docs/development/current/main/phases/phase-29ai/README.md`(P15 完了、タグ仕様をSSOT化)
|
||||
- `docs/development/current/main/10-Now.md`
|
||||
- `docs/development/current/main/30-Backlog.md`
|
||||
- `CURRENT_TASK.md`
|
||||
|
||||
## Verification (SSOT)
|
||||
|
||||
- `cargo build --release`
|
||||
- `./tools/smokes/v2/run.sh --profile quick`
|
||||
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
- `./tools/smokes/v2/run.sh --profile integration --filter "phase29ai_pattern2_promotion_hint_*"`
|
||||
|
||||
|
||||
@ -91,10 +91,12 @@ Goal: pattern 名による分岐を外部APIから消し、Facts(事実)→
|
||||
- 完了: promotion hint を plan vocab に追加し、planner が facts から hint を付与(legacy は None)
|
||||
- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
## P15: Observe Pattern2 promotion hint(SSOT)
|
||||
## P15: Observe Pattern2 promotion hint (strict/dev)
|
||||
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ai/P15-OBSERVE-PATTERN2-PROMOTION_HINT-INSTRUCTIONS.md`
|
||||
- ねらい: promotion hint の付与を fixture/smoke で観測固定し、次の Plan/Frag 吸収フェーズの前提を固める(仕様不変)
|
||||
- ねらい: strict/dev のときだけ promotion hint を安定タグで観測できるようにする(挙動不変)
|
||||
- 完了: LoopBodyLocal facts が取れたときに `[plan/pattern2/promotion_hint:{TrimSeg|DigitPos}]` を出力し、2 本をタグ検証に昇格
|
||||
- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
## Verification (SSOT)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user