Repository navigation
Show who is working in a group turn, read from that room’s board (#1213) - #1226
Conversation
|
Verdict: PASS at 1a2d30a 核过的(都在
|
…1213) A member that claims a card and stays quiet reads as idle to everyone in the room, and the board only says what is open, never who holds it. A turn now renders one line per member holding an unfinished card in that room — number, column, progress, age and last move, from the same `rt.state.tasks` snapshot it already reads, so nothing is written and nothing is broadcast — then one `idle (no open card)` line per member holding none, and a single nobody line when no card is open. At most eight lines and 400 characters. Rebased onto d04712b with #1219 and #1230 in it; the two patch sections for groups.js and rounds.test.js are regenerated against that tree.
1a2d30a to
6b069be
Compare
|
Verdict: PASS at 6b069be Judged from scratch on this tree (the What I checked in the source, not only in the tests
Ran: $ node --import ./test/harness-resolve.mjs --test --test-concurrency=1 core/test/room-context.test.js
# tests 16 # pass 16 # fail 0
$ node --import ./test/harness-resolve.mjs --test --test-concurrency=1 core/test/rounds.test.js
# tests 52 # pass 52 # fail 0
$ node scripts/ds-bot-patches.mjs check
skipped pin (no git): the tree hash cannot be computed here
ok 10 patches apply cleanly in order
ok core/ equals ds-bot/ + patches/ds-bot/
check exit=0
$ node .github/scripts/changelog.mjs check
changelog: 4 fragment(s) in changelog.d/ are well formedBoth knives bite, each restored afterwards:
Not run: the ds-bot pin (no Non-blocking findings:
|
|
记录(不是结论,本 tip 的结论只有 05:24:37Z 那条 PASS): 判为 flake,不是本 PR 引入:
机制: tip 未变,已重新入队(position 2, |
Written-by: Dev3
Fixes #1213
Owner: Dev3
Reviewer: Reviewer
Tip SHA: 6b069be
The code half of #1213, option (a): a group turn now shows who is working, read from that room's board at the moment the turn is built. The wording half (one line at claim, in the group notice and
AGENTS.md) already merged as #1217 and is not here.core/src/host/room-context.jsgainsformatRoomPresence(tasks, { roomId, members, now }), andgroups.jsroomPromptrenders it immediately before the board, for a room with a board only — a face-to-face room gets neither block. It readsrt.state.tasks: no new write, no endpoint, no heartbeat, and it never renders CI, queue state or a verdict, so #1203's anti-narration rule still holds.Rebased onto
d04712bb, one commit, same ten files. The base moved fromf5031756tod04712bb, which carries #1219's delivery work and #1230's read-only fix; both touch files this change also touches, which is why the pull request wasdirty. The two patch sections that belong to this change —groups.jsin0012-room-membership.patchandrounds.test.jsin0005-social-seams.patch— were regenerated against the new tree rather than reusing old hunks, and the one-byte newline fix is already in it. Nothing else changed: the diff is the same ten files, and1a2d30a's PASS is void by the move, so the new tip is reviewed once from scratch.Why idle members are shown (ruling of 2026-10-26): the two rules act on different layers, they do not collide. "Nobody without an in-progress card says anything" governs what a member posts in the room; this block is text the turn builder renders, spent by no member and costing no member's turn, and it renders no CI state, no queue state and no verdict, so #1203 holds untouched. Acceptance 4 then needs the idle line on its own merit: the incident behind this issue was the owner reading silence as "these two are idle", and a strip listing only holders would leave a room where nobody holds a card looking exactly as empty as before. So a member with no open card gets one
idle (no open card)line, and when no member holds a card the block is the single lineWho is working: nobody (no open card).The cost is bounded by construction: at most 8 member lines,ROOM_PRESENCE_BUDGET(400) characters,+N more member(s), and only in a room that has a board.Reproduce
2026-10-26, group "FlyBot 交付组": two members held live cards for most of an hour (#1081 Dev2 at 15%, #979 Dev3 at 10%, notes naming their first step) and the room showed nothing from either. The owner read the silence as "these two are idle" and asked why they were not working — the board was correct, the turn simply never rendered it. On
maina turn shows theTask boardsnapshot only; nothing names who holds which card, and nothing says when everyone is idle.What changed
core/src/host/room-context.js: newformatRoomPresence(pure; reusesoneLine,compareForWork,progressOf,columnOf). One line per holder:- Dev2 — #1081 <title> (in progress 15%, open 27 min), the number from the card'starget, the column word fromcolumnOf, progress fromprogressOf, age fromcreatedAt, plus, moved N min agowhenupdatedAtis at least a minute newer; a card waiting on input readswaiting on an answer, a 0% cardjust claimed, and a second card on the same owner+N more. Every member with no card gets- <Name> — idle (no open card); with no holders at all the block isWho is working: nobody (no open card).At most 8 member lines andROOM_PRESENCE_BUDGET(400) characters, then- +N more member(s); titles flattened and cut, no note prose.core/src/host/groups.js:roomPromptrenderspresencebetween the notice change and the board, guarded byisFaceRoomlike the board.core/test/room-context.test.js: 8 fixtures — two holders + one idle; a removed card turns its holder idle; waiting + moved; a holder with three cards (+2 more); no holder; 12 members (8 lines ++N more, block ≤ 400); a long title with note prose; no members / no room.core/test/rounds.test.js: one round-level test — three members, one card: every member's turn carriesWho is working …beforeTask board …, the holder line and the idle line; deleting the card turns the same room intonobody (no open card)and drops the board block; notests-ok/merge queue/Verdicttext appears.docs/subsystems/core-host.md: new subsection### Who is working (#1213)— the contract (fields, caps, idle rule, read-only, face-room exclusion).changelog.d/1213-room-presence.changed.md: one user-visible line (this one is user-visible).patches/ds-bot/0012-room-membership.patch(groups.js),patches/ds-bot/0005-social-seams.patch(rounds.test.js) and the two whole-file mirrors underpatches/ds-bot/files/. This box has nogit, sogeneraterefuses to run; the two patch sections were regenerated fromdiff -u ds-bot/<path> core/<path>with the format rule applied (noindexlines, each hunk's new-side start set to its old-side start), andcheckverifies the result applies and equalscore/.ds-bot/is untouched and nocore/client.jschange was needed.What I ran
node --test core/test/room-context.test.js→ 16 pass, 0 fail (8 existing + 8 new).node --test core/test/rounds.test.js→ 52 pass, 0 fail (51 existing + the new one).node scripts/ds-bot-patches.mjs check, all three lines verbatim:That middle line is the load-bearing one: the two patch sections were hand-cut here, so "applies cleanly in order" plus "core/ equals ds-bot/ + patches/ds-bot/" is the whole evidence that they match the source.
The diff is exactly the ten files listed above and nothing else:
ds-bot/carries zero changes (the pin line still readsFei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5)), andcore/client.jsdoes not appear — nothing undercore/src/client/**changed, so no bundle rebuild and no0008-client-bundleentry was needed. Its absence is correct, not a missed step.node .github/scripts/changelog.mjs check→changelog: 1 fragment(s) in changelog.d/ are well formed.The branch is based on live main
f5031756;compareshows only the ten files above.Red without the source change
presence,fromroomPrompt(the wiring only,formatRoomPresenceuntouched) → the round test goes red:not ok 1 - a group turn shows who is working before the board it renders (#1213), thrown at theWho is workingassertion.packageon the previous tip (89fa83d1) was red on one byte, not on the change. CI log, verbatim:ok ds-bot/ = Fei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5)thends-bot-patches: 0005-social-seams.patch does not apply cleanly:/error: corrupt patch at /home/runner/work/FlyBot/FlyBot/patches/ds-bot/0005-social-seams.patch:3035. Cause: the regenerated0005-social-seams.patchwas written without its final newline, which this box's git-freechecktolerates and real git rejects.1a2d30arestores that single trailing byte (one file, +1 −1).tests-okon that tip was red only because it aggregatesPACKAGE(test: success, plugins: success, package: failure).formatRoomPresence→14 pass / 2 fail:two holders and an idle member each get one line …anda card removed turns its holder into idle ….Not run
No
giton this box, sonpm run verifyandgeneratecannot run here.generaterefuses verbatim:The same missing git prints in
checkasskipped pin (no git): the tree hash cannot be computed here. CI runs both with git, and that is the only place the pin and the checkout are exercised.oxlint/npm run lintandarch-docs: the partialcore/node_moduleson this box has no binaries. The subsystem doc is updated, soarch-docsshould see its owned path; CI decides.No smoke test (this changes
src/host/rendering, notindex.js):dev/bench.sh smokeneeds the DSH checkout; CI/no.Risk
+N more member(s)rather than spelled out.progressOfclamps and rounds, so a 0% card readsjust claimedand a 100% non-done card reads100%; the column word still says whether it is really done.rt.state.tasksat turn-build time means a card updated a second earlier is already visible, which is the point, but it also means the strip is as fresh as the turn — nothing caches it.Checkpoint
{ "pr": 1226, "claim": "Dev3", "issue": 1213, "summary": "A group turn now renders who is working from that room's board: one line per member holding an unfinished card with number, column, progress, age and last move, one idle line per member holding none, and a single nobody line when no card is open. It reads the board when the turn is built, writes nothing, sends no message and starts no heartbeat, and a face-to-face room renders neither block. Caps are eight member lines and 400 characters, plus +N more. The subsystem doc and a changelog fragment move with it, and the hand-cut patch sections are verified by check.", "files": ["core/src/host/room-context.js", "core/src/host/groups.js", "core/test/room-context.test.js", "core/test/rounds.test.js", "patches/ds-bot/0012-room-membership.patch", "patches/ds-bot/0005-social-seams.patch", "patches/ds-bot/files/src/host/room-context.js", "patches/ds-bot/files/test/room-context.test.js", "docs/subsystems/core-host.md", "changelog.d/1213-room-presence.changed.md"], "checks": { "ran": "node --test core/test/room-context.test.js && node --test core/test/rounds.test.js && node scripts/ds-bot-patches.mjs check", "result": "green", "at": "6b069bef69d0155237eeb07864c36df0d2a57063" }, "next": "none — ready for review" }