feat(web): surface resolution reasons and parent summary (CRU-129) - #374
Merged
Conversation
Phase 1 UI for the review round-trip feature — renders the resolution metadata that CRU-128 landed on the backend. - Parent's response block renders inside each persona card in the feedback panel and in the persona review summary panel/sheet when persona_review_resolutions has a summary. - Feedback items display their resolution_reason inline (compact italic under description in the list, full block in the detail and mobile sheet) plus a short commit SHA when present. - Manual Ignore is now an inline reason prompt instead of an implicit "User's choice" placeholder — the reason is required before the item can be resolved. - PersonaAgentRow shows "Resolution submitted" in place of the verdict label once the parent has submitted a resolution. - The agent query now includes the latest review resolution in the review subquery so the UI can read it without an extra fetch; FeedbackItem type gains resolutionReason / commit / resolvedAt to match the CRU-128 feedback payload. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Addresses findings from frontend-ux-review on PR #374. - IgnoreReasonInput: stopPropagation on Enter/Escape so the outer detail-panel / Sheet Esc handler doesn't also fire and close the whole panel (high). - Parent's response compact block: render with <Markdown> instead of a plain div so formatting (lists, code, bold) matches the full ReviewSummaryPanel/Mobile sheet views (medium). - IgnoreReasonInput default size bumped to h-11 for touch targets on the mobile sheet (medium). - Compact list resolution_reason gated on !isActionable so a reopened item no longer shows stale ignored reasoning while the detail panel hides it (low). - FeedbackDetailPanel + MobileFeedbackSheet disable prev/next/close while the inline ignore input is mounted, preventing silent loss of typed reason; Sheet overlay/Esc close path is also blocked while ignoring (low). - PersonaAgentRow "Resolution submitted" branch dropped the redundant (hasSummary || resolution?.summary) check — hasResolution already implies a summary (low). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
selfcontained
marked this pull request as ready for review
April 22, 2026 16:22
…U-129)
Replaces the separate verdict chip / "Resolution submitted" label with
a single two-step pill that shows the reviewer's verdict and the
parent-response state as a connected progression.
- State 2 (awaiting parent): filled verdict step + hollow muted step
joined by a dashed connector → clear "your turn" signal.
- State 3 (parent responded): both steps filled + solid connector →
round 1 complete.
- Stepper is pure presentation taking step primitives; a
`stepsFromReview` helper derives the Phase 1 steps from review +
resolution. Phase 2 can add a second deriver for recheck rounds
(stepper already accepts an R{n} round badge via the `round` prop).
- Inline "Parent's response" block removed from the sidebar persona
card — the parent summary now lives only in the Review Summary
panel / sheet, alongside the reviewer's summary, so both the verdict
and response open the same detail pane.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3 tasks
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.
Summary
Phase 1 UI for the review round-trip feature — renders the resolution metadata that CRU-128 landed on the backend.
resolution_reasonrender the reason inline (compact italic under description in the list; full block in the detail/mobile panels) plus a short commit SHA fromresolution_commitwhen present."User's choice"placeholder that CRU-128 shipped as a stopgap. Reason is required before the item can be resolved.persona_review_resolutionshas a summary for the review.PersonaAgentRowshows "Resolution submitted" in place of the verdict label once the parent has submitted a resolution.FeedbackItemgainsresolutionReason/resolutionCommit/resolvedAtto match CRU-128's payload.Linear: https://linear.app/crumbstream/issue/CRU-129
Test plan
pnpm run check(backend + web tsc)pnpm run finalize:web(web tsc + vite build)pnpm run test(server vitest + web vitest)pnpm run test:e2e(Playwright — 138 passed)resolution_reason