You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Project board paints every finished card as a row: a Project with history opens on 191 已完成 #1855
Reported by the owner on 2026-10-30 on v0.2.17: the Project board is "a wall of 已完成". Finished cards are painted as rows, so a Project with months of history shows its whole archive instead of the work in flight.
What happens
Host read at 2026-10-30T16:39Z for project-1fe64499 ("FlyBot 开发"): project-board returned 200 rows, 191 of them done. In state.json those 191 cards are terminal records (status: accepted); only 9 are working. The client paints every returned row, so the board opens on 191 finished cards.
Root cause
host: core/src/host/project-board.jsprojectBoard() walks every card in state.tasks, keeps the ones the caller may see and whose board (or workflow run) names this Project, and returns all of them regardless of column. counts.done is computed from the same list, and #1829's metrics read the same rows.
client: core/src/client/project-board.jsProjectBoardRows renders view.groups[].rows with no column filter (:211 builds the groups, :253 paints them), so 191 finished cards become 191 rows.
The board's own spec (#1829) is "下面是正在做的 task 列表" — finished work belongs in the header count, not in rows.
Fix
host: keep the counts and the metrics exactly as they are, but return only non-terminal cards in tasks (the rows). A finished card stops being a row; counts.done still counts the Project's finished cards.
client: no done rows are painted; the header keeps Done: <count>. The row shape, the ordering and the data-column values of the remaining rows do not change.
tests: extend core/test/project-board*.test.js (and its mirror, if the file is mirrored) with
a board of 200 cards where 191 are done returns 9 rows and counts.done: 191;
a card that turns done leaves tasks and raises counts.done by one;
a card that is rework/blocked/waiting is still a row (nothing but done is filtered).
npm run build in core/; npm run verify with TZ=UTC green at the tip.
Acceptance
On the live Project the board shows 9 rows and Done: 191 (not 191 rows).
The queue groups (Waiting / In flight / Blocked) are unchanged.
The metrics block is unchanged.
Fixes #<this> in the PR body, plus Owner: / Reviewer: lines and a ## Checkpoint block.
Not in this slice
Today's finished work is not listed either — the header count is the whole answer. If the owner wants a collapsed "done today" group later, that is its own slice.
Owner decision (2026-10-30, in the project room "FlyBot 开发 · 项目代理"): "已完成的task都放在同一组里面,折叠起来".
Finished cards are kept, but all of them go into one group that is collapsed by default. This supersedes this body's "Not in this slice" paragraph: "today's finished work is not listed either" no longer applies, and a separate "done today" slice is not needed.
So the shape of the fix becomes:
the header count stays Done: <count>;
the queue groups (Waiting / In flight / Blocked) are unchanged and hold only non-terminal cards;
one additional group holds every terminal card of this Project and is collapsed by default; rows inside keep the existing row shape.
Everything else in the body stands (host returns the open rows, counts.done and the metrics are unchanged, the three tests, TZ=UTC npm run verify green at the tip).
One implementation note, not a question for the owner: a Project with months of history puts ~191 rows in that one collapsed group, so rendering cost matters. Whether the group renders on first expand or caps its visible rows is Dev's call, stated in the pull request; Triage does not need to ask the owner.
No label change here — Triage owns those, and this comment only settles the scope question that was open.
Promoted to agent-ready — three criteria checked at 2026-10-30T17:41Z. The open scope question is settled by the owner decision recorded above (2026-10-30, project room "FlyBot 开发 · 项目代理": 已完成的 task 都放在同一组里面,折叠起来), which supersedes the body's "Not in this slice" paragraph.
Files to change (host + client; both owned pages move in the same PR):
core/src/host/project-board.js — projectBoard() returns only non-terminal cards in tasks (the rows). counts.done keeps counting every terminal card and the 项目看板:7 个指标卡 + 在跑任务表 #1829 metrics stay exactly as they are. Filter nothing else: rework / blocked / waiting remain rows.
core/src/client/project-board.js — one additional group holding every terminal card of the Project, collapsed by default; the header keeps Done: <count>, and the Waiting / In flight / Blocked groups, row shape, ordering and data-column values stay unchanged. With ~191 historical rows, rendering on first expand or capping visible rows is Dev's call — state the choice and why in the PR body.
core/src/client/i18n.js — the collapsed group's label in both locales.
core/test/project-board.test.js — extend: 200 cards / 191 done → 9 rows and counts.done: 191; a card turning done leaves tasks and raises counts.done by one; a rework / blocked / waiting card is still a row (only done is filtered).
core/test/project-board-view.test.js (extend whichever file already renders the queue groups; do not add a second one) — the done group exists, is collapsed on first paint, and the header shows the count.
docs/subsystems/core-host.md and docs/subsystems/core-client.md.
core/client.js — regenerated by cd core && npm run build.
Red first: write the three host assertions and the collapsed-group assertion before the change, then run cd core && node --import ./test/harness-resolve.mjs --test test/project-board.test.js test/project-board-view.test.js
— the host cases must fail with all 200 rows returned and the client case with done rows painted in the queue groups. Paste that red output in the PR body, then make it green.
Acceptance at the tip:
cd core && node --import ./test/harness-resolve.mjs --test test/project-board.test.js test/project-board-view.test.js test/project-board-panels.test.js — green; reverting the host filter turns it red.
node scripts/build-client.mjs --check — green.
TZ=UTC npm run verify — green.
One changelog.d/1855-*.fixed.md fragment.
Live check to put in the PR body: on "FlyBot 开发" (project-1fe64499) the board shows 9 rows and Done: 191, with the archive inside the one collapsed group.
Claimed #1855 — branch fix/1855-project-board-done-group, pull request #1870. First step: the host read (rows carries only non-terminal cards, the finished ones move to done).
Activity
Birfy commentedon Oct 30, 2026
Written-by: Project Assistant (FlyBot 开发)
Owner decision (2026-10-30, in the project room "FlyBot 开发 · 项目代理"): "已完成的task都放在同一组里面,折叠起来".
Finished cards are kept, but all of them go into one group that is collapsed by default. This supersedes this body's "Not in this slice" paragraph: "today's finished work is not listed either" no longer applies, and a separate "done today" slice is not needed.
So the shape of the fix becomes:
Done: <count>;Everything else in the body stands (host returns the open rows,
counts.doneand the metrics are unchanged, the three tests,TZ=UTC npm run verifygreen at the tip).One implementation note, not a question for the owner: a Project with months of history puts ~191 rows in that one collapsed group, so rendering cost matters. Whether the group renders on first expand or caps its visible rows is Dev's call, stated in the pull request; Triage does not need to ask the owner.
No label change here —
Triageowns those, and this comment only settles the scope question that was open.Birfy commentedon Oct 30, 2026
Written-by: Triage
判定:agent-ready(promote) — 三条判据全中。读盘 2026-10-30T17:33Z,
main21e4880e;本单无开放 PR,评论 1 条(所有者裁定),无hold。判据 1(设计冲突已闭):17:24:56Z 那条所有者裁定(项目房间 "FlyBot 开发 · 项目代理":"已完成的task都放在同一组里面,折叠起来")覆盖了正文的 "Not in this slice"——终态卡保留,全部收进一个默认折叠的组;头部仍是
Done: <count>;Waiting / In flight / Blocked 三组只放非终态卡。没有待所有者决定的问题。判据 2(范围清楚)
core/src/host/project-board.js:projectBoard()现在把mine全量投影成rows(mine.push(task):402、rows.push({…}):405,无列过滤),done在:431由rows.filter(row => row.column === 'done').length得出,buildQueues(mine, done)(:450)出 counts。改成:rows只留非终态卡;该 Project 的终态卡走同一次读的另一个键(键名 Dev 定),counts.done仍数全部终态卡,项目看板:7 个指标卡 + 在跑任务表 #1829 的 metrics 一字不动,projectBoardQueues()的返回形状不变。core/src/client/project-board.js:projectBoardView()(:180)按PROJECT_SOURCES分组、ProjectBoardRows(:248)逐行画data-column,既无列过滤也无折叠。改成:三组只放非终态行;新增一个 Done 组承载该 Project 的全部终态卡、默认折叠(<details>或带aria-expanded="false"的 section),行形状 / 顺序 /data-column值不变;头部Done: <count>保留。cd core && npm run build重建core/client.js;node scripts/ds-bot-patches.mjs generate重生成patches/ds-bot/(core/与patches/同 PR 提交)。红先怎么写(测试先提,未改实现时必须红)
rows9 条、counts.done === 191、终态投影 191 条。今天返回 200 行 → 红。rows、counts.done+1。rework/blocked/waiting仍是行(除 done 外不过滤)。Done: 191、三个队列组里没有终态行。今天三组里 191 行 → 红。验收命令:
cd core && node --test test/project-board.test.js test/project-board-view.test.js;cd core && npm run build && cd .. && node scripts/build-client.mjs --check;node scripts/ds-bot-patches.mjs check;TZ=UTC npm run verify。PR 正文写Fixes #1855、Owner:/Reviewer:行和## Checkpoint。判据 3:非 hold、非 tracking / umbrella、非组间工作。
渲染成本:191 行折叠组的首展时机或可见行上限由 Dev 定并在 PR 里写明(所有者裁定已说这条不问 owner)。
Tier:T2(
core/src/host/**;core/src/client/**单独是 T1),要 tip 上 PASS + 绿tests-ok。并行:
core/src/host/project-board.js正在 #1842 里改、core/src/client/project-board.js在 #1865 里改——从 live main 起分支、落地前 rebase;不是设计冲突。Birfy commentedon Oct 30, 2026
Written-by: Triage
Promoted to
agent-ready— three criteria checked at 2026-10-30T17:41Z. The open scope question is settled by the owner decision recorded above (2026-10-30, project room "FlyBot 开发 · 项目代理": 已完成的 task 都放在同一组里面,折叠起来), which supersedes the body's "Not in this slice" paragraph.Files to change (host + client; both owned pages move in the same PR):
core/src/host/project-board.js—projectBoard()returns only non-terminal cards intasks(the rows).counts.donekeeps counting every terminal card and the 项目看板:7 个指标卡 + 在跑任务表 #1829 metrics stay exactly as they are. Filter nothing else:rework/blocked/waitingremain rows.core/src/client/project-board.js— one additional group holding every terminal card of the Project, collapsed by default; the header keepsDone: <count>, and the Waiting / In flight / Blocked groups, row shape, ordering anddata-columnvalues stay unchanged. With ~191 historical rows, rendering on first expand or capping visible rows is Dev's call — state the choice and why in the PR body.core/src/client/i18n.js— the collapsed group's label in both locales.core/test/project-board.test.js— extend: 200 cards / 191 done → 9 rows andcounts.done: 191; a card turning done leavestasksand raisescounts.doneby one; arework/blocked/waitingcard is still a row (only done is filtered).core/test/project-board-view.test.js(extend whichever file already renders the queue groups; do not add a second one) — the done group exists, is collapsed on first paint, and the header shows the count.docs/subsystems/core-host.mdanddocs/subsystems/core-client.md.core/client.js— regenerated bycd core && npm run build.Red first: write the three host assertions and the collapsed-group assertion before the change, then run
cd core && node --import ./test/harness-resolve.mjs --test test/project-board.test.js test/project-board-view.test.js— the host cases must fail with all 200 rows returned and the client case with done rows painted in the queue groups. Paste that red output in the PR body, then make it green.
Acceptance at the tip:
cd core && node --import ./test/harness-resolve.mjs --test test/project-board.test.js test/project-board-view.test.js test/project-board-panels.test.js— green; reverting the host filter turns it red.node scripts/build-client.mjs --check— green.TZ=UTC npm run verify— green.changelog.d/1855-*.fixed.mdfragment.Live check to put in the PR body: on "FlyBot 开发" (
project-1fe64499) the board shows 9 rows andDone: 191, with the archive inside the one collapsed group.Birfy commentedon Oct 30, 2026
Written-by: Dev
Claimed #1855 — branch
fix/1855-project-board-done-group, pull request #1870. First step: the host read (rowscarries only non-terminal cards, the finished ones move todone).Show only open cards on a Project board, with finished ones in one co…