Found while correcting the stale "~1 KB of headroom" comment in packages/i18n/src/locales/*.ts (objectui#7507 / PR objectui#7517, item 6). Not fixed there: it is a different file, in a gate's runtime closure, and the right correction is not mechanical. Filing it unassigned rather than riding it in.
The two readings
scripts/check-eager-closure-budget.mjs states the aggregate ceiling's headroom twice, and the two disagree:
:255, on MAX_EAGER_CLOSURE_GZIP_BYTES — "Headroom is 45,686 bytes — 0.50x REGRESSION_THIS_GATE_MUST_CATCH_BYTES.":455, closing the "Why framework moved DOWN" block (objectui#7399) — "...and then the AGGREGATE line (11,988 bytes of headroom) becomes the binding one."
The constants in the same file settle which is current:
MAX_EAGER_CLOSURE_GZIP_BYTES = 3_268_000
BASELINE.gzipBytes = 3_222_314 (commit 3d257c85a)
= 45,686 bytes of headroom
So :255 agrees with the constants and :455 does not. 11,988 was presumably true against the aggregate baseline in force when the #7399 block was written; the baseline moved and the sentence did not.
Why it is worth a card rather than a shrug
The load-bearing half is not the arithmetic — it is the conclusion:455 draws from it. That paragraph is the argument for where the constraint on the eagerly-loaded locale catalogues actually lives:
8,924 bytes is about sixty translation keys ... enough for the five PRs this unparked, and then the AGGREGATE line (11,988 bytes of headroom) becomes the binding one. That is the correct place for the constraint to live, and it is the argument for taking the catalogues out of the eager closure rather than for raising anything.
At 45,686 bytes the aggregate is roughly 4x further away than the sentence says, so "the aggregate becomes binding right after i18n-locales is spent" is no longer the shape of the situation an author is being told to plan against. This is the same failure mode the file itself names twice — objectui#6778 ("argues from a reading two re-baselines old") and objectui#7046 ("guards the numbers and not the prose explaining them"), both closed — recurring in the paragraph that objectui#7399 added.
Why it was not fixed in passing
- The correct replacement is a judgement, not a substitution: whether to restate the figure, restate the ratio, or drop the number and defer to the live verdict (which is what the file's own
:420 warns to do: "⛔ Do not size a re-baseline off the figures above ... the answer in force is the table the gate prints on YOUR build"). scripts/check-eager-closure-budget.mjs is listed in performance-budget.yml's runtime-closure paths, so touching it costs a console build in CI and owes its own scripts/__tests__/check-eager-closure-budget.test.ts run — a verification surface objectui#7507 does not otherwise open.
Repro
grep -n "11,988\|45,686" scripts/check-eager-closure-budget.mjs
node -e "console.log(3268000-3222314)" # 45686
Measured on a27d153c2 (origin/main).
Generated by Claude Code
Found while correcting the stale "~1 KB of headroom" comment in
packages/i18n/src/locales/*.ts(objectui#7507 / PR objectui#7517, item 6). Not fixed there: it is a different file, in a gate's runtime closure, and the right correction is not mechanical. Filing it unassigned rather than riding it in.The two readings
scripts/check-eager-closure-budget.mjsstates the aggregate ceiling's headroom twice, and the two disagree::255, onMAX_EAGER_CLOSURE_GZIP_BYTES— "Headroom is 45,686 bytes — 0.50xREGRESSION_THIS_GATE_MUST_CATCH_BYTES.":455, closing the "Whyframeworkmoved DOWN" block (objectui#7399) — "...and then the AGGREGATE line (11,988 bytes of headroom) becomes the binding one."The constants in the same file settle which is current:
So
:255agrees with the constants and:455does not. 11,988 was presumably true against the aggregate baseline in force when the #7399 block was written; the baseline moved and the sentence did not.Why it is worth a card rather than a shrug
The load-bearing half is not the arithmetic — it is the conclusion
:455draws from it. That paragraph is the argument for where the constraint on the eagerly-loaded locale catalogues actually lives:At 45,686 bytes the aggregate is roughly 4x further away than the sentence says, so "the aggregate becomes binding right after
i18n-localesis spent" is no longer the shape of the situation an author is being told to plan against. This is the same failure mode the file itself names twice — objectui#6778 ("argues from a reading two re-baselines old") and objectui#7046 ("guards the numbers and not the prose explaining them"), both closed — recurring in the paragraph that objectui#7399 added.Why it was not fixed in passing
:420warns to do: "⛔ Do not size a re-baseline off the figures above ... the answer in force is the table the gate prints on YOUR build").scripts/check-eager-closure-budget.mjsis listed inperformance-budget.yml's runtime-closurepaths, so touching it costs a console build in CI and owes its ownscripts/__tests__/check-eager-closure-budget.test.tsrun — a verification surface objectui#7507 does not otherwise open.Repro
Measured on
a27d153c2(origin/main).Generated by Claude Code