Project Goals¶
The product direction is owned by the repository-root
vision.md (rendered here verbatim): abicheck helps library and
package maintainers understand and validate API/ABI evolution, grounded in
compatibility analysis. This page has two jobs that the vision deliberately
does not take on: it names the enduring goals that direction implies, and
it keeps the historical milestones — the ABICC-parity programme this
project started from — as history. Concrete, in-progress work lives in the
implementation plans and the
use-case registry, never here.
Enduring goals¶
| Goal | What it means in practice | Where the work is tracked |
|---|---|---|
| Trusted compatibility verdicts | Binary breaks, source-only breaks, and deployment risks stay separate, with evidence coverage stated and no manufactured findings | Verdicts, Evidence & Detectability, ADR-009/042/064 |
| Visible surface evolution | Additions, removals, and modifications are all first-class, and what policy hid stays auditable | ADR-067, vision workstream plan |
| Scope-sensitive analysis | One model for one or many components; package and release contracts apply only when selected; partial matrices are never read as removals | ADR-065 |
| Honest evidence | Missing, failed, unsupported, not applicable, and not requested are distinct; weaker evidence narrows conclusions | ADR-028/049/050/063, plan |
| Project-defined versioning and history | Versioning policy and strictness decide acceptance, never facts; longitudinal tracking over immutable snapshots | ADR-066 |
| CI-first delivery | GitHub Action first, identical semantics through the CLI and typed Python API | ADR-017/047/055, GitHub Action |
| Honest platform and domain scope | Linux/C/C++ first with SYCL inside C++; Windows/macOS with stated capability; CPython/scientific Python as the next optional provider domain; header-only as intended scope | Platforms, SciPy roadmap, G4/G45 |
Historical milestones¶
Context, as it stood when the project started:
abi-compliance-checker(ABICC) is no longer actively maintained.libabigailis maintained by Red Hat but focuses on DWARF-only binary analysis.abicheckbegan as a modern Python alternative — drop-in compatible with ABICC first, then better. The six goals below were that programme; their "Done" notes are kept as history and are not the whole vision.
Goal 1 — Drop-In Replacement for ABICC¶
Support everything ABICC currently does so existing users and pipelines can migrate without changes:
- Same detection coverage (C/C++ ABI breaks: symbols, types, vtables, enums, layout)
- CLI compatible with ABICC inputs (XML descriptors, headers + libs)
- JSON/HTML/Markdown reports with equivalent verdict semantics
- Support for suppression files
Done: 408 ChangeKinds implemented; YAML suppression files fully supported; ABICC compat CLI supports -symbols-list and -types-list whitelist flags (plain-text, one name per line); XML report generation for ABICC-compatible output; ABICC compat CLI with all major flags; auto-forwarding abicheck compat <flags> to compat check; test parity for ABICC 2.3. Superseded (2026-10): the compat CLI, descriptors and XML reports were removed before 0.6 (ADR-012, retired); detection parity with ABICC is still measured (tests/test_abicc_parity.py).
Goal 2 — Close Known Gaps + Extend¶
Fix known ABICC / libabigail limitations and add new detection capability:
- Toolchain/flag drift detection (
DW_AT_producer,-fshort-enums,-fpack-struct) - DWARF-aware layout analysis (calling convention, packing, RTTI/visibility boundaries)
- Header/API surface diff (AST-based, macro contracts, inline/template changes)
- Confidence/evidence tiers in output (ELF_ONLY / DWARF_AWARE / HEADER_AWARE)
Done: DWARF-aware struct/enum layout; calling convention, packing, toolchain flags detection; AST-DWARF deduplication; field qualifiers (const/volatile/mutable); enum/parameter rename heuristics; ELF_ONLY visibility tier used throughout detection; Confidence enum (high/medium/low) on DiffResult with coverage_warnings for disabled detectors (v0.2.0).
Done: Formalized the canonical evidence_tier scalar (ELF_ONLY / DWARF_AWARE / HEADER_AWARE, ordered by analysis depth) in the JSON output schema, alongside the existing raw evidence_tiers list. HEADER_AWARE is now distinct from DWARF_AWARE: the presence of a header/AST surface promotes the tier above DWARF-only debug info. See EvidenceTier in checker_policy.py.
Backlog (MSVC end-to-end hardening): Windows CI includes a non-blocking MSVC + PDB lane, while MinGW/native cross-platform coverage is part of the regular validation story. Promoting the MSVC lane to blocking and broadening its fixture matrix are tracked in docs/contribute/backlog.md.
In progress (scientific-Python direction): the CPython-extension-adjacent gap
work (G14 abi3, G23 Python-level API) generalizes toward scientific-Python
distributions specifically — compiled Python wheels have compatibility
surfaces (Cython capsule APIs, the NumPy C-API, multi-platform wheel
deployment claims) that plain native-symbol analysis doesn't see. Scoped as
three new planned gaps: G25 (Cython API/ABI frontend), G26 (NumPy C-API
compatibility envelope), G27 (wheel tag/deployment-claim verification across
Linux/macOS/Windows). See the
SciPy / Scientific-Python Roadmap for
the full ten-item vision this scoping was drawn from.
Goal 3 — Pass libabigail Test Suite¶
Run abicheck against libabigail's own regression test cases and reach 100% pass rate:
- Mirror libabigail's
tests/corpus as integration examples - Add per-case expected verdicts to CI
- Use as the compatibility regression gate before each release
Done: ~54 parity test functions across multiple suites (test_abicc_parity, test_abicc_full_parity, test_abidiff_parity, test_xml_parity, test_sprint7/10 parity); 13 new ABI compatibility test cases (cases 42, 49–62); sentinel enum detection; function deletion edge-case hardening (abicc #100).
Goal 4 — Agent-Friendly Design¶
Make the tool convenient for AI agents and automation pipelines:
- Structured JSON output (machine-readable, no scraping)
- Clear exit codes:
comparecommand: 0 = compatible/no_change, 2 = source break, 4 = breaking ABI change
- Python API (
from abicheck.service import run_compare) — not just CLI -o json=-/markdownoutput modes- Snapshot files for offline/async workflows (
abicheck dump→.abi.json)
Done: JSON output, snapshot format, exit codes (0/2/4), SARIF 2.1.0 output; GitHub Action (abicheck/abicheck@v0.3.0) for CI; report filtering (--show-only, --report-mode leaf|impact) for CI gate pipelines, plus a -o oneline=- one-line summary (originally reached via a built-in --profile quick, removed outright by ADR-068 D5). (An MCP server for AI-agent integration shipped and was later removed; agent integrations now use the CLI's structured JSON/SARIF output or the typed Python API directly.)
Goal 5 — Compatibility Break Encyclopedia¶
For each break type: what it is, how it appears in the real world, and which tool detects it:
examples/caseXX_*/— minimal compilable C/C++ examples- Per-case
README.mdwith: scenario → what breaks → which tools detect → severity - Comparison table:
abicheckvsabiccvslibabigailvsnm-only - Coverage matrix showing evidence tier required (ELF-only / DWARF / Header / Runtime)
Done: 143 example cases with per-case README.md; the original 74-case subset remains the release-pinned cross-tool benchmark; gap report with coverage matrix (abicheck vs ABICC vs libabigail vs nm); the consolidated ABI/API Compatibility guide plus the generated Examples Encyclopedia; cross-platform CMake build support for all single-library example cases.
Goal 6 — Distribution & Documentation¶
conda-forge package¶
Distribute via conda-forge — conda install -c conda-forge abicheck.
castxmldeclared as a conda run dependency so users get a working install with zero manual setup.- PyPI remains available (
pip install abicheck) for users who prefer pip, with castxml as a documented external prerequisite. - conda-forge recipe auto-updates on each PyPI release via conda-forge bot.
GitHub Pages documentation site¶
Public documentation at https://abicheck.github.io/abicheck/:
- Getting started / installation
- CLI reference
- ABI break catalog (rendered from
examples/) - Tool comparison table
- Architecture overview
Done: MkDocs (Material theme) site with full navigation; GitHub Actions auto-deploy to GitHub Pages on main push; docs include getting-started, CLI reference, case catalog, tool comparison, SARIF guide, ABICC compat guide, troubleshooting; published to PyPI and conda-forge; Trusted Publishing (OIDC) for PyPI; publish workflow with dry-run mode.
Status summary¶
| Goal | Status |
|---|---|
| G1: ABICC drop-in | Done, then retired — 408 ChangeKinds and suppression files remain; the compat CLI and XML reports were removed before 0.6 |
| G2: Known gaps | DWARF layout, toolchain flags, AST-DWARF dedup, confidence tracking, canonical evidence tier (ELF_ONLY/DWARF_AWARE/HEADER_AWARE) done |
| G3: libabigail tests | Done — ~54 parity test functions + 143 example cases |
| G4: Agent-friendly | Done — JSON, SARIF, exit codes, snapshots, typed Python API, GitHub Action (an MCP server shipped and was later removed) |
| G5: Break encyclopedia | Done — 143 example cases + consolidated ABI/API handling guide + coverage matrix |
| G6: Distribution & docs | Done — PyPI, conda-forge, MkDocs + GitHub Pages |
Non-goals¶
- Runtime instrumentation or dynamic analysis — abicheck is a static offline tool.
- Source-level refactoring suggestions — it reports what broke, not how to fix your code.
- General-purpose analysis of non-native source languages (Rust, Go, Java, …) —
out of scope. The one exception: CPython extension modules get a narrow,
purpose-built frontend (
abicheck/python_api.py,diff_python_api.py; gap G23,docs/contribute/plans/g23-python-level-api-diff.md) that recovers the Python-level API surface (.pyi/signatures) a native extension exposes toimport— this is a native-ABI-adjacent contract check, not general Rust/Go/ Java source analysis, and ADR-034 (managed-runtime/non-C frontends) remains a proposal for anything broader. - Static / import library archives (
.a,.lib) — currently unsupported input, not a permanent exclusion. abicheck compares single linkable images (shared libraries and objects), notarmember archives; a static library has no runtime ABI surface (no SONAME, no dynamic symbol table), and handing one todump/compareproduces a clear error rather than a misleading result (the G8 decision). Extract members (ar x lib.a) and compare the resulting objects, or the shared library built from them, instead. The vision records a bounded, lower-priority investigation into which archive questions can honestly be answered (relinking precompiled objects versus a full rebuild, thin archives, LTO members, import libraries versus static libraries) — tracked in the vision workstream plan; nothing about archive acceptance changes until that investigation reaches a separately scoped decision. See limitations.