Skip to content

Commit b53b4fb

Browse files
committed
chore(spec): regenerate docs/ledger artifacts; drill onSuccess liveness container; move the action.zod site-count pin 8→9
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fs18A2DdXLVN2h8PaaFBcP
1 parent 20d7166 commit b53b4fb

5 files changed

Lines changed: 28 additions & 14 deletions

File tree

content/docs/references/ui/action.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ const result = ActionSchema.parse(data);
9696
| **mode** | `Enum<'create' \| 'edit' \| 'delete' \| 'custom'>` | optional | Semantic mode of the action. |
9797
| **opensInNewTab** | `boolean` | optional | Open the action result in a new tab. The renderer pre-opens the tab synchronously on click (popup-blocker-safe) and navigates it to the handler's redirectUrl. |
9898
| **newTabUrl** | `string` | optional | Direct new-tab URL template (`{recordId}` placeholder). When set with opensInNewTab, the renderer navigates the pre-opened tab here immediately — no action POST. The endpoint must enforce auth itself. |
99+
| **onSuccess** | `{ navigate: string; openIn?: Enum<'self' \| 'newTab'> }` | optional | Post-success navigation for type:'api' and type:'script' actions (#9566/#9474). `navigate` is a route/URL template interpolating $`{param.*}`, $`{ctx.*}` and $`{result.*}` (the server response); `openIn` defaults 'self'. The handler-return convention (`{ redirectUrl }` without openIn) keeps its 17.0.0 new-tab behavior. |
99100
| **aria** | `{ ariaLabel?: string \| Record<string, string>; ariaDescribedBy?: string; role?: string }` | optional | ARIA accessibility attributes |
100101
| **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). |
101102
| **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. |

docs/audits/2026-07-unknown-key-strictness-ledger.counts.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ regenerate.
2121
| Measure | Value |
2222
|---|---|
2323
| Triaged directories | 5 |
24-
| Object sites in them | 443 |
24+
| Object sites in them | 444 |
2525
| Still-open (strip) sites | 123 |
2626
| Files carrying at least one | 22 |
2727

@@ -44,12 +44,12 @@ The `strict` column is the one the campaign schedules against; it counts both th
4444

4545
| Dir | Sites | strict | passthrough | catchall | strip |
4646
|---|---|---|---|---|---|
47-
| `ui/` | 175 | 164 | 5 | 0 | 6 |
47+
| `ui/` | 176 | 165 | 5 | 0 | 6 |
4848
| `data/` | 156 | 74 | 1 | 0 | 81 |
4949
| `automation/` | 65 | 42 | 0 | 0 | 23 |
5050
| `security/` | 20 | 7 | 0 | 0 | 13 |
5151
| `studio/` | 27 | 27 | 0 | 0 | 0 |
52-
| **total** | **443** | **314** | **6** | **0** | **123** |
52+
| **total** | **444** | **315** | **6** | **0** | **123** |
5353

5454
## File-level triage — site counts
5555

@@ -62,7 +62,7 @@ classify and is not listed (it becomes reportable the day it grows its first sit
6262
| File | Sites |
6363
|---|---|
6464
| `action-params.zod.ts` | 1 |
65-
| `action.zod.ts` | 8 |
65+
| `action.zod.ts` | 9 |
6666
| `app.zod.ts` | 18 |
6767
| `bulk-action.zod.ts` | 3 |
6868
| `chart.zod.ts` | 8 |
@@ -77,7 +77,7 @@ classify and is not listed (it becomes reportable the day it grows its first sit
7777
| `theme.zod.ts` | 6 |
7878
| `view.zod.ts` | 56 |
7979
| `widget.zod.ts` | 1 |
80-
| **total** | **175** |
80+
| **total** | **176** |
8181

8282
### `data/` — sites
8383

@@ -156,15 +156,15 @@ over it is here.
156156

157157
### `ui/` — open
158158

159-
**6 strip of 175**, in 4 file(s).
159+
**6 strip of 176**, in 4 file(s).
160160

161161
| File | Strip | Sites |
162162
|---|---|---|
163163
| `action-params.zod.ts` | 1 | 1 |
164164
| `app.zod.ts` | 1 | 18 |
165165
| `view.zod.ts` | 3 | 56 |
166166
| `widget.zod.ts` | 1 | 1 |
167-
| **total** | **6** | **175** |
167+
| **total** | **6** | **176** |
168168

169169
| Bucket | Sites |
170170
|---|---|

packages/spec/liveness/action.json

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,20 @@
159159
"note": "Declarative new-tab control for STATIC type:'url' targets. ActionRunner.executeUrl reads action.openIn with priority over the legacy params.newTab/external-URL heuristic; action-button/icon/menu/group + basic/elements renderers forward it. Distinct from opensInNewTab/newTabUrl (async SSO pre-open)."
160160
},
161161
"onSuccess": {
162-
"status": "planned",
163-
"verifiedAt": "2026-08-18",
164-
"evidenceScope": "cross-repo",
165-
"note": "PLANNED, deliberately not `live` — the #9340 map / #9463 viewMode convention for a spec-first contract-split key. Declared by the #9566/#9474 maintainer ruling (2026-08-18, one navigation contract for both cards): `{ navigate, openIn: 'self'|'newTab' }` post-success navigation for type:'api'/'script' actions, with `${result.*}` (the server response) joining the navigate template's interpolation scope. No console consumer reads it yet: objectui's consoleServerAction.ts drives only the handler-return `{ redirectUrl }` convention (new-tab, objectui#2967/#2904), executeAPI returns {success,data} and never navigates, and interpolateTarget's scope has no `result` member — the SPA-navigation branch, executeAPI navigation handling and result-scope interpolation are the downstream objectui card(s) filed Blocked-by #9566/#9474 at this key's landing. Amend to `live` citing the consoleServerAction/executeAPI read and the interpolateTarget result member when that half lands — measured objectui per the #9566 issue audit at spec/console 17.0.0, 2026-08-18."
162+
"children": {
163+
"navigate": {
164+
"status": "planned",
165+
"verifiedAt": "2026-08-18",
166+
"evidenceScope": "cross-repo",
167+
"note": "PLANNED, deliberately not `live` — the #9340 map / #9463 viewMode convention for a spec-first contract-split key. Declared by the #9566/#9474 maintainer ruling (2026-08-18, one navigation contract for both cards): a post-success route/URL template for type:'api'/'script' actions whose interpolation scope gains `${result.*}` (the server response) beside `${param.*}`/`${ctx.*}`. No console consumer reads it yet: objectui's consoleServerAction.ts drives only the handler-return `{ redirectUrl }` convention (new-tab, objectui#2967/#2904), executeAPI returns {success,data} and never navigates, and interpolateTarget's scope has no `result` member — the SPA-navigation branch, executeAPI navigation handling and result-scope interpolation are the downstream objectui card(s) filed Blocked-by #9566/#9474 at this key's landing. Amend to `live` citing the consoleServerAction/executeAPI read and the interpolateTarget result member when that half lands — measured objectui per the #9566 issue audit at spec/console 17.0.0, 2026-08-18."
168+
},
169+
"openIn": {
170+
"status": "planned",
171+
"verifiedAt": "2026-08-18",
172+
"evidenceScope": "cross-repo",
173+
"note": "PLANNED with its sibling `navigate` (see that entry for the full cross-repo measurement). The closed enum 'self'|'newTab' with a MATERIALIZED .default('self') — parse output always carries the resolved member, so the future console branch reads it with no fallback of its own. The shipped handler-return surface `{ redirectUrl, openIn? }` keeps 17.0.0 semantics (absent openIn ⇒ new-tab); only this schema key defaults 'self'. Amend to `live` together with `navigate` when the objectui half (Blocked-by #9566/#9474) lands."
174+
}
175+
}
166176
},
167177
"aria": {
168178
"status": "live",

packages/spec/liveness/state-counts.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ for both corollaries.
3030
| `object` | 50 | 0 | 0 | 1 | 51 |
3131
| `field` | 88 | 0 | 0 | 2 | 90 |
3232
| `flow` | 34 | 0 | 6 | 0 | 40 |
33-
| `action` | 42 | 0 | 2 | 0 | 44 |
33+
| `action` | 42 | 0 | 2 | 2 | 46 |
3434
| `hook` | 18 | 0 | 2 | 0 | 20 |
3535
| `permission` | 38 | 0 | 4 | 0 | 42 |
3636
| `position` | 12 | 0 | 0 | 0 | 12 |
@@ -57,4 +57,4 @@ for both corollaries.
5757
| `api` | 25 | 0 | 0 | 2 | 27 |
5858
| `capability` | 12 | 0 | 0 | 0 | 12 |
5959
| `qa` | 4 | 0 | 5 | 0 | 9 |
60-
| **total** | **796** | **6** | **55** | **10** | **867** |
60+
| **total** | **796** | **6** | **55** | **12** | **869** |

packages/spec/scripts/strictness-ledger.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,10 @@ describe('site counting reads the AST, not the source text', () => {
100100
expect(countSites(at('kernel/metadata-protection.zod.ts'))).toBe(0);
101101
expect(countSites(at('shared/suggestions.zod.ts'))).toBe(0);
102102
// And the case that mattered, because this file IS triaged: 9 → 8.
103-
expect(countSites(at('ui/action.zod.ts'))).toBe(8);
103+
// (8 → 9 at #9566, which ADDED the `onSuccess` strictObject site — the
104+
// count is incidental; what this case pins is that JSDoc examples are
105+
// not counted.)
106+
expect(countSites(at('ui/action.zod.ts'))).toBe(9);
104107
});
105108

106109
it('counts a call the source wraps across lines (`z\\n .object({`)', () => {

0 commit comments

Comments
 (0)