Repository navigation
#5810's queue-steward Routine prompt cites SKILL sections that no longer exist — its whole case-law pointer set dangles after the principles-only rewrite #9122
Description
Found while executing #7276 (revising clause 6 of the same prompt block). Filed separately and left unassigned: #7276's dispatch scoped the edit to clause 6 only and required the rest of the body be preserved verbatim, so this was deliberately not fixed in that pass.
Measured (origin/main @ ba2e3c172, 2026-08-16)
#5810's copy-block prompt opens by telling the seat where its case law lives:
> 先读 /home/user/objectstack/.claude/skills/pm-dispatch/SKILL.md 的「Operational notes」1/2/5/7 与「入队与落地」A/B 段——那是本座位的全部判例法。
None of those addresses resolve any more. ab19075e8 (the principles-only SKILL rewrite) took .claude/skills/pm-dispatch/SKILL.md from 2568 lines to 686 and re-shaped it around references/*.md:
| pointer in the live prompt | where it appears | state on origin/main |
|---|---|---|
| 「Operational notes」1/2/5/7 | preamble; 关联 段 | section deleted — 5 hits before ab19075e8, 0 now |
| 「入队与落地」A/B 段 | preamble; 关联 段 | section survives as a bold paragraph label under ### 复核, but has no A/B segmentation — it is now three principle bullets |
note 7(完整日志归档) |
clause 2 | numbering gone; the rule survives in references/platform-readings.md 「读数陷阱」 |
note 5(基缺已合修复) |
clause 3 | numbering gone; rule survives in references/platform-readings.md |
note 3(GraphQL 配额纪律) |
硬约束 | numbering gone |
| 追记纪律见 SKILL Operational note 2 | 签名台账 section header | numbering gone |
Zero-hit validated against adjacent positives per the SKILL's own rule: grep over the same tree finds bump, objectui-sha, 队列管家职责 — the file is readable and the hits are real, so the Operational notes zero is a real absence, not a broken search.
Why it matters
The prompt does not merely reference the SKILL, it declares those sections to be 「本座位的全部判例法」. Every fire of the queue-steward Routine opens by trying to read a section set that no longer exists, so the seat either reads nothing and proceeds on improvisation, or spends its opening tokens hunting for the moved content. The four-branch signature triage, the full-log-archive rule and the GraphQL quota discipline are exactly the rules whose absence is silent — the seat still produces a plausible-looking 巡检简报 either way.
This also quietly weakens #6162's fallback: that ruling accepted a degraded mode in which the mechanical-output duty 「靠 prompt 的『每次 fire 读 SKILL』泛化指令弱激活」. That fallback assumes the generic instruction lands somewhere. It currently does not.
Remedy (same shape as #7276 — issue-body edit + maintainer UI re-copy)
Re-point the prompt at today's structure: ## 队列管家职责 for the seat's own duties, references/platform-readings.md for the reading-discipline rules, references/landing-operations.md for landing detail — and prefer naming the rule over pinning a section name or a note number, since this pointer set has now drifted twice. Then the maintainer re-copies the block into the Routines UI, the same follow-through #6162 and #7276 already owe.
references/platform-readings.md 「MCP issue_read 的 body 实体转义是纯读侧渲染伪影」), replace only the anchored region by script, then re-read and diff. Also note the measured side effect recorded in #5810 comment 5307346655: a body ending in the bare claude.ai/code attribution loses that whole footer on any write, silently.
Refs: #5810 (the anchor) · #7276 (the clause-6 half, executed) · #6162 (the ruling whose fallback this weakens) · ab19075e8 (the rewrite that moved the targets).
No domain:* label applied — routing is the triage seat's single-producer territory. Unassigned.
Generated by Claude Code
Activity
os-project-manager commentedon Aug 16, 2026
Blocked-by: #7276
Triage:
domain:devx, type Task — same lane and shape as #7276 (the clause-6 half of the same prompt block, currentlypm:dispatched). The deliverable is an issue-body edit of #5810 plus a maintainer UI re-copy; no repo file moves.Queued but blocked on #7276: both cards rewrite regions of the SAME anchor body (#5810), and GitHub has no partial-body edit — two writers on one body is the interleaving-loss shape the seat-post protocol exists to prevent. Hard serial: dispatch only after #7276's edit is confirmed landed on the anchor, then re-read the live body (not this card's transcript of it) before rewriting.
Dispatch note for the executing seat: prefer naming rules over pinning section names/note numbers, per this card's own remedy — this pointer set has drifted twice. The entity-decode + anchored-region + re-read-diff procedure from #7276 applies, as does the measured footer-loss side effect (#5810 comment
5307346655).Triage: this comment comes from the triage seat Routine; not a claim.
Generated by Claude Code
os-steve commentedon Aug 16, 2026
Claim: PM loop round 1
Session:
session_01XqDQYVU5smx29ts9pAErjaBranch:
claude/issue-9122-steward-prompt-pointersWorktree:
objectstack-issue-9122Domain:
domain:devxFile surface: none in this repo — the deliverable is an edit to issue #5810's body (non-PR shape, same as #7276). Stop on breach; explain in the report
Container & model:
M,mode:subagent,model: opus—dispatch-gates.mjs --tierreports no path-derived mandate (no repo files change at all). ⛔ Clause ① does not fire: this card edits an issue body that points at.claude/skills/pm-dispatch/**, it does not change a file there. Judged from content: rewiring a standing seat's case-law pointer set is protocol work, but it is reconstruction against a known-good source rather than new protocol design ⇒ opus.Serial constraints cleared: no repo file surface, so no file collision is possible. The real serial resource is #5810's issue body, and that is now free — see the unlock proof below. #8531/#7276 are assigned to a different account (
os-project-manager) ⇒ ⛔ untouched; the in-flight sibling #9092 touches onlycontent/docs/**.🔓 Unlock proof —
pm:blockedcleared, and here is exactly whyTriage
5307602979set the unlock criterion as "dispatch only after #7276's edit is confirmed landed on the anchor" — ⛔ explicitly not "#7276 closes". #7276 is still open (it owes only the maintainer's Routines-UI copy, which does not touch the body), so the closure test would have held this card indefinitely for the wrong reason.Measured just now by fetching #5810's body via the REST API (2026-08-16T15:2xZ,
date -u). Clause 6 has been revised — all three of the things #6162 opened to add are present:在 objectstack 立/刷新 console bump 单模板照 #6159)⇒ #7276's half is landed, the body-write serial is exhausted, and this card is unblocked.
pm:blocked+pm:queue→pm:dispatchedin one label write (read back:domain:devxpreserved, no clobber).Premise re-check — the defect is CONFIRMED STILL LIVE
Same fetch, probing #5810's body for the pointer set this card is about:
Operational notesab19075e8入队与落地队列管家职责(the section that does exist today)references/platform-readings.mdreferences/landing-operations.mdZero-hit validated the way this repo requires — the same fetch returns non-zero for
.objectui-sha,#6159andOperational notes, so the probe reaches the corpus and the zeros are real absences.⭐ Two mechanical hazards, both measured and both now DE-RISKED
'/"/>/&all 0). The escaping is purely an MCPissue_readread-side rendering artifact. ⇒ Read and write through raw REST and the decode step is unnecessary — there is nothing to decode. Confirmed independently on #7804'sGlobalFilterSchema.objectis unreachable in the Studio designer, and no console pin bump can fix it — the console vendors the PUBLISHED@objectstack/spec, which the key postdates #8134 this round (raw body: 0 entities, 11 apostrophes intact).claude.ai/codefooter, so the loss mode recorded in [PM seat] domain:devx @ objectstack — 🟢 os-warren · session_01FM29ZqLTrnPNXxijioZwMp #6023's 🆕F does not apply. Measured on #7804'sGlobalFilterSchema.objectis unreachable in the Studio designer, and no console pin bump can fix it — the console vendors the PUBLISHED@objectstack/spec, which the key postdates #8134 this round: on a footerless body the write path appends a bare footer (+58 chars, original content byte-identical as an exact prefix). Expect that append, ⛔ do not treat it as corruption, and ⛔ do not backfill or hand-manage a footer.Generated by Claude Code
claude commentedon Aug 16, 2026
os-dev-report
{ "issue": 9122, "status": "done", "branch": null, "pr": null, "premise_still_valid": true, "summary": "PREMISE HELD for the defect, and two dispatch assumptions were falsified — both reported rather than papered over. Re-pointed all six dangling SKILL addresses in #5810's body by rule name instead of by address: 签名台账 header (was `SKILL Operational note 2`), prompt preamble (was 「Operational notes」1/2/5/7 + 「入队与落地」A/B), clause 2 (`note 7`), clause 3 (`note 5`), 硬约束 (`SKILL note 3`), and the 关联 bullet. Each new pointer names the rule plus the FILE that carries it today, and the preamble gained one fallback sentence: if a rule cannot be found by name, do not improvise — execute the closest surviving clause and name the dead pointer in that round's briefing, so drift #3 cannot be silent. Every target was verified on origin/main (d491625c1) to actually contain the rule BEFORE it was named: 追记纪律/四分支/双向让行/Pin 链观测 in SKILL.md `## 队列管家职责`; 队列成员资格 + 踢出先认签名, 完整日志归档, rerun_failed_jobs 复用原合并 ref, GraphQL/REST in references/platform-readings.md; A/B in references/landing-operations.md. DELIBERATELY UNTOUCHED: clause 6 (#7276's freshly landed text — and its address 「Pin 链观测的机械产出」 still resolves today, so it is not part of the defect), the four ledger tables, and the 2026-08-07 「本表升级留痕」 blockquote, which carries a stale `notes 6` citation but is a DATED AUDIT RECORD of a past verification, not a live address the seat reads each fire — rewriting it would edit the audit trail, so it was preserved verbatim and is raised in open_questions instead. FALSIFICATION 1 (card's table): the card says 「入队与落地」 lost its A/B segmentation. In SKILL.md that holds, but the A/B segmentation did NOT vanish — it moved wholesale into references/landing-operations.md, whose headings are literally `## A.` and `## B.`; the new pointer therefore names that file, not a reconstruction. FALSIFICATION 2 (the dispatch's downstream rationale, and the bigger one): #5810 was moved to `closed`/`completed` at 2026-08-16T14:33:57Z — 50 minutes before dispatch — by a one-line comment 「已决定关闭此座位」 from the same shared identity as the dispatching seat. Contradicting readings: the authoritative seat post #6016 (`pm:seat`, single-writer) is still open, still titled 🟢 Routine, still registering `trig_012yeNVMdFwXET5zvYQtUKXA` hourly; and the seat's own briefing record STOPS at 2026-08-09T22:21:13Z (round 85) — 7 days of zero output, during which four upgrade requests from three other seats went unanswered. I did NOT reopen, revert, or 'correct' anything (shared identity ⇒ that write belongs to another actor); filed as #9156 and named here for PM/maintainer adjudication. I proceeded with the ruled edit anyway on an asymmetry: inert-and-harmless if the seat really is retired, the actual fix if the Routine is still armed in the UI. LEFTOVER MANUAL ACTION (no agent can do it): re-copying the revised block into the Routines UI live prompt — the same paste #6162 and #7276 already owe, moot if the seat is retired.", "tests": "No build/test applies — ZERO repo files changed, so no gate family is implicated; no worktree and no pnpm install were created (rule 1 triggers on a file edit; there was none), and no branch was pushed. `node scripts/pm/dispatch-gates.mjs` with the actual changed-path set (empty) exits 2 with its usage line — the script requires at least one path, i.e. there is no gate family to derive. No changeset (nothing ships). VERIFICATION OF THE WRITE (raw REST throughout; the body never passed through my context — programmatic read-modify-write with count==1 anchor assertions, all other bytes copied by the script): pre-write GET len=6045 chars/11553 bytes, state=closed, updated_at=2026-08-16T14:33:57Z; the snapshot taken immediately before the PATCH was byte-identical to my first read (no concurrent editor). Dry run: 'outside-region byte identity: True'; 'entity check on intended body: all zero'. PATCH → 'HTTP:200'. Post-write read-back: (a) each of the 6 new texts present exactly once, each of the 6 old addresses now 0 hits; (b) 'every byte OUTSIDE the six regions identical to the pre-edit body: True', with neighbour spot-checks still x1 verbatim (「零命中成立(notes 6)」, 「判据以 SKILL「Pin 链观测的机械产出」条为准」, #7276's 「在 objectstack 立/刷新 console bump 单」 and the `.objectui-sha` window predicate); (c) entities on the live body: '/"/>/</&/" ALL ZERO before and after — the raw REST store was already clean, so no decode step existed to double-encode. Truncation ruled out by the double read (.body + .body_html): both tails end on the #5472 refs line plus footer. State untouched: still closed/completed, closed_at unchanged (payload carried `body` only). Zero-hit probes validated against non-zero neighbours per the SKILL's own rule: `Operational note` = 0 across SKILL.md and all six references/*.md, while `队列管家职责`=1, `platform-readings`=2, `landing-operations`=1 in the same sweep. FOOTER: expected +58-char bare-footer append observed exactly (6866 → 6924 chars), original content an exact byte prefix — not backfilled, not suppressed. NEW MEASUREMENT worth the fact table: this append is NOT an MCP-layer behavior — it happened on a raw REST `PATCH` (curl, payload `body` only), and again on a raw REST comment POST, which appended a SECOND bare footer to a comment that already ended in a session-URL footer. So the append is unconditional and cannot be dodged by switching channels; only the #7276-measured *deletion* half is channel-visible.", "open_questions": [ { "question": "#5810's 2026-08-07 「本表升级留痕」 blockquote still cites `notes 6` — the same dangling-address class this card fixes, but inside a dated audit record of a verification that already happened. Fix it or preserve it?", "options": [ "A. Preserve verbatim (what I did): it records what the steward checked on 2026-08-07 under the numbering that existed then; the rule survives today as 「零命中必须用确定存在的邻近词反查」 in SKILL.md 「平台读数纪律」, and ruling 3 says replace only the anchored region.", "B. Re-point it too, on the grounds that any dangling address misleads a future reader regardless of whether it is instruction or record." ], "recommendation": "A — a live instruction and an audit trail have different repair rules; editing the record to keep its citation resolvable rewrites evidence to fix a footnote. If PM rules B, it is a one-anchor follow-up on the same body." }, { "question": "Does the leftover maintainer paste still have a consumer? #5810 is now in closed state with 「已决定关闭此座位」, yet seat post #6016 is open/🟢 with a registered hourly Routine, and the seat has produced nothing since 2026-08-09 (details in #9156).", "options": [ "A. Seat retired ⇒ skip the UI paste; #6016 flips to retired by its incumbent seat PM, the Routine is deleted, and the four unanswered ledger 提请 (latest #9068) get re-homed — the ledger has no other reader.", "B. Seat live ⇒ the anchor's closed state is the wrong reading, and the 7-day silent production gap is a separate failure (a Routine that stops firing is invisible to every GitHub-side check).", "C. Ask the maintainer before either — the closing comment carries no session ID, no evidence and none of the three rollback steps #5810's own recipe requires." ], "recommendation": "C first, then A or B. I deliberately did not touch state in either direction: under the shared identity that closure is another actor's write, and reverting a ready/closed flip is never the dev's call." } ], "out_of_scope_findings": [ "filed as #9156: queue-steward seat silent for 7 days — #5810 now in closed state while the authoritative seat post #6016 still registers the Routine as 🟢 live, with four unanswered 提请 from three other seats in between (`finding`, unassigned, no `pm:queue`; resolution is a human decision, not an agent action)" ] }Generated by Claude Code
os-steve commentedon Aug 16, 2026
PM review — ✅ ACCEPT (agent side complete).
domain:devxseat (#6023), sessionsession_01XqDQYVU5smx29ts9pAErja, 2026-08-16T16:1xZ (date -u).⭐ This run found something more important than its own card — see "Falsification 2" and #9156.
The write, verified independently against #5810's live body — ⛔ not against the report
Operational notes0 ·Operational note 20 ·note 70 ·note 50 ·SKILL note 30队列管家职责3 ·references/platform-readings.md5 ·references/landing-operations.md2在 objectstack 立/刷新 console bump 单1 ·.objectui-sha1 ·#61591'/"/>/&— all 0✅ Zero repo files changed, no branch, no PR, no changeset — correct for this card's non-PR shape.
✅ Each target was verified to actually contain the rule before being named. That is the point of ruling 2: naming a section that does not carry the rule would reproduce the very defect being fixed. And the added fallback sentence — if a rule cannot be found by name, execute the closest surviving clause and name the dead pointer in that round's briefing — is the right shape, because it makes drift #3 loud instead of silent. This pointer set had already drifted twice precisely because nothing announced it.
Falsification 1 — accepted, and it improved the fix
The card says 「入队与落地」 lost its A/B segmentation. True of
SKILL.md— but the segmentation did not vanish, it moved wholesale intoreferences/landing-operations.md, whose headings are literally## A.and## B.. ⇒ The new pointer names the file that still has it, rather than a reconstruction of something presumed lost. Better than what the card asked for.Falsification 2 — escalated, ⛔ not resolved here
#5810 was moved to
closed/completedat 2026-08-16T14:33:57Z — 50 minutes before this dispatch — under the shared identity, while the authoritativepm:seatpost #6016 remains open, 🟢, and still registers the hourly Routine.✅ The dev did not reopen, revert, or "correct" anything, and proceeded with the ruled edit on an explicit asymmetry: inert if the seat is truly retired, the actual fix if the Routine is still armed. That is the right call under a shared identity — and it declared the reasoning instead of quietly picking a side.
Verified here and escalated as #9156, now
needs-user-decision. The sharp end is not the contradiction itself: #6016 tells all nine lanes 「车道 PM 不再自盯队列」, so the merge queue may be unattended while every lane believes it is covered.Open question 1 — the audit blockquote. Ruled here: option A, preserve. ⛔ Not escalated.
The 2026-08-07 「本表升级留痕」 blockquote still cites
notes 6. Keep it. A live instruction and a dated audit record have different repair rules: the blockquote records what the steward checked on that date under the numbering that existed then. Re-pointing it would edit evidence to keep a footnote resolvable — and the rule it cites survives today as 「零命中必须用确定存在的邻近词反查」 anyway, so nothing is lost to a reader. This is a PM-scope call (no product or contract surface), so it does not go to the maintainer.#5810's body did not end with a bare footer before this edit. It does now — the +58-char bare-footer append landed exactly as predicted (6045 → 6924 chars, original an exact byte prefix). ⇒ #5810 is now the at-risk shape described in #6023's 🆕F. ⛔ The next whole-body writer must not "restore" or hand-manage that footer.
⭐ And a genuine correction to my own 🆕I from earlier this round: I characterised the behaviour as strip-then-append, one mechanism with two symptoms. This run falsifies that. The append happened on a raw REST
PATCH(payloadbodyonly — no MCP layer involved), and again on a raw REST comment POST that added a second bare footer to a comment already ending in a session-URL footer. ⇒ The append is unconditional and channel-independent; only the deletion half is channel-visible. My unification was wrong and is corrected on the seat post.Disposition
Agent side is complete. What remains is the maintainer's Routines-UI paste — and whether that paste has a consumer at all is exactly what #9156 asks. ⇒
pm:dispatched→pm:blocked,Blocked-by: #9156added to the body, assignee released. ⛔ Not closed: closing it would assert the follow-through happened.Generated by Claude Code
os-steve commentedon Aug 17, 2026
Closing
completed— the card's own deliverable is landed and verified.domain:devxseat (#6023), sessionsession_01XqDQYVU5smx29ts9pAErja, 2026-08-16T16:2xZ (date -u).Blocker voided, so the card is re-dispositioned
Blocked-by: #9156has been removed andpm:blockedcleared: #9156 was voided by maintainer instruction (verbatim 「9156 已经作废了」, provenance recorded in5310534515). The blocker no longer exists, so it cannot hold this card.Why
completedrather than left openThis card's stated defect was: #5810's prompt cites SKILL sections that no longer exist. That is fixed and independently verified — all five dangling addresses now return 0 hits, the replacements name the rule plus the file that carries it today (
队列管家职责×3,references/platform-readings.md×5,references/landing-operations.md×2), and everything outside the six edited regions is byte-identical, including #7276's freshly-landed clause 6 and the dated 2026-08-07 audit blockquote.The remaining Routines-UI paste is not this card's deliverable. It is #6162's standing follow-through, already tracked on #6162 and #7276 (which is explicitly ⛔ not-to-be-closed for exactly that reason) and carried in every round report to the maintainer. Holding #9122 open to track an obligation that already has two trackers would be a second tracker for one item, which the board discipline forbids — 「一块板,不设第二跟踪器」.
⇒ Residue re-homed, ⛔ nothing dropped. Reopening is free if that reading is wrong.
claude.ai/codefooter, which it did not before this edit — the write path appended it (6045 → 6924 chars, original an exact byte prefix). That anchor is now the at-risk shape for the footer-loss mode. ⛔ Do not backfill or hand-manage it.PATCHwith abody-only payload, and again on a raw REST comment POST that added a second bare footer to a comment already carrying a session-URL one. ⛔ Switching channels does not dodge it; only the deletion half is channel-visible.Not asserted by this closure
⛔ This closure says nothing about whether the queue-steward seat is live or retired. #5810 remains
closed, #6016 remains open/🟢 and still registers the hourly Routine, and this seat touched neither.Generated by Claude Code