Repository navigation
Commit 5c5b67f
Fixes #19407
Clause-②: no
## The defect, and the one thing that moves
`limit` and `cursor` on `ListInstalledPackagesRequestSchema` are
`retiredKey()` tombstones
that both raise `PACKAGES_LIST_PAGINATION_REMOVED`. That prescription
enumerated the serving
door's filters as `status` / `type`. The door reads a **third**,
`enabled`.
⭐ **Measured from the serving code, not from the card.**
`handlePackagesRequest`'s
`parts.length === 0 && m === 'GET'` branch,
`packages/runtime/src/domains/packages.ts` on
`origin/main` at `1f69917c5c`, reads exactly three query keys and no
others:
| key | read point | effect |
| --- | --- | --- |
| `enabled` | `readEnabledFilter(query?.enabled)` (:828), applied at
:845 | `packageCountsAsEnabled(p) === enabled.value` |
| `status` | `if (query?.status)` (:837) | `p.status === query.status` |
| `type` | `if (query?.type)` (:840) | `p.manifest?.type === query.type`
|
No `limit`, no `cursor`, no fourth key. The card's framing holds: the
enumeration named two
of three. The `enabled` leg is PR #19405's; it is merged, so the premise
is live and settled.
## Incomplete, ⛔ not falsified — and the diff is shaped by that
The sentence's load-bearing claim — *no page was ever withheld and no
continuation token was
ever minted*, the argument for why `limit` / `cursor` were removable at
all — **stays true**,
because `enabled` filters rows and does not paginate. Nor did the
sentence ever assert that
`enabled` was unavailable: it enumerated, it did not exclude.
⇒ **only the enumeration moves.** The removability argument, the
`.default(50)` passage, the
`hasMore` passage and the closing cursor-design sentence are
**byte-identical**. Proven by
reassembling the concatenated literal before and after: the whole 986 →
1009 character string
differs in exactly two places.
```
FROM … the serving door filters on `status` / `type` and then returns every remaining row …
… Filter with `status` and `type` instead of asking for a window.
TO … the serving door filters on `status` / `type` / `enabled` and then returns every
remaining row …
… Filter with `status`, `type` and `enabled` instead of asking for a window.
```
## Every carrier of the sentence, and which one changed
A sibling card exists because a near-identical sentence shipped in two
entries and only one
was repaired, so the sweep is recorded in full. Multiline regex sweep
over every tracked file,
five spellings, at `1f69917c5c`:
| carrier | kind | changed here |
| --- | --- | --- |
| `packages/spec/src/api/package-api.zod.ts` —
`PACKAGES_LIST_PAGINATION_REMOVED` | source of the raised string | ✅ yes
|
|
`packages/spec/src/migrations/entries/semantic/18.packages-list-pagination-retired.ts`
— `replacement` and `reason` | ADR-0087 D3 entry | ✅ yes |
|
`packages/spec/src/migrations/entries/retired-keys/18.api__ListInstalledPackagesRequest__limit.ts`
| record comment | ✅ yes |
| `packages/spec/src/migrations/registry.ts` (3 sites) | GENERATED
mirror of the two above | ✅ regenerated, ⛔ never hand-edited |
| `content/docs/references/api/package-api.mdx` (2 rows) | GENERATED
from the spec | ✅ regenerated |
| `packages/runtime/src/domains/packages.ts:873` | comment | already
correct — #19405 wrote it as `status` / `type` / `enabled` |
| `docs/protocol-upgrade-guide.md`, `packages/spec/spec-changes.json` |
generated | do **not** carry the sentence; `check:upgrade-guide` and
`check:spec-changes` both exit 0 |
| `packages/*/CHANGELOG.md` | published | do **not** carry it — spec is
at 17.4.0 and the tombstone names the unreleased 17.5.0, so nothing has
shipped yet |
| `.changeset/17667-packages-query-contract.md:14` | unreleased
changeset | ⛔ **not changed** — outside this card's declared file
surface. See acceptance notes. |
| `.changeset/scoped-packages-dispatcher-door.md:13` | unreleased
changeset | ⛔ **not changed** — same reason. |
After this PR, zero carriers of the old enumeration remain under
`packages/` or `content/`;
the only two left in the tree are the two `.changeset/` entries above.
## One bounded in-place repair, declared
`packages/spec/src/api/package-api.zod.ts` also carried a paragraph on
`ListInstalledPackagesRequestSchema` reading **「`enabled` is still
declared here and still
unread by that door … the symmetry above is TRUE of `status` / `type` /
`limit` / `cursor`
and PENDING for `enabled`」**. That is **falsified** — not merely
incomplete — by the same
runtime change, and it sat forty lines from the tombstone this PR
repairs, so shipping one
without the other would land a self-contradicting file.
It is inside this card's declared file surface, it is the same defect
class from the same
cause, no other in-flight branch holds the file, and it discharges on
the condition the
paragraph itself names (「The same ruling closes it (item 2 …) in the
runtime, which is a
different file and a different PR」). It is flipped to a closed record,
keeping its guardrail
against deleting `enabled`. Reviewers who want it split out: say so and
it comes out.
## Pinning
⛔ No new pin. The repo's rule is that prescription prose is not pinned
unless a consumer
parses its exact text, and none does. The existing pin
(`packages/spec/src/api/package-api.test.ts:88`) anchors the message's
stable prefix
(`` `limit` / `cursor` were removed from GET /api/v1/packages ``), not
the enumeration, so it
holds unchanged — and it still proves the tombstone is raised rather
than a bare
unrecognized-key issue. A mechanical pin tying the enumeration to the
door's real read set
would have to reach across packages into the runtime, which is a new
verification surface and
its own card.
## Verification — measured at `a755473aac`
Gates the card named explicitly:
```
pnpm --filter @objectstack/spec run check:migration-registry :: exit 0
pnpm --filter @objectstack/spec run check:spec-changes :: exit 0
pnpm --filter @objectstack/spec run check:upgrade-guide :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
```
Derived family, `scripts/pm/dispatch-gates.mjs --commands` over this
branch's own change set
(⛔ not a hand-written list), reconciled with `--ran`:
```
104 derived famil(ies) accounted for — 103 run, 1 NOT-MEASURED, 0 UNRUN
```
The one NOT MEASURED is `pnpm check:dual-build-cjs-loads`, **exit 3 —
PREREQUISITE NOT MET**,
not a finding: it reads built output for the whole monorepo (26 packages
with no `dist`). That
is a repo-level scan CI owns. Everything else exits 0, including
`check:generated` (all 15 artifacts current), `check:docs`,
`check:api-surface`,
`check:authorable-surface` and `check:nul-bytes`.
Tests and types for the affected package — the public surface is
byte-unchanged
(`check:api-surface` exit 0), so no importer owes a run:
```
pnpm --filter @objectstack/spec test :: 509 test files, 14895 tests passed, 1 todo
pnpm --filter @objectstack/spec typecheck :: exit 0
```
Lint is a **proven narrowing**, not a skipped gate. eslint over the six
changed files:
exit 0, 0 errors. ① Population read from eslint's own config, not
guessed — the `.md` and
`.mdx` files report *File ignored because no matching configuration was
supplied*, so four of
six are in the lint population. ② Count read from `--format json`: 6
entries, 4 linted,
0 errors. ③ Invariance, quoted from `eslint.config.mjs`: *this repo runs
one
`eslint.config.mjs`, which never enables type-aware linting (no
`parserOptions.project`, no
typed `@typescript-eslint` rules) for ANY file, test or not* ⇒ this diff
cannot move the
verdict on any file it does not touch. CI still runs the full sweep.
Changeset: `patch`, and the publication was **measured, not assumed** —
the new enumeration is
present in four files under the package's declared `files[]`
(`dist/api/index.js`,
`dist/browser/api/index.{js,mjs}`) and in `src/api/package-api.zod.ts`,
which `files[]` ships
via `src/**/*.zod.ts`; positive control `Filter by enabled state` reads
8. So `skip-changeset`
does not apply.
## Acceptance notes — ⛔ not fixed here
1. **Two unreleased changesets still carry the two-filter enumeration**,
and both publish into
`@objectstack/spec` / `@objectstack/runtime` 17.5.0 — the same release
this repair ships in.
`.changeset/17667-packages-query-contract.md:14` (*the serving door
filters on `status` /
`type` and then returns every remaining row*) and
`.changeset/scoped-packages-dispatcher-door.md:13` (*this door applies
its `status` /
`type` filters and returns every remaining row*). Both are outside this
card's declared file
surface (`packages/spec/src/migrations/`, `packages/spec/src/api/`), so
they are reported
rather than widened into. ⚠️ This has a **deadline**: the release that
consumes a changeset
deletes it and publishes the sentence, after which a factual error is
amendable only by a
dedicated docs-only PR against the released `CHANGELOG.md` entry.
Cheapest moment to repair
them is before that release.
2. **`ListInstalledPackagesResponseSchema.nextCursor` is still declared
and never emitted.**
Recorded as an observation only: the retirement deliberately left the
response half alone,
and the `hasMore` comment argues why. Named here so the next reader of
this declaration does
not mistake it for something this card left half-done.
Authored in Claude Code session `session_01AmH9bKvGoLjiY86Q4Z3og2`
(https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2).
---
_Generated by [Claude Code](https://claude.ai/code)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 236cec1 commit 5c5b67f
6 files changed
Lines changed: 56 additions & 18 deletions
File tree
- .changeset
- content/docs/references/api
- packages/spec/src
- api
- migrations
- entries
- retired-keys
- semantic
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
402 | 402 | | |
403 | 403 | | |
404 | 404 | | |
405 | | - | |
406 | | - | |
| 405 | + | |
| 406 | + | |
407 | 407 | | |
408 | 408 | | |
409 | 409 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
199 | 199 | | |
200 | 200 | | |
201 | 201 | | |
202 | | - | |
| 202 | + | |
203 | 203 | | |
204 | 204 | | |
205 | 205 | | |
206 | 206 | | |
207 | 207 | | |
208 | 208 | | |
209 | 209 | | |
210 | | - | |
| 210 | + | |
211 | 211 | | |
212 | 212 | | |
213 | 213 | | |
| |||
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
224 | | - | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | | - | |
229 | | - | |
230 | | - | |
231 | | - | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
232 | 229 | | |
233 | 230 | | |
234 | 231 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10180 | 10180 | | |
10181 | 10181 | | |
10182 | 10182 | | |
10183 | | - | |
| 10183 | + | |
10184 | 10184 | | |
10185 | 10185 | | |
10186 | 10186 | | |
| |||
10194 | 10194 | | |
10195 | 10195 | | |
10196 | 10196 | | |
10197 | | - | |
| 10197 | + | |
10198 | 10198 | | |
10199 | 10199 | | |
10200 | 10200 | | |
| |||
13363 | 13363 | | |
13364 | 13364 | | |
13365 | 13365 | | |
13366 | | - | |
| 13366 | + | |
13367 | 13367 | | |
13368 | 13368 | | |
13369 | 13369 | | |
| |||
0 commit comments