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
CI BLOCKER: main is red on Bundle Analysis since f76f4362 — the framework chunk is OVER its per-chunk ceiling, and every PR touching core/react/types inherits it #8542
Filed unassigned by the domain:spec @ objectui execution seat (session session_01CZY49skxUBYyJcdnTcYPrE), found while running the pre-enqueue gate on PR #8540. ⛔ Grading and domain:* are the triage seat's. ⛔ Not claiming. ⛔ No ceiling was touched.
The reading
Bundle Analysis runs on every push to main. Its last eight results on main, by run number:
⇒ main went red at f76f4362 (2026-09-08T05:44:56Z) and has stayed red across four consecutive merges. Last green: 40a7c538, 04:01:25Z.
It is the budget, not the infrastructure. In run 10721 the job's only failing step is #11 "Check console performance budget"; steps 1–10 and 12–33 all concluded success or skipped. Build packages ✅, Build Console ✅.
Which half objects, and by how much
Read off PR #8540's run at head 63c9bd239 (a main-based branch, so the shape is the same):
⭐ The aggregate ceiling passes with 37.7 KB of headroom — which is precisely the case objectui#5490 built the per-chunk half for: "one chunk growing while others shrink is invisible to a single total." The gate is working; the payload moved.
framework is packages/(core|react|types) — apps/console/vite.config.ts routes it there. Ceiling: PER_CHUNK_GZIP_CEILINGS.framework = 71_000 at scripts/check-eager-closure-budget.mjs:584 (verbatim on origin/main e76634cc8; ⚠️ the value has NOT moved — the freshness leg confirms all three constants are unchanged).
⭐ Where the headroom went — from the tree's own record
main was at one byte. #8519's commit message says so verbatim, landed minutes before the first red:
The zod mirror is deliberately left open and reported for its own card: closing it ships runtime bytes into the console framework chunk, measured at 70,999 gzip bytes against a 71,000 ceiling.
And PR #8485's own message records how it got there: framework was 70,651 on a clean origin/main (349 bytes of headroom); that PR measured itself to 71,042, then trimmed two redundant strings back to 70,999 rather than raise anything.
⇒ Then f76f4362 (#8512) landed — "execute the declared $ operators in ValueDataSource, refuse the rest" — which adds one refusal message string per operator into packages/core, and packages/core is inside framework.
⚠️Stated as the reading the timestamps, the chunk definition and the diff's shape support. ⛔ This seat did NOT build f76f4362 to attribute the bytes, and does not claim a measured attribution. Whoever takes this should build the two commits and read framework on each — that is the one measurement this card is missing, and ⛔ it should not be skipped just because the timing is suggestive.
Why this is a blocker and not a nuisance
Every PR whose diff adds a byte to packages/core, packages/react or packages/types now fails a required check it cannot fix within its own appetite. Two are already held:
⚠️ The domain:spec queue is almost entirely packages/types. ⇒ this gate now sits in front of most of that lane.
⛔ What this card does NOT propose
⛔ Not "raise PER_CHUNK_GZIP_CEILINGS.framework." That is a maintainer-floor action no seat takes, and the gate's own failure text says "do not widen it just to get a green check." If raising it IS the answer, it is the maintainer's to say, with what the bytes buy stated in the PR — and PER_CHUNK_BASELINE moves with it.
⛔ Not a repair. Trim, re-chunk, raise, or move code out of the eager closure — all four are open, and picking among them needs the attribution measurement above first.
⚠️ One thing worth ruling separately
main merged four times while a required check was red. Whether the merge queue should hold on this check, or whether it is advisory by design, is a question about the QUEUE rather than about the bytes — ⛔ recorded, not answered here, and deliberately not folded into this card's ask.
Dedup
Targeted search over the eager-closure / per-chunk / framework-ceiling vocabulary INCLUDING closed issues. The adjacent cards are all about the gate's construction, ⛔ none about it being red on main today: objectui#5324 (the eager-closure half), objectui#5490 (the per-chunk half this red comes from), objectui#5924 (ceiling sensitivity), objectui#6245 (ceiling freshness), objectui#6230 (verdicts published but unread), objectui#3152 (an empty status rendering as FAIL), objectui#7528 (⛔ no size named in the workflow comment), objectui#6683 / objectui#6776 (a ceiling set and retired). ⛔ Not upgraded to exhaustive.
Filed unassigned by the
domain:spec @ objectuiexecution seat (sessionsession_01CZY49skxUBYyJcdnTcYPrE), found while running the pre-enqueue gate on PR #8540. ⛔ Grading anddomain:*are the triage seat's. ⛔ Not claiming. ⛔ No ceiling was touched.The reading
Bundle Analysisruns on every push tomain. Its last eight results onmain, by run number:mainhead639ca9dcf08d1a8640a7c538512c84b1f76f4362c3002671e76634cc90a9aab3⇒
mainwent red atf76f4362(2026-09-08T05:44:56Z) and has stayed red across four consecutive merges. Last green:40a7c538, 04:01:25Z.It is the budget, not the infrastructure. In run 10721 the job's only failing step is #11 "Check console performance budget"; steps 1–10 and 12–33 all concluded
successorskipped. Build packages ✅, Build Console ✅.Which half objects, and by how much
Read off PR #8540's run at head
63c9bd239(amain-based branch, so the shape is the same):⭐ The aggregate ceiling passes with 37.7 KB of headroom — which is precisely the case objectui#5490 built the per-chunk half for: "one chunk growing while others shrink is invisible to a single total." The gate is working; the payload moved.
frameworkispackages/(core|react|types)—apps/console/vite.config.tsroutes it there. Ceiling:PER_CHUNK_GZIP_CEILINGS.framework = 71_000atscripts/check-eager-closure-budget.mjs:584(verbatim onorigin/main e76634cc8;⭐ Where the headroom went — from the tree's own record
mainwas at one byte. #8519's commit message says so verbatim, landed minutes before the first red:And PR #8485's own message records how it got there:
frameworkwas 70,651 on a cleanorigin/main(349 bytes of headroom); that PR measured itself to 71,042, then trimmed two redundant strings back to 70,999 rather than raise anything.⇒ Then
f76f4362(#8512) landed — "execute the declared$operators in ValueDataSource, refuse the rest" — which adds one refusal message string per operator intopackages/core, andpackages/coreis insideframework.f76f4362to attribute the bytes, and does not claim a measured attribution. Whoever takes this should build the two commits and readframeworkon each — that is the one measurement this card is missing, and ⛔ it should not be skipped just because the timing is suggestive.Why this is a blocker and not a nuisance
Every PR whose diff adds a byte to
packages/core,packages/reactorpackages/typesnow fails a required check it cannot fix within its own appetite. Two are already held:ToastSchema.actionhas NO satisfiable JSON inhabitant on the TS face and a schema-node union on the mirror — the half of #6496 that itscompletedclose left behind #8338, retireToastSchema.action) — measuresframework70.6 KB. It would have to REMOVE ~1.2 KB to pass, roughly three times everything it adds.f08d1a86, back when the overage really was 7 bytes.domain:specqueue is almost entirelypackages/types. ⇒ this gate now sits in front of most of that lane.⛔ What this card does NOT propose
PER_CHUNK_GZIP_CEILINGS.framework." That is a maintainer-floor action no seat takes, and the gate's own failure text says "do not widen it just to get a green check." If raising it IS the answer, it is the maintainer's to say, with what the bytes buy stated in the PR — andPER_CHUNK_BASELINEmoves with it.$operators in ValueDataSource, refuse the rest #8512." That card fixed a silent fail-open where an unrecognised operator matched every row; its diagnostics are the deliverable. ⛔ Trading a correctness fix for bytes is not this seat's call either.mainmerged four times while a required check was red. Whether the merge queue should hold on this check, or whether it is advisory by design, is a question about the QUEUE rather than about the bytes — ⛔ recorded, not answered here, and deliberately not folded into this card's ask.Dedup
Targeted search over the eager-closure / per-chunk / framework-ceiling vocabulary INCLUDING closed issues. The adjacent cards are all about the gate's construction, ⛔ none about it being red on
maintoday: objectui#5324 (the eager-closure half), objectui#5490 (the per-chunk half this red comes from), objectui#5924 (ceiling sensitivity), objectui#6245 (ceiling freshness), objectui#6230 (verdicts published but unread), objectui#3152 (an empty status rendering as FAIL), objectui#7528 (⛔ no size named in the workflow comment), objectui#6683 / objectui#6776 (a ceiling set and retired). ⛔ Not upgraded to exhaustive.Reproduction
Any push to
main, or any PR adding bytes topackages/(core|react|types). Direct: https://github.com/objectstack-ai/objectui/actions/runs/34202033489 (run 10721,mainhead90a9aab3).