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).
Every queued native-binding removal PR records the workspace baseline as an absolute count in
workspace-architecture.json(workspace_members,decision_counts.externalize/keep), andworkspace_architecture.py --checkgates 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:origin/mainTwo distinct problems.
1. Six PRs record a member count higher than main's. A removal cannot raise
workspace_membersabove the base it lands on. All six will failworkspace_architecture.py --checkon 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
MERGEABLEdoes 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 outMERGEABLE, 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-summaryindependently 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).