Skip to content

docs(pm-skill): stale-premise check covers ruling-named cards; triage self-exit guard sees in-flight sibling rounds - #9501

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-9038-stale-premise-card-refs
Aug 18, 2026
Merged

docs(pm-skill): stale-premise check covers ruling-named cards; triage self-exit guard sees in-flight sibling rounds#9501
hotlong merged 1 commit into
mainfrom
claude/issue-9038-stale-premise-card-refs

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes#9038, Fixes#9200

Single-file bundle on .claude/skills/pm-dispatch/SKILL.md (hard same-file serial rule): the primary card's stale-premise gap plus the triage self-exit guard gap.

Skills-root PR — ADR-class. Draft on purpose, awaiting a human merge; no AI seat may flip it ready, queue it, or arm auto-merge (maintainer rulings 2026-08-08 / 2026-08-11).

Change 1 — stale-premise check gains its card-reference half (primary card, Option A)

The pre-dispatch check previously re-verified only the ruling-named ACTIONS against origin/main. It now names two halves:

  • action half — the existing re-check, unchanged in substance: ruling-implementation cards re-verify the named action has not already landed on origin/main;
  • card-reference half (new) — every issue a ruling/card names as a blocker, claim surface, coordination target, or arms-once-this-lands dependency is re-read (open/closed/assignee) at dispatch time, and the dispatch order cites the observed state, never the ruling's description of it. Rationale kept to one line: the tree cannot answer whether a card is still open; a stale action claim self-corrects the moment the dev starts, a stale card reference never turns anything red.

Option B (mechanized reference extraction) deliberately not built — per the card's own recommendation it is a separate grading.

Change 2 — round-open marker completes the seat-Routine mutual exclusion (second card, shape 1)

The guard read only the last closing brief, so an in-flight sibling round was invisible for exactly its own duration (briefs land at round end). Now: each fire, before its first write, reads two data points — the most recent closing brief AND the latest round-open marker on the seat post. Brief younger than one round interval, or a marker newer than the brief and itself younger than one round interval (a mid-flight round has by design not yet posted its brief; the marker is its only visible trace) ⇒ self-exit. Both readings clear ⇒ post a one-line round-open marker (session ID + fire time) on the seat post, then run. No new time constant: the window is expressed in round intervals, matching the existing guard's unit.

Line ratchet: 682/682, net zero (+22/−22)

Ratchet ruling honored: ceiling 682 shrink-only, no re-wrap accounting. Both additions are paid for by removing text that survives verbatim elsewhere — each cut site already cites the file that keeps the content:

cut (main file)content survives in
create_trigger zero-output parenthetical (Routine principles ①)references/seat-post-protocol.md, Routine-creation section (verbatim, with more detail); a one-line trap pointer stays
release-board cadence tail (three-boards-empty, ~5-round freshness, clear-not-rescan)references/seat-post-protocol.md, release-board ops section (verbatim); three-boards fact also in the main file's round-report metrics
org Project hot-path note (invariants)main file multi-repo rule 5 (one board, no second tracker); a parenthetical pointer stays
epic territory-collision rationale sentencereferences/seat-post-protocol.md, epic section (verbatim); "declarative, narrower is more honest" kernel stays inline
landing-readings tail (two-readings landing check + eject-resubmit signature discipline)references/platform-readings.md queue-membership entries + main file landing section; pointer to the fact table stays

Gates (union re-run post-commit on b6911a8db)

  • pnpm check:pm-skill-ratchet — green: 682 lines, ceiling 682, headroom 0
  • pnpm check:pm-skill-id-lint — green: 9 files clean (no issue IDs in operational text; both new passages self-contained)
  • pnpm check:skill-frame-sync — green: 4 copies structurally isomorphic (decision frame untouched)
  • pnpm check:doc-authoring — green: 377 files clean
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions — green (after building the lint dependency closure in the fresh worktree)
  • pnpm check:nul-bytes — green (plus a direct control-byte grep over the edited file: no hits)
  • node scripts/check-adr-merge-approval.mjs — exit 1 locally (HTTP 401: no GitHub credentials in this container) — expected; in CI this gate stays red until the maintainer's own approval, by design for a skills-root PR
  • Gate list re-derived post-commit with node scripts/pm/dispatch-gates.mjs (no-args self-derived change set, 1 path vs merge base e3a86e390): 6 matched families = exactly the six above, nothing additional; model floor claude-fable-5 (clause ①) satisfied by this dispatch.

.claude/ internal tooling only — publishes nothing; skip-changeset label applied on this PR.


Generated by Claude Code

… self-exit guard sees in-flight sibling rounds
Two gaps in one file, bundled under the hard same-file serial rule:
- Pre-dispatch stale-premise check gains its second half: every issue a
ruling or card names as a blocker, claim surface, coordination target,
or arms-once-this-lands dependency is re-read (open/closed/assignee)
at dispatch time, and the dispatch order cites the observed state, not
the ruling's description. origin/main cannot answer whether a card is
still open; a stale action claim self-corrects when the dev starts,
a stale card reference never turns anything red.
- Seat-Routine round guard becomes a complete mutual-exclusion reading:
each fire leaves a round-open marker (session ID + fire time) on the
seat post before its first write; the guard reads both the last
closing brief and the latest round-open marker — a marker newer than
the brief and younger than one round means a live sibling round, so
the fire self-exits. Closes the window in which a slow round is
invisible because its brief only lands at round end.
Line ratchet stays at 682/682: both additions are paid for by removing
text duplicated verbatim in the references files the same sections
already cite (create_trigger trap, release-board cadence lines, org
Project view note, epic territory rationale, landing-readings tail).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rn7aaamsR99FXRqLcpL99q
@hotlong
hotlong marked this pull request as ready for review August 18, 2026 05:55
@hotlong
hotlong added this pull request to the merge queueAug 18, 2026
Merged via the queue into main with commit 8d45622Aug 18, 2026
30 of 31 checks passed
@hotlong
hotlong deleted the claude/issue-9038-stale-premise-card-refs branch August 18, 2026 06:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants

@os-zhuang@hotlong@claude