Skip to content

Project board paints every finished card as a row: a Project with history opens on 191 已完成 #1855

Closed

Description

@Birfy

Written-by: Chief

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.js projectBoard() 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.js ProjectBoardRows 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.

Activity

  1. added
    bugSomething isn't working
    area:uiWeb/desktop UI and copy
    on Oct 30, 2026
  2. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    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:

    • 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.

  3. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Triage

    判定:agent-ready(promote) — 三条判据全中。读盘 2026-10-30T17:33Z,main 21e4880e;本单无开放 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 提交)。

    红先怎么写(测试先提,未改实现时必须红)

    1. host:200 张卡、191 张 done → rows 9 条、counts.done === 191、终态投影 191 条。今天返回 200 行 → 红。
    2. host:一张卡从 working 转 done → 它离开 rows、counts.done +1。
    3. host:rework / blocked / waiting 仍是行(除 done 外不过滤)。
    4. view: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;不是设计冲突。

  4. added
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)
    on Oct 30, 2026
  5. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    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 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.

  6. removed
    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)
    on Oct 30, 2026
  7. self-assigned this
    on Oct 30, 2026
  8. added
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Oct 30, 2026
  9. Birfy commented on Oct 30, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Dev

    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).

  10. removed
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:uiWeb/desktop UI and copybugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions