Repository navigation
skills(pm-dispatch): the Claim template carries an Account: line beside Session:, paid inside the ratchet - #20109
Merged
objectstack-fleet[bot] merged 1 commit intoSep 25, 2026
Conversation
…de Session:, paid by the seat-lifecycle pointer line The claim comment now records the seat's GitHub account (the seat's linked user as GET /user answers it, always equal to the card's assignee) next to the session id, so a thread reader can tell which account handles a card without leaving the thread. Ownership stays the session id; the Account: line is a derived view of the assignee, and a mismatch on a live claim is a half-state the owning seat corrects at its next write. Takeover step 3 carries the new account in the same stroke as step 2 swaps the assignee. SKILL.md pays the +1 template line by deleting the 入口与角色 pointer to references/seat-lifecycle.md 〈开轮互斥〉, whose content lives there and whose routing the 阶段细则索引 row already carries. execution-duties.md is rewritten in place (net 0, every line within 120 bytes). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0148fenvVvyQV9HYxgVDQ33q
Contributor
Author
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Rendered in-seat at 2026-09-25T05:28Z on the fetched head, diff read three-dot against Generated by Claude Code |
objectstack-fleet
Bot
deleted the
claude/issue-20103-claim-account-line
branch
September 25, 2026 06:09
This was referenced Sep 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #20103
Clause-②: no
Summary
The
Claim:comment template now carries the seat's GitHub account beside the session id, so a thread reader can tell which account handles a card without leaving the thread (every content write leaves as the fleet bot, so the comment's author field says nothing). Ownership stays the session id: the new line is a derived view of the card's assignee, a mismatch on a live claim is a half-state the owning seat corrects at its next write, and takeover step ③ carries the new account in the same stroke as step ② swaps the assignee. Text only, two files, every path under.claude/**(Tier S — stays DRAFT; no ready flip, no enqueue, no auto-merge).Implemented as the card's 「What lands」 items 1 and 2 under the maintainer's 「确认」 / 「而且这个优先派发」 quoted on the card. Item 3 is untouched by design: no dev-agent definition edit, no patrol row, no report-JSON field, no gate.
What changed — per file (line counts before → after; both ceilings unchanged)
.claude/skills/pm-dispatch/SKILL.md.claude/skills/pm-dispatch/references/execution-duties.mdSKILL.md 模板与表 — the
Claim:template (+1 line, 104 B, inside the fenced block so byte-cap exempt): immediately after theSession:line, a new lineAccount: LOGIN (the seat's linked user as GET /user answers it; always the card's assignee)— LOGIN standing for the backticked placeholder spelled the same way as the template's other placeholders.SKILL.md ratchet payment (−1 line): deleted the 入口与角色 bullet 「开轮互斥的四读数、开轮标记与章程触碰核对见
references/seat-lifecycle.md〈开轮互斥〉。」 (118 B). Where its content still lives: the rules themselves — the four readings, the round-open marker and the charter-touch check — arereferences/seat-lifecycle.md〈开轮互斥〉 (lines 7–22 of that file); the routing is already carried by the 阶段细则索引 row forreferences/seat-lifecycle.md(读者 「每个座位每次 fire:开轮互斥读数前、收班前」, 承载 「开轮互斥 · …」). The ratchet script's own history note for the 819 → 319 cut records those rules as relocated verbatim (「Relocation, not deletion」), so the bullet was a leftover pointer duplicating the index row. Not touched: thebatchrow, 报告契约, the four-axis block (md5abff5f852c8fd09b79ec0623439aa4f0unchanged; it shifts up one line), the 路径分叉 block.execution-duties.md 〈认领〉 — two lines rewritten IN PLACE (net 0; the file has headroom 0 and a 120-byte cap):
Account:派生自 assignee,不等即半态、持卡席下笔补正。」 It keeps the ownership key (归属 = session ID) and the author-field prohibition verbatim, and adds the card's sentence: derived view of the assignee, mismatch = half-state, the owning seat corrects it at its next write. Three clauses left the line because each is stated elsewhere: 「共享身份下 assignee 只答有无认领」 (AGENTS.md: the assignee field is only a presence bit; SKILL.md 状态模型 rows), 「正文」 (SKILL.md 全体座位的不变量: 归属 = 文本里的 session ID), 「接管同此」 (takeover ③ below carries the new session).--unassign 旧 --assign 新);③ 新Claim::新 session、续用分支与远程 sha。」 → 「- ② assignee 同笔换人(--unassign+--assign);③ 新Claim::新 session 与Account:,续用分支与 sha。」 The 旧/新 flag values and 「远程」 were the only bytes that could pay forAccount:under the cap (④ on the next line still names 「旧分支最后已 push 的 sha」).Measured against the 120-byte cap (why the dispatch's suggested wording was not used)
The suggested identity sentence measures 141 B and every takeover variant that keeps 「旧/新」 and 「远程」 beside
Account:measures 125–134 B (LC_ALL=C awk length). No line in 〈认领〉 can be freed at ≤ 120 B without splicing two rules onto one line, so the half-state sentence landed inside the identity line rather than beside it.Reverse check (one-off, restored from HEAD, not left in the tree)
Re-adding the deleted pointer line to the committed tree (320 lines, verified on disk: injected-text count 1) turns
pnpm check:pm-skill-ratchetred — exit 1, 「SKILL.md is 320 lines; the ratchet ceiling is 319」 — which proves the +1 template line is real and the payment necessary. Restore:git checkout HEAD --on the file, thengit diff HEAD --quietexit 0 andgit hash-object= HEAD blob29505114da9eb3cff3792311bdc9d5076d3bca7f.Gates — every derived family, run locally at head
b3c74bee(exit captured before any pipe)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ranreconciles 20 derived / 20 run / 0 unrun; plus the two self-tests the dispatch named.pnpm check:pm-skill-ratchet(SKILL.md 319/319 · execution-duties.md 183/183, every line ≤ 120 B)pnpm check:pm-skill-id-lint(34 files clean)pnpm check:skill-frame-sync·pnpm check:skill-frame-freshnesspnpm check:pm-governed-prose·pnpm check:nul-bytesnode scripts/pm/post-stamped.mjs --self-test(610 cases; the claim key-line readers are unaffected by anAccount:line)pnpm check:pm-half-states(4912 cases) ·pnpm check:pm-expected-skips·pnpm check:pm-governed-mergesnode scripts/check-closing-keyword-parity.mjs·--self-test·node scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-test·node scripts/pm/check-harness-current.mjs --self-testpnpm check:agent-test-spelling·check:cross-package-test-inputs·check:doc-authoring·check:driver-memory-censuspnpm check:gitlink-declared·check:refd-timer-probe·check:watch-hint-literalpnpm --filter @objectstack/lint run check:doc-formula-expressions(afterpnpm --filter '@objectstack/lint...' buildunder the verify lock, 207 s shared-box)skip-changeset: nothing under.claude/**is published by any package'sfiles[].Follow-up — noted, not built
A
check-half-states.mjspatrol row for 「newest live claim'sAccount:≠ assignee」 would make the half-state mechanically visible; per the card it needs the maintainer's own words naming it, so it is recorded here only.Acceptance notes
check-clause2-carriers.mjsbindingCLAIM_HANDOVER_SENTENCE_LINESto 〈认领〉 text: no such script exists onorigin/mainat8d76c2d(git grepoverscripts/finds neither name), and no script pins a 〈认领〉 sentence by bytes — measured before rewriting.origin/mainfirst and re-runs the ratchet. If a sibling deletes this same pointer line, the later tree lands at 320 and must re-pay.维护者速读(草稿)
改了什么
PM 的认领评论模板新增一行
Account:,写席位登录的 GitHub 账号(与卡片 assignee 相同),放在Session:旁边;执行席细则的〈认领〉一节改两行:Account:只是 assignee 的派生视图、归属仍是 session ID、两者不一致即半状态由持卡席下次写入时改正;接管协议第 ③ 步的新认领同笔带上新账号。SKILL.md 多出的一行由删掉一条指向seat-lifecycle.md的重复索引行来支付,两个文件行数不变。为什么改
所有写入都以车队机器人身份落地,评论作者栏看不出是哪个席位账号在处理;目前账号只在座位贴标题、卡片 assignee 和 PR assignee 上,认领评论本身没有。加这一行后,读线程的人不必离开线程就知道是谁在做。
风险与代价(含回滚)
纯文本改动,无门禁、无脚本、无 JSON 字段变化;本地 23 个门禁族全绿。代价是删掉一条重复的索引行(内容与路由都仍在索引表和
seat-lifecycle.md里)和〈认领〉两行的压缩改写(超出 120 字节上限的措辞已实测排除)。回滚 = revert 本 PR,一次 revert 即可,无数据迁移。席位意见
(留空)
你要做的
本 PR 是 Tier S 受管面,保持草稿:由 skills 席按达档复核 PASS 后落地;你无需操作。若要让「
Account:≠ assignee」进入半状态巡查,请单独用你的原话点名一条巡查行,那是后续单。Generated by Claude Code