fix: repair main after an unreviewed commit, and record the cause
Three separate problems, all traceable to `git add -A` sweeping up a working
tree I had not inspected.
Commit 69020b25 ("docs: make the component sections executable") committed far
more than docs: 79 files of a half-scaffolded inter-app example, and four of
those files were truncated mid-statement. That broke `bun run typecheck` on
main. The example is reverted to its last green six-file form. The truncated
fragments and the fuller working copy are NOT in this commit -- if any of that
workspace was wanted, it needs to be reconstructed deliberately and committed on
its own, not as a side effect of a docs change.
Separately, `scripts/generate-ui-complete-catalog.mjs` was run while checking
which helper scripts still work. It rewrites components in place, so it
flattened six of them to stubs, deleted 24 more and lower-cased four filenames
before crashing. Contents were restored from HEAD, but the renames survived
that restore: Windows is case-insensitive, so `git status` reported clean while
Card, Container, Divider and Grid sat on disk under the wrong names. The index
now tracks the capitalised names, which is what the components declare and what
ui-redesign-contract.test.ts reads -- that test would have failed on any
case-sensitive checkout.
Documented both as 4.7 and 4.8 in the remediation plan, with the general rule:
no script that rewrites packages/ui/components/ may write in place. Also fixes
the heading level on 4.6, which was rendering outside section 4.
bun run check is green: 1,433 pass, 0 fail.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -581,7 +581,7 @@ confusing ways.
|
||||
|
||||
---
|
||||
|
||||
## 4.6 Runtime and client-module size — measured
|
||||
### 4.6 Runtime and client-module size — measured
|
||||
|
||||
A per-subsystem measurement of `reactive.js` and of the generated client
|
||||
modules, made by minifying the runtime repeatedly with one subsystem removed
|
||||
@@ -593,7 +593,7 @@ the real number.
|
||||
"about 18%" of the runtime and concluded that splitting saves "3-4 kB gzipped".
|
||||
Both figures were wrong, and the conclusion that followed from them was wrong.
|
||||
|
||||
### The runtime today
|
||||
#### The runtime today
|
||||
|
||||
`reactive.js` is **70,101 bytes minified, 21,736 gzipped**. Removing each
|
||||
subsystem and re-minifying gives its true cost:
|
||||
@@ -619,7 +619,7 @@ fetch, which are framework features) total **23,722 minified / 6,660 gzipped —
|
||||
15,076 gzipped: the expression engine, the scope and reactivity core, and loop
|
||||
diffing.
|
||||
|
||||
### How much of it a page actually uses
|
||||
#### How much of it a page actually uses
|
||||
|
||||
Measured against the example app by checking which controller markers appear in
|
||||
the served HTML:
|
||||
@@ -650,7 +650,7 @@ bun run scripts/lib/measure-runtime-size.ts # core must stay under budget
|
||||
|
||||
Plus a browser check on `/`: zero controller chunks requested.
|
||||
|
||||
### The bigger problem: generated client modules
|
||||
#### The bigger problem: generated client modules
|
||||
|
||||
The runtime is not where the weight is. On `/navigation`:
|
||||
|
||||
@@ -723,6 +723,80 @@ is duplicating itself and should fail the check. Existing behaviour is covered
|
||||
by the current suite, so correctness is the 1,427 tests; this is purely a size
|
||||
assertion on top.
|
||||
|
||||
### 4.7 `generate-ui-complete-catalog.mjs` is broken and destructive
|
||||
|
||||
**Issue.** The script fails partway through with
|
||||
`TypeError: factories[entry.category] is not a function`
|
||||
(`scripts/generate-ui-complete-catalog.mjs:156`) — but not before it has already
|
||||
started writing. It **overwrites real components with bare scaffolds and deletes
|
||||
others**, then crashes, leaving the library in a wrecked state.
|
||||
|
||||
**Evidence.** Running it on 2026-08-09 rewrote Accordion, alert, Badge,
|
||||
AvatarGroup, ToggleCount and LayoutSplitter down to ~15-line stubs, deleted 24
|
||||
component files, and renamed `Card`, `Container`, `Divider` and `Grid` to
|
||||
lowercase — 113 files changed in total. Nothing in `package.json` references it,
|
||||
so no gate runs it and no gate would have caught the damage.
|
||||
|
||||
**Why it is worse than it looks.** The rename is the dangerous part. Windows is
|
||||
case-insensitive, so after `git checkout -- .` the tree reported **clean** while
|
||||
four components were still misnamed on disk. Only a test failure exposed it. On
|
||||
a case-sensitive filesystem the same script produces duplicate files instead.
|
||||
|
||||
**Change.** Pick one:
|
||||
|
||||
- **Delete it.** `generate-ui-component-reference.mjs` is the maintained
|
||||
generator, it is wired into `release:prepare`, and it works. If this script is
|
||||
redundant, it is a loaded gun in the repo for no benefit.
|
||||
- **Or fix and gate it**: make it write to a temp directory and swap atomically
|
||||
only on success, so a mid-run crash cannot leave a partial library. Then add
|
||||
it to a check so it cannot rot again.
|
||||
|
||||
Whichever is chosen, **no script that rewrites `packages/ui/components/` should
|
||||
write in place.** Generate to a staging directory, validate, then move.
|
||||
|
||||
**Related, and worth doing regardless:** several other ungated scripts mutate
|
||||
the repository or start servers when run — `install-captcha.mjs`, the
|
||||
`validate-*.mjs` and `verify-*.mjs` families, and `benchmark-framework.mjs`. All
|
||||
of them fail today. They should either be repaired and gated, or removed. A
|
||||
`scripts/` directory where running a file at random can scaffold apps, start
|
||||
dev servers on ports 3000-3002 and rewrite the component library is a hazard to
|
||||
anyone exploring the repo, human or otherwise.
|
||||
|
||||
**How to test.** After fixing or deleting:
|
||||
|
||||
```bash
|
||||
git status --porcelain # must be empty after running any generator twice
|
||||
```
|
||||
|
||||
Add a check that runs each generator in `--check` mode and fails if it would
|
||||
modify tracked files, the way `check:workspace` and `check:public-api` already
|
||||
do.
|
||||
|
||||
### 4.8 Filename casing is not consistent with the git index
|
||||
|
||||
**Issue.** Four components were tracked in git under lowercase names
|
||||
(`card.wrn`, `container.wrn`, `divider.wrn`, `grid.wrn`) while existing on disk
|
||||
under capitalised ones. Windows hid the discrepancy; `git status` reported clean.
|
||||
|
||||
**Why it matters.** `ui-redesign-contract.test.ts` reads the real directory and
|
||||
expects `Card.wrn`. **On a fresh clone on Linux or in CI the files arrive
|
||||
lowercase and that test fails** — a latent break that could not reproduce on a
|
||||
Windows workstation.
|
||||
|
||||
**Change.** Done — the index now tracks the capitalised names, matching the
|
||||
component each file declares (`component Card`, `component Container`, and so
|
||||
on) and matching every other component in the library.
|
||||
|
||||
**How to test.**
|
||||
|
||||
```bash
|
||||
git ls-files packages/ui/components/ | grep -iE '/(card|container|divider|grid)\.wrn'
|
||||
```
|
||||
|
||||
must return the capitalised names. Better, set `git config core.ignorecase
|
||||
false` locally so a future rename cannot hide again, and consider a check that
|
||||
compares `git ls-files` against the on-disk listing byte for byte.
|
||||
|
||||
## 5. Order of work
|
||||
|
||||
Ranked by return, not by size. The first item changes the cost of every item
|
||||
|
||||
Reference in New Issue
Block a user