Repository navigation
feat(spec)!: delete checkPageComponentViewData; the component-props rule is the one judge of a page component's retired api data binding - #23784
Conversation
…t's retired api data binding on the props rule (WIP, red until the narrow judge goes) Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
… one judge of a page component's retired api data binding Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
…ing is gone with the page-parse judge Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
…-parse refusal Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 2 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
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 7e85c2bae22e9a51ee57bf3ff447fdef292af792 && git checkout 7e85c2bae22e9a51ee57bf3ff447fdef292af792
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 0af559e806ec892402c9d7c04e5f003d0a73de78 7c25be0a841e7bb997814a2bf83d3b7fb216479f && git checkout -B drift-repro 0af559e806ec892402c9d7c04e5f003d0a73de78 && git merge --no-ff 7c25be0a841e7bb997814a2bf83d3b7fb216479f
node scripts/docs-audit/affected-docs.mjs --json 0af559e806ec892402c9d7c04e5f003d0a73de78
|
Contract reviewServed-tier: Face: published schema ( ① Derived judgments
② Semver level
③ Boundary flagsDev deviations (report
Open question 1, the stale "not parsed on the metadata save or load path" family outside this card's surface: ESCALATED, option A. PR #23418 ( Open question 2, the pending 23357 note: ESCALATED to the seat, with a judgment. On the day it ships beside this PR's note, four of its sentences are false: "is now refused by Card item 3 (re-measure the stored-page fate before rewriting it): measured before the rewrite and committed as a pin — boot Check-runs on Implemented-by: VERDICT: PASS |
Maintainer confirmation: the pending 23357 release note is corrected in this PR (DELIBERATE CORRECTION) · recorded by
|
…lete-page-view-data-judge # Conflicts: # packages/spec/src/ui/object-refinement-check-exports.test.ts # packages/spec/src/ui/page.zod.ts
…on the merged tree Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
…reason with the save-door phrasing Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
Correction to
|
Supersedes
|
…retired arm Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
Waiting: the 23357 correction needs a permission the dev session lacks ·
|
…e refuses the binding and a stored page carries no read diagnostic (deliberate correction) Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j Co-authored-by: Claude <noreply@anthropic.com>
|
Update to Generated by Claude Code |
Contract reviewServed-tier: DELTA record over the prior PASS What the delta is. Five first-parent commits since ① Derived judgments
② Semver level
③ Boundary flagsDev deviations and open questions across the three delta reports (
Check-runs on Implemented-by: VERDICT: PASS |
席位核对 — ACCEPT · objectstack
|
Fixes #23447
Clause-②: yes
Ruling
6161173492on #23388, item 6, verbatim:PR #23418 (
d0c09e47c1) putvalidateComponentPropson the runtime save door forpagewrites. This PR deletes the page-parse judge that duplicated it, rewrites the sentences that became false, and re-pins the save door on the props rule.What changes
packages/spec/src/ui/page.zod.ts):checkPageComponentViewData,VIEW_DATA_SOURCE_COMPONENT_TYPES, their docblocks, the.superRefineonPageSchema, and the now-unusedViewDataSchemaimport. The published export leaves@objectstack/spec/ui;api-surface/ui.jsonandexport-origins/ui.jsonwere regenerated withcheck:generated --fix(one line each).page-component-view-data.test.tsis deleted, since its subject is gone. Its reach and control cases move to the save-door pins below, which run the real rule. Inobject-refinement-check-exports.test.tsthe judge's fixtures and rows are removed, and absence pins (0 declarations, 0 attachments, not in the barrel) follow thecheckListViewPageMountprecedent.refused-shapes.tsdocblocks andCOMPONENT_API_BINDING_FATE, with their tests;18.view-data-api-provider-retired.tsacceptanceCriteria;18.ui-page-action-row-declarative-update-rules.tsreason;validate-component-props.tsheader ("does not run this rule" at the runtime publish door);view.zod.tscomment;PageSchematrailing comment ("five checks" is now four).packages/metadata-protocol/src/protocol.runtime-authoring-gate.test.ts, new describe after the [Decision] Pages saved through Studio, REST or MCP skip the component-props rule thatos validaterefuses: cross it to the runtime door, and on what evidence #23388 block). They run the realsaveMetaItem/loadMetaFromDb/getMetaItempath:object-grid,object-map,object-ganttandobject-tree→422 INVALID_METADATA,rulesRuncontainsvalidateComponentProps, onecomponent-props-invalidissue carrying the prescription atpages[0].regions[0].components[0].properties.data.provider, nothing stored;page:tabsitem, a component nested inflex›page:card, and a slot;provider: 'object'andprovider: 'value'save, one row each;loadMetaFromDb→loaded: 1, errors: 0, invalid: 0, the page is registered, nometadata_spec_invalidwarning,getMetaItemserves it as stored with_diagnostics.valid: true, its next save is refused by the props rule with the row unchanged, and the fixed page saves.#23357block inprotocol.save-union-issues.test.ts(a spec-parsecustomissue, plus a read-path_diagnostics.valid: falsepin, which is now false) is removed.Each door, before and after (measured)
29c7157af4)PageSchema.safeParse/definePage/defineStackcustomatregions.0.components.0.properties.data.provider(and at each nested and slot position)os validate(built CLI,defineStackconfig)defineStack validation failedwith the prescriptioncomponent-props-invalid at pages[0].regions[0].components[0].properties.data.providerwith the prescription; the control config (provider: 'object') passes, exit 0os builddefineStackcomponent-props-invalidfinding; control exit 0saveMetaItemINVALID_METADATA,failed spec validation, issuecode: custom, norulesRunINVALID_METADATA,failed author-time validation, rulecomponent-props-invalid,rulesRuncontainsvalidateComponentProps, nothing storedloadMetaFromDbloaded: 1, errors: 0, invalid: 1,[metadata_spec_invalid]warningloaded: 1, errors: 0, invalid: 0, registered, no warninggetMetaItem_diagnostics.valid: falsewith the refusal at the component_diagnostics.valid: trueRule-level reach, the same before and after (the probe ran
validateComponentPropson 10 page bodies, with identical output on both trees): one finding per binding on all four types, the bare{ provider }, apage:tabsitem,flex›page:card› component,slots.detailsandslots.header[0]. No finding on theobjectandvaluecontrols or on a custom type. Anobject-kanbancarrying the binding drawscomponent-props-invalidatproperties.data(expected array), which is its own row's verdict, as before.Merge with main
origin/main43567a8f(PR #23708, PR #23800 included) was merged in at4087b452, throughscripts/pm/os-regen-merge.sh:packages/spec/src/ui/page.zod.ts: Conflict at the PageSchema superRefine chain. Kept main's checkPageDefaultPlacement and checkPageRegionPlacement (PR feat(spec)!: a page declares nothing the console does not honour — isDefault only on a bound record page, a closed template set, regions its template places #23708, spec:PageTypeSchemasayshomeis "the platform-level landing page" andutilitya "floating utility panel", but the landing is the first navigation item and both types render as ordinary inline pages #23610 ruling A), dropped the deleted checkPageComponentViewData. The trailing comment reads 'the six checks above', and the props-bag sentence stays.packages/spec/src/ui/object-refinement-check-exports.test.ts: 5 hunks: main's side in each, minus every checkPageComponentViewData line, i.e. the import, the view-data fixture block (main's spec:PageTypeSchemasayshomeis "the platform-level landing page" andutilitya "floating utility panel", but the landing is the first navigation item and both types render as ordinary inline pages #23610 fixtures kept), the MIRRORED row and the barrel row. The leg-3 'declares all six exports' loop names the 4 old checks plus the 2 new ones. This PR's 0-declaration, 0-attachment and barrel-absence pins are kept.packages/spec/api-surface/ui.json, packages/spec/export-origins/ui.json: os-regen driver, not text-merged. Step 2 took main's side, the merge commit was the deferral, then rebuild + gen:api-surface + gen:export-origins on the merged tree, committed as 392224e. The deferral was discharged. Delta vs origin/main: exactly one removed line in each (checkPageComponentViewData). main's 9 new ui exports are present.packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-declarative-update-rules.ts: No conflict: PR 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 left this line to this PR. Aligned with 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's wording precedent: '... the load path runs no such gate, so a stored page still loads and its next save meets the component-props gate at the metadata save door.'DELIBERATE CORRECTION
File:
.changeset/pre/23357-page-component-view-data-api-refused.md, commit7c25be0a.18.0.0-next.2consumed the note, and the 18.0.0 GA entry is compiled from.changeset/pre/again (release.yml: "Onpre exitthe GA version consumes them all again"). This PR makes the following sentences false, and each is rewritten in place, measured against this PR's head:dataprop that names the retired view-levelapidata source is refused at the Studio, REST and MCP save door asos validaterefuses it".PageSchema" and "the component-props gate … runs at the CLI doors only" → the props gate (validateComponentProps, rulecomponent-props-invalid) refuses it atos validate,os build,os lintand the metadata save door. The CLI-only fact now reads as history: "before 18".codeiscustom…)" → the props row parsesdatawithViewDataSchema, and the finding carries that schema's prescription. The row-array types are refused for their shape, not with this prescription. ThecheckPageComponentViewData… re-attach sentence is deleted.definePage(),defineStack({ pages })… refuse the page" →os validate/os build/os lintandPUT /api/v1/meta/page/:namerefuse it;definePage()anddefineStack({ pages })run no authoring rule and accept it.[metadata_spec_invalid]with the refusal in the_diagnosticsof every read" → served as stored, with no read diagnostic for the binding; the next save is refused with 422 by the props gate. objectui#12325 is now in the console pin, so the sentence changes from "until then a stored page keeps sending it" to "so a stored page does not send the request".Authority: the maintainer's 「同意」, recorded in
6210183493, as applied by6210987382(which supersedes6210952492), with PR #23418's6203578381as the precedent.packages/spec/CHANGELOG.mdis untouched.Check Changesetreds by design on this edit (check-empty-changeset: DELIBERATE CORRECTION class); it is not a required context and runs only onpull_request.Verification
Final head
7c25be0a(rounds after the merge).dispatch-gates --commands: 90 derived, 89 run, 1 NOT-MEASURED (check:dual-build-cjs-loads, left to CI). 88 exit 0, pluscheck-empty-changesetexit 1, by design, for the DELIBERATE CORRECTION class.check-adr-0087-registrationandcheck-changeset-no-majorexit 0. On39977e95: spec 682 files / 20873 tests, lint 140 files / 6781, metadata-protocol pin files 170/170, typechecks exit 0. On40624b32:refused-shapes.test.ts+object-refinement-check-exports.test.ts284/284,check:generatedandcheck:doc-authoringexit 0.7c25be0aadds only the changeset text.Round 1 (before the merge):
Ablation of the general rule's runtime face:
validateComponentProps's entry was set tosurfaces: ['cli']withruntimeTypesremoved (throughscripts/ablation-replace.mjs).@objectstack/lintwas rebuilt, andablation-dist-preflightfound the marker in 4 built files. Result: the 6 refusal pins went red and the control stayed green. On restore, the blob matched the HEAD hash, the rebuild passed--absentwith a clean tree, and the whole file is green at 145/145.@objectstack/metadata-protocol:pnpm test, 236 files and 20580 tests passed;pnpm typecheckexit 0.@objectstack/spec: fullpnpm testshowed one failure (a missed#23357half inrefused-shapes.test.ts), which is fixed. Re-run:refused-shapes.test.tsandobject-refinement-check-exports.test.ts250/250, andpnpm typecheckexit 0.@objectstack/lint:pnpm test, 139 files and 6771 tests passed;pnpm typecheckexit 0.check:generated: 2 artifacts were stale (api-surface,export-origins) and were regenerated; the other 12 were up to date.check:adr-0087-registration:[BREAKING+bang+clause-②-narrowing] not-required (already-registered).The derived gate families (
dispatch-gates --commands, 90 commands) were run locally; their results are in the report comment on page: deletecheckPageComponentViewDataonce PR #23418 moves the component-props rule onto the save door — ruling6161173492item 6, the follow-up for #23357 #23447.Acceptance notes
reasonstrings, 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) rewrote them and landed before this PR mergedmain. The one line it left for this PR, in18.ui-page-action-row-declarative-update-rules.ts, now follows 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's wording.18.0.0-next.2into.changeset/pre/, and the 18.0.0 GA entry is compiled from there again. It is corrected in place: see## DELIBERATE CORRECTION. The publishedpackages/spec/CHANGELOG.mdentry is untouched.@objectstack/lint: patchwas dropped from this PR's changeset. The lint diff is the file-top comment ofvalidate-component-props.ts, and no changeset gate asks for it.COMPONENT_API_BINDING_FATE(refused-shapes.ts) now says the console no longer reads the retired arm. objectui#12325 has been in the console pin since PR chore(objectui): move the console pin to 1f23d5b070fa, carrying objectstack-ai/objectui#12475 and objectstack-ai/objectui#12493 #23709 (53e3638e)._diagnosticsfield is not absent after the change: it readsvalid: true, and the pin asserts that.Generated by Claude Code