fix(visuals): stop silently missing UI changes (chat flow, gap warning, param-route guard) - #185
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…nges When changed UI files map to no story/route/flow, the capture set now falls back to home AND records fallbackUsed + unmappedFiles. The PR comment renders a loud [!WARNING] listing the unmapped files instead of the misleading 'No visual differences detected' that hid PR #174's chat redesign. Threaded through capture-set -> capture -> diff -> comment. (exploration 0200, Option C) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Option A: add a 'chat' interaction flow (seed a channel, post messages, react, open a thread) mapping apps/web/src/comms/** -> the redesigned /channel/$channelId surface that no static route shot could reach. PR #174's diff now resolves to this flow instead of the silent home fallback. Option B: extend manifest-coverage.test.mjs to require every parameterized route be flow-covered or listed in PARAM_EXEMPT with a reason (+ a stale-exempt guard). This closes the 0191 drift-guard hole that skipped $-routes -- the exact gap chat fell through. channel is covered by the chat flow; 8 others are exempted as TODOs. Option D: add PresenceDot + ReactionBar stories so the chat primitives get a stable, seed-free baseline captured by the co-location rule. Docs: README tuning notes for parameterized routes + the gap warning; check off exploration 0200 ([_] -> [x]). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Contributor
|
✓ Changelog fragment found — thanks! |
Contributor
🖼️ UI changes in this PRComponentsInteractionsAuto-captured by CI · run. Informational — not a blocking check. |
Contributor
|
Preview removed for PR #185. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.





Why
Our Visual UI Capture system silently misses big UI changes. The trigger: PR #174 rewrote the entire chat layer (2,364 lines under
apps/web/src/comms/) and its capture comment read "No visual differences detected in the changed UI." — the absence of change reported for one of the largest UI changes in the project.Root cause (full write-up in exploration 0200): capture targets come from a hand-curated allowlist of param-free routes + co-located stories. Chat matched none — no story, no route glob, and it only renders at the parameterized
/channel/$channelIdroute (needs an id + seed data, so the static-route capturer can't reach it).computeCaptureSetthen fell back to capturinghome, which diffs clean, so the comment said "no differences." A coverage gap was made indistinguishable from a no-op. The 0191 drift-guard that was meant to catch this explicitly skips$-routes, the exact place chat lives.What this does
C — make misses loud (keystone). When changed UI files map to no story/route/flow,
computeCaptureSetnow recordsfallbackUsed+unmappedFiles(threaded capture-set → capture → diff → comment). The PR comment renders a> [!WARNING]listing the unmapped files instead of "No visual differences detected." This converts every future silent miss into an actionable nudge.A —
chatflow. A new interaction flow seeds a channel, posts messages, reacts, and opens a thread — recording the redesigned/channel/$channelIdsurface. Mapsapps/web/src/comms/**, so a chat-only PR like #174 now resolves to this flow.B — close the drift-guard hole.
manifest-coverage.test.mjsnow requires every parameterized route to be flow-covered or listed inPARAM_EXEMPTwith a reason (+ a stale-exempt guard).channelis covered by the chat flow; 8 others are exempted as explicit TODOs.D — chat primitive stories.
PresenceDot+ReactionBarstories give the pipeline a stable, seed-free baseline captured by the co-location rule. (MessageRowis router/hook-coupled — not a stable isolated story; deferred.)Verification
{ flows: ['chat'], fallbackUsed: false }— maps to the chat flow, not the silent home fallback.fallbackUsed: trueandcomment.mjsrenders the[!WARNING]block listing it.channel.$channelIduncovered (would go red).pnpm test:visualsgreen (27 tests);xnet-webtypecheck clean; eslint + prettier clean; Storybook builds and indexes all 4 new comms stories.visual-captureworkflow on this PR (it touchesapps/web/src/comms/**) will run the newchatflow and post the GIF — the live validation of Option A.🤖 Generated with Claude Code