Repository navigation
docs(guide): slotted-pages header example keeps only PageHeaderProps keys; pin it (objectui#11165) - #11339
Conversation
…keys; pin it (objectui#11165) The "customize only the header" example wrote `eyebrow` (never declared by PageHeaderProps) and `icon` (an ADR-0087 D2 tombstone) on its `page:header` node, so a reader who copied it got a node `safeValidateSchema` and the `ComponentPropsMap['page:header']` row both refuse. Drop both keys and point the section at the Page Header reference for the prop list. `breadcrumb: true` stays; it follows its own card. A new pin in `examples/schema-catalog/test` reads the example's fence from the page, evaluates it, and asserts the header node passes the schema mirror and the spec row's full parse. Its control is the same node with `eyebrow` and `icon` put back, refused by both judges on exactly those two keys. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh
|
changeset-claim-re-read
|
… slotted-pages.md (objectui#11165) The new pin in examples/schema-catalog/test evaluates the "customize only the header" fence off content/docs/guide/slotted-pages.md, so that page is a test input. Record it in ADJUDICATED so a markdown-only change to the page runs the shard instead of skipping it; the ledger audit reported it as an unadjudicated candidate. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh
Fixes #11165
Clause-②: no
What changed
content/docs/guide/slotted-pages.md, "Example: customize only the header":slots.headerkeeps only keysPageHeaderPropsaccepts.eyebrow(never declared) andicon(ADR-0087 D2 tombstone) are gone. A short lead-in now points at the Page Header reference for the prop list.breadcrumb: truestays, per the dispatch ruling: it follows its own card (objectui#11166), and this PR does not touch it.examples/schema-catalog/test/slotted-pages-header-example-11165.test.ts, beside the nearest docs-example pin for this node (pageheader-with-actions.test.tsx, which pins thepage-header.mdxdemo). No test readslotted-pages.mdbefore this. The pin reads the fence from the page and evaluates it (thereadme-dashboard-examples-spec-valid.test.tstechnique), so it follows the page and does not restate the node. It asserts:safeValidateSchema(the schema mirrorobjectui validateruns);propertiespassComponentPropsMap['page:header']in a full parse;eyebrowandiconput back (the node the page taught before) is refused by both judges on exactly those two keys.Re-measure at base
5262f7dd3, before any editsafeValidateSchema(old node):properties.icon: invalid_type,properties: unrecognized_keys [eyebrow]. Without the two keys: OK.PageHeaderProps.safeParse(old properties):icon: invalid_type,: unrecognized_keys [eyebrow]. Without them: OK.PageSchemaparses OK with or without the two keys. The page shape does not judge a component'spropertiesby itstype, so the pin asks the row.Rest of the page (same defect class:
page:*nodes carrying keys their row refuses)Measured at base. Every
page:*node on the page passessafeValidateSchema,PageComponentSchemaand its row. The only defect was the example above.regionsfence under "The discussion panel is composed, never appended":page:headerwithtitle. OK.page:headerwithtitle,actions. OK.page:headerwithtitle,maxVisible. OK.Verification (head
ca770c6a)pnpm exec vitest run --maxWorkers=2 examples/schema-catalog/test/slotted-pages-header-example-11165.test.tsgivesTests 4 passed (4). Run under the shared verify lock atca770c6a, after the ablation restore.scripts/ablation-replace.mjs(objectstack checkout) plantedeyebrow: 'ACCOUNT',back into the page fence. Anchor x1 to x0, blob4d1327d81019to7c97d87158d5. Result:Tests 2 failed | 2 passed (4). Both positive legs went red, withproperties: unrecognized_keys eyebrow(mirror) and: unrecognized_keys eyebrow(row). The lit control and the refusal control stayed green. Restore: blob back to4d1327d81019= HEAD,git diff HEADempty. My first attempt was a no-op that the tool refused: its replacement contained its anchor, so the anchor count could not drop. It restored without running the test.ca770c6a, each exit 0:check:doc-fences(--self-testand scan);docs:check-links: "Links are valid across 17 scan roots";check:control-bytes;check:doc-types;check:doc-example-ids;check-new-cross-file-line-citations: 0 new;check-test-path-roots: the new read is classified, not cwd-rooted;check-lint-coverageandcheck-type-check-coverage;check-changeset-presence: "no changeset is owed". This is a docs and test-only change, so there is no changeset and noskip-changesetlabel.eslint --no-inline-config --format jsonon the two changed files. The test file was linted: 0 errors, 0 warnings. The.mdis outside eslint's own population ("File ignored because no matching configuration was supplied").eslint.config.jsenables no type-aware linting, so this diff cannot move any untouched file's verdict. The fullpnpm lintrun belongs to CI.NOT MEASURED locally (owed to CI)
check:doc-snippets(check-doc-snippet-types.mjs). The gate needs its 35-package--build-filterclosure built. That was not run, because three devs share this container's memory. Narrowed instead: the edited fence alone was compiled withtsc --strictagainst the installed@objectstack/spec, and exited 0. The pre-fix fence also compiles (exit 0), which is why no snippet gate saw this defect. A control with an unknown page-level key fails TS2353, so the program does type-check. The fence imports only@objectstack/spec/ui, so no objectuidistenters its program, and no other fence's bytes changed.type-checkof@object-ui/example-schema-catalog. It needs that package's devDependency closure built. Narrowed instead:@object-ui/typeswas built (the new test's only workspace import), and the new test file alone was compiled under a temporary config extendingtsconfig.test.json. Exit 0, and the file appears in--listFiles.pnpm test, andunit-registry-absence-collisionfor the new unit-project file. The new file imports only@object-ui/types/zodand@objectstack/spec/ui, and neither registers a component.Acceptance notes
Brief vs triage on
breadcrumb. The triage comment's direction droppedbreadcrumbtoo, citing objectui#11166's RETIRE ruling. The dispatch ruling and the claim keep it, so it stays. When the spec tombstonesbreadcrumb, this pin's row leg goes red. That is the prompt for objectui#11166 to edit this example.Out of the brief's
page:*scope, not touched. Therecord:related_listJSON fence under "Naming a related list's actions" writes its props besidetype, not inproperties. Measured at base:safeValidateSchemaaccepts it;PageComponentSchemarefuses it with: unrecognized_keys [objectName, relationshipField, columns, actions];Page(regions[].components[]),PageSchemarefuses it withregions.0.components.0: unrecognized_keys.It goes to the dispatch report as a finding for the seat to grade.
Dev session:
https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh.Generated by Claude Code