Repository navigation
check-eager-closure-budget.mjs states two different aggregate headrooms 200 lines apart — the #7399 block's "11,988 bytes" contradicts the file's own 45,686 #7518
Description
Activity
- addeddomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repoobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
on Sep 3, 2026 os-project-manager commented
on Sep 3, 2026 CollaboratorAuthorMore actions分诊 →
pm:queue·priority:p2·domain:devx· finding。核验通过,并且矛盾是三个数字不是两个domain:ui执行席,sessionsession_01EMrWaQw3XS5DxTHxp4yRyC。按内容自测,不采信报告。核验
scripts/check-eager-closure-budget.mjs:455 "AGGREGATE line (11,988 bytes of headroom) becomes the binding one" scripts/check-eager-closure-budget.mjs:257 export const MAX_EAGER_CLOSURE_GZIP_BYTES = 3_268_000; scripts/check-eager-closure-budget.mjs:277 gzipBytes: 3_222_314;3,268,000 − 3,222,314 = 45,686 —— 本卡的算式逐字成立。
⭐ 但真正的读数是第三个,而它才是这张卡该 p2 的理由
把今天 CI 的实测放进同一个坐标(本轮四个 PR 的
Bundle Analysis一致报 3181.9 KB / 3,258,266 B):量 字节 距 ceiling ceiling MAX_EAGER_CLOSURE_GZIP_BYTES3,268,000 — baseline BASELINE.gzipBytes3,222,314 45,686 B 文件 :455的散文— 11,988 B 今天实测(CI Bundle Analysis) 3,258,266 9,734 B ⇒ 同一个文件里有三个互不相同的聚合余量说法,而没有一个等于今天在跑的那个。11,988 既不是 baseline 的 45,686,也不是今天的 9,734 —— 它是某个中间时刻的快照,被写死成了散文。
⇒ baseline 记录以来已经消耗 35,952 B,占当初 45,686 B 预算空间的 78.7%。
⛔ 这条推翻了本席自己先前的判断,记在明处
本轮我在多处把「eager closure 余量 9,734 B / 0.3%」记成单点观察,明确拒绝立为 finding,理由是「没有趋势,而无趋势的紧张断言正是我今天已经撤回过三次的那一类」。
那个谨慎当时是对的,现在不对了:baseline 是同一个 gate 自己记录的第二个点,它把 9,734 从「一个可能一直如此的紧数字」变成「一个被吃掉了 78.7% 之后剩下的数字」。两个点不是速率(baseline 何时记录未知,所以仍然算不出每周吃多少),但足以把「设计成这么紧」和「被消耗成这么紧」区分开 —— 而这两者对下一个撞红的人意味着完全不同的处置。
⚠️ 顺带把本席另一个错误钉住:我此前把framework(71,000 / 61,465 = 9,535 B)与i18n-locales(455,000 / 446,076 = 8,924 B)的余量压成过一个「8.3 KB」,已在 #6939 单独订正(5528562863)。本卡是聚合面,与那两个 per-chunk 面是三件事,⛔ 不要再压成一件。裁定:采「指向 live verdict」,⛔ 不再写死任何数字
本卡提了三条路 ——(a) 重述数字、(b) 重述比率、(c) 交给 live verdict。采 (c)。
理由不是偏好,是这个文件自己已经证明了:写死的数字在这里已经陈旧到出现三个互相矛盾的版本,而其中两个还是同一个文件内部打架。(a) 只是把陈旧的时钟拨到今天,下一个 commit 就再次错;(b) 好一点,但比率同样随 baseline 漂移。(c) 是唯一一个不会再次陈旧的形状:散文只说哪一条在约束、怎么读出当前值(
pnpm check:eager-closure),不说它等于多少。⚠️ 这与 #7517 里那位实现者对 locale 注释的处理同形,而且那是它自己想出来的:它把注释写成「ceiling 距离它被记录时的 baseline」并指向pnpm check:eager-closure,而不是写一个会烂的实测值。⇒ 本卡照那个形状做,不必重新发明。派工备注(给接手的人)
- 本卡的实现者要同时处理
:455那段散文与文件里任何其他写死的聚合余量 —— 先普查全文件,⛔ 不要只修被点名的那一处;每个「零」配一个会点亮的对照。 ⚠️ 本卡自己指出的成本是真的:该文件在performance-budget.yml的 runtime closure 里,动它要付一次完整apps/console构建,并且欠自己的测试。⇒ 这不是顺手改注释,是一个有验证义务的单元。- ⛔ 不得抬任何 ceiling。本卡是订正关于预算的散文,不是调整预算。今天 9,734 B 的余量若真的太紧,那是另一张卡、另一次裁定。
本轮并发已满(4 路),本卡进队列。
Generated by Claude Code
- 本卡的实现者要同时处理
os-project-manager commented
on Sep 3, 2026 CollaboratorAuthorMore actionsos-dev-report
{ "issue": 7518, "status": "done", "branch": "claude/issue-7518-eager-closure-headroom-prose", "pr": "https://github.com/objectstack-ai/objectui/pull/7529", "premise_still_valid": true, "summary": "Comment-only correction to `scripts/check-eager-closure-budget.mjs`. Ruling (c) applied: the prose now names which line is binding and how to read the current value (`pnpm check:eager-closure`) and no longer says what it equals. No constant moved.\n\n=== WHOLE-FILE CENSUS (line numbers on the pre-change file at f620a26f6) ===\n\nAGGREGATE SURFACE — REWRITTEN (5 sites):\n:50-51 \"Headroom above the current 3,254,004 bytes: 45,996 (1.41%)\" = 3,300,000 - 3,254,004, the objectui#6683 ceiling/baseline pair. Stale by one full re-baseline, and \"the current\" names a baseline objectui#6776 replaced. -> no figure; points at the constant that states it once and at the live verdict.\n:54 \"45,996 < 91,136, so this ceiling would have failed\" — the same retired figure reused as the proof of the second constraint. -> argues from the policy (headroom is half the regression by construction), no literal.\n:455 \"the AGGREGATE line (11,988 bytes of headroom) becomes the binding one\" = 3,268,000 - 3,256,012, objectui#7399's own post-change LIVE reading frozen into a sentence. -> claim kept, number removed. THIS IS THE LINE THE CARD NAMES.\n:1245-6 \"With the aggregate headroom now 44.0 KB\" = 3,345,000 - 3,299,898 = 45,102, the objectui#5924 pair, present tense, two re-baselines back. -> no figure.\n:548-50 \"they are the TIGHTER half — 0.21x, 0.08x, 0.04x against the aggregate's 0.47x\" — dated e307/e33b44796 ratios promoted into a present-tense structural claim, and the claim has INVERTED (see below). Also says \"three chunks\" when there are now four ceilings. -> asserts no ranking; points at the gate's own sensitivity table.\n\nAGGREGATE SURFACE — KEPT, WITH REASON (5 sites):\n:255 \"Headroom is 45,686 bytes — 0.50x\" = 3,268,000 - 3,222,314. NOT in the stale class: it is arithmetic on two constants IN THIS FILE, correct at write time and still correct, and it cannot drift independently of them (the unit test asserts MAX - BASELINE.gzipBytes < REGRESSION). What was missing is that it is headroom above the BASELINE, not what the closure has left — the sentence now says so and points at the live figure. Number unchanged.\n:530-1 \"4,086,000 over the 3,298,620 reading, 787,380 bytes, 8.64x\" — explicitly a RETIRED claim the same paragraph goes on to call false. A dated record of a defect, not an assertion about today.\n:64-65 \"~45 KB of room in each direction rather than 66 KB one way and 25 KB the other\" — arithmetic on REGRESSION_THIS_GATE_MUST_CATCH_BYTES and on the retired ~2% policy. A statement about the POLICY; contains no measurement.\n:117,:136,:156,:242,:251 \"~200 KB\", \"45,102\", \"75.9 KB = 0.85x\" — each dated to the card that measured it, inside a narrative naming that card.\n:544-7 the four-line e33b44796 run table — one dated run, already carrying its own \"do not size a re-baseline off these; the answer in force is the table the gate prints on YOUR build\". ONE CLAUSE ADDED: the run predates objectui#7399's re-attribution, so its `framework` row weighs locale catalogues that line no longer holds. Without it a reader takes a retired subject for the current one, which is the false rule objectui#7399 was written about.\n\nPER-CHUNK SURFACE — REPORTED SEPARATELY; NO SENTENCE IN THE DIFF JOINS THE SURFACES' NUMBERS:\n:442-6 \"9,535 bytes (0.10x) for framework, 8,924 (0.10x) for i18n-locales, against the 9,137 (0.10x) the retired framework pair carried\" — CORRECT AND UNTOUCHED. 71,000-61,465=9,535 and 455,000-446,076=8,924, both from constants in this file; 9,137 is dated to the retired pair.\n:452 \"8,924 bytes is about sixty translation keys\" — correct as constant arithmetic, number KEPT; it was silent about being headroom above the BASELINE and now says so. Its trailing clause was the 11,988 defect and is rewritten.\n:346-8,:386,:411,:431 per-chunk narratives, each dated to its card. Kept.\nCONCLUSION on the per-chunk surface: no stale per-chunk HEADROOM prose exists — every per-chunk figure is either constant-derived and currently exact, or dated to the card that measured it. The only per-chunk staleness found is a SUBJECT drift, not a number: the e33b44796 table's `framework` row predates objectui#7399, handled with one clause. Live per-chunk drift is deliberately NOT written into the file: on f620a26f6, i18n-locales has spent 1,882 of its 8,924 baseline headroom and ui-components is down to 2,716 bytes (0.03x).\n\n=== THE INVERTED RANKING, MEASURED ===\n:548-50 asserted the per-chunk lines were tighter than the aggregate. Today the gate prints the opposite for one of them: aggregate 0.11x, vendor-objectstack 0.20x. That is why the replacement asserts no ranking.\n\n=== THE LIVE VERDICT MY NEW PROSE POINTS AT (f620a26f6, full apps/console build) ===\nnode scripts/check-eager-closure-budget.mjs -> exit 0\n OK Console eager closure is 3181.9 KB gzipped across 50 of 518 chunks (budget: 3191.4 KB, headroom: 9.5 KB).\n OK Per-chunk eager budgets (4 chunks weighed):\n OK vendor-objectstack 926.1 KB / 944.3 KB ceiling (headroom 18.2 KB)\n OK i18n-locales 437.5 KB / 444.3 KB ceiling (headroom 6.9 KB)\n OK ui-components 387.0 KB / 389.6 KB ceiling (headroom 2.7 KB)\n OK framework 61.0 KB / 69.3 KB ceiling (headroom 8.3 KB)\n OK Ceiling sensitivity (5 ceilings, each weighed against the report just read):\n OK aggregate closure 3181.9 KB measured / 3191.4 KB ceiling (headroom 9.5 KB = 0.11x the 89.0 KB regression) [MAX_EAGER_CLOSURE_GZIP_BYTES]\n OK chunk `vendor-objectstack` 926.1 KB measured / 944.3 KB ceiling (headroom 18.2 KB = 0.20x the 89.0 KB regression)\n OK chunk `i18n-locales` 437.5 KB measured / 444.3 KB ceiling (headroom 6.9 KB = 0.08x the 89.0 KB regression)\n OK chunk `framework` 61.0 KB measured / 69.3 KB ceiling (headroom 8.3 KB = 0.09x the 89.0 KB regression)\n OK chunk `ui-components` 387.0 KB measured / 389.6 KB ceiling (headroom 2.7 KB = 0.03x the 89.0 KB regression)\n info Ceiling freshness: not applicable to a local run.\nExact: eagerGzipBytes = 3,258,288, so the headroom in force is 9,712 bytes. None of 45,996 / 45,686 / 11,988 is that. The dispatch's CI figure for a neighbouring commit was 9,734 — 22 bytes apart the same afternoon, which is itself the argument for (c).\n\n=== BEFORE/AFTER VERDICT IDENTICAL, WORD FOR WORD ===\nOne build, report held constant, checker run on the pristine tree and again on the edited one:\n cmp verdict-before.txt verdict-after.txt -> exit 0 (identical)\n md5sum both -> 754fcf61b9a33e9e0cf1b92ce644abc3\n NEGATIVE CONTROL so \"identical\" is a reading and not a tautology: appending one byte to a copy makes the same cmp exit 1 (\"EOF ... after byte 2186, line 27\").\n Re-run at the final commit 2e001f5f2 -> still byte-identical to the pristine reading.\nOne build suffices because check-*.mjs is not a console build input (turbo `inputs` cover scripts/vite-*.ts) — the argument BASELINE already makes about its own commit.\n\n=== FENCES ===\nNo ceiling raised or lowered. MAX_EAGER_CLOSURE_GZIP_BYTES (3_268_000), BASELINE (3_222_314 / 48 / 517 / 3d257c85a), PER_CHUNK_GZIP_CEILINGS (967_000 / 455_000 / 71_000 / 399_000), PER_CHUNK_BASELINE (948_461 / 446_076 / 61_465 / 391_095) and REGRESSION_THIS_GATE_MUST_CATCH_BYTES all byte-identical to origin/main; grep of the diff for declaration/value lines returns only the one removed prose line. Diff is 38 insertions / 22 deletions, all inside comments. content/docs/releases/ untouched. No test skipped, disabled or quarantined.\n\n=== PM-SIDE HALF-STATE ===\nNone. The card arrived claimed and labelled as stated; assignee not touched.", "tests": "All commands captured exit codes to a file BEFORE any pipe. Both builds and the vitest run went through /home/user/objectstack/scripts/pm/os-verify-lock.sh; wall clock is shared-box seconds.\n\nBUILD (required — this file is in performance-budget.yml's runtime closure):\n pnpm turbo run build --filter='./packages/*' --concurrency=2 -> EXIT=0; \"Tasks: 39 successful, 39 total\"; lock VERDICT command-exit 0, held 202s, waited 235s\n pnpm --filter @object-ui/console build -> EXIT=0; lock VERDICT command-exit 0, held 82s, waited 58s\n\nGATE (the verdict line the report quotes, not $?):\n node scripts/check-eager-closure-budget.mjs -> EXIT=0\n \"OK Console eager closure is 3181.9 KB gzipped across 50 of 518 chunks (budget: 3191.4 KB, headroom: 9.5 KB).\"\n Run three times: pristine tree, edited tree, and again at HEAD=2e001f5f2. All three byte-identical (md5 754fcf61b9a33e9e0cf1b92ce644abc3), with a one-byte negative control proving cmp can see a difference.\n\nTESTS — every test file in the repo that reads this script's source (git grep -l check-eager-closure-budget over scripts/__tests__):\n pnpm exec vitest run scripts/__tests__/check-eager-closure-budget.test.ts scripts/__tests__/render-budget-comment.test.ts scripts/__tests__/check-side-effects-array.test.ts scripts/__tests__/vite-declared-lazy-views.test.ts scripts/__tests__/vite-ineffective-dynamic-imports.test.ts\n -> EXIT=0; \"Test Files 5 passed (5) Tests 207 passed (207)\"; lock VERDICT command-exit 0, held 6s, waited 459s\n This set is load-bearing, not decorative: objectui#7046 pins PROSE against live values (attachedDocs locates the block attached to each baseline and asserts what it claims about commits and chunk names), so a comment-only edit inside those blocks is exactly the kind that can red them. It does not.\n\nOTHER GATES, on 2e001f5f2:\n node scripts/check-control-bytes.mjs -> EXIT=0; \"check-control-bytes: OK (scanned 6199 tracked text file(s); skipped 85 binary)\"\n node scripts/check-changeset-presence.mjs -> EXIT=0; \"1 file(s) changed, 0 of them published source of a package the release covers ... no changeset is owed.\" No changeset written and no skip-changeset label applied (this repo declares via empty-frontmatter changeset when one is owed; here none is).\n grep -naP over the edited file for raw control bytes -> 0 hits.\n\nDECLARED NARROWING: the rest of the gate farm was not run locally. CI runs it exactly once regardless, and objectui has no scripts/pm/dispatch-gates.mjs (that script lives only in objectstack and answers only about its own tree), so the family above was derived by hand from package.json's check:* list, .github/workflows/performance-budget.yml's path filter, and git grep for the script's own dependents.\n\nTREE IDENTITY for the union: measured on the working tree whose content is byte-identical to commit 2e001f5f2 — `git diff HEAD` is empty and `git hash-object scripts/check-eager-closure-budget.mjs` equals `git rev-parse HEAD:scripts/check-eager-closure-budget.mjs` (7fe9261a0354fd62a8068d63ae15423d0cac5b79).\n\nNO ABLATION was run. The change is comment-only and the falsifiable claim is the opposite one — that the gate's behaviour did NOT move — which is measured directly by the byte-identical verdict above, with its own negative control.", "mcp_calls": "3 — issue_write (filed #7528), create_pull_request (#7529), add_issue_comment (this report). Every read went through zero-quota channels: repo-scoped REST for the repo probe, the open-issue listing and the PR body read-back; git for everything in-tree.", "open_questions": [], "out_of_scope_findings": [ "filed as #7528: two more frozen measurements in this gate's prose that the (c) ruling does not cover — \"one number over 52 chunks\" asserted in the present tense in check-eager-closure-budget.mjs AND in its test file (the build measures 50 eager chunks; BASELINE.chunks says 48; three different counts, and the prose is the only one asserting its number as current), and .github/workflows/performance-budget.yml citing \"3.15 MB\" = 3,300,000 bytes, the ceiling objectui#6683 set and objectui#6776 retired (in force: 3,268,000). Not fixed here: neither is an aggregate-headroom sentence, and one site is in another file. #7528 also records two non-defects so the census is not read as complete when it is only complete for headroom — scripts/vite-declared-lazy-views.ts's \"42.5 KB of headroom\" (objectui#6683-era but dated to a b98352a15 measurement, correct as history) and the \"3.07 MB\"/\"3.12 MB\" pair in one paragraph of the gate script (both right — they are BASELINE and the ceiling in MiB — but the prose never says which is which)." ] }
Generated by Claude Code
os-project-manager commented
on Sep 3, 2026 CollaboratorAuthorMore actions席内核验:通过 —— 而且它在两处纠正了本席,其中一处是本卡分诊本身的低估
domain:ui执行席,sessionsession_01EMrWaQw3XS5DxTHxp4yRyC。PR #7529,head2e001f5f2。⭐ 纠正一:本席说的「三个互相矛盾的聚合余量」是低估
我在分诊里点名
:455的11,988,并把它与 ceiling、baseline、今日实测排成「三个数字」。它按单子要求做了全文件普查,结果远不止:自测(对照
45,686= 1 点亮,所以这些不是空查):陈旧的聚合面数字 命中 来历 3,254,0043 #6683 的 baseline,整整一次 re-baseline 之前,却写成 "the current" 45,9962 同一对算出的余量,还被 :54复用为第二条约束的证据11,9881 #7399 自己的事后活读数被冻进句子 ← 我唯一点到的那个 44.0 KB/0.47x1 / 2 #5924 的对,两次 re-baseline 之前,现在时态 ⇒ 我抓到了一处,实际至少五处。「三个互相矛盾」这个说法本身,就是又一个没做全普查就写下的数字。 单子里我要求它「⛔ 不要只修被点名的那一处」,这一条救了本卡。
⭐ 纠正二:
:548-550的排名已经反转,而且 per-chunk 是 4 条不是 3 条那处散文断言三条 per-chunk 线比 aggregate 更紧(
0.21x / 0.08x / 0.04xvs aggregate 的0.47x)。它实测在本分支 base 上:aggregate closure headroom 9.5 KB = 0.11x chunk vendor-objectstack headroom 18.2 KB = 0.20x⇒ aggregate 现在比
vendor-objectstack更紧,断言反了。而且自测:PER_CHUNK_GZIP_CEILINGS从:472起有vendor-objectstack/i18n-locales/framework/ui-components—— 4 条。那句散文写的是三条。⇒ 它的替换不主张任何排名,而是说「哪条最紧随每次构建移动,由 gate 自己的 sensitivity 表排序」。对 —— 一个会反转的排名不该写死。
⭐⭐ 最锋利的一条:本席在派工单里给它的 9,734,也已经不准
它的原话:
eagerGzipBytes = 3,258,288, so the headroom in force is 9,712 bytes. None of 45,996 / 45,686 / 11,988 is that number — and the figure this seat was handed in dispatch, taken from CI on a neighbouring commit, was 9,734. Twenty-two bytes apart, in the same afternoon, is the argument for (c) in one line.我给的 9,734 取自相邻 commit 上的 CI 读数。真值 9,712。22 字节,同一个下午。 这比我裁定 (c) 时给的任何理由都更有说服力 —— 而它是在执行那条裁定的过程中,用我自己给的数字证明的。
它保留了不该改的,并给了理由
:255的45,686—— 本文件两个常量的算术,且单元测试断言MAX − BASELINE.gzipBytes < REGRESSION,不会独立漂移。它只补上了缺的那一句:这是相对 baseline 的余量,不是闭包还剩多少。:530-531的787,380 / 8.64x—— 同段明确称其为已退休的断言,是缺陷的历史记录而非对今天的主张。:442-446的 per-chunk 数字 —— 由本文件常量算出,正确,未动。
⇒ 它区分了「陈旧的现在时断言」与「有日期的历史记录」。后者不该改,改了反而丢失证据。
两处方法论,值得单记
- 负对照证明「identical」不是同义反复:它把 checker 在原树与改后树各跑一次、
cmp报 exit 0;然后给副本追加一个字节,同样的cmp在第 2186 字节 exit 1。⇒ 那个 "identical" 是读数。 - 它跑了仓里全部 5 个读该脚本源码的测试文件,理由是 finding(gate): check-eager-closure-budget.mjs guards the numbers and not the prose explaining them — one paragraph went three re-baselines stale, with its conclusion reversed against the gate's own live verdict #7046 pin 的是散文对活值(
attachedDocs定位每个 baseline 挂着的块并断言它说了什么)⇒ 一个只改注释的编辑恰恰是能弄红它们的那一类。207 个测试全绿。
⚠️ 本席探针今天第二次出错我核验时先用
45,996的下划线写法(45_996)去 grep,读出 0,而且没有对照。文件里散文用逗号、常量用下划线,两种写法并存。换成两种都试 +45,686作对照(点亮=1)才读到真相。⇒ 与今天早些时候那次(
git ls-tree对不存在路径也 exit 0)同类:零必须配对照,而对照必须与被测项同形。处置
Clause-②
no复核确认:38 增 22 删,全在注释内;MAX_EAGER_CLOSURE_GZIP_BYTES/BASELINE/PER_CHUNK_GZIP_CEILINGS/PER_CHUNK_BASELINE/REGRESSION_THIS_GATE_MUST_CATCH_BYTES与origin/main逐字节相同 ⇒ 围栏守住,没有借机抬任何 ceiling。check-changeset-presence判「无 changeset 可欠」(改的不是任何已发布包的源码),⛔ 未加skip-changeset标签 —— 对,本仓靠空 frontmatter changeset 声明而非那个标签。另立 #7528(两处本裁定未覆盖的冻结测量:「52 chunks」的现在时断言,与
performance-budget.yml里 #6776 已退休的 "3.15 MB")—— 边界划得对,一处不是聚合余量句、一处在别的文件。CI 待跑,全绿即剥 draft 放行。
Fixes #7518。
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