docs(pm-dispatch): fold the 2026-08-08/09 shift's measured lessons in — 7 added/merged, 2 dropped as already covered (#6902) - #7046
Conversation
… — 7 added/merged, 2 dropped as already covered (#6902) Seven of the card's nine entries land as additions or merges into existing rules; two are dropped because #6871's clause-sinking and the existing falsification partition already say them. Two of the card's own claims were re-verified and corrected before relaying (the gate list is not confined to lint.yml; #6668 is a PR, not an issue). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F8q5J1MQyocgtNspb15fSn
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
… so that number was never issued check:adr-anchors (inside the ESLint job) went red on it: the number is a squat on the next free ADR id, taken from the title of a closed, unmerged draft. It carried no load in the sentence — the load-bearing facts are that #6668 was a draft ADR, all green, and closed by a sibling seat without provenance — so the number is replaced by the fact that makes it wrong, which is strictly more informative than the citation was. ⛔ Not fixed by allowlisting: that list is SHRINK-ONLY and its header says adding an entry is never the fix for a red build. ⛔ Not fixed by writing docs/adr/0123-*.md either: an ADR-touching PR cannot be merged by this seat (#6741). ADR-0107 / ADR-0001 also appear in that gate's output; both are pre-existing allowlisted history citations on origin/main, in files this PR does not touch. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F8q5J1MQyocgtNspb15fSn
|
Held for the maintainer — this seat will not merge it. From the dispatching Ruling on the open question: option A — keep the ninth entry. It is a maintainer ruling (the 03:35Z wave/compaction decision, superseding the 03:31Z rotation draft) that currently lives only in a comment thread on a card about to close. This file's own step 1 says a ruling that lives only in a comment is a ruling the next reader skips — and entry 3 of this very PR exists to stop exactly that. Dropping it to honour the dispatch order's word "eight" would preserve a number at the cost of losing the ruling. If you disagree, the dev notes it is one contiguous block in step 9 and lifts out cleanly. Three things in this PR corrected upstream errors rather than inheriting them — worth knowing before review, since two of the corrections are to instructions this seat gave:
Generated by Claude Code |
Fixes #6902
Folds the shift's measured lessons into
.claude/skills/pm-dispatch/SKILL.md. +148 / −5 lines, one file (git diff --stat origin/main...HEAD).The card carries eight numbered lessons plus a ninth in its own comments (the 03:35Z maintainer ruling that superseded the 03:31Z draft). The ninth is treated as in scope: it is a maintainer ruling recorded on this card, and this file's own step 1 says a ruling that lives only in a comment is a ruling the next reader skips.
Branch cut from
mainat6dd3c251b, i.e. after all five of tonight's SKILL merges — #6871 (dispatch-model economics), #6886 (domain vocabulary), #6959, #6911 and #6974. The dispatch order named two; the log named five, so the whole file was re-read before writing rather than diffed against the two.Disposition of every entry — added / merged / dropped
os-dev.md's Definition of done (push → draft PR → CI convergence → report), and the PM-side "report lost ≠ acceptance stalled" path is step 6 with its three conditions and the #5550/#5556 precedent. Writing it into the dispatch order as the card asks would contradict #6871, which sank unconditional clauses intoos-dev.mdprecisely so prompts carry deltas only. What was genuinely new is the reason, so that is what landed: a paragraph in step 6 recording that the death cause can be fleet-wide (two account-wide token exhaustions, four in-flight devs each time), that in that cell the probe half is unavailable too so only conditions (a) and (c) are readable, and that the four cards lost zero information because the PR was already up. It says explicitly that this does not license copying the ordering into prompts.os-dev.mdrule 5 (contract-first) already binds it to the second. Both paths verified present onmain: consumerpackages/core/src/utils/filter-tokens.ts, producerpackages/spec/src/data/context-tokens.zod.ts. Added the mechanical fact the card leaves implicit: cross-package usually means cross-lane here (#5586 is labeleddomain:engine-core;packages/specis permanently the spec seat's under "shared contract surfaces have one owner"), so the route is rule 4's existing cross-seat machinery plus the after-the-fact declaration (#6532 precedent, #6017) — no new mechanism minted.issue_read get_labelscannot even resolve it. The new bullet points at the Guardrails ADR clause that already cites the same PR, so a reader does not think there are two #6668 stories: that one records the decision, this one the execution record.check:kernel-hook-pairsatlint.yml:551(#6672) andcheck:app-nav-i18natlint.yml:1219(#6661). The card's prescription needed correcting before relaying: "enumerate from.github/workflows/lint.yml" is itself memory-shaped — measured today, 61pnpm check:*invocations are inlint.ymland 7 are not (ci.yml,spec-liveness-check.yml,validate-deps.yml,release.yml,showcase-smoke.yml). So the paragraph gives a command across all workflows instead of a filename, and folds in the dispatching seat's matching finding (#6865: four of six relayed required-context names live inci.yml) and #6673 (a relayed line number that landed in a different function). It also states the boundary #6871 created: the PM takes the reading, not the dev — devs no longer run the farm locally, so the accuracy of naming is now the PM's alone.if:" assertion would have reddened four correct jobs, and #6893's dispatch offered excludingcontent/docs/releases/**as defensible when that is #4920's rejected option A. Verified rather than relayed:scripts/docs-audit/check-audit-scope.mjscallsprocess.exit(1)when no release page remains in scope, and its comments name #4920 and #6893 by number. So the partition became three blocks — in the prose, in the prompt template, and in the bullet above the template, all in one pass, since a template disagreeing with its own explanation is the drift this file keeps paying for.archive_sessionappeared nowhere in the file before this. It fires on the same event as the unsubscribe that was already written there, so it belongs in that sentence rather than in a new paragraph or in the backends section: the trigger is the card's terminal state (PR MERGED or card voided), not "the dev reported". Cost kept: 11 finished-but-unarchived idle containers, which do not error, do not occupy the queue, and show on no board.pm:queuewithouttarget:v17" using the four blocking classes, and that reasoning was later re-judged — today #6806 and #5495 both carrytarget:v17. The rule therefore reads: default is inheritance (the obligation follows the work), and a half judged not to inherit must argue it on the card in the four-class terms, falsifiably. Producer discipline unchanged.cache_read10.18M against 6.9K uncached input on a ~2h cloud card), the four ordered steps, and the two boundaries the ruling itself draws: seat rotation demoted to an end-of-shift action because compaction preserves session bindings (PR subscriptions, self-boundsend_latertimers, the seat post's session ID, cloud-card parentage), and Routine seats are exempt since each fire rebuilds from GitHub. Step 2 of the four is explicitly framed as settling an existing debt ("state changes do not sleep over"), not a new obligation.Two entries from the dispatching seat's own shift notes rode along, both as merges into rules they sharpen, not as new rules:
merge=os-regenpath list has drifted from.gitattributes— says "eight", lists nine, and the file has ten #6492 and the compile-surface table's existing warning; the paragraph names all four positions so the next reader does not re-derive them.Verification — stated plainly, because the honest answer is unusual here
Skill prose is not asserted by any test in this repo. There is no before-red/after-green artifact to produce for a documentation sentence, and manufacturing one would be worse than saying so. What is verifiable was run, and what the card claimed was measured rather than transcribed.
Gates, all green in the worktree (every gate whose script reads
.claude/**, found bygrep -rln "\.claude" scripts/*.mjs):check:nul-bytescheck:skill-frame-synccheck:skill-frame-freshnessorigin/main(fetched at run time)check:skill-compatibilitycheck:doc-authoring.claudeis in scope); 374 files cleancheck:agent-model-declaredos-dev.md; that file is untouched)Also run:
grep -naPover the changed file for the full control-byte class beyond NUL — clean.check:skill-examplesis not applicable: this file carries noos:checkblocks.Contradiction sweep — the whole file was re-read against the additions, and three collisions were resolved in the edit rather than left for a reader:
lint.yml"; docs(pm-dispatch): dispatch token economics — sonnet tier for S-class cards, scoped local gates, slimmed prompts (#6863) #6871 forbids the dev enumerating the farm locally. Resolved by making the PM the party who takes the reading.Numbering discipline observed: no Operational note was added or renumbered. Every entry landed inside an existing section next to the rule it modifies, which is what keeps the numbered ledger stable.
Not merged by an AI seat
This PR governs the PM seat's own behaviour, so self-review-and-merge is prohibited — it is held for the maintainer, and no auto-merge is armed.
docs/adr/**andcontent/docs/releases/**are untouched..claude/-only ⇒ no changeset;skip-changesetapplied by the author with the label set read back after the bots settled.Generated by Claude Code