Frame-aware AI fallback module scaffolded under src/phase_z2_ai_fallback/ with master flag ai_fallback_enabled=False; normal-path AI call count remains 0. AI output constrained to builder_options_patch / partial_overrides / slot_mapping_proposal; MDX / frame_id / raw HTML / raw CSS mutations rejected at schema layer. IMP-46 cache gate (cache.py) raises AiFallbackCacheGateError unless visual_check_passed AND user_approved. Step 12 wires AI repair after IMP-30 provisional payload only; Step 17 stays blocked behind IMP-34 / IMP-35 prerequisites. AST isolation guard forbids fallback package from importing Phase Q / Kei / pipeline runtime symbols. Docs IMP-17 / IMP-31 bound to runtime module surface via 11-row structural test pin (test_docs_sync.py) so drift fails CI. Tests: 116 fallback / 161 phase_z2 regression / 526 scoped full sweep all passing. Existing pre-IMP-33 fixture issue in scripts/test_phase_t_* remains untouched (out of scope). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.0 KiB
IMP-31 — AI-assisted frame-aware adaptation activation gate audit
Status: design-only audit. IMP-31 (#40) = IMP-17 carve-out activation tracking issue. No new design slot. No runtime AI code lands until the 3-condition AND gate clears.
Source
- Gitea issue #40 IMP-31 — AI-assisted frame-aware adaptation (restructure / reject routes).
- Carve-out boundary spec:
IMP-17-CARVE-OUT.md(allowed / forbidden / activation gate). - Backlog row:
PHASE-Z-IMPLEMENTATION-ISSUE-BACKLOG.md:68 (IMP-17 — carve-out, normal path 밖, soft link IMP-04 + IMP-05). - Stage 1 / Stage 2 exit reports:
.orchestrator/issues/40_stage_problem-review_exit.md(Stage 1 binding contract).
Issue-body anchor drift (axis C1)
Issue body cites src/phase_z2_pipeline.py:452 for IMP-05 L5 _imp05_route_hint(). Current anchor surface (commit 1efbf67):
:570— conceptual comment ("restructure → AI-assisted frame-aware adaptation (deferred to IMP-17 …)").:572—_IMP05_ROUTE_HINTS: dict[str, str] = {declaration.:575—"restructure": "ai_adaptation_required"entry.:580—def _imp05_route_hint(label: Optional[str]) -> Optional[str]:.:664—"route_hint": _imp05_route_hint(match.label)candidate_evidence emission.
Anchor pin: tests/orchestrator_unit/test_imp17_comment_anchor.py. Synced in IMP-17-CARVE-OUT.md:10 (Stage 3 u1).
3-condition AND gate state (this cycle)
| # | Condition | State | Evidence |
|---|---|---|---|
| 1 | User GO — explicit activation request | NOT CLEAR | No axis activation directive in #40. Stage 1 root_cause: runtime consumer = 0. |
| 2 | B4 frame_selection evidence integration complete | NOT CLEAR (⚠ partial) | PHASE-Z-PIPELINE-STATUS-BOARD.md:48 Step 9 ⚠ partial; :82 "B4 frame_selection 의 V4 evidence 미통합"; :126 (j) ❌ pending. |
| 3 | IMP-04 catalog expansion + IMP-05 V4 fallback live | AMBIGUOUS | templates/phase_z2/catalog/frame_contracts.yaml = 11 template_id: entries vs 32 target. IMP-05 V4 rank-2/3 fallback selector logic live, but catalog coverage gates real semantics. |
Verdict: gate NOT CLEAR. Runtime AI adaptation remains gated. src/phase_z2_ai_fallback/ = scaffolded under IMP-33 (#61, Stage 3 u1~u11); module created, but settings.ai_fallback_enabled defaults to False (u1) so normal-path AI call count remains 0 (PZ-1). Runtime engagement still requires the 3-condition AND gate above.
Issue-body axis verdict
| Axis | Issue-body line | Verdict | Binding boundary |
|---|---|---|---|
| A1 | restructure → ai_adaptation_required actual adaptation route | gate-blocked | Allowed only inside IMP-17-CARVE-OUT.md Step 12 fallback path; runtime AI consumer not added this cycle. |
| A2 | reject → design_reference_only | gate-blocked + frontend ownership | Reject route = design reference only. Frontend zone-level override remains IMP-29 scope (PHASE-Z-PIPELINE-OVERVIEW.md Step 12). |
| A3 | AI call provider | Anthropic API only | Kei API / EDITOR_PROMPT / Kei-API endpoint forbidden (Phase Q Kei persona 영구 단절 — IMP-17-CARVE-OUT.md §"AI 격리 + Kei persona 단절 contract"). |
| A4 | candidate_evidence[].route_hint | live (deterministic emission) | Emission anchored at src/phase_z2_pipeline.py:570/:572/:575/:580/:664; AI consumer deferred. Anchor pin: tests/orchestrator_unit/test_imp17_comment_anchor.py. |
| A5 | MDX content preservation = strict | locked | No invent / rewrite / compress / summarize (IMP-17-CARVE-OUT.md §Forbidden; memory feedback_phase_z_spacing_direction). |
| A6 | AI prompt = frame-aware placement only, not "rewrite content" | locked | Output = content_object → Internal Region / Frame Slot placement proposal at content-object granularity (IMP-17-CARVE-OUT.md §Allowed). HTML / CSS / layout / zone topology / frame selection X. |
| A7 | popup / details / zone-resize routing when content cannot fit | deferred to Step 17 fallback | Deterministic actions exhausted (zone_ratio_retry / layout_adjust / frame_reselect / details_popup_escalation / image_fit_candidate / frame_internal_fit_candidate) before AI proposal (IMP-17-CARVE-OUT.md §Allowed Step 16/17). |
| A8 | no calculate_fit migration |
locked | IMP-05 selector uses V4 labels + frame-contract presence + Phase Z capacity precheck only (src/phase_z2_pipeline.py:587 lookup_v4_match_with_fallback declaration; :599 docstring "it does not call calculate_fit"; secondary anchors :3093 / :4871). |
| C1 | Anchor drift :452 → current |
synced | Stage 3 u1 — IMP-17-CARVE-OUT.md:10. |
| C2 | Backlog + status-board cross-ref | planned (u3) | Cross-ref discoverability surfaces only; no verdict duplication. |
Out of scope (this cycle)
Runtime AI consumer enablement (flag default OFF), candidate_evidence schema change, Phase Q file mutation, Kei API reuse, frontend zone override (IMP-29 scope), IMP-30 invariant change, calculate_fit migration. Note: src/phase_z2_ai_fallback/ directory scaffold itself was created under IMP-33 (#61, Stage 3 u1~u11) — see IMP-17-CARVE-OUT.md §"Runtime module surface".
Future activation path
When the 3-condition AND gate clears (User GO ∧ B4 V4 evidence integrated ∧ catalog 32/32 + IMP-05 V4 fallback live):
- Runtime AI module path =
src/phase_z2_ai_fallback/(scaffolded under IMP-33; flag default OFF until gate clears). - Provider = Anthropic API only. Prompt design starts fresh (no Phase Q
EDITOR_PROMPTimport). - Output granularity = content_object → Internal Region / Frame Slot placement proposal. Frame / layout / zone topology selection remains deterministic.
- Activation tracker = this issue (#40, IMP-31). No new IMP ID issued.