Commit dcd3bce
feat(spec)!: retire action.aria — no action renderer ever applied it (ADR-0049) (#20398)
Fixes #20323
Clause-②: yes
## What this does
Retires `action.aria` under ADR-0049 enforce-or-remove, following the
triage direction on the card (RETIRE, on the chart-config precedent
`2bf6ef18d`). No maintainer word reversed it to ENFORCE.
- **Schema.** `ActionSchema.aria` becomes a `retiredKey()` tombstone. It
is a `tsc` error (the input type is `never`) and a parse error that
carries the prescription. The accessible name that IS applied is the
action's required `label`, and the placing node's `aria` block
(`page.components[].aria` or the list view `aria`) names the region.
`AriaPropsSchema` is untouched: this is a key retirement, not a def
retirement.
- **ADR-0087.** The D2 conversion `action-aria-removed` (protocol 18,
`retiredFromLoadPath`) strips the key from `actions[]` and
`objects[].actions[]` as a lossless delete. The D3 semantic entry
`action-aria-retired` is its own family, per the one-entry-per-family
rule. The retired key `ui/Action:aria` is registered under 18, the major
of the chart-config sibling.
- **Ledger.** `liveness/action.json` regrades `aria` from `live` to
`dead`. Its `REMOVED` note records that the uncited 「PARTIAL — honored
by a few objectui renderers」 claim had no reader behind it. The
undrilled-container row `action/aria` goes, and `state-counts.md` is
regenerated.
- **Docs.** Two hand-written pages taught `aria` on an action and are
corrected: `protocol/objectui/actions.mdx` and `widget-contract.mdx`.
The three reference pages that render `ActionSchema` are regenerated.
- **Changeset.** `minor`, BREAKING, with `Clause-②: yes`, the FROM → TO
table and the ADR-0087 `registered` marker.
## Premise, re-measured on this checkout
- **objectui at the `.objectui-sha` pin `f8a9d0fb05`.** A reader grep
for an action's `aria` (`action`, `actionDef`, `def`, `spec`, `btn`,
`a`, `act`, `item` followed by `.aria`) over `packages/**` and `apps/**`
non-test sources hits **0** lines. The control, the same grep for
`.variant`, hits **18** files. Every `schema.aria` reader there is a
placing node: the `record:*` components, `ListView`, `ObjectView` and
`element:button`'s props.
- **Icon-only reversal condition.** Triage named "icon-only actions have
no accessible name" as the condition that would reverse this to ENFORCE.
It does not hold. `action-icon.tsx:243` renders
`aria-label={schema.label || schema.name}`, `action-menu.tsx:341`
renders `aria-label={schema.label || moreActionsLabel}`, and
`action-button.tsx:346` renders `{schema.label}` as the visible text.
- **Framework.** A grep for `.aria` over `packages/**` non-test TS
outside `packages/spec` hits **0** lines. `action.form.ts` has 0 `aria`
rows; its one hit is the `variant` substring.
- **Authors in this repo.** Across `examples/**`, the published
`skills/**` and `packages/**` fixtures, **0** actions author `aria`. The
control is **15** `variant:` lines in `examples/**`.
- **Authors in HotCRM `2f7b2326`.** **0** actions author `aria`. Its 6
`aria:` blocks are all page-level `page.aria`, which stays live. The
control: 7 files under `src/**/actions/` declare `locations:`, 17 times.
- **Served schema.** `metadata-protocol` drops a tombstone's `{ not: {}
}` node from the served JSON Schema, via `stripUnauthorableProperties`.
So the Studio "More fields" form stops offering `aria` once this ships.
- **Pinned sibling.** objectui's `ActionRunner.ts:410` mirrors the key
as `aria?: SpecActionInput['aria']`. A type probe against this branch's
built `dist` compiles that mirror at exit 0, because it evaluates to
`undefined`. An authored block on it is refused with TS2322, and the
control leg without `@ts-expect-error` exits 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)
| commit | verdict |
| --- | --- |
| `0c5dbbff` sources, ledger, tests, changeset | **kept, with
corrections.** The prescription said "removed in @objectstack/spec 17";
it now says `17.5.0`, the spelling every sibling retirement on this line
uses. The refusal pin in `action.test.ts` now also 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). The changeset's BREAKING sentence now names the replacement.
The HotCRM control is re-measured: 7 files and 17 lines, not "5 action
files". |
| `6334c137` regenerated artifacts | kept, and re-derived after both
merges |
| `bfc86375` the stored-row pin uses a parseable script action | kept |
| `0f20c62f` the `action/aria` undrilled-container row goes | kept;
`check:liveness` is green |
| `8cbcfa46` merge of `main` | kept |
| `90b8fcdc` regenerated state counts | kept; superseded by the
post-merge regeneration |
Added in this round:
- `33407119` and `c38c18ae` merge `origin/main` through
`scripts/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 #20262, #20352, #20251 and #20353.
- `2b15085d` and `7faf0e9f` are the deferred regenerations.
- `68b038ef` carries the corrections above, plus two more:
- a new pin that the stored-row seam reaches an `object` row's nested
action (the changeset's second at-rest coordinate);
- one sentence on the `action` row of `liveness/README.md`. That row
said "makes the dead set three", which this change makes false in a
published file (`liveness` is in `@objectstack/spec`'s `files`).
- `8dd3a2ce` regenerates the reference pages for the 17.5.0
prescription.
## Verification
Head `7faf0e9f`, on `origin/main` `15bf186f`:
- `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.
- Gates: `node scripts/pm/dispatch-gates.mjs --commands` derives 114
commands. All 114 exit 0, and `--ran` reconciles them as `114 derived,
114 run, 0 NOT-MEASURED, 0 UNRUN`. The run covers every package's build
closure, rebuilt on this head, so the gates that read `dist` measured
it.
Head `8dd3a2ce`, before the second `main` merge, on `origin/main`
`862b6ce8`. The second merge touched none of these packages' interaction
with this diff; the incoming commits retire other keys and touch no
action surface.
| package | command | Test Files | Tests |
| --- | --- | --- | --- |
| `@objectstack/lint` | `vitest run` | 112 passed | 4640 passed |
| `@objectstack/cli` | `vitest run --project unit` | 231 passed | 3309
passed |
| `@objectstack/runtime` | `vitest run --project local` | 282 passed |
4059 passed, 1 skipped |
| `@objectstack/metadata-protocol` | `vitest run` | 189 passed, 3
skipped | 2736 passed, 19 skipped |
| `@objectstack/metadata-core` | `vitest run` | 16 passed | 285 passed |
| `@objectstack/objectql` | `vitest run --project local` | 322 passed |
5857 passed |
`pnpm --filter @objectstack/spec typecheck` was green at the same head.
The cli `integration` layer is declared to CI: this diff touches no
spawn entry and no integration file.
**Ablation**, from the committed state at `8dd3a2ce`. The blobs of
`action.zod.ts` and of the three pin files are byte-identical at
`7faf0e9f`.
- The mutation goes through `scripts/ablation-replace.mjs`: the anchor `
aria: retiredKey(` becomes ` aria: 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 from `2e0a17b14b06` to
`45e6bd9b1156`. The wrapper also arms a `trap` that restores the file.
- The control leg runs the three pin files on the committed state:
`Tests 166 passed (166)`.
- The mutant leg: `Tests 4 failed | 162 passed (166)`. The four red
tests:
- `action.test.ts` · refuses an action carrying `aria`;
- `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.
- The restore is proven by content, not by an exit code. The file's blob
equals HEAD's blob `2e0a17b14b06`, `git diff HEAD` is empty, and the
porcelain status has 0 lines.
- The pins import `./action.zod` and `../ui/action.zod.js` relatively.
They read `src`, not `dist`, so this ablation has no dist leg.
## Acceptance notes
- **objectui, owned by seat 4 after landing; not in this PR.**
`ActionDefaultInspector` should list `aria` in its `RETIRED_FIELDS`, per
triage note 3. `ActionRunner.ts:410` should drop its `aria?:
SpecActionInput['aria']` mirror, which evaluates to `undefined` once
this ships and still compiles (the probe above).
- **#19332, owned by seat 4 after landing.** The disposition of
`action.aria` goes to #19332's item that waits on this card.
- **Advisory lint.** No `lint-liveness-properties` non-warn pin is
added. The `aria` row never carried `authorWarn`, so the advisory lint's
behaviour is unchanged: it was silent before and is silent now.
- **Aliases.** `ActionSchema` never aliased `accessibility` or
`ariaProps` onto `aria`, unlike the chart config. A probe shows both
already refused as `unrecognized_keys`, so no alias refusal pin is owed.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent df3ba16 commit dcd3bce
19 files changed
Lines changed: 536 additions & 31 deletions
File tree
- .changeset
- content/docs
- protocol/objectui
- references
- data
- kernel
- ui
- packages/spec
- authorable-surface
- liveness
- scripts/liveness
- src
- conversions
- migrations
- entries
- retired-keys
- 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 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
244 | 244 | | |
245 | 245 | | |
246 | 246 | | |
247 | | - | |
248 | | - | |
249 | | - | |
250 | 247 | | |
251 | 248 | | |
252 | 249 | | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
253 | 255 | | |
254 | 256 | | |
255 | 257 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
223 | 223 | | |
224 | 224 | | |
225 | 225 | | |
226 | | - | |
227 | | - | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
228 | 231 | | |
229 | 232 | | |
230 | 233 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
478 | 478 | | |
479 | 479 | | |
480 | 480 | | |
481 | | - | |
| 481 | + | |
482 | 482 | | |
483 | 483 | | |
484 | 484 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
348 | 348 | | |
349 | 349 | | |
350 | 350 | | |
351 | | - | |
| 351 | + | |
352 | 352 | | |
353 | 353 | | |
354 | 354 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
70 | | - | |
| 70 | + | |
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
| |||
148 | 148 | | |
149 | 149 | | |
150 | 150 | | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | | - | |
159 | 151 | | |
160 | 152 | | |
161 | 153 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| |||
0 commit comments