Review duplicate ratchet checkpoint — 2026-09-21

The Pass-5 recommendation to ratchet duplication requires lowering the ceiling after removals, not only rejecting additions. The committed baseline still allowed 142 exact groups and 548 named members. The current census is 138 groups and 532 members. This update records that smaller set without adding exceptions, changing normalization or changing runtime behavior.

Before recording, the census was also run with every src/ file read from git show HEAD:<path> instead of the shared dirty worktree. At commit 3a4c16da it accepted the same 138/532 candidate baseline. Thus this ratchet does not depend on another agent's pending source edits.

The 16 removed permissions comprise seven host-import signatures, three CRT exit-handler members and six OLE lifetime-handler members. Their disappearance from the duplicate set does not by itself prove native API conformance.

Verification:

The diagnostic near-duplicate report was also inspected; identical constant stubs and ABI-forwarding wrappers dominate many groups. Sharing unrelated stubs merely to reduce the count would not implement their contracts, so this checkpoint does not alias them together. Pass-5 common-core work (#5), quiet handler/test-call migration (#7), and carried cleanup (#8) remain partial. The separate memory-boundary and dirty-write work is recorded in mapping-dirty-tracking-experiment.md; it is not a completion claim for the whole review.

Shared startup-info initialization

GetStartupInfoA/W duplicated a raw zero-fill over a translated 68-byte caller buffer. At a sparse-page split, the first four bytes were subsequently fixed by gs32(cb) but most of the structure stayed untouched, while the raw fill targeted unrelated backing. Both frontends now call startup_info_init, which uses the shared guest-aware fill and writes cb = 68. Their existing empty startup-data policy and distinct incidental EAX behavior are preserved; this does not implement inherited handles or launcher-provided startup data.

test/test-startup-info-boundaries.js reproduced the A frontend failure at split 1 before the fix. All 67 boundary positions now pass for both encodings (134 cases), with full-structure expectations, canaries, unrelated-page preservation and stdcall cleanup. A/W, exact-duplicate, logical-AND and test-tier gates pass; the new test is discovered automatically (1,400 tests total). This advances shared-core work (#5) without claiming the entire item complete.