Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
aa73c1b
board: four gate stories from real gate shapes replace the 86-story g…
m4ttheweric Oct 28, 2026
7de95a9
board: drop the click-to-edit component stories; the gate stories sho…
m4ttheweric Oct 28, 2026
ff23668
board: the review sheet's round heading sits above its tabs
m4ttheweric Oct 28, 2026
399fe60
board: the review round band spans the column, its text in line with …
m4ttheweric Oct 28, 2026
32d4edd
board: re-review threads read as a conversation and reply in the clic…
m4ttheweric Oct 28, 2026
7e118d1
board: respond post replies use the shared thread reply card
m4ttheweric Oct 28, 2026
ae707ad
board: respond sheet takes the review sheet's frame; the post story s…
m4ttheweric Oct 28, 2026
24d4463
board: thread messages sit on one edge with real code blocks; brighte…
m4ttheweric Oct 28, 2026
cef86a2
board: your own message drops its name line; the round rides a badge …
m4ttheweric Oct 28, 2026
4afb17d
board: the re-review list heads its carried threads Earlier threads
m4ttheweric Oct 28, 2026
92525f2
board: the agent's check line carries a label and reads at body contrast
m4ttheweric Oct 28, 2026
184e97c
board: the agent's check reads at full body size and contrast
m4ttheweric Oct 28, 2026
f3b29a9
board: the agent's check is a kit button that opens its note
m4ttheweric Oct 28, 2026
5d5a274
board: the agent's check button takes the outline variant so its tone…
m4ttheweric Oct 28, 2026
2b32966
board: agent check shows a check when verified, a clock when open, an…
m4ttheweric Oct 28, 2026
ec394e7
board: agent check labels read as a pair, Agent verified and Agent fl…
m4ttheweric Oct 28, 2026
6534dfc
board: an open agent check hangs its note from the button on a rule i…
m4ttheweric Oct 28, 2026
2bf36a5
board: agent check note keeps its indent while it animates; flagged c…
m4ttheweric Oct 28, 2026
71c17b4
tui-kit: outline hover washes the tone over transparent, not the page…
m4ttheweric Oct 28, 2026
abb5893
board: the author's reply hangs under the comment on a rounded elbow
m4ttheweric Oct 28, 2026
cfcd63c
board: a thread with no author reply says so in the reply's slot, in …
m4ttheweric Oct 28, 2026
b2c40f3
board: the no-reply line reads in body ink, italic, apart from the fl…
m4ttheweric Oct 28, 2026
4a2a69d
board: the no-reply line takes the purple tone the board names people in
m4ttheweric Oct 28, 2026
146379d
board: the no-reply line takes the crimson text tone
m4ttheweric Oct 28, 2026
0e87ac8
board: the no-reply line softens to a muted crimson at regular weight
m4ttheweric Oct 28, 2026
e5c3546
board: no author reply shows as a kit chip with an alert icon in the …
m4ttheweric Oct 28, 2026
aa2d1eb
board: the agent's verdict gets its own band between the thread and t…
m4ttheweric Oct 28, 2026
312a099
board: the agent's verdict leads the comment area instead of its own …
m4ttheweric Oct 28, 2026
3fd7cce
board: the agent's verdict button is filled in its tone
m4ttheweric Oct 28, 2026
e6e5816
board: only a flagged verdict is filled; a verified one stays outlined
m4ttheweric Oct 28, 2026
a3d1c73
board: add lucide-react; a flagged verdict carries lucide's flag
m4ttheweric Oct 28, 2026
6bf1e2e
board: a finding's code holds its space with a placeholder while it l…
m4ttheweric Oct 28, 2026
3c656da
board story: a review whose code is still loading shows the placeholder
m4ttheweric Oct 28, 2026
5d1ad3c
board: the review findings end on a quiet line with room under it
m4ttheweric Oct 28, 2026
db494ef
board: the end-of-findings line is larger, with a lucide check in an …
m4ttheweric Oct 28, 2026
ef78518
board: both agent verdicts are filled buttons again
m4ttheweric Oct 28, 2026
ccb00d0
board: resolve sits in a footer inside the reply field's box
m4ttheweric Oct 28, 2026
7e61fc8
board: finding heads drop the in-summary chip; the kind pill sits bes…
m4ttheweric Oct 28, 2026
d648de8
board: a reply card's status holds the head's right edge again
m4ttheweric Oct 28, 2026
91a6988
board: accepted pushback gets its own verdict, Agent accepted, in acc…
m4ttheweric Oct 28, 2026
9b76ad4
board: the code bar's finding mark is a labeled kit button, Agent fin…
m4ttheweric Oct 28, 2026
69234de
tui-kit: subtle hover washes the tone over transparent too
m4ttheweric Oct 28, 2026
8a22de9
board: the Agent finding button carries a chevron that turns when it …
m4ttheweric Oct 28, 2026
2a1970d
tui-kit: popovers fade and scale in from the trigger's side, and back…
m4ttheweric Oct 28, 2026
acee39d
board: long code paths shorten from the folders' start; Agent finding…
m4ttheweric Oct 28, 2026
7b4cdb8
board: the Agent finding popover shows the suggested fix under the fi…
m4ttheweric Oct 28, 2026
ea39f8a
board: within each severity, findings on the code come before the one…
m4ttheweric Oct 28, 2026
e3c8ecc
board: finding severity reads a step stronger, 13px semibold with lar…
m4ttheweric Oct 28, 2026
fb4f26a
board: the Report tab opens on the decision context card, which stays…
m4ttheweric Oct 28, 2026
c53a261
board: the Report tab opens on the MR card above the decision context
m4ttheweric Oct 28, 2026
54f1a31
board: review tabs carry icons; the Report tab's MR card takes the ca…
m4ttheweric Oct 28, 2026
042200b
board: the Report tab's icon is a column chart
m4ttheweric Oct 28, 2026
4ab5be4
board: the Report tab's checks get their own card, after the decision…
m4ttheweric Oct 28, 2026
2d3ac77
board: the reply field's resolve footer shrinks to a quiet line
m4ttheweric Oct 28, 2026
67cd9e8
board: the resolve footer's tick sits at the right
m4ttheweric Oct 28, 2026
281a59b
board: the resolve footer's checkbox follows its label
m4ttheweric Oct 28, 2026
40c9c95
board: resolve hangs from the reply field as a small tinted tab at it…
m4ttheweric Oct 28, 2026
6a844f6
board: the resolve tab drops its border and reads by its tint
m4ttheweric Oct 28, 2026
293e6b6
board: the resolve tab gets a little more side padding
m4ttheweric Oct 28, 2026
d516261
board: the resolve tab's label reads in body ink
m4ttheweric Oct 28, 2026
5370b54
board: a ticked resolve tab washes blue
m4ttheweric Oct 28, 2026
2cf5584
board: the resolve tab eases between grey and blue
m4ttheweric Oct 28, 2026
ec5e9f2
board: the resolve tab's color eases over 250ms
m4ttheweric Oct 28, 2026
8762b45
board: the resolve tab's color eases over 200ms
m4ttheweric Oct 28, 2026
c3147fd
board: the resolve tab is one click target with hover and pressed tints
m4ttheweric Oct 28, 2026
0fff152
board: the Click to edit pill opens the field too, and stays up under…
m4ttheweric Oct 28, 2026
77c1414
board: the Click to edit pill deepens on hover and presses in
m4ttheweric Oct 28, 2026
54079dd
board: the Click to edit pill's pressed state keeps its size
m4ttheweric Oct 28, 2026
5ca760e
board: while writing, the helper line and the resolve tab share a row
m4ttheweric Oct 28, 2026
6a1b133
board: the end-of-findings line rises in on scroll and its check spri…
m4ttheweric Oct 28, 2026
dcbb1bf
board: the end-of-findings line shows only when the findings overflow…
m4ttheweric Oct 28, 2026
15322b3
board: the earlier threads' tally lists each status as its card shows…
m4ttheweric Oct 28, 2026
45ddaf7
board: drop the unused prose tally
m4ttheweric Oct 28, 2026
a3d33a6
board: the review comment in the dock is a plain field, white with th…
m4ttheweric Oct 28, 2026
ee2ae88
board: a plan thread's drafted reply is a click-to-edit field; openin…
m4ttheweric Oct 28, 2026
016483b
board: a plan's reply direction reads as a quoted line; picking Reply…
m4ttheweric Oct 28, 2026
f241731
board: respond gates take the review card (B43); shared gate parts un…
m4ttheweric Oct 28, 2026
c9c2133
board: the fix/reply switch is the kit's soft LabeledSeg (B43); post …
m4ttheweric Oct 28, 2026
5bb9530
board: plan thread cards drop the per-thread note (B43)
m4ttheweric Oct 29, 2026
7d80f2a
board: the plan's reply-later placeholder drops its You: line
m4ttheweric Oct 29, 2026
4212964
board: plan reply placeholder copy to ui-copy shape
m4ttheweric Oct 29, 2026
156b058
board: plan reply placeholder reads Drafted at posting
m4ttheweric Oct 29, 2026
de7cf02
board: the respond plan list opens with a line on what the gate decides
m4ttheweric Oct 29, 2026
9c9052d
board: respond gates show Plan / Fix / Post in the round header (B44 …
m4ttheweric Oct 29, 2026
dfc2c84
board: plan reply placeholder hugs its text
m4ttheweric Oct 29, 2026
ba91099
board: plan reply placeholder gets an info tip on when the reply is w…
m4ttheweric Oct 29, 2026
3e8e03a
board: plan info tip uses the pointer cursor
m4ttheweric Oct 29, 2026
1287184
board: plan info tip centres on the placeholder text
m4ttheweric Oct 29, 2026
45e9d0e
board: plan info tip sits 1px lower to meet the text's ink
m4ttheweric Oct 29, 2026
ea34731
board: plan info tip copy
m4ttheweric Oct 29, 2026
44b1947
board: reply elbow follows the field down when editing
m4ttheweric Oct 29, 2026
df57c22
board: reply elbows drop to the control border colour
m4ttheweric Oct 29, 2026
41660cd
board: your reply wears a faint accent wash on the respond gates
m4ttheweric Oct 29, 2026
18de419
board: respond gates end with the review sheet's end-of-list flourish
m4ttheweric Oct 29, 2026
0323c0c
board: more room between the comment and your reply for the edit chip
m4ttheweric Oct 29, 2026
fe93751
board: comment name lines carry a ringed circle invader
m4ttheweric Oct 29, 2026
9a26beb
board: headshot-cropped comment avatars; sheet measure narrows to 1040px
m4ttheweric Oct 29, 2026
4d76c81
board: comment avatar zooms out inside its circle
m4ttheweric Oct 29, 2026
f8f6ea0
board: comment avatar is a rounded square tile with the whole invader
m4ttheweric Oct 29, 2026
c1aefd8
board: comment avatar gets padding inside its tile
m4ttheweric Oct 29, 2026
b1e7eb4
board: comment avatar tile corners tighten to 3px
m4ttheweric Oct 29, 2026
f6984dd
board: comment avatar tile washes in the invader's colour
m4ttheweric Oct 29, 2026
0d8d872
board: click-to-edit chip sits flat on the border, no drop shadow
m4ttheweric Oct 29, 2026
42c0707
board: step track checks off done steps; re-review header shows the r…
m4ttheweric Oct 29, 2026
1207f15
board: current step reads as a you-are-here marker, a haloed dot that…
m4ttheweric Oct 29, 2026
2a56e38
board: re-review round header drops its thread and finding tally
m4ttheweric Oct 29, 2026
a2e86c2
board: review sheet heading reads Review Round N
m4ttheweric Oct 29, 2026
bd6dfe9
board: review timeline groups each round's review and response, with …
m4ttheweric Oct 29, 2026
282231c
board: gate headers carry the B47 timeline: round, the review, then y…
m4ttheweric Oct 29, 2026
48314b2
board: review gate's round chip opens the earlier rounds
m4ttheweric Oct 29, 2026
61bee97
board: respond rounds keep what the reviewer had posted; the respond …
m4ttheweric Oct 29, 2026
420923f
board: the review gate names you by the seat's username when the gate…
m4ttheweric Oct 29, 2026
361be1c
board: gate stories assign roster looks the way the board does
m4ttheweric Oct 29, 2026
df6024d
board: card wells sit a step off the page, your words tint everywhere…
m4ttheweric Oct 29, 2026
50527fc
board: the reply wash stays on replies; a finding's comment is plain …
m4ttheweric Oct 29, 2026
bd1ebde
board: review gate comments and replies open with You and your avatar…
m4ttheweric Oct 29, 2026
10040c1
board: reply cards wash their reply band, GitLab style; the field on …
m4ttheweric Oct 29, 2026
5dc6c20
board: the reply wash moves to a band under the comment; the comment …
m4ttheweric Oct 29, 2026
5f7efec
board: the reply band is the card's grey well, no border
m4ttheweric Oct 29, 2026
8fe7e72
board: the reply band shades more faintly
m4ttheweric Oct 29, 2026
b278a2c
board: reply band a shade darker
m4ttheweric Oct 29, 2026
97f80b1
board: reply band at 5%
m4ttheweric Oct 29, 2026
8c9bbb0
board: reply band back to 3%
m4ttheweric Oct 29, 2026
caefadb
board: reply elbows dim to the border colour
m4ttheweric Oct 29, 2026
318c8a8
board: a field's name line is part of the field: clicking it edits, a…
m4ttheweric Oct 29, 2026
63898d0
board: the reply band leaves room above the field for the edit chip
m4ttheweric Oct 29, 2026
ddb0025
board: the gate pager's chevrons go quiet: subtle, muted, no box
m4ttheweric Oct 29, 2026
4f4a2f9
board: the queue head quiets down (smaller muted title, subtle focus …
m4ttheweric Oct 29, 2026
5613f45
board: focus pane stays subtle but blue
m4ttheweric Oct 29, 2026
62820e4
board: timeline connectors sit 8px clear of each step on both sides
m4ttheweric Oct 29, 2026
60a07ca
board: the current step's dot sits dead centre in its mark
m4ttheweric Oct 29, 2026
5d032eb
board: the queue head is shorter
m4ttheweric Oct 29, 2026
7019ad4
board: the queue's n of n reads smaller
m4ttheweric Oct 29, 2026
8ea8ce7
board: the respond header tolerates an MR with no reviews list
m4ttheweric Oct 29, 2026
8d7b97d
board: the code fold chevron answers hover
m4ttheweric Oct 29, 2026
cca02c4
board: the plan card re-seeds its pick after the dock's reset
m4ttheweric Oct 29, 2026
9e5b052
board: respond sheet tests assert the plan and reply cards
m4ttheweric Oct 29, 2026
69cfd4c
board: respond header tests assert the sheet heading and its timeline
m4ttheweric Oct 29, 2026
7378f5a
board: review sheet tests assert the heading, reply cards and checks …
m4ttheweric Oct 29, 2026
cb307dd
board: layout tests read the plan card and its fix-or-reply switch
m4ttheweric Oct 29, 2026
e2435dd
tui-kit: LabeledSeg renders a ReactNode label
m4ttheweric Oct 29, 2026
5090e53
board: each plan card's fix-or-reply switch is named for its thread
m4ttheweric Oct 29, 2026
3b0895c
daemon: tests for the file-diff reader's bare-name fallback
m4ttheweric Oct 29, 2026
7aa4510
merge main into respond-click-to-edit
m4ttheweric Oct 29, 2026
bb5645a
board: prettier; deck: regenerate the bundled board for the kit's Seg…
m4ttheweric Oct 29, 2026
35cdc30
board: the round band lines up with the 1040px measure; daemon: no ba…
m4ttheweric Oct 29, 2026
2f5ec86
board: a thread the agent recommends skipping opens skipped, not on fix
m4ttheweric Oct 29, 2026
b552b9b
board: an approval counts when the person is among the MR's approvers…
m4ttheweric Oct 29, 2026
793905c
board: a respond gate's round and history come from that person's own…
m4ttheweric Oct 29, 2026
5e4c348
board: delete the composer, field tabs and strip outcome the redesign…
m4ttheweric Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions apps/board/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@ resolves run to MR in the background; the request path never waits on it).

## Seeing every face

`bun run storybook` from the repo root, then `Gates/Board/Gallery`: one
story per gate kind and variant, built from real gate shapes with invented
data (`gate-gallery.fixtures.ts`). Add a story when you add a gate kind or
variant, with invented names only (the repo is public).
`bun run storybook` from the repo root, then `Gates/Board`: four stories
(review first round, review re-review, respond plan, respond post), each
rebuilt from a real gate's shape with invented data
(`gate-stories.fixtures.ts`). Keep it to gates a real run asks; a variant
belongs in a DOM test, not a new story. Invented names only (the repo is
public).

## Respond rounds

Expand Down
1 change: 1 addition & 0 deletions apps/board/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"@mattstack/tui-kit": "workspace:*",
"@pierre/diffs": "catalog:",
"invadrs": "^1.3.1",
"lucide-react": "catalog:",
"motion": "14.2.0",
"pngjs": "^7.0.0",
"react": "catalog:",
Expand Down
52 changes: 52 additions & 0 deletions apps/board/src/__tests__/respond-rounds.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import {
attachRespondRounds,
deleteRespondRound,
readRespondOutcomes,
readRespondRounds,
recordRespondRound,
reviewerOutcome,
} from '../respond-rounds.ts';
import { openStateDb } from '../state/db.ts';

Expand All @@ -31,6 +33,21 @@ describe('respond rounds', () => {
expect(recordRespondRound(URL_A, 'john', 2, db)).toBe(2);
});

test('outcomes come back in round order, null where none was recorded', () => {
recordRespondRound(URL_A, 'john', 1, db);
recordRespondRound(URL_A, 'john', 2, db, 'comment');
recordRespondRound(URL_A, 'john', 3, db, 'approve');
const out = readRespondOutcomes(db);
expect(out.get(URL_A)).toEqual({ john: [null, 'comment', 'approve'] });
expect(
attachRespondRounds([{ webUrl: URL_A }], readRespondRounds(db), out)[0]
).toEqual({
webUrl: URL_A,
respondRounds: { john: 3 },
respondOutcomes: { john: [null, 'comment', 'approve'] },
});
});

test('rounds are per person', () => {
recordRespondRound(URL_A, 'john', 1, db);
recordRespondRound(URL_A, 'john', 2, db);
Expand Down Expand Up @@ -71,3 +88,38 @@ describe('respond rounds', () => {
expect(out[2]).toBe(none);
});
});

describe('the outcome a response round records', () => {
const reviews = (r: object) => ({
reviews: { approvedBy: [], reviewers: [], ...r },
});
test('an approver who was never an assigned reviewer approved', () => {
expect(
reviewerOutcome(
reviews({ approvedBy: [{ username: 'renee' }] }) as never,
'renee'
)
).toBe('approve');
});
test('an assigned reviewer whose state reads approved approved', () => {
expect(
reviewerOutcome(
reviews({
reviewers: [{ username: 'renee', reviewState: 'APPROVED' }],
}) as never,
'renee'
)
).toBe('approve');
});
test('anyone else commented', () => {
expect(
reviewerOutcome(
reviews({
reviewers: [{ username: 'renee', reviewState: 'REVIEWED' }],
}) as never,
'renee'
)
).toBe('comment');
expect(reviewerOutcome(undefined, 'renee')).toBe('comment');
});
});
2 changes: 1 addition & 1 deletion apps/board/src/__tests__/state-db.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ describe('state db', () => {
expect(again.query('SELECT COUNT(*) AS n FROM agent_states').get()).toEqual(
{ n: 1 }
);
expect(SCHEMA_VERSION).toBe(5);
expect(SCHEMA_VERSION).toBe(6);
});

test('v5 adds respond_rounds, and a v4 db upgrades in place with its rows intact', () => {
Expand Down
1 change: 1 addition & 0 deletions apps/board/src/client/board/Board.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2161,6 +2161,7 @@ export function Board() {
onAnswered={retireActiveGate}
onContinue={retireActiveGate}
onLostChange={lost => queue.hold(lost ? activeGateId : null)}
self={seat}
readOnly={gateReadOnlyReason(
queue.active.gate,
queue.active.mr,
Expand Down
Loading
Loading