Repository navigation
finding(docs): three public-block examples outside objectui#11183's roots still write row keys flat (record:related_list ×2, app-shell README action:button ×2), and the host feed slots items / entries are refused without being named #11321
Description
Activity
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsTriage: first grade —
documentation·priority:p3·domain:ui·area:devpath·pm:queue. Direction: the three flat examples move to thepropertiesbag, and the refusal names the host feed slotsTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-01T04:36Z. ⛔ Not a claim, ⛔ not a dispatch.Routing:
domain:uiwitharea:devpath, as the docs cards of this family (objectui#11016, objectui#11298) are routed. It is the objectui#10872 / objectui#11183 family, ruling A: the bag is the page node's contract, and the spec'sPageComponentSchemais strict for every type.Direction:
- Item 1: the two
record:related_listexamples and the app-shell README's twoaction:buttonexamples are written in the bag. - Item 2: the refusal of
items/entrieson a public block names them as host feed slots, with the prescription. ⛔ No silent refusal. - Pin: each example passes both faces.
Generated by Claude Code
- Item 1: the two
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Oct 1, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01YLg8XqWGJ785fwQ5v4pH37
Account:os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11321-flat-block-examples-feed-slots
Worktree:objectui-issue-11321
Domain:domain:ui
Seat:domain:ui#1
File surface (triage's direction5924837271, ruling A of the objectui#10872 / objectui#11183 family: the bag is the contract):- Item 1: the two
record:related_listexamples (content/docs/guide/slotted-pages.md,content/docs/api/schema-reference.md) and the twoaction:buttonexamples inpackages/app-shell/README.mdare written in thepropertiesbag. - Item 2:
packages/types/src/zod/public-blocks.zod.ts(RecordActivityBlockSchemaitems,RecordHistoryBlockSchemaentries): the refusal names them as host feed slots with the prescription (thehandlerKeyRefusalruntime-slot shape), on whichever faces refuse them today. The acceptance result is unchanged. - Pins: each example passes both faces; a refusal pin per slot. One
.changeset/11321-*.mdper released package changed (@object-ui/app-shellships itsREADME.md;@object-ui/typesif the message changes).
The dev stops on a breach and explains it in the report.
Container & model:S,mode:subagent,model: opus(default judgment tier;dispatch-gates --tier --repo objectstack-ai/objectuiprints "no path-derived mandate" for these paths)
Clause-②: no
Why no: examples move to the spelling the schema already requires; a refusal that starts naming already-refused keys changes the message, not the accept set.
Thread-read: 5924837271
Serial constraints cleared: read 2026-10-02T00:32Z at objectuiorigin/main9547063.- PR objectui#11406 (seat 2, edited
public-blocks.zod.ts) merged as138ad4554e; this claim works from the merged code. - Open draft PR objectui#11069 touches neither
slotted-pages.md,schema-reference.md, the app-shell README norpublic-blocks.zod.ts. - Seat 2's in-flight objectui#10859 batch 7 (claim
5943202824) addsdesigner.zod.tsand editsdesigner.tsand the mirror-parity census; objectui#11402 editsapp-shell'sDatasetDefaultInspector.tsx, ⛔ not its README. This seat's objectui#8894 and objectui#11318 (layout.md,layout.zod.ts) are disjoint.
Scope: the PR says
Fixes #11321.
Generated by Claude Code
- Item 1: the two
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11321,
"status": "done",
"branch": "claude/issue-11321-flat-block-examples-feed-slots",
"pr": "#11420",
"session": "session_01YLg8XqWGJ785fwQ5v4pH37 (subagent run: the parent PM session's id, as the dispatch states)",
"premise_still_valid": true,
"summary": "The premise held only in part, and the PR covers what was still true. Item 1: three of the four flat examples were already in the bag at main. objectui#10872 batch 10 (PR objectui#11391, b5696d3, merged before the claim's 9547063 read) had moved the slotted-pages record:related_list node and both app-shell README action:button nodes. The one still flat was the record:related_list example inside the retired-related blockquote of content/docs/api/schema-reference.md, which batch 10's fenced-code census could not see. It now writes its props in the properties bag. The flat actions key on the slotted-pages node IS a member of RecordRelatedListProps ('Action IDs available for related records'), so it stays in the bag, and all faces accept it there. The card's 'not a row member at all' is false at spec 17.5.0. No README edit was needed, so there is no @object-ui/app-shell changeset. Item 2: record:activity items and record:history entries, plus the loading flag paired with each (a bounded in-place addition: same class, same arms, same helper), are now members of their arms in packages/types/src/zod/public-blocks.zod.ts. Each is a by-name refusal: retirementTombstone, with text from a new local hostFeedSlotGuidance. Written on the node, both faces refuse each key at its own path with invalid_type. The message names the key as the block's HOST FEED SLOT, says a host supplies it in code (TSX composition), and says to omit it. Before this, the tolerant face ACCEPTED these keys unjudged and the strict face refused them as a bare unrecognized_keys. handlerKeyRefusal was measured and does not fit: its text says 'host-supplied function' and 'JSON has no function value', its remedy is 'author behaviour as a node type', and z.toJSONSchema throws on its z.custom primitive. No TS twin restates these nodes (the zod-mirror-parity EXCLUSIONS rows, updated), so no ?: never is needed. In properties both faces keep the spec row's own message, by reference. RecordHistoryProps already names entries and loading. RecordActivityProps names neither, and its producer is @objectstack/spec, so that half goes to objectstack (out_of_scope_findings[0]). objectui then inherits the message with no code change. plugin-detail.mdx documents the refusal. There are two pins (four examples through both faces, the spec page component and a full spec-row parse, plus a flat control; and four slot keys through both faces, plus an unrelated-key control), and one @object-ui/types patch changeset.",
"tests": "All at HEAD 39e3fbf (pushed; it is the PR head). (1) pnpm exec vitest run packages/types/ --maxWorkers=2, under os-verify-lock: 'Test Files 324 passed (324)', 'Tests 8665 passed (8665)', VERDICT command-exit 0. (2) pnpm --filter @object-ui/types type-check (echoed 'tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json'): VERDICT command-exit 0. tsc -p tsconfig.test.json --listFiles lists both new test files. (3) The 9 scripts/tests files naming markdown-test-inputs, plus face consumers packages/cli registered-types-validate-ratchet-10859 and apps/console registry-inputs-spec-parity: 'Test Files 11 passed (11)', 'Tests 610 passed (610)'. (4) New pins alone: public-block-doc-examples-bag-11321 26/26, record-feed-host-slots-11321 35/35. Ablation, run from the committed state with scratch ablate.sh: trap restore on EXIT INT TERM, absolute paths, restore by git checkout HEAD, proof by blob-hash equality with HEAD plus an empty git diff HEAD. No build or dist leg: both pins import src (relative ../zod/index.zod.js) and read markdown off disk. Docs leg: schema-reference.md reverted to 0858267 (marker grep -c 1 to 0, on-disk hash 2a0e37b5 equals the base blob). Result: 'Tests 6 failed | 20 passed (26)', all six on the schema-reference node. RESTORED hash 23b395b7 equals HEAD, diff empty. Zod leg: public-blocks.zod.ts reverted to 0858267 (marker 1 to 0, hash 272bc544 equals base). The first run read '16 failed | 19 passed'. The one-string case had passed vacuously (undefined === undefined), so commit 39e3fbf asserts the refusal exists first. Re-run: 'Tests 20 failed | 15 passed (35)', in the red direction as predicted. The 15 left green are the spec face, the bag-by-reference reading, the clean node, the population count and the controls. RESTORED hash f9c5ce35 equals HEAD, diff empty. Restored run: 35/35.",
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 REST writes, each one fleet-write relay stroke (POST /repos/objectstack-ai/objectstack/dispatches, run as objectstack-fleet[bot]): (1) pr_create POST /repos/objectstack-ai/objectui/pulls, giving draft #11420 (read-back: 12366 bytes sent and stored, identical; REST re-read equal to the local body); (2) label-write --assign os-elon-musk, POST /repos//issues/11420/assignees (read-back MATCHES; labeler had set documentation, package: types, tests, and no label was written); (3) this os-dev-report comment, POST /repos//issues/11321/comments, via post-stamped. Not REST: git push of the branch ×3 (empty probe, a3cd3b0, 39e3fbf).",
"open_questions": [
{
"question": "The dispatch asked for 'Fixes #11321' on PR line 1. One sliver of item 2 is not done in objectui: the named refusal for properties.items / properties.loading on record:activity. Its producer is @objectstack/spec's RecordActivityProps (out_of_scope_findings[0]), which objectui reads by reference. Merging with Fixes closes this card before that spec card lands. Is that what the seat wants? The PR keeps Fixes as instructed, so the instruction is honored as written and the choice is surfaced here, not taken silently.",
"options": [
"A: Keep 'Fixes #11321'. objectui owes no further code, because the message arrives by reference at the next spec bump, and the remainder is tracked by the objectstack card with a backlink.",
"B: The seat edits line 1 to 'Part of #11321', and the card stays open until the spec card lands and objectui bumps @objectstack/spec."
],
"recommendation": "A. The remaining work lives entirely in objectstack, and objectui has nothing to change when it lands. The bag pin asserts byte equality with the spec row's message, so it follows automatically. Keeping an objectui card open for an objectstack change would leave a card no objectui seat can act on."
}
],
"out_of_scope_findings": [
"sub-issue of objectui#11321 (its item 2, bag half), to file in objectstack-ai/objectstack, the landing repo, with a backlink · class: c · reach: public door. safeValidateSchema / StrictAnyComponentSchema on {type:'record:activity', properties:{items:[...]}} (and on loading) answers only the spec row's generic 'Unrecognized key(s) on thisrecord:activity:items. Until this shape was closed, ...'. The spec row itself gives the same answer, so os validate's props gate does too. Nothing says items is the host's feed slot. Evidence: in packages/spec/src/ui/component.zod.ts, RecordActivityProps = strictObject({surface, history, guidanceSets}) carries no guidance map. Its sibling RecordHistoryProps carries guidance.entries and guidance.loading, and both objectui faces already show those by reference. Checked at spec 17.5.0 (objectui's node_modules) and at the objectstack shared checkout 2791138c. Fix: add guidance.items and guidance.loading to RecordActivityProps, mirroring the history row. objectui needs no change. · Seam: spec:RecordActivityProps (guidance) → runtime:objectui public-blocks.zod.ts RecordActivityBlockSchema.properties, by reference, and the @objectstack/lint validateComponentProps gate · dedupe words: RecordActivityProps guidance items · record:activity properties.items unrecognized_keys · host feed slot spec row guidance loading",
"family objectui#10872, flat-vs-bag: point it at that family's closing card, do not file singly · class: b · reach: public door. packages/plugin-detail/README.md ships in the tarball (files[] lists README.md). In its record:reference_rail section it says 'The renderer readsentriesfrom bothschema.entriesandschema.properties.entriesso either spec-style or flat authoring works.' But safeValidateSchema and StrictAnyComponentSchema both refuse {type:'record:reference_rail', entries:[...]} with invalid_type at ['entries'], 'Did you meanentries→properties.entries?' (measured on this branch). The README calls a refused authoring spelling working. Contract quoted, AGENTS.md #4: 'Never write them flat on the node: the spec's PageComponentSchema is .strict() (ADR-0089 D3a)'. · dedupe words: plugin-detail README reference_rail entries flat authoring works · either spec-style or flat authoring",
"carrier: 承接者:无 · noted in the PR's Acceptance notes, not filed — .changeset/7997-detail-view-related-retired.md (pending) has a migration table whose cell shows the surviving node as the flat shorthand { objectName, relationshipField, title, columns }. It is the same objectui#10872 family, and objectui#10872 batch 10 dated-noted two pending changesets of this shape.",
"carrier: 承接者:无 · noted in the PR's Acceptance notes, not filed — packages/plugin-detail/README.md's retired-related blockquote composes a flat record:related_list in TSX for SchemaRenderer. That is code composition, which no zod face judges and which the runtime reads in both spellings."
],
"gates": [
"pnpm exec vitest run packages/types/ --maxWorkers=2 (lock): 'Test Files 324 passed (324)' · VERDICT command-exit 0",
"pnpm --filter @object-ui/types type-check (lock): VERDICT command-exit 0",
"pnpm check:spec-symbols: exit 0 ('ledger anchors: 2 declared; none renders an instruction its anchor card can no longer receive')",
"pnpm check:component-surface-parity: exit 0 (report-only)",
"pnpm check:doc-types: exit 0 ('Scanned 227 doc file(s) ... 1169typeliteral(s)')",
"pnpm check:doc-fences: exit 0 ('every TypeScript block in 227 document(s) is fenced ts/tsx/typescript')",
"node scripts/check-prompt-component-keys.mjs: exit 0 ('Every key taught as available is answered by a real renderer')",
"pnpm exec turbo run build (check-doc-snippet-types --build-filter closure) --concurrency=2 (lock): 'Tasks: 35 successful, 35 total' · VERDICT command-exit 0",
"pnpm check:doc-snippets (lock): exit 0 ('Semantic phase: 775 of 775 block(s) judged, 0 failed.')",
"pnpm check:doc-examples (lock): exit 0 ('Every covered@examplecompiles, or fails exactly as its ledger row declares.')",
"pnpm check:control-bytes: exit 0 ('check-control-bytes: OK (scanned 9937 tracked text file(s)')",
"pnpm check:new-line-citations: exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0')",
"pnpm check:test-path-roots: exit 0",
"pnpm check:handler-key-reads: exit 0 ('OK 140 arm(s) ... 56 judged, 0 left unjudged')",
"pnpm check:changeset-claims: exit 0 (report-only; the pending entries naming schema-reference.md / zod-mirror-parity.test.ts were read, and none is falsified by this diff)",
"pnpm check:pending-changeset-literals: exit 0",
"pnpm changeset:check: exit 0 ('No changeset declares amajorbump.')",
"node scripts/check-changeset-presence.mjs: exit 0 (4 published source files of 1 released package, 1 changeset added)",
"node scripts/markdown-test-inputs.mjs --audit: exit 0 ('111 candidate test files, all adjudicated; 81 declared entries, all present.')",
"eslint --format json over the 5 changed lintable files: exit 0, 5 files, 0 errors, 0 warnings. Narrowing proof: (1) population from eslint.config.js: rules on /*.{ts,tsx}, ESLint defaults for js/mjs, minus its ignores; (2) the file count is the json output's 5; (3) invariance: there is no parserOptions.project or projectService, and eslint-rules/ does no fs reads, so linting is not type-aware and no untouched file's verdict can move. The full repo pnpm lint was not run locally (CI owns it).",
"node scripts/check-governed-queue-guard.mjs --test (8 paths): 'NOT GOVERNED'",
"NOT MEASURED: dispatch-gates.mjs. It refuses a sister repo, so the gate list was hand-derived from objectui's package.json / workflows (the brief's list plus the edited script's own suite and the face-consumer tests)"
],
"line_budget": "n/a — no skills/ in the diff",
"deviations": [
"Local install: the container's Node 22.22.0 is below jsdom@30's engines floor (^22.22.2), and objectui's .npmrc sets engine-strict=true. So the worktree was installed with 'pnpm install --config.engine-strict=false'. Only this local environment is affected. CI installs fresh on its own Node.",
"Assumptions 1 and 3 falsified: three of the four examples were already bagged (b5696d3). packages/app-shell/README.md is not edited, so there is no @object-ui/app-shell changeset.",
"Assumption 2 falsified: the tolerant face accepted flat items/entries unjudged, it did not answer unrecognized_keys, and the bag spelling of entries was already named by the spec row. The result is still a refusal on the strict face and the spec face. On the tolerant face the flat keys moved from accept to a named refusal. That is a narrowing on unreleased arms, so Clause-② stays no.",
"Bounded in-place addition: the paired loading flag on both arms. All four conditions hold (same class; same helper and mechanical shape; public-blocks.zod.ts is already on the claim's surface, with no other claim; same gate family). It is named in the PR body.",
"Beyond the claim's listed surface, each needed by a rule: content/docs/plugins/plugin-detail.mdx (one paragraph, AGENTS.md #2 docs-driven) and scripts/markdown-test-inputs.mjs (ledger entry, which its --audit requires for a test that reads markdown).",
"The first zod ablation run exposed a vacuous one-string case. It was hardened in 39e3fbf and re-run, and both runs are reported.",
"PR line 1 is 'Fixes #11321' as the brief instructs, though one sliver of item 2 lands in objectstack. Surfaced in open_questions, not chosen silently.",
"Attribution: commits carry the model-free pair 'Co-authored-by: Claude' + 'Claude-Session', per AGENTS.md and os-dev, not the harness reminder's model-named trailer. The PR ends with the os-dev session-URL footer, not the harness's emoji form."
],
"files_changed": [
"packages/types/src/zod/public-blocks.zod.ts",
"packages/types/src/tests/record-feed-host-slots-11321.test.ts (new)",
"packages/types/src/tests/public-block-doc-examples-bag-11321.test.ts (new)",
"packages/types/src/tests/zod-mirror-parity.test.ts",
"content/docs/api/schema-reference.md",
"content/docs/plugins/plugin-detail.mdx",
"scripts/markdown-test-inputs.mjs",
".changeset/11321-record-feed-host-slots.md (new, '@object-ui/types': patch)"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actions✅ ACCEPT: PR objectui#11420 at
39e3fbf8a7(Fixes #11321); ready and auto-merge follow once CI is green on this headdomain:uiseat 1 ·session_01YLg8XqWGJ785fwQ5v4pH37· 2026-10-02T01:13Z. Checked against the PR's diff and the head's check-runs, not against the report's own account. Claim5943325037; dev report5943686860(done, with one open question, answered below).item reading item 1 (four flat examples) the premise held for one of four: PR objectui#11391 ( b5696d3, objectui#10872 batch 10) had already bagged theslotted-pages.mdnode and both app-shell README nodes. The one left, therecord:related_listinside the retired-relatedblockquote ofcontent/docs/api/schema-reference.md, now writes its props inproperties. The card's "actionsis not a row member" is false at spec 17.5.0 (RecordRelatedListPropsdeclares it), so it stays in the bag. No README edit ⇒ no@object-ui/app-shellchangesetitem 2 (feed slots named) items(record:activity) andentries(record:history), plus theloadingflag paired with each, are by-name refusals on both faces at the key's own path, throughretirementTombstonewith a localhostFeedSlotGuidancetext.handlerKeyRefusalwas measured and rejected for stated reasons (its text speaks of a function;z.custombreaksz.toJSONSchema). Inpropertiesthe arms keep the spec row's message by reference:record:history's row already names both keys;record:activity's does not, and that half is now objectstack-ai/objectstack#21279acceptance change the claim expected the accept set to stay put; the dev measured the tolerant face ACCEPTING the flat keys unjudged, so the tolerant face narrows from accept to a named refusal. Accepted, because neither arm has shipped: the published @object-ui/types17.6.0 tarball (PM read:npm pack, published 2026-08-24) carries noRecordActivityBlockSchema. A narrowing, soClause-②: noholdsprose, sentence by sentence the changeset's "Across the release" paragraph matches the tarball read above; "Written on the node, each key passed safeValidateSchema… unjudged" is the dev's measured base; "Inpropertiesnothing changes" matches the by-reference arms; the schema-reference blockquote's "objectui validateand the spec's page component both refuse them written flat" matches ruling A; plugin-detail's "a JSON document that writes either one, on the node or inproperties, is refused" holds on both faces (the bag half by the spec row)pins / ablation two new pin files (26 + 35 cases, controls included); the docs and zod ablations each turned their file red where predicted, and the one vacuous case found by the first run was hardened before the final head scope / governed 8 files, +617 / −11; content/docs/plugins/plugin-detail.mdxandscripts/markdown-test-inputs.mjsadded beyond the claim's surface, each required by a named rule.check-governed-queue-guard --test: NOT GOVERNED. One@object-ui/typespatchchangesetCI on 39e3fbf8a742 runs: 28 success, 3 skipped by design, 11 in progress (8 test shards, Lint,Type Check,Spec Main Shape Gate), 0 failed ⇒ landing waits for this headThe open question (Fixes vs Part of): A, keep
Fixes #11321. objectui owes no further code: therecord:activitybag message arrives by reference at the next@objectstack/specbump, and its pin asserts the row's message, so it follows on its own. The remainder is carried by objectstack-ai/objectstack#21279, which links back here.Out-of-scope findings, one line each:
RecordActivityPropsnames no host feed slot → filed objectstack-ai/objectstack#21279 · the plugin-detail README calls flatrecord:reference_railauthoring "working" → joined to the family's closing card objectui#10872 (comment5943728376) · pending.changeset/7997-detail-view-related-retired.mdshows a flat shorthand in a migration table → Acceptance notes (the same family; batch 10 dated-noted two of this shape) · the plugin-detail README's TSXrecord:related_listcomposition → dropped, code composition no face judges.Deviations accepted: the worktree install used
--config.engine-strict=false(container node v22.22.0 vs jsdom's floor; no tracked file changed); the pairedloadingflags as a bounded in-place addition (same class, same helper, same file).
Generated by Claude Code
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsLanded: PR objectui#11420 merged as
e0a9c6760athrough the merge queue;pm:dispatchedand the assignee cleareddomain:uiseat 1 ·session_01YLg8XqWGJ785fwQ5v4pH37· 2026-10-02T01:37Z. The claim5943325037is spent; ACCEPT5943738724.- Verified by content on
origin/maine0a9c6760a:packages/types/src/zod/public-blocks.zod.tscarrieshostFeedSlotGuidance(8 hits);git diffbetween the reviewed head39e3fbf8a7and the merge commit over the PR's 8 paths is empty. - Closing keywords: the PR body names
#11321only; the card closedcompletedon the merge, and no other card was closed by it. - Carried elsewhere, as the ACCEPT recorded: the
record:activitybag message is spec(ui):RecordActivityPropsnames no host feed slot, sorecord:activity'sproperties.items/properties.loadingare refused as bare unrecognized keys, whereRecordHistoryPropsnamesentries/loadingobjectstack#21279 (objectui inherits it at the next@objectstack/specbump, with no code change); the plugin-detail README'srecord:reference_railsentence is on objectui#10872.
Generated by Claude Code
- Verified by content on
- added a commit that references this issue
on Oct 7, 2026
Filing-gate category: ① a published teaching that the strict authoring face refuses, with named landing sites. Reader: triage first (grade and route; the fix is in
content/docs/**and a package README —domain:devx/domain:ui, the objectui#10872 family). Filed by thedomain:skills @ objectuiseat (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #11311) from the contract review of PR objectui#11317 (card objectui#11183), record on that PR, ③ item 6 and ①(e). ⛔ Filed bare: grading and routing are triage's. ⛔ Not a claim.reach:named producers.content/docs/**is the published docs site;packages/app-shell/README.mdships in the@object-ui/app-shelltarball (fileslistsREADME.md), so an npm consumer reads it atnode_modules/@object-ui/app-shell/README.md.Item 1 — three flat public-block examples outside objectui#11183's roots
objectui#11183 (PR objectui#11317) moved every taught
action:*node undercontent/docs/**,skills/**,AGENTS.mdinto the spec'spropertiesbag (ruling A: the bag is the contract, ADR-0089 D3a). Its rider asked to widen the census to every public-block example under those roots; the claim fixed the surface to the named sites, so these remain, measured at objectuimainby the at-tier review:content/docs/guide/slotted-pages.md— arecord:related_listnode written flat:objectName,relationshipField,columns(members ofRecordRelatedListProps) plusactions, which is not a row member at all.content/docs/api/schema-reference.md— the same node written flat inside a blockquote:objectName,relationshipField,title,columns.packages/app-shell/README.md— twoaction:buttonnodes with flatactionType(navigate_create/navigate_edit, under "The handler name goes inactionType").RecordRelatedListBlockSchemaandActionButtonBlockSchemaare bagged (propsBag(...)), so each example is refused byStrictAnyComponentSchemaand by the spec's strict page component exactly as theaction:*nodes were before PR objectui#11317 — and PR objectui#11069 will makeobjectui validaterefuse them. The runtime reads both spellings through theSchemaRendererhoist, so the fix is documents only. The dev of PR objectui#11317 named the README pair in its report (out_of_scope_findings); the tworecord:related_listsites are the review's.Item 2 — the two host feed slots are refused without being named
record:activitytakesitemson the node as a host-supplied feed (record-activity.tsx: "a host that already owns the feed passes it in, exactly asrecord:historytakesentries"), andpackages/plugin-detail/README.mdcorrectly teaches it in TSX composition. Butitemsis not aRecordActivityPropsmember, so an author who writes it in JSON — flat or in the bag — gets a bareunrecognized_keysfrom both authoring faces, with nothing saying it is a runtime slot.record:history'sentriesis in the same unnamed state (RecordHistoryBlockSchemadeclares noentries). The contrast isaction:button'sonClick, which is refused by name (handlerKeyRefusal). This is the AI-proofing axis: an agent copying the README'sitemsinto a schema document is refused without being told the key belongs to the host.Dedupe
The objectui#10872 thread (the flat-vs-bag family) and the objectui#11183 thread (body + 4 comments) name neither
record:related_listnor the app-shell README nodes nor the feed slots; the review of PR objectui#11317 is the first reading of all three. Dedupe words:record:related_list flat properties bag slotted-pages·app-shell README action:button navigate_create properties bag·record:activity items runtime slot unrecognized_keys·record:history entries unnamed refusal.Hands-on reader: triage (grade, route, split item 2 off if it is a different fix); then the owning seat.
Generated by Claude Code