feat(spec)!: retire action.aria — no action renderer ever applied it (ADR-0049) - #20398
Conversation
…urces, ledger, tests, changeset) Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ Co-authored-by: Claude <noreply@anthropic.com>
check:liveness names it stale: the tombstone is no longer a container, so the recorded gap no longer exists. Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ Co-authored-by: Claude <noreply@anthropic.com>
…tire-action-aria Conflicts resolved by stacking both intents: conversions/registry.ts and migrations/registry.ts step18 conversionIds keep main's form-layout-inline-grid-to-vertical and this branch's action-aria-removed; step18's hand-written rationale carries main's form-layout paragraph and then this branch's action.aria paragraph. Generated regions are regenerated in the next commit. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
state-counts.md, and the three reference pages that render ActionSchema, regenerated from the merged tree (gen:migration-registry, gen:liveness-counts, gen:docs over a fresh spec build); check:generated reads all 15 up to date. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
…er issue; object-row replay pinned - The prescription names the release that ships the refusal (17.5.0), the house spelling of every sibling retirement on this line. - action.test.ts: the refusal pin asserts the tombstone's own issue kind (invalid_type at `aria`, and no root unrecognized_keys), which is what a bare deletion would answer instead. - action-aria-removed.test.ts: the stored-row seam reaches an `object` row's nested action, the changeset's second at-rest coordinate. - The changeset's BREAKING sentence names the replacement; its HotCRM control is re-measured at 2f7b2326. - liveness/README.md: the action row's "dead set three" becomes four. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
…tire-action-aria Conflicts resolved by stacking both intents: CONVERSIONS_BY_MAJOR[18] and step18.conversionIds keep main's currency-config-precision-removed and permission-rls-tags-removed, then this branch's action-aria-removed; step18's hand-written rationale carries main's two paragraphs, then this branch's action.aria paragraph. Generated regions are regenerated in the next commit. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
…rred content/docs/references/data/object.mdx regenerated from the merged tree over a fresh spec build; gen:migration-registry and gen:liveness-counts reproduce the committed bytes, and check:generated reads all 15 up to date. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
What this run could not see
Coarse fallback — 136 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 8cb48e7e154d3b346abb2c6af1acb8cd8191992d && git checkout 8cb48e7e154d3b346abb2c6af1acb8cd8191992d
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 2f122b6e47dd01264d1a3c4d2fc7946fc31f3f2e 7faf0e9f63c7a37478b86af29f713f5697ea1970 && git checkout -B drift-repro 2f122b6e47dd01264d1a3c4d2fc7946fc31f3f2e && git merge --no-ff 7faf0e9f63c7a37478b86af29f713f5697ea1970
node scripts/docs-audit/affected-docs.mjs --json 2f122b6e47dd01264d1a3c4d2fc7946fc31f3f2e
|
Contract reviewServed-tier: Inputs: card #20323 (body and all five comments — triage 5860351140, claims 5861374979 / 5863199486, release 5862791758, dev report 5864933100); PR #20398 (body, 19-file list, net diff against ① Derived judgmentsAccept-set
ADR-0087
Ledger and baselines
Public surface and docs
Residual, advisory (no accept-set or surface effect): two published ② Semver level
③ Boundary flagsDev deviations (seven), each answered:
Out-of-scope findings (two), correctly carried and not folded: objectui Console Pin Gate skipped (path filter) and Packed-tarball smoke skipped (opt-in) are by design, not gaps in this head's verdict. Implemented-by: VERDICT: PASS Generated by Claude Code |
Landing lap: origin/main dcd3bce, 6 commits past 15bf186. #20398 (`dcd3bcea`) appended `action-aria-removed` to the same three step-18 tails this branch appends `flow-decision-mode-inclusive-explicit` to. Resolved per the seat's answer B on #15429 (5865957805), and nowhere else: - `CONVERSIONS_BY_MAJOR[18]` and step18 `conversionIds`: both kept, main's `actionAriaRemoved` / `action-aria-removed` first (landing order), this branch's entry after it; - step18 `rationale`: main's sentence kept, this branch's sentence appended verbatim (the one string join: main's closing literal now ends in a space and the concatenation continues). No other hand edit; generated regions are regenerated in the next commit. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com>
Fixes #20323
Clause-②: yes
What this does
Retires
action.ariaunder ADR-0049 enforce-or-remove, following the triage direction on the card (RETIRE, on the chart-config precedent2bf6ef18d). No maintainer word reversed it to ENFORCE.ActionSchema.ariabecomes aretiredKey()tombstone. It is atscerror (the input type isnever) and a parse error that carries the prescription. The accessible name that IS applied is the action's requiredlabel, and the placing node'sariablock (page.components[].ariaor the list viewaria) names the region.AriaPropsSchemais untouched: this is a key retirement, not a def retirement.action-aria-removed(protocol 18,retiredFromLoadPath) strips the key fromactions[]andobjects[].actions[]as a lossless delete. The D3 semantic entryaction-aria-retiredis its own family, per the one-entry-per-family rule. The retired keyui/Action:ariais registered under 18, the major of the chart-config sibling.liveness/action.jsonregradesariafromlivetodead. ItsREMOVEDnote records that the uncited 「PARTIAL — honored by a few objectui renderers」 claim had no reader behind it. The undrilled-container rowaction/ariagoes, andstate-counts.mdis regenerated.ariaon an action and are corrected:protocol/objectui/actions.mdxandwidget-contract.mdx. The three reference pages that renderActionSchemaare regenerated.minor, BREAKING, withClause-②: yes, the FROM → TO table and the ADR-0087registeredmarker.Premise, re-measured on this checkout
.objectui-shapinf8a9d0fb05. A reader grep for an action'saria(action,actionDef,def,spec,btn,a,act,itemfollowed by.aria) overpackages/**andapps/**non-test sources hits 0 lines. The control, the same grep for.variant, hits 18 files. Everyschema.ariareader there is a placing node: therecord:*components,ListView,ObjectViewandelement:button's props.action-icon.tsx:243rendersaria-label={schema.label || schema.name},action-menu.tsx:341rendersaria-label={schema.label || moreActionsLabel}, andaction-button.tsx:346renders{schema.label}as the visible text..ariaoverpackages/**non-test TS outsidepackages/spechits 0 lines.action.form.tshas 0ariarows; its one hit is thevariantsubstring.examples/**, the publishedskills/**andpackages/**fixtures, 0 actions authoraria. The control is 15variant:lines inexamples/**.2f7b2326. 0 actions authoraria. Its 6aria:blocks are all page-levelpage.aria, which stays live. The control: 7 files undersrc/**/actions/declarelocations:, 17 times.metadata-protocoldrops a tombstone's{ not: {} }node from the served JSON Schema, viastripUnauthorableProperties. So the Studio "More fields" form stops offeringariaonce this ships.ActionRunner.ts:410mirrors the key asaria?: SpecActionInput['aria']. A type probe against this branch's builtdistcompiles that mirror at exit 0, because it evaluates toundefined. An authored block on it is refused with TS2322, and the control leg without@ts-expect-errorexits 2. So the Console Pin Gate's objectui build is not broken by this change.Hand-over review (the stopped run's six commits, read hunk by hunk)
0c5dbbffsources, ledger, tests, changeset17.5.0, the spelling every sibling retirement on this line uses. The refusal pin inaction.test.tsnow also asserts the tombstone's own issue kind (invalid_typeataria, and no rootunrecognized_keys, which is what a bare deletion would answer instead). The changeset's BREAKING sentence now names the replacement. The HotCRM control is re-measured: 7 files and 17 lines, not "5 action files".6334c137regenerated artifactsbfc86375the stored-row pin uses a parseable script action0f20c62ftheaction/ariaundrilled-container row goescheck:livenessis green8cbcfa46merge ofmain90b8fcdcregenerated state countsAdded in this round:
33407119andc38c18aemergeorigin/mainthroughscripts/pm/os-regen-merge.sh. Both merges stopped on the two registries. Each was settled by stacking both sides: main's conversions and rationale paragraphs first, then this branch's. The merges brought in feat(spec)!: formlayoutaccepts only vertical | horizontal — theinlineandgridarms retired (#20221) #20262, feat(formula,spec): stable refusal codes and params beside every expression refusal message #20352, feat(spec)!: retire currencyConfig.precision — a currency's decimal places are its currency's (ADR-0049) #20251 and feat(spec)!: retire rowLevelSecurity[].tags — no mainstream platform tags a row-level policy (ADR-0049) #20353.2b15085dand7faf0e9fare the deferred regenerations.68b038efcarries the corrections above, plus two more:objectrow's nested action (the changeset's second at-rest coordinate);actionrow ofliveness/README.md. That row said "makes the dead set three", which this change makes false in a published file (livenessis in@objectstack/spec'sfiles).8dd3a2ceregenerates the reference pages for the 17.5.0 prescription.Verification
Head
7faf0e9f, onorigin/main15bf186f:pnpm --filter @objectstack/spec test:Test Files 558 passed (558)·Tests 16509 passed | 1 todo (16510).pnpm --filter @objectstack/spec test:repo:Test Files 35 passed (35)·Tests 634 passed (634).pnpm --filter @objectstack/spec check:generated: all 15 generated artifacts up to date, measured over a spec build made on this head.node scripts/pm/dispatch-gates.mjs --commandsderives 114 commands. All 114 exit 0, and--ranreconciles them as114 derived, 114 run, 0 NOT-MEASURED, 0 UNRUN. The run covers every package's build closure, rebuilt on this head, so the gates that readdistmeasured it.Head
8dd3a2ce, before the secondmainmerge, onorigin/main862b6ce8. The second merge touched none of these packages' interaction with this diff; the incoming commits retire other keys and touch no action surface.@objectstack/lintvitest run@objectstack/clivitest run --project unit@objectstack/runtimevitest run --project local@objectstack/metadata-protocolvitest run@objectstack/metadata-corevitest run@objectstack/objectqlvitest run --project localpnpm --filter @objectstack/spec typecheckwas green at the same head. The cliintegrationlayer is declared to CI: this diff touches no spawn entry and no integration file.Ablation, from the committed state at
8dd3a2ce. The blobs ofaction.zod.tsand of the three pin files are byte-identical at7faf0e9f.scripts/ablation-replace.mjs: the anchoraria: retiredKey(becomesaria: z.any().optional().describe(, so the key is accepted again. The tool reports the anchor going from 1 to 0, the replacement from 0 to 1, and the blob from2e0a17b14b06to45e6bd9b1156. The wrapper also arms atrapthat restores the file.Tests 166 passed (166).Tests 4 failed | 162 passed (166). The four red tests:action.test.ts· refuses an action carryingaria;aria-carrier-tombstones.test.ts· the action tombstone fires and prescribes;aria-carrier-tombstones.test.ts· the object-nested coordinate;action-aria-removed.test.ts· the stored-row seam.2e0a17b14b06,git diff HEADis empty, and the porcelain status has 0 lines../action.zodand../ui/action.zod.jsrelatively. They readsrc, notdist, so this ablation has no dist leg.Acceptance notes
ActionDefaultInspectorshould listariain itsRETIRED_FIELDS, per triage note 3.ActionRunner.ts:410should drop itsaria?: SpecActionInput['aria']mirror, which evaluates toundefinedonce this ships and still compiles (the probe above).action.ariagoes to #19188 split: 39 top-level zod-only keys are structured controls needing a designed widget, not a row #19332's item that waits on this card.lint-liveness-propertiesnon-warn pin is added. Theariarow never carriedauthorWarn, so the advisory lint's behaviour is unchanged: it was silent before and is silent now.ActionSchemanever aliasedaccessibilityorariaPropsontoaria, unlike the chart config. A probe shows both already refused asunrecognized_keys, so no alias refusal pin is owed.Generated by Claude Code