One contract line, published first so G re-emits against it. §7.2a added.
THE COLLISION, MEASURED: both packs number items positionally from zero, so all 120 godverse
ids are also generic-pack ids — 120/120 overlap. An id-equality gate cannot discriminate which
pack a rendered item came from; that is exactly why the brief's own #7a spec was vacuous. (The
vacuous-gate law's first application broke the law — and my own R23 metric had the same disease.)
THE RULE (§7.2a): items[].id MUST derive from the source's stable key, never from position, and
MUST be unique across ALL packs. Real-stock packs: id = "sku_" + <POS sku> (G's snapshot already
carries `sku` per item, e.g. 20260314070442 — it's just dropped at emit, so this is index-only).
Generic packs keep rec_NNNN as their namespace; real-stock must not emit into it.
TWO REASONS, and the second outlives the gate:
1. positional ids collide by construction (the 120/120 above) -> id-equality gates can't
discriminate. Sku ids fix that permanently, now, at two atlases instead of fifty.
2. POSITION IS NOT IDENTITY: a positional id renumbers on every re-bake — sell one record out of
crate 550 and rec_0050 silently becomes a different record. Anything holding an id across
snapshots (a wallet purchase, a saved dig, a gate assertion, and above all tier-2's
sold-means-gone) would point at the wrong item. The POS sku is stable because it is the shop's
own identity for that copy (release_id identifies the pressing, not the copy). So this is also
the identity tier-2 will need, bought now for free.
SCOPE: index-only — no atlas bytes, no town cache, no goldens, no C code (id isn't read by the
loader, §7.3; the dig/buy consumers and gates read it).
-> G: re-emit with sku_ ids. -> E: assert the form (present, unique within pack, sku_-prefixed).
Committed by explicit pathspec — F's six staged files sit untouched, as its session left them.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>