#315 cold-vs-warm .fco witness (ADR-0017 byte-identity) is broken — pre-existing at cbb941f, invisible to test-fast-sharded

open
Opened by atgreen

Found while landing ADR-0032 Stage A (whose gates were designed against this witness). The funcl-warm.fco == funcl-warm-cold.fco byte-identity gate (ert: the count-diff-bytes==0 test at tests/bootstrap.el ~2957) FAILS on fresh builds, and bisection shows it fails at every commit tested back to and including cbb941f (2026-07-13, the fasl v3 header commit):

Shape of the divergence: bundle sizes are EQUAL; all differing bytes are CO-header mmap-offset fields plus a population of cross-region rel32s. The first CO's recorded start offset differs by ~0x150-0x230 between producers — i.e. the two producers' PRELUDE EMISSION differs in size (~560B out of ~790KB), and every downstream offset/rel32 shifts with it. Both preludes compile the same embedded source, so the asymmetry has to come from pool-dependent emission decisions (ag-arena-baked-reuse-vaddr consults each binary's own static pool; funcl-cold's is a subset of stage2's) or another producer-divergent input that one of the pre-cbb941f fasl-campaign commits (ce0157b / 2aa2724 / cbb941f or earlier) introduced. Not bisected past cbb941f.

Why nobody noticed: the witness test is NOT in test-fast-sharded (the standard pre-push gate — 179 of 209 ert tests; zero bundle tests in the shard logs). Only a full serial test-bootstrap runs it, and that hasn't been run in a while.

Two work items:

  1. Bisect past cbb941f and fix the producer asymmetry (or make the serializer normalize the offset fields + remaining cross-region rel32s so the witness is layout-insensitive — the zero-rel32 approach that fixed the original 96-byte residue, extended).
  2. Get the witness into the fast gate: it needs funcl-cold + both fcos (~5 min incremental) — worth a dedicated make target (test-witness) documented in CLAUDE.md as part of the pre-push checklist for emission-touching changes.

Comments (0)

No comments yet.