Skip to content

Commit 030a7b8

Browse files
feat(spec)!: record:json is retired — refused by name at the schema door, the approval request page's raw JSON panel it was declared for was dropped (#24162) (#24170)
Fixes #24162 Clause-②: no (narrowing) Retires the page component type `record:json` and its props def `RecordJsonProps`, refused by name through `RETIRED_PAGE_COMPONENT_TYPES`. This follows the maintainer's ruling quoted on the card (「业务上没有这个需求啊,处理审批的人为什么需要看json」) and triage grade `6232511377`. `record:json` was declared spec first (#23745, `97b8e7a51d`) for one face, the approval request page's raw JSON panel, and that face was dropped. No renderer was built, no page placed it, and its one planned producer (PR #23837) was closed unmerged. It shipped in `18.0.0-next.3`. Under the no-staging rule, this PR removes it in the next prerelease, with its own changeset. The shape is the `ai:chat_window` retirement (PR #21531, `48eb9c193`), surface for surface. Dev session: `session_01LKyb454ATwXXksfRnB8Xiy` (cloud dispatch from the `domain:spec#2` seat, claim `6232774903`). ## Accept set, before → after, at each door | door | before (`eda6f14b7b`) | after (this head) | | --- | --- | --- | | `PageComponentType` (enum alone) | accepts `record:json` | refuses: `invalid_value` with the retirement prescription (the enum error map). A stranger such as `record:jsonl` keeps zod's own message | | `PageComponentSchema.type` (node) | accepts `{ type: 'record:json' }` | refuses: `code: 'custom'`, `path: ['type']`, `params.retiredComponentType: 'record:json'`, message = the prescription. Bare, `{}`-bag and populated alike | | `PageSchema` (what `os validate` / save parse) | accepts the node | refuses at `regions[i].components[j].type`, one issue per node | | `ComponentPropsMap['record:json']` (props gate, `check-yaml-examples`, vocabulary) | strict `RecordJsonProps`: `field` (req.), `label`, `requiredPermissions` (req., min 1) | row kept as `retiredComponentProps('record:json')` (`z.never`): every bag refused, `{}` included, `invalid_type` at `[]` with the prescription | | lint `component-type-unknown` | silent (known type) | `error` at `…type`, message = the prescription's head, hint = its "Delete the …" sentence | | lint `component-props-*` | judged the bag against the strict row | `component-props-invalid` `error` at `…properties` for every bag | | typo suggester | offered `record:json` for `record:jsn` | no longer offers it (out of `KNOWN_COMPONENT_TYPE_CANDIDATES`) | | print pages | `PRINT_REFUSED_PAGE_COMPONENT_TYPES` row | row removed: a retired type is refused at the parse before any print rule reads it (the map's own docblock rule) | | exports | `RecordJsonProps` (const + type), JSON Schema `ui/RecordJsonProps` | removed, the JSON Schema unpublished | Everything else is byte-identical, including the record blocks' own fail-open `requiredPermissions` gate. The open string arm stays open. The prescription (one string, all doors): "`record:json` was removed in @objectstack/spec 18 (ADR-0049) — it shipped only in the 18.0.0-next.3 prerelease, declared for one raw-JSON panel on the approval request page, and that panel was dropped: … Delete the `record:json` component node and put nothing in its place." It names no replacement, by ruling, and carries no tracker number (`check:doc-authoring`). ## The precedent's surfaces, and whether this PR touches each | PR #21531 surface | here | | --- | --- | | value leaves `PageComponentType`, joins `RETIRED_PAGE_COMPONENT_TYPES` with a prescription, no tracker number | ✅ `page.zod.ts` | | enum docblock + `PageComponentSchema.type` `.describe()` name the retirement | ✅ | | props def deleted, row kept as `retiredComponentProps` | ✅ `component.zod.ts`, plus the factory's docblock list | | D3 semantic entry, one `STEP18_RATIONALE` fragment, `RETIRED_DEFS_BY_MAJOR[18]` entry | ✅ `ui-record-json-retired` (inserted at its sorted id, `order: 100` = max + 1), `retired-defs/18.ui__RecordJsonProps.ts`; `registry.ts` generated, not committed | | no D2 conversion | ✅ none, see below | | pins at every door with a control | ✅ `component-record-json-retirement.test.ts` (replaces `component-record-json.test.ts`) | | vocabulary pin | ✅ `component-type-vocabulary.test.ts`: known through the row, not a candidate, `record:` still reserved | | `component-props-unknown-members.pin.test.ts` line | n/a: `RecordJsonProps` had no `z.unknown()` member | | generated baselines | ✅ see Ratchets | | `content/docs/ui/pages.mdx` hand-written list | n/a: it never listed `record:json` (grep 0) | | lint comment naming the def | n/a: no lint source named `RecordJsonProps` | | **differs: print classification row** | removed (the precedent had none) | | **differs: a lint pin existed** | `validate-record-json-23745.test.ts` is **flipped** into a refusal pin, not deleted: both lint rules, the shared `runAuthoringRules('validate')` pipeline, and the typo case, with `record:approvals` as the live control. Kept rather than deleted because the map-driven `flags %s` case in `validate-component-types.test.ts` covers only the type rule, not the props rule or the pipeline | | **differs: a renderer contract existed** | its census pins move: `component-record-block-field-security.test.ts` (the `requiredPermissions` census loses `record:json`), `component-record-related-list-parent-23134.test.ts` (the whole-bag set gains it), `type-alias-convention.pin.test.ts` (`Iso_ui_component__RecordJsonProps` removed, 789 → 788 and the prose counts) | | tree-scoped absence pin (playbook §4) | ✅ new: a walk of the five roots `@objectstack/spec` already declares in `cross-package-test-inputs.mjs`, judging the authoring shape (a `type` key valued `record:json`), with its exclusions written beside it. Registered in `vitest.repo-tests.json`, which `check:cross-package-test-inputs` demanded | ## D2 decision: none registered The playbook's §3 conversion is a per-key `stripKeys`. Here the whole element leaves, so there is no key a walker could strip that leaves a valid node behind. Deleting an authored page node is a layout decision, and the `element-filter-removed` docblock rules that a conversion must not make it. The precedent registered none for the same reason. The D3 entry carries the delegated deletion. A user on `next.3` meets the prescription at `os validate`. Because `packages/spec/src/conversions/registry.ts` is not edited, the carried correction from contract review `6142098559` item A does **not** ride this PR (per the dispatch: only if that file is edited). ## Ratchets: a whole-def removal, so all four move Each was regenerated by its generator. The two hand deletions are the ones the build gate prescribes. | artifact | movement | proof | | --- | --- | --- | | `json-schema.manifest/ui.json` | −1 (`ui/RecordJsonProps`) | build: "1 schema(s) left the published set since eda6f14, each declared (#4725): json-schema/ui/RecordJsonProps.json — RETIRED_DEFS_BY_MAJOR, major 18." | | `authorable-surface/ui.json` | −3 (`field`, `label`, `requiredPermissions`) | build: "ui/RecordJsonProps:* (3 line(s)) — def no longer emitted by this build; whole-schema removals are adjudicated by json-schema.manifest/" | | `api-surface/ui.json` | −2 (`RecordJsonProps (const)`, `(type)`) | `gen:api-surface` | | `declaration-map/ui.json`, `export-origins/ui.json` | −1 each | `gen:declaration-map`, `gen:export-origins` | | strictness-ledger counts `ui.md` | `ui/` sites 214 → 213, `component.zod.ts` 81 → 80 | `gen:strictness-ledger` | | reference docs `index.mdx`, `ui/component.mdx`, `ui/page.mdx` | `RecordJsonProps` section gone, enum list −1 | `gen:docs` | | `authorable-defaults/`, `docs-import-surface.baseline.json` | unchanged: the def was default-free and never in the docs import surface | `check:generated` green | | `authorable-surface.base.json` | untouched | — | `check:generated` on the final head: `✓ All 14 generated artifacts are up to date`. No `skills/**` path moved, so `check-governed-merges` is not owed. ## Consumer grep on this head `git grep -e 'record:json' -e RecordJsonProps -- . ':!**/CHANGELOG.md' ':!.changeset/'`. `**/CHANGELOG.md` and `.changeset/` are excluded because they are release-owned records of what `next.3` shipped and are not edited here (seat ruling). The hits: - the retirement kit itself: `page.zod.ts`, `component.zod.ts`, the two entry files, `registry.ts.template`, the five spec test files and the lint pin; - `content/docs/references/ui/page.mdx`: 2 lines, the regenerated `.describe()` naming it as retired. The control in the same query shape is `record:approvals`, which hits in 9 files. The `.objectui-sha` pin is not touched (objectui `main`: 0 hits, per the card). ## Ablation (fix committed first, `scripts/ablation-replace.mjs`, restored by blob) The subject resolves by relative import (`./page.zod`, `./component.zod`) to `src`, so no `dist` rebuild was involved. - **Mutation:** the map key renamed to `record:json-ABLATED` (held), and the row turned into `emptyProps('record:json')`. Tool output: "anchor 1 -> 0, blob fee472c -> 9927e199cb36". - **Result:** 7 failed, 24 passed. The failures are the map pin, the row pin, `PageComponentSchema`, `PageSchema` at the element path, the enum error map, the vocabulary pin and the candidate-list pin. - **Restore:** both files back to their `HEAD` blobs (`e3f3674b323f`, `fee472ca872d`), and `git diff HEAD` is empty. ## Gates (local, final head `26e52c407`) - spec `build` exit 0. `check:generated` `✓ All 14 generated artifacts are up to date`. - spec vitest `--project local --maxWorkers=2`: 691 files, 20969 passed, 1 skipped, 1 todo. The new walk runs under `--project repo`: 10 of 10 passed. - spec `typecheck` exit 0, with `check:test-typecheck: OK`. - lint: closure built, then `vitest`: 142 files, 6812 passed, 5 skipped. `typecheck` exit 0. - Downstream importers of the changed symbols, with the closure built first: platform-objects, mcp and cloud-connection `canonical-expression-envelopes` (15, 11 and 16 passed), metadata-protocol `protocol.runtime-authoring-gate` (145 passed), showcase `command-center-metric-filter` (3 passed), dogfood `expression-conformance` (7 passed). - `check-platform-checklist --changed-from origin/main`: OK, 0 anchors lost. - `dispatch-gates --ran`: "✓ 110 derived famil(ies) accounted for — 108 run, 2 NOT-MEASURED". Every family exited 0 except the two below. - NOT MEASURED: `check:dual-build-cjs-loads`. Reason: it needs a whole-repo build, and it exited 3 with PREREQUISITE NOT MET. - NOT MEASURED: `check:type-check-debt`. Reason: repo-wide tsc, killed by the 420s per-gate cap on the shared box. The two packages this PR touches typecheck green. Both are declared to CI. - NOT MEASURED: spec `test:repo` as a whole. It belongs to CI (`Test Core`); only this PR's new repo-project file was run. - Changeset gates, with this body as the `--event` payload: - `check-adr-0087-registration`: "✓ 1 declared-breaking changeset(s) … [BREAKING+bang+clause-②-narrowing] registered ui-record-json-retired (new here: ui-record-json-retired)". - `check-changeset-no-major`: "✓ This diff introduces no `major` bump." and "✓ LEVEL AXIS: this PR declares clause-② `no (narrowing)`, and no package whose published source … it moves is graded `patch`". - `check-empty-changeset`: exit 0. ## Deviations, stated - **`Clause-②: no (narrowing)`, not the claim's `Clause-②: no`.** The dispatch asked for the spelling the gates accept for a narrowing today. `check-changeset-no-major.mjs` reads `(narrowing)` as the BREAKING arm and stands the level axis down on a bare `no`. The newest merged narrowings (`24131-rest-public-form-required`, `24062-authored-install-scope-project`) carry the same line. - The spec pin file is renamed `component-record-json.test.ts` → `component-record-json-retirement.test.ts`, the `*-retirement.test.ts` house name. Its accept pins are flipped, not kept. ## Acceptance notes - `.changeset/pre/23745-record-json-block.md` and `packages/spec/CHANGELOG.md` are untouched. They record what `next.3` shipped, and this PR's changeset records the retirement (seat ruling). `content/docs/releases/` is untouched. - objectui#12490 (face 4) stays its `domain:ui` owner's call, per triage. - Fixed container overhead, measured: `pnpm install --frozen-lockfile` 52s. The first spec build took 252s on the shared box, and later ones 431–462s. --- _Generated by [Claude Code](https://claude.ai/code/session_01LKyb454ATwXXksfRnB8Xiy)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent cb8756b commit 030a7b8

23 files changed

Lines changed: 546 additions & 332 deletions
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
'@objectstack/spec': minor
3+
---
4+
5+
feat(spec)!: `record:json` is retired — refused by name at the schema door; the approval request page's raw JSON panel it was declared for was dropped (#24162, ADR-0049)
6+
7+
Clause-②: no (narrowing)
8+
9+
<!-- adr-0087: registered ui-record-json-retired -->
10+
11+
**BREAKING** — an accept-set narrowing on a published authoring surface, shipped as `minor` under the repo's launch-window convention for accept-set narrowings (the `user:profile`, `element:filter`, `element:form` and `ai:chat_window` retirements shipped the same way).
12+
13+
`record:json` was added to `PageComponentType` in `18.0.0-next.3`, with a strict `ComponentPropsMap` row, `RecordJsonProps` (`field`, `label`, `requiredPermissions`). It was declared spec first for one face: the approval request page's raw JSON panel. The maintainer then dropped that panel — the person deciding an approval has no business need to read the request as JSON — so no renderer was built and no page placed the type: zero consumers in objectstack and objectui, and its one planned producer was closed unmerged. A declared element that nothing draws is a capability claim nothing keeps, so it is retired under ADR-0049 enforce-or-remove, refused by name, the `ai:chat_window` way. The `18.0.0-next.3` entry below records what that prerelease shipped; this entry is its retirement.
14+
15+
**What is refused:** an authored `record:json` component node, at `PageComponentSchema.type`. That covers `definePage()`, `PageSchema`, and every door that parses pages: `os validate`, `os build`, `os lint` and the metadata save door. The issue is located at the node's own path, with `code: 'custom'` and `params.retiredComponentType`, and its message is the retirement prescription. `PageComponentType`'s own error map refuses the name with the same text when the enum is parsed alone. `ComponentPropsMap['record:json']` stays as a row, so every reader that dispatches on it keeps recognising the name: the component-props gate, `check-yaml-examples` and the type vocabulary's known set. The row now refuses every props bag, `{}` included, with the same prescription. One prescription string, `RETIRED_PAGE_COMPONENT_TYPES` in `@objectstack/spec/ui`, answers at all three doors. The authoring rule `component-type-unknown` reports the node by name, and stops suggesting `record:json` for a misspelling in the `record:` namespace.
16+
17+
**What is removed from the exports:** `RecordJsonProps` (`@objectstack/spec/ui`), the props schema the element no longer has. Its JSON Schema (`ui/RecordJsonProps`) is no longer published. Its print classification row (`PRINT_REFUSED_PAGE_COMPONENT_TYPES`) leaves with it: a retired type is refused at the parse before any print rule reads it.
18+
19+
**What stays accepted:** every other member of `PageComponentType` and `ComponentPropsMap`, byte-identically, including the four record blocks' own `requiredPermissions` gate, which `record:json` never changed. The open string arm also stays open: custom and plugin-registered types keep parsing. The only string refused is the retired name itself.
20+
21+
## FROM → TO
22+
23+
| you wrote | write instead |
24+
|:--|:--|
25+
| a `{ type: 'record:json' }` component node in a page region, slot or container | nothing: delete the node. No replacement panel exists, by ruling |
26+
| `properties: { field, label, requiredPermissions }` on that node | nothing: none of them was ever read |
27+
28+
The one-line fix: delete the `record:json` component node. No ADR-0087 conversion is registered, because the only edit is deleting an authored page node, and a mechanical conversion does not delete page nodes: which region closes up is a layout decision. The D3 entry `ui-record-json-retired` carries that delegation, so `os migrate meta --from 17` lists it as a manual change for every stack that still names the type.
29+
30+
## Who is affected, measured
31+
32+
- **objectstack** at `eda6f14b7b`: zero authored `record:json` nodes in `examples/**`, `packages/apps/**`, `apps/**`, `skills/**` and `content/docs/**` code samples. The only hits were the spec's own type list, row and print row, its tests, the lint accept pin and the generated reference docs. A tree-scoped absence pin now holds that zero.
33+
- **objectui** `main`: zero hits (the card's census); the `.objectui-sha` pin is not moved.
34+
- **Deployed metadata** was not measured; the type was published in one prerelease only.
35+
36+
The retirement kit:
37+
38+
- the retired-type map entry and the enum value removed (`packages/spec/src/ui/page.zod.ts`), its print classification row removed, and the row turned into a whole-bag refusal, with `RecordJsonProps` removed (`packages/spec/src/ui/component.zod.ts`)
39+
- the D3 semantic entry `ui-record-json-retired`, its step-18 rationale fragment, and the `RETIRED_DEFS_BY_MAJOR` entry `ui/RecordJsonProps`
40+
- pin tests: `component-record-json-retirement.test.ts` pins `code`, `path`, `params` and the first sentence at each door (the map, the row with empty and populated bags, `PageComponentSchema`, `PageSchema` at the element path, the enum error map), with `record:approvals` as the live control, plus a tree-scoped absence walk; `component-type-vocabulary.test.ts` pins the type known, out of the typo candidates, and `record:` still reserved; the lint accept pin `validate-record-json-23745.test.ts` is flipped into a refusal pin at both lint rules and the shared pipeline
41+
- generated baselines and docs follow the schema: `api-surface/`, `export-origins/`, `declaration-map/`, `authorable-surface/`, `json-schema.manifest/`, the strictness-ledger counts, `spec-changes.json`, the upgrade guide and the reference docs

‎content/docs/references/index.mdx‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Protocol reference — every schema by module
33
navTitle: Protocol Reference
4-
description: Every schema published by @objectstack/spec — 1539 schemas across 14 protocol modules
4+
description: Every schema published by @objectstack/spec — 1538 schemas across 14 protocol modules
55
---
66

77
{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
@@ -33,8 +33,8 @@ counts are sums of the rows they head. Regenerate with
3333
| [Shared Protocol](/docs/references/shared) | 10 | 31 | Primitives used across every protocol — identifiers, HTTP, expressions, error maps, enums. |
3434
| [Studio Protocol](/docs/references/studio) | 3 | 35 | Studio designer metadata — the authoring surfaces for the protocols above. |
3535
| [System Protocol](/docs/references/system) | 36 | 284 | The runtime environment — logging, jobs, cache, metrics, notifications, i18n and compliance. |
36-
| [UI Protocol](/docs/references/ui) | 16 | 169 | Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer. |
37-
| **Total** | **197** | **1539** | 14 protocol modules |
36+
| [UI Protocol](/docs/references/ui) | 16 | 168 | Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer. |
37+
| **Total** | **197** | **1538** | 14 protocol modules |
3838

3939
---
4040

@@ -364,7 +364,7 @@ The runtime environment — logging, jobs, cache, metrics, notifications, i18n a
364364

365365
## UI Protocol
366366

367-
**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 169 schemas**
367+
**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 168 schemas**
368368

369369
Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer.
370370

@@ -375,7 +375,7 @@ Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI lay
375375
| [`app.zod.ts`](/docs/references/ui/app) | `ActionNavItem`, `App`, `AppBranding`, `AppContextSelector`, `ComponentNavItem`, `DashboardNavItem`, `DocNavItem`, `GroupNavItem`, `NavigationArea`, `NavigationContribution`, `NavigationItem`, `ObjectNavItem`, `PageNavItem`, `ReportNavItem`, `UrlNavItem` |
376376
| [`bulk-action.zod.ts`](/docs/references/ui/bulk-action) | `BulkActionDef`, `BulkActionExecution`, `BulkActionOperation`, `BulkActionParam` |
377377
| [`chart.zod.ts`](/docs/references/ui/chart) | `ChartAggregate`, `ChartAggregateFunction`, `ChartAnnotation`, `ChartAxis`, `ChartConfig`, `ChartDrillDown`, `ChartGroupBy`, `ChartInteraction`, `ChartSeries`, `ChartType` |
378-
| [`component.zod.ts`](/docs/references/ui/component) | `ActionButtonProps`, `ActionGroupProps`, `ActionIconProps`, `ActionMenuProps`, `ElementButtonProps`, `ElementDefinitionListProps`, `ElementFilterProps`, `ElementFormProps`, `ElementImageProps`, `ElementMetadataViewerProps`, `ElementNumberProps`, `ElementRecordPickerProps`, `ElementRepeaterProps`, `ElementTextInputProps`, `ElementTextProps`, `ObjectCalendarProps`, `ObjectFormProps`, `ObjectGanttProps`, `ObjectGridProps`, `ObjectKanbanProps`, `ObjectMapProps`, `ObjectMasterDetailFormProps`, `ObjectMetricProps`, `ObjectTimelineProps`, `ObjectTreeProps`, `PageAccordionProps`, `PageCardProps`, `PageContainerProps`, `PageHeaderProps`, `PageTabsProps`, `RecordActivityProps`, `RecordAlertAction`, `RecordAlertProps`, `RecordChatterProps`, `RecordDetailsProps`, `RecordHighlightsField`, `RecordHighlightsProps`, `RecordHistoryProps`, `RecordJsonProps`, `RecordLineItemsProps`, `RecordPathProps`, `RecordQuickActionsProps`, `RecordReferenceRailProps`, `RecordRelatedListProps`, `ReferenceRailEntry` |
378+
| [`component.zod.ts`](/docs/references/ui/component) | `ActionButtonProps`, `ActionGroupProps`, `ActionIconProps`, `ActionMenuProps`, `ElementButtonProps`, `ElementDefinitionListProps`, `ElementFilterProps`, `ElementFormProps`, `ElementImageProps`, `ElementMetadataViewerProps`, `ElementNumberProps`, `ElementRecordPickerProps`, `ElementRepeaterProps`, `ElementTextInputProps`, `ElementTextProps`, `ObjectCalendarProps`, `ObjectFormProps`, `ObjectGanttProps`, `ObjectGridProps`, `ObjectKanbanProps`, `ObjectMapProps`, `ObjectMasterDetailFormProps`, `ObjectMetricProps`, `ObjectTimelineProps`, `ObjectTreeProps`, `PageAccordionProps`, `PageCardProps`, `PageContainerProps`, `PageHeaderProps`, `PageTabsProps`, `RecordActivityProps`, `RecordAlertAction`, `RecordAlertProps`, `RecordChatterProps`, `RecordDetailsProps`, `RecordHighlightsField`, `RecordHighlightsProps`, `RecordHistoryProps`, `RecordLineItemsProps`, `RecordPathProps`, `RecordQuickActionsProps`, `RecordReferenceRailProps`, `RecordRelatedListProps`, `ReferenceRailEntry` |
379379
| [`dashboard.zod.ts`](/docs/references/ui/dashboard) | `Dashboard`, `DashboardHeader`, `DashboardHeaderAction`, `DashboardWidget`, `DashboardWidgetChartConfig`, `DashboardWidgetOptions`, `GlobalFilter`, `GlobalFilterOptionsFrom`, `WidgetActionType`, `WidgetColorVariant` |
380380
| [`dataset.zod.ts`](/docs/references/ui/dataset) | `Dataset`, `DatasetDimension`, `DatasetMeasure`, `DerivedMeasureOp` |
381381
| [`expression-bindable-text-keys.zod.ts`](/docs/references/ui/expression-bindable-text-keys) | `ExpressionBindableTextKey` |

‎content/docs/references/ui/component.mdx‎

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Component schema — UI Protocol reference
33
navTitle: Component
4-
description: "Component schemas of the ObjectStack UI Protocol: ActionButtonProps and 44 more — each property with its type, default and a TypeScript example."
4+
description: "Component schemas of the ObjectStack UI Protocol: ActionButtonProps and 43 more — each property with its type, default and a TypeScript example."
55
---
66

77
{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
@@ -13,8 +13,8 @@ description: "Component schemas of the ObjectStack UI Protocol: ActionButtonProp
1313
## TypeScript Usage
1414

1515
```typescript
16-
import { ActionButtonPropsSchema, ActionGroupPropsSchema, ActionIconPropsSchema, ActionMenuPropsSchema, ElementButtonPropsSchema, ElementDefinitionListPropsSchema, ElementFilterPropsSchema, ElementFormPropsSchema, ElementImagePropsSchema, ElementMetadataViewerPropsSchema, ElementNumberPropsSchema, ElementRecordPickerPropsSchema, ElementRepeaterPropsSchema, ElementTextInputPropsSchema, ElementTextPropsSchema, ObjectCalendarPropsSchema, ObjectFormPropsSchema, ObjectGanttPropsSchema, ObjectGridPropsSchema, ObjectKanbanPropsSchema, ObjectMapPropsSchema, ObjectMasterDetailFormPropsSchema, ObjectMetricPropsSchema, ObjectTimelinePropsSchema, ObjectTreePropsSchema, PageAccordionProps, PageCardProps, PageContainerProps, PageHeaderProps, PageTabsProps, RecordActivityProps, RecordAlertActionSchema, RecordAlertProps, RecordChatterProps, RecordDetailsProps, RecordHighlightsField, RecordHighlightsProps, RecordHistoryProps, RecordJsonProps, RecordLineItemsProps, RecordPathProps, RecordQuickActionsProps, RecordReferenceRailProps, RecordRelatedListProps, ReferenceRailEntrySchema } from '@objectstack/spec/ui';
17-
import type { ActionButtonProps, ActionGroupProps, ActionIconProps, ActionMenuProps, ElementDefinitionListProps, ElementNumberProps, ElementRecordPickerProps, ElementRepeaterProps, ObjectCalendarProps, ObjectFormProps, ObjectGanttProps, ObjectGridProps, ObjectKanbanProps, ObjectMapProps, ObjectMasterDetailFormProps, ObjectMetricProps, ObjectTimelineProps, ObjectTreeProps, PageContainerProps, RecordAlertAction, RecordAlertProps, RecordHighlightsField, RecordHistoryProps, RecordJsonProps, RecordLineItemsProps, RecordPathProps, RecordQuickActionsProps, RecordReferenceRailProps, ReferenceRailEntry } from '@objectstack/spec/ui';
16+
import { ActionButtonPropsSchema, ActionGroupPropsSchema, ActionIconPropsSchema, ActionMenuPropsSchema, ElementButtonPropsSchema, ElementDefinitionListPropsSchema, ElementFilterPropsSchema, ElementFormPropsSchema, ElementImagePropsSchema, ElementMetadataViewerPropsSchema, ElementNumberPropsSchema, ElementRecordPickerPropsSchema, ElementRepeaterPropsSchema, ElementTextInputPropsSchema, ElementTextPropsSchema, ObjectCalendarPropsSchema, ObjectFormPropsSchema, ObjectGanttPropsSchema, ObjectGridPropsSchema, ObjectKanbanPropsSchema, ObjectMapPropsSchema, ObjectMasterDetailFormPropsSchema, ObjectMetricPropsSchema, ObjectTimelinePropsSchema, ObjectTreePropsSchema, PageAccordionProps, PageCardProps, PageContainerProps, PageHeaderProps, PageTabsProps, RecordActivityProps, RecordAlertActionSchema, RecordAlertProps, RecordChatterProps, RecordDetailsProps, RecordHighlightsField, RecordHighlightsProps, RecordHistoryProps, RecordLineItemsProps, RecordPathProps, RecordQuickActionsProps, RecordReferenceRailProps, RecordRelatedListProps, ReferenceRailEntrySchema } from '@objectstack/spec/ui';
17+
import type { ActionButtonProps, ActionGroupProps, ActionIconProps, ActionMenuProps, ElementDefinitionListProps, ElementNumberProps, ElementRecordPickerProps, ElementRepeaterProps, ObjectCalendarProps, ObjectFormProps, ObjectGanttProps, ObjectGridProps, ObjectKanbanProps, ObjectMapProps, ObjectMasterDetailFormProps, ObjectMetricProps, ObjectTimelineProps, ObjectTreeProps, PageContainerProps, RecordAlertAction, RecordAlertProps, RecordHighlightsField, RecordHistoryProps, RecordLineItemsProps, RecordPathProps, RecordQuickActionsProps, RecordReferenceRailProps, ReferenceRailEntry } from '@objectstack/spec/ui';
1818

1919
// Validate data
2020
const result = ActionButtonPropsSchema.parse(data);
@@ -1790,19 +1790,6 @@ Type: `string`
17901790
| **unknownUserText** | `string` | optional | Copy substituted when an entry has no resolvable actor. Literal string, every locale (renderer default: "Unknown user"). |
17911791

17921792

1793-
---
1794-
1795-
## RecordJsonProps
1796-
1797-
### Properties
1798-
1799-
| Property | Type | Required | Description |
1800-
| :--- | :--- | :--- | :--- |
1801-
| **field** | `string` | ✅ | The key of the bound record whose value this block draws as indented JSON, in a panel that starts collapsed, with a copy control. A declared field, or a key the record's read route serves beside the declared fields (`payload` on a `sys_approval_request` row). It is NOT checked against the object's fields: a key with no value on the served record draws nothing, so a misspelled `field` draws nothing and no publish check reports it. |
1802-
| **label** | `string \| Record<string, string>` | optional | The collapsed panel's summary line — a string or an inline locale map (renderer default: "Raw data (JSON)"). |
1803-
| **requiredPermissions** | `string[]` | ✅ | [ADR-0066] REQUIRED, at least one. Capabilities the user must ALL hold — names that permission sets grant through `systemPermissions`, not object actions. It fails CLOSED, unlike the record blocks' gate of the same name: a client that cannot resolve the user's capabilities (no permission provider, or one that does not report `systemPermissions`) draws nothing, and so does a user missing any of them — no notice, no summary line, no empty panel. Presentation only: it authorises nothing, and the read route still serves the value to the same user. To keep a value from a user, gate the object, the field or the route. |
1804-
1805-
18061793
---
18071794

18081795
## RecordLineItemsProps

0 commit comments

Comments
 (0)