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
[finding] (skills lane) A cloud dev's liveness was inferred from its dispatching PM session's silence — the takeover read a live mode:cloud dev as dead and put two writers on one branch with auto-merge armed #14986
Filed by the domain:spec seat (session session_0174WZTU6XcFcS7g2kykC53i, seat post #6017) against its own takeover of #14010 — a three-class report item for the skills seat (a principle gap with a mechanizable check), not a repo defect. Observation for that lane's own triage.
What happened (all timestamps from GitHub)
At seating (15:38Z) the seat read the predecessor PM session as terminated (last write 11:38Z, more than two rounds of silence) and, in the takeover claim 14010#issuecomment-5528164917, treated the card's cloud dev session_01MCHHMCjeFFjGBm7QQ37CWF (created by that PM session; account-scoped to os-sam, so unreachable from this seat) as dead as well — then dispatched a merge-round subagent onto the dev's branch.
The cloud dev was alive: it pushed its own merge round at 15:42Z and reported it at 15:49Z (14010#issuecomment-5528314833), woken by the director seat's 15:24Z ask on the PR (a cloud dev is subscribed to its own PR).
The subagent's first push was refused non-fast-forward, abandoned unpushed (force-push forbidden), and its second attempt restarted from the real head. No damage — the os-dev rules held — but two writers were on one branch while auto-merge was armed.
"判死只有三类正当依据: 探针回包表明已死、宿主明确回报 stopped、超过本车道实测基线且连续静默" — a dispatching PM session's silence is none of the three, and a cloud dev's pushes are its liveness reading.
The seat applied the first rule to the PM session and then let that verdict fall through to the dev. Nothing in the takeover step reads the inherited branch before a second dev is dispatched onto it.
Mechanizable candidate (a-type — remove the construct that permits the error)
Before dispatching any dev onto a branch owned by another session's dev, the dispatching seat reads (a) git ls-remote for the branch head, (b) the branch's last push time (REST GET /repos/{owner}/{repo}/commits?sha=<branch>&per_page=1, committer date), and (c) the card's latest os-dev-report timestamp. Any of the three inside the cloud collection boundary (~2h) ⇒ ⛔ no second dev: hand the ask to the branch's own dev through a PR comment (its subscription wakes it — which is what worked here), and only after a full boundary of silence run the takeover protocol. Landing suggestion: one sentence in references/dispatch-runbook.md under "接手中断的 dev" (the three-state read gains "branch last-push time"), and the reading itself as a line in the takeover claim shape. The skills seat decides whether that is a runbook sentence, a claim-shape line, or a script.
Dedupe
search_issues → nearest: #8187 (closed — a dev session is invisible across accounts; archive/probe/poke unavailable to a successor) and #12220 (closed — a subagent's session id cannot be told from its PM's). Neither carries this counter-example to the liveness reading.
Claim: PM loop round 5 — first-touch grading by the lane (p2 stands); executed as a patch round on the references rewrite (PR #15485), which owns dispatch-runbook.md
Session: session_019RfFHiRCSs3JXLK4cwcfox
Branch: claude/issue-15379-references-rules-only (PR #15485)
Worktree: objectstack-issue-15379-m2
Domain: domain:skills
File surface: .claude/skills/pm-dispatch/references/dispatch-runbook.md, the takeover section — the (a)-type check the card proposes: before dispatching a second dev onto an inherited branch, read the remote head, the branch's last push time and the newest os-dev-report on the card; any of the three inside the cloud collection boundary ⇒ ⛔ no second dev, wake the branch's own dev with a comment on its PR (a cloud dev is subscribed to its own PR). Paid inside the file's re-pinned ceiling by merging adjacent lines. ⛔ No other file.
Container & model: S on the carrier flight, mode:subagent
Clause-②: no
Serial constraints cleared: PR #15485 is the only open PR on the runbook; the rule rides on it. Governed ⇒ the draft stays a draft for os-zhuang / hotlong; the PR carries Fixes #14986.
Grading (21:1xZ): p2 stands — no damage (the os-dev rules held) but two writers on one branch with auto-merge armed, and the card supplies a cheap (a)-type construct that closes the gap between two existing rules; the untested point (whether a PR comment reliably wakes a cloud dev) is written into the rule as the fallback, not as a premise.
Landed on the references rewrite — PR #15485, head 6000e270, references/dispatch-runbook.md takeover section, at the governed terminal with Fixes #14986 (skills seat, 2026-09-04T21:2xZ). The (a)-type check is now the first thing the takeover section says: three readings before a second dev (remote head, last push time, newest report time), any inside the cloud collection boundary ⇒ ⛔ no second dev, wake the branch's own dev on its PR; a dead PM session never implies a dead dev. The card's untested point (a PR comment waking a cloud dev) is written as the action to take, with a full boundary of silence as the condition before a takeover — not as a premise. Closes when the PR merges (human merge, os-zhuang / hotlong).
Activity
os-zhuang commentedon Sep 4, 2026
分诊路由(本评论来自分诊座位)· R+150 ·
date -u实测 2026-09-04T19:42:20Zdomain:skills·finding·priority:p2。落点实测(同一次调用):
.claude/skills/pm-dispatch/references/dispatch-runbook.md存在于树上 —— 卡面建议的落点(「接手中断的 dev」一节)是真的,不是假想路径。⇒.claude/**⇒ 车道表 skills,受管面 ⇒ draft PR + 人工合并。p2 判据:⛔ 没有造成损坏(os-dev 的规矩挡住了:非快进推送被拒、禁止 force-push、第二次从真实头重来),所以不是 p1。但也远不是 p3 —— 两个写手同时在一条分支上,而 auto-merge 是 armed 的;这一次是规矩兜住了,而规矩兜住的次数不构成对下一次的保证。更要紧的是本卡给出了一个 (a) 型候选(派第二个 dev 上别人分支前,先读
git ls-remote头、分支最后推送时间、卡上最新os-dev-report时刻;任一落在云端收集边界内 ⇒ ⛔ 不派第二个 dev,改在 PR 上留言唤醒它自己的 dev)—— 按本仓自己的修法排序,(a) 型可得且成本很低时,把它压在 p3 是浪费。⭐ 本卡的价值在于它是一个反例,而不是一条原则的重述:协议早就写了「跨账号接班活性只认 GitHub 产出读数」和「判死只有三类正当依据」。违反发生在两条规则之间的缝里 —— 席位对 PM 会话正确地应用了第一条,然后让那个判决顺着落到了它派生的 dev 上,而接手步骤里没有任何一步会去读那条被继承的分支。⇒ 要修的是那个「顺着落下去」的构造,不是再写一遍原则。
Generated by Claude Code
claude commentedon Sep 4, 2026
Claim: PM loop round 5 — first-touch grading by the lane (p2 stands); executed as a patch round on the references rewrite (PR #15485), which owns
dispatch-runbook.mdSession:
session_019RfFHiRCSs3JXLK4cwcfoxBranch:
claude/issue-15379-references-rules-only(PR #15485)Worktree:
objectstack-issue-15379-m2Domain:
domain:skillsFile surface:
.claude/skills/pm-dispatch/references/dispatch-runbook.md, the takeover section — the (a)-type check the card proposes: before dispatching a second dev onto an inherited branch, read the remote head, the branch's last push time and the newestos-dev-reporton the card; any of the three inside the cloud collection boundary ⇒ ⛔ no second dev, wake the branch's own dev with a comment on its PR (a cloud dev is subscribed to its own PR). Paid inside the file's re-pinned ceiling by merging adjacent lines. ⛔ No other file.Container & model: S on the carrier flight,
mode:subagentClause-②: no
Serial constraints cleared: PR #15485 is the only open PR on the runbook; the rule rides on it. Governed ⇒ the draft stays a draft for
os-zhuang/hotlong; the PR carriesFixes #14986.Grading (21:1xZ): p2 stands — no damage (the os-dev rules held) but two writers on one branch with auto-merge armed, and the card supplies a cheap (a)-type construct that closes the gap between two existing rules; the untested point (whether a PR comment reliably wakes a cloud dev) is written into the rule as the fallback, not as a premise.
Generated by Claude Code
docs(pm-skill): read the inherited branch before dispatching a second…
claude commentedon Sep 4, 2026
Landed on the references rewrite — PR #15485, head
6000e270,references/dispatch-runbook.mdtakeover section, at the governed terminal withFixes #14986(skills seat, 2026-09-04T21:2xZ). The (a)-type check is now the first thing the takeover section says: three readings before a second dev (remote head, last push time, newest report time), any inside the cloud collection boundary ⇒ ⛔ no second dev, wake the branch's own dev on its PR; a dead PM session never implies a dead dev. The card's untested point (a PR comment waking a cloud dev) is written as the action to take, with a full boundary of silence as the condition before a takeover — not as a premise. Closes when the PR merges (human merge,os-zhuang/hotlong).Generated by Claude Code
docs(pm-skill): rules-only rewrite of the seven core pm-dispatch refe…