docs(pm-dispatch): make the stop-condition clause carry the executability criterion - #14697
Merged
Merged
Conversation
…lity criterion The dispatch-word construction section told PM seats to ask for evidence rather than a verdict, but said nothing about whether the addressee can execute the fence at all. A one-shot dev has no mid-run channel to ask on, so "report before acting" hands it a three-way choice — do and report / don't / decide alone — which is precisely what the author believed the fence had removed. The stop-condition bullet now merges the criterion into itself: a fence clause is executable by a one-shot dev only if the action it demands is terminal within the run, and the two executable rewrite forms follow with the reason they work (both close within one run). Criterion and templates sit in one bullet so neither can be copied without the other. The ratchet ceiling for the file goes 278 -> 280 at the landed count, with the maintainer ruling quoted verbatim and untranslated above the entry. Prose, not a table row: the widest-table-row pin stays at 0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
This was referenced Sep 2, 2026
os-zhuang
approved these changes
Sep 2, 2026
os-zhuang
marked this pull request as ready for review
September 2, 2026 22:53
os-zhuang
enabled auto-merge
September 2, 2026 22:53
This was referenced Sep 2, 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 #14031
Governed surface (
.claude/**+scripts/pm/**) — draft only, human merge. No AI seat merges, queues, or arms auto-merge on this PR.The ruling this executes
Director seat comment 5507668202 (2026-09-02), option A. Provenance: maintainer, live PM chat with the director seat, 2026-09-02, replying to decision batch #4 in which this card was item 2 with recommendation A. Verbatim and untranslated — 「其他同意」 is what adopts A:
Ruled: the ratchet ceiling for
references/dispatch-runbook.mdis raised at the landed count, and the executability criterion plus the two executable rewrite forms land as the merged bullet — prose, no table row. Options B, C, D, E are not taken; D (funding growth by deleting sibling rules' rationale) is refused on the standing ruling. Nothing here is re-decided.The bullet, before and after
Before (3 lines) — it fixed who adjudicates a fork, but said nothing about whether the addressee can execute the fence at all:
After (6 lines) — the criterion is merged into the same bullet, so neither it nor the templates can be copied without the other:
It carries all three required parts: (a) the executability criterion — a fence clause is executable by a one-shot dev only if the action it demands is terminal within the run; "ask first, then continue" presupposes a channel the dev does not have and hands the whole choice (do and report / don't / decide alone — three ways, not two, per the triage's wording rule) to the executor the author thought they had fenced. (b) the two executable rewrite forms, with the reason they work (both close within one run). (c) the existing bullet's own rule, kept intact.
Line arithmetic — read from the gate's own verdict lines, not counted by hand
.claude/skills/pm-dispatch/references/dispatch-runbook.md is 277 lines (ceiling 278; headroom 1)..claude/skills/pm-dispatch/references/dispatch-runbook.md is 280 lines (ceiling 280; headroom 0)..claude/skills/pm-dispatch/references/dispatch-runbook.md: widest table row is 0 bytes (pin 0; headroom 0).The merged bullet is 668 logical bytes; the gate's own
wrapLinewraps it to 6 lines, replacing the 3-line bullet — net +3, landing at 280. The ceiling row moves278 -> 280at the landed count, headroom 0, the file's convention. The widest-table-row pin stays at 0, which is exactly what forecloses the compact two-row table the card and its triage both used and forces the forms into prose.Gates
Every exit code captured by redirect before any pipe; each row quotes the gate's own verdict line, never a bare exit status. Run on the pushed head
077c86a4.check:pm-skill-ratchet✓ check-skill-line-ratchet: ... is 280 lines (ceiling 280; headroom 0).check:pm-skill-ratchet --self-test✓ check-skill-line-ratchet self-test: 111 cases pass.check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).+self-test: 14 cases passcheck:ratchet-remedy-authorityOK check-ratchet-remedy-authority: 184 scripts swept; 12 mark the expanding remedy MAINTAINER-ONLY, 6 turn it down outright, 166 hand out no ratchet-expanding remedy.check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filescheck:pm-dispatch-gates✓ dispatch-gates self-test: 1240 cases pass.check:pm-governed-merges✓ check-governed-merges --self-test: 241 assertionscheck:nul-bytescheck-nul-bytes: OK (scanned 8004 text file(s); no raw ASCII control bytes).Union re-derived after the last edit, no hand-fed paths:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands—gate list derived from the tree of 'objectstack-ai/objectstack' at commit 077c86a4,--repo ... checked against this checkout's 'origin' remote — it holds, change set2 path(s) vs merge base bd4aa4e49. It named 20 commands; the 13 beyond the dispatched list were run too, all green:check-ci-filter-parity·check-cross-package-test-inputs(both spellings) ·check-shard-attestation·bare-root-worklist --self-test·check:agent-test-spelling·check:bash32-floor·check:cli-command-ids·check:doc-authoring·check:entry-guard·check:parse-guard·check:pnpm-filter-targets·check:watch-hint-literal·@objectstack/lint check:doc-formula-expressions.Because the diff edits a gate script, the two other scripts that read the ratchet were run as well —
check-published-list-mirrors(OK: 1 published list mirror(s) match their constants line for line.) andcheck-skills-token-ratchet(✓ 31 authored bundle file(s) within their ceilings).One command in the union is NOT MEASURED, and is not reported as green:
check-test-completenessexits 3 withPREREQUISITE NOT MET — this gate grades a saved 'turbo run test' log, and no log was named.It grades a log only a CI test run produces.check-ci-filter-parity,check-shard-attestationandcheck:doc-formula-expressionsalso first exited 3 on missing prerequisites (node_modules, then unbuilt@objectstack/formula/@objectstack/lint); all three were re-measured green afterpnpm installand the targeted builds, and only their green re-runs are claimed above.skip-changesetReleases nothing, verified against
scripts/check-empty-changeset.mjs's own enumeration —It releases nothing (.github/, .claude/, skills/, docs/, content/, examples/, tests-only, and the like). The diff is one.claude/protocol file plus one CI-internal gate script, which that file separately calls "the textbook case for that label". Noneeds:contract-review.premise_false
/rate_limitreported 15000/hour (credential alive, session-gated). The card was read through the zero-quota public-repo payload channel; the newest comment — the ruling itself — was not in that page, so one targeted MCPissue_read get_commentscall was spent on it. Channel switch declared.Everything else in the dispatch held: the probe branch carried no unmerged commits (
git log origin/main..origin/claude/issue-14031-executable-fence-formsempty) before the--force-with-leaserebuild;origin/maindid not move on the hot file, so no merge ofmainwas needed; the ceiling row was where the dispatch said it was, and the comment block above it was mirrored in style.🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code