Skip to content

Every npm-ecosystem dependabot PR is structurally unmergeable: it updates pnpm-lock.yaml but not package-lock.json, and the StackBlitz lock check is CI's first step #1231

Description

@os-sam

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)

  1. 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.
  2. 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.
  3. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    ci/cdCI plumbing and the verification pipeline

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions