Repository navigation
Commit 14a8bd2
feat(spec)!: marketplace:installed-list is retired — refused by name at the schema door; the separate Installed Apps view it drew was retired (#24255)
Fixes #24230
Clause-②: no (narrowing)
Retires the page component type `marketplace:installed-list`, refused by
name through `RETIRED_PAGE_COMPONENT_TYPES`. This executes ruling B on
#23892 (record `6216295104`, item 2: "the separate Installed Apps view
retires once the filtered view serves its actions"), within triage grade
`6243387750` and release `6245014494`. objectstack-ai/objectui#12926
(merged `35244b6379`) deleted the type's one renderer. Its one producer,
`@objectstack/cloud-connection`'s `marketplace_installed` page, had
already left `MARKETPLACE_INSTALLED_UI_BUNDLE` (#23933). The shape
follows the `record:json` retirement (PR #24170, `030a7b83e`) surface
for surface, with the differences listed below.
Dev session: `session_01SovhHbD8dAQGDyEGHRoSUx` (cloud dispatch from the
`domain:spec#1` seat, claim `6245064045`).
## Accept set, before → after, at each door
| door | before (`cbfa5e4335`) | after (this head) |
| --- | --- | --- |
| `PageComponentSchema.type` (node) | accepts `{ type:
'marketplace:installed-list' }` through the open string arm | refuses:
`code: 'custom'`, `path: ['type']`, `params.retiredComponentType:
'marketplace:installed-list'`, message = the prescription. Bare,
`{}`-bag and keyed alike |
| `PageSchema` (what `os validate` and save parse) | accepts the node |
refuses at `regions[i].components[j].type`, one issue per node |
| `ComponentPropsMap['marketplace:installed-list']` (props gate,
`check-yaml-examples`, vocabulary) | strict empty `emptyProps(...)`:
`{}` passes, any key refused | row kept as `retiredComponentProps(...)`
(`z.never`): every bag refused, `{}` included, `invalid_type` at `[]`
with the prescription |
| lint `component-type-unknown` | silent (open-arm plugin namespace) |
`error` at `…type`; message = the prescription's head, hint = its
"Delete the …" sentence (193 chars, under the one-line 200 cap) |
| lint `component-props-*` | `component-props-unknown-key` on a keyed
bag, silent on `{}` | `component-props-invalid` `error` at `…properties`
for every bag |
| typo suggester | candidate | no longer a candidate (out of
`KNOWN_COMPONENT_TYPE_CANDIDATES`, derived from the map) |
| print pages | `PRINT_REFUSED_PAGE_COMPONENT_TYPES` row | row removed:
a retired type is refused at the parse before any print rule reads it
(the map's own docblock rule) |
| `PageComponentType` enum | never a member | unchanged: nothing to
remove |
| exports | none of its own (`emptyProps` mints no def) | unchanged |
The open string arm stays open, the `marketplace:` namespace included
(`marketplace:installed-list-v2` still parses; pinned). Everything else
is byte-identical.
The prescription is one string at all doors. Its fix sentence names the
route the console uses: "Delete the `marketplace:installed-list`
component node; to link to that view, add a `component` navigation item
with `componentRef: 'developer:packages'` and `params: { source:
'marketplace' }`." That is the spelling
`MARKETPLACE_INSTALLED_UI_BUNDLE`'s own "Installed Apps" entry uses, and
it validates against `app.zod.ts`'s `component` navigation item. It
carries no tracker number (`check:doc-authoring`).
## Where this differs from the `record:json` precedent
| surface | `record:json` | here |
| --- | --- | --- |
| enum value | removed from `PageComponentType` | n/a, never a member.
The map entry is therefore the only parse door. Without it, the retired
name would fall back to the open arm and parse in silence (pinned) |
| row | `retiredComponentProps` | same, and here the kept row is the
only thing that keeps the name KNOWN (pinned in
`component-type-vocabulary.test.ts`) |
| props def / `retired-defs` entry | `RecordJsonProps` deleted,
`retired-defs/18.ui__RecordJsonProps.ts` | none: `emptyProps` exports
nothing, so no def leaves the published set (H4 measured:
`check:generated` moved only `content/docs/references/ui/page.mdx`) |
| D3 entry and step-18 fragment | `ui-record-json-retired` |
`ui-marketplace-installed-list-retired`, inserted at its sorted id,
`order: 102` (max 101 + 1) |
| sibling D3 entries | none |
`ui-cloud-connection-widgets-unknown-keys-refused` amended,
`ui-mcp-connect-agent-unknown-keys-refused` one clause (decision below)
|
| whole-bag census |
`component-record-related-list-parent-23134.test.ts` gained
`record:json` | gains `marketplace:installed-list` |
| lint pins | `validate-record-json-23745.test.ts` flipped |
`validate-component-types.test.ts`: the accept row is removed (the
map-driven `flags %s` case now covers it);
`validate-component-props.test.ts`: the keyed-bag and `{}` cases flipped
into one whole-bag refusal pin |
| tree-scoped absence walk | new, in `vitest.repo-tests.json` | same, in
the new pin file, registered in `vitest.repo-tests.json` |
| `Clause-②` | `no (narrowing)` (shipped in one prerelease only) | `no
(narrowing)` too: the type shipped in stable 17.3.0, which decides the
ADR-0087 disposition and the FROM → TO text, not the value. The diff
widens nothing, and `yes (narrowing)` would claim a widening (contract
review `6245719006` ②) |
## The two `semantic/18.*` entries: amended, not superseded
Measured: both entries are in the same major-18 step as the new
retirement entry, so an upgrader replaying 17 → 18 reads all three.
`ui-cloud-connection-widgets-unknown-keys-refused`'s
`acceptanceCriteria` said "Every `cloud-connection:panel` /
`marketplace:installed-list` node authors an empty bag and validates
clean". After this PR that sentence is false for the second type, and it
contradicts the retirement entry. Its id is referenced by shipped
CHANGELOG text and by
`packages/cli/test/migrate-meta-engine-guidance.test.ts`'s guidance
census. So the entry is amended in place: id kept, `surface`,
`replacement` and `acceptanceCriteria` narrowed to
`cloud-connection:panel`, and `reason` names the retired sibling and the
new entry. Superseding it (new id, old entry deleted or left stale)
would either drop a referenced id or leave contradictory text in one
step. `ui-mcp-connect-agent-unknown-keys-refused` only named the row
historically, as the precedent for its own row. One clause now says that
row was since retired by name. No guidance changes.
## H2 / H3 / stop conditions, measured
- **H1 (premise):** true on `origin/main` `cbfa5e4335` (the dispatch
read `af284b05e5`): the row (`component.zod.ts`), the docblocks, the
print row (`page.zod.ts`) and the lint accept pins were all present.
- **H2 (producers):** no stored-row producer. The
`MARKETPLACE_INSTALLED_UI_BUNDLE` carries no `pages`. Outside the spec
and tests, the string survives in CHANGELOGs,
`content/docs/releases/v17/17-3.mdx` (release-owned, untouched),
`packages/spec/liveness/page.json` (a historical read-point note at an
older objectui sha, untouched), a doc comment in
`packages/cloud-connection/src/canonical-expression-envelopes.test.ts`
(hold-off, untouched) and the CLI fixture below. So no D2 conversion is
registered.
- **CLI fixture:**
`packages/cli/test/platform-page-i18n-parity.test.ts`'s `SAMPLE_PAGE`
does not parse the page (no `PageSchema` read in the file), so it did
not fail. It did author a `{ type: 'marketplace:installed-list' }` node
inside the new absence walk's radius, so its body block is now
`element:divider`. The gate reads only the header copy. 27/27 pass.
- **H3 (Console Pin Gate):** `git grep` at the objectui pin
`5e15928b46`: the type appears only as a string registration
(`InstalledListWidget.tsx`), a CLI known-types string list, tests, and
the parity test's `UNJUDGED_SPEC_BLOCKS` entry. There is no typed read
of `ComponentPropsMap['marketplace:installed-list']` in non-test source.
The row's KEY is kept, so `keyof typeof ComponentPropsMap` and the
parity partition's key set are unchanged. Removing the key cannot break
the pinned build because the key is not removed. The parity entry's
"EMPTY SPEC SHAPE" text becomes "RETIRED UPSTREAM" in objectui's own pin
bump, per the card.
## Ablation (fix committed first, `scripts/ablation-replace.mjs`,
restored by blob)
The subject resolves by relative import (`./page.zod`,
`./component.zod`) to `src`, so no `dist` rebuild is involved.
- **Mutation:** the map key renamed to
`marketplace:installed-list-ABLATED` (held), and the row turned back
into `emptyProps('marketplace:installed-list')`. On-disk counts: 1 and
1.
- **Result:** retirement pin 4 failed / 6 passed (the map, the row,
`PageComponentSchema`, `PageSchema`); vocabulary pins 2 failed / 20
passed.
- **Restore:** both files back to their `HEAD` blobs (`9146237b28f7`,
`0365abe5e2cf`) by hash, and `git diff HEAD` is empty.
## Gates (local, head `fc6245ba2`)
- spec `build` exit 0. `check:generated`: `✓ All 14 generated artifacts
are up to date` (only `gen:docs` moved:
`content/docs/references/ui/page.mdx`, 2 lines, the regenerated
`.describe()`).
- spec `test` (`vitest --project local`): 693 files, 692 passed and 1
failed: the whole-bag census in
`component-record-related-list-parent-23134.test.ts`, which this PR then
updated; that file re-run 17/17. 21001 tests passed, 1 todo. spec
`test:repo` scoped to the new repo-project file: 10/10. spec `typecheck`
exit 0, `check:test-typecheck: OK`.
- lint: closure built, `test` 143 files, 6820 passed, 5 skipped;
`typecheck` exit 0.
- cli unit: `test/platform-page-i18n-parity.test.ts` 27/27.
- `check-platform-checklist --changed-from origin/main`: OK, 0 anchors
lost.
- `dispatch-gates --commands`: 111 commands, each run with its exit code
captured before any pipe. 107 exited 0; `check:skill-examples` exited 3
(PREREQUISITE NOT MET: `client-react` dist built without DTS by this
run's own CLI closure build) and was re-run green after a DTS build (262
examples). NOT MEASURED, declared to CI:
- `check:dts-closure` (exit 1, missing `.d.ts` in 58 packages that this
run built with `OS_SKIP_DTS=1` for the CLI unit test; the diff touches
no build config);
- `check:dual-build-cjs-loads` (exit 3, PREREQUISITE NOT MET: needs a
whole-repo build);
- `check-plugin-teardown-shape.mjs --self-test` (exit 3: its fixture
needs an unshallow clone; checker-health only).
- Changeset gates, re-run on head `603c1a10c` after patch round 1
(report `6245768083`), exit codes captured before any pipe.
`check-adr-0087-registration`, exit 0: "✓ check-adr-0087-registration: 1
declared-breaking changeset(s), each carrying an ADR-0087 disposition."
and "[BREAKING+bang+clause-②-narrowing] registered
ui-marketplace-installed-list-retired (new here:
ui-marketplace-installed-list-retired)". `check-changeset-no-major` with
this body as the `--event` payload, exit 0: "✓ This diff introduces no
`major` bump." and "✓ LEVEL AXIS: this PR declares clause-② `no
(narrowing)`, and no package whose published source (`src/**`, a packed
`bin` target, or a repo file its build copies in) it moves is graded
`patch`." Both carriers, this body and the changeset, read `Clause-②: no
(narrowing)` at line start (contract review `6245719006` ②).
## Acceptance notes
- `packages/spec/liveness/page.json`'s `regions` note still cites the
widget's read point at an older objectui sha. It is historical evidence
and was not edited here (ledger edits carry their own `verifiedAt`
discipline).
- objectui's `registry-inputs-spec-parity.test.ts` entry and
`packages/cli/src/utils/known-schema-types.ts` (objectui) list the
string. Both are objectui's pin-bump follow-up, per the card.
`.objectui-sha` is not moved.
- `packages/cloud-connection` (hold-off) is untouched; its doc comment
already records the page retirement.
- `content/docs/releases/` and every `CHANGELOG.md` are untouched.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01SovhHbD8dAQGDyEGHRoSUx)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent fb6fb24 commit 14a8bd2
17 files changed
Lines changed: 523 additions & 75 deletions
File tree
- .changeset
- content/docs/references/ui
- packages
- cli/test
- lint/src
- spec
- src
- migrations
- entries/semantic
- ui
| 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 | |
|---|---|---|---|
| |||
293 | 293 | | |
294 | 294 | | |
295 | 295 | | |
296 | | - | |
| 296 | + | |
297 | 297 | | |
298 | 298 | | |
299 | 299 | | |
| |||
432 | 432 | | |
433 | 433 | | |
434 | 434 | | |
435 | | - | |
| 435 | + | |
436 | 436 | | |
437 | 437 | | |
438 | 438 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1086 | 1086 | | |
1087 | 1087 | | |
1088 | 1088 | | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
1089 | 1092 | | |
1090 | 1093 | | |
1091 | 1094 | | |
| |||
1102 | 1105 | | |
1103 | 1106 | | |
1104 | 1107 | | |
1105 | | - | |
| 1108 | + | |
1106 | 1109 | | |
1107 | 1110 | | |
1108 | 1111 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1183 | 1183 | | |
1184 | 1184 | | |
1185 | 1185 | | |
1186 | | - | |
1187 | | - | |
1188 | | - | |
1189 | | - | |
1190 | | - | |
| 1186 | + | |
| 1187 | + | |
| 1188 | + | |
| 1189 | + | |
| 1190 | + | |
| 1191 | + | |
| 1192 | + | |
| 1193 | + | |
| 1194 | + | |
| 1195 | + | |
| 1196 | + | |
1191 | 1197 | | |
1192 | 1198 | | |
1193 | 1199 | | |
| |||
1204 | 1210 | | |
1205 | 1211 | | |
1206 | 1212 | | |
1207 | | - | |
1208 | | - | |
1209 | | - | |
1210 | | - | |
1211 | | - | |
1212 | | - | |
1213 | | - | |
1214 | | - | |
1215 | | - | |
1216 | | - | |
1217 | | - | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
1218 | 1221 | | |
1219 | 1222 | | |
1220 | | - | |
| 1223 | + | |
1221 | 1224 | | |
1222 | | - | |
1223 | | - | |
1224 | | - | |
1225 | | - | |
| 1225 | + | |
1226 | 1226 | | |
1227 | 1227 | | |
1228 | 1228 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
111 | 111 | | |
112 | 112 | | |
113 | 113 | | |
114 | | - | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
115 | 117 | | |
116 | 118 | | |
117 | | - | |
118 | 119 | | |
119 | 120 | | |
120 | 121 | | |
| |||
0 commit comments