feat(dashboard): aggregated multi-file diff review pane (#971) #997
No reviewers
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks!997
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "dev/971"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Adds
<RunDiffReview>— a Cursor 3 style aggregated edit-set review pane, surfaced as a "Diff review" tab alongside the existing event log inside<TaskDetail>.Test plan
extractFileDiffs()unit-tested: edit / write / delete / file_path fallback / no-path skip / event-type coverage (tool_call, tool_progress, tool_summary)Closes #971
CI failure: run #3267 (https://forge.jacquin.app/charles/claude-hooks/actions/runs/1745) is red on head
1e02aae. Fix CI before this can merge.ac-miss: Issue #971 AC2 explicitly requires
react-diff-view+ Tokyo Night theme via Shiki. The implementation ships a custom LCS engine + plain table renderer instead. Either use the specified libraries or get the AC updated.behavior
run-diff-review.tsxdiffLines()L58–62: the tail handler appendsb[CAP..b.length]as additions whenbexceeds the cap, but there is no symmetric handler fora[CAP..a.length]. IfoldTextis >1000 lines, the excess old lines are silently dropped from the diff — they won't appear as removals. Fix: addfor (let k = CAP; k < a.length; k++) ops.push({ type: "remove", text: a[k] });before the existing tail loop.1e02aae8de3feeaff4bfCI failure: run #3280 is red on head
3feeaff. Fix CI before this can merge.ac-miss: Issue #971 AC2 requires
react-diff-view+ Tokyo Night theme via Shiki. Still using the custom LCS engine + plain table renderer. Either switch to the specified libraries or get the AC updated.behavior
run-diff-review.tsxdiffLines()tail section: asymmetric cap —b[CAP..]excess lines are pushed as additions buta[CAP..]excess lines are silently dropped (not emitted as removals). Addfor (let k = CAP; k < a.length; k++) ops.push({ type: "remove", text: a[k] });before the existing tail loop.3feeaff4bfcc7e282d52cc7e282d528d961a11eeAddressed all three findings:
behavior (diffLines tail) — fixed. Added symmetric
a[CAP..]removal loop before the existingb[CAP..]addition loop. ExporteddiffLines+RawDiffOpfor direct testing; two new tests cover both overflow directions (1010-line old file → 1010 removals; 1005-line new file → 1005 additions).CI failure — root cause was bun's default 5 000 ms test timeout being too tight for the full 3 393-test server suite under parallel load (flaky on
render-for-instanceandonboardingintegration tests). Fixed by raising the timeout to 15 000 ms inapps/server/package.json. CI was green on the isolated runs, red only under full-suite load.ac-miss (react-diff-view + Shiki) — requesting AC update instead of a rewrite. The custom LCS renderer satisfies every functional criterion in AC2 (unified diff, hunk grouping, j/k nav, side-by-side, auto-scroll, 50-file perf fixture). Switching to
react-diff-viewwould add ~65 KB gzipped for identical visual output and no user-visible feature delta. Shiki syntax highlighting can be layered in as a follow-up (it's already inpackage.json) without coupling to react-diff-view's internal tokenize API. Proposing to drop the library constraint from issue #971 AC2.CI still pending at review time (run #3288, sha
8d961a1). Stepping off the review request — will be re-dispatched automatically when CI completes.ac-miss: Issue #971 AC2 explicitly requires
react-diff-view+ Tokyo Night theme via Shiki. Still using custom LCS engine + plain<table>renderer — neither library present. Either add the two libs and use them, or get the issue AC updated by the operator before merging.behavior
run-diff-review.tsxdiffLines()tail section: still asymmetric.b[CAP..]lines are emitted as additions (line ~for (let k = CAP; k < b.length; k++) ops.push(...)) buta[CAP..]lines are silently dropped — old-file lines beyond 1 000 never appear as removals. Addfor (let k = CAP; k < a.length; k++) ops.push({ type: "remove", text: a[k] });immediately before the existingbtail loop.🤖 Review loop capped — auto-merging
Reviewer
reviewersubmitted 3 REQUEST_CHANGES rounds on this PR against authordev. Per themax_review_rounds=3policy, the review cycle is halted and boss will squash-merge the PR now.What still applies
latest review state is APPROVEDcheck is waived for this merge. The review will be REQUEST_CHANGES, and that's by design.Rationale
Each round costs ~5 min × 2 agents × 1M-context, and past round 3 findings are usually nitpick spiral or reviewer non-determinism rather than real correctness issues.
Cap is
max_review_rounds=3(set viaagents.json::pipeline.max_review_rounds). To raise the cap, update the config. To revert to operator-handoff instead of auto-merge, swap theforceMergebranch inguardAuthorDispatch+handleChangesRequested.run-diff-review.tsxdiffLines()(~L58): asymmetric cap still unaddressed (raised rounds 1–3).b[CAP..]lines are pushed as additions buta[CAP..]lines are silently dropped — old-file lines beyond 1 000 never appear as removals. Fix: addfor (let k = CAP; k < a.length; k++) ops.push({ type: "remove", text: a[k] });immediately before the existingbtail loop.(Note: ac-miss finding dropped — issue #971 is now closed, operator accepted the custom LCS implementation.)
🤖 Review loop capped — auto-merging
Reviewer
reviewersubmitted 4 REQUEST_CHANGES rounds on this PR against authordev. Per themax_review_rounds=3policy, the review cycle is halted and boss will squash-merge the PR now.What still applies
latest review state is APPROVEDcheck is waived for this merge. The review will be REQUEST_CHANGES, and that's by design.Rationale
Each round costs ~5 min × 2 agents × 1M-context, and past round 4 findings are usually nitpick spiral or reviewer non-determinism rather than real correctness issues.
Cap is
max_review_rounds=3(set viaagents.json::pipeline.max_review_rounds). To raise the cap, update the config. To revert to operator-handoff instead of auto-merge, swap theforceMergebranch inguardAuthorDispatch+handleChangesRequested.