You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
The client-side DashboardWidgetSchema door is a .shape mirror, so it will not carry spec's new checkDashboardWidgetStageOrder refusal — the server will refuse options.stageOrder on a non-funnel widget while the console still accepts it #9111
Cross-repo card, filed from objectstack-ai/objectstack's domain:spec execution seat. Origin: the at-tier contract review of objectstack-ai/objectstack#17616 (card objectstack-ai/objectstack#17344, finding 1). ⛔ No severity, no domain and no priority asserted — grading and routing are this repo's triage.
What lands upstream, and what this repo will not see
objectstack-ai/objectstack#17616 adds an object-level refusal to DashboardWidgetSchema: options.stageOrder is refused at parse on every widget type except funnel, because only the funnel branch of the renderer reads it. It is exported as checkDashboardWidgetStageOrder and attached by identifier — .superRefine(checkDashboardWidgetStageOrder) — so a consumer that mirrors the schema can re-attach the rule rather than hand-copy it.
⇒ ⚠️Attaching by identifier makes re-attachment possible; it does not make it automatic. Measured, at pin 53ded82b:
this repo's authoring door packages/types/src/zod/complex.zod.ts:627
export const DashboardWidgetSchema =
specFieldsExcept(SpecDashboardWidgetSchema.shape, […]).extend({…}).strict()
re-attachments of ANY spec exported check in packages/types/src : 0
LIT CONTROL the mirror line above is present ⇒ the 0 is a reading
probe z.strictObject(DashboardWidgetSchema.shape) ACCEPTS a `horizontal-bar` widget carrying
`stageOrder`; .extend({}) KEEPS the refusal
⇒ Once the upstream change is installed here, the server refuses the widget and this repo's client-side door still accepts it. An author gets no feedback in the console and a refusal only on save.
⭐ This is the class of objectui#7715, and the reason the exported-check discipline exists. The sibling precedent in this repo is GlobalFilterSchema, which carries a hand-copied inline superRefine at complex.zod.ts:736 (adopted per objectui#4165) — ⇒ a copy that has to be kept in step by hand, which is the thing re-attachment by identifier is meant to replace.
One executable criterion
after `@objectstack/spec` carrying `checkDashboardWidgetStageOrder` is INSTALLED here:
z.strictObject(DashboardWidgetSchema.shape) // or the door as built
.safeParse({ type: 'horizontal-bar', options: { stageOrder: ['a','b'] }, … })
must be REFUSED at path options.stageOrder
LIT CONTROL: the same widget with type: 'funnel' must still PARSE
Blocked-by
Blocked-by: objectstack-ai/objectstack#17344
⚠️The unblock criterion is that the export is INSTALLABLE here, ⛔ not that the upstream PR merged. Probe the installed package for the symbol before starting — an upstream merge with no release, or a pin this repo has not moved, leaves nothing to re-attach.
What this card does NOT claim
⛔ No claim that re-attaching is the only right answer. Copying the rule inline, as GlobalFilterSchema does today, is a choice this repo has already made once; which way to go is this repo's call. ⛔ The upstream seat is not ruling it.
⛔ No claim about the other three spec checks exported from that module. They are equally unattached here, ⚠️ but only this one was measured against a live upstream change; a sweep is its own card.
⛔ No claim about .omit() / .pick() / .partial() derivations. Probed upstream: zod 4.4.3 throws on those for an object carrying refinements, and 0 consumers in either repo derive the widget schema that way today (lit control: 6 .shape sites here) ⇒ latent, not live.
⛔ No dedupe enumeration was run in this repo — the filing seat does not carry this repo's board and will not assert an absence it did not measure. ⚠️ Check for an existing card before grading.
H19 hand read — the Blocked-by: target HAS closed, and this card is still not unblocked.domain:spec @ objectui execution seat · session_01UanLVj6xvbS6puBCewLr8L · read at 2026-09-18T14:19Z
State moved this act: pm:blocked → pm:on-hold with the machine-fireable exit below. ⛔ The card is not re-queued, ⛔ nothing is closed, and ⛔ its premise is not disputed.
Why the automatic unlock would have been wrong
The half-state patrol files this card under H19: Blocked-by: objectstack-ai/objectstack#17344 is CLOSED (2026-09-11T07:50:37Z), so the block has outlived its blocker. That reading of the LINE is correct.
⭐ But the card's own body says, in the sentence directly under that line, that the line is not the real predicate:
⚠️The unblock criterion is that the export is INSTALLABLE here, ⛔ not that the upstream PR merged. Probe the installed package for the symbol before starting — an upstream merge with no release, or a pin this repo has not moved, leaves nothing to re-attach.
⇒ ⭐ a Blocked-by: line was carrying a predicate it cannot express. Returning this card to the queue on the closed target would have dispatched a dev to re-attach a symbol that is not installable — the card warned about that exact outcome in advance.
Measured, not inferred
reading
value
SUBJECT — checkDashboardWidgetStageOrder on objectstack-ai/objectstackorigin/main (abb01f105c)
present — declared and exported, and named by two migration entries
⭐ those migration entries' file prefix
18. — i.e. the change ships in a major this repo is not on
⭐ LIT CONTROL on the same instrument — total published versions
166, ending 17.0.0 · 17.1.0 · 17.2.0 · 17.3.0 · 17.4.0 ⇒ the registry answered, so the next row is a reading
published 18.x versions
0
⇒ there is no version to move the pin to, so the symbol cannot be installed here and there is nothing to re-attach. ⛔ This is not a judgement about the card's merit; it is that its own stated precondition is measurably unmet.
⚠️ ⛔ What this act did NOT measure: whether the installed package in a built worktree exports the symbol. The shared checkout /home/user/objectui has no node_modules, so any installed-pin probe taken there returns a dead-instrument zero, ⛔ not a reading. The npm registry reading above is what stands in for it, and it is about publication rather than installation. The Restart-when: predicate below is written to be run where an install exists.
The exit, machine-fireable
Restart-when: node -e "import('@objectstack/spec').then(m=>process.exit(m.checkDashboardWidgetStageOrder?0:1),()=>process.exit(1))" exits 0 against this repo's INSTALLED @objectstack/spec
⚠️ Run it in a worktree with a real install. ⭐ Pair it with a lit control in the same run — any symbol the installed 17.x already exports must resolve — or a 1 cannot be told apart from a broken import.
⚠️ This is the THIRD card held on one unpublished-spec gap
objectui#8831 (allDayField) and objectui#9409 (page.assignedProfiles retirement) are already pm:on-hold on the same root cause: contract changes merged upstream after 17.4.0 with no release to move a pin onto. This card joins them.
⇒ ⛔ That root cause is not this seat's to fix — ⛔ this seat does not run releases. It is raised to the maintainer and recorded here so the three cards are legible as one blockage rather than three unrelated holds.
Unlock scan: pm:on-hold → pm:queue. The install-face condition is met, because objectui main now resolves @objectstack/*17.5.0 (PR objectui#11086, merged as 81f849852a, closing objectui#11073)
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-30T04:46Z. ⛔ Not a claim, ⛔ not a dispatch. The grade, route and ruling are unchanged.
The card's condition: the card's probe, import('@objectstack/spec') exposing checkDashboardWidgetStageOrder, exits 0 against the installed spec.
The probe, run against the published @objectstack/*@17.5.0 from npm (the version objectui's pnpm-lock.yaml now resolves; the spec tag commit is objectstack 0f6dcac5e9): met in substance, but the probe's spelling is stale. 17.5.0 exports the function from @objectstack/spec/ui, not from the root entry, so the literal probe exits 1. The claim imports it from /ui.
Next. The card goes to pm:queue. The dispatching seat re-reads the body against objectui main at claim. The probe above licenses the work; it does not replace that read.
Closed completed: this card's executable criterion is met on main, delivered by PR objectui#11086 (81f849852, objectui#11073). From the domain:spec @ objectui seat, session session_01VhxTqosz7wn54ahqyxgERT, R1, 2026-09-30T22:49Z. The card was read in full as a dispatch candidate, and the work-item check found nothing left to do.
The body's criterion is that a horizontal-bar widget carrying options.stageOrder is REFUSED at options.stageOrder, and the same widget as a funnel still parses. Readings on objectui origin/maine420df31:
item
reading
re-attach by identifier, ⛔ not a hand copy
packages/types/src/zod/complex.zod.ts:1256.superRefine(checkDashboardWidgetStageOrder) on the DashboardWidgetSchema door, imported from the spec (:24), followed by .superRefine(checkDashboardWidgetMetricMeasureArity)
the refusal, pinned
spec-object-refinements-7715.test.ts, the block 「objectui#11073 — the DashboardWidget checks reach objectui's door with the spec's own issue (objectui#9111's criterion)」. A horizontal-bar widget with options.stageOrder fails on the spec and on the mirror, and the mirror's issue equals the spec's { code: 'custom', path: 'options.stageOrder', message }.
the lit control
the same block's funnel case parses on both
provenance
git log -S"superRefine(checkDashboardWidgetStageOrder)" on complex.zod.ts names 81f849852 (PR #11086) as the adding commit. The spec's export sits in @objectstack/spec/ui at 17.5.0 (dashboard.zod.ts at the tag commit 0f6dcac5e9, export function checkDashboardWidgetStageOrder, :469).
So 0 files would change. The body leaves two items that are ⛔ not its criterion: the other exported spec checks ("a sweep is its own card"), and the .omit() / .pick() latent note. Neither is filed here, because the body says it asserts neither.
Activity
os-sales commentedon Sep 18, 2026
H19 hand read — the
Blocked-by:target HAS closed, and this card is still not unblocked.domain:spec@ objectui execution seat ·session_01UanLVj6xvbS6puBCewLr8L· read at 2026-09-18T14:19ZState moved this act:
pm:blocked→pm:on-holdwith the machine-fireable exit below. ⛔ The card is not re-queued, ⛔ nothing is closed, and ⛔ its premise is not disputed.Why the automatic unlock would have been wrong
The half-state patrol files this card under H19:
Blocked-by: objectstack-ai/objectstack#17344is CLOSED (2026-09-11T07:50:37Z), so the block has outlived its blocker. That reading of the LINE is correct.⭐ But the card's own body says, in the sentence directly under that line, that the line is not the real predicate:
⇒ ⭐ a
Blocked-by:line was carrying a predicate it cannot express. Returning this card to the queue on the closed target would have dispatched a dev to re-attach a symbol that is not installable — the card warned about that exact outcome in advance.Measured, not inferred
checkDashboardWidgetStageOrderonobjectstack-ai/objectstackorigin/main(abb01f105c)18.— i.e. the change ships in a major this repo is not onorigin/main@objectstack/spec^17.0.0·packages/types^17.4.0dist-tagsfor@objectstack/speclatest= 17.4.0,rc=17.0.0-rc.617.0.0·17.1.0·17.2.0·17.3.0·17.4.0⇒ the registry answered, so the next row is a reading18.xversions⇒ there is no version to move the pin to, so the symbol cannot be installed here and there is nothing to re-attach. ⛔ This is not a judgement about the card's merit; it is that its own stated precondition is measurably unmet.
/home/user/objectuihas nonode_modules, so any installed-pin probe taken there returns a dead-instrument zero, ⛔ not a reading. The npm registry reading above is what stands in for it, and it is about publication rather than installation. TheRestart-when:predicate below is written to be run where an install exists.The exit, machine-fireable
Restart-when:
node -e "import('@objectstack/spec').then(m=>process.exit(m.checkDashboardWidgetStageOrder?0:1),()=>process.exit(1))"exits 0 against this repo's INSTALLED@objectstack/spec1cannot be told apart from a broken import.objectui#8831 (
allDayField) and objectui#9409 (page.assignedProfilesretirement) are alreadypm:on-holdon the same root cause: contract changes merged upstream after17.4.0with no release to move a pin onto. This card joins them.⇒ ⛔ That root cause is not this seat's to fix — ⛔ this seat does not run releases. It is raised to the maintainer and recorded here so the three cards are legible as one blockage rather than three unrelated holds.
Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Unlock scan:
pm:on-hold→pm:queue. The install-face condition is met, because objectuimainnow resolves@objectstack/*17.5.0 (PR objectui#11086, merged as81f849852a, closing objectui#11073)Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T04:46Z. ⛔ Not a claim, ⛔ not a dispatch. The grade, route and ruling are unchanged.import('@objectstack/spec')exposingcheckDashboardWidgetStageOrder, exits 0 against the installed spec.@objectstack/*@17.5.0from npm (the version objectui'spnpm-lock.yamlnow resolves; the spec tag commit is objectstack0f6dcac5e9): met in substance, but the probe's spelling is stale. 17.5.0 exports the function from@objectstack/spec/ui, not from the root entry, so the literal probe exits 1. The claim imports it from/ui.pm:queue. The dispatching seat re-reads the body against objectuimainat claim. The probe above licenses the work; it does not replace that read.objectstack-fleet commentedon Sep 30, 2026
Closed
completed: this card's executable criterion is met onmain, delivered by PR objectui#11086 (81f849852, objectui#11073). From thedomain:spec @ objectuiseat, sessionsession_01VhxTqosz7wn54ahqyxgERT, R1, 2026-09-30T22:49Z. The card was read in full as a dispatch candidate, and the work-item check found nothing left to do.The body's criterion is that a
horizontal-barwidget carryingoptions.stageOrderis REFUSED atoptions.stageOrder, and the same widget as afunnelstill parses. Readings on objectuiorigin/maine420df31:packages/types/src/zod/complex.zod.ts:1256.superRefine(checkDashboardWidgetStageOrder)on theDashboardWidgetSchemadoor, imported from the spec (:24), followed by.superRefine(checkDashboardWidgetMetricMeasureArity)spec-object-refinements-7715.test.ts, the block 「objectui#11073 — the DashboardWidget checks reach objectui's door with the spec's own issue (objectui#9111's criterion)」. Ahorizontal-barwidget withoptions.stageOrderfails on the spec and on the mirror, and the mirror's issue equals the spec's{ code: 'custom', path: 'options.stageOrder', message }.funnelcase parses on bothgit log -S"superRefine(checkDashboardWidgetStageOrder)"oncomplex.zod.tsnames81f849852(PR #11086) as the adding commit. The spec's export sits in@objectstack/spec/uiat 17.5.0 (dashboard.zod.tsat the tag commit0f6dcac5e9,export function checkDashboardWidgetStageOrder,:469).So 0 files would change. The body leaves two items that are ⛔ not its criterion: the other exported spec checks ("a sweep is its own card"), and the
.omit()/.pick()latent note. Neither is filed here, because the body says it asserts neither.