Uh oh!
There was an error while loading. Please reload this page.
docs(pm): narrow the model-identifier rule to content artifacts, with both carve-outs - #14995
Merged
Merged
Conversation
… both carve-outs Two binding instructions read as a conflict for every dispatched dev: the harness attribution directive mandates a `Co-Authored-By` trailer naming the serving model on every commit, while the rule the dispatch brief carries forbids model identifiers in pushed artifacts. Nothing enforced either reading, so each dev spent a round's deliberation on it and filed the same deviation. The maintainer ruled it on 2026-09-03: the rule means CONTENT artifacts — PR titles and bodies, code comments, docs, changesets, issue and PR comments — and two carve-outs are part of the rule rather than exceptions to it: the harness-written commit trailer (with its session link), and `.claude/agents/*` frontmatter `model:`, which `check:agent-model-declared` requires. Devs stop declaring the deviation. States it as one bullet in the dispatch-brief construction clauses, beside the other verbatim clauses a brief carries. No gate over commit messages is added, per the same ruling. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
os-zhuang
approved these changes
Sep 3, 2026
os-zhuang
marked this pull request as ready for review
September 3, 2026 16:59
os-zhuang
enabled auto-merge
September 3, 2026 16:59
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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#14663
Every dispatched dev received two binding instructions that read as a conflict. The harness attribution directive mandates a
Co-Authored-Bytrailer naming the serving model, plus a session link, on every commit. The rule the dispatch brief carries forbids model identifiers in artifacts pushed to a repository. A commit trailer is a pushed artifact, so a dev could satisfy one or the other, never both — and, as triage measured, no gate reads commit messages for this, so nothing enforced either reading. Two devs hit it independently in one round, both resolved it the same way, and both filed it as a deviation a reviewer then had to read. That per-round tax is what this PR removes.The ruling this PR executes
Maintainer ruling, director seat record 5528579332 (2026-09-03, decision batch 23, verbatim 「同意」 adopting option A):
Co-Authored-Bytrailer naming the serving model, plus the session link, is written on every commit exactly as the harness attribution instruction requires. It is not a violation of the repo-side rule..claude/agents/*frontmatter, wherecheck:agent-model-declaredrequires amodel:field.What landed
One bullet — three wrapped lines, one file — in the 派发词构造细则 clause list of
.claude/skills/pm-dispatch/references/dispatch-runbook.md, placed beside the other verbatim clauses a dispatch brief carries (the 文件面两句原文 clause above it, the Same-day churn clause below it). It states the rule as narrowed, enumerates the content artifacts, names both carve-outs with the gate that requires the second one, dates the ruling, and closes with the operative consequence: devs stop declaring the deviation.Register matches the section it joins — Chinese prose, English and backticked machine criteria, the file's ASCII punctuation (measured before writing: 112 ASCII
(against 12 full-width, 99 ASCII;against 2), and every line at or under the file's existing 120-byte maximum.Per the ruling's quote policy for this card, the bullet carries the ruling's date and substance rather than a verbatim quotation — the quotation is not the operative criterion here — and it carries no issue number, which
check:pm-skill-id-lintrequires of this corpus.Premise verification, before the first edit
At
origin/main5bc2f272, in the task worktree:git grep -n '模型标识\|model identifier\|Co-Authored-By' -- .claude/skills/pm-dispatch→ exit 1, zero hits.git grep -n '派发词构造细则' -- .claude/skills/pm-dispatch→dispatch-runbook.md:214.*.mdin the repo,model identifier/模型标识→ still zero hits. So no checked-in text carries the absolute reading that would now contradict the narrowed one — in particular neither.claude/agents/os-dev.mdnor the publishedskills/objectstack-pm-dispatch/rules/dev-template.mdhas a sentence to report.Premise valid: the ruled action had not been done.
Reverse check, after the edit
git grep -n '模型标识只禁内容工件'over.claude,skills,AGENTS.md,CLAUDE.md→ exactly one hit,dispatch-runbook.md:246.git grep -n '模型标识'repo-wide → exactly one hit, the same line. The rule now has a single site.What is deliberately NOT here
skills/objectstack-pm-dispatch/rules/dev-template.mdis untouched. The ruling scopes execution to.claude/skills/pm-dispatch/**, and that published template is a separate governed surface with its own line budget; it carries no model-identifier sentence today, so nothing there contradicts this one.Verification
Gate family re-derived after the final commit with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(no paths — the script takes the change set from the merge base itself): 12 families, identical to the list the dispatch brief carried. All 12 run ate5fe1325, each exit code captured by redirect before any pipe, each verdict line the gate's own:node scripts/check-closing-keyword-parity.mjscheck-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar across 8160 tracked file(s), all registered).node scripts/check-comment-mask-corpus.mjs✓ comment-mask corpus sweep: 5824 files, 0 disagree, 0 unparseablepnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1365 TS blocks judged cleanpnpm check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 432 file(s) · 5851 bare -- token(s) · 1389 launcher-rooted run(s) · 9 separator(s) JUDGEDpnpm check:doc-authoring✓ doc authoring guard: 46 published skill files clean — no internal issue-id references.pnpm check:nul-bytescheck-nul-bytes: OK (scanned 8153 text file(s) -- 8153 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).pnpm check:pm-governed-merges✓ check-governed-merges --self-test: 243 assertionspnpm check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).pnpm check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 276 lines (ceiling 280; headroom 4).pnpm check:refd-timer-probeOK check-refd-timer-probe: 5819 source file(s) sweptpnpm check:skill-frame-sync✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 filespnpm check:watch-hint-literal✓ check-watch-hint-literal: 48 declaration(s) across 4 rostered name(s)Ratchet, before and after, from the gate's own verdict lines:
... dispatch-runbook.md is 273 lines (ceiling 280; headroom 7)→... dispatch-runbook.md is 276 lines (ceiling 280; headroom 4). Net +3 lines, inside the existing ceiling; no ceiling raised, no cross-file move declared.check:doc-formula-expressionswas NOT MEASURED on its first run — exit 3,PREREQUISITE NOT MET, twice in succession (@objectstack/formula, then@objectstack/lintunbuilt in a fresh worktree). Both builds ran through the shared verification lock (os-verify-lock: VERDICT command-exit 0), after which the gate ran green. The exit-3 runs are recorded as not-measured, not as failures.Repo-wide ESLint (
pnpm lint) was narrowed, and the narrowing is a measurement. Three readings: (1) the population comes from ESLint's own flat config — everyfiles:block ineslint.config.mjsnames onlyts,tsx,mts,cts,js,jsx,mjs,cjs, and.mdappears in none (grep -c "\.md'" eslint.config.mjs→ 0); (2) the file count comes from--format json— this diff is exactly one file, and ESLint's own verdict on it iserrorCount: 0with the single messageFile ignored because no matching configuration was supplied.; (3) invariance for untouched files — a Markdown-only diff changes no lint configuration and no type-aware program, so no untouched file's verdict can move. CI runs the full sweep regardless.Head of the verification run:
e5fe1325.Governed posture
.claude/**is a governed surface: this PR stays draft, reviewers are requested by the PM (os-zhuang,hotlong), and the maintainer merges by hand.skip-changesetapplies — the diff publishes nothing from any released package.Generated by Claude Code
Generated by Claude Code