Filed by the domain:spec execution seat (session session_01F8SRGcf2eKTK7RRpWCGxwf, R1) out of the stopped dispatch for the folded pair #15442 + #15449. ⛔ No domain:* set — routing is triage's, and previous console-pin cards (#14511, #12912, #10129, #9356) were routed domain:devx.
One-line executable unblock criterion
git merge-base --is-ancestor 53ded82b "$(git show origin/main:.objectui-sha)"
Exit 0 ⇒ the shipped console carries the array-analytics lowering ⇒ #15442 / #15449 become dispatchable. Exit 1 today.
Why this is filed now rather than at the next routine bump
The ruling on #15442 (director seat, decision batch #55, maintainer 「同意」) declares its sequencing gate satisfied in these words:
#15828 closed completed on 2026-09-05 16:44Z … That is direction (ii) landed plus its docs — the object-metric aggregate path accepts the array form today, so the converge is not blocked on anything.
⚠️ That sentence is true of objectui main and false of the pin this repo ships, which is the exact distinction the lane's own cross-repo rule draws — the unlock criterion is that the consumer can install it, not that upstream has merged it. (#14791's thread records this same lesson from 2026-09-04, one level down.)
Measured — the timeline alone settles it
| fact |
reading |
.objectui-sha today |
a472b07167a39e55491109e864bb5a54027dcfbd (git show origin/main:.objectui-sha, 2026-09-07T13:52Z) |
| when that pin was set |
PR #15554, closing #15422 — 2026-09-05T00:43:05Z |
| when the fix landed upstream |
objectui PR #7754 (53ded82b) — 2026-09-05T16:44Z, per the ruling's own dating |
| pin moved since? |
No. |
⇒ The pin was set ~16 hours before the fix existed and has not moved. It cannot contain it. Corroborated independently by the dev's ancestry reading on a non-shallow partial clone: git merge-base --is-ancestor 53ded82b a472b07 → exit 1, with two control legs passing (--is-ancestor a472b07 53ded82b → exit 0, i.e. the pin is an ancestor of the fix; --is-ancestor a472b07~40 a472b07 → exit 0) and --is-shallow-repository false. The pin is 34 commits behind 53ded82b and 308 behind objectui tip.
What is broken at the pin, measured rather than argued
ObjectMetricWidget.tsx:245-253 → ds.aggregate({..., filter}) → the pinned adapter passes an array where through translateFilterArray → POST /analytics/query → AnalyticsQueryRequestSchema.where, which on origin/main still reads FilterConditionSchema.optional() (packages/spec/src/data/analytics.zod.ts:299; control: FilterConditionSchema occurs 3× in that file, so the reading is not a broken pattern). #15941 added prose only.
Probe against the real spec source at 554a1603 (exit 0): record {status:{$ne:'done'}} ACCEPT (control) · pin-lowered rule array REFUSE invalid_type@where · tuple array REFUSE · raw rule array REFUSE · 53ded82b-lowered output ACCEPT.
⇒ On the console this repo ships today, every array form on object-metric + aggregate is a 400 — and only the record form the ruling retires works.
⚠️ This gap is CI-invisible
No dogfood or CI test renders the showcase my-work / index object-metric tiles through the pinned console (packages/qa/dogfood mentions object-metric only in registry-gate-wiring.dogfood.test.ts, backend-only). So had the converge landed on the current pin, every required context would have passed green while the tiles 400 at runtime. That is the reason this is a blocker and not a nice-to-have.
Scope note for whoever takes it
⛔ Not a rider on the #15442 PR — a pin bump goes through the dedicated bump script with its override and lockfile halves, never folded into a contract change. Remember the mandatory second half after the pin moves (pnpm sdui:manifest declaration-parity ratchet, docs/releases-maintenance.md → "After the pin moves"); the Console Pin Gate builds the new SHA.
Blocks: #15442 · #15449. Refs: #15828 (the upstream fix's card) · objectui#7752 / objectui PR #7754 · #15554 (the bump that set today's pin).
Filed by the
domain:specexecution seat (sessionsession_01F8SRGcf2eKTK7RRpWCGxwf, R1) out of the stopped dispatch for the folded pair #15442 + #15449. ⛔ Nodomain:*set — routing is triage's, and previous console-pin cards (#14511, #12912, #10129, #9356) were routeddomain:devx.One-line executable unblock criterion
Exit 0 ⇒ the shipped console carries the array-analytics lowering ⇒ #15442 / #15449 become dispatchable. Exit 1 today.
Why this is filed now rather than at the next routine bump
The ruling on #15442 (director seat, decision batch #55, maintainer 「同意」) declares its sequencing gate satisfied in these words:
mainand false of the pin this repo ships, which is the exact distinction the lane's own cross-repo rule draws — the unlock criterion is that the consumer can install it, not that upstream has merged it. (#14791's thread records this same lesson from 2026-09-04, one level down.)Measured — the timeline alone settles it
.objectui-shatodaya472b07167a39e55491109e864bb5a54027dcfbd(git show origin/main:.objectui-sha, 2026-09-07T13:52Z)53ded82b) — 2026-09-05T16:44Z, per the ruling's own dating⇒ The pin was set ~16 hours before the fix existed and has not moved. It cannot contain it. Corroborated independently by the dev's ancestry reading on a non-shallow partial clone:
git merge-base --is-ancestor 53ded82b a472b07→ exit 1, with two control legs passing (--is-ancestor a472b07 53ded82b→ exit 0, i.e. the pin is an ancestor of the fix;--is-ancestor a472b07~40 a472b07→ exit 0) and--is-shallow-repositoryfalse. The pin is 34 commits behind53ded82band 308 behind objectui tip.What is broken at the pin, measured rather than argued
ObjectMetricWidget.tsx:245-253→ds.aggregate({..., filter})→ the pinned adapter passes an arraywherethroughtranslateFilterArray→POST /analytics/query→AnalyticsQueryRequestSchema.where, which onorigin/mainstill readsFilterConditionSchema.optional()(packages/spec/src/data/analytics.zod.ts:299; control:FilterConditionSchemaoccurs 3× in that file, so the reading is not a broken pattern). #15941 added prose only.Probe against the real spec source at
554a1603(exit 0): record{status:{$ne:'done'}}ACCEPT (control) · pin-lowered rule array REFUSEinvalid_type@where· tuple array REFUSE · raw rule array REFUSE ·53ded82b-lowered output ACCEPT.⇒ On the console this repo ships today, every array form on
object-metric+ aggregate is a 400 — and only the record form the ruling retires works.No dogfood or CI test renders the showcase
my-work/indexobject-metrictiles through the pinned console (packages/qa/dogfoodmentionsobject-metriconly inregistry-gate-wiring.dogfood.test.ts, backend-only). So had the converge landed on the current pin, every required context would have passed green while the tiles 400 at runtime. That is the reason this is a blocker and not a nice-to-have.Scope note for whoever takes it
⛔ Not a rider on the #15442 PR — a pin bump goes through the dedicated bump script with its
overrideand lockfile halves, never folded into a contract change. Remember the mandatory second half after the pin moves (pnpm sdui:manifestdeclaration-parity ratchet,docs/releases-maintenance.md→ "After the pin moves"); the Console Pin Gate builds the new SHA.Blocks: #15442 · #15449. Refs: #15828 (the upstream fix's card) · objectui#7752 / objectui PR #7754 · #15554 (the bump that set today's pin).