Repository navigation
fix(changeset-gate): the level axis sees @objectstack/console when a diff moves the manifest its dist ships - #22816
Merged
objectstack-fleet[bot] merged 4 commits intoOct 11, 2026
Conversation
…e diff moves the manifest its dist ships Claude-Session: https://claude.ai/code/session_01Cw7JSJKE4EqGJ1uKPJZnSu Co-authored-by: Claude <noreply@anthropic.com>
…ged, a console patch refused, Clause-② no unaffected Claude-Session: https://claude.ai/code/session_01Cw7JSJKE4EqGJ1uKPJZnSu Co-authored-by: Claude <noreply@anthropic.com>
…reads, not `src/**` alone Claude-Session: https://claude.ai/code/session_01Cw7JSJKE4EqGJ1uKPJZnSu Co-authored-by: Claude <noreply@anthropic.com>
… cases Claude-Session: https://claude.ai/code/session_01Cw7JSJKE4EqGJ1uKPJZnSu Co-authored-by: Claude <noreply@anthropic.com>
objectstack-fleet
Bot
deleted the
claude/issue-15204-s5pre-changeset-level-console
branch
October 11, 2026 10:43
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.
Part of #15204
Clause-②: no
This is stage 5-pre of #15204 (claim amendment 6107473261). It repairs a blind spot in
Check Changeset's level axis that blocks stage 5 (#22812). #15204 remains open for its other stages, #22812 among them.The blind spot, measured on
origin/mainat23419bafbscripts/check-changeset-no-major.mjscounts a package as grown when the diff moves itspackages/**/src/**(leg 1) or abintarget its manifest names (leg 2).@objectstack/consolehas neither. Its tracked files arepackage.json,README.md,CHANGELOG.mdand.gitignore, and it publishesdist/(files: ["dist","README.md","CHANGELOG.md"]).distcomes from this repository:scripts/build-console.sh:398–:405copies the repo-rootsdui.manifest.jsontopackages/console/dist/sdui.manifest.json.@objectstack/clireads it at runtime for the JSX gate and for the html-page save gate.{packages: [@objectstack/spec]}and refused a trueClause-②: yes (widening), and it told the author to grademinora package that did not grow.scripts/check-changeset-no-major.mjsnorscripts/build-console.sh.The fix: leg 3, read from the build script
packagesTouchedgains a third leg. A changed path that a build script copies into a package's packed output names that package.packedCopiesInreadsscripts/build-console.shat the head under judgement. It evaluates itsNAME="value"assignments in order and itscp SRC DESTlines. The repo root is the variable whose value is the script's own parent directory.packedCopyOwnerthen takes the nearest manifest above the destination and checks that itsfilespacks it. The gate names one path,PACKED_COPY_BUILD_SCRIPTS = ['scripts/build-console.sh'], and never the file being copied. If the build ships a second tracked file, the leg sees it with no edit to the gate. If the build stops copying the manifest, the leg stops claiming it.scripts/sdui-manifest.record.jsonis measured out. The build reads it only for a warning line and does not copy it, so it is not part of the shipped artefact..objectui-shais not added. The pin decides which tree the consoledistis built from, but nothing copies it. A pin bump that moves an accept set moves the manifest too, and that is what this leg reads.unreadable, and the verdict prints it. If the destination package's manifest will not parse, that directory goes inunreadable. A path this leg matches lands inpackagesor inunreadable, never in neither. The leg is a union with legs 1 and 2, so nothing that was "grown" before stops being "grown".packages/**/src/**it moves". That was already false for leg 2, and with this leg it would be false for the console on chore(objectui): bump the console pin to 0df67f237c5a (carries objectui#12089) #22812's green line. They now say "published source (src/**, a packedbintarget, or a repo file its build copies in)". The self-test pins none of these strings.Evidence
ecd4ed7458, merge base680a86b4c,--eventbuilt from chore(objectui): bump the console pin to 0df67f237c5a (carries objectui#12089) #22812's live body):main's gate:node scripts/check-changeset-no-major.mjs --base origin/main --event EVENTexit 1. "clause-② declares yes (widening) while no moved package is graded minor or above". This reproduces CI job 114433350057. chore(objectui): bump the console pin to 0df67f237c5a (carries objectui#12089) #22812's copy of the gate is byte-identical tomain's.yes (widening), and it grades a package whose published source … it moves atminoror above", naming@objectstack/console: minor (.changeset/console-0df67f237c5a.md).packagesTouchedon that diff:{"packages":["@objectstack/console","@objectstack/spec"],"unreadable":[]}.node scripts/check-changeset-no-major.mjs --self-testexits 0 with 401 assertions (378 onmain). The new battery,THE COPY(floor 23, its measured count), pins:minor, specpatch,yes (widening)) isdischarged, exit 0, and the console line is what discharges it. The firing control: the same diff with the build script gone is refused, exit 1.patch, or with no console changeset, staysenforce, exit 1. A manifest-only diff atpatchis refused on the console alone.Clause-②: noisnot-declared, exit 0.unreadable.scripts/build-console.sh: it must copysdui.manifest.jsonintopackages/console/dist/as this reader sees it, and must not ship the record. So if the copy is respelled where the reader cannot see it, lint goes red instead of the leg retiring quietly.node scripts/ablation-replace.mjsreplaced the leg-3 loop's iterable with[](anchor 1 → 0, blob036d4b043ac9→a44dc90ff99c). The self-test exited 1 with 5 failures, the first being "THE CARD: the manifest move names @objectstack/console beside the spec — got {"packages":["@objectstack/spec"],"unreadable":[]}". The restore was verified with blob == HEAD and an emptygit diff HEAD. Floor probe: pinning the battery at 24 reds with "registered 23 case(s), below its pinned floor of 24".node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 32 commands at87d0ed9, and all 32 exit 0.--ranreads "32 derived famil(ies) accounted for — 32 run, 0 NOT-MEASURED". This includescheck:changeset-gate-self-tests,check:nul-bytesandcheck:pm-dispatch-gates("1828 cases pass").--no-inline-configover the one changed file gives 0 errors and 0 warnings, 1 file by the--format jsoncount. The config enables no type-aware linting (parserOptions.projectis unset for it), so this diff cannot move the verdict on any untouched file. The repo-widepnpm lintis CI's run.node scripts/pm/check-governed-merges.mjs --branch claude/issue-15204-s5pre-changeset-level-consolereads "NOT governed", 346 changed lines.Release
skip-changeset:scripts/is the repo root's, and no package'sfilesships it.Landing
On green, before #22812. #22812 then re-runs
Check Changeseton its next push or on a body edit, with no change to its own files.Acceptance notes
.objectui-shais not a leg (see above). A pin bump that ships new console bytes but moves no accept set still shows no console in the touched set. That is the right answer for this axis, which asks about a declared widening, and it is noted so nobody reads it as an omission. Carrier: none.NAME="value"/$NAME/${NAME}/cp [flags] SRC DESTshell, and nothing else. That is enough for the script it reads, and the real-script pin is what catches a respelling. Carrier: none.Generated by Claude Code