- u1 FramePanel.tsx: extract `applyFrameSelection(candidate, onFrameSelect)`
pure helper; collapse `handleFrameSelect` to direct onFrameSelect for every
V4 label; drop `window.confirm` reject popup (IMP-47B u11 regression noise
per `feedback_auto_pipeline_first`). New vitest pin `imp84_framepanel_reject_silent.test.ts`
covers helper invocation across all 4 V4 labels + source-presence pins.
- u2 templates/phase_z2/slide_base.html: delete `.zone--provisional` CSS,
`.zone__needs-adaptation-badge` CSS, the zone--provisional class fragment
in the zone div, and the badge `<span>` render at the provisional zone.
Preserve `data-provisional="1"` attribute as silent telemetry. New pytest
`tests/phase_z2/test_imp84_provisional_silent_render.py` pins the silent
contract independently of the IMP-30 first-render file.
- u3 tests/test_phase_z2_imp30_first_render.py: invert the three IMP-30 u5
positive provisional-visual assertions to IMP-84 silent-contract negatives
(no class, no badge, no CSS selectors); preserve positive `data-provisional`
telemetry assertions. Docstrings updated to IMP-84 silent contract.
Out of scope (Round #4 + #92 contract): Home.tsx `toast.error(aiReviewMsg)`
call line, designAgentApi.ts `api_error_kinds`/`api_error_kind` schema and
operational-only formatter, FramePanel reject badge/tooltip read-only labels
(L102/L147/L156), and backend `zone.provisional` flag emission.
Stage 4 PASS: u1 vitest 10/10, u2 pytest 5/5, u3 pytest 29/29 (incl. 3
IMP-84 inverted assertions: `test_imp84_provisional_zone_silent_no_class_no_badge`,
`test_imp84_provisional_badge_never_rendered_in_mixed_zones`,
`test_imp84_slide_base_css_strips_provisional_visual_selectors`).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EMPTY_SHELL_NO_CONTENT overall enum + 3-marker detection (frame_template_id="__empty__"
OR label="empty_shell" OR merge_type="empty_shell") routes empty-placeholder-only
slides to BLOCKED CLI exit 1 + red final_status.html, blocking fake PASS reports
(feedback_artifact_status_naming). Coverage accounting split: legacy covered_section_ids
preserved + new content_rendered_section_ids / empty_shell_section_ids. mdx05 Case B
(zero V4 evidence) honestly classified instead of synthesizing fabricated rank-1 reject
frames. IMP-30 u6/u7 stale empty-shell PASS assertions inverted (29 tests). IMP-85 smoke
parametrize: mdx05 removed from exit-0 list + dedicated BLOCKED exit test added (4 tests).
No production behavior change for chain_exhausted Case A; no AI route activation; no
mdx-id hardcoding. 53 targeted + 76 adjacent Phase Z tests PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>