Filed by the triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015, session_01AavokzJ5DndAwitDXvKy4U), answering the flat-vs-bag fork 5905925465 on objectui#10872 (the pm:retriage). ⛔ Not a claim, ⛔ not a dispatch. Graded here: documentation · priority:p2 · domain:skills · area:devpath · pm:queue.
The ruling this carries: A, the properties bag is the contract
- Governing text. The spec's
PageComponentSchema is .strict() (ADR-0089 D3a). It refuses a flat actionType / target on a component node as mis-layered, loudly. Read on objectstack origin/main 96e724475c: packages/spec/src/ui/page.test.ts, describe('ADR-0089 D3a — strict page component schema (loud mis-layered keys)').
- Protocol first. When the spec and what we teach disagree, what we teach moves to the spec. ⛔ Not the reverse.
- B is not an option. A flat channel for
action:* in objectui's arms would make objectui validate accept what os validate refuses: a second dialect of the spec.
- C is not an option. Landing objectui#11069 first would leave the governed instructions file teaching a node the validator refuses. Agents copy that example.
- No behaviour is lost. The runtime reads both spellings through the
SchemaRenderer hoist, so only the documents change.
Scope
Every taught action:* node moves its executor keys (actionType, target, and any other executor argument) into properties. Read on objectui origin/main 3ab51503b3; the nodes counted are "type": "action:button|icon|group|menu", and the claim re-counts them:
| file |
governed |
action nodes |
flat executor lines seen |
AGENTS.md (#4) |
yes |
1 |
1 |
skills/objectui/SKILL.md |
yes |
1 |
2 |
skills/objectui/guides/page-builder.md |
yes |
1 |
2 |
skills/objectui/rules/protocol.md |
yes |
1 |
2 |
content/docs/guide/quick-start.md |
no |
1 |
2 |
content/docs/guide/record-edit-modes.md |
no |
3 |
3 |
content/docs/guide/schema-rendering.md |
no |
1 |
1 |
content/docs/guide/layout.md |
no |
2 |
0 on a 4-line window (read in full at claim) |
- Governed.
AGENTS.md and skills/** are governed surfaces (node scripts/check-governed-queue-guard.mjs --test names them). The PR stays draft until an authorized approval, and the claiming seat lands it (AGENTS.md「受管面」). The maintainer's approval is given on that PR; ⛔ no separate decision round.
- Cross-lane.
content/docs/guide/** is a domain:devx surface. It moves in the same PR, declared as a cross-lane surface in the claim: one edit, one example, ⛔ not split.
- The pins move with the docs. PR objectui#11180's taught-node pins read
content/docs/guide/quick-start.md: registered-types-validate-ratchet-10859.test.ts and held-public-block-arms-10872.test.ts, both ledgered readers in scripts/markdown-test-inputs.mjs. They move to the bag spelling in the same PR, and must then pass both faces: the tolerant one and StrictAnyComponentSchema.
- The census is a gate. A re-grep for a flat executor key on any
action:* example under content/docs/**, skills/**, AGENTS.md and README.md answers 0 after the change. Also run node scripts/markdown-test-inputs.mjs --audit and the root scripts/__tests__ suite (the batch-4 lesson on objectui#10872).
Order
- This card lands before PR objectui#11069 (objectui#5250), which moves
objectui validate onto the strict face. A pointer is on objectui#5250.
- It does not wait on PR objectui#11180, which is ACCEPTed and landing; the pins it moves arrive with that merge.
Why p2. Nothing is refused today: the tolerant face accepts the flat node. But the governed instructions file's canonical example is a node the spec refuses, and it becomes a validator refusal the moment objectui#11069 lands. It takes objectui#5250's grade, which this card gates.
Filed by the triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015,
session_01AavokzJ5DndAwitDXvKy4U), answering the flat-vs-bag fork5905925465on objectui#10872 (thepm:retriage). ⛔ Not a claim, ⛔ not a dispatch. Graded here:documentation·priority:p2·domain:skills·area:devpath·pm:queue.The ruling this carries: A, the
propertiesbag is the contractPageComponentSchemais.strict()(ADR-0089 D3a). It refuses a flatactionType/targeton a component node as mis-layered, loudly. Read on objectstackorigin/main96e724475c:packages/spec/src/ui/page.test.ts,describe('ADR-0089 D3a — strict page component schema (loud mis-layered keys)').action:*in objectui's arms would makeobjectui validateaccept whatos validaterefuses: a second dialect of the spec.SchemaRendererhoist, so only the documents change.Scope
Every taught
action:*node moves its executor keys (actionType,target, and any other executor argument) intoproperties. Read on objectuiorigin/main3ab51503b3; the nodes counted are"type": "action:button|icon|group|menu", and the claim re-counts them:AGENTS.md(#4)skills/objectui/SKILL.mdskills/objectui/guides/page-builder.mdskills/objectui/rules/protocol.mdcontent/docs/guide/quick-start.mdcontent/docs/guide/record-edit-modes.mdcontent/docs/guide/schema-rendering.mdcontent/docs/guide/layout.mdAGENTS.mdandskills/**are governed surfaces (node scripts/check-governed-queue-guard.mjs --testnames them). The PR stays draft until an authorized approval, and the claiming seat lands it (AGENTS.md「受管面」). The maintainer's approval is given on that PR; ⛔ no separate decision round.content/docs/guide/**is adomain:devxsurface. It moves in the same PR, declared as a cross-lane surface in the claim: one edit, one example, ⛔ not split.content/docs/guide/quick-start.md:registered-types-validate-ratchet-10859.test.tsandheld-public-block-arms-10872.test.ts, both ledgered readers inscripts/markdown-test-inputs.mjs. They move to the bag spelling in the same PR, and must then pass both faces: the tolerant one andStrictAnyComponentSchema.action:*example undercontent/docs/**,skills/**,AGENTS.mdandREADME.mdanswers 0 after the change. Also runnode scripts/markdown-test-inputs.mjs --auditand the rootscripts/__tests__suite (the batch-4 lesson on objectui#10872).Order
objectui validateonto the strict face. A pointer is on objectui#5250.Why p2. Nothing is refused today: the tolerant face accepts the flat node. But the governed instructions file's canonical example is a node the spec refuses, and it becomes a validator refusal the moment objectui#11069 lands. It takes objectui#5250's grade, which this card gates.