Diagnosed by the repo:hotcrm PM seat (objectstack#10282) in round 2, while working the 5 unattended dependabot PRs the R1 handover flagged. Filed and graded in one stroke under the maintainer's standing grading authorisation (2026-08-20, 「finding 你可以自己定级」) — the grading rationale is at the bottom.
The defect
This repo carries two lockfiles: pnpm-lock.yaml (dev) and package-lock.json (StackBlitz). scripts/check-stackblitz-lock.mjs verifies the second is in sync with package.json, and it runs as the first step after install in Build and Test (22.x), under bash -e.
Dependabot's npm updates change package.json and pnpm-lock.yaml. They do not touch package-lock.json — dependabot has no knowledge of a second, non-canonical lockfile.
⇒ The moment a dependabot npm PR opens, package-lock.json is stale by construction, the lock check fails at step one, and validate / lint / typecheck / build / the test suite never run. The PR cannot go green, and no amount of rebasing or re-running will change that.
Measured, with a control
Files touched by #1179 — read from the PR, not inferred: package.json, pnpm-lock.yaml. No package-lock.json.
| PR |
ecosystem |
touches package.json? |
Build and Test (22.x) |
duration |
| #585 |
github_actions |
no |
success |
— |
| #658 |
npm_and_yarn |
yes |
failure |
19s |
| #1179 |
npm_and_yarn |
yes |
failure |
18s |
#585 is the control that makes this a diagnosis rather than a correlation: it bumps a GitHub Action, leaves package.json alone, and its Build and Test (22.x) is green. The two that touch package.json both die in under 20 seconds — the fast-fail signature of a first-step failure, not of a test failure.
(#585 is blocked by something else entirely: Check Changeset failed on it, while on the newer #658 and #1179 that same gate reports skipped. So the changeset gate's treatment of dependabot changed at some point between 2026-08-01 and 2026-08-14, and #585 is simply stale — it likely needs nothing but a re-run against current main.)
Why this is worth fixing rather than clearing by hand
Merging these five by hand fixes today and nothing else: the sixth dependabot PR arrives red the same way. Five PRs are already stalled, the oldest since 2026-08-01, and the backlog is self-replenishing. A security update would sit in exactly the same trap — and #1225 is already an open finding about advisories in the StackBlitz install tree, which is the tree this very lockfile describes.
Directions (not ruled)
- Teach CI to regenerate. A job on dependabot branches that runs the lockfile regeneration and pushes the result back onto the PR. Keeps the gate honest and makes dependabot PRs self-healing.
- Widen dependabot's reach. Add an
npm ecosystem entry so the package-lock.json is updated as its own update stream. Simplest config change; risks the two lockfiles resolving to different versions, since they float independently.
- Scope the gate. Let the check tolerate a stale
package-lock.json on dependabot branches and require the regeneration at release time instead. Cheapest, and the worst on "declared = enforced" — it puts the exemplar's published install tree behind a gate that no longer watches it.
⚠️ Whichever route: regeneration in this repo is time-sensitive, because in-range floats resolve to whatever is newest at that moment, and the root block names 12 @objectstack/* entries while the lockfile records 62 across the transitive family. ⛔ Never hand-edit either lockfile.
Grading rationale
pm:queue, not the decision inbox: the three directions differ in cost and taste, but the defect is unambiguous and no product question is at stake — this is CI infrastructure that does not do what it was built to do. Under the startup-focus principle it still earns a place, because the alternative is an unbounded manual tax on every future dependency update, on the repo whose published install tree is part of the product demo.
Refs #1225 · PRs #585 #658 #1058 #1178 #1179
Diagnosed by the
repo:hotcrmPM seat (objectstack#10282) in round 2, while working the 5 unattended dependabot PRs the R1 handover flagged. Filed and graded in one stroke under the maintainer's standing grading authorisation (2026-08-20, 「finding 你可以自己定级」) — the grading rationale is at the bottom.The defect
This repo carries two lockfiles:
pnpm-lock.yaml(dev) andpackage-lock.json(StackBlitz).scripts/check-stackblitz-lock.mjsverifies the second is in sync withpackage.json, and it runs as the first step after install inBuild and Test (22.x), underbash -e.Dependabot's npm updates change
package.jsonandpnpm-lock.yaml. They do not touchpackage-lock.json— dependabot has no knowledge of a second, non-canonical lockfile.⇒ The moment a dependabot npm PR opens,
package-lock.jsonis stale by construction, the lock check fails at step one, andvalidate/lint/typecheck/build/ the test suite never run. The PR cannot go green, and no amount of rebasing or re-running will change that.Measured, with a control
Files touched by #1179 — read from the PR, not inferred:
package.json,pnpm-lock.yaml. Nopackage-lock.json.package.json?Build and Test (22.x)github_actionsnpm_and_yarnnpm_and_yarn#585 is the control that makes this a diagnosis rather than a correlation: it bumps a GitHub Action, leaves
package.jsonalone, and itsBuild and Test (22.x)is green. The two that touchpackage.jsonboth die in under 20 seconds — the fast-fail signature of a first-step failure, not of a test failure.(#585 is blocked by something else entirely:
Check Changesetfailed on it, while on the newer #658 and #1179 that same gate reports skipped. So the changeset gate's treatment of dependabot changed at some point between 2026-08-01 and 2026-08-14, and #585 is simply stale — it likely needs nothing but a re-run against currentmain.)Why this is worth fixing rather than clearing by hand
Merging these five by hand fixes today and nothing else: the sixth dependabot PR arrives red the same way. Five PRs are already stalled, the oldest since 2026-08-01, and the backlog is self-replenishing. A security update would sit in exactly the same trap — and #1225 is already an open finding about advisories in the StackBlitz install tree, which is the tree this very lockfile describes.
Directions (not ruled)
npmecosystem entry so thepackage-lock.jsonis updated as its own update stream. Simplest config change; risks the two lockfiles resolving to different versions, since they float independently.package-lock.jsonon dependabot branches and require the regeneration at release time instead. Cheapest, and the worst on "declared = enforced" — it puts the exemplar's published install tree behind a gate that no longer watches it.@objectstack/*entries while the lockfile records 62 across the transitive family. ⛔ Never hand-edit either lockfile.Grading rationale
pm:queue, not the decision inbox: the three directions differ in cost and taste, but the defect is unambiguous and no product question is at stake — this is CI infrastructure that does not do what it was built to do. Under the startup-focus principle it still earns a place, because the alternative is an unbounded manual tax on every future dependency update, on the repo whose published install tree is part of the product demo.Refs #1225 · PRs #585 #658 #1058 #1178 #1179