Repository navigation
feat(spec)!: marketplace:installed-list is retired — refused by name at the schema door; the separate Installed Apps view it drew was retired - #24255
Conversation
…at the schema door, the separate Installed Apps view it drew was retired Claude-Session: https://claude.ai/code/session_01SovhHbD8dAQGDyEGHRoSUx Co-authored-by: Claude <noreply@anthropic.com>
… census for the retired marketplace:installed-list Claude-Session: https://claude.ai/code/session_01SovhHbD8dAQGDyEGHRoSUx Co-authored-by: Claude <noreply@anthropic.com>
…fix line Claude-Session: https://claude.ai/code/session_01SovhHbD8dAQGDyEGHRoSUx Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SovhHbD8dAQGDyEGHRoSUx Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 6 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 143 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 06b656ad6b0aa24fe1b8b944203788b9bcb1f450 && git checkout 06b656ad6b0aa24fe1b8b944203788b9bcb1f450
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin e74ec56acc33316a21d41fdde7f6d34a44d6a792 603c1a10c9fac263d7f9b3a6bca3de3240d24d82 && git checkout -B drift-repro e74ec56acc33316a21d41fdde7f6d34a44d6a792 && git merge --no-ff 603c1a10c9fac263d7f9b3a6bca3de3240d24d82
node scripts/docs-audit/affected-docs.mjs --json e74ec56acc33316a21d41fdde7f6d34a44d6a792
|
Contract reviewServed-tier: ① Derived judgmentsEvery door
② Semver level
③ Boundary flags
Implemented-by: VERDICT: FAIL Generated by Claude Code |
…-② no (narrowing) — the diff widens nothing Claude-Session: https://claude.ai/code/session_01SovhHbD8dAQGDyEGHRoSUx Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: What moved since the earlier record. ① Derived judgmentsEvery door at which
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对 · ACCEPT · PR #24255 @
|
Fixes #24230
Clause-②: no (narrowing)
Retires the page component type
marketplace:installed-list, refused by name throughRETIRED_PAGE_COMPONENT_TYPES. This executes ruling B on #23892 (record6216295104, item 2: "the separate Installed Apps view retires once the filtered view serves its actions"), within triage grade6243387750and release6245014494. objectstack-ai/objectui#12926 (merged35244b6379) deleted the type's one renderer. Its one producer,@objectstack/cloud-connection'smarketplace_installedpage, had already leftMARKETPLACE_INSTALLED_UI_BUNDLE(#23933). The shape follows therecord:jsonretirement (PR #24170,030a7b83e) surface for surface, with the differences listed below.Dev session:
session_01SovhHbD8dAQGDyEGHRoSUx(cloud dispatch from thedomain:spec#1seat, claim6245064045).Accept set, before → after, at each door
cbfa5e4335)PageComponentSchema.type(node){ type: 'marketplace:installed-list' }through the open string armcode: 'custom',path: ['type'],params.retiredComponentType: 'marketplace:installed-list', message = the prescription. Bare,{}-bag and keyed alikePageSchema(whatos validateand save parse)regions[i].components[j].type, one issue per nodeComponentPropsMap['marketplace:installed-list'](props gate,check-yaml-examples, vocabulary)emptyProps(...):{}passes, any key refusedretiredComponentProps(...)(z.never): every bag refused,{}included,invalid_typeat[]with the prescriptioncomponent-type-unknownerrorat…type; message = the prescription's head, hint = its "Delete the …" sentence (193 chars, under the one-line 200 cap)component-props-*component-props-unknown-keyon a keyed bag, silent on{}component-props-invaliderrorat…propertiesfor every bagKNOWN_COMPONENT_TYPE_CANDIDATES, derived from the map)PRINT_REFUSED_PAGE_COMPONENT_TYPESrowPageComponentTypeenumemptyPropsmints no def)The open string arm stays open, the
marketplace:namespace included (marketplace:installed-list-v2still 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-listcomponent node; to link to that view, add acomponentnavigation item withcomponentRef: 'developer:packages'andparams: { source: 'marketplace' }." That is the spellingMARKETPLACE_INSTALLED_UI_BUNDLE's own "Installed Apps" entry uses, and it validates againstapp.zod.ts'scomponentnavigation item. It carries no tracker number (check:doc-authoring).Where this differs from the
record:jsonprecedentrecord:jsonPageComponentTyperetiredComponentPropscomponent-type-vocabulary.test.ts)retired-defsentryRecordJsonPropsdeleted,retired-defs/18.ui__RecordJsonProps.tsemptyPropsexports nothing, so no def leaves the published set (H4 measured:check:generatedmoved onlycontent/docs/references/ui/page.mdx)ui-record-json-retiredui-marketplace-installed-list-retired, inserted at its sorted id,order: 102(max 101 + 1)ui-cloud-connection-widgets-unknown-keys-refusedamended,ui-mcp-connect-agent-unknown-keys-refusedone clause (decision below)component-record-related-list-parent-23134.test.tsgainedrecord:jsonmarketplace:installed-listvalidate-record-json-23745.test.tsflippedvalidate-component-types.test.ts: the accept row is removed (the map-drivenflags %scase now covers it);validate-component-props.test.ts: the keyed-bag and{}cases flipped into one whole-bag refusal pinvitest.repo-tests.jsonvitest.repo-tests.jsonClause-②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, andyes (narrowing)would claim a widening (contract review6245719006②)The two
semantic/18.*entries: amended, not supersededMeasured: 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'sacceptanceCriteriasaid "Everycloud-connection:panel/marketplace:installed-listnode 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 bypackages/cli/test/migrate-meta-engine-guidance.test.ts's guidance census. So the entry is amended in place: id kept,surface,replacementandacceptanceCriterianarrowed tocloud-connection:panel, andreasonnames 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-refusedonly 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
origin/maincbfa5e4335(the dispatch readaf284b05e5): the row (component.zod.ts), the docblocks, the print row (page.zod.ts) and the lint accept pins were all present.MARKETPLACE_INSTALLED_UI_BUNDLEcarries nopages. 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 inpackages/cloud-connection/src/canonical-expression-envelopes.test.ts(hold-off, untouched) and the CLI fixture below. So no D2 conversion is registered.packages/cli/test/platform-page-i18n-parity.test.ts'sSAMPLE_PAGEdoes not parse the page (noPageSchemaread 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 nowelement:divider. The gate reads only the header copy. 27/27 pass.git grepat the objectui pin5e15928b46: the type appears only as a string registration (InstalledListWidget.tsx), a CLI known-types string list, tests, and the parity test'sUNJUDGED_SPEC_BLOCKSentry. There is no typed read ofComponentPropsMap['marketplace:installed-list']in non-test source. The row's KEY is kept, sokeyof typeof ComponentPropsMapand 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) tosrc, so nodistrebuild is involved.marketplace:installed-list-ABLATED(held), and the row turned back intoemptyProps('marketplace:installed-list'). On-disk counts: 1 and 1.PageComponentSchema,PageSchema); vocabulary pins 2 failed / 20 passed.HEADblobs (9146237b28f7,0365abe5e2cf) by hash, andgit diff HEADis empty.Gates (local, head
fc6245ba2)buildexit 0.check:generated:✓ All 14 generated artifacts are up to date(onlygen:docsmoved:content/docs/references/ui/page.mdx, 2 lines, the regenerated.describe()).test(vitest --project local): 693 files, 692 passed and 1 failed: the whole-bag census incomponent-record-related-list-parent-23134.test.ts, which this PR then updated; that file re-run 17/17. 21001 tests passed, 1 todo. spectest:reposcoped to the new repo-project file: 10/10. spectypecheckexit 0,check:test-typecheck: OK.test143 files, 6820 passed, 5 skipped;typecheckexit 0.test/platform-page-i18n-parity.test.ts27/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-examplesexited 3 (PREREQUISITE NOT MET:client-reactdist 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.tsin 58 packages that this run built withOS_SKIP_DTS=1for 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).603c1a10cafter patch round 1 (report6245768083), 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-majorwith this body as the--eventpayload, exit 0: "✓ This diff introduces nomajorbump." and "✓ LEVEL AXIS: this PR declares clause-②no (narrowing), and no package whose published source (src/**, a packedbintarget, or a repo file its build copies in) it moves is gradedpatch." Both carriers, this body and the changeset, readClause-②: no (narrowing)at line start (contract review6245719006②).Acceptance notes
packages/spec/liveness/page.json'sregionsnote 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 ownverifiedAtdiscipline).registry-inputs-spec-parity.test.tsentry andpackages/cli/src/utils/known-schema-types.ts(objectui) list the string. Both are objectui's pin-bump follow-up, per the card..objectui-shais not moved.packages/cloud-connection(hold-off) is untouched; its doc comment already records the page retirement.content/docs/releases/and everyCHANGELOG.mdare untouched.Generated by Claude Code