Repository navigation
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
Conversation
…s row say a page's next save meets the component-props gate at the metadata save door Since validateComponentProps / validateComponentTypes run on the runtime-publish surface for `page`, the metadata save door judges a page component's `properties`. Three shipped step-18 `reason` strings, the `exportOptions` TSDoc, twenty-one step-18 entry header comments and the stored-shapes table in deployment/cli.mdx still said the save path does not parse it. The load half stays: a stored page still loads. Text only; no accept set moves. Claude-Session: https://claude.ai/code/session_01BYTVP3rWqkXqY8sfHuWGCD Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BYTVP3rWqkXqY8sfHuWGCD Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. What this run could not see
Coarse fallback — 142 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 5c991ca6c6d14b05a5abce1032d2aff1d5ded832 && git checkout 5c991ca6c6d14b05a5abce1032d2aff1d5ded832
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 9d4fb3c306b09bdc87ce8423d052650f074cc115 a4a378d24d5171e092de9f22b59830fb312aac10 && git checkout -B drift-repro 9d4fb3c306b09bdc87ce8423d052650f074cc115 && git merge --no-ff a4a378d24d5171e092de9f22b59830fb312aac10
node scripts/docs-audit/affected-docs.mjs --json 9d4fb3c306b09bdc87ce8423d052650f074cc115 |
席位核对 — ACCEPT · objectstack
|
Fixes #23789
Clause-②: no
Text only. No accept set, export or generated artifact moves.
Why
validateComponentPropsandvalidateComponentTypesrun onsurfaces: CLI_AND_RUNTIMEwithruntimeTypes: ['page'](packages/lint/src/authoring-rules.ts, read onmainatb485122). Theruntime-publishsurface is the metadata write path's publish gate: an activesaveMetaItemand the draft-to-active promotion. So the metadata save door judges a page component'sproperties. 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 parseproperties. 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'spropertiesis 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
reasonstrings (printed byos migrate metaand the upgrade guide)18.ui-page-action-row-operation-declaredpropertiesis 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'soperationoronSuccess.propertiesagainst these same rows and reports the refusal at the row'soperationoronSuccessonos validate,os buildandos lint. A stored page still loads, because a page component'spropertiesis 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-typedpropertieson 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 acomponent-props-invaliderror at the offending path onos validate,os buildandos lint, …propertieson 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 acomponent-props-invaliderror at the offending path onos validate,os buildandos lintand at that save door, …18.element-text-variant-heading-subheading-retiredpropertiesis not parsed on the save path, and the component-props gate reports an old spelling as acomponent-props-invaliderror, carrying the prescription, onos validate,os buildandos lint.propertiesis 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 acomponent-props-invaliderror, carrying the prescription, onos validate,os buildandos lintand at that save door.Shipped text:
.d.tsTSDocpackages/spec/src/ui/component.zod.ts,exportOptionspropertiesis not parsed on the metadata save or load pathos validate,os buildandos lintand at the metadata save door. A stored page still loads, because page-componentpropertiesis not parsed on the metadata load path, and its next save meets the component-props gate at the save doorDocs
content/docs/deployment/cli.mdx, stored-shapes table, refused-shape rowos validate,os buildandos lintrefuse the binding in sourceos validate,os buildandos lintrefuse the binding in sourceCode 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 feat(spec)!: delete checkPageComponentViewData; the component-props rule is the one judge of a page component's retired api data binding #23784 rewrites this exact line (its diff carries "atos validate,os build,os lintand 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 feat(spec)!: delete checkPageComponentViewData; the component-props rule is the one judge of a page component's retired api data binding #23784's.content/docs/releases/v17/17-7.mdx:456-457and thepackages/*/CHANGELOG.mdentries: release-owned. A correction there is a docs-only PR, not part of this one.Verification
git grep -nE "not parsed on the (metadata )?save|still saves and loads|loads and saves" -- packages/spec/src content/docson 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 feat(spec)!: delete checkPageComponentViewData; the component-props rule is the one judge of a page component's retired api data binding #23784's file) and18.ui-page-action-row-declarative-update-rules.ts:26(PR feat(spec)!: delete checkPageComponentViewData; the component-props rule is the one judge of a page component's retired api data binding #23784 rewrites it). Onmain(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.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 theos-dev-reportcomment on spec(migrations): three shipped step-18reasonstrings, theexportOptionsTSDoc and the stored-shapes table still say a page's component props are not judged on the metadata save path, which PR #23418 made false #23789, and CI runs the full farm.@objectstack/specpatch. Thereasonstrings and the TSDoc ship in the package.Generated by Claude Code