mirror of
https://github.com/shankar0123/certctl.git
synced 2026-06-07 12:31:29 +00:00
5c5bbedc7e
Acquisition-audit SCALE-007 closure (Sprint 6 ACQ, 2026-05-16).
The web/src codebase has ~45 React.lazy() call sites (`grep -rE
'lazy\(' web/src --include='*.tsx' | wc -l`), heavily route-
splitting the SPA. Pre-2026-05-16 there was no CI guard on bundle
size, so unintended bloat in a vendor chunk or a page chunk would
slip in unnoticed until somebody profiled cold-start performance.
This commit adds:
- web/.size-limit.json — 11 budget entries: per-chunk caps on the
load-bearing chunks (main entry, vendor-recharts, vendor-react,
vendor-query, vendor-router, vendor-icons, OnboardingWizard,
CommandPalette, Timestamp) + two roll-up tiers (total vendor JS,
total app JS). Budgets tuned to current vite-build output +
~15% headroom in brotli-compressed bytes (the size-limit
default measurement mode — closest analogue to what a real
browser downloads).
- web/package.json + web/package-lock.json: `npm run size` script
+ size-limit + @size-limit/file devDeps.
- .github/workflows/ci.yml: new "Frontend bundle-size budget
(size-limit)" step in the frontend-build job, runs immediately
after the vite build.
- scripts/ci-guards/G-frontend-bundle-budget.sh: local-runnable
wrapper matching the existing ci-guards/<id>.sh contract — exits
0 on clean, non-zero with ::error:: prefix on regression.
Acceptance verified locally:
- npm install in web/ regenerates package-lock cleanly
- `npm run size` exits 0 against the committed web/dist/
- `bash scripts/ci-guards/G-frontend-bundle-budget.sh` exits 0
- All current chunks measured (brotli, kB): main entry 23.3
(cap 30), vendor-recharts 91.2 (cap 110), vendor-react 37.4
(cap 45), OnboardingWizard 28.6 (cap 35), total vendor 149.5
(cap 180), total app 351.1 (cap 425)
A regression that bloats a chunk past its cap fails CI and forces
an explicit operator decision: fix the regression, or raise the
cap in web/.size-limit.json with a rationale comment in the
commit message. Do not raise caps blindly.
58 lines
1.3 KiB
JSON
58 lines
1.3 KiB
JSON
[
|
|
{
|
|
"name": "Main entry (index-*.js)",
|
|
"path": "dist/assets/index-*.js",
|
|
"limit": "30 KB"
|
|
},
|
|
{
|
|
"name": "vendor-recharts (chart library)",
|
|
"path": "dist/assets/vendor-recharts-*.js",
|
|
"limit": "110 KB"
|
|
},
|
|
{
|
|
"name": "vendor-react (react + react-dom)",
|
|
"path": "dist/assets/vendor-react-*.js",
|
|
"limit": "45 KB"
|
|
},
|
|
{
|
|
"name": "vendor-query (TanStack Query)",
|
|
"path": "dist/assets/vendor-query-*.js",
|
|
"limit": "10 KB"
|
|
},
|
|
{
|
|
"name": "vendor-router (React Router)",
|
|
"path": "dist/assets/vendor-router-*.js",
|
|
"limit": "10 KB"
|
|
},
|
|
{
|
|
"name": "vendor-icons (lucide-react subset)",
|
|
"path": "dist/assets/vendor-icons-*.js",
|
|
"limit": "8 KB"
|
|
},
|
|
{
|
|
"name": "OnboardingWizard (heaviest page chunk)",
|
|
"path": "dist/assets/OnboardingWizard-*.js",
|
|
"limit": "35 KB"
|
|
},
|
|
{
|
|
"name": "CommandPalette",
|
|
"path": "dist/assets/CommandPalette-*.js",
|
|
"limit": "18 KB"
|
|
},
|
|
{
|
|
"name": "Timestamp utility",
|
|
"path": "dist/assets/Timestamp-*.js",
|
|
"limit": "17 KB"
|
|
},
|
|
{
|
|
"name": "Total vendor JS",
|
|
"path": "dist/assets/vendor-*.js",
|
|
"limit": "180 KB"
|
|
},
|
|
{
|
|
"name": "Total app JS (all chunks combined)",
|
|
"path": "dist/assets/*.js",
|
|
"limit": "425 KB"
|
|
}
|
|
]
|