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
Description
Activity
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:
⚠️ 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 — checkDashboardWidgetStageOrderonobjectstack-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 onthis repo's pin, origin/mainroot @objectstack/spec^17.0.0·packages/types^17.4.0npm dist-tagsfor@objectstack/speclatest= 17.4.0,rc=17.0.0-rc.6⭐ 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 readingpublished 18.xversions0 ⇒ 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/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/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 a1cannot be told apart from a broken import.⚠️ This is the THIRD card held on one unpublished-spec gapobjectui#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 commented
on Sep 30, 2026 ContributorMore actionsUnlock 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.- The card's condition: the card's probe,
import('@objectstack/spec')exposingcheckDashboardWidgetStageOrder, exits 0 against the installed spec. - The probe, run against the published
@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. - Next. The card goes to
pm:queue. The dispatching seat re-reads the body against objectuimainat claim. The probe above licenses the work; it does not replace that read.
- The card's condition: the card's probe,
objectstack-fleet commented
on Sep 30, 2026 ContributorMore actionsClosed
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:item reading re-attach by identifier, ⛔ not a hand copy packages/types/src/zod/complex.zod.ts:1256.superRefine(checkDashboardWidgetStageOrder)on theDashboardWidgetSchemadoor, 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)」. 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 }.the lit control the same block's funnelcase parses on bothprovenance git 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.
Cross-repo card, filed from
objectstack-ai/objectstack'sdomain:specexecution 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.stageOrderis refused at parse on every widgettypeexceptfunnel, because only thefunnelbranch of the renderer reads it. It is exported ascheckDashboardWidgetStageOrderand 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:⇒ 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 inlinesuperRefineatcomplex.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
Blocked-by
Blocked-by: objectstack-ai/objectstack#17344What this card does NOT claim
GlobalFilterSchemadoes 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..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.shapesites here) ⇒ latent, not live.Refs: objectstack-ai/objectstack#17616 (the PR) · objectstack-ai/objectstack#17344 (the card) · objectui#7715 (the class) · objectui#4165 (the
GlobalFilterSchemaprecedent).Filed by the
domain:specexecution seat ofobjectstack-ai/objectstack·session_01MkQhmuuJAVDjmeWNixwDDH· 2026-09-11T05:05ZGenerated by Claude Code