docs(os-dev): the skip-changeset clause states its criterion as the rule and its list as examples; dispatch-gates prints the same criterion (#13680) - #14621
Merged
Conversation
…ule and its list as examples; dispatch-gates prints the same criterion (#13680) The clause used to state a criterion ("publishes nothing from any package") beside a CLOSED list that omitted shapes the criterion covers — repo-root tooling config and the private example workspaces — so the two readings disagreed and every such PR cost an escalation. The list is now illustrative under the criterion; the two escalation shapes appear as examples only. Line-neutral under the os-dev.md ratchet (469/469): the +59 bytes of the new sentence are paid by deleting 74 bytes inside the same clause — the reachability aside "not an endpoint's or a seat's", "the gate answers before the endpoint", and "an open-gate session measured 200" — whose readings live in platform-readings, which the clause still points at. dispatch-gates.mjs's pending-changeset heading restates the same criterion in place of "unless this card is docs-only", and its self-test regex pins the new sentence exactly. 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 16:57
os-zhuang
enabled auto-merge
September 2, 2026 16:57
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 #13680
What changed
The os-dev
skip-changesetclause stated a criterion ("publishes nothing from any package") beside a CLOSED surface list that omitted shapes the criterion covers — repo-root tooling config and the private example workspaces — so the two readings disagreed and every PR of those shapes cost an escalation. One sentence now settles it: the criterion is the rule; the list is illustrative. The two shapes that raised the card appear as EXAMPLES, never as list membership, and the list did not grow into a longer closed list.scripts/pm/dispatch-gates.mjsprints the same criterion in its pending-changeset heading and its self-test pins the new sentence exactly. Theskip-changesetlabel description already stated the criterion; it is quoted below as the third text and not edited.The three texts, side by side
1.
.claude/agents/os-dev.md— the clause (the 13-line bullet at lines 328-340; the criterion/list sentence is its first three lines)Before:
After:
2.
scripts/pm/dispatch-gates.mjs:7551— the printed heading, and its self-test at:15280Before:
Once a changeset exists, N more famil(ies) apply — write one unless this card is docs-only:After:
Once a changeset exists, N more famil(ies) apply — write one unless this card publishes nothing from any released package (then the skip-changeset label instead, per the os-dev clause):The self-test case is renamed from "carries the docs-only escape" to "carries the publishes-nothing escape, stated as the os-dev clause states it"; its regex pins the new sentence exactly, and the
2 more famil(ies)count half of the assertion is kept.docs-onlyno longer occurs anywhere in the file (grep: 0). Nothing else in the file is touched — PR #14303 edits the tier-constant region and its self-tests, which are disjoint from these two lines.3. The
skip-changesetlabel description (read with the GitHub MCPget_label; unchanged, not editable from a dev seat)All three now state one rule: a diff that publishes nothing from any released package takes the label, not a changeset.
Precedent — verified on GitHub, not copied from the card
Read from the zero-quota PR pages (
/pull/N,/pull/N/files,/pull/N/checks): labels fromdata-name, files from the files page,Check Changesetconclusions from each check item'saria-label. REST is 403 for this session, so no REST reading is cited..changeset/*.mdin the diffCheck Changeseton the headeslint.config.mjssize/s,skip-changeseteslint.config.mjssize/s,skip-changesetexamples/app-showcase/src/data/seed/index.tssize/xs,skip-changesetexamples/app-showcase/src/data/objects/field-zoo.object.ts,packages/qa/dogfood/test/temporal-storage-e2e.dogfood.test.tssize/s,size/xs,skip-changeset,testsThe same file (root
eslint.config.mjs) landed twice with the label and zero changesets, andexamples/**twice; the gate accepted all four.The decisive fact
scripts/check-empty-changeset.mjsREJECTS a newly added empty-frontmatter changeset (its--self-testand its scan of this branch both ran in the union below). So for a diff that names no package there is no honest changeset form at all — the only writable one names a package whose code did not change and emits a release-note row for it. The gate's own prescription already enumerates the releases-nothing shapes illustratively and routes them to the label (source, lines 357-359):A literal reading of the closed list asked for something this gate forbids; the clause now says what the gate, the label description and the merged precedent already said.
Line delta on
os-dev.md— line-neutral under the ratchet✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 469 lines (ceiling 469; headroom 0).andwidest table row is 0 bytes (pin 0; headroom 0).b22110ad): the same two lines, verbatim.scripts/pm/check-skill-line-ratchet.mjsuntouched.skip-changeseton this PRTwo files,
.claude/agents/os-dev.mdandscripts/pm/dispatch-gates.mjs, under.claude/andscripts/pm/— both insidecheck-empty-changeset's own releases-nothing enumeration; no package is published. The label is applied at open by MCP union-write with a compare read-back (REST is 403 for this session); the read-back is quoted in the report comment on the card.Scope items and PM mechanism assumptions, measured
check:pm-skill-ratchetpricesos-dev.mdat ceiling 469 with a widest-table-row pin of 0 — true; verdict lines above.premise_false: check:pm-skill-id-lint scans os-dev.md for section ids — it is an issue-number-citation lint (pattern /#[0-9]{3,}/ over the PM skill files, os-dev.md and AGENTS.md), not a section-id scan; the clause carries no citation; green before and after.check:pm-dispatch-gates(the self-test battery) ran green onb22110adunder the lock;check:skill-frame-syncgreen in the derived family andcheck:skill-frame-freshnessgreen as an extra — the frame gates extract the decision-frame sentence, and this diff is outside it.node scripts/check-empty-changeset.mjs --self-testand its scan of this branch (--base origin/main) both green as extras; enumeration quoted above.b22110ad(node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, change set 2 paths vs merge base2514d49f) — unchanged from the pre-merge derivation; the whole list ran underscripts/pm/os-verify-lock.shwithOS_VERIFY_LOCK_SLOT=issue-13680(lock verdict:command-exit 0 · held the lock 391s · waited 284s).AGENTS.md: 0 occurrences ofskip-changeset; it carries neither the closed list nor a competing rule for the label. Untouched. See follow-up for the adjacent changeset rule at 1116-1117..claude/skills/pm-dispatch/**,skills/**, the ratchet script: untouched.origin/mainmoved five commits during the run and was merged in (2514d49f); the incoming delta touched neither edited file.Gates — head
b22110ad, each gate's own verdict line, exit codes captured before any pipenode scripts/check-ci-filter-parity.mjscoreorcrosspkg, everycrosspkgentry still covers one, and thetestjob'sif:still names both filters.node scripts/check-cross-package-test-inputs.mjsnode scripts/check-self-test-wired.mjs--self-testhas that self-test run by CI.node scripts/check-shard-attestation.mjsnode scripts/check-test-completeness.mjsturbo run testlog — or, running the family locally, record this gate as NOT MEASURED.pnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:agent-model-declaredpnpm check:agent-test-spelling--token(s) · 1380 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 81 manifest(s)pnpm check:bash32-floorpnpm check:cli-command-idspnpm check:cross-package-test-inputspnpm check:declared-population-livepnpm check:doc-authoringpnpm check:entry-guardpnpm check:nul-bytespnpm check:parse-guardpnpm check:pm-governed-mergespnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:pnpm-filter-targets--filteroccurrence(s) across 32 file(s) resolve against 79 workspace package(s); 39 not judged (2 foreign, 17 interpolated, 20 path); 46 more in comments or step labels and 59 in tpnpm check:skill-frame-syncpnpm check:watch-hint-literalpnpm check:skill-frame-freshnessnode scripts/check-empty-changeset.mjs --self-testnode scripts/check-empty-changeset.mjs --base origin/mainpnpm check:pm-dispatch-gatesNOT MEASURED (exit 3 = prerequisite not met, not a red)
node scripts/check-test-completeness.mjs— exit 3; prerequisite: check-test-completeness: PREREQUISITE NOT MET — this gate grades a savedturbo run testlog, and no log was named.pnpm --filter @objectstack/lint run check:doc-formula-expressions— exit 3; prerequisite: check-doc-formula-expressions: PREREQUISITE NOT MET — the workspace package@objectstack/formulais not builtFollow-up (out of scope here, untouched)
AGENTS.md:1116-1117— "Pure bug fixes do not require a changeset." — conflicts with theCheck Changesetjob (pr-automation.yml, step Count the changesets this PR adds: zero added and no label ⇒ red after the settling window) and with the criterion (a bug fix in a released package publishes something, so the label is not its exemption either). A pure bug fix PR following that sentence literally has no green path. Dedupe: a repo-scopedsearch_issues(56 results, non-empty) returned no card for this; not filed by this seat under the checkpoint (landing only) — listed here for the PM to file unassigned.skip-changesetas BOTH a closed path list and a publication test — asrc/file that never reachesdistsatisfies one and violates the other #13432 remains open (on hold): thesrc/-file-that-never-reaches-distshape is the same closed-list-vs-criterion tension from another angle; with the criterion now the rule, that card's remaining question is only how a seat measures "publishes nothing" for such a file.Governed surface (
.claude/**,scripts/pm/**) ⇒ this PR stays draft; landing is the maintainer's, by hand.🤖 Generated with Claude Code
Generated by Claude Code
Generated by Claude Code