4.1 KiB
spec, created, status
| spec | created | status |
|---|---|---|
| docs/specs/ui/requirements/walkthrough-feedback-controls.md | 2026-08-03 | done |
Fix Plan: Walkthrough Feedback Controls
Root cause
WalkthroughStepInner always passes onCancel={() => {}} to CommentForm.
CommentForm always renders a Cancel button and routes clicks and Escape to
that callback. The walkthrough note form has no temporary editing or disclosure
state, so the callback is intentionally empty and the rendered control cannot
produce an observable result.
Overview
Represent cancellation as an optional CommentForm capability. Render the
button and handle Escape only when a caller provides a cancellation callback,
then omit the no-op callback from the walkthrough note form. Existing diff and
editor comment call sites continue to provide their real callbacks.
Frontend
Shared comment form capability
apps/web/components/diff/comment-form.tsx— makeonCanceloptional, render the secondary Cancel action only when it exists, and only consume Escape when cancellation is available.apps/web/components/diff/walkthrough-step-card.tsx— remove the no-op callback from the persistent walkthrough note form. Keep Add, Run, close, discard, and navigation behavior unchanged.
Mobile parity
- Nearest exemplar: the existing
WalkthroughFloatingWindowphone bottom sheet remains the shipped mobile surface. - Presentation: no composition, navigation, scroll ownership, safe-area, or touch-target behavior changes. The inert secondary action disappears while Add and Run remain in the existing action row.
- Shared behavior: desktop floating, mobile bottom-sheet, and inline
walkthrough variants continue to share
WalkthroughStepInnerand its note handlers. - Rendered proof: the focused Pixel 5 walkthrough E2E asserts that the bottom sheet has no Cancel action while retaining the note actions.
Tests
This is rendered UI behavior with no new pure logic. Per frontend testing
conventions, use Playwright rather than adding a React component test.
pnpm run typecheck verifies that all cancellable CommentForm consumers still
provide valid callbacks after the prop contract changes. Runtime cancellation
in those unchanged consumers and the legacy inline walkthrough are outside this
fix's acceptance scope.
E2E Tests
- Scenario: desktop walkthrough note controls. File:
apps/web/e2e/tests/review/walkthrough.spec.ts. Proof: extend the existing ask-box test to assert that Cancel is absent before proving Add and Run still work. - Scenario: phone walkthrough note controls. File:
apps/web/e2e/tests/review/mobile-walkthrough.spec.ts. Proof: extend the existing bottom-sheet test to assert that Cancel is absent and Add and Run remain rendered inside the mobile surface.
Verification Results
- RED: the focused desktop and mobile tests each failed on the new absence
assertion with
Expected: 0, Received: 1while the inert button remained. - GREEN: the focused Chromium desktop and
mobile-chrometests each passed one intended test; desktop and mobile screenshots confirmed Add and Run remain visible without Cancel. - Structural inspection confirmed the legacy inline walkthrough shares
WalkthroughStepInner, and existing cancellableCommentFormconsumers still provide callbacks; neither path received separate runtime coverage. pnpm run typecheckandpnpm run i18n:ratchetpassed.- The managed E2E commands exited cleanly, and no matching E2E, Playwright, or Vite process remained afterward.
Implementation Wave
- Remove inert walkthrough Cancel — done, sequential.
Risks
- Making cancellation optional must not hide Cancel from existing diff or editor comment forms whose callbacks dismiss or exit editing.
- Escape must remain functional for cancellable forms while no longer being intercepted by the non-cancellable walkthrough note form.
Out of scope
- Refactoring other comment form actions or translating untouched copy.
- Changing walkthrough layout, navigation, persistence, or delivery behavior.