- 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>