Skip to content

Commit 31d281d

Browse files
docs(spec): PackageInstallBodySchema docblock records the install door residual as closed, and enableOnInstall as read off the parsed request (#20506)
Fixes #20219 Clause-②: no ## What this changes Text only, in `@objectstack/spec`: the `PackageInstallBodySchema` docblock, one sentence of the `PackageInstallRequestSchema.enableOnInstall` docblock, the matching block of `package-api.test.ts`, and a `patch` changeset. ⛔ No schema shape, accept set, export or runtime file moves. Every sentence was re-derived against the landed door on `origin/main` `fc0db22b` (`packages/runtime/src/domains/packages.ts`), not against the card's quotes. ## Premise check (dispatch assumption 1) The card's line "Only the wrapped form's top-level unknown key is still stripped" is false on `main`: since `28ad7e4b` the wrapped branch is a `strictObject`, and the door refuses such a body `400`. Measured on the built schema: `{ manifest, bogus: 1 }` fails `PackageInstallBodySchema.safeParse`. What the declaration still strips is only an unknown key NESTED in a strip-mode block. A walk of the built union finds three such positions: `artifactRef`, and the expression envelope of a manifest navigation item's `visible` plus its `meta`. Both were measured parsing green with the key dropped. So the rewritten section describes that strip, and no wrapped-form top-level strip. ## Sentences changed, each with the line that makes the new one true | # | Where | Old sentence (gist) | New sentence (gist) | Evidence on `fc0db22b` | |--:|:--|:--|:--|:--| | 1 | `enableOnInstall` docblock | the door "reads the raw body" | the door reads the key off the PARSED wrapped request, after the body passes `PackageInstallBodySchema` | `packages.ts:1019` `const declaredBody = PackageInstallBodySchema.safeParse(body)`, `:1164` `const request = 'manifest' in declaredBody.data ? …`, `:1247` `const requestedEnabled = request?.enableOnInstall` | | 2 | body docblock, bare-form paragraph | the two runtime door drives post no `type`, are refused here, and are answered `201` | both drives carry `type: 'app'` since PR #20218, parse green through the bare branch, and are answered `201` | `package-door-namespace-conflict-code.test.ts:88` and `domain-handler-registry.test.ts:605`, both with `type: 'app'` | | 3 | residual heading and lead | a SUBSET description: the door "additionally answers `201` to five classes" | the residual is empty on the answer: the door refuses each class as the union does, `400` / `VALIDATION_ERROR`, ahead of the `409` | `packages.ts:1155` answers `!declaredBody.success` with `400`, ahead of the `409` at `:1176` | | 4 | residual item 1 | 1b "still OPEN, answered `201`" | 1a and 1b both landed; 1b with the whole-body parse | same union verdict, `packages.ts:1155` | | 5 | residual item 2 | unknown keys "`201` either way" | refused on both forms, and at the wrapped top level since ruling record `5856869656` | `packages.ts:1155`, plus `PackageInstallRequestSchema` is `strictObject` (`package-api.zod.ts:228`) | | 6 | residual item 3 | `'false'` installs ENABLED, `'true'` overwrite read as ABSENT | both keys are `z.boolean()`, so the parse refuses either string | `package-api.zod.ts` `enableOnInstall: z.boolean().optional()`, `overwrite: z.boolean().optional()`; `packages.ts:1155` | | 7 | residual item 4 | bare-form options "ignored, never honoured" | refused by `ManifestSchema`'s strict close; the door's refusal names the wrapped form | `packages.ts:1155` → `installBodyRefusal` (`:717`-`:750`), whose bare-form arm prescribes the wrapped form | | 8 | residual item 5 | the door answers `400` to a whitespace-only `id` "this declaration admits" | both faces refuse it, since `ManifestSchema.id` carries `MANIFEST_ID_PATTERN` | `packages.ts:1021`-`:1023` (trim, then `Package id is required`); `manifest.zod.ts:272`; the spec test's own whitespace pin already said so. **This sentence was already false before PR #20218.** | | 9 | new paragraph | (none) | what the parsed value still does not describe is what the door STORES: the manifest as SENT, so parse-time defaults (`scope`, `defaultDatasource`) are not stored, and an unknown key nested in a strip-mode manifest block is stored as sent | `packages.ts:1020` (`manifest = body.manifest || body`, the raw body) → `:1193` / `:1196` `installPackage({ manifest, settings })`; door pin `packages-install-body-contract.test.ts` §7 ("stored as SENT"); defaults measured on the built schema (`defaultDatasource`, `scope` are added by the parse) | | 10 | the ⛔ paragraph after the list | "the residual is RECORDED here … closing it is its own decision with its own card" | none of this licenses relaxing either branch, or making the door answer a body differently from the declaration | follows from rows 3-8 | ## Sentences kept, because they are true on `main` (assumption 3) - «The door reads `const manifest = body.manifest || body`, so a bare manifest IS a body form it accepts» (`packages.ts:1020`). - «A contract naming only the wrapped form would refuse bodies this door answers `201` to»: the bare form is answered `201` (`packages-install-body-contract.test.ts` §7, "BARE → 201"). - The whole "two branches are disjoint — and BOTH are closed" section, including its ruling paragraph («Since `c02fa1276` … the door's answer IS this declaration's answer»). - «⚠️ The bare form carries NO install options … A bare-form caller reaches `overwrite` through the query string alone» (`packages.ts:1171`-`:1172`). - The rest of the `enableOnInstall` docblock, including «It calls `installPackage({ manifest, settings })` and performs the enable/disable flip itself» (`packages.ts:1193`, `:1247`-`:1254`). ## The test block (assumption 4): what `DOOR_201_RESIDUALS` guards now Measured, not assumed: the list's assertion (the declaration refuses every body in it) still guards a door behaviour. The door parses through this declaration, so if any of those bodies started parsing, the door would start answering it `201` again. The assertion is therefore **kept, not weakened**. It is renamed `CLOSED_RESIDUALS` and re-titled to what it now says: the declaration refuses every one, and so does the door since PR #20218. - The two drive transcriptions now carry `type: 'app'`, because the drives do, and are pinned GREEN. - The bodies they used to post (the same manifest with no `type`) are derived by an `untyped` helper and stay pinned REFUSED, both in the "the missing `type` is what decided it" case and in `CLOSED_RESIDUALS`. No assertion was dropped. The `pkg-a` refusal is unchanged. - The clause-1a case keeps its assertion. It is re-titled to what it guards now: every body in the list is refused for its own class, never on the `version` leg the door answers first. - The whitespace-id case keeps its assertions; only its trailing comment ("the class remains") is rewritten. - In-place fix, outside the named block: the comment on "parses a COMPLETE manifest posted BARE" said the bare-form callers "post INCOMPLETE ones". This is the same stale fact, so it is corrected in one comment edit. It passes all four bounded-fix conditions: same defect class, mechanical, no other claim on the file, and the same gate family. Test count is unchanged (84 → 84). ## Verification — against `e627005b` (`git rev-parse --short HEAD`) - `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/api/package-api.test.ts`: `Tests 84 passed (84)` (the baseline on `fc0db22b` was also 84). - Spec suite, `vitest run --project local --maxWorkers=2` in `packages/spec`: `Test Files 572 passed (572)`, `Tests 16789 passed | 1 todo (16790)`. - `pnpm --filter @objectstack/spec run typecheck` → exit 0, `check:test-typecheck: OK — … 53 file(s) / 251 error(s) / 138 pinned signature(s) held`. - `pnpm --filter @objectstack/spec check:generated` → "All 15 generated artifacts are up to date". The build left the tree clean: `authorable-surface.base.json` was not touched. - `pnpm check:doc-authoring` → exit 0 ("16735 customer-facing string(s) across 1167 spec sources clean"). - Gates: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 83 commands over this diff. All were run, with each exit code written to disk before any pipe. `--ran` reconciliation: `✓ dispatch-gates --ran: 83 derived famil(ies) accounted for — 80 run, 3 NOT-MEASURED (3 DERIVED from a recorded exit 3)`. - `check:doc-formula-expressions` first exited 3 (its `formula` / `lint` dist was absent). After building that closure it was re-run: exit 0. - NOT MEASURED: `check:dual-build-cjs-loads`, `check:lean-entry-closure` and `check:type-check-debt`. Reason: each needs a whole-workspace (or `objectql`-closure) build this worktree does not have, and each refused with `PREREQUISITE NOT MET`. The diff changes no emitted code: `check:api-surface` is green, and so is the `dts` sweep. These three are CI's to read. - Published-surface check (changeset rather than `skip-changeset`): after `pnpm --filter @objectstack/spec build`, the new heading `CLOSED on the answer` appears once in `dist/api/index.d.ts` and once in `index.d.mts`. The old `the door additionally answers` appears 0 times in both. The `enableOnInstall` docblock ships through `files[]`' `src/**/*.zod.ts`. ### Ablation: NOT MEASURED as a vitest run, with a lock-free stand-in The planned ablation replaced the `untyped` helper with an identity, through `scripts/ablation-replace.mjs` under the verify lock. It never acquired the lock: 3 queue-timeouts (`VERDICT queue-timeout (exit 99)`), about 27 minutes in all. The file stayed byte-identical to `HEAD` (blob `a0277d57` on both). The stand-in ran without the lock and without vitest. It evaluated the refusal assertions' inputs against the built schema under both helpers: ```text committed: 'type decided it' refusals hold = true,true ; CLOSED_RESIDUALS refusals hold = true,true,true,true,true,true ablated: 'type decided it' refusals hold = false,false ; CLOSED_RESIDUALS refusals hold = false,false,true,true,true,true ``` So the identity helper would turn both refusal cases red. The committed suite already holds the same pair in one run: the two drives GREEN and their untyped bodies REFUSED. ## Acceptance notes (not filed) - `platformVersion` and `artifactRef` are declared install options on `PackageInstallRequestSchema`, parsed at the door and read by no line of it. A repo-wide `git grep`, outside `packages/spec` and tests, finds no reader and no producer. The first-party SDK sends only `manifest`, `settings`, `enableOnInstall` and `overwrite`. With zero pull and no public-door reading, this is noted, not filed. The docblock was deliberately NOT extended to say so: that would widen this card. - `packages/spec/scripts/lib/default-changes.ts:167` carries "the door reads the raw body". It is the rationale of an earlier protocol major's default-change record (`spec-changes.json` / the upgrade guide), and it was true at that major. It is history, not a description of today's door, and it was left untouched. - `.changeset/19327-install-door-residual-split.md` (unreleased) still says the `type` half is an open residual. Its successor entries, `19328-install-door-body-parse.md` and this one, record the rest. A release compiling all three reads as a sequence, and that changeset was not edited here. --- _Generated by [Claude Code](https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1378ec7 commit 31d281d

3 files changed

Lines changed: 163 additions & 95 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
`PackageInstallBodySchema`'s docblock records its measured residual as closed: the install door answers every body the declaration refuses with `400`, not `201`
6+
7+
Clause-②: no
8+
9+
The docblock listed the bodies `POST /api/v1/packages` answered differently
10+
from the declaration: a manifest with no `type`, unknown keys on either body
11+
form, a string-typed `enableOnInstall` / `overwrite`, install options spelled on
12+
the bare form, and (in the other direction) a whitespace-only `id`. It still said
13+
the door answers `201` to the first four. Since the door parses its whole body
14+
through `PackageInstallBodySchema` (#20218), it answers each of them `400` /
15+
`VALIDATION_ERROR` and installs nothing. The whitespace-only `id` was already
16+
refused by both, because `ManifestSchema.id` carries `MANIFEST_ID_PATTERN`.
17+
18+
The section now records every class as closed, names the door-side pin for
19+
each, and says what the declaration's parsed value still does not describe:
20+
the door stores the manifest it was SENT, so parse-time defaults (`scope`,
21+
`defaultDatasource`) are not stored, and an unknown key nested in a manifest
22+
block the declaration leaves in strip mode is stored as sent.
23+
24+
Two more sentences are corrected. The bare-form paragraph said the runtime's
25+
two door drives post a manifest with no `type`; both have carried
26+
`type: 'app'` since #20218 and parse green. The `enableOnInstall` docblock said
27+
the door "reads the raw body"; it reads the key off the parsed wrapped request.
28+
29+
⛔ No behaviour changes. No schema, accept set, export or runtime code moves.
30+
31+
**Why this carries a changeset and not `skip-changeset`.** `@objectstack/spec`'s
32+
`files[]` ships `src/**/*.zod.ts` verbatim, and the `PackageInstallBodySchema`
33+
docblock is also emitted into `dist/api/index.d.ts` and `dist/api/index.d.mts`.
34+
The published content changes, even though no line of code does.

‎packages/spec/src/api/package-api.test.ts‎

Lines changed: 66 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -907,9 +907,10 @@ describe('#18058 — install contract bound to the live door', () => {
907907
});
908908

909909
it('parses a COMPLETE manifest posted BARE — the form the door reads as `body.manifest || body`', () => {
910-
// The bare form's green fixture is a manifest that is complete, not a
911-
// transcription of any one caller: the callers that post bare bodies post
912-
// INCOMPLETE ones, and those are pinned as refused in the block below.
910+
// The bare form's green fixture is a manifest that is complete. The
911+
// callers that post bare bodies post complete ones too, since PR #20218
912+
// gave them the `type` they lacked: the block below transcribes them,
913+
// beside the incomplete bodies they used to post.
913914
const bare = { id: 'com.acme.crm', name: 'com.acme.crm', namespace: 'crm', version: '1.0.0', type: 'app' };
914915
expect(PackageInstallBodySchema.safeParse(bare).success).toBe(true);
915916
});
@@ -1027,87 +1028,98 @@ describe('#18058 — install contract bound to the live door', () => {
10271028
});
10281029

10291030
/**
1030-
* [#18058 F2] The bodies the runtime's own door drives really post — pinned
1031-
* as REFUSED, because that is what they are.
1031+
* [#18058 F2] The bodies the runtime's own door drives really post — and the
1032+
* bodies they USED to post, which is where the residual lived.
10321033
*
10331034
* These two drives were cited as the evidence for KEEPING the bare form, and
10341035
* an earlier revision transcribed the first of them with `type: 'app'` ADDED
10351036
* under a comment claiming it posted "exactly this" — the one key that
1036-
* decides the parse. The form they use is declared; the manifests they send
1037-
* are incomplete, so every measured bare-form sender sits in the residual.
1038-
* ⛔ The remedy is to SAY that, not to relax `ManifestSchema`.
1037+
* decides the parse. They posted no `type` then, so they were pinned here as
1038+
* REFUSED: the measured bare-form senders of the residual. PR #20218 made
1039+
* the door parse the whole body and gave both drives the `type` they lacked,
1040+
* in their own files, so the transcription below now carries it because the
1041+
* drives do. The bodies they used to post stay pinned as refused. ⛔ The
1042+
* remedy was never to relax `ManifestSchema`.
10391043
*/
1040-
describe('the measured bare-form senders are the RESIDUAL, not green fixtures', () => {
1041-
/** The `manifest` helper in `packages/runtime/src/package-door-namespace-conflict-code.test.ts` — no `type`. */
1042-
const DOOR_DRIVE_CONFLICT = { id: 'com.acme.crm', name: 'com.acme.crm', namespace: 'crm', version: '1.0.0' };
1044+
describe('the measured bare-form senders parse green — the residual they sat in is closed', () => {
1045+
/** The `manifest` helper in `packages/runtime/src/package-door-namespace-conflict-code.test.ts`. */
1046+
const DOOR_DRIVE_CONFLICT = { id: 'com.acme.crm', name: 'com.acme.crm', namespace: 'crm', version: '1.0.0', type: 'app' };
10431047
/**
1044-
* The duplicate-id drive in `packages/runtime/src/domain-handler-registry.test.ts` — no `type`.
1045-
* Two of its keys were repaired, each by the PR that made the door parse that leg: PR #19326
1046-
* gave it the `version` it lacked (the docblock's clause 1a, CLOSED), and PR #19473 replaced its
1047-
* id `pkg-a`, which `MANIFEST_ID_PATTERN` refuses. The old body is the REVERSED pin beside the
1048-
* drive, answered `400`, so ⛔ it is no residual and is not transcribed here. This is the body
1049-
* the drive posts: `409` first, then `201` on `?overwrite=true`.
1048+
* The duplicate-id drive in `packages/runtime/src/domain-handler-registry.test.ts`.
1049+
* Three of its keys were repaired, each by the PR that made the door parse that leg: PR #19326
1050+
* gave it the `version` it lacked (the docblock's clause 1a), PR #19473 replaced its id `pkg-a`,
1051+
* which `MANIFEST_ID_PATTERN` refuses, and PR #20218 gave it the `type` it lacked (clause 1b).
1052+
* The `pkg-a` body is the REVERSED pin beside the drive, answered `400`. This is the body the
1053+
* drive posts: `409` first, then `201` on `?overwrite=true`.
10501054
*/
1051-
const DOOR_DRIVE_REGISTRY = { id: 'com.example.pkg-a', name: 'A', version: '1.0.0' };
1055+
const DOOR_DRIVE_REGISTRY = { id: 'com.example.pkg-a', name: 'A', version: '1.0.0', type: 'app' };
10521056

1053-
it('the namespace-conflict drive is REFUSED — it carries no `type`', () => {
1054-
expect(PackageInstallBodySchema.safeParse(DOOR_DRIVE_CONFLICT).success).toBe(false);
1057+
/** The body each drive posted before PR #20218: the same manifest, no `type`. */
1058+
const untyped = ({ type: _type, ...rest }: Record<string, unknown>) => rest;
1059+
1060+
it('the namespace-conflict drive parses green — it carries `type` since PR #20218', () => {
1061+
expect(PackageInstallBodySchema.safeParse(DOOR_DRIVE_CONFLICT).success).toBe(true);
10551062
});
10561063

1057-
it('the domain-handler-registry drive is REFUSED — it carries no `type`', () => {
1058-
expect(PackageInstallBodySchema.safeParse(DOOR_DRIVE_REGISTRY).success).toBe(false);
1064+
it('the domain-handler-registry drive parses green — it carries `type` since PR #20218', () => {
1065+
expect(PackageInstallBodySchema.safeParse(DOOR_DRIVE_REGISTRY).success).toBe(true);
10591066
});
10601067

1061-
it('the missing `type` is what decides it, for BOTH drives — the registry drive\'s old id is refused on its own', () => {
1062-
// The control that makes the two refusals above a measurement of the
1068+
it('the missing `type` is what decided it, for BOTH drives — the registry drive\'s old id is refused on its own', () => {
1069+
// The two green parses above are the controls: these bodies differ from
1070+
// them by the one key, so each refusal is a measurement of the
10631071
// MANIFEST's required keys rather than of the bare branch existing at all.
1064-
expect(PackageInstallBodySchema.safeParse({ ...DOOR_DRIVE_CONFLICT, type: 'app' }).success).toBe(true);
1065-
const registryKeysCompleted = { ...DOOR_DRIVE_REGISTRY, type: 'app' };
1066-
expect(PackageInstallBodySchema.safeParse(registryKeysCompleted).success).toBe(true);
1067-
// ⭐ Until PR #19473 this half ran the other way. The drive posted `pkg-a`,
1068-
// which `MANIFEST_ID_PATTERN` has refused since #17534 (PR #18319), so
1072+
expect(PackageInstallBodySchema.safeParse(untyped(DOOR_DRIVE_CONFLICT)).success).toBe(false);
1073+
expect(PackageInstallBodySchema.safeParse(untyped(DOOR_DRIVE_REGISTRY)).success).toBe(false);
1074+
// ⭐ Until PR #19473 the registry drive posted `pkg-a`, which
1075+
// `MANIFEST_ID_PATTERN` has refused since #17534 (PR #18319), so
10691076
// completing its keys was not sufficient and this case pinned the
10701077
// refusal. PR #19473 made the door parse the id leg as well, so the door
10711078
// answers that body `400` (the REVERSED pin beside the drive), and it
10721079
// repaired the drive's id. ⛔ The old reading is kept, pointed at the old
1073-
// body: refused on the id alone (the lit control is the green parse just
1074-
// above, the same body with the drive's current id), so it is no part of
1075-
// the `201` residual.
1076-
expect(PackageInstallBodySchema.safeParse({ ...registryKeysCompleted, id: 'pkg-a' }).success).toBe(false);
1080+
// body: refused on the id alone (the lit control is the green parse
1081+
// above, the same body with the drive's current id).
1082+
expect(PackageInstallBodySchema.safeParse({ ...DOOR_DRIVE_REGISTRY, id: 'pkg-a' }).success).toBe(false);
10771083
});
10781084

1079-
/** Bodies the door still answers `201` to while this declaration refuses them — the live residual. */
1080-
const DOOR_201_RESIDUALS: ReadonlyArray<Record<string, unknown>> = [
1081-
DOOR_DRIVE_CONFLICT,
1082-
DOOR_DRIVE_REGISTRY,
1085+
/**
1086+
* Bodies the door answered `201` to while this declaration refused them — the residual, one
1087+
* body per class: 1b (the two drives' old bodies), 2, 4 and 3. Every one is CLOSED: since
1088+
* PR #20218 the door parses the whole body through this declaration and answers each `400`.
1089+
*/
1090+
const CLOSED_RESIDUALS: ReadonlyArray<Record<string, unknown>> = [
1091+
untyped(DOOR_DRIVE_CONFLICT),
1092+
untyped(DOOR_DRIVE_REGISTRY),
10831093
{ ...SDK_MANIFEST, label: 'an unknown key on the bare form' },
10841094
{ ...SDK_MANIFEST, enableOnInstall: false },
10851095
{ manifest: SDK_MANIFEST, enableOnInstall: 'false' },
10861096
{ manifest: SDK_MANIFEST, overwrite: 'true' },
10871097
];
10881098

1089-
it('the door answers 201 to all of them anyway — so this declaration is a SUBSET of the door', () => {
1099+
it('the declaration refuses every one — and, since PR #20218, so does the door: no residual is left', () => {
10901100
// Pinned as prose-with-a-parse rather than a live HTTP drive: the door
10911101
// lives in `@objectstack/runtime`, which this package cannot import.
1092-
// `packages/runtime/src/domains/packages-install-enable-on-install.test.ts`
1093-
// and the two drive files above are where the 201s are measured.
1094-
for (const residual of DOOR_201_RESIDUALS) {
1102+
// `packages/runtime/src/domains/packages-install-body-contract.test.ts`
1103+
// is where the door's `400`s are measured: its §0 holds the door to this
1104+
// declaration, and §1–§4 drive one class each.
1105+
for (const residual of CLOSED_RESIDUALS) {
10951106
expect(PackageInstallBodySchema.safeParse(residual).success).toBe(false);
10961107
}
10971108
});
10981109

1099-
it('✅ clause 1a is CLOSED — every body in the live residual carries a `version` the declaration accepts', () => {
1110+
it('✅ clause 1a is CLOSED — every closed-class body carries a `version` the declaration accepts, so each is refused for its OWN class', () => {
11001111
// PR #19326 made the door parse `ManifestSchema.shape.version` by
11011112
// reference: a manifest missing `version` answers `400` /
11021113
// `VALIDATION_ERROR` there now and installs nothing. The door-side pin is
11031114
// §1 of `packages/runtime/src/domains/packages-install-manifest-version.test.ts`,
1104-
// cited rather than repeated — this package cannot import the door. On
1105-
// that key the declaration and the door agree, so a versionless body in
1106-
// the list above would record a `201` the door no longer answers, which
1107-
// is what the registry drive's first transcription, `{ id: 'pkg-a',
1108-
// name: 'A' }`, did.
1109-
// ⛔ Clause 1b stays open: both drives above still carry no `type`.
1110-
for (const residual of DOOR_201_RESIDUALS) {
1115+
// cited rather than repeated — this package cannot import the door. The
1116+
// door answers that leg AHEAD of the whole-body parse, so a versionless
1117+
// body in the list above would measure the `version` leg rather than
1118+
// the class it is listed for. The registry drive's first transcription,
1119+
// `{ id: 'pkg-a', name: 'A' }`, was such a body.
1120+
// Clause 1b is closed too: the drives carry `type` now (pinned green
1121+
// above), and the list holds the bodies they used to post.
1122+
for (const residual of CLOSED_RESIDUALS) {
11111123
const manifest = ('manifest' in residual ? residual.manifest : residual) as { version?: unknown };
11121124
expect(ManifestSchema.shape.version.safeParse(manifest.version).success).toBe(true);
11131125
}
@@ -1127,9 +1139,11 @@ describe('#18058 — install contract bound to the live door', () => {
11271139
// Lit control — the id is what decided it: the same wrapped body with the
11281140
// fixture's own conforming id parses green.
11291141
expect(PackageInstallBodySchema.safeParse({ manifest: SDK_MANIFEST }).success).toBe(true);
1130-
// ⛔ NOT a claim that declaration and door are now equal: the refusals
1131-
// pinned above still run the other way — bodies the door answers 201 to
1132-
// that this declaration refuses. One spelling closed; the class remains.
1142+
// This direction closed first. The classes pinned above, which ran the
1143+
// other way (bodies the door answered `201` while this declaration
1144+
// refused them), closed with PR #20218, so no measured class is answered
1145+
// differently by the two faces any more. The door refuses this body on
1146+
// its trimmed-empty id (`Package id is required`).
11331147
});
11341148
});
11351149

0 commit comments

Comments
 (0)