Skip to content

docs(pm-dispatch): make the stop-condition clause carry the executability criterion - #14697

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-14031-executable-fence-forms
Sep 2, 2026
Merged

docs(pm-dispatch): make the stop-condition clause carry the executability criterion#14697
os-zhuang merged 1 commit into
mainfrom
claude/issue-14031-executable-fence-forms

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

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:

「13973 帮我综合分析,并参考主流平台的方案,并给我解释为什么不能都用日期类型。其他同意」

Ruled: the ratchet ceiling for references/dispatch-runbook.md is 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:

- **停条件写法:
  要证据,不要判决**。派发令里的前提/停条件检查必须要 dev 回报**证据面**(搜了什么、
  找到什么),分叉归 PM 判 —— 写成「发现消费者就停下」把判决权交回被停的一方。

After (6 lines) — the criterion is merged into the same bullet, so neither it nor the templates can be copied without the other:

- **停条件写法:要证据不要判决,且动作须在本轮内终局**。前提/停条件检查要 dev 回报**证
  据面**(搜了什么、找到什么),分叉归 PM 判 —— 写成「发现消费者就停下」把判决权交回
  被停的一方。可执行性判据:一次性 dev 无中途提问的通道,「先问再继续」预设了不存在的
  续接,把照做并报告/不做/自行裁断三选一(非二选一)整个交给本想被围住的人。两种改写
  都在一轮内闭合:允许做 ⇒「只做**最小**编辑,并在报告里单列该判断与回退方式」;不许
  做 ⇒「⛔ 不要动该文件,让门禁红着并在报告里点名该站点」。

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

verdict line
before .claude/skills/pm-dispatch/references/dispatch-runbook.md is 277 lines (ceiling 278; headroom 1).
after .claude/skills/pm-dispatch/references/dispatch-runbook.md is 280 lines (ceiling 280; headroom 0).
table row (unchanged) .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 wrapLine wraps it to 6 lines, replacing the 3-line bullet — net +3, landing at 280. The ceiling row moves 278 -> 280 at 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.

gate exit verdict line
check:pm-skill-ratchet 0 ✓ check-skill-line-ratchet: ... is 280 lines (ceiling 280; headroom 0).
check:pm-skill-ratchet --self-test 0 ✓ check-skill-line-ratchet self-test: 111 cases pass.
check:pm-skill-id-lint 0 ✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g). + self-test: 14 cases pass
check:ratchet-remedy-authority 0 OK 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 0 ✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
check:pm-dispatch-gates 0 ✓ dispatch-gates self-test: 1240 cases pass.
check:pm-governed-merges 0 ✓ check-governed-merges --self-test: 241 assertions
check:nul-bytes 0 check-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 --commandsgate list derived from the tree of 'objectstack-ai/objectstack' at commit 077c86a4, --repo ... checked against this checkout's 'origin' remote — it holds, change set 2 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.) and check-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-completeness exits 3 with PREREQUISITE 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-attestation and check:doc-formula-expressions also first exited 3 on missing prerequisites (node_modules, then unbuilt @objectstack/formula / @objectstack/lint); all three were re-measured green after pnpm install and the targeted builds, and only their green re-runs are claimed above.

skip-changeset

Releases 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". No needs:contract-review.

premise_false

  • The dispatch sized the deliverable at "about 580 bytes, 5 lines" and "net +2 lines at most". The honest merged bullet carrying every ruled part measures 668 bytes and wraps to 6 lines — net +3. The source of the discrepancy is an internal inconsistency in the earlier dev report, which is reproduced here rather than resolved by hand: its floor line says "5 lines ... net +2, final 279 lines" while its option A says "Raise the ceiling 278 to 280". The ruling adopted 280. Landing at the measured count reconciles the two: the bullet lands at 280 and the ceiling is set to 280, so the ruled number and the measured number agree. The dispatch's own escape hatch governs — "the ruling authorizes the raise to the landed count of the merged bullet, not a number". Nothing was padded to reach 280 and nothing was cut to reach 279.
  • The container's REST channel is closed for this seat. Every repo-scoped REST read returned 403 while /rate_limit reported 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 MCP issue_read get_comments call 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-forms empty) before the --force-with-lease rebuild; origin/main did not move on the hot file, so no merge of main was 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

…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants