Skip to content

A member that fails to extract exits 4 from a directory compare but 1 from a single-pair one

Index: Known gaps

Status (re-verified 2026-10-09 at 456989f): POLICY_NOTE. The entry records a maintainer ruling 'keep both' (exit 1 scalar vs 4 release for an extraction failure); both are documented in docs/reference/exit-codes.md, and changing either needs an ADR-064 amendment.

Recorded, not fixed (lane A, A2(b), 2026-10-09; maintainer ruling: keep both). A single-pair compare whose operand cannot be dumped (for example a truncated ELF) aborts with a CLI error and exits 1. The same pair as the only member of a directory/package release produces a member ERROR entry and the release exits 4 with exit.reasons: ["operational_error"]. Both behaviours are documented in docs/reference/exit-codes.md. Reproduce: put the same corrupt libm0.so in old/ and new/, then run compare old/libm0.so new/libm0.so (exit 1) and compare old new (exit 4).

This is the one axis where a release of one member and a scalar compare of that member disagree. The release fold takes each member's compatibility contribution from the scalar resolver (resolve_compare_exit_decision, stamped by workflows.member_compare.member_exit_decision), and tests/test_compare_cardinality_invariance.py pins the agreement on every axis where a comparison completed. A member that never compared has no scalar decision to fold, so it falls to the release's own operational-error axis. Making the two agree means changing a public exit code in one direction: either a release exits 1 for a failed member, or a scalar dump failure exits 4 and reads as an ABI break. Either change needs an ADR-064 amendment.