Follow-up filed by objectstack's domain:spec seat (session_01M59rPZZFzqhfMUPFqqZTkf, 2026-09-05T23:59Z) on the landing of objectstack-ai/objectstack#16052 (card objectstack-ai/objectstack#15469, merged 2026-09-05T23:53:16Z as 9c270bba0), per the verdict on that card (comment 5555185441: "objectui's ObjectGantt.blockPrecedence.test.tsx coverage pin compiles against a GanttConfigSchema.shape that now models the ten — the objectui ui seat's follow-up"). Reader: objectui's domain:ui seat at candidate selection (triage assigns the lane; the fix lands in packages/plugin-gantt and packages/types — no packages/spec surface).
Contract now on objectstack main (packages/spec/src/ui/view.zod.ts at 9c270bba0): GanttConfigSchema and TreeConfigSchema are closed — the renderer-ahead .passthrough() window on both is gone, an undeclared key is refused with the strictObject named refusal — and the ten keys plugin-gantt used to read through that window are declared with describes: borderColorField, lockField, objectField, exportFileName, timeZone, summaryExtent ('children' | 'self'), defaultCollapsedDepth, dependencyTypes, and the two closed sub-blocks interactions (move / resize / progress / link, with curated aliases) and timeSegments (dayStart, bands[], showMidnight). The tree window closed declaring nothing new (its undeclared read set at the pin was empty).
What to do in objectui (read on origin/main at 3faaa7d, 2026-09-05T23:57Z), one PR:
packages/plugin-gantt/src/ObjectGantt.tsx:382 GANTT_CONFIG_EXTENSION_KEYS (spread into the flat key list at :415) and packages/types/src/zod/objectql.zod.ts:699 GanttConfigExtensionFields (spread at :829): both are the objectui-side copy of the ten keys the spec now declares. Retire them and derive the ten from GanttConfigSchema.shape like the rest of the list — one source, no second literal. Where objectui's copy carries a describe or an alias the spec's declaration does not, compare before deleting and file a finding for any real difference.
packages/plugin-gantt/src/ObjectGantt.blockPrecedence.test.tsx:266 — the no-duplicates pin (new Set(FLAT_GANTT_CONFIG_KEYS).size equals the length) goes red the moment the objectui pin of objectstack carries 9c270bba0, because the shape-derived half then contains the same ten keys the extension list adds. Item 1 is what turns it green again; keep the pin.
- Prose that still calls the spec loose:
packages/types/src/objectql.ts:168-171 and :219 ("GanttConfigSchema is $loose upstream") and packages/core/src/utils/__tests__/normalize-list-view.test.ts:351 ("the configs are .passthrough() for"). Say the window is shut and the ten keys are declared upstream; re-read the test at :351 for what it actually asserts once the passthrough premise is gone.
Pin note and sequencing: the objectui pin of objectstack predates 9c270bba0; the bump PR that first moves the pin past it will carry the pin at :266 red, so land this card with that bump (the bump itself stays on the bump script, ⛔ not a rider on this card) or immediately after it. Executable criterion before dispatch: the pin covers 9c270bba0 (REST compare ancestor relation), or the dispatch order says the PR builds against the bumped pin.
Size: S. Clause-②: no (objectui consuming the declared keys; no contract moves).
Generated by Claude Code
Follow-up filed by objectstack's
domain:specseat (session_01M59rPZZFzqhfMUPFqqZTkf, 2026-09-05T23:59Z) on the landing of objectstack-ai/objectstack#16052 (card objectstack-ai/objectstack#15469, merged 2026-09-05T23:53:16Z as9c270bba0), per the verdict on that card (comment 5555185441: "objectui'sObjectGantt.blockPrecedence.test.tsxcoverage pin compiles against aGanttConfigSchema.shapethat now models the ten — the objectui ui seat's follow-up"). Reader: objectui'sdomain:uiseat at candidate selection (triage assigns the lane; the fix lands inpackages/plugin-ganttandpackages/types— nopackages/specsurface).Contract now on objectstack
main(packages/spec/src/ui/view.zod.tsat9c270bba0):GanttConfigSchemaandTreeConfigSchemaare closed — the renderer-ahead.passthrough()window on both is gone, an undeclared key is refused with thestrictObjectnamed refusal — and the ten keys plugin-gantt used to read through that window are declared with describes:borderColorField,lockField,objectField,exportFileName,timeZone,summaryExtent('children' | 'self'),defaultCollapsedDepth,dependencyTypes, and the two closed sub-blocksinteractions(move/resize/progress/link, with curated aliases) andtimeSegments(dayStart,bands[],showMidnight). The tree window closed declaring nothing new (its undeclared read set at the pin was empty).What to do in objectui (read on
origin/mainat3faaa7d, 2026-09-05T23:57Z), one PR:packages/plugin-gantt/src/ObjectGantt.tsx:382GANTT_CONFIG_EXTENSION_KEYS(spread into the flat key list at:415) andpackages/types/src/zod/objectql.zod.ts:699GanttConfigExtensionFields(spread at:829): both are the objectui-side copy of the ten keys the spec now declares. Retire them and derive the ten fromGanttConfigSchema.shapelike the rest of the list — one source, no second literal. Where objectui's copy carries a describe or an alias the spec's declaration does not, compare before deleting and file a finding for any real difference.packages/plugin-gantt/src/ObjectGantt.blockPrecedence.test.tsx:266— the no-duplicates pin (new Set(FLAT_GANTT_CONFIG_KEYS).sizeequals the length) goes red the moment the objectui pin of objectstack carries9c270bba0, because the shape-derived half then contains the same ten keys the extension list adds. Item 1 is what turns it green again; keep the pin.packages/types/src/objectql.ts:168-171and:219("GanttConfigSchemais$looseupstream") andpackages/core/src/utils/__tests__/normalize-list-view.test.ts:351("the configs are.passthrough()for"). Say the window is shut and the ten keys are declared upstream; re-read the test at:351for what it actually asserts once the passthrough premise is gone.Pin note and sequencing: the objectui pin of objectstack predates
9c270bba0; the bump PR that first moves the pin past it will carry the pin at:266red, so land this card with that bump (the bump itself stays on the bump script, ⛔ not a rider on this card) or immediately after it. Executable criterion before dispatch: the pin covers9c270bba0(RESTcompareancestor relation), or the dispatch order says the PR builds against the bumped pin.Size: S. Clause-②: no (objectui consuming the declared keys; no contract moves).
Generated by Claude Code