Skip to content

Show only open cards on a Project board, with finished ones in one collapsed group - #1870

Merged
Birfy merged 1 commit into
mainfrom
fix/1855-project-board-done-group
Oct 30, 2026
Merged

Birfy merged 1 commit into
mainfrom
fix/1855-project-board-done-group

Conversation

@Birfy

@Birfy Birfy commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Written-by: Dev
Fixes #1855
Owner: Dev
Reviewer: Reviewer
Tip SHA: 8a0e1b9
Base: 09309f7
Docs-not-needed: no — docs/subsystems/core-host.md and docs/subsystems/core-client.md are updated in this commit.

What changed

projectBoard() projected every card a Project owns regardless of column, so a Project with months of history opened on 191 finished cards beside the 9 still in flight. The rows are now the cards outside the done column; the finished cards ride on the same read under a new done key, in the same row shape and the same order, and counts.done still counts every one of them — so the header and the #1829 metrics read exactly as before. Nothing else is filtered: a rework, a blocked and a waiting card stay rows. project-board answers done beside tasks, and the pane draws that archive as one <details> group that starts collapsed, after the queue groups and before the Decisions/Meetings record. The view also folds a terminal row into the archive when a host still sends it in rows, so no finished card is ever painted as a row of work in flight.

Rendering choice (the owner decision left it to Dev): no row cap and no lazy mount — the group is a <details> without open, so the rows exist in the DOM and the browser paints none of them until the reader expands the group. 191 rows is a trivial element count; a cap would silently hide part of the Project's record.

  • Three host tests: 200 cards / 191 done → 9 rows, counts.done: 191, and the endpoint carries done: 191; a card that turns done leaves the rows and raises the count by one; rework/blocked/waiting stay rows.
  • Two view tests: no finished row in a source group, every one in the archive, and the archive is a <details> with no open on first paint with the header still reading Done: 191.
  • core/client.js and patches/ds-bot/ are generated, never hand-edited: npm run build in core/, and the three edited-upstream sections (0001 i18n.js, 0002 store.js, 0008 client.js) plus the five whole-file mirrors. generate needs git, which this host does not have, so the sections were rebuilt with a git-free patience diff in the stored format and proven by node scripts/ds-bot-patches.mjs check (see "Ran").

Live host check on "FlyBot 开发" (project-1fe64499) not run: that host is not reachable from this workstation. The shape it now returns is pinned by the tests (9 rows, Done: 191).

Ran at this tip

$ cd core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/project-board.test.js test/project-board-view.test.js test/project-board-entry.test.js test/project-board-panels.test.js
$ cd core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=2 "test/*.test.js"
$ node scripts/ds-bot-patches.mjs check
$ node core/scripts/build-client.mjs --check
$ node .github/scripts/check-mojibake.mjs --check
$ npm --prefix plugins/social test; npm --prefix plugins/tree test; npm --prefix plugins/timeline test; npm --prefix plugins/workflow test
$ node --test ".github/scripts/*.test.mjs"; npm run lint:interop; npm run test:interop; npm run lint:live-e2e; npm run test:live-e2e

Green: 53/53 on the four board files; 10 patches apply cleanly and core/ equals ds-bot/ + patches; client.js matches src/client; 0 U+FFFD; plugins 541/127/135/316 pass, workflow scripts 554 pass (2 skipped), interop 37, live-e2e 24. Reverting the source change (host open = rows, client list.push(row)) turns 7 of those 47 tests red.

Core suite: 2244 tests, 2242 pass, 2 fail — both environmental on this host, not touched by this change: empty diff passes (needs git for the arch-docs base diff) and the usage.sqlite fixture case (needs python3).

Not run: npm run verify end to end — it stops at arch-docs, which cannot diff against origin/main without git; every other step of it was run separately above. The smoke test is not applicable (no core/index.js or core/src/host/ turn/delivery change; the host change is the read-only board project). The pin check inside ds-bot-patches prints skipped pin (no git); CI runs it with git.

Checkpoint

{
"pr": 1870,
"claim": "Dev",
"issue": 1855,
"summary": "The Project board painted every finished card as a row, so a Project with months of history opened on 191 已完成 cards. The host board now answers only non-terminal cards as rows and carries the finished cards in a separate done list of the same shape; counts.done and the metrics are unchanged. The pane draws that list as one <details> group that starts collapsed, so the board opens on the work in flight and the header keeps Done: <count>.",
"files": [
"core/src/host/project-board.js",
"core/src/host/store.js",
"core/src/client/project-board.js",
"core/src/client/i18n.js",
"core/client.js",
"core/test/project-board.test.js",
"core/test/project-board-view.test.js",
"patches/ds-bot/0008-client-bundle.patch",
"patches/ds-bot/files/src/host/project-board.js",
"docs/subsystems/core-host.md",
"docs/subsystems/core-client.md",
"changelog.d/1855-project-board-done-group.fixed.md"
],
"checks": {
"ran": "cd core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/project-board*.test.js; node scripts/ds-bot-patches.mjs check; node core/scripts/build-client.mjs --check; node .github/scripts/check-mojibake.mjs --check",
"result": "green",
"at": "8a0e1b9d8408b4eca9019be7d46117919cad318e"
},
"next": "none — ready for review"
}

@Birfy Birfy added the agent-pr Pull request opened by an agent label Oct 30, 2026
@Birfy Birfy self-assigned this Oct 30, 2026
@Birfy
Birfy force-pushed the fix/1855-project-board-done-group branch from 8a0e1b9 to 1f34afa Compare October 30, 2026 20:10
@Birfy

Birfy commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at 1f34afa
Written-by: Reviewer
Attestation: 1f34afa role=Reviewer

Ran at this tip:

$ cd /data/dsh/bot/workspace/v1870/tip/core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/project-board.test.js test/project-board-view.test.js test/project-board-entry.test.js test/project-board-panels.test.js
# tests 53  # pass 53  # fail 0
$ cd /data/dsh/bot/workspace/v1870 && cp -a tip red && for f in core/src/client/project-board.js core/src/host/project-board.js core/src/host/store.js core/src/client/i18n.js core/client.js; do cp base/$f red/$f; done && cd red/core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/project-board.test.js test/project-board-view.test.js test/project-board-entry.test.js test/project-board-panels.test.js
# tests 53  # pass 45  # fail 8

Review notes:

  • Range: tip 1f34afa sits on base 2ffd9fc (compare ahead 1 / behind 0); the 19 paths are all the change set — 5 source, 3 tests, generated core/client.js plus the five patch mirrors and the 0001/0002/0008 sections, 2 subsystem docs, 1 changelog fragment. No unrelated path.
  • Red-first is hard: the same suite with the five changed source blobs reverted to 2ffd9fc fails 8 of 53, so the tests pin the change rather than passing on the old behaviour.
  • Host: projectBoard() splits the done column out of rows into done (same row shape and order) and passes done.length into buildQueues, so counts.done still counts every finished card; only column done leaves the rows — rework, blocked and waiting stay rows. The endpoint carries done through store.js.
  • View: the archive is one <details class="bt-project-done"> with no open (paints nothing until expanded) after the queue groups and before the record; a legacy host that still sends finished rows in rows folds them into the archive with a seen guard, so no card is dropped or painted twice. Queue groups, record and 项目看板:7 个指标卡 + 在跑任务表 #1829 metrics are unchanged; count now counts rows in flight and is only used for the empty state (empty now also considers the archive).
  • Done cards is added to i18n; core/client.js and patches/ds-bot/ are generated, and tests-ok at this tip ran build-client.mjs --check and ds-bot-patches check green.
  • CI at this tip: every check green at 2026-10-30T20:13:19Z except enqueue-guard, whose only refusal is no Verifier report names the tip 1f34afa4f024 — this comment supplies that PASS. No hold; agent-pr present; body carries Fixes #1855, Owner: Dev, Reviewer: Reviewer; checkpoint block 1458 chars with pr 1870, claim Dev, issue 1855, 12 files all in this diff, summary 448 chars, next 23.
  • Not run: a live read of the FlyBot 开发 host — not reachable from this workstation, as the body states; the returned shape is pinned by the tests.

@github-actions github-actions Bot added the pass label Oct 30, 2026
@Birfy
Birfy added this pull request to the merge queue Oct 30, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 30, 2026
…llapsed group

Replayed onto main 82305b3 by Replay: merge #1872 (Project team, #1860) into this branch and keep
both sides of core/src/client/project-board.js — main's Project-team block and this branch's done
group in the same pane — plus both additions in core/src/client/i18n.js and
docs/subsystems/core-client.md; main's core/test/project-board-panels.test.js and role-labels.js
stay as they are, and core/client.js and patches/ds-bot/ are regenerated from the merged core/.
ds-bot-patches check (10 patches, core/ == ds-bot/ + patches), build-client --check, core lint,
arch-docs (19 files) and the affected project-board/i18n/client-bundle tests are green here.
Replayed-by: Replay
@Birfy
Birfy force-pushed the fix/1855-project-board-done-group branch from 1f34afa to c8e0c46 Compare October 30, 2026 20:44
@Birfy

Birfy commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at c8e0c46
Written-by: Reviewer
Attestation: c8e0c46 role=Reviewer

Tip is the rebase of fix/1855-project-board-done-group onto main 82305b32 (which carries #1872). No file of #1872 was reverted by the rebase (core/src/client/i18n.js only adds 2 lines relative to that base), and main's core/test/project-board-panels.test.js passes unchanged at this tip.

Checks at this tip: tests-ok, plugins (tree|social|timeline|workflow), package, merge-gate and the test job all success. The only red is enqueue-guard, and its own text says why: the earlier PASS names 1f34afa4f024, not this head — this conclusion is the one for c8e0c46.

Ran at this tip:

$ cd core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/project-board.test.js
# tests 21  # pass 21  # fail 0
$ cd core && TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/project-board-panels.test.js
# tests 8  # pass 8  # fail 0
$ red-first: core/src/host/project-board.js replaced with base blob 0e386247, same project-board command
# tests 21  # pass 18  # fail 3

Red-first: one revert of one changed source file (core/src/host/project-board.js, blob 0e38624) turned 3 of 21 board tests red, then the file was restored and the tip re-ran green. The panels file (8/8) is #1872's test at this merged tip: the rebase kept it green, which is the point of this re-review.

Not run: the full npm run verify and the smoke test (no core/index.js / turn-delivery change; host change is the read-only board projection). Not run also: the test bench is not reachable from this host, so no live-host read of project-1fe64499 — the shape is pinned by the tests above.

@Birfy
Birfy added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit b96bbc1 Oct 30, 2026
13 checks passed
@Birfy
Birfy deleted the fix/1855-project-board-done-group branch October 30, 2026 20:51
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant