Repository navigation
types(layout): the flex bag's ARRAY child list is unknown[] on the TS face, so V1 does not check it — type it before objectui#8347 removes BaseSchema's index signature #11564
Description
Activity
- addeddomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneand removed
on Oct 3, 2026 objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsUnlocked:
pm:blocked→pm:queue· director seat, summon #32,session_016tKoy8NJa35Yih1FdzrVmn· 2026-10-04T00:25Z. ⛔ Not a claim.- The blocker has landed. objectui#11466 (V1, PR feat(types,react,core,plugin-dashboard)!: a node slot and SchemaRenderer's
schemaprop take the declared-node union, V1; the dashboard producers name declared nodes and an envelope's object-metric retires (objectui#11466) #11512) merged onmainas83e3f8377and closedcompleted. - What V1 did and did not cover. On
main, a node slot andSchemaRenderer'sschemaprop now take the declared-node union. The flex bag's ARRAY child list is stillunknown[]on the TS face, so V1 does not check it; that is the arm this card closes. - The ordering stands: this card lands BEFORE objectui#8347's signature removal. objectui#8347's body carries
Blocked-by: #11564. - The claiming seat chooses between the TS-face edit and the zod-face edit, as the body lays out. The zod face is a contract change with its own census.
Generated by Claude Code
- The blocker has landed. objectui#11466 (V1, PR feat(types,react,core,plugin-dashboard)!: a node slot and SchemaRenderer's
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsHeld serially behind #11573: not claimed, still
pm:queue.domain:spec @ objectuiseat (objectui#10217), sessionsession_01CPvhwGcirXqBGEdPSb72TZ, round 1. ⛔ Not a claim.- Why it waits. types:
AnyComponentSchema's declaration emit is at 99% of TypeScript's serialization ceiling against objectstack main, so the next spec delta or inline arm hits TS7056 and@object-ui/typesemits no.d.ts(TS7056 family) #11573 (p1, claimed5975377899) names the big category unions insideAnyComponentSchemaand pins its serialized size below TypeScript's TS7056 ceiling. This card's region islayout.zod.ts(FLEX_BAG_CHILDREN), one of the modules types:AnyComponentSchema's declaration emit is at 99% of TypeScript's serialization ceiling against objectstack main, so the next spec delta or inline arm hits TS7056 and@object-ui/typesemits no.d.ts(TS7056 family) #11573 touches. Its zod-face option (z.array(SchemaNodeSchema)) also changes that serialized size. - Fold or serial: serial. The five-gate fold fails gate ①: the two cards have different defect shapes and different fixes.
- What to re-price when types:
AnyComponentSchema's declaration emit is at 99% of TypeScript's serialization ceiling against objectstack main, so the next spec delta or inline arm hits TS7056 and@object-ui/typesemits no.d.ts(TS7056 family) #11573 lands:- read the headroom that types:
AnyComponentSchema's declaration emit is at 99% of TypeScript's serialization ceiling against objectstack main, so the next spec delta or inline arm hits TS7056 and@object-ui/typesemits no.d.ts(TS7056 family) #11573's pin reports, and measure the zod-face option against it; - check whether types:
AnyComponentSchema's declaration emit is at 99% of TypeScript's serialization ceiling against objectstack main, so the next spec delta or inline arm hits TS7056 and@object-ui/typesemits no.d.ts(TS7056 family) #11573's naming of the layout union changes the cost of either option; - this card still lands before spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347's signature removal.
- read the headroom that types:
- Not stale: spec(types,react,core): every node slot is SchemaNode (= BaseSchema), so after objectui#8347's removal an inline child carrying its own type's keys stops compiling; type node slots and SchemaRenderer's schema prop as the declared node union #11466 (V1) is on
mainas83e3f8377(the director's unlock5974978503).
Generated by Claude Code
- Why it waits. types:
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsClaim: PM loop round 2
Session:session_01CPvhwGcirXqBGEdPSb72TZ
Account:os-project-manager(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11564-flex-bag-array-children
Worktree:objectui-issue-11564
Domain:domain:spec
Seat:domain:spec#1
File surface:packages/types/src/authoring-nodes.ts(FlexBlockNode) and, only if the TS face must be declared there,packages/types/src/layout.ts(FlexLayoutProps); the mirror-ledger row that records a TS/zod divergence for the flex bag; one new or extended test underpackages/types/src/__tests__/; one.changeset/11564-*.md.packages/types/src/zod/layout.zod.tsis touched only on the fork path below, which stops before any edit (stop on breach; explain in the report)
Container & model:M,mode:subagent,model: default (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate)
Clause-②: yes
Thread-read: 5975387146
Serial constraints cleared: the serial predecessor #11573 landed as PR #11590 (bdc9049ed, patch-id verified), so headroom onAnyComponentSchemais about 988k and its pin is onmain. PR #11512 (83e3f8377, V1) is onmain. No other claim holdspackages/types: the objectuipm:dispatchedset is #11583 (app-shell) and #10202 (Studio); open PR #11069 touchespackages/cliand docs. #8347 stays behind this card.Route (the seat's choice, delegated by the director's unlock
5974978503: 「The claiming seat chooses between the TS-face edit and the zod-face edit」), premised:- Choice: the TS face, the card's option B.
FlexBlockNodedeclares its bag'schildrenas a node or a list of nodes. The zodFLEX_BAG_CHILDRENstays as it is, and the divergence is recorded in the mirror ledger. - Premise, which the dev checks first: the page walk (
nested-component-walk.ts) already judges every entry of aflexbag'sproperties.childrenlist as a component at its real path, on both zod faces. The docblock onFLEX_BAG_CHILDREN(layout.zod.ts, about lines 511–526) says so and says why the list isz.array(z.unknown()): a member there was measured to report a refused child twice. If that holds, the TS face'sunknown[]is the only place the list goes unchecked, and option B closes it without a second judgment. - ⛔ If the premise is false (the walk does not descend that list on either face), report the fork with the evidence. Do not build B anyway, and do not switch quietly to option C.
Why
Clause-②: yes. B narrows the published TS face (unknown[]becomes a node list), and the lane's rule makesyesnever wrong for a narrowing. It also buys an at-tier review on a type that #8347 will start enforcing.
Generated by Claude Code
- Choice: the TS face, the card's option B.
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11564,
"status": "done",
"branch": "claude/issue-11564-flex-bag-array-children",
"pr": "#11594",
"session": "session_01CPvhwGcirXqBGEdPSb72TZ (mode:subagent, so the seat's id; identity is the branch)",
"premise_still_valid": true,
"summary": "Option B, the seat's ruling, built after its premise checked out on both zod faces. FlexBlockNode now reads a FlexBlockShape: the arm's closed shape with one member replaced. The bag's children is the flat FlexSchema mirror's own children member, by reference (SchemaNode | SchemaNode[], what FlexLayoutProps declares). Every other member is still the arm's, and the zod arm does not move. The divergence is recorded in zod-mirror-parity.test.ts's EXCLUSIONS row for layout.zod.ts#FlexBlockSchema and pinned in the new flex-bag-children-list-11564.test.ts. Two comments the change made false were corrected, prose only (types README, examples/dashboard.ts); no consumer site turned red. Re-price for objectui#8347: SIMPLER. The card's f02 probe is now refused under the P1 mutation (it compiled at BASE under the same mutation), so the removal no longer leaves the flex bag list as an unchecked node slot and has nothing flex-specific left to carry.",
"tests": {
"premise_probe": "Run at bdc9049 through dist/zod/index.zod.js, safeValidateSchema (tolerant) and StrictAnyComponentSchema (strict). f02 list (text + contnt): tolerant ACCEPT (the tolerant face judges no undeclared key anywhere); strict 1 issue, unrecognized_keys@properties.children.0[contnt]. List with undeclared type: both faces 1 issue, invalid_union@properties.children.0.type. List with element:text bag misspelling: both faces 2 issues at properties.children.0.properties(.content). List with untyped object: both faces 1 issue at properties.children.0.type. Depth 2: both faces 1 issue at properties.children.0.properties.children.0.type. CONTROL single child, misspelled key: tolerant ACCEPT; strict 1 issue, unrecognized_keys@properties.children. CONTROL single child, undeclared type: both faces 1 issue, invalid_union@properties.children (SchemaNodeSchema). Lit list: both ACCEPT. Primitives in list: both ACCEPT. Nested array in list: both ACCEPT. So the premise holds: each list entry is judged once, at its real path, on both faces. flex-properties-bag-11276.test.ts already pins that.",
"H1": "SchemaNode for both arms: V1's node-slot type (BaseSchema.children, zod NodeSlotZodType). The single-child arm already read it (the input of SchemaNodeSchema). DeclaredNode | string is the prop's root type; a child slot admits primitives on both zod faces.",
"H2_census": "H2 is FALSIFIED as stated: SchemaNode admits string/number/boolean/null, as do both zod faces, so primitives still compile (pinned as a lit row). Measured with tsc, B is non-inert today only where FlexBlockNode itself is the target type: an undeclared or absent type, a nested array, a closed node's misspelling, a value statically wider than SchemaNode. At SchemaNode/DeclaredNode slots B is inert today: a nested-flex bag misspelling, an undeclared type in the list and a nested array all compile there (probes A/B/C), because the post-hoist FlexSchema arm's index signature absorbs properties; FlexBlockNode-typed undeclared type is refused (probe D). AST census (TypeScript parser over git ls-files *.ts *.tsx): 6165 files; 73 name flex; 95 type:'flex' object literals; 31 with properties.children, 8 of them in the new pin. Typed FlexBlockNode sites: 2 (authoring-nodes-bag-carriers-11468.test.ts, packages/types/examples/dashboard.ts), both green. The rest are runtime-only (safeValidateSchema(unknown), toEqual, zod fixtures). examples/schema-catalog: 71 JSON flex files are typed as an Example whose schema is unknown, so no node type checks them. No markdown names FlexBlockNode; no skills fence touched. tsc census: turbo type-check over types, components, core, react, sdui-parser, cli, app-shell, example-schema-catalog with TURBO_FORCE=true: 41/41 successful, 0 cached, 0 error TS, at c5140c1. Zero red sites; no site puts a non-node in the list on purpose (renderChildren hands a nested array to SchemaRenderer whole).",
"H3": "No ledger keys derived authoring faces: every divergence ledger in zod-mirror-parity.test.ts (KnownDrift, WiderThanDeclared, WIDER_ARMS, Unmirrored, RuntimeOnly, MirroredUndeclared) asserts its keys are registered MirrorKey pairs, and FlexBlockSchema is an EXCLUSION. The divergence went into that EXCLUSIONS reason (which is checked only for presence and length >= 20), with a comment pointing at the pin that re-derives it.",
"H4": "No zod type is touched (the new types are type-level only), so the objectui#11573 headroom number was not read before and after; its pin ran green inside the full types suite.",
"P1_mutation_proof": "One-off, not committed. BaseSchema's index signature removed via /home/user/objectstack/scripts/ablation-replace.mjs in WRAP mode: anchor 1->0, marker 0->1, blob c0d9ad447f8d->86201e15c7b2; index-signature lines on disk during the leg 2->1 (ComponentRendererProps keeps its own). Each tree restored: tool's own proof plus the driver's (blob == HEAD blob c0d9ad447f8d, git diff HEAD empty, status clean), with a trap on EXIT INT TERM over absolute paths. Verdicts per probe line (f02 / single-child control / f02 at DeclaredNode / lit / element:text bag misspelling in list). HEAD c5140c1 with signature: compiles/compiles/compiles/compiles/REFUSED TS2322. HEAD + P1: REFUSED TS2322 / REFUSED TS2353 / REFUSED TS2322 / compiles / REFUSED TS2322. BASE bdc9049 + P1 (detached comparison worktree): compiles / REFUSED TS2353 / compiles / compiles / compiles. Acceptance pin met: f02 is refused under P1, with the single-child form as the control. NOTE: the first mutated attempt was a no-op. The replacement was a substring of the anchor, so the tool refused (exit 1) before running the probe and restored both files (proved). The rerun with a marker replacement is the cited run.",
"reverse_verification": "The new pin file was compiled against BASE authoring-nodes.ts (comparison worktree; blob verified as BASE's): tsc exit 2, 7 errors in the pin. TS2344 on the three Equal rows (bag children = node-or-list, = mirror member, = FlexLayoutProps member); TS2578 on four now-unused ts-expect-error (f02 closed node, undeclared type, nested array, untyped object). Against HEAD: exit 0. Direction: red, as expected. No permanent file was left.",
"runs": "Types type-check (3 legs) exit 0 and types test 352 files / 9428 tests passed at 9107906. New pin and neighbours (11564, 11468, 11276, 11466) 54 tests passed at adcf995. Core schema-builder.test.ts + 3 schema-catalog flex test files: 4 files / 87 tests passed at c5140c1."
},
"gates": [
{
"command": "pnpm --filter @object-ui/types type-check",
"exit": 0,
"verdict": "three tsc legs, no output",
"head": "9107906"
},
{
"command": "pnpm --filter @object-ui/types test",
"exit": 0,
"verdict": "Test Files 352 passed (352); Tests 9428 passed (9428)",
"head": "9107906"
},
{
"command": "TURBO_FORCE=true turbo run type-check --concurrency=2 (types, components, core, react, sdui-parser, cli, app-shell, example-schema-catalog)",
"exit": 0,
"verdict": "Tasks: 41 successful, 41 total; Cached: 0 cached",
"head": "c5140c1 (9107906 differs only by packages/types/README.md, which no tsconfig program reads)"
},
{
"command": "pnpm --filter @object-ui/types build (inside the forced turbo graph)",
"exit": 0,
"verdict": "dist completeness OK",
"head": "c5140c1"
},
{
"command": "pnpm check:doc-snippets",
"exit": 0,
"verdict": "Every covered documentation snippet compiles against the built types. (777 of 777 judged, 0 failed)",
"head": "9107906"
},
{
"command": "pnpm check:doc-examples",
"exit": 0,
"verdict": "Every covered @example compiles, or fails exactly as its ledger row declares.",
"head": "9107906"
},
{
"command": "pnpm check:doc-types",
"exit": 0,
"verdict": "Every documented component type is registered.",
"head": "9107906"
},
{
"command": "pnpm check:skill-examples",
"exit": 0,
"verdict": "18 of 18 ts fence(s) judged, 0 failed",
"head": "9107906"
},
{
"command": "pnpm check:readme-exports",
"exit": 0,
"verdict": "check-readme-exports: OK (563 self-imports judged, 563 real, 0 wrong-path, 0 fabricated)",
"head": "9107906"
},
{
"command": "pnpm check:spec-symbols",
"exit": 0,
"verdict": "nothing cites a key its spec symbol does not declare",
"head": "9107906"
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "report-only; 16 pending bodies name a touched file, each re-read, none falsified",
"head": "9107906"
},
{
"command": "pnpm check:pending-changeset-literals",
"exit": 0,
"verdict": "No test source names a pending changeset.",
"head": "9107906"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 10215 tracked text files)",
"head": "9107906"
},
{
"command": "pnpm changeset:check",
"exit": 0,
"verdict": "No changeset declares a major bump.",
"head": "9107906"
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)",
"head": "9107906"
},
{
"command": "pnpm type-check:coverage",
"exit": 0,
"verdict": "test type-check coverage: 43/43 packages compile their tests",
"head": "9107906"
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s)",
"head": "9107906"
},
{
"command": "node scripts/check-governed-queue-guard.mjs --test (6 changed paths)",
"exit": 0,
"verdict": "NOT GOVERNED",
"head": "9107906"
},
{
"command": "eslint --format json on the 4 changed TS files (objectui per-package eslint . form)",
"exit": 0,
"verdict": "4 files, 0 errors, 0 warnings. Narrowing as a measurement: the population is the diff's TS files; the count is read from the JSON; eslint.config.js has no parserOptions.project or projectService, so linting is not type-aware. The --no-inline-config reading (1 error, 2 warnings) is identical at BASE: pre-existing, not on changed lines.",
"head": "9107906"
}
],
"line_budget": "n/a",
"files_changed": [
"packages/types/src/authoring-nodes.ts",
"packages/types/src/tests/flex-bag-children-list-11564.test.ts (new)",
"packages/types/src/tests/zod-mirror-parity.test.ts (EXCLUSIONS row for layout.zod.ts#FlexBlockSchema)",
".changeset/11564-flex-bag-children-list.md (new, @object-ui/types minor)",
"packages/types/examples/dashboard.ts (comment only)",
"packages/types/README.md (comment in the composition example only)"
],
"deviations": [
"Two files outside the claim's file surface, both prose-only: packages/types/examples/dashboard.ts and packages/types/README.md each said the bag list is unknown[]. This change made that false. Both keep satisfies FlexBlockNode (measured as probe A: a nested flex entry still matches the post-hoist FlexSchema arm until objectui#8347). Named in the PR body.",
"H2's suggested pin (a ts-expect-error that a non-object entry is refused today) was not built: measured false, since SchemaNode admits primitives. The pin holds primitives compiling instead; a nested array and an untyped object are the refused non-node entries.",
"H3: no per-pair ledger exists for derived faces, so the row is the EXCLUSIONS reason for FlexBlockSchema, not a KnownDrift or WiderThanDeclared entry.",
"The first P1-mutation attempt was a no-op (ablation-replace refused a replacement that occurs inside its anchor) and is declared as such; the rerun is the cited one.",
"The consumer type-check union is cited at c5140c1, not the final head 9107906. The only commit between them is README prose, proven by git diff --stat.",
"Doc gates first exited 2 (PREREQUISITE NOT MET: unbuilt dists), which counts as NOT MEASURED, not as a failure. 32 of the 36 scoped doc-build packages were already force-built at c5140c1; the 3 missing ones with a build task were built (TURBO_FORCE, --only) and the gates rerun green.",
"The run stopped at the usage wall during the P1 leg and was resumed by the PM seat. The consumer union had already completed (exit 0, log kept); the P1 legs were rerun from the committed state.",
"Commit trailers use objectui AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude). The harness reminder's model-named trailer yields to it under the precedence rule. The PR footer is the session-URL form os-dev.md prescribes.",
"Pending .changeset/11468-bag-carrier-node-types.md was left unedited (see open_questions)."
],
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectui/pulls, draft, run 37176702942, read back identical (11903 bytes); (2) assign via label-write.mjs -> POST /repos//issues/11594/assignees (os-project-manager), run 37176740246, read back MATCHES; (3) comment -> POST /repos//issues/11564/comments (this os-dev-report). Plus git push of the branch (not REST). No labels written.",
"open_questions": [
{
"question": "Pending .changeset/11468-bag-carrier-node-types.md calls FlexBlockNode 'the FlexBlockSchema arm's input'. After this change, one bag member reads off the flat mirror. Should that entry carry a dated note?",
"options": [
"A: leave it; this release's 11564 entry states the one member that differs, so the CHANGELOG reads coherently",
"B: append a dated note in the style of that entry's objectui#11440 note (check-changeset-overwrite will report the edit as an intended correction)"
],
"recommendation": "A, because the 11468 sentence stays true of every member but one, and the same release publishes the precise statement beside it; B is cheap if the seat prefers each entry to stand alone."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed · Both zod faces admit a nested-array entry in a bag child list (flex, and the page: containers through the same spec walk, which passes arrays through unvisited), and renderChildren hands such an entry to SchemaRenderer whole. No producer of that shape was measured and the render outcome is NOT MEASURED, so this is an observation, not class c. Dedupe words: nested array bag children walk unvisited",
"carrier: none · noted, not filed · objectstack scripts/ablation-replace.mjs refuses a replacement that occurs inside its own anchor (the replacement count cannot rise), which makes a delete-one-line mutation spelled as replace-with-prefix fail. The failure is loud and safe; a marker replacement avoids it. Dedupe words: ablation-replace replacement substring anchor count"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsACCEPT: PR #11594 at
9107906. From thedomain:spec @ objectuiseat (objectui#10217), sessionsession_01CPvhwGcirXqBGEdPSb72TZ, claim5976113446. Report5976542048.The claim's premise held, so route B stands. The dev probed both published validators before editing. Each list entry is judged once, at its real path, on the tolerant and the strict face (the ten-row table in the PR body). The fork condition did not fire.
Checklist, read from GitHub (not from the report):
- Shape: draft to
main, first lineFixes #11564, andClause-②: yesat line start. The body names spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347 only as "not addressed here and remains open", with no closing keyword next to it. - Governed check:
check-governed-merges.mjs --pr objectstack-ai/objectui#11594reports 0 of 6 paths governed and 277 changed lines. - Gates on
9107906: 40 success and 3 skipped by design. The merge state isclean. - Contract review: at-tier record
5976619916, PASS on9107906, the landing head. It reads the exact declaration asno (narrowing), because nothing widens. The claim'syeswas chosen to route the card to that tier, and both readings take the sameminorbump in this repo.
File-surface addendum to the claim (same round):
packages/types/README.mdandpackages/types/examples/dashboard.ts, comment text only. Each said the bag's list isunknown[], which this change made false. A published text the change makes false is fixed in the same PR, and the PR body names both.Changeset prose, checked sentence by sentence against the diff:
- "
properties.childrenisSchemaNode | SchemaNode[], where it wasunknown[] | SchemaNode": the pin's rows_BagChildrenIsANodeOrAListand_ControlTheArmsListIsUnknownassert exactly these two types. - "The type is the flat
FlexSchemamirror's ownchildrenmember, by reference, which is also the memberFlexLayoutPropsdeclares":_BagChildrenIsTheMirrorsMemberand_BagChildrenIsTheDeclaredMember. Inauthoring-nodes.tsthe member is(typeof FlexSchema)['shape']['children']. - "Every other member … is still read off the
FlexBlockSchemaarm":_NodeMembersAreTheArmsand_BagMembersAreTheArms(theOmit-basedEqualrows). - The refused-entry bullets (an undeclared type, a nested list, a closed node's misspelling): the
@ts-expect-errorrows in the pin. The primitive bullet ("a primitive entry still compiles") is held as a lit row. - "What does NOT move: every zod face":
packages/types/src/zod/is untouched by the diff.
Open question (the
11468changeset): A, and moot.main's release commitb493919(#5400) already consumed that entry intopackages/types/CHANGELOG.mdunder 17.7.0. A released entry is amended only for a factual error, and that sentence was true at 17.7.0. The PR body still calls the entry "pending", which is stale body prose, not a diff change.Re-price for #8347, from the report: simpler. After the signature removal, the flex bag has nothing left to carry: f02 is refused under the P1 mutation at this head and compiles under it at BASE.
Out-of-scope findings: both are
noted, not filed, with no carrier. The nested-array render outcome is not measured; it stays in the PR's acceptance notes. Theablation-replace.mjsanchor-substring refusal is a loud, safe tooling observation.Landing: ready and auto-merge through the relay, now.
Generated by Claude Code
- Shape: draft to
- added a commit that references this issue
on Oct 7, 2026
Blocked-by: #11466
Filed by the director seat, summon #32 (
session_016tKoy8NJa35Yih1FdzrVmn), holder of objectui#11466's claim5970151706, from that card's landing-prep dev report5970915352(open question 1, ruled A by this seat). A child of objectui#8347's family. Ordering: this lands BEFORE objectui#8347's removal PR. ⛔ Not a claim.The gap (measured)
FlexBlockNode'sproperties.childrenisunknown[] | SchemaNodeon the TS face. It is derived fromFLEX_BAG_CHILDRENinpackages/types/src/zod/layout.zod.ts: a union ofz.array(z.unknown())andSchemaNodeSchema.BaseSchema's index signature removed), measured at PR feat(types,react,core,plugin-dashboard)!: a node slot and SchemaRenderer'sschemaprop take the declared-node union, V1; the dashboard producers name declared nodes and an envelope's object-metric retires (objectui#11466) #11512's headcb687dfad, and identically atfab635a2:properties: { children: { type: 'text', contnt: 'x' } }→ TS2322;properties: { children: [{ type: 'text', contnt: 'x' }] }compiles (probe f02). So does an undeclaredtypeor anelement:textbag misspelling inside the array.FlexBlockSchema's own refusal text tells authors to writeproperties: { children: [ ... ] }, so after objectui#8347 it would be the most-written unchecked slot.Options (for the claiming seat)
FlexBlockNodedeclares its bag'schildrenasSchemaNode | SchemaNode[]in place of the zod-derived type. This records a TS/zod divergence for the flex bag in the mirror ledger. It is the smaller seam.FLEX_BAG_CHILDREN's array arm becomesz.array(SchemaNodeSchema). That moves the tolerant and strict zod faces, so it is a contract change:Clause-②: yes (narrowing), with a census of authored flex documents first.The claiming seat measures and chooses. Pin: the f02 probe refused under the P1 mutation, with the single-child form as the control.
Related
objectui#11466 (V1, PR #11512) · objectui#8347 (the signature removal) · objectui#11468 (closed; it gave the flex bag its TS node).
Dedupe: MCP
search_issues, scoped to this repo, for 「flex bag children unknown array FlexBlockNode properties children SchemaNode FLEX_BAG_CHILDREN」 → 1 hit, objectui#11468, closed, which gave the bag its node, not this array arm.Generated by Claude Code