G2 — Build-config matrix into compare, and bundle completion¶
Registry: UC-WF-probe-matrix (complete), UC-WF-bundle (complete), UC-TC-cxx-standard-floor (complete)
Effort: M · Risk: medium (verdict-composition semantics)
Problem¶
This plan is now complete. It originally tracked two capabilities that existed but were not reachable from the mainline gate:
- Build-config matrix —
abicheck/probe_harness.py+diff_build_config.pydetectAPI_DEPENDS_ON_CONSUMER_ENV,CXX_STANDARD_FLOOR_RAISED, andBEHAVIOURAL_DEFAULT_CHANGED, but only via the separateabicheck probecommand. They now feedcompare/compare-releasevia--probe-matrix-old/new. - Bundle analysis —
abicheck/bundle.pydetects cross-DSO breakage, butcompare-releasewiring is now complete for explicit cohorts, including case84.
Goal & acceptance criteria¶
- [x]
compare/compare-releasemerge matrix findings into the verdict (worst-of), with the matrix ChangeKinds appearing in the report. Shipped as--probe-matrix-old/--probe-matrix-new(pre-built matrix snapshots fromabicheck probe run) rather than an inline--probe-spec: running a matrix needs compilers, so it stays a separateprobe runstep that feeds the comparison, keeping the compare commands hermetic. Oncomparethe findings join the change list (JSON + SARIF); oncompare-releasethey are release-global, so they run through the samechecker.comparepipeline (over empty snapshots) —--suppressrules and--policy-fileoverrides apply identically to both commands — then fold into the worst-of release verdict and surface as amatrix_findingssection in the JSON/markdown summary and as a dedicated testsuite in JUnit output. Verified end-to-end for both commands intests/test_probe_examples.pyand at the unit level intests/test_cli_split_modules.py. - [x] Case 98 (
CXX_STANDARD_FLOOR_RAISED) reaches its intended verdict through the mainline command (JSON + SARIF), not onlyprobe compare. Case 97 (API_DEPENDS_ON_CONSUMER_ENV) now also fires end-to-end: the harness gap is closed —parse_elf_metadatafalls back to.symtabwhen a relocatable probe.ohas no.dynsym, so the object's defined global symbols are captured and the detector fires over the real compiled surface, reaching the mainlinecompareoutput (tests/test_probe_examples.py,tests/test_elf_object_surface.py). - [x]
compare-releaseemitsbundle_soname_skew; case84 lostskip: trueand is validated end-to-end (tests/test_bundle.py::TestCompareReleaseBundleE2E). The check is opt-in via--bundle-cohort PREFIX(repeatable): cohorts are declared, never inferred from filenames, so an ordinary release that bumps one independent library while a sibling lags is not a false positive. - [x] Two additional self-contained probe specs under
examples/probes/(feature_macro.yaml,cxx_standard.yaml) with an end-to-end test (stockcc/c++, no external toolchain).
Design¶
- Matrix-into-compare: add a
--probe-specoption tocompare_cmd(abicheck/cli.py) andcompare-release. When present, runrun_probe_matrix()for each side,diff_matrix()the pair, and append the resultingChanges to theDiffResultbeforecompute_verdict. Verdict composition is already worst-of, so no policy change is required; matrix kinds are already classified inchange_registry.py. - Confidence: when probes are partial, set
DiffResult.confidence=lowand add acoverage_warning(mirrorprobe compare --allow-failures). - Bundle wiring: finish the
compare-release→bundle.pypath sodetect_bundle_soname_skew()and the other bundle detectors run on the per-library cohort; surface bundle findings in the summary report. Removeskip: truefrom case84 and add thegen_bundle.shbuild to CI.
Files & surfaces¶
abicheck/cli.py,abicheck/cli_compare_release.py(--probe-spec, bundle wiring).abicheck/service.py(run_compareaccepts an optional matrix).abicheck/bundle.py(cohort entry point fromcompare-release).examples/probes/*.yaml(new specs);examples/case84_bundle_soname_skew/.
Tests¶
- Unit: matrix merge into
DiffResult; verdict worst-of with a matrix kind. @pytest.mark.integration: probe build +compare --probe-spec; bundle skew viagen_bundle.sh.- Update
ground_truth.jsonfor case84/97/98 and the autodiscovery harness.
Out of scope¶
Non-Linux bundle analysis (no DT_NEEDED/.gnu.version_* equivalent — track
under G1). Auto-deriving a matrix without a spec.