Repository navigation
fix(changeset): the two unreleased /packages-door notes enumerate all three filters that door reads - #19616
Conversation
… three filters that door reads `GET /api/v1/packages` reads three query filters — `status`, `type` and `enabled` (`readEnabledFilter`, `packages/runtime/src/domains/packages.ts`). Two pending changesets still enumerate two of them, and both publish into the same release that carries the correction of that same sentence. Incomplete, not wrong, and only the enumeration moves: the load-bearing claim — no page was ever withheld and no continuation token was ever minted — stays true, because `enabled` filters rows and does not paginate. The surrounding argument is byte-identical. Claude-Session: https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2 Co-authored-by: Claude <noreply@anthropic.com>
Seat confirmation for the DELIBERATE CORRECTION refusal — the two notes are named and the rewrite is confirmed, 2026-09-21T18:13Z
and the remedy string itself,
This comment is the confirmation half. The seat that dispatched this card has read both hunks and confirms The two notes, and what changed under each
⇒ Why restoring from base is the wrong remedy here — which is the whole point of the two-class splitBoth notes are PENDING: they publish into
The sentences were incomplete, ⛔ not false — so only the enumeration moved
⛔ Two things this PR deliberately did NOT do
|
Contract reviewServed-tier: ① Derived judgmentsRead at 2026-09-21T18:23Z. Every reading below is from GitHub or from the checkout at The diff is what it claims. Commit The third line is a re-wrap, not an edit — measured, not accepted. A word-level diff of each
Nothing else in either file differs by so much as a word. The 12 added characters pushed The repair is right, and bounded. The door reads exactly three query keys on this route — The sentences were incomplete, not false, and the load-bearing claim survives untouched. Lit The carrier set is closed. Whitespace-normalised sweep over all 569
② Semver levelNo changeset of its own is correct, and adding one would be wrong. Editing two pending
The destination confirms these two notes are genuinely pending. At the release PR's head ③ Boundary flags⭐ The
COLLISION is structurally impossible here, measured rather than argued: the head commit's file ℹ️ One honest nuance, stated rather than smoothed: the correction class is narrated as 「your change The confirmation comment exists and does what the remedy asks. Comment
⛔ ⛔ Release PR #17076 was not touched. Its timeline carries one commit, Nothing else moved. The commit's file list is exactly the two ℹ️ Two readings the PM may want, with their radii. Implemented-by: VERDICT: PASS Generated by Claude Code |
⛔ Seat correction — comment
|
| instrument | reading |
|---|---|
scripts/check-required-contexts.mjs — the repo's own REQUIRED_CONTEXTS |
Check Changeset absent: grep exit 1, 0 lines. Lit control Lint & Repo Gates: 24 hits |
| the ruling's own text | 「Check Changeset is not one of the seven REQUIRED_CONTEXTS, so its red is advisory and blocks nothing」 |
⭐ GitHub's computed mergeable_state, this PR, out of draft with the red final |
unstable, mergeable: true — ⛔ not blocked. A required check failing reads blocked; unstable is the non-required reading |
⭐ The third one matters beyond this PR: GET /branches/main/protection answers 403 for this seat, so the
live ruleset is unreadable — but mergeable_state is computed from that ruleset, so reading it after
leaving draft is an indirect read of the surface the 403 hides. The registry is the repo's declaration;
this is its effect.
⇒ the red is settled and permanent (route 0 never clears, and ⛔ no commit clears it). It is ⛔ not what
this PR is waiting on.
What the PR is waiting on, precisely
One sentence from the maintainer confirming the correction of these two pending release notes — which
the seat will then carry back here with 谁的指令 / 原话 / 在哪说, per ② B. The notes and their before/after
are already set out in 5765290088 and need no restating.
skip-changeset stays unapplied and is ⛔ not an alternative: the same ruling refuses it by name for
exactly this class, and records that the one prior instance (#18765) applied it 「on the maintainer's
authority」 as surplus to the written confirmation, ⛔ not as the channel.
⏱️ Stated without pressure, because the maintainer decides the pace: release PR #17076 is open at 17.5.0
with both stale sentences already generated into its changelogs, and it regenerates from main on the next
push. Whatever lands first is what publishes.
Generated by Claude Code
The DELIBERATE CORRECTION was confirmed by the maintainer's own merge, 2026-09-22T02:50Z
The confirmation arrived as an act, not as text. Carried here with its three sources:
The two notes, and what changed under each as merged:
Both sentences now read three filters on
Generated by Claude Code |
Fixes #19605
What changed
GET /api/v1/packagesreads three query filters —status,type,enabled(
readEnabledFilter,packages/runtime/src/domains/packages.ts). Two pending changesetsenumerated two of them. Each gains
enabled; nothing else moves..changeset/17667-packages-query-contract.md'@objectstack/spec': minorthe serving door filters on `status` / `type``` →…status/type/ `enabled```.changeset/scoped-packages-dispatcher-door.md"@objectstack/runtime": minorthis door applies its `status` / `type` filters→… `status` / `type` / `enabled` filters3 lines changed, 2 files (
+3 / -3). The second line of the first file's hunk is a re-wraponly — that file is hard-wrapped at 80 columns and the twelve added characters pushed one
word onto the next line. Re-wrapping was contained to the two lines the sentence occupies,
so the paragraph below it is byte-identical.
Clause-②: no
Re-judged from this diff rather than inherited: this branch adds no key to any published
payload — it adds no key to anything. It edits prose inside two pending changesets and
ships no schema, no export and no wire field. The claim comment on #19605 declares the same
value, so there is no mismatch to report.
ROUTE 0 — read this before merging:
Check Changesetis RED by designThis PR corrects two pending release notes and adds no changeset of its own. That is the
DELIBERATE CORRECTION class named in
.github/workflows/pr-automation.yml'sCheck Changesetstep (route 0) and in
scripts/check-empty-changeset.mjs. Both readings were taken locally,exit codes captured before any pipe.
The route-0 discriminator, verbatim:
Every row is
M, none isA, so the counting step readsadded=0and the verdict step fails.scripts/check-empty-changeset.mjs --base origin/mainclassifies it independently — exit 1,"present on the merge base and CHANGED by this PR". Of that gate's two classes this is
DELIBERATE CORRECTION, not COLLISION: the two filenames were drawn by other PRs
(#17667 and #16781), this branch drew neither, and restoring them from the merge base is the one
thing the gate tells you not to do here — it would put the short enumeration back.
The written confirmation route 0 asks for, naming the note and what changed under it:
.changeset/17667-packages-query-contract.md—'@objectstack/spec': minor, the note forthe
limit/cursorretirement onListInstalledPackagesRequestSchema. Under it, onesentence in the BREAKING paragraph gains the third filter. The removability argument, the
.default(50)passage, theretiredKey()paragraph, the newly-declared-parameters table, thehasMoreparagraph, theClause-②: yesline and the ADR-0087 disposition marker are alluntouched.
.changeset/scoped-packages-dispatcher-door.md—"@objectstack/runtime": minor, the notefor mounting the scoped
/api/v1/environments/:id/packages*door. Under it, thehasMorebullet's enumeration gains the third filter. The door paragraph, the
DELETEbullet and theroute-ledger paragraph are untouched.
Neither note is made false by this branch's own code — this branch ships no code. Both were made
short by #19405, which landed the
enabledleg, and both publish into the same17.5.0that carries the correction of that same sentence everywhere else (landed as #19595 for card
#19407). Repairing them here is a decision about a release, which is why the gate puts it in
front of a person rather than letting a label route around it.
⛔
skip-changesetis deliberately NOT applied and must not be applied. Maintainer ruling on#18375 (ruling D, 2026-09-18): the label is never applied to a PR that edits an existing
changeset. It would be a false declaration — the notes rewritten here are releases that are
still pending — and it exempts the whole job, taking the refusal that names this class with it.
Check Changesetis not one of the seven required contexts, so this red blocks no merge; theapprover merges over it, and staying red is the point.
Does a
.changeset/-only edit owe its own changeset?No, and it must not have one. Two independent readings agree:
branch publishes nothing: it adds no package version, moves no
files[]payload and touches nopackages/source.pnpm check:published-filesexit 0.this branch's own would be route 1, declaring a release this branch does not make; the label
would be route 2, refused by name for this class.
So the correct shape is: no changeset, no label, a red
Check Changeset, and this paragraph.Does editing an unconsumed changeset's prose need anything regenerated?
No. Measured rather than assumed:
pnpm --filter @objectstack/spec check:generated— exit 0, "All 15 generated artifacts areup to date", run against a
distthis branch built (pnpm --filter @objectstack/spec build,exit 0, under the shared verify lock). Nothing in
packages/spec/scripts/reads.changeset/content — the three hits for that path are prose in file headers, not reads.
node scripts/check-changeset-fixed.mjs— exit 0, the.changeset/config.json"fixed"group still in sync with 70 public workspace packages. This is the one artifact-roster gate
whose roster lives under a directory this diff is in, so its silence would not have been
evidence either way; it was run rather than assumed.
node scripts/check-adr-0087-registration.mjs --base origin/main— exit 0. The first fileis a declared-breaking changeset and its ADR-0087 disposition marker is intact.
The one artifact these two files do feed is the generated
CHANGELOG.mdon the changesetsrelease PR, and that artifact regenerates itself — see below.
⛔ Do not edit PR #17076, and nothing here does
PR #17076
chore: version packagesis the bot's standing release PR. Read at3b8ebe9a2dec9fa6fea7c3a131f4fa72fc005fec, it carriespackages/specandpackages/runtimeat17.5.0and both stale sentences are already written into its generated changelogs(
packages/spec/CHANGELOG.md,packages/runtime/CHANGELOG.md), with the three-filter form absentfrom both. Nothing in this PR touches that branch, its files, its body or its labels. When this
lands on
mainthe bot regenerates that PR and the corrected sentences replace the stale ones.Prime Directive #15 also applies to it: no agent seat merges, queues or arms auto-merge on it.
Is the edit semantically right?
The sentence was incomplete, not false, and only the enumeration moves. Its load-bearing claim
— no page was ever withheld and no continuation token was ever minted — stays true, because
enabledfilters rows and does not paginate. The surrounding argument is unrewritten; a probe forthat claim still counts 1 in the first file after the edit.
Evidence
Exit codes captured before any pipe (
cmd > file 2>&1; EXIT=$?).Premise, re-verified at
5c5b67fc41with a whitespace-normalised whole-file probe. Aline-wise
git grepfor the first sentence returns a false zero — it wraps, "the serving doorfilters on" ends one line and the backticked filters begin the next. Before the edit: carrier 1
two-filter count 1 / three-filter 0; carrier 2 two-filter 1 / three-filter 0. Lit control ("no page
was ever withheld") true in file 1; dark control ("zzznotasentence") false in both. After the edit:
two-filter 0 / three-filter 1 in each, lit control still 1, dark control still 0.
The destination, read directly from the release branch (fetched into a ref this branch owns, no
write): on
3b8ebe9a2d,packages/spec/CHANGELOG.mdcarries the first stale sentence (count 1) andpackages/runtime/CHANGELOG.mdthe second (count 1), the three-filter form counts 0 in both,and both packages read
17.5.0. That is the byte-level confirmation that these two.changeset/files are the sources of those two changelog lines.
Gate families.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 19 commands from this tree at
7bd01a6d88; all 19 were run and reconciled with--ran(19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN, every row carrying an exit code), plus 2 runbeyond the derivation. 18 exit 0; the single exit 1 is
check-empty-changeset.mjs --base origin/main, the designed route-0 red documented above. Included:check-changeset-no-major0,check-adr-0087-registration0,check:nul-bytes0,check:published-files0,check:pm-changeset-deadline-census0,check:objectui-changeset0,check-closing-keyword-parity0,check-issue-citations --base origin/main0 (0 issue citationsadded — no bare card number lands on an added line).
pnpm lint, narrowed and the narrowing proven.eslint.config.mjscarries sevenfiles-bearing config objects and every one of them is a TypeScript/JavaScript glob(
**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}and narrower); a grep of that file for a markdown glob orfor this diff's directory returns exit 1, zero hits.
npx eslint --no-inline-config --format jsonover exactly the two changed files reports 2 results, 0 errors, each carrying "File ignored
because no matching configuration was supplied". This diff adds and removes no config object and
touches no
.ts/.jsfile, so no untouched file's verdict can move. The repo-wide scan is CI's;its verdict is invariant under this diff.
Build/test tiers: this diff touches no workspace package, so there is no affected-package closure
and no package
test/typecheckis owed. Thepackages/specbuild above was run only to givecheck:generateda realdistto read.Acceptance notes
.changeset/19407-packages-list-tombstone-third-filter.mdalso matches the two-filter pattern.It is the
FROMside of that note's own before/after block, with the correctedTOtwo linesbelow it. Quoting the old sentence to show what moved is the point of the block, so it is left
exactly as it stands — a naive re-run of the probe returns three lines and the third is a
deliberate quotation, not a fourth carrier.
packages/runtime/src/domains/packages.tsalready enumerates all three filters correctly and isoutside this PR's declared file surface (
.changeset/and nothing else).ListInstalledPackagesResponseSchema.nextCursorremains declared and never emitted. Named incard [finding] two unreleased changesets publish the /packages list door's filter set as two-of-three into 17.5.0 — the same release that carries the repair #19605 as deliberately left by the retirement; no card is opened for it here.
🤖 Generated with Claude Code
https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2
Generated by Claude Code