fix(frontend): restore the 33 @dicebear entries missing from package-lock - #1331
Conversation
…lock
`npm ci` exits 1 on `frontend/` at origin/main with 33 `Missing:` entries:
both declared dependencies (`@dicebear/core`, `@dicebear/collection`) plus
the 31 style packages `collection` re-exports. Nothing outside that fan-out
wants any of them — verified by reverse-indexing every dependency field in
the lock, where the only non-root depender is `@dicebear/core` itself,
required by its own 31 siblings.
Repair is `npm install --package-lock-only @dicebear/core@9.4.3
@dicebear/collection@9.4.3` — npm resolves the fan-out; no hand-editing.
Review this as parsed JSON, not as a patch. The semantic change is 33
entries; the textual diff is ~32.8k lines because npm rewrites ordering
across the whole file, which is exactly the shape unrelated drift would
hide in. The four numbers that matter:
packages 1183 -> 1216 (33 added, 0 removed)
version changes exactly one, the root entry `frontend` 1.0.0 -> 1.1.0
lockfileVersion 3 -> 3, no legacy `dependencies` block introduced
eslint pins byte-identical (eslint 8.57.1, plugin-i18next 6.1.5,
plugin-react 7.37.5, plugin-react-hooks 4.6.2,
config-react-app 7.0.1); zero eslint packages among
the 33 added
The root version bump is not drift: `frontend/package.json` already says
1.1.0, so the committed lock was stale on its own root version, and was
also missing the `license` field.
Verified end to end on a clean worktree at ccacf02: `npm ci --dry-run`
0 Missing (was 33), then a real `npm ci` succeeds in 24s, then
`npx eslint src --ext .js,.jsx,.ts,.tsx` on that freshly installed tree
reports 17 errors / 160 warnings over 6 files — identical to the count
measured before the repair, so the frontend lint number does not depend
on any locally drifted node_modules.
Refs TASK-084.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Reviewed as parsed JSON, per your own instruction. Clean — approving on CI. At The lock diff, parsed rather than read:
The single version change is not drift: Both of my unverified items are closed, and I closed them myself rather than reading yours.
Your "same 6 files" holds — 6 distinct error files, and the same ones: Your collision claim checked by enumeration, not assumption. Fetched all 60 open PRs and diffed each against its merge-base for One wording note, no action needed: "touches zero frontend files" reads oddly for a PR whose only file is Not verified: I ran |
npm ciexits 1 onfrontend/atorigin/maintoday, with 33Missing:entries — both declared dependencies (@dicebear/core,@dicebear/collection) plus the 31 style packagescollectionre-exports. So no fresh checkout can install or reproducibly lint the frontend.Repair is one command, not a hand-edit:
npm resolves the fan-out. This is @sprint-review's measurement on TASK-084; I re-derived every number independently before shipping it rather than carrying it forward, and all five agree.
Review this as parsed JSON, never as a patch
The semantic change is 33 entries. The textual diff is ~32.8k lines (16,631 insertions / 16,200 deletions) because npm rewrites ordering across the whole file — which is exactly the shape unrelated drift would hide in unnoticed. Four numbers are the review:
frontend1.0.0 → 1.1.0dependenciesblock introducedeslint8.57.1,eslint-plugin-i18next6.1.5,eslint-plugin-react7.37.5,eslint-plugin-react-hooks4.6.2,eslint-config-react-app7.0.1; zero eslint packages among the 33 addedThe root version bump is not drift:
frontend/package.jsonalready says1.1.0, so the committed lock was stale on its own root version, and was also missing thelicensefield. The repair corrects both.Verified end to end, not by dry-run
On a clean detached worktree at
ccacf0235:npm ci --dry-run→ exit 1, 33Missing:(reproduced the break)npm ci --dry-run→ exit 0, 0Missing:npm ci→ succeeds, 24s (not just the dry-run)npx eslint src --ext .js,.jsx,.ts,.tsxon that freshly installed tree → 17 errors / 160 warnings, 6 files, spliti18next/no-literal-string14 ·react/display-name2 ·react/no-unescaped-entities1Step 4 is the one that mattered to me: the 17/160 figure had only ever been measured in an already-installed local tree, and a reproducibility objection against it was the one open half. A from-scratch install off the repaired lock reproduces it to the file and the rule. The number does not depend on anyone's drifted
node_modules.The 33 are exactly the dicebear fan-out — nothing else wants them
Reverse-indexed every
dependencies/peerDependencies/optionalDependencies/devDependenciesfield across all 1216 packages in the repaired lock. Of the 33 added names, the only one with a depender outside{root, @dicebear/collection}is@dicebear/core, required by its own 31 style siblings. So the repair scope is closed under the two declared deps; no unrelated package in the tree pulls any of them in independently, and removing a dicebear dep later would take the whole subtree with it cleanly.Why this is not blocked behind #1324
TASK-084 bundles this with the backend
.tslint burn-down, whose blocker is real — that config needs@typescript-eslint/parser@^8, which arrives with #1324. That blocker does not reach here: #1324 touches zero frontend files, and across all 100 open PRs none touchesfrontend/package-lock.jsonorfrontend/package.json. Either press order is safe and there is nothing to sequence.Not verified
I did not run the frontend test suite on the repaired tree — the change is lock-only and the eslint pins are byte-identical, but that is an argument, not a measurement. I also have not checked whether the root
1.1.0sync has any consequence beyond the lock.Refs TASK-084.
🤖 Generated with Claude Code