deps(docs): restore the caret on react-dom now that Dependabot groups the pair - #276
Conversation
… the pair `apps/docs/package.json` declared the two halves of a peer-coupled pair in different shapes: `react` floating on `^19.2.7`, `react-dom` pinned exact at `19.2.7`. The pin was a deliberate, bounded workaround — `react-dom@X` peer-requires `react@^X`, `react` was out of that card's scope, and a caret on `react-dom` resolved upward and broke the peer check. `.github/dependabot.yml` now groups `react` and `react-dom` under one `react` group, so the two arrive as a single PR and move together. That is the mechanism the pin was standing in for, so the pin has outlived its reason. Keeping both is belt-and-braces: not wrong, but it hides which mechanism is load-bearing, and it leaves an asymmetry that reads as intentional while the thing that would catch a drift does not fire — a future non-frozen install can float `react` up while `react-dom` stays put, the peer range `^19.2.7` permits it, no tool complains, and React itself requires the pair to match. Specifier shape only. No version moves: `pnpm install --lockfile-only` changes exactly one lockfile line, `specifier: 19.2.7` to `specifier: ^19.2.7`, and the resolved `version: 19.2.7(react@19.2.7)` is unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ChPQM8jamxLUfUAxwFpJ8S
What the Worker size gate reported on this PRRun 34248195235, job Against a same-tree baseline
So the reading moved -3.37 KiB (-0.006 %), and the percentage of the limit is unchanged at 89.34 %. Reporting it rather than absorbing it, since the card asked for any movement — but it is not claimed as caused by this change, and it should not be read that way: no resolved dependency version moves here, so the installed graph is identical. The reading has drift of the same order on inputs that provably cannot differ. The figure the dispatch quoted (~58554 KiB, 89.35 %) is that Generated by Claude Code |
Fixes #238
apps/docs/package.jsondeclared the two halves of a peer-coupled pair in different shapes —reactfloating on^19.2.7,react-dompinned exact at19.2.7. This restores the caret onreact-dom.Why the pin can go
The pin was a deliberate, bounded workaround:
react-dom@Xpeer-requiresreact@^X,reactwas out of that card's scope, and a caret onreact-domresolved upward and broke the peer check..github/dependabot.ymlnow carries areactgroup with bothreactandreact-dompatterns, so the pair arrives as one PR and moves together — the mechanism the pin was standing in for.Nothing is broken today; both halves resolve to 19.2.7. The defect is that the asymmetry reads as intentional while the thing that would catch a drift does not fire: a future non-frozen install can float
reactup whilereact-domstays pinned, the peer range^19.2.7permits it, no tool complains, and React itself requires the pair to match. Keeping both the group and the pin is belt-and-braces — not wrong, but it hides which mechanism is load-bearing.What changed — two lines, one per file
pnpm install --lockfile-onlyafter the manifest edit moves exactly one lockfile line:The resolved version does not move —
react-domstaysversion: 19.2.7(react@19.2.7), andreactstays19.2.7. This is a specifier shape change, not a version bump. The diff reproduces the measurement taken on PR #236 byte for byte, so the premise the card was dispatched on still holds on87880ba.Gates run locally, each with its own verdict
pnpm install --frozen-lockfile --lockfile-only— exit 0,Done in 1.2s. This is CI's first step and the one a lockfile edit can break.node .github/scripts/check-node-floor.mjs --self-test— exit 0,17 rule case(s), 24 satisfies case(s) and 18 range case(s) — every rule demonstrated able to fail.node .github/scripts/check-node-floor.mjs— exit 0,Every declared floor clears what the dependency tree requires, and the declarations agree. Run because this gate readspnpm-lock.yamlas text, so it is directly implicated by the file this PR edits. It reports 430enginesblocks scanned and a required floor of 22.0.0, unchanged.The frozen-lockfile green was ablated rather than trusted, since a validator observed only green is indistinguishable from one that cannot go red. Mutating the manifest specifier to
^19.9.9(confirmed on disk: blob9bc55e3to9cb316a, injected-marker count 1, removed-marker count 0) took that check to exit 1 withERR_PNPM_OUTDATED_LOCKFILE ... react-dom (lockfile: ^19.2.7, manifest: ^19.9.9)— which also independently confirms the committed lockfile now carries^19.2.7. Restoring fromHEADreproduced blob9bc55e3exactly,git diff HEADempty, and the check returned to exit 0.The docs build,
zh-Hant, locale-surface, Worker packaging and Worker size gates are CI's on this PR; they need a full install and the built.nexttree.Worker bundle
pnpm-lock.yamlis one ofdeploy-docs.yml's trigger paths, so merging this deploys the docs site — that path is CI-gated now with a post-deploy live smoke check and auto-rollback. Thebuildjob also weighs the Worker on every pull request against the 61440 KiB budget. A specifier-only change that moves no resolved version should not move that reading at all; the figure this PR's gate actually reports is quoted in a comment below rather than asserted here in advance.Scope
apps/docs/package.jsonandpnpm-lock.yamlonly — no other file is touched..github/workflows/ci.ymlis deliberately untouched (a sibling card is in flight on it). No dependency is upgraded. This repo has no changeset flow, so there is no changeset.Generated by Claude Code in session
session_01ChPQM8jamxLUfUAxwFpJ8S(durable attribution in prose, since a later body edit rewrites the footer link below).Generated by Claude Code