Repository navigation
fix(gates): Check Changeset route 2 and check-empty-changeset stop listing skills/** as releasing nothing - #23457
Conversation
…ying skills/** releases nothing `@objectstack/skills` publishes `skills/**` (its build copies the tree into the `dist` its `files` field ships), so a `skills/**` change releases that package and owes a changeset naming it, never the `skip-changeset` label. - pr-automation.yml route 2: `skills/` leaves the "releases nothing" list; the paragraph that said `skills/` ships with no npm package now says it ships in `@objectstack/skills` (route 1); the `::error::` line no longer sends a `skills/**` change to the label. - check-empty-changeset.mjs: the remedy drops `skills/` from "releases nothing" and names it under "releases something"; the GREEN 3 battery is renamed (roster row and `battery()` call together) and its rationale now says why this gate stays silent on a PR with no changeset row, not that the PR releases nothing. Text, comments and fixture rationale only: neither gate passes or refuses anything it did not before. Claude-Session: https://claude.ai/code/session_012VGBku7tEi8DX2uvi1gtXk Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs: PR #23457 at the head above (body, file list, net diff against ① Derived judgmentsPass/refuse behaviour: neither gate moves. RIGHT.
Every rewritten sentence is TRUE on
No sentence named by the card is left false.
The renamed GREEN 3 battery is consistent with
The
Check-runs on the head (43 runs, all completed): 32 success, 11 skipped, 0 failure, 0 in progress.
② Semver level
The PR body's ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对 · ACCEPT · PR #23457 @
|
维护者速读 · PR #23457 ·
|
Fixes #23451
Clause-②: no
What
@objectstack/skillspublishesskills/**. Its build (packages/skills/scripts/sync-catalog.mjs) copies every regular file underskills/intodist/skills/, with no exclusions. Itsfilesfield is["dist", "README.md", "CHANGELOG.md"], and it is in the changesetfixedgroup. Two gate texts still told an author that askills/**change releases nothing and should takeskip-changeset. That disagrees with AGENTS.md's post-task checklist (AGENTS.md:1085at2d2e3ce43), which reserves the label for "a diff that publishes nothing from any released package".This PR changes only text: prose, comments, one
::error::line, and one self-test battery's name and rationale. Neither gate passes or refuses anything it did not pass or refuse before. TheCheck Changesetverdict step has no path branch, andcheck-empty-changeset.mjsreads only.changeset/*.mdrows. Neither has askills/**case to change.Site by site (line numbers at base
2d2e3ce43)scripts/check-empty-changeset.mjs:513, printed remedy "It releases nothing (.github/, .claude/, skills/, …"skills/is dropped from the list. The "It releases something" bullet now says askills/**change does, because it ships in@objectstack/skills.:913-916, GREEN 3 comment andbattery()name ("Such a PR takes theskip-changesetlabel", "(route 2)")GREEN 3: a skills/**-only PR carrying NO changeset: nothing to judge. The comment now says why this gate stays silent: it reads only the.changeset/*.mdrows a diff touches. It also says the PR still owes a changeset naming@objectstack/skills. Asking for that changeset is theRequire a changesetstep's job, and catching a wrong label is review's job.:679, roster rowbattery()call. The floor keys on the name (see the ablation below).:921-922, GREEN 3 assertion messages ("must be green here", "must not even be read"):67, header narrative of theskills/**precedent chain (#4607 / #5130 / #5451, then PR #5799):866-872, RED 1 (the #5799 shape: askills/**change plus a new empty changeset).github/workflows/pr-automation.yml:795, route 2's "releases nothing" listskills/dropped:812-820, route 2'sskills/**paragraph ("skills/ ships with no npm package … That premise is true … Take the label.")skills/**is not on the list, because it ships in@objectstack/skills. Askills/**change takes route 1, naming that package, and never takes the label. The old premise no longer holds.:842,::error::line ("including any 'skills/**' change -- see #5947")skills/**change releases@objectstack/skillsand never takes the label. The line still opens with::error::This PR adds no changeset., whichcheck-changeset-no-major.mjspins.:846-852, step comment on the same precedent chainNo new tracker number enters any text an author is shown.
Verification (head
7463fab7c)node scripts/check-empty-changeset.mjs --self-testexited 0:✓ check-empty-changeset --self-test: 170 assertions over real temp git repos (real scan() path).scripts/ablation-replace.mjsthen put thebattery()call back to the old(route 2)name, leaving the roster at the new name. The self-test exited 1 with:battery "GREEN 3: … (route 2)" registered 2 case(s) but is not declared in SELF_TEST_BATTERIESandbattery "GREEN 3: … nothing to judge" DID NOT RUN — 0 cases registered, 2 pinned. The tool restored the file: blob after restorec0df1afc9232equals HEAD's, andgit diff HEADis empty.git status --porcelainread 0 lines afterwards.::error::This PR adds no changesetline to reachexit 1within 900 characters. It measures 730 after the edit (698 before). The workflow parses withyaml2.9.1, and theRequire a changesetstep is found.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackagainst merge base2d2e3ce43: 53 commands, and every one exited 0. These includecheck-empty-changeset.mjs --base origin/main,check:changeset-gate-self-tests,check:workflow-status-functions,check:workflow-step-name-quoting,check-self-test-workflow-commands.mjs,check:nul-bytesandcheck:pm-dispatch-gates(fast tier, 1841 cases). Reconciliation:✓ dispatch-gates --ran: 53 derived famil(ies) accounted for — 53 run, 0 NOT-MEASURED.pnpm exec eslint --no-inline-config --format jsonreturned 2 results:scripts/check-empty-changeset.mjswith 0 errors and 0 warnings, andpr-automation.yml"ignored because no matching configuration was supplied". So the YAML is outside eslint's own population.eslint.config.mjsenables no type-aware linting (zeroparserOptions.project, as stated at its line 327), so this diff cannot move any untouched file's verdict.Test Corejob's own steps, and 4 type-check lanes. This diff touches no TypeScript.Acceptance notes
AGENTS.md:1085. That line states the general rule, "A bug fix in a released package takes apatchchangeset — never none, and ⛔ neverskip-changeset: that label is for a diff that publishes nothing from any released package". It names noskills/**case. The skills case follows from the packaging fact above. So the new texts say "a changeset naming@objectstack/skills" and fix no bump level: route 1's level rules apply.Require a changesetstep reds any PR that adds no changeset and lacks the label,skills/**or not. Askills/**-only PR passed only through the label that route 2 told its author to apply, and that instruction is what this PR corrects.skills/**diff that carries no changeset. That would be new gate behaviour, and triage left it for the maintainer's word (「新增门禁默认否」).skills/**.skip-changeset. Rootscripts/and.github/workflows/ship in no package. Across 72 non-privatepackage.jsonfiles, nofilesentry leaves its own package directory.git grepfor either file name underpackages/(CHANGELOGs excluded) has zero hits, against a control (sync-catalog) that hits.维护者速读(草稿)
改了什么:改两处提示文字,内容是"要不要写 changeset"。一处是
Check Changeset的路线 2(在pr-automation.yml),另一处是check-empty-changeset.mjs的修复提示。两处原来都说"只改skills/**不发布任何包,贴skip-changeset标签即可"。现在改成:改skills/**会随@objectstack/skills一起发布,要写 changeset 并点名这个包,不贴标签。另外,一个自测用例改了名字,注释也重写了。为什么改:
@objectstack/skills上线后,skills/**已经随 npm 包发布,旧提示和 AGENTS.md 的发布清单相互矛盾。已经出过一次真实问题:PR #23443 照旧提示贴了标签,这次改动差点进不了 CHANGELOG,到合同复核才被发现。风险与代价(含回滚):只改文字和注释。两道门禁放行什么、拒绝什么都没有变,自测 170 条断言全部通过。代价是旧提示里那段早期 skills PR 的历史说明删短了。如需回滚,还原这一个 commit 即可。
席位意见:
你要做的:审阅后在本 PR 上给出批准(本 PR 改到
.github/workflows/**,属于 Tier H)。Generated by Claude Code