Skip to content

Commit 56b2612

Browse files
docs(spec): component-member read points, held-back moves and other spellings to the ledger, part 3 of 3 (#23591)
Part of #23434 Clause-②: no Part 3 of 3 of PR-2 for issue 23434. The issue stays open after it lands, for the remainder named below. It executes ruling 6165388570 (letter C, items 1 and 4) and ruling 6181034096 (Q2 → A, Q1 → A), under claim 6181304005. Parts 1 and 2 are #23589 and #23590, which move the records in `packages/spec/src/ui/component.zod.ts`. All three branch from `origin/main`; none is stacked on another. ## What this part changes **Item 1, group C outside `component.zod.ts`.** The component-member read points in `component.test.ts` move into `liveness/page.json`, row `regions`, as do those in the `component-*.pin.test.ts` family (action-member params, form custom-fields, form / list / metric families, object-grid declared keys and typed members, objectui-held members, `z.unknown()` members, report-items / action members), the record-block tests (approvals / attachments, field security, record blocks, reference rail), the action-row and element-navigation tests, `expression-bindable-text-keys.zod.ts`, `object-refinement-check-exports.test.ts`, `page.zod.ts` and `inline-grid-column-carriers.test.ts`. Where a test record carried a reading the ledger lacked, it became an entry or a clause of an entry: the `page:tabs` retired `type`, the icon vocabulary table, the static-params drop, the drill-down writer pins, the grid's `AggregationType`, the page-builder guide, the object-manager dialog writer, the bindable-text rows, `PageComponent.visibleWhen` roots and the PLANNED `dataSource` API binding. `object-refinement-check-exports.test.ts`'s two mirror citations went to their own rows (`view.json` `list.appearance`, `dashboard.json` `widgets`), not to `page.regions`. **Item 2, the two held-back moves**, applied as PR-1's hold-back reversed (`git diff 7fe6ffd 7ebc084` over the four files, which were byte-identical on `origin/main`): - `src/ui/dataset.zod.ts` → `liveness/dataset.json`, row `measures.format`. - `src/data/api-methods-batch-conformance.test.ts` → `liveness/object.json`, row `enable.apiMethods`. **Item 3, the other spellings**, each into its matching row as `objectui @sha FILE#SYMBOL`. Every symbol was resolved at that SHA, and a sha-less citation was re-read at a named tree: | source | row | |---|---| | `ui/action-declarative-update.ts` (`.objectui-sha` pin `b9814b334`; landed with #23494 after PR-1) | `action.json` `operation` | | `ui/navigation-target.ts`, `ui/action-url-target-scheme-set.test.ts` (objectui `7578323`) | `action.json` `target` | | `ui/app.zod.ts` `viewName` rule (sha-less pin) | `app.json` `navigation.viewName` | | `ui/bulk-action.zod.ts` promoted route (objectui `main` `dca25aff2`) | `view.json` `list.bulkActionDefs` | | `ui/dashboard.zod.ts` #20960 census (objectui `main` `5262f7dd`) | `dashboard.json` `widgets.options` | | `ui/dashboard.zod.ts` mirror check (sha-less pin) | `dashboard.json` `widgets` (already recorded by PR-1) | | `ui/view.zod.ts` `groupByField` consumer (objectui `dda8f3815`) | `view.json` `list.kanban` | | `ui/view.zod.ts` empty-state `link` (objectui `b9814b334`, four `File.tsx:NNN`) | `view.json` `list.emptyState` (+ `page.json` `interfaceConfig`) | | `ui/view.zod.ts` form-layout twin (sha-less pin) | `page.json` `regions` (already in the list) | | `ui/list-view-export-options.ts`, `ui/view.test.ts` (`origin/main@878140b`) | `view.json` `list.exportOptions` (already recorded) | | `data/field.form.ts` hint face (sha-less pin) | `field.json` `relatedListFilter` | | `data/field.zod.ts` currency width (sha-less pin) | `field.json` `currencyConfig` | | `data/field.zod.ts` lookup snake twins (objectui `ed971e8`) | `field.json` `lookupColumns` | | `shared/editability-boundary.ts` per-option `disabled` (objectui `main` `aca27fa`) | `field.json` `options` | | `system/i18n-resolver.ts` `resolveFlowScreenTitle` caller (sha-less pin) | `translation.json` `flows.screens` (already recorded) | | `system/metadata-form-zod-reconciliation.test.ts` `emptyState` omit reason (objectui `7af0ab3`); #23568 has since removed that omit row on main, and the merge took main's side | `page.json` `interfaceConfig`; the 7af0ab3 reading is kept there in the past tense | | `page.zod.ts` `emptyState` hand-off (`InterfaceListPage.tsx:509`) | `page.json` `interfaceConfig` (already recorded) | **Also:** `content/docs/references/ui/expression-bindable-text-keys.mdx` is regenerated (`check-generated.ts --fix`), and `.changeset/23434-component-read-points-part-3.md` is a `@objectstack/spec` patch. Changed lines: 1,754 (+336 / -1,418) across 49 files, under the 3,000-line review line. Head `be8657fa44`, which contains merge `7ea3bb007d` of `origin/main`. ## Census, base `7ffc57846a` → all three parts merged Group C = the `ComponentPropsMap` member read points (seat 3's 99). Group R = retirement history, which ruling 6181034096 (Q2 → A) keeps in place. | reading | base | after all three parts | |---|---|---| | retired gate `--list`, historical `` `.objectui-sha` pin SHA `` spelling: group C | 66 | 0 | | same: `action-declarative-update.ts` (landed with #23494 after PR-1; item 3) | 1 | 0 | | same: group R | 34 | 34 (unchanged) | | retired gate's quoted-first-line assertions (`component.zod.ts`) | 6 | 0 (the quoted line is now in the entry) | | PR-1's dated respell "objectui `b9814b334` (re-read there 2026-10-14 …" | 27 | 0 | | wide census, component files: `.objectui-sha` pin with SHA / sha-less / `objectui SHA` | 65 / 24 / 170 | 0 / 0 / 14 (14 = objectui commit references such as "since objectui `ce991bd70`", which are not read points) | | wide census, group R files (H / S / O) | 36 / 8 / 30 | 36 / 8 / 30 (unchanged) | | wide census, other files, item 3 (H / S / O) | 2 / 12 / 38 | 0 / 5 / 16 (the remainder is listed in part 3) | `page.regions` note: 120 entries, 62,138 characters. No schema or gate caps a note's length. Only `evidence` and `producer` are path-scanned by `check:liveness`, and `note` is free text that the lint layer never shows an author. ## How the three parts were measured The three parts were built from one verified union branch, `claude/issue-23434-pin-citations-pr2` at `1646d39e53` (all three parts' changes in one tree). The split was then checked mechanically: - `git merge-tree` of part 1 + part 2 + part 3 onto `origin/main` gives a tree whose `packages/spec` and `content` match the union head exactly (empty diff). The three parts merge in any order without conflict. They share one changed line in `packages/spec/liveness/page.json` (the `regions` note), and it is byte-identical in all three. - Comment-only: every changed `.ts` file was parsed with TypeScript and compared with `origin/main` on its code tokens, JSDoc and comments excluded. All published files are identical. In this part's head, five string literals changed across two test files: two test names, one `why` reason string, and the two pieces of one assertion message. No schema, type, export, default, accept or refuse change, and no `.describe()` text change. - Every `objectui @sha FILE#SYMBOL` in the new evidence list and in the edited ledger notes was resolved against an objectui clone at that SHA: the file exists and the symbol occurs in it. 656 references in the 120 entries and 32 in the other notes; 0 unresolved. A negative control (a bogus path and two bogus symbols) reported 3 of 3. Union head `1646d39e53`, through `scripts/pm/os-verify-lock.sh`: - `pnpm --filter @objectstack/spec build`: VERDICT command-exit 0. - `check-generated.ts --fix`: 1 of 14 artefacts stale (`content/docs/references/ui/expression-bindable-text-keys.mdx`, from part 3's shortened docblock), regenerated. The re-check afterwards: "All 14 generated artifacts are up to date". - `pnpm --filter @objectstack/spec typecheck` (tsc, scripts and test typecheck): exit 0. - `vitest run --project local`: Test Files 678 passed (678), Tests 20728 passed, 1 todo. - `vitest run --project repo`: Test Files 61 passed (61), Tests 1033 passed. - `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, each exit code captured before any pipe, then `--ran`: "103 derived famil(ies) accounted for — 99 run, 4 NOT-MEASURED". The 4 recorded exit 3 (prerequisite not built): lint `check:doc-formula-expressions`, `check:dual-build-cjs-loads`, `check:i18n`, `check:lean-entry-closure`. One RED that comes from the base, not this diff: `check:platform-checklist` exits 1 with ABSENT SYMBOL findings in `docs/qa/platform-checklist/areas/{access-security,attachments-storage,search}.json`. They point at `packages/metadata-protocol` and `service-storage`, which no part touches; PR-1 reported the same findings. The other 98 exited 0, including `check:liveness`, `check:nul-bytes`, `check:issue-citations` and `check-spec-docblock-symbol-anchors`. On the anchors gate, "citations name no tracked file" went from 1965 on the base to 228. **This part's head `be8657fa44`**: merge `7ea3bb007d` of `origin/main`, then the past-tense fix to the `page.json` `interfaceConfig` note. Every run below was taken after the last commit, in a fresh worktree: - Spec build: VERDICT command-exit 0. `typecheck`: exit 0. - `vitest run --project local`: Test Files 678 passed (678), Tests 20728 passed, 1 todo. `--project repo`: Test Files 61 passed (61), Tests 1033 passed. Lock VERDICT command-exit 0. The targeted run first, `src/system/metadata-form-zod-reconciliation` and `src/ui/component`: Test Files 28 passed (28), Tests 1542 passed. - `check:generated` ("All 14 generated artifacts are up to date"), `check:liveness`, `check:issue-citations`, `check-spec-docblock-symbol-anchors` and `check:nul-bytes`: all exit 0. - `dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, then `--ran`: "111 derived famil(ies) accounted for — 111 run, 0 NOT-MEASURED". No STALE TREE note. Seven families first exited 3 because the fresh worktree had no built prerequisites. After `pnpm turbo run build --concurrency=2` (lock VERDICT 0), all seven re-ran at exit 0: lint `check:doc-formula-expressions` and `check:doc-security-posture`, `check:skill-examples`, `check:docs-transcript-drift`, `check:dual-build-cjs-loads`, `check:i18n` and `check:lean-entry-closure`. 110 exit 0. One RED, from the base: `check:platform-checklist`, exit 1, the same 7 ABSENT SYMBOL findings (`areas/access-security.json` 5, `attachments-storage.json` 1, `search.json` 1); no part touches those paths. ## Acceptance notes **Deviations from the claim, stated rather than chosen silently:** 1. **Split by file range, not strictly by item.** The measured union diff is 7,395 changed lines. Item 1 alone is over 3,000, because `component.zod.ts` alone is 5,675 lines. So `component.zod.ts` splits into two halves at an unchanged 33-line gap (parts 1 and 2, 2,770 and 2,931 lines). Item 1's remaining files ride here with items 2 and 3. Every part carries the identical `page.regions` line so that each part's ledger is complete; a `git merge-tree` of all three onto `origin/main` reproduces the verified union tree. 2. **The claim's item 1 names `component.zod.ts` only.** Seat 3's group C, the 99 that ruling 6181034096 counts, spans 15 files: `component.zod.ts`, `component.test.ts`, the `component-*.pin` tests, `expression-bindable-text-keys.zod.ts`, `object-refinement-check-exports.test.ts`, `page.zod.ts` and `inline-grid-column-carriers.test.ts`. I followed the ruling's 99. Some tombstone docblocks inside `component.zod.ts` (`sortField`, `resizableColumns`, `defaultSort`, `quickAdd`, form `layout` `inline`/`grid`) were moved, per seat 3's file-based classification. Their `migrations/entries` and retirement-test counterparts (group R) are untouched. 3. **Branches.** Part 3 lands from the claimed branch. Its history holds the WIP commits of the verified union, which a squash discards. Parts 1 and 2 are new branches cut from `origin/main`. **Left in place on purpose (census remainder after all three parts):** - **Retirement history, the class ruling 6181034096 keeps.** It is not limited to the 40 in the ruling's three locations: `integration/connector.test.ts` (`errorMapping` retired, objectui `0d8fd7c`), `system/email-template.zod.ts` (`category` / `isSystem` retired), `ui/app.zod.ts` (`homePageId` tombstone, objectui `@785b8a5d`), `ui/dashboard.zod.ts` (`actionUrl` / `actionType` / `actionIcon` removed, `objectui@91757a7`), `ui/view.zod.ts` (`responsive` / `performance` removed, `objectui@fb35e48`) and `api/export-job-family-retirement.test.ts`. - **No matching ledger row, so reported here and given no invented row:** - `ai/build-progress.zod.ts` (objectui `dda8f3815`; the build-progress phase vocabulary; no ledger file covers AI stream frames). - `api/dataset-selection.test.ts` (objectui `@98178b2`; the five call sites that build a runtime `DatasetSelection`, which is a request rather than dataset metadata). - `system/metadata-form-zod-reconciliation.test.ts:578-579` (seven `view` keys the ledger walk cannot hold, as that comment itself says). - `ui/view-console-round-trip-keys.test.ts:19,42` and the matching `ui/view.zod.ts` round-trip census (`VIEW_CONSOLE_ROUND_TRIP_KEYS`, sha-less pin); the walk stops at the union's container arm. - **objectui commit references, which mark a change and are not read points:** 14 in the component files, plus `kernel/functional-completeness.ts` (`afb228418`, `5f4514f7b`, `fec3b1a8b`, `04a67b9dc`), `ui/bulk-action.zod.ts` (`29b99490`), and `ui/page.zod.ts` / `ui/view.zod.ts` (`b434f5f47`, `0253416`). Three of these sentences said "at the pin"; they now read "on the console this repo ships" or use the past tense. - **A third spelling, outside the claim's two.** These are sha-less `File.tsx:NNN` citations with neither a SHA nor a pin mention. They do not claim to track the pin, so a pin hop never forces their rewrite. There are 17 lines in 8 published source files: `ai/build-progress.zod.ts`, `data/field.zod.ts` (2), `ui/action.zod.ts` (3), `ui/app.zod.ts`, `ui/bulk-action.zod.ts`, `ui/dashboard.zod.ts`, `ui/i18n-label-resolver.ts` and `ui/view.zod.ts` (6). There are also 40 in tests: 30 of them in the pin tests name the objectui TEST file a fixture's shape was copied from (writer provenance, not a renderer read point). These stay for a later round under #23434, which stays open: ruling item 1's last sentence covers them. **Measured drift (zone 2):** - Counts: group C is 66 historical spellings on the retired gate's `--list`, plus the respelled ones (27 of PR-1's "re-read there 2026-10-14" form across the component files and the two held-back files). Group R holds at 34 historical citations, unchanged. One new live historical citation landed after PR-1: `ui/action-declarative-update.ts` (#23494), moved here. - Note capacity: nothing caps a note. `regions` now holds 62,138 characters. - Only read points moved: commit references, in-repo anchors and retirement records stayed. Each record's per-hop chain went with its read points. - One stale claim was dropped rather than moved. `component.test.ts` said the tree renderer reads `data` through the `'undeclared'` arm (true at objectui `87af769e9`). At objectui `b9814b334` it is the `'view-data'` arm. The ledger entry records the current reading. **Merge note:** #23568 removed the `interfaceConfig.emptyState` omit row from `metadata-form-zod-reconciliation.test.ts` on main. The merge (`7ea3bb007d`) took main's side, and this part no longer touches that file. - No ablation: no tested behaviour changed. - No label written: `skip-changeset` does not apply, because a published file changes and the patch changeset is present. --- _Generated by [Claude Code](https://claude.ai/code/session_0121ooBYRmS8ziFXm9ai5YHm)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 16abea8 commit 56b2612

49 files changed

Lines changed: 335 additions & 1417 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
Component-member read points, part 3 of 3, plus the two held-back moves and the other citation spellings: `packages/spec/src` no longer ties a live read point to an objectui commit or to the console pin.
6+
7+
Clause-②: no
8+
9+
- **Component-member tests and the other group-C files.** `component.test.ts`, the `component-*.pin.test.ts` family, the record-block tests, `expression-bindable-text-keys.zod.ts`, `page.zod.ts` and `inline-grid-column-carriers.test.ts` now point at `liveness/page.json`, row `regions`. The evidence list there is the same one parts 1 and 2 carry. `content/docs/references/ui/expression-bindable-text-keys.mdx` is regenerated from the shortened comment.
10+
- **The two held-back moves.** The `measures.format` record in `src/ui/dataset.zod.ts` moves into `liveness/dataset.json`, row `measures.format`. The `enable.apiMethods` record in `api-methods-batch-conformance.test.ts` moves into `liveness/object.json`, row `enable.apiMethods`.
11+
- **Other spellings.** Live read points written as `objectui SHA … File.tsx:NNN`, or sha-less as "at the `.objectui-sha` pin", move into the note of their row in `field.json`, `action.json`, `app.json`, `dashboard.json`, `view.json` or `page.json`, each as `objectui @SHA FILE#SYMBOL`.
12+
- **Unchanged on purpose.** Retirement history stays where it is: the ADR-0087 conversion entries, the v18 migration entries and the retirement pins. A citation with no matching ledger row also stays, and is listed on the pull request.
13+
- No schema, type, export, default, accept or refuse change. No `.describe()` text changed.

‎content/docs/references/ui/expression-bindable-text-keys.mdx‎

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,15 @@ renderer happens to read.
5151
## Why these rows (measured, not inferred)
5252

5353
Rows are a RECORD of what each component renderer already reads back from
54-
the node's top level, measured at the `.objectui-sha` pin `82a9417`
55-
(re-verified identical at objectui `origin/main` `6c68b13` on
56-
2026-08-18) — declaring a key a renderer does not read back would recreate
54+
the node's top level (read points recorded in `liveness/page.json`, row
55+
`regions`) — declaring a key a renderer does not read back would recreate
5756
the evaluated-but-blank half of the objectui#4795 table:
5857

59-
| type | renderer read points (top level, within the closed set) |
60-
|-------------|----------------------------------------------------------|
61-
| `statistic` | `schema.label`, `schema.value`, `schema.description` (`data-display/statistic.tsx`) |
62-
| `card` | `schema.title`, `schema.description` (`layout/card.tsx`) |
63-
| `button` | `schema.label` (`form/button.tsx`) |
58+
| type | renderer reads (top level, within the closed set) |
59+
|-------------|---------------------------------------------------|
60+
| `statistic` | `schema.label`, `schema.value`, `schema.description` |
61+
| `card` | `schema.title`, `schema.description` |
62+
| `button` | `schema.label` |
6463

6564
These are the measured motivating cases from objectui#4795 (dashboard
6665
workhorses). Other registered renderers also read keys from this closed set
@@ -69,7 +68,7 @@ at the top level (`alert`/`empty`/`dialog` `title`+`description`, `badge`
6968
declared yet: form-control `value` is interactive state rather than display
7069
text, and each row is an accept-surface widening that should arrive with its
7170
own measurement, not ride this one (startup scope discipline). `text` reads
72-
back `schema.content || schema.value` (`basic/text.tsx`) — unlike the rows
71+
back `schema.content || schema.value` (the same ledger entry) — unlike the rows
7372
above, its omission is not merely unmeasured: `value` there is a fallback
7473
spelling for the same slot `content` already evaluates (see `content` NOT a
7574
member, above), not a second read point, so a `text: ['value']` row would

‎packages/spec/liveness/action.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"verifiedAt": "2026-09-08",
4949
"evidenceScope": "in-repo",
5050
"evidence": "packages/runtime/src/action-execution.ts#isDeclarativeUpdateAction (the executor's own discriminator — a bare `action?.operation === DECLARATIVE_UPDATE_OPERATION`, deliberately with no `type` clause so data at rest whose `type` contradicts its `operation` is still routed by `operation`); packages/runtime/src/domains/actions.ts#handleActionsRequest (the REST `/actions` door: the branch runs ahead of the `type` switch and ahead of the trusted-mode plumbing, and hands off to `executeDeclarativeUpdateAction`); packages/runtime/src/action-execution.ts#invokeBusinessAction (the MCP `run_action` door takes the same branch into the same executor — one implementation, two doors); packages/runtime/src/action-execution.ts#isHeadlessInvokableAction (asked FIRST, so a declarative update is listed as invokable although it carries neither `target` nor `body`); packages/runtime/src/action-execution.ts#headlessActionTypeError (asked FIRST, so the key suppresses the `type` prescription that would otherwise be wrong for it); packages/runtime/src/action-execution.ts#summarizeAction (the MCP listing face projects the declared `operation` and forces `requiresRecord`); packages/spec/src/ui/action.zod.ts#refuseDeclarativeUpdateContradictions (authoring-time: every executor-binding key beside `operation: 'update'` is refused at its own path, and `patch` without it); packages/spec/src/stack.zod.ts#collectGlobalUpdateActionErrors (defineStack refuses a standalone `operation: 'update'` action with no `objectName`)",
51-
"note": "The discriminator of the declarative single-record field write — one member, `'update'`; `'delete'`/`'custom'` are refused with the reason. FLIPPED `planned` -> `live` 2026-09-08 (#15080) on the runtime half #15079 (PR #15448, merged 2026-09-04): the key now decides dispatch at both server doors, and it is read BEFORE `type` at every one of them — contract point 1 of the executor contract PR #15077 pinned here, and a rule about ORDER, not merely a new branch. Declared by the #14092 maintainer ruling (2026-09-01): the row-level counterpart of a list view's `bulkActionDefs` `operation: 'update'`, spelled with the same words. The EXECUTOR CONTRACT is now honoured in tree rather than promised: the write is a single data-plane update of the CURRENT record executed AS THE CALLER under `wiring.ec` and never `buildActionExecutionContext` (the #14010 `runAs: 'user'` direction), so object/row/field permissions, hooks and validations fire as for a user edit and a caller who cannot read the row is refused (the class commit f19475c0a closed); `patch` merges UNDER the collected `params`; `undoable` captures the prior values of exactly the fields written; an action with no current record is a located 400, never a silent no-op. Pinned end-to-end in packages/runtime/src/action-declarative-update.test.ts, one describe per contract point plus a reverse pin that a handler-less `type: 'script'` action WITHOUT `operation` is unchanged. `evidenceScope: in-repo` is exact and deliberate: this verdict rests on the framework-side readers alone. The console half (objectui#7551) is a SECOND reader and the flip did not wait for it — objectui's `ActionRunner` still dispatches on `type` — so a console-side forward/undo pointer is a later widening of this row's scope, not a precondition of its verdict."
51+
"note": "The discriminator of the declarative single-record field write — one member, `'update'`; `'delete'`/`'custom'` are refused with the reason. FLIPPED `planned` -> `live` 2026-09-08 (#15080) on the runtime half #15079 (PR #15448, merged 2026-09-04): the key now decides dispatch at both server doors, and it is read BEFORE `type` at every one of them — contract point 1 of the executor contract PR #15077 pinned here, and a rule about ORDER, not merely a new branch. Declared by the #14092 maintainer ruling (2026-09-01): the row-level counterpart of a list view's `bulkActionDefs` `operation: 'update'`, spelled with the same words. The EXECUTOR CONTRACT is now honoured in tree rather than promised: the write is a single data-plane update of the CURRENT record executed AS THE CALLER under `wiring.ec` and never `buildActionExecutionContext` (the #14010 `runAs: 'user'` direction), so object/row/field permissions, hooks and validations fire as for a user edit and a caller who cannot read the row is refused (the class commit f19475c0a closed); `patch` merges UNDER the collected `params`; `undoable` captures the prior values of exactly the fields written; an action with no current record is a located 400, never a silent no-op. Pinned end-to-end in packages/runtime/src/action-declarative-update.test.ts, one describe per contract point plus a reverse pin that a handler-less `type: 'script'` action WITHOUT `operation` is unchanged. `evidenceScope: in-repo` is exact and deliberate: this verdict rests on the framework-side readers alone. The console half (objectui#7551) is a SECOND reader and the flip did not wait for it — objectui's `ActionRunner` still dispatches on `type` — so a console-side forward/undo pointer is a later widening of this row's scope, not a precondition of its verdict. The console's runner reads `operation` before any executor (packages/spec/src/ui/action-declarative-update.ts; moved out of spec source, #23434): objectui @b9814b334 packages/core/src/actions/ActionRunner.ts#execute (isUpdateOperationAction) posts the write through its registered `script` dispatch and runs no executor of its own, whatever executor the action or row names; byte-identical at objectui main 524136e."
5252
},
5353
"patch": {
5454
"status": "live",
@@ -68,7 +68,7 @@
6868
"status": "live",
6969
"verifiedAt": "2026-08-28",
7070
"evidence": "packages/runtime/src/action-execution.ts#dispatchFlowAction (type:'flow' server dispatch — automation.execute(action.target, …) runs inside it, after flowIsUnknown rejects an unrecognized flow name by that same value); packages/runtime/src/action-execution.ts#headlessActionTypeError (names the target the client-dispatched types go to instead)",
71-
"note": "URL/script/flow/endpoint + ${param}/${ctx} interpolation. 2026-08-25: REPOINTED — the evidence cited packages/runtime/src/http-dispatcher.ts, which has 0 occurrences of `target`; the action consumer was extracted into domains/actions.ts + action-execution.ts and http-dispatcher.ts now only delegates. The file still existed and the citation carried no line, so nothing in the gate could see it. 2026-08-28: RE-ANCHORED (#12516) — the 08-25 repoint wrote line numbers (:725/:718/:472) and all three drifted IN RANGE within a day (the lines now hold the FlowActionRefusal brand block and disabledActionRefusal's docblock); the citation now anchors the consuming symbols, which move with the consumer."
71+
"note": "URL/script/flow/endpoint + ${param}/${ctx} interpolation. 2026-08-25: REPOINTED — the evidence cited packages/runtime/src/http-dispatcher.ts, which has 0 occurrences of `target`; the action consumer was extracted into domains/actions.ts + action-execution.ts and http-dispatcher.ts now only delegates. The file still existed and the citation carried no line, so nothing in the gate could see it. 2026-08-28: RE-ANCHORED (#12516) — the 08-25 repoint wrote line numbers (:725/:718/:472) and all three drifted IN RANGE within a day (the lines now hold the FlowActionRefusal brand block and disabledActionRefusal's docblock); the citation now anchors the consuming symbols, which move with the consumer. The url-target scheme set's runner half (packages/spec/src/ui/navigation-target.ts and its pin action-url-target-scheme-set.test.ts; moved out of spec source, #23434): objectui @7578323 packages/core/src/actions/navigationTarget.ts#classifyNavigationTarget, which the action runner and the entitlement CTA both call; the runner's own pinned cases, mirrored by the spec test, are objectui @7578323 packages/core/src/actions/__tests__/navigationTarget.mailto-12191.test.ts."
7272
},
7373
"body": {
7474
"status": "live",

‎packages/spec/liveness/app.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@
160160
"status": "live",
161161
"verifiedAt": "2026-08-01",
162162
"evidence": "objectui @940ba24: packages/layout/src/NavigationRenderer.tsx:294-296, :418",
163-
"note": "target precedence recordId → filters → viewName; also keys the view-label i18n lookup."
163+
"note": "target precedence recordId → filters → viewName; also keys the view-label i18n lookup. With no `viewName` (packages/spec/src/ui/app.zod.ts, ObjectNavItemSchema; moved out of spec source, #23434): the entry links to the bare object route, where objectui @b9814b334 packages/app-shell/src/views/ObjectView.tsx#activeViewId opens `defaultViewId || views[0]`, the view objectui @b9814b334 packages/app-shell/src/views/ObjectView.tsx#buildViewTabs marks default, and the `all` tab that function adds only for an object with no list view (#21973); first read at objectui @0abd4f9f8769 (the same two symbols), re-read 2026-10-15."
164164
},
165165
"recordId": {
166166
"status": "live",

‎packages/spec/liveness/dashboard.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@
221221
"status": "live",
222222
"verifiedAt": "2026-08-03",
223223
"evidence": "objectui @91757a7: packages/plugin-dashboard/src/DashboardRenderer.tsx:439 — spread into every component schema; objectui: packages/plugin-dashboard/src/DatasetWidget.tsx:190-191 — declared query keys lowered into the DatasetSelection",
224-
"note": "the renderer-extras bag; its four DECLARED keys (dateGranularity / sortBy / sortOrder / limit, framework#3588) reach the analytics query, the rest pass through to the renderer."
224+
"note": "the renderer-extras bag; its four DECLARED keys (dateGranularity / sortBy / sortOrder / limit, framework#3588) reach the analytics query, the rest pass through to the renderer. The #20960 census (packages/spec/src/ui/dashboard.zod.ts; moved out of spec source, #23434): on the dataset-bound path objectui main @5262f7dd packages/plugin-dashboard/src/DatasetWidget.tsx#DatasetWidget reads the declared query keys (`dateGranularity`, `sortBy`, `sortOrder`, `limit`) and the metric tile's `description` (#resolvedSubCaption) and nothing else of the bag; none of the keys this repo's examples wrote (`format`, `currency`, `color`, `suffix`, `showLegend`, `horizontal`, `showDataLabels`) is read there, only the legacy inline arm spreads the bag, and each was removed from its producer."
225225
},
226226
"filterBindings": {
227227
"status": "live",

‎packages/spec/liveness/dataset.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@
106106
"format": {
107107
"status": "live",
108108
"evidence": "packages/services/service-analytics/src/dataset-compiler.ts#compileDataset (`if (typeof m.format === 'string') metric.format = m.format`); packages/services/service-analytics/src/analytics-service.ts#AnalyticsService (`queryDataset`: `if (f.format == null && m.format) f.format = m.format` — enriched onto the result field for the renderer)",
109-
"note": "compiled into Cube metric + enriched onto result fields for the renderer. 2026-08-28: RE-ANCHORED (commit 9ee2dcfbd) and REPOINTED — `analytics-service.ts:480` had rotted onto a docblock sentence about driver selection. Re-closed by hand against c459da6bc; DATED for the first time (this file carried no `verifiedAt` anywhere, which the review accepting that re-anchoring sorts as OLDEST).",
109+
"note": "compiled into Cube metric + enriched onto result fields for the renderer. 2026-08-28: RE-ANCHORED (commit 9ee2dcfbd) and REPOINTED — `analytics-service.ts:480` had rotted onto a docblock sentence about driver selection. Re-closed by hand against c459da6bc; DATED for the first time (this file carried no `verifiedAt` anywhere, which the review accepting that re-anchoring sorts as OLDEST). Renderer read points for the date-valued measure (packages/spec/src/ui/dataset.zod.ts; moved out of spec source, #23434), re-read at objectui @b9814b334 on 2026-10-14: objectui @b9814b334 packages/core/src/utils/dataset-format.ts#formatMeasure routes a non-numeric value through objectui @b9814b334 packages/core/src/utils/dataset-format.ts#formatMeasureDate, whose date-only arm threads `format` into the STYLE parameter of objectui @b9814b334 packages/core/src/utils/date-display.ts#formatDate (its `relative` branch falls back to the absolute form beyond ±7 days, stripping the style through objectui @b9814b334 packages/core/src/utils/date-display.ts#absoluteFallbackOptions), while its datetime arm answers `relative` with objectui @b9814b334 packages/core/src/utils/date-display.ts#formatRelativeDate, `short` with objectui @b9814b334 packages/core/src/utils/date-display.ts#formatDateTime (`style: 'compact'`) and everything else — a date pattern included — with the bare `formatDateTime(v, { locale })`. Until objectui#8352 a datetime value ignored `format`; the pattern-grammar gap stays documented rather than closed (objectui#7178 ruled A).",
110110
"verifiedAt": "2026-08-28"
111111
},
112112
"currency": {

0 commit comments

Comments
 (0)