Skip to content

Release fan-out cannot pair a stored snapshot directory with a live one

Index: Known gaps — closed and moot

Status (2026-11-01): CLOSED. Members the file name cannot pair are paired by the library they record (workflows/release_member_pairing), without moving any pair the file name makes. See the archive entry for the rule, the rejected alternative, the tests and the stored-package NEW route fixed alongside it.

A directory (release) compare pairs members by their library key, which is the file name: workflows/release_inputs.py intersects the two sides' key sets. A directory of stored abicheck dump snapshots (libfoo.json) against a directory of live binaries (libfoo.so) therefore pairs nothing. The run completes zero comparisons, both members are reported unmatched, and the process exits 1 with no_comparison_completed. The same bytes compared as scalar operands (compare libfoo.json libfoo.so -H ...) compare normally, and so do the typed API and a live directory against a live directory.

The mismatch is found by family F2's live route matrix (tests/test_family_f2_live_route_matrix.py, KNOWN_ROUTE_DIVERGENCES), and is pinned by the strict-xfail cells release@mixed_old and release@mixed_new. The run is not a silent pass: the exit code and the no_comparison_completed reason say that nothing was compared.

hygiene — A stored/live directory pair is a shape the release engine cannot compare at all. The gap is the missing member identity, not a false clean.

Why it is recorded rather than fixed: pairing a stored snapshot with the live binary it was dumped from needs a member-identity rule (library name, SONAME, or a declared inventory). Changing the key changes which members pair in every existing directory compare, so it is a design decision on the release engine, not a local fix.

What would close it: key a member by its library identity rather than its file name, so libfoo.json and libfoo.so of one library are one member. Then the two strict-xfail cells XPASS, and their entries in KNOWN_ROUTE_DIVERGENCES are removed. Until then, compare such a pair as scalar operands.