Skip to content

docs(pm-dispatch): docs-only ADR cards dispatch at CONTRACT_REVIEW_TIER + xhigh by standing order - #29850

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-n4zt18
Nov 3, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-n4zt18

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Yibo Wang · project thread

Fixes #29741

Clause-②: no
Metadata-protocol: none

Rules text only. Two lines of .claude/skills/pm-dispatch/references/execution-duties.md 〈派发〉 are rewritten in place; nothing published moves (skip-changeset).

维护者速读

  • 改了什么:派发规则里写死「ADR 修订卡(修订说明、措辞修正、Amended by 条目)走契约复审档、effort xhigh,凭常设令,不再逐卡问;新裁决除外」;effort 表把 ADR 列进 xhigh 档,max 仍凭点名。
  • 为什么改:原文只定了档位和 effort 下限,席位读成每张 ADR 卡都要问一次维护者;你 2026-11-03 已定为常设令,规则文本要跟上,后续 ADR 卡不再绕一趟决裁线程。
  • 风险与回滚:只动两行规则文字,无代码无发布面;回滚即还原本 PR。改法上「其它 ADR 卡」的 xhigh 地板由 effort 表接住,没有降档。
  • 先看:execution-duties.md 第 101 行(条款①)与第 122 行(effort 表),diff 只有这两行。
  • 两分钟验证:pnpm check:pm-skill-ratchet && pnpm check:pm-skill-id-lint,预期两条都 ✓(文件仍 188 行,第 101 行 119 字节、第 122 行 120 字节)。
  • 需要你做的:无,席位落地(Tier S,.claude/** 内)。

What changes

One file, two lines, net zero lines. The file sits at its 188-line ratchet ceiling, so each rewritten line had to carry the new rule inside the 120-byte line cap on its own; no other line was re-wrapped to buy room.

@@ line 101 (116 B → 119 B) @@
-- 强制条款①:凡改协议语义面或 `docs/adr/**` 的卡一律契约复审档;后者 effort 下限 `xhigh`。
+- 强制条款①:改协议语义面或 `docs/adr/**` 即契约复审档;ADR 修订常设令 `xhigh`,新裁决除外。
@@ line 122 (120 B → 120 B) @@
-- S 机械 `medium`;M `high`(默认);L/XL/`security`/p1/契约复核/四轴分析 `xhigh`;`max` 凭点名或常设令。
+- S 机械 `medium`;M `high`(默认);L/XL/security/p1/契约复核/四轴分析/ADR `xhigh`;`max` 凭点名/常设令。

What each line now says:

  • Line 101 (条款①). The tier half is unchanged in meaning (protocol semantic face or docs/adr/** ⇒ CONTRACT_REVIEW_TIER; 「凡…的卡一律」 shortened to 「…即」). The effort half is the standing order: an ADR revision card (ADR 修订: an amendment note, a wording fix, an Amended by entry) takes effort xhigh by 常设令, so the seat does not ask per card (neither a chat question nor a decision card); 新裁决除外 keeps a card that needs a new ruling, a superseding ADR included, outside the order.
  • Line 122 (effort table). ADR joins the xhigh list, so the xhigh floor that line 101 used to state for every docs/adr/** card (mixed ADR + code, a superseding ADR, a card that needs a new decision) still holds there, and the existing tail max 凭点名 keeps max on an ADR card a named per-card word. To fit /ADR inside 120 bytes: security lost its backticks (its neighbour p1 never had them) and 「凭点名或常设令」 became 「凭点名/常设令」 (the same separator the list already uses).

Outside the order, nothing moves: a card that needs a new decision still goes to a decision thread, a superseding ADR or an ADR + code diff keeps the existing routes (CONTRACT_REVIEW_TIER, xhigh from the effort table, split per the existing rules). The words ADR 修订 and 新裁决除外 carry that boundary (patch round 1, after the at-tier review's should-fix: the first wording 纯文档 ADR … 免逐卡问 left a superseding ADR inside the order by its wording).

Provenance (maintainer, date) is deliberately not in the rule text: check-skill-id-lint's header says the scanned corpus carries rules only and provenance lives in the PR that landed it, which is this one (Warren, 2026-11-03T03:05Z, option A 「fable + xhigh,立为常设令」, then 「这个应该立卡更新 skills」). The claim template's reason: clause already names 常设档位令; after this lands a seat cites this card's number there.

Why

The text fixed the tier and an effort floor but not the effort itself, and named a 常设令 only as a way to reach max. A seat dispatching a one-paragraph ADR edit read that as a per-card maintainer call and waited on a decision thread for an answer the rule already implied. The standing order removes that round trip; this PR records it where seats read.

Tests

None owed: prose in a .claude/** reference file, no code or test moved. The two skill gates that judge this file are in the Verification section.

Acceptance notes

  • Mirror check (the card's last bullet), re-measured on 42ff86f. grep -n 维护者 near 档/effort/模型 in SKILL.md and dispatch-runbook.md: SKILL.md line 311 (claim template reason: already names 常设档位令) and line 275 (director tier, unrelated); dispatch-runbook.md line 137 says 「档位与 effort 席位自推导 ⛔ 不等维护者原话」. Neither repeats a per-card ask, so no mirror edit; the order file predicted the same.
  • Wording choices a reviewer may want to push back on: 「强制条款①」 kept verbatim (the anchor other lines cite as 条款①/条款②); 「ADR 修订」 stands for the card's amendment class; 常设令 already means no per-card ask, so 「免逐卡问」 gave way to 「新裁决除外」.
  • Attribution thread link. The order file spells the skills-lane thread in the attribution line; this body carries this card thread's link because the session's own attribution rule names it. Same project, same requester.
  • Out-of-scope findings: none.

Verification

  • pnpm check:pm-skill-ratchet on 3c7c757 and 6462193: ✓ (execution-duties.md 188 lines at ceiling 188; line-byte check clean).
  • pnpm check:pm-skill-id-lint on 3c7c757 and 6462193: ✓ 109 file(s) clean.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 17 commands for the one changed path (merge base 42ff86f); each run serially, exit codes captured before any pipe, then --ran: 17 derived, 17 run, 0 NOT-MEASURED, exit 0 (check:doc-formula-expressions first exited 3 on a missing @objectstack/lint dist; after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint it exited 0). All on 3c7c757; origin/main then moved (c5ddbea, no pm-dispatch or gate-script file touched) and was merged as 6462193, where --commands derives the same 17 and check:pm-skill-ratchet + check:pm-skill-id-lint re-ran ✓.
  • Patch round 1 (bd51c88, line 101 only): pnpm check:pm-skill-ratchet exit 0, pnpm check:pm-skill-id-lint exit 0.
  • CI check-runs: in_progress at PR open; the seat reads them at ACCEPT.

Human Minimum

Each item is one rule from
CONTRIBUTING.md › Human Minimum,
which links the AGENTS.md text that states it.

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind. (no names added)
  • 3. No formatter ran; pnpm lint is CI's run (repo-level scan).
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (.claude/** is not published: skip-changeset)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (not touched)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English. (the 维护者速读 block and the rule text itself are Chinese by the dispatch contract)
  • The Before Submitting list in CONTRIBUTING.md is done.

Generated by Claude Code

…igh by standing order

execution-duties.md 〈派发〉: fold the maintainer's standing order into 条款①
— a docs-only `docs/adr/**` card dispatches at the contract-review tier with
effort `xhigh` fixed, with no per-card ask — and list ADR under `xhigh` on the
effort line so the floor for every other ADR card stays where it was. Net zero
lines (file at its 188-line ceiling); both rewritten lines sit at 120 bytes.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGufzir9DwLT7sHJkBootW
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 3, 2026
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Nov 3, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · os-support-ai · session_01WGufzhd2Ad9ANGTyAMW7pH

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 64621932a041ae40dc91da0c1c63b1bab9d0cc86
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/execution-duties.md + scripts/pm/dispatch-gates.data.mjs (MANDATORY_TIER_GLOB_ROWS, the docs/adr/** row and the clause-① docblock), scripts/pm/check-skill-line-ratchet.mjs (CEILINGS row 188, MAX_LINE_BYTES 120), scripts/pm/check-skill-id-lint.mjs (scan root, ID_PATTERN), .claude/skills/pm-dispatch/SKILL.md line 311 (claim template Container & model:), .claude/skills/pm-dispatch/references/dispatch-runbook.md lines 137-138, .claude/skills/pm-dispatch/references/triage-duties.md lines 79-86 (human floor), .claude/skills/pm-dispatch/references/coordinator.md line 31, .github/workflows/lint.yml (job Lint · repo & tooling gates, steps PM skill line ratchet and PM skill issue-ID lint)

Inputs read: card #29741 body and all three comments (triage audit 6595070364, claim 6597637142, os-dev-report 6597914303); PR #29850 body, file list (one file, +2/-2) and git diff origin/main...pr/29850 (origin/main c5ddbea is contained in the head; two commits, 3c7c757 and the merge 6462193); the check-runs on 6462193. The dispatch order and the dispatching seat's conclusions were not inputs.

Check-runs on the head (conclusions are the gate verdicts): all 23 non-skipped runs success at completion — Auto Label, Check Changeset, Check PR Size, Dogfood Regression Gate, Governed Surface Queue Guard, Lint & Repo Gates, Lint · CI release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates (carries PM skill line ratchet and PM skill issue-ID lint), the three Lint · scoped runs, PR-body guards, Test Core, Test UI, Type Check · consumer gates / debt ledger / source gates / workspace, TypeScript Type Check, filter. The remaining runs are skipped (paths-filtered: Build Core, Build Docs, UI builds and shards, dogfood shards, opt-in harnesses).

① Derived judgments

  • Accept set: no change. The diff is two rewritten prose lines in .claude/skills/pm-dispatch/references/execution-duties.md; no schema, no ledger, no refusal path, no runtime code moves. Clause-②: no on the PR body and in the claim comment, no arm — right.
  • Public surface: no change. .claude/** ships in no released package (check-skill-id-lint's header: internal corpus, not the published skills/ catalog); nothing a consumer imports or an author writes moves. Metadata-protocol: none — right.
  • Governed surface: .claude/** is on the Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 register (Tier S, owning seat on a contract-tier review of record). Governed Surface Queue Guard is success on the head; this record is that review. The served tier reads off the rules face (--paths prints CONTRACT_REVIEW_TIER for this hits file) — right.
  • Line ratchet: the tree holds the file at 188 lines against its CEILINGS row of 188 (net zero, as the card required), and lines 101 and 122 each measure exactly 120 bytes against MAX_LINE_BYTES 120; no other line was re-wrapped (the diff is exactly two hunks of one line each). Read from the tree, confirmed by PM skill line ratchet inside Lint · repo & tooling gates = success — right.
  • Issue-ID lint: neither rewritten line carries a #NNN citation, a ruling date or a quotation; provenance (Warren, 2026-11-03T03:05Z, option A) stays in the PR body, which is what check-skill-id-lint's header prescribes. PM skill issue-ID lint in the same job = success — right.
  • dispatch-gates.data.mjs: the docs/adr/** MANDATORY row still reads 「the same order fixes the effort floor at xhigh (the PM skill states it beside clause ①)」. On the head, clause ① no longer states a floor for every docs/adr/** card; the floor now lives one section lower on line 122 (ADR in the xhigh list). The data row's pointer is one line off but names the same file and the same policy; the table is documented as a copy of ONE predicate (tier) and 「when they disagree, the skill wins」, so nothing mechanical reads the effort floor. Judged right to leave untouched in a net-zero rules PR; noted under ④ as a should-fix pointer refresh for the next PR that touches that row.
  • Mirror obligation (card's last bullet): measured on the head. SKILL.md line 311 already names 「常设档位令的 id 与时刻」 as a reason: form; dispatch-runbook.md line 137 says 「档位与 effort 席位自推导 ⛔ 不等维护者原话」 and line 138 「常设原话有则作 reason:」; coordinator.md line 31 points at execution-duties for both. No surface repeats a per-card maintainer ask, so no mirror edit was owed — the dev's reading holds against the tree.

② Semver level

skip-changeset label on the PR; Check Changeset = success. The diff publishes nothing from any released package (one file under .claude/), so the label is the correct declaration and a patch changeset would be wrong. Clause-②: no line-initial on the PR body, no (widening)/(narrowing) arm; Metadata-protocol: none line-initial. No changeset body exists to carry a second copy, and none is owed. Level: none (skip-changeset) — matches the tree.

③ Boundary flags

os-dev-report 6597914303 lists three deviations and no open_questions; each answered against the tree:

  1. Attribution line carries the card thread's link instead of the skills-lane thread link — a PR-body provenance detail, same project and requester; nothing in the tree depends on it. Accepted, no action.
  2. No PR subscription and no assignee/reviewer request from the dev thread — that is the rule, not a deviation: dispatch-runbook.md line 140 「线程 ⛔ 不做 harness 开 PR 后指派/请审 … 请审是席位交棒」. Accepted.
  3. Line 122 wording moved beyond the card's ask to fit 120 bytes: security lost its backticks (its neighbour p1 was already bare; no gate pins line 122's text — the only script carrying xhigh outside comments is the dispatch-gates data row, which does not read this file), 「凭点名或常设令」 became 「凭点名/常设令」 (same separator the list already uses, same meaning), and 条款① dropped 凡/一律 for 即 (same reach: every card touching the two surfaces is CONTRACT_REVIEW_TIER; 强制 kept as the anchor other lines cite). Accepted; the one wording question that matters is raised under ④.

No boundary needs escalation to the maintainer: the standing order is the maintainer's own word (option A 「fable + xhigh,立为常设令」 then 「这个应该立卡更新 skills」), and the PR records it without widening tier, effort or the one-line-exit policy.

④ Design judgment

Judged file: .claude/skills/pm-dispatch/references/execution-duties.md (lines 101 and 122), against the rules it cites and the scenario the card accepts it against — docs-only ADR cards dispatch at CONTRACT_REVIEW_TIER + effort xhigh fixed with no per-card ask; max stays named; cards outside the order (a new decision, a superseding ADR, an ADR+code mixed diff) keep their existing routes.

Does the rewritten 条款① still carry everything the old line said?

  • Tier half. Old 「凡改协议语义面或 docs/adr/** 的卡一律契约复审档」, new 「改协议语义面或 docs/adr/** 即契约复审档」: same two surfaces, same mandate, and the machine copy (MANDATORY_TIER_GLOB_ROWS: SKILL.md, os-dev.md, skills/**, docs/adr/**, all CONTRACT_REVIEW_TIER) still matches it. Lines 102-106 (协议语义面 definition, references-only downgrade, no one-line exit under skills/** and docs/adr/**) are untouched and still bind. Holds.
  • Effort floor for every docs/adr/** card (the old 「后者 effort 下限 xhigh」). It is gone from line 101 and re-stated on line 122 as ADR in the xhigh list, with the tail max 凭点名/常设令 unchanged. Line 122 is the effort assignment table (line 121: effort 按卡难度定 … 写进 Container & model 行与派发令); an ADR card therefore reads xhigh, and the only effort above it, max, needs a named word or a standing order — which is exactly 「下限 xhigh」 expressed as an assignment. A mixed ADR+code card or a superseding ADR is still an 「ADR 类」 card (the file's own vocabulary, line 130 「ADR 类 draft-only」) touching docs/adr/**, so it keeps xhigh. Holds; no downgrade path opened.
  • max on an ADR card. The old tail already read 凭点名或常设令; the new tail reads 凭点名/常设令 — unchanged in meaning. The 2026-11-03 standing order names xhigh, not max, so max on an ADR card remains a per-card named word. Holds.

Is the standing order bounded as the card asks?

  • 「纯文档 ADR 常设令 xhigh,免逐卡问」. 纯文档 (no code, no spec) excludes the ADR+code mixed diff by its own words. It does NOT, by its own words, exclude a superseding ADR or an ADR card that needs a new decision — both are docs-only docs/adr/** diffs by path. Those two exclusions survive only through rules elsewhere: needs-user-decision cards are never dispatch candidates (execution-duties.md line 8, SKILL.md line 107), and triage-duties.md lines 79 and 86 put 「ADR」, 「契约/ADR 变化」 and 「⑥悖于既裁或立新常设令」 on the human floor, so a superseding ADR reaches the maintainer as a decision before any dispatch. The tier and effort a seat would then apply are the same (CONTRACT_REVIEW_TIER, xhigh), so no card lands at a lower tier or effort than the card's scenario demands. The PR body concedes the wording choice (「there was no byte room to list the three exclusions inline」). Should-fix: the scoping word carries only one of the three exclusions on its face; the reader must know the human floor to recover the other two. A tighter word (e.g. 修订 / 增补 for an amendment-class edit) or a pointer to the human floor would close it; byte room exists only by trading the 强制 anchor or re-wrapping, which is why this is not a must-fix.
  • 「免逐卡问」 removes the per-card ask for tier AND effort on docs-only ADR cards, which is what the maintainer ordered; it does not remove the human-floor presentation of the ADR content itself (triage-duties line 79 「人工地板(恒呈维护者):…ADR…」), which is a different ask and still stands. Holds.

Does line 122's change widen anything it should not?

  • Adding ADR to the xhigh list widens effort only upward and only for the class the old 条款① already floored at xhigh; security and p1 are already in that list, so an ADR card that is also p1 or security reads the same. A code card implementing an ADR is not 「ADR 类」 in this file's usage (line 130 ties the class to draft-only landing, i.e. the docs/adr/** Tier H surface), so the bare word does not pull implementation cards up to xhigh. No improper widening. The dropped backticks on security and the 或→/ substitution change no meaning (see ③.3).
  • Pointer drift, should-fix, outside this PR's single file: the docs/adr/** row in scripts/pm/dispatch-gates.data.mjs still says the effort floor is stated 「beside clause ①」; on the head it is stated on line 122. Nothing reads that prose mechanically and the card bounded this PR to a net-zero edit of one file, so it is a refresh for the next PR that touches that row, not a reason to hold this one.

Tried to break it, no must-fix found: no card class loses its CONTRACT_REVIEW_TIER mandate; no docs/adr/** card can be dispatched below xhigh; max still needs a named word; the one-line exit is still closed under docs/adr/** and skills/** (line 104 and the data rows' oneLineExit: false); the file stays at its ceiling with both rewritten lines at the byte cap; the two gates that judge the file are green on the head.

Findings:

  • should-fix — line 101's scoping word 纯文档 ADR excludes the mixed diff on its face but leaves a superseding ADR and a new-decision ADR card inside the standing order by wording; they stay out only via the human floor (triage-duties.md 79/86) and the never-dispatched needs-user-decision state, which the line does not point at.
  • should-fix — scripts/pm/dispatch-gates.data.mjs docs/adr/** row's 「the PM skill states it beside clause ①」 now points one section too high; refresh with the next PR that touches that row.

Implemented-by: claude/project-thread-n4zt18
Reviewed-by: session_01WGufzhd2Ad9ANGTyAMW7pH

VERDICT: PASS

…uling excepted

条款① now says the standing order covers ADR revisions (an amendment note, a
wording fix, an `Amended by` entry) and that a new ruling, which a superseding
ADR is, stays on the existing routes. Same line, 119 bytes, net zero.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGufzir9DwLT7sHJkBootW
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · os-support-ai · session_01WGufzhd2Ad9ANGTyAMW7pH

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: bd51c884900f31f642c067182c3afa39be7d4e85
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/execution-duties.md + scripts/pm/dispatch-gates.data.mjs (MANDATORY_TIER_GLOB_ROWS, the docs/adr/** row and the clause-① docblock), scripts/pm/check-skill-line-ratchet.mjs (CEILINGS row 188, MAX_LINE_BYTES 120), scripts/pm/check-skill-id-lint.mjs (scan root, ID_PATTERN), .claude/skills/pm-dispatch/SKILL.md lines 107 and 311 (needs-user-decision row, claim template Container & model:), .claude/skills/pm-dispatch/references/dispatch-runbook.md lines 137-138, .claude/skills/pm-dispatch/references/triage-duties.md lines 79-86 (human floor), .claude/skills/pm-dispatch/references/coordinator.md line 31, .github/workflows/lint.yml (job Lint · repo & tooling gates, steps PM skill line ratchet and PM skill issue-ID lint)

Round: r1, a delta review on the head that applied should-fix 1 of the r0 record (PR comment 6598056150, head 6462193). Inputs read: card #29741 body and all three comments (no comment newer than the os-dev-report 6597914303); PR #29850 body as it stands, its file list (one file, +2/-2) and the net diff against main (origin/main c5ddbea contained in the head; three commits, 3c7c757, the merge 6462193 and bd51c88); the delta git diff 64621932 pr/29850 (one line, line 101); the check-runs on bd51c88. The dispatch order and the dispatching seat's conclusions were not inputs.

Check-runs on the head (conclusions are the gate verdicts): all 23 non-skipped runs success at completion — Auto Label, Check PR Size, Dogfood Regression Gate, Governed Surface Queue Guard, Lint & Repo Gates, Lint · CI release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates (carries PM skill line ratchet and PM skill issue-ID lint, the two gates that judge this file), the three Lint · scoped runs, PR-body guards (two runs), Test Core, Test UI, Type Check · consumer gates / debt ledger / source gates / workspace, TypeScript Type Check, filter. The remaining runs are skipped (paths-filtered builds, UI and dogfood shards, opt-in harnesses, Check Changeset — see ②).

① Derived judgments

  • Accept set: no change. The net diff is still two rewritten prose lines in .claude/skills/pm-dispatch/references/execution-duties.md (lines 101 and 122); no schema, no ledger, no refusal path, no runtime code. Clause-②: no on the PR body and in the claim comment, no arm — right.
  • Public surface: no change. .claude/** ships in no released package; Metadata-protocol: none — right.
  • Governed surface: .claude/** is on the Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 register (Tier S, owning seat on a contract-tier review of record). Governed Surface Queue Guard is success on bd51c88; this record is that review on this head. Served tier reads off the rules face — right.
  • Line ratchet: measured from the tree on bd51c88, the file holds 188 lines against its CEILINGS row of 188 (net zero as the card required); line 101 is 119 bytes and line 122 is 120 bytes against MAX_LINE_BYTES 120; the delta touches line 101 only, no other line re-wrapped. Confirmed by PM skill line ratchet inside Lint · repo & tooling gates — right.
  • Issue-ID lint: no #NNN citation, ruling date or quotation on either rewritten line (grep of the head's file for the ID pattern: none); provenance stays in the PR body. PM skill issue-ID lint in the same job — right.
  • Delta line 101 now reads 「强制条款①:改协议语义面或 docs/adr/** 即契约复审档;ADR 修订常设令 xhigh,新裁决除外。」. Against r0: 纯文档 ADR (path-shaped scope) became ADR 修订 (an amendment-class edit: an amendment note, a wording fix, an Amended by entry — the card's own definition of docs-only), and 免逐卡问 became 新裁决除外 (a card that needs a new ruling is outside the order). Judged under ④.
  • dispatch-gates.data.mjs: the docs/adr/** MANDATORY row's prose 「the same order fixes the effort floor at xhigh (the PM skill states it beside clause ①)」 is unchanged on this head and still points one section above where the floor now lives (line 122). Nothing reads it mechanically; the table carries the tier predicate only and defers to the skill text. Carried forward from r0 as a should-fix pointer refresh for the next PR that touches that row.
  • Mirror obligation: unchanged from r0 and re-checked on bd51c88 — SKILL.md 311, dispatch-runbook.md 137-138 and coordinator.md 31 repeat no per-card ask; no mirror edit owed.

② Semver level

skip-changeset label on the PR. On bd51c88 the Check Changeset run completed skipped (one run, github-actions, 07:37:54Z); on the r0 head 6462193 the same check ran twice, one skipped and one success, with the same label and the same one-file set as this head, so the declaration it judged is unchanged. The diff publishes nothing from any released package, so the label is the correct declaration. Clause-②: no line-initial on the PR body, no arm; Metadata-protocol: none line-initial. Level: none (skip-changeset) — matches the tree.

③ Boundary flags

No new os-dev-report on the card for r1; the three deviations of report 6597914303 stand as answered in the r0 record (attribution link: accepted; no PR subscription / reviewer request: the rule per dispatch-runbook.md 140; line 122 wording moved to fit 120 bytes: accepted, no meaning change). open_questions empty. One new item on this head:

  • Body staleness (for the seat, not a code finding): the PR body's 维护者速读 first bullet, the ```diff block, the 「What each line now says」 paragraph and the 「Wording choices」 note still describe the r0 wording (纯文档 ADR … 免逐卡问, 「两行各 120 字节」, 「line 101 (116 B → 120 B)」). On bd51c88 line 101 reads ADR 修订常设令 xhigh,新裁决除外 at 119 bytes. The seat corrects the six 速读 lines against its own read of the diff at ACCEPT (SKILL.md 193); the dev's body text under it should be refreshed in the same pass so the diff block matches the tree.

No boundary needs escalation to the maintainer: the standing order is the maintainer's own word (option A 「fable + xhigh,立为常设令」, then 「这个应该立卡更新 skills」), and the head records it with a narrower scope than r0, not a wider one.

④ Design judgment

Judged file: .claude/skills/pm-dispatch/references/execution-duties.md lines 101 and 122 on bd51c88, against the rules they cite and the scenario the card accepts them against — docs-only ADR cards dispatch at CONTRACT_REVIEW_TIER + effort xhigh fixed with no per-card ask; max stays named; cards outside the order (a new decision, a superseding ADR, an ADR+code mixed diff) keep their existing routes.

Is r0 should-fix 1 closed? Yes.

  • 新裁决除外 names the exclusion the r0 wording lacked: a card that needs a new decision is outside the order on the face of the line (and remains a needs-user-decision card that is never dispatched, SKILL.md 107, execution-duties.md 8). A superseding ADR is by construction a new ruling (it replaces a decision of record), so 新裁决 covers it too; triage-duties.md 79/86 (ADR, 契约/ADR 变化, 悖于既裁或立新常设令 on the human floor) still routes it to the maintainer first, now with the line itself saying so.
  • ADR 修订 narrows the scope word from a path shape (纯文档, no code/no spec) to the edit class the maintainer's order was given for: docs(adr-0061): record that field-level searchable is honoured on the auto branch (D2 says it stays pruned; ruling 6573569376 letter A reversed it in #29008) #29391 and docs(adr-0146): D8 item 2's "the export of X's app surface" can be read as GET /packages/X/export, which item 3 says carries the base unchanged; name the export it means #29601 were amendment-class edits, and the card defines docs-only by exactly that list (an amendment note, a wording fix, an Amended by entry). A superseding ADR is not a 修订 of the ADR it replaces, so the scope word and the exception agree.
  • Residual reading, no finding: 修订 describes the ADR edit, not the whole diff, so an ADR+code mixed card that revises an ADR is not excluded on the face of line 101 the way 纯文档 excluded it. Nothing moves for that card: its tier is CONTRACT_REVIEW_TIER by the docs/adr/** mandate either way, its effort is xhigh by line 122 either way, dispatch-runbook.md 137 already says 档位与 effort 席位自推导 ⛔ 不等维护者原话 for every card, and its landing stays Tier H whole-PR (Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14, one governed path; line 130 ADR 类 draft-only). The card's 「split per the existing rules」 is a landing rule, not a tier/effort one, and is untouched. The r0 wording covered one exclusion of three by its face; r1 covers the two whose route actually differs (a maintainer decision before any dispatch) and leaves the one whose route is identical to be read from the mandate. That is the better trade at the byte cap.
  • 免逐卡问 dropped. The card asked for 「no per-card ask, no decision card」 in the rule text. On the head that is carried by 常设令 itself plus the surfaces it binds to: SKILL.md 311 accepts 常设档位令的 id 与时刻 as the reason: on the claim line, dispatch-runbook.md 137-138 forbid waiting on the maintainer's word and name a standing order as the reason:. A seat reading line 101 with those lines has no ask to make. Acceptable; the explicit words would have been clearer, but line 101 is at 119 bytes and nothing shorter than 常设令 says it.

Does the rewritten 条款① still carry everything the old line said? Unchanged from r0 and re-judged on this head:

  • Tier half: same two surfaces, same mandate as the old 「凡…一律」, matching the four MANDATORY_TIER_GLOB_ROWS; lines 102-106 untouched. Holds.
  • Effort floor for every docs/adr/** card: stated on line 122 as ADR in the xhigh list with the tail max 凭点名/常设令 — an assignment of xhigh whose only higher value needs a named word or standing order, i.e. the old 「下限 xhigh」. A mixed, superseding or new-decision ADR card is still 「ADR 类」 (line 130) and reads xhigh. Holds; no downgrade path.
  • max on an ADR card: the tail is unchanged in meaning from main (凭点名或常设令 → 凭点名/常设令); the 2026-11-03 order names xhigh, so max stays a named per-card word. Holds.

Does line 122's change widen anything it should not? No — unchanged since r0: ADR joins a list that already holds security and p1; implementation cards cut from an ADR are not 「ADR 类」 in this file's usage; the dropped backticks and the 或→/ substitution carry no meaning, and no gate pins line 122's text.

Tried to break it, no must-fix found: no card class loses CONTRACT_REVIEW_TIER; no docs/adr/** card can be dispatched below xhigh; max still needs a named word; a new-ruling or superseding ADR card is now excluded on the face of the line; the one-line exit stays closed under docs/adr/** and skills/** (line 104, data rows' oneLineExit: false); the file stays at its ceiling with both lines within the byte cap; the two gates that judge the file are green on the head.

Findings:

  • should-fix (carried from r0, outside this PR's single file) — scripts/pm/dispatch-gates.data.mjs docs/adr/** row's 「the PM skill states it beside clause ①」 points one section too high now that the floor lives on line 122; refresh with the next PR that touches that row.
  • r0 should-fix 1 — closed by bd51c88.

Implemented-by: claude/project-thread-n4zt18
Reviewed-by: session_01WGufzhd2Ad9ANGTyAMW7pH

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · os-support-ai · session_01WGufzhd2Ad9ANGTyAMW7pH

维护者速读

  • 改了什么:派发规则写明,ADR 修订卡(修订说明、措辞修正、Amended by 条目)按常设令固定走契约复审档、effort xhigh,不再逐卡问维护者;需要新裁决的卡(含替代 ADR)除外。effort 表把 ADR 列进 xhigh,max 仍需点名。
  • 为什么改:你 2026-11-03 已把 ADR 卡的档位与 effort 定为常设令,但规则原文只写了下限,席位每张 ADR 卡还在开决裁线程问一遍。
  • 风险与回滚:只改 execution-duties.md 两行规则文字,行数不变,不动代码和发布面。回滚即 revert 本 PR。
  • 先看:execution-duties.md 第 101 行(条款①)与第 122 行(effort 表)。
  • 两分钟验证:pnpm check:pm-skill-ratchet && pnpm check:pm-skill-id-lint 均绿,文件仍 188 行。
  • 需要你做的:无。Tier S,席位按复审 PASS 落地。

席位意见:常设令已记入规则,新裁决的边界也写在同一行,同意落地。

席位核对 — ACCEPT · domain:skills#3 · head bd51c884900f31f642c067182c3afa39be7d4e85

  • Shape: Fixes #29741; draft, base main, relay-opened, labels documentation, size/xs, skip-changeset, no assignees. One file, .claude/skills/pm-dispatch/references/execution-duties.md, +2 −2; mergeable_state clean.
  • Premise measured: on origin/main line 101 fixed the tier and an effort floor only, and line 122 named 常设令 only as a way to max; no other surface repeats a per-card ask (SKILL.md 311, dispatch-runbook.md 137), so no mirror edit.
  • Gates (check-runs at this head): 44 runs completed, 23 success and 21 expected skips, including Lint · repo & tooling gates (line ratchet, issue-ID lint) and Governed Surface Queue Guard. Check Changeset skipped at this head with the skip-changeset label (success on 6462193 with the same file set). No red.
  • Contract review: r0 record 6598056150 (head 6462193, PASS, two should-fixes) and delta r1 record 6598287500 (head bd51c88, PASS, should-fix 1 closed), both Served-tier: CONTRACT_REVIEW_TIER, Local-runs: none.
  • Declarations: Clause-②: no, Metadata-protocol: none; .claude/** publishes nothing, so skip-changeset.
  • Accepted deviations: the attribution line links the card thread instead of the lane thread (same project and requester); line 122 dropped the backticks on security and turned 或 into / to fit 120 bytes (no meaning change). The PR body was refreshed by the seat to the r1 wording.
  • Out of scope: the review's should-fix 2: the docs/adr/** row prose in scripts/pm/dispatch-gates.data.mjs says the effort floor sits beside clause ①, but it now sits on line 122. Nothing reads that prose mechanically; refresh it with the next PR that touches that row.
  • Landing: check-governed-merges --pr 29850: Tier S (.claude/** ×1), 4 changed lines. The seat readies it and arms auto-merge on the at-tier PASS.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 3, 2026 07:52
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge November 3, 2026 07:52
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 3, 2026
Merged via the queue into main with commit 55dca46 Nov 3, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-n4zt18 branch November 3, 2026 08:09
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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant