Skip to content

Every queued binding-removal PR records an absolute workspace count; six are stale and the two correct ones collide with each other #10739

Description

@proggeramlug

Every queued native-binding removal PR records the workspace baseline as an absolute count in workspace-architecture.json (workspace_members, decision_counts.externalize/keep), and workspace_architecture.py --check gates on it. The PRs were authored in parallel from a base of 83, so most of them carry a number that main has since moved past.

Read from each PR head via the contents API against main 023dc0b653:

ref members externalize keep
origin/main 80 31 44
#10691 dotenv 79 30 44 correct vs today's main
#10701 uuid 79 30 44 correct vs today's main
#10677 pg 82 32 45 stale
#10680 mysql2 82 32 45 stale
#10693 nanoid 82 32 45 stale
#10704 decimal 82 32 45 stale
#10708 lru-cache 82 32 45 stale
#10712 commander 82 32 45 stale

Two distinct problems.

1. Six PRs record a member count higher than main's. A removal cannot raise workspace_members above the base it lands on. All six will fail workspace_architecture.py --check on rebase. They are also mutually inconsistent — six different crates cannot all produce the same 83→82 transition.

2. The two correct PRs collide with each other. #10691 and #10701 both compute to 79/30/44, because each was computed against main independently. They cannot both be right at merge time: whichever lands second must read 79→78 / 30→29. This is not a defect in either PR — it is inherent to recording an absolute in a queue of sequential removals.

What makes this easy to miss

MERGEABLE does not catch it, and neither does review. The counts live on different JSON lines from the crate entry a removal deletes, so git has no textual conflict to raise and auto-merges both sides cleanly. A PR can rebase green, review clean, and still carry a number that was true a week ago. #10679 demonstrated this today: it was rebased onto current main, came out MERGEABLE, and still recorded 82/32/45.

Rule

At every rebase, for every removal: recompute from the resolved tree and have workspace_architecture.py --check --print-summary independently reproduce the number. Never derive it by arithmetic from the old figure, never copy a sibling's, and never copy one out of prose — including this issue, which will itself be stale as soon as the next removal lands.

The same absolute-count hazard applies to scripts/native_result_ledger.tsv, scripts/string_payload_access_baseline.txt, and the governance/pins tables. Regenerate them with their own scripts rather than resolving them by hand.

Worth considering

The recurring cost here is structural: an absolute count in a tracked file, in a queue of sequential changes that each shift it by one, guarantees that every PR but the front of the queue is wrong. If the baseline were derived at check time rather than recorded, or recorded as a delta, none of these eight PRs would need touching. That is a larger change than the queue should absorb right now, but it is the actual fix — what is described above is a discipline that has to be applied by hand every single time, which is the kind of rule that holds until it doesn't.

Related: #10738 (the ledger gate's path filter means it fires on an unrelated PR).

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

    package-auditFound by the 2026 package audit: compiling real npm packages from source instead of native bindings

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions