Skip to content

skills(pm-dispatch): the Claim template carries an Account: line beside Session:, paid inside the ratchet - #20109

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20103-claim-account-line
Sep 25, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20103-claim-account-line

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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)

File Before After Ceiling
.claude/skills/pm-dispatch/SKILL.md 319 319 319
.claude/skills/pm-dispatch/references/execution-duties.md 183 183 183

SKILL.md 模板与表 — the Claim: template (+1 line, 104 B, inside the fenced block so byte-cap exempt): immediately after the Session: line, a new line Account: 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 — are references/seat-lifecycle.md 〈开轮互斥〉 (lines 7–22 of that file); the routing is already carried by the 阶段细则索引 row for references/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: the batch row, 报告契约, the four-axis block (md5 abff5f852c8fd09b79ec0623439aa4f0 unchanged; 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):

  • Identity sentence (114 B → 117 B): 「- 共享身份下 assignee 只答有无认领;身份只认正文 session ID,⛔ 不认作者字段,接管同此。」 → 「- 归属 = session ID,⛔ 不认作者字段;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).
  • Takeover ②③ (118 B → 119 B): 「- ② assignee 同笔换人(--unassign 旧 --assign 新);③ 新 Claim::新 session、续用分支与远程 sha。」 → 「- ② assignee 同笔换人(--unassign+--assign);③ 新 Claim::新 session 与 Account:,续用分支与 sha。」 The 旧/新 flag values and 「远程」 were the only bytes that could pay for Account: 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-ratchet red — 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, then git diff HEAD --quiet exit 0 and git hash-object = HEAD blob 29505114da9eb3cff3792311bdc9d5076d3bca7f.

Gates — every derived family, run locally at head b3c74bee (exit captured before any pipe)

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran reconciles 20 derived / 20 run / 0 unrun; plus the two self-tests the dispatch named.

Family Exit
pnpm check:pm-skill-ratchet (SKILL.md 319/319 · execution-duties.md 183/183, every line ≤ 120 B) 0
pnpm check:pm-skill-id-lint (34 files clean) 0
pnpm check:skill-frame-sync · pnpm check:skill-frame-freshness 0 · 0
pnpm check:pm-governed-prose · pnpm check:nul-bytes 0 · 0
node scripts/pm/post-stamped.mjs --self-test (610 cases; the claim key-line readers are unaffected by an Account: line) 0
pnpm check:pm-half-states (4912 cases) · pnpm check:pm-expected-skips · pnpm check:pm-governed-merges 0 · 0 · 0
node scripts/check-closing-keyword-parity.mjs · --self-test · node scripts/check-comment-mask-corpus.mjs 0 · 0 · 0
node scripts/pm/check-governed-queue-guard.mjs --self-test · node scripts/pm/check-harness-current.mjs --self-test 0 · 0
pnpm check:agent-test-spelling · check:cross-package-test-inputs · check:doc-authoring · check:driver-memory-census 0 · 0 · 0 · 0
pnpm check:gitlink-declared · check:refd-timer-probe · check:watch-hint-literal 0 · 0 · 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions (after pnpm --filter '@objectstack/lint...' build under the verify lock, 207 s shared-box) 0

skip-changeset: nothing under .claude/** is published by any package's files[].

Follow-up — noted, not built

A check-half-states.mjs patrol row for 「newest live claim's Account: ≠ 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

维护者速读(草稿)

改了什么

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

…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
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b3c74beeb90d994f90760464ed24eed033bed7bd

① Derived judgments

  • Accept set / public surface: none moves — both changed paths are under .claude/** (the seat protocol text); no package files[] ships them; no schema, error code, route or flag is touched. The card's Clause-②: no holds.
  • SKILL.md 模板与表, the Claim: template: one new line Account: beside Session: — the seat's linked user as GET /user answers it, always the card's assignee — the maintainer's 「确认」 on the seat's recommendation, as written; the fenced block is byte-cap exempt; 319 / 319 after paying with the 入口与角色 pointer line whose routing the 阶段细则索引 row already carries (rules unchanged in references/seat-lifecycle.md); the four-axis block byte-identical; the batch row and 报告契约 (sibling regions) untouched.
  • references/execution-duties.md 〈认领〉 :55: 归属 = session ID and ⛔ 不认作者字段 kept verbatim; Account: declared a derived view of the assignee, a mismatch a half-state the owning seat corrects at its next write — the card's item 2; the clauses it dropped are each stated on origin/main (AGENTS.md :398 presence bit; SKILL.md :93 归属 = 文本里的 session ID; takeover ③); 117 B; 183 / 183.
  • references/execution-duties.md :78, takeover ②③: the new Claim: carries 新 session 与 Account: in the same stroke as ② swaps the assignee — the card's item 2 second half; 119 B; 「远程」 survives in ④ on the next line.
  • No issue number enters operational text (check:pm-skill-id-lint 0); governed prose intact (check:pm-governed-prose 0); the claim key-line readers unaffected (post-stamped.mjs --self-test 0, check:pm-half-states 0).

② Semver level

  • None owed: nothing published; skip-changeset is the correct declaration.

③ Boundary flags

Implemented-by: claude/issue-20103-claim-account-line
Reviewed-by: session_0148fenvVvyQV9HYxgVDQ33q

VERDICT: PASS

Rendered in-seat at 2026-09-25T05:28Z on the fetched head, diff read three-dot against origin/main aa04ea2; landing = every check green on this head, then the relay.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 25, 2026 05:44
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit 7a13e05 Sep 25, 2026
31 of 32 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-20103-claim-account-line branch September 25, 2026 06:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants