docs(pm-dispatch): timestamped readings are the first construct-shaped fix; record the remediation-shape ranking beside it - #14784
Merged
Conversation
…d fix; record the remediation-shape ranking beside it Every board / tree / queue reading a PM seat states — in a claim, a dispatch order, a review, a round report, a seat-post segment — carries the UTC moment it was taken (and the ref or tip when the reading is of a tree). A reading without its timestamp is malformed, not current: the reader treats it as untaken. Folded into the reading-validity bullet of 平台读数纪律 beside the zero-hit control rule, which has the same shape. Recorded beside it: when a PM-side failure is recorded, the amendment prefers (a) remove the construct that permits the error, then (b) make the correct form the only one the protocol spells, then (c) add a check the PM must remember — (c) recurred, (a) held. Maintainer ruling 2026-09-02, verbatim: 「其他同意」 (adopting B + A). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
This was referenced Sep 3, 2026
os-zhuang
approved these changes
Sep 3, 2026
os-zhuang
marked this pull request as ready for review
September 3, 2026 02:33
os-zhuang
enabled auto-merge
September 3, 2026 02:33
Contributor
This was referenced Sep 3, 2026
Contributor
This was referenced Sep 3, 2026
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Sep 3, 2026
This was referenced Sep 3, 2026
This was referenced Sep 3, 2026
This was referenced Sep 3, 2026
Merged
os-project-manager
deleted the
claude/issue-12911-timestamped-readings
branch
September 3, 2026 09:56
This was referenced Sep 3, 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 #12911
Governed surface (
.claude/**) — DRAFT, human merge only; never flipped ready, never queued, never armed. Review requests are the dispatching seat's step, not this flight's.The ruling, verbatim and untranslated
Director seat, summon #8, 2026-09-02 (comment 5507671383 on the card). Provenance: maintainer, live PM chat with the director seat, replying to decision batch #4 in which this card was item 3. Verbatim reply:
「其他同意」 adopts B + A. The ruled text, verbatim:
Nothing is re-decided here. C and D stay refused; the other three instruments stay un-mechanised (that non-action is recorded on the card, not in the skill text — the skill carries rules, not history).
What landed —
.claude/skills/pm-dispatch/SKILL.mdonlyOne bullet in 「平台读数纪律」 grew by six continuation lines; no existing line was changed, moved or re-wrapped (
git diff --stat: 1 file, 6 insertions, 0 deletions).Where and why there. B is folded into the existing reading-validity bullet — 「零命中必须用确定存在的邻近词反查, 否则零命中不成立」 — because it has exactly the same shape: a condition under which a reading is not a reading. A zero without a control does not hold; a reading without its timestamp is malformed. One rule, stated once, in the file's own register; no new bullet.
Before (origin/main
224f8ea4, L163–L165 — the whole bullet):After (
3612bd4e1, L163–L171; L163–L165 byte-identical, L166–L171 new):Line arithmetic, from the gate's own verdict lines (
pnpm check:pm-skill-ratchet):224f8ea4✓ … SKILL.md is 989 lines (ceiling 1005; headroom 16).642 bytes (pin 642; headroom 0)3612bd4e1✓ … SKILL.md is 995 lines (ceiling 1005; headroom 10).642 bytes (pin 642; headroom 0)Spent: 6 of 16. Paid by deletion: none — I looked for a restatement beside the landing site to delete and found none. Each of the neighbouring bullets' load-bearing phrases is single-sited in this file (
维护者中止×1 at L173,聚合读数×1 at L170,共享检出×1 at L162,对向事实×1 at L181,pin 反转×1 at L182,邻近词×1 at L163);查重appears 8× but every other occurrence is a pointer or a different rule (cross-repo shadow check, sub-issue channel), not a restatement of the L176 立单前查重 rule. So the six lines come from headroom, and no #13597-style Phase-2 cut was started. ⛔ No re-wrap as payment: the diff is insertions only. ⛔ No ceiling raise. The first attempt at these lines was 126–133 bytes wide and the ratchet's length rule went red on L166–L169 (4 line(s) over the 120-byte budget); only the six NEW lines were re-wrapped to ≤118 bytes — that is wrapping my own text, not paying with the file's.Verification facts, as the ruling asked
(1) Did #11901's construct-removal ever reach persistent skill text? — Yes. It landed 2026-08-25, three days before the card.
The triage comment (2026-08-28) concluded 「#11901 的那次「construct-removal」没有落进任何持久指令文本」 from a zero on the single spelling the card's re-check used (
绝对路径). That zero is real but measures the wrong spelling. Searched on origin/main224f8ea4across.claude/skills/pm-dispatch/**and.claude/agents/os-dev.md(git grep -c -F, summed hits; every zero has a positive control beside it):绝对路径angle-bracket/angle bracket/placeholder/spell it in words尖括号占位git show origin/main:+ path,git checkout HEAD --+ path …), the same four the triage already classified as not the construct — plus os-dev.md's ablation recipesdomain:44 ·路径68 ·Blocked-by:26Dating (the clone was shallow — 242 commits, graft at 873ff0f — so
git log -Sfirst reported the graft boundary; deepened twice to 2,320 commits, oldest 2026-08-17):git log -S'尖括号路径占位符' -- .claude/skills/pm-dispatch/SKILL.md→ de98599, 2026-08-25 09:16Z, PR #12086 「SKILL.md discipline pack — six scoped protocol amendments」 — the PR through which #11901 reached CLOSED/COMPLETED (the card'sclosedByPullRequestsReferencesnames exactly that PR). os-dev.md's占位词spelling: 04600d9, 2026-08-26 (PR #12440). platform-readings'用词拼出: same 2026-08-26 commit, widened 2026-08-29 (47fd377).So the #11901 triage note (os-zhuang, 2026-08-25 05:14Z: 「PM-authored text does not use angle-bracket path placeholders; spell "followed by the explicit path" in words — because it removes the construct instead of adding a check; plus the narrow read-back rule as the backstop」) was delivered in full, four hours later, to SKILL.md L150–L153 — construct-removal as the fix and read-back as the backstop, in those words. The card's discriminator sample stands: the (a)-shaped fix that held is also the one that reached persistent text. The triage's weakening (「若那次修复其实只是一个席位在会话内的习惯 …」) does not apply. Not landed here: the rule already exists; the new text only cites it as the sibling (a)-shaped example (「占位符禁令」).
(2) B's boilerplate cost — light: ≤1 % on claims and dispatch orders, ≈2–5 % on round reports; the round report is the heaviest site.
Reading sites the protocol prescribes, enumerated from SKILL.md at
3612bd4e1:Serial constraints cleared:(in-flight/board),Container & model:tier fromdispatch-gates --tieroutput (tree)get_filespath face, gate-job conclusions, 「抽查读数」UNRECOGNISEDlinePer-reading cost: a UTC stamp
2026-09-03T00:21Zis 17 bytes; a tree reading adds a ref/tip such asorigin/main 224f8ea4(≈21 bytes) — ≤ ~40 bytes per reading, plus onedate -uper reading pass (most inputs already carry their own time: git--date,updated_at, check-run timestamps).Measured on this card's own artifacts: the dispatch order for this flight (~5,400 chars) states 2 stampable readings (the origin/main line count — which carried neither stamp nor tip — and the claim-state board reading; the third, the triage's zero, is carried by that comment's own timestamp) → ≈55 bytes, ≈1 %. The claim comment 5518388833 (~2,400 chars) states 1 (the two sibling PRs merged, face free) → 17 bytes, <1 %. A round report with 8 readings pays ≈300 bytes on a multi-KB report, ≈2–5 %. Honest caveat: the byte cost is small; the real cost is that the stamp must be taken at read time — which is precisely the construct the ruling wants, since a reading typed without one is now visibly malformed instead of silently stale.
Gates (every exit captured by redirect before any pipe; each gate's own verdict line quoted)
All at HEAD
3612bd4e1, the final commit; the union was derived AFTER the last edit withnode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no hand-fed paths; stderr:gate list derived from the tree of 'objectstack-ai/objectstack' at commit 3612bd4e1 … change set derived from git — 1 path(s) vs merge base 224f8ea4a). Union =check:doc-formula-expressions(lint pkg) ·check:agent-test-spelling·check:doc-authoring·check:pm-governed-merges·check:pm-governed-prose·check:pm-skill-id-lint·check:pm-skill-ratchet·check:skill-frame-sync. Four of the union were not in the dispatch list and were run in addition; four of the dispatch list are not in the union and were run anyway.check:pm-skill-ratchet(+--self-test)✓ check-skill-line-ratchet self-test: 111 cases pass.·✓ … SKILL.md: widest table row is 642 bytes (pin 642; headroom 0).·✓ … SKILL.md is 995 lines (ceiling 1005; headroom 10).check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filescheck:skill-frame-freshness✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).check:pm-dispatch-gates✓ a valueless run record refuses, and its message does not name the OTHER flag)check:pm-governed-merges--self-testgreen (exit 0, no ✗)check:corpus-claim-driftcheck:nul-bytescheck:agent-test-spelling(union)✓ check-agent-test-spelling: 0 violations — 430 file(s) · 5686 bare--token(s) …check:doc-authoring(union)✓ doc authoring guard: 46 published skill files clean — no internal issue-id references.(+3 more ✓ lines)check:pm-governed-prose(union)✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces … and claim no others.check:doc-formula-expressions(union,@objectstack/lint)@objectstack/spec,@objectstack/formula,@objectstack/lintunder the lock; the first two runs were exit 3PREREQUISITE NOT MET, recorded as NOT MEASURED, never as a flake)✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1365 TS blocks judged clean by @objectstack/formula.·✓ … (spec TSDoc): 9 @example(s) judged clean across 1120 packages/spec/src files …·✓ … (field-level *When): 14 predicate(s) … judged clean; 6 skipped as undeterminable.Deviation, declared: the ratchet and the
@objectstack/formulabuild ran underscripts/pm/os-verify-lock.sh(slotissue-12911); the batch of sevencheck:*gates queued under the same lock was killed at the platform's 10-minute foreground cap (exit 143, after 3 of 7 had already returned 0), so thecheck:*gates were re-run unlocked at HEAD. The lock's own--statustext classifiescheck:*gate scripts as unlocked sibling work it never excludes, and os-dev.md's lock rule names build/test; this is the declared narrowing, not a skipped gate.Premise checks
premise_false— triage comment 5453234724: 「pm-dispatch: the PM tells every dev to read its comment body back, and never does so itself — 2 of 5 dispatch orders in one round shipped a truncated restore command #11901 的那次「construct-removal」没有落进任何持久指令文本」 — false on its own date; see finding (1). The card's re-check zero on绝对路径holds as a zero; it never held as evidence.claude/issue-12911-timestamped-readings, this session); assignee and labels untouched by this flight.skip-changesetapplies — nothing is published from any package; the diff is.claude/**only.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code