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
tooling(pm): fleet-roster flags 「疑似撞墙」 on every extra seat one account holds in a lane — a = seat N row reads only its seat post's updated_at, so an active seat reads as stalled #28906
Filing gate: ③ a task the maintainer assigned directly. The maintainer asked in the triage session, verbatim: 「一个人负责车道的四个席位可以增加并发很正常,目前的规则有问题吗?还是车道经理处理的不对」. Triage answered that neither the rule nor the lane was wrong, the roster's measurement was. The maintainer said 「立卡」. tooling queue door: a measured false alarm on the right source, which hides real walls among the false ones (triage-duties.md, third door). The instances are named below.
Reader: domain:devx (scripts/pm/fleet-roster.mjs; the earlier roster cards #25416 and #25962 were devx's).
Dedupe (open AND closed): fleet-roster in:title → 6 hits: #25462 (open, the generated roster), #25962, #28718, #25463, #25416 and one more (closed). None covers activity attribution for a seat that shares its account.
⛔ Not a claim.
What happens (measured 2026-11-02 ~03:50Z on main)
fleet-roster.mjs, in the row map (around L364–373):
When one account holds several seats of a lane, every seat but the lowest gets inFlight = []. Its lastActivity is then the seat post's own updated_at alone. Seat posts are rarely edited, because a seat's work lands on cards and PRs. So the row crosses STALE_HOURS (6) and reads 「疑似撞墙」 while the seat is working.
Instances:domain:server seats 2, 3 and 5 (#20966, #26761, #28677), all os-project-manager, all rendered = seat 1 and 「疑似撞墙」 at 2d, 21h and 14h. On the same day each was demonstrably active, as a different session:
That is 3 of the 10 flags on that run. The rule allows one account several seats for concurrency (seat-post-protocol.md, project-forms.md 「一车道多席」), so the false flag is the tool's.
Wanted
A seat's last activity reads the seat's own traces. Its seat id and session appear in the signature line of its comments on cards and PRs (claims, seat reviews, closure records), and its mailbox PR has an updated_at. The newest of those, the post's updated_at and its in-flight cards counts.
The in-flight column may keep = seat N; only the activity reading changes.
A self-test with one account on two seats of a lane: the second seat is not flagged while its mailbox or a signed comment is fresh, and is flagged when both are older than STALE_HOURS.
Claim: PM loop round 2
Session: session_017ihL2gLghEqeDKTbDTC7Zd
Account: marchtian
Branch: claude/issue-28906-roster-shared-account-activity
Worktree: objectstack-issue-28906
Domain: domain:devx
Seat: domain:devx#2
File surface: scripts/pm/fleet-roster.mjs (the activity reading of a seat row) and its self-test; no change to the in-flight column's = seat N attribution, STALE_HOURS, or any skill text
Container & model: S/M tooling fix, mode:subagent, model: default tier, effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: fleet-roster.mjs gives a shared-account seat's activity only its seat post's updated_at, so every seat but the lowest an account holds in a lane crosses STALE_HOURS and reads 「疑似撞墙」 while it is working
Thread-read: none
Premise: holds
Serial constraints cleared: none (no open PR touches scripts/pm/fleet-roster.mjs at claim time)
Filed by triage#1 on the maintainer's direct ask (③), reader domain:devx. The seat's last activity reads its own traces, as the card's Wanted says: comments signed with its seat id and session, its mailbox PR's updated_at, the post's updated_at, and its in-flight cards.
{
"issue": 28906,
"status": "done",
"branch": "claude/issue-28906-roster-shared-account-activity",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28941",
"head": "01dbcd7b3b7ff5cc35011336a3a7705aca394310",
"session": "session_017ihL2gLghEqeDKTbDTC7Zd",
"premise_still_valid": true,
"summary": "fleet-roster's last activity is now the newest of the seat post's updated_at, its in-flight cards, its mailbox pull's updated_at, and the comments of the last STALE_HOURS signed with the row's own LANE#N on their first line, attributed by seat and never by account. The in-flight column keeps its = seat N reading, and STALE_HOURS is unchanged. The signature pattern is mirrored from check-half-states, because the relay imports this file; the self-test holds the two byte-equal.",
"gates": {
"derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on 01dbcd7b3b: 31 commands, every one exit 0, including pnpm check:pm-dispatch-gates (fast tier, 1937 cases) and pnpm check:pm-record-recognisers",
"ran_reconciliation": "dispatch-gates --ran: 31 derived, 31 run, 0 NOT-MEASURED (a DERIVED zero: all 31 recorded an exit code and none is 3)",
"script_suites": ["node scripts/pm/fleet-roster.mjs --self-test :: exit 0 (104 cases in 9 batteries)", "node scripts/pm/fleet-write/dispatch.mjs --self-test :: exit 0 (265 cases, 24 batteries; importer of ROSTER_MARKER)"],
"rosters_outside_derivation": ["check-published-list-mirrors :: exit 0", "check:engine-double-contract :: exit 0", "check:i18n-stale-fill :: exit 0", "check:pm-label-desc-cap :: exit 0", "check:dts-closure :: exit 3 NOT MEASURED (prerequisite: built packages; diff touches none)", "check:published-readme-exports :: exit 3 NOT MEASURED (same prerequisite)"],
"ci": "in_progress at report time; not waited on",
"changeset": "skip-changeset (scripts/pm/** publishes nothing), sent as a label on pr_create; read back on the PR"
},
"line_budget": "1 file, +109 / -11: about 50 lines of code and header, about 45 lines for the new self-test battery",
"deviations": [
"The merge commit of origin/main had git's default message; I amended it locally, before pushing, to carry the trailer pair.",
"Live runs used --repos objectstack-ai/objectstack,objectstack-ai/objectui because hotcrm answers 403 in this session. The default three-repo run exits 3 there, before and after this change."
],
"files_changed": ["scripts/pm/fleet-roster.mjs"],
"api_cost": "+1 paged read per repo: GET /repos/R/issues/comments?since=(now - STALE_HOURS h). Today 388 comments in 6 h on objectstack (4 pages) and 0 on objectui (1 page). A live run made 23 gh api calls after the change and 18 before. The mailbox time comes from the pulls?state=open read already made, at no extra cost. Headroom: MAX_PAGES 50 x 100 rows per window, about 13x today's volume; past it the read refuses (exit 3) and never returns a partial list. A 24 h window measured 1720 comments and 18 pages, so I did not take it.",
"live_before_after": {
"before": "origin/main 9a9823d921 at 2026-11-02T04:25:58Z: 9 rows flagged. #20966 domain:server#2 last 2026-10-31T02:56:56Z flagged; #26761 #3 last 2026-11-01T06:46:52Z flagged; #28677 #5 last 2026-11-01T13:13:32Z flagged.",
"after": "branch at 2026-11-02T04:28:17Z: 6 rows flagged. #20966 last 2026-11-02T04:27:58Z not flagged (mailbox #28284 04:03:15Z, signed 04:27:58Z); #26761 last 04:07:49Z not flagged (mailbox #28585 03:49:40Z, signed 04:07:49Z); #28677 last 04:16:50Z not flagged (mailbox #28678 03:50:09Z, signed 04:16:50Z). All three still read = seat 1; seat 1 keeps its 9 in-flight cards.",
"unchanged_flags": ["repo:cloud#1", "repo:cloud#2", "repo:docs.objectos.ai#1", "domain:spec#3", "domain:spec#5", "repo:www.objectos.ai#1"]
},
"mcp_calls": "0",
"api_writes": "2: (1) POST /repos/objectstack-ai/objectstack/dispatches, a fleet-write relay pr_create (run 41390106049, success, read-back identical) that opened draft #28941 with label skip-changeset, no assignees and no reviewers; (2) this comment through post-stamped.mjs. git push of the own branch is not a REST write.",
"open_questions": [
{
"question": "A mailbox pull's updated_at moves on any comment, including other seats' inbound To: doorbells, so a walled seat that keeps receiving doorbells reads fresh. Should the mailbox stay a trace?",
"options": ["A: keep it, as the card's Wanted names it (shipped)", "B: a follow-up card drops the mailbox share and keeps the signed comments, which are attributed to their writer"],
"recommendation": "A for this PR, because the Wanted binds it. Today all three server seats also carry a fresh signed comment, so B would not re-flag them. Decide B only if a walled seat is seen hiding behind its doorbells."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed: the comment read covers only repos in --repos, so a repo:cloud seat's signed comments (on the cloud repo) are not read and its rows still read the post alone",
"carrier: none · noted, not filed: for a flagged row, the age cell can read older than a signed comment past the STALE_HOURS window; the flag itself is exact"
]
}
Landed · 2026-11-02T05:21Z · PR #28941 merged as 135054ebaa (reviewed head 01dbcd7b3b, seat record ACCEPT 6569457478). A roster row's last activity now reads the seat's own traces: the post, its in-flight cards, its mailbox pull, and comments signed with its own LANE#N, by seat and never by account. On the live read-only run the flagged rows went from 9 to 6, and domain:server seats 2, 3 and 5 no longer read 「疑似撞墙」. The in-flight column keeps = seat N. pm:dispatched is removed in this stroke.
Activity
objectstack-fleet commentedon Nov 2, 2026
domain:devx#2 · marchtian · session_017ihL2gLghEqeDKTbDTC7Zd
Claim: PM loop round 2
Session:
session_017ihL2gLghEqeDKTbDTC7ZdAccount:
marchtianBranch:
claude/issue-28906-roster-shared-account-activityWorktree:
objectstack-issue-28906Domain:
domain:devxSeat:
domain:devx#2File surface:
scripts/pm/fleet-roster.mjs(the activity reading of a seat row) and its self-test; no change to the in-flight column's= seat Nattribution,STALE_HOURS, or any skill textContainer & model:
S/M tooling fix,mode:subagent,model: default tier,effort: highClause-②: no
Metadata-protocol: none
Responsibility:
fleet-roster.mjsgives a shared-account seat's activity only its seat post'supdated_at, so every seat but the lowest an account holds in a lane crossesSTALE_HOURSand reads 「疑似撞墙」 while it is workingThread-read: none
Premise: holds
Serial constraints cleared: none (no open PR touches
scripts/pm/fleet-roster.mjsat claim time)Filed by triage#1 on the maintainer's direct ask (③), reader
domain:devx. The seat's last activity reads its own traces, as the card's Wanted says: comments signed with its seat id and session, its mailbox PR'supdated_at, the post'supdated_at, and its in-flight cards.objectstack-fleet commentedon Nov 2, 2026
domain:devx#2 · marchtian · session_017ihL2gLghEqeDKTbDTC7Zd
os-dev-report
{ "issue": 28906, "status": "done", "branch": "claude/issue-28906-roster-shared-account-activity", "pr": "https://github.com/objectstack-ai/objectstack/pull/28941", "head": "01dbcd7b3b7ff5cc35011336a3a7705aca394310", "session": "session_017ihL2gLghEqeDKTbDTC7Zd", "premise_still_valid": true, "summary": "fleet-roster's last activity is now the newest of the seat post's updated_at, its in-flight cards, its mailbox pull's updated_at, and the comments of the last STALE_HOURS signed with the row's own LANE#N on their first line, attributed by seat and never by account. The in-flight column keeps its = seat N reading, and STALE_HOURS is unchanged. The signature pattern is mirrored from check-half-states, because the relay imports this file; the self-test holds the two byte-equal.", "gates": { "derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on 01dbcd7b3b: 31 commands, every one exit 0, including pnpm check:pm-dispatch-gates (fast tier, 1937 cases) and pnpm check:pm-record-recognisers", "ran_reconciliation": "dispatch-gates --ran: 31 derived, 31 run, 0 NOT-MEASURED (a DERIVED zero: all 31 recorded an exit code and none is 3)", "script_suites": ["node scripts/pm/fleet-roster.mjs --self-test :: exit 0 (104 cases in 9 batteries)", "node scripts/pm/fleet-write/dispatch.mjs --self-test :: exit 0 (265 cases, 24 batteries; importer of ROSTER_MARKER)"], "rosters_outside_derivation": ["check-published-list-mirrors :: exit 0", "check:engine-double-contract :: exit 0", "check:i18n-stale-fill :: exit 0", "check:pm-label-desc-cap :: exit 0", "check:dts-closure :: exit 3 NOT MEASURED (prerequisite: built packages; diff touches none)", "check:published-readme-exports :: exit 3 NOT MEASURED (same prerequisite)"], "ci": "in_progress at report time; not waited on", "changeset": "skip-changeset (scripts/pm/** publishes nothing), sent as a label on pr_create; read back on the PR" }, "line_budget": "1 file, +109 / -11: about 50 lines of code and header, about 45 lines for the new self-test battery", "deviations": [ "The merge commit of origin/main had git's default message; I amended it locally, before pushing, to carry the trailer pair.", "Live runs used --repos objectstack-ai/objectstack,objectstack-ai/objectui because hotcrm answers 403 in this session. The default three-repo run exits 3 there, before and after this change." ], "files_changed": ["scripts/pm/fleet-roster.mjs"], "api_cost": "+1 paged read per repo: GET /repos/R/issues/comments?since=(now - STALE_HOURS h). Today 388 comments in 6 h on objectstack (4 pages) and 0 on objectui (1 page). A live run made 23 gh api calls after the change and 18 before. The mailbox time comes from the pulls?state=open read already made, at no extra cost. Headroom: MAX_PAGES 50 x 100 rows per window, about 13x today's volume; past it the read refuses (exit 3) and never returns a partial list. A 24 h window measured 1720 comments and 18 pages, so I did not take it.", "live_before_after": { "before": "origin/main 9a9823d921 at 2026-11-02T04:25:58Z: 9 rows flagged. #20966 domain:server#2 last 2026-10-31T02:56:56Z flagged; #26761 #3 last 2026-11-01T06:46:52Z flagged; #28677 #5 last 2026-11-01T13:13:32Z flagged.", "after": "branch at 2026-11-02T04:28:17Z: 6 rows flagged. #20966 last 2026-11-02T04:27:58Z not flagged (mailbox #28284 04:03:15Z, signed 04:27:58Z); #26761 last 04:07:49Z not flagged (mailbox #28585 03:49:40Z, signed 04:07:49Z); #28677 last 04:16:50Z not flagged (mailbox #28678 03:50:09Z, signed 04:16:50Z). All three still read = seat 1; seat 1 keeps its 9 in-flight cards.", "unchanged_flags": ["repo:cloud#1", "repo:cloud#2", "repo:docs.objectos.ai#1", "domain:spec#3", "domain:spec#5", "repo:www.objectos.ai#1"] }, "mcp_calls": "0", "api_writes": "2: (1) POST /repos/objectstack-ai/objectstack/dispatches, a fleet-write relay pr_create (run 41390106049, success, read-back identical) that opened draft #28941 with label skip-changeset, no assignees and no reviewers; (2) this comment through post-stamped.mjs. git push of the own branch is not a REST write.", "open_questions": [ { "question": "A mailbox pull's updated_at moves on any comment, including other seats' inbound To: doorbells, so a walled seat that keeps receiving doorbells reads fresh. Should the mailbox stay a trace?", "options": ["A: keep it, as the card's Wanted names it (shipped)", "B: a follow-up card drops the mailbox share and keeps the signed comments, which are attributed to their writer"], "recommendation": "A for this PR, because the Wanted binds it. Today all three server seats also carry a fresh signed comment, so B would not re-flag them. Decide B only if a walled seat is seen hiding behind its doorbells." } ], "out_of_scope_findings": [ "carrier: none · noted, not filed: the comment read covers only repos in --repos, so a repo:cloud seat's signed comments (on the cloud repo) are not read and its rows still read the post alone", "carrier: none · noted, not filed: for a flagged row, the age cell can read older than a signed comment past the STALE_HOURS window; the flag itself is exact" ] }objectstack-fleet commentedon Nov 2, 2026
domain:devx#2 · marchtian · session_017ihL2gLghEqeDKTbDTC7Zd
Landed · 2026-11-02T05:21Z · PR #28941 merged as
135054ebaa(reviewed head01dbcd7b3b, seat record ACCEPT 6569457478). A roster row's last activity now reads the seat's own traces: the post, its in-flight cards, its mailbox pull, and comments signed with its ownLANE#N, by seat and never by account. On the live read-only run the flagged rows went from 9 to 6, anddomain:serverseats 2, 3 and 5 no longer read 「疑似撞墙」. The in-flight column keeps= seat N.pm:dispatchedis removed in this stroke.