Repository navigation
Commit f846cc2
docs(spec): step-18 entries, the exportOptions TSDoc and the stored-shapes row say a stored page's next save meets the component-props gate at the metadata save door (#23800)
Fixes #23789
Clause-②: no
Text only. No accept set, export or generated artifact moves.
## Why
`validateComponentProps` and `validateComponentTypes` run on `surfaces:
CLI_AND_RUNTIME` with `runtimeTypes: ['page']`
(`packages/lint/src/authoring-rules.ts`, read on `main` at `b485122`).
The `runtime-publish` surface is the metadata write path's publish gate:
an active `saveMetaItem` and the draft-to-active promotion. So the
metadata save door judges a page component's `properties`. The read path
does not: the entries' own comments say so ("the gate judges writes,
never the read path, so only the next save of a page with a finding is
refused"). The sentences below said the save path does not parse
`properties`. That was false. Each rewrite keeps the load half and
corrects the save half, in the wording PR #23418 used for its 24
entries: *a stored page still loads, because a page component's
`properties` is not parsed on the metadata load path, and the next save
of the page meets the component-props gate at the metadata save door.*
## Sites: old sentence → new sentence
### Shipped text: step-18 `reason` strings (printed by `os migrate meta`
and the upgrade guide)
| Entry | Old | New |
| :--- | :--- | :--- |
| `18.ui-page-action-row-operation-declared` | A page's `properties` is
not parsed on the metadata save or load path; `os validate`'s props gate
parses it against these same rows and reports the refusal at the row's
`operation` or `onSuccess`. | The component-props gate parses a page's
`properties` against these same rows and reports the refusal at the
row's `operation` or `onSuccess` on `os validate`, `os build` and `os
lint`. A stored page still loads, because a page component's
`properties` is not parsed on the metadata load path, and the next save
of the page meets the component-props gate at the metadata save door. |
| `18.ui-object-block-grouping-config-typed` | `properties` on a page
component is not parsed on the save path, so a stored page keeps loading
and renders as it does today; the component-props gate reports such a
value as a `component-props-invalid` error at the offending path on `os
validate`, `os build` and `os lint`, … | `properties` on a page
component is not parsed on the metadata load path, so a stored page
keeps loading and renders as it does today, and the next save of the
page meets the component-props gate at the metadata save door. The gate
reports such a value as a `component-props-invalid` error at the
offending path on `os validate`, `os build` and `os lint` and at that
save door, … |
| `18.element-text-variant-heading-subheading-retired` | a stored page
replays the rewrite at rehydration; a page component's `properties` is
not parsed on the save path, and the component-props gate reports an old
spelling as a `component-props-invalid` error, carrying the
prescription, on `os validate`, `os build` and `os lint`. | a stored
page replays the rewrite at rehydration and still loads, because a page
component's `properties` is not parsed on the metadata load path, and
the next save of the page meets the component-props gate at the metadata
save door. The gate reports an old spelling as a
`component-props-invalid` error, carrying the prescription, on `os
validate`, `os build` and `os lint` and at that save door. |
### Shipped text: `.d.ts` TSDoc
| Site | Old | New |
| :--- | :--- | :--- |
| `packages/spec/src/ui/component.zod.ts`, `exportOptions` | Read by the
component-props gate (refused as an error); a stored page still saves
and loads, because page-component `properties` is not parsed on the
metadata save or load path | Read by the component-props gate (refused
as an error) on `os validate`, `os build` and `os lint` and at the
metadata save door. A stored page still loads, because page-component
`properties` is not parsed on the metadata load path, and its next save
meets the component-props gate at the save door |
### Docs
| Site | Old | New |
| :--- | :--- | :--- |
| `content/docs/deployment/cli.mdx`, stored-shapes table, refused-shape
row | a page still loads and saves while `os validate`, `os build` and
`os lint` refuse the binding in source | a page still loads, its next
save is refused at the metadata save door (422), and `os validate`, `os
build` and `os lint` refuse the binding in source |
### Code comments: 21 step-18 entry headers (not shipped text)
The same sentence in every header, one transform: `… is not parsed on
the metadata save or load path, so a stored page is never refused at
load …` → `… is not parsed on the metadata load path, so a stored page
is never refused at load (its next save meets the component-props gate
at the metadata save door) …`. Two headers said "never refused" with no
"at load", which is also false since the save door gates. They now read
"never refused at load (its next save …)". Only the paragraph holding
the sentence is re-wrapped.
`18.ui-action-group-menu-member-params-array-only`,
`18.ui-action-group-menu-members-typed`,
`18.ui-object-form-custom-fields-typed`,
`18.ui-object-form-fields-names-typed` (was "never refused"),
`18.ui-object-form-members-typed`, `18.ui-object-form-sections-typed`,
`18.ui-object-gantt-markers-typed`, `18.ui-object-grid-columns-typed`,
`18.ui-object-grid-export-options-closed`,
`18.ui-object-grid-kanban-calendar-list-members-typed`,
`18.ui-object-grid-row-members-typed`,
`18.ui-object-kanban-conditional-formatting-typed`,
`18.ui-object-map-gantt-tree-navigation-typed`,
`18.ui-object-master-detail-form-details-closed`,
`18.ui-object-metric-aggregate-trend-typed`,
`18.ui-object-metric-compare-to-typed`,
`18.ui-object-metric-drill-down-report-typed`,
`18.ui-object-metric-drill-down-typed`,
`18.ui-object-timeline-items-typed`,
`18.ui-object-timeline-mapping-typed` (was "never refused"),
`18.ui-record-line-items-props-closed`.
The card counted eleven. The criterion grep finds more, because the
sentence often breaks across comment lines (`save or` / `load path`), so
the sweep matched the joined text.
## Left alone, on purpose
- `18.ui-page-action-row-declarative-update-rules.ts`: PR #23784
rewrites this exact line (its diff carries "at `os validate`, `os
build`, `os lint` and the metadata save door"). Excluded by the claim.
- `packages/spec/src/conversions/refused-shapes.test.ts:425`: it quotes
the *old* fate as history ("Until the page parse judged this binding the
fate read …"). It makes no claim. The file is also PR #23784's.
- `content/docs/releases/v17/17-7.mdx:456-457` and the
`packages/*/CHANGELOG.md` entries: release-owned. A correction there is
a docs-only PR, not part of this one.
## Verification
- Criterion grep `git grep -nE "not parsed on the (metadata )?save|still
saves and loads|loads and saves" -- packages/spec/src content/docs` on
this head: 3 hits. None is a live claim this PR owns:
`content/docs/releases/v17/17-7.mdx:456` (release-owned),
`refused-shapes.test.ts:425` (quoted history, PR #23784's file) and
`18.ui-page-action-row-declarative-update-rules.ts:26` (PR #23784
rewrites it). On `main` (`b485122`) the same grep found 21 hits. The
sweep also caught the sentences that break across comment lines, which a
line grep cannot see.
- `pnpm --filter @objectstack/spec build`: exit 0.
- `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2
src/migrations src/ui/component`: 31 files, 1676 tests passed.
- `pnpm --filter @objectstack/spec typecheck`: exit 0.
- Derived gate list: `node scripts/pm/dispatch-gates.mjs --commands
--repo objectstack-ai/objectstack`, 104 commands once the changeset
existed. Each runs with its exit code captured before any pipe. Their
per-command results are in the `os-dev-report` comment on #23789, and CI
runs the full farm.
- Changeset: `@objectstack/spec` patch. The `reason` strings and the
TSDoc ship in the package.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01BYTVP3rWqkXqY8sfHuWGCD)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent ae0ca66 commit f846cc2
27 files changed
Lines changed: 168 additions & 132 deletions
File tree
- .changeset
- content/docs/deployment
- packages/spec/src
- migrations/entries/semantic
- ui
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1491 | 1491 | | |
1492 | 1492 | | |
1493 | 1493 | | |
1494 | | - | |
| 1494 | + | |
1495 | 1495 | | |
1496 | 1496 | | |
1497 | 1497 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
36 | | - | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
37 | 38 | | |
38 | | - | |
| 39 | + | |
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
14 | | - | |
15 | | - | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
| 13 | + | |
13 | 14 | | |
14 | | - | |
15 | | - | |
| 15 | + | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | | - | |
46 | | - | |
47 | | - | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | | - | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | | - | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
0 commit comments