Uh oh!
There was an error while loading. Please reload this page.
feat(spec): retire inert targetVariable on element:text_input / element:record_picker (ADR-0049) - #9221
Merged
os-zhuang merged 1 commit intoAug 17, 2026
Conversation
…nt:record_picker (#9198, ADR-0049) A declarative hint with zero readers in any repo — the live binding resolves from the page variable whose source names the component id (PageVariableSchema). Tombstoned with retiredKey(), registered under protocol 18 (retired-key entries + D2 conversion element-input-target-variable-removed wired into step 18), pin tests, regenerated authorable-surface/docs, minor changeset per the post-17.0.0 launch-window convention.
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code — list omitted above 15 rows. Re-derive: ⛔ 7 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails.
|
os-zhuang
marked this pull request as ready for review
August 17, 2026 03:49
Uh oh!
There was an error while loading. Please reload this page.
os-zhuang
deleted the
claude/issue-9198-targetvariable-enforce-or-remove
branch
August 17, 2026 04:08
This was referenced Aug 17, 2026
os-steve pushed a commit
that referenced
this pull request
Aug 17, 2026
…istColumns (#9227) inlineColumns: strict name-keyed InlineGridColumnSchema mirroring the objectui grid renderer's measured reads (GridField.tsx GridColumn, #3951); the retired field spelling is refused with the prescription naming name. relatedListColumns: child field-name strings only (the only authored form in-repo; the renderer hydrates strings fully). Liveness ledger drilled for the 20 column child keys; showcase invoice fixture respelled field -> name; regenerated api-surface, export-origins, authorable-surface, json-schema.manifest, references docs, strictness-ledger counts, liveness counts; minor changeset per the #9221 launch-window convention. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fs18A2DdXLVN2h8PaaFBcP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#9198
Ledger verdict: dead (re-established, not inherited from the card)
Measured at retirement time, against sources:
372d9f9b4): zero production readers. The only repo-wide hits are the reverse-parity gate's exemption block (apps/console/src/__tests__/registry-inputs-spec-parity.test.ts:545-556, citing objectui#3834) and CHANGELOG lines. The live binding runs the other direction —usePageVariableBinding(schema?.id)reverse-looks-up the page variable whosesourcenames the component id — exactly as the key's own describe text admitted ("Declarative hint; the live binding resolves via the variable whosesourceequals this component id").component.test.ts,page.test.ts); no runtime, metadata-protocol, lint, dogfood, example, skill or hand-written-docs reader.d8c3c44): zero hits.check:livenessis green in both directions on this change). The verdict is recorded in the retired-key entry files instead.Disposition inherited from the settled sibling (objectui#3829 → objectui PR #4794, retirement route), per the card.
What this does
retiredKey()inpackages/spec/src/ui/component.zod.ts(the SDUI props 声明与 renderer 不一致:6 处「renderer 兑现但 ComponentPropsMap 未声明」+ 2 处「声明了没人读」(#5068 error 升级的 spec 侧前置) #5775 pattern on the same schemas): authoring is atscerror and a parse error whose message carries the prescription — delete the key; declare the binding on the page variable (variables: [{ name, type, source: '<component id>' }]);os migrate meta --from 17rewrites sources.additionalTypesonMetadataPluginConfigis authorable, documented as THE way a plugin declares a metadata type, and has no reader — a plugin cannot declare a kind at all #8586 precedent**)**:ui/ElementTextInputProps:targetVariable+ui/ElementRecordPickerProps:targetVariable(one file each undersrc/migrations/entries/retired-keys/, registry regenerated bygen:migration-registry);element-input-target-variable-removed(toMajor: 18,retiredFromLoadPath: true,stripKeys— pure lossless delete, the key never had an effect to lose), wired into step 18'sconversionIds+ rationale. Fixture covers nested containers, slots, and keeps two untouched controls: the livevariables[].sourcebinding andelement:filter'stargetVariable(a different surface, ADR-0049 candidate:element:filterdeclarestargetVariable(and possibly the whole element) with no renderer or reader in any repo #9220 — which remains open and is not addressed here);kernel/Manifest:loadingfamily).component.test.ts): refusal pins asserting the prescription text (/targetVariable.*removed.*Delete the key/s, houses-flag style) on both elements; accept-side controls assert a clean parse materializes nothing. Stale fixture cleanup inpage.test.ts: the page-variables fixture authoreddisplayField(retired by SDUI props 声明与 renderer 不一致:6 处「renderer 兑现但 ComponentPropsMap 未声明」+ 2 处「声明了没人读」(#5068 error 升级的 spec 侧前置) #5775 — pre-existing drift, page block properties are not parsed against element schemas) andtargetVariable; both replaced with the working spelling (labelField, binding viavariables[].source).check:generated --fixafter build):authorable-surface/ui.jsongains the two[RETIRED]marks;content/docs/references/ui/component.mdxfollows the schema.spec-changes.json/ upgrade guide are green unchanged — they carry published majors only, and no major-18 entry (e.g.additionalTypesonMetadataPluginConfigis authorable, documented as THE way a plugin declares a metadata type, and has no reader — a plugin cannot declare a kind at all #8586's) appears there yet. Four-ratchet expectation matches the tombstone route:api-surface/,json-schema.manifest/, signatures unchanged (no def added/removed; no export changed).@objectstack/spec: minor(post-GA launch-window convention, theadditionalTypesonMetadataPluginConfigis authorable, documented as THE way a plugin declares a metadata type, and has no reader — a plugin cannot declare a kind at all #8586 precedent), FROM → TO mapping, markeradr-0087: registered element-input-target-variable-removed.Verification (all at head
e4204118b, after the final commit)pnpm --filter @objectstack/spec test— 407 files, 10832 passed.pnpm --filter @objectstack/spec typecheck— green (incl.check:test-typecheckself-test).check:generated— all 13 artifact gates ✓; source auditscheck:liveness/check:empty-state/check:skill-examples/check:variant-docsPASS.check:adr-0087-registration,check:nul-bytes— green.@objectstack/lint(the SDUI 组件 props 没有解析闸门:PageComponent.properties是开放 record,ComponentPropsMap的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 authoring gate that dispatches these schemas) — 2061 tests passed against the rebuilt spec;@objectstack/dogfoodexpression-conformance— 3 passed (after building the dependency closure; no expression surface touched).scripts/pm/dispatch-gates.mjson the real changed paths): all named local gates PASS, includingcheck:changeset-gate-self-tests,check:cross-package-test-inputs,check:merge-driver,check:spec-parsed-alias,check:type-check-coverage,check:type-check-debt(after full workspace build),check:engine-double-contract,check:where-matcher,check:dev-prereqs.component.zod.tsrestored to origin/main tree-only — exactly the 2 refusal pins went red (183 others green); restored from the branch commit, 185/185 green,git statusclean.Not in this PR
pm:blockedon this card). Dispatched separately per the claim.element:filter'stargetVariable— equally reader-less, but outside this card's two-key disposition and possibly the wrong grain (the whole element appears to have no renderer). Filed as ADR-0049 candidate:element:filterdeclarestargetVariable(and possibly the whole element) with no renderer or reader in any repo #9220; ADR-0049 candidate:element:filterdeclarestargetVariable(and possibly the whole element) with no renderer or reader in any repo #9220 remains open.Generated by Claude Code