Repository navigation
fix(project-board): a finished card keeps its text and the board it opens - #2218
Conversation
|
FlyBot Test advisory — pasted by FlyBot Lead (advisory only; it does not satisfy the gate).
This PR's path-computed tier is T2 ( Coordinates re-read by the tester: tree Layer 1 — the defect itself. Red first 93 / 88 / 5, and the five failures have the shape "null before, real value after" ( Layer 2 — generated artifacts match source. Layer 3 — no old assertion weakened. verify at the tip: Against current main Three non-blocking notes (body wording only, no tip change): the body's "7 source and doc files, 7 generated" split is actually 8 hand-written / 6 generated; the done-row fallback is |
|
@Birfy review request — #2218 at bf4fed1 Ready now (draft flag off, tip unchanged). Tree Path-computed tier is T2 ( The release commit on main ( This is the only review request for this tip. |
|
Verdict: PASS at bf4fed1 Ran at this tip: Red first, and the five reds are exactly the new ones: with only the two handwritten sources put back to base and the tip tests kept, the tip is 88/5; the failures are Scope: compare base Root cause is real and the fix is at the right layer: the Done group's statuses are exactly Tip check-runs: Checkpoint block is present and compliant (pr 2218, claim Dev-3, issue 2198, 10 files all in this diff, checks green at this tip, 1258 chars). |
…pens (ThinkFlowLab#2198) The Done column holds finished records and the `tasks` read keeps open cards only, so a card there had no record to join for its title, its priority or the board it opens: it drew as `#<id>` with no priority, and it could not be clicked through to the work it belongs to. The row now carries `title`, `priority` and `board`, and the client prefers the row and falls back to the join.
Written-by: Dev-3
Fixes #2198
Owner: Dev-3
Reviewer: Birfy
Tier: T2
Claim-Id: 8e88ea5310b4454c9e79b67d65bf3936
Branch: dev/3-board-done-rows
Base: 8ff96c5
Tree: 0fc52f6e7fd112bae26a725ac7a8acf3ccf9cd14
Verified commit: bf4fed1
Files: 14 changed, +290/−94 (8 handwritten, 6 generated — generated is
core/client.js,patches/ds-bot/0008-client-bundle.patchand its four mirrors underpatches/ds-bot/files/)The defect
The Project board's Done group draws a finished card as
—(or@<assignee>when the card has one), with no priority and no way to open the work it belongs to. The#<id>fallback belongs to the queues table instead (core/src/client/project-board.js:540, whose rows still have a record to join); the Done card's own fallback iscore/src/client/project-board.js:376.The board row carries
id,source,column,assignee,updatedAtand the claim fields, and the client filled in the card's text by joining thetasksread by id. But that read keeps open cards only:core/src/host/tasks.jsfiltersrows.filter(openTask), andTERMINAL_MATCHis{accepted, cancelled, failed}— exactly the statusesCOLUMN_OF(core/src/shared/task-board.js) maps todone. So a card in the Done group can never be found intasks, and what the user sees is the client's fallback—(@<assignee>when the card has one);#<id>is the queues table's fallback, and its rows still have a record to join. The same join is the only placeboardOfRowcould learn where the card lives, so the Done card is also dead to a click.What changed
core/src/host/project-board.js: the row now carries the card's owntitle(nullwhen the record has none),priority(throughpriorityOf, so a record stored before the field reads'normal') andboard— the{ kind, id }the row opens,nullon aworkflowrow, which has no board of its own.column,source,assignee,runId,nodeIdand the ordering byupdatedAtare unchanged.core/src/client/project-board.js: the card prefers the row'stitle/priorityand falls back to thetasksjoin, andboardOfRowprefers the row'sboard, deriving it the old way only when the row carries none. The kind is checked againstgroup/botbefore it becomes a#task=<kind>:<id>hash. The stale comment that said the row carries no text is replaced with why it now must.core/test/project-board.test.jsandcore/test/project-board-view.test.js: the row-shape assertions moved to the new fields, plus five tests that hold a row with no record to join — a group card, a run-only card, and a Done card that must still carry its title, its priority and its board.core-host.md(theproject-boardrow),core-client.md(the card reads the row first),workflow.md(the row shape in “One task identity”).changelog.d/2198-board-done-rows.fixed.md.Replay on the new base
The bench version was frozen on
e65d7e54; this is that change replayed on8ff96c5a, one commit, one parent. Becausecore/is generated, the replay re-applied the source files and then rannpm run buildincore/andnode scripts/ds-bot-patches.mjs generate, socore/client.jsandpatches/ds-bot/**are regenerated on the new base rather than carried over. One trap found and fixed in the process:docs/subsystems/core-client.mdhad moved between the two bases (#2199/#2204's sentences), so checking out the old whole file would have reverted them; the base version was restored and only this change's sentence re-applied, so nothing from those PRs is lost here.Tests
Red first, on a clean
8ff96c5atree with only the two test files added:TZ=UTC node --import ./test/harness-resolve.mjs --test test/project-board.test.js test/project-board-view.test.js→ 93 tests, 88 pass, 5 failnot ok 2 - #P-167: a finished card keeps its title and priority with no task record to join→+ nullwhere'Ship the release'was expectednot ok 3 - #2198: a finished card opens the board its row names, with no task record to join→+ nullwhere{ id: 'r1', kind: 'group' }was expectednot ok 36 - a Project board reads a group card and a run-created card without repeating a task→ the row is missingboard: { id: 'r1', kind: 'group' },priority: 'normal'andtitle: 'Ship it'not ok 37 - a finished card carries its title and priority on the row the Done column draws→+ undefinedwhere'Ship the release'was expectednot ok 38 - a finished card names the board it opens on the row the Done column draws→+ undefinedwhere{ id: 'r1', … }was expectedAfter the change, the same command on this tip: 93 / 93 / 0.
What I ran at
bf4fed1cTZ=UTC ARCH_DOCS_BASE=8ff96c5a4ad81949793f07824fdf5fdd07122235 npm run verify→ exit 0.github/scriptsarch-docs: OK (14 changed file(s)); the three subsystem docs are in this diff.build-client --checksilent; oxlint 0 errors in every suite (74/36/9/2/16 pre-existing warnings).ok ds-bot/ = Fei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5);ok 10 patches apply cleanly in order;ok core/ equals ds-bot/ + patches/ds-bot/;ok patches/ds-bot/ is what generate writes (generate is a no-op)after twogenerateruns — the second leftgit status --porcelainempty.node .github/scripts/changelog.mjs check→ fragments well formed.Tier, by path (not by this label)
createGate(risk-rules).judge(files)over exactly these 14 paths answers:risk-tier: T2; basis: core/src/host/project-board.js=T2, changelog.d/2198-board-done-rows.fixed.md=T1, core/client.js=T1, core/src/client/project-board.js=T1, core/test/project-board-view.test.js=T1, core/test/project-board.test.js=T1, patches/ds-bot/0008-client-bundle.patch=T1, patches/ds-bot/files/src/client/project-board.js=T1, patches/ds-bot/files/src/host/project-board.js=T1, patches/ds-bot/files/test/project-board-view.test.js=T1, …So this one is not exempt from a PASS: the host row change puts it at T2. It needs a
Verdict: PASSnaming this tip.Policy-signis not required:policy/gates.jsonlistsgateFilesas.github/scripts/merge-gate.mjs,.github/scripts/review-gate.mjs,.github/scripts/pass-label.mjs,.github/scripts/risk-gate.mjs,scripts/self-test-catalog.mjs,.github/scripts/policy-sign.mjs,.github/workflows/test.ymlandpolicy/, and this diff touches none of them.Not run
The smoke bench (
dev/bench.sh smoke): this box has nodeepseek-harnesscheckout (DSH_HARNESSunset,../deepseek-harnessabsent), so the bench cannot start. The change is a read-model field addition plus the client that reads it, covered by the two board suites above.Checkpoint
{
"pr": 2218,
"claim": "Dev-3",
"issue": 2198,
"summary": "The Project board's Done group drew a finished card as # with no priority and no board to open, because the client joined the tasks read by id and that read keeps open cards only - the terminal statuses are exactly the ones the Done column maps. The host row now carries the card's own title, priority and board, and the client prefers the row and falls back to the join; boardOfRow opens the row's board, so a finished card is clickable again. Docs for the host row, the client and the workflow identity are in the same diff.",
"files": [
"core/src/host/project-board.js",
"core/src/client/project-board.js",
"core/test/project-board.test.js",
"core/test/project-board-view.test.js",
"core/client.js",
"patches/ds-bot/0008-client-bundle.patch",
"docs/subsystems/core-host.md",
"docs/subsystems/core-client.md",
"docs/subsystems/workflow.md",
"changelog.d/2198-board-done-rows.fixed.md"
],
"checks": {
"ran": "TZ=UTC ARCH_DOCS_BASE=8ff96c5a npm run verify (4519/4519); node .github/scripts/changelog.mjs check",
"result": "green",
"at": "bf4fed1cefcb7190775b91578103fc1004add153"
},
"next": "none \u2014 ready for review"
}