adacovex 1.8.0

Date: 2026-08-13

Version bumped 1.7.0 -> 1.8.0.

Changes

C1: On-disk result caching

Analysis results are cached on disk under ~/.adacovex/cache/<version>/, keyed by the SHA-256 of each input artifact. Unchanged source files serve their parsed Package_Info from the cache instead of being re-scanned; unchanged gnatprove.out and test-result files likewise serve their parsed summaries. Cache effectiveness (X hit(s), Y miss(es), Z evicted) is reported in the ANSI report. Controlled by --cache (default on), --no-cache, --cache-dir=PATH, and --cache-max=N (default 4096); --no-cache forces every run to re-scan / re-parse / re-prove, which is useful when artifacts change but keep the same content hash.

C2: Cache-schema namespace and overflow-safe serialization

The default cache root is ~/.adacovex/cache/<version>/<Cache_Schema>; bumping Cache_Schema (in src/core/adacovex-cache.ads) invalidates blobs written by incompatible builds instead of serving them as if valid. Serialize returns an empty blob when a payload would exceed Max_Cache_Blob (callers refuse to store it) and Deserialize rejects empty/oversized input, so truncated data can never be served as a cache hit.

C3: --target path normalization

--target is normalised to a canonical absolute path (./.. collapsed) before scanning, so the File_Path values stored in cached Package_Info no longer depend on how the target was spelled (e.g. --target=../Ada_CRDT vs --target=.). Docstring patches are matched by the package path relative to the target root, so a cached path spelled through a different relative form silently left those patches unapplied; normalization makes the cache consistent across invocations.

C4: Alire manifest compatibility

auto-gpr-with is expressed in its boolean form (true); the string form auto-gpr-with = "adacovex.gpr" is rejected by the released alr 2.1.1 (Cannot read valid property), which blocked alr build and therefore make build / make test / make run-self.

C5: HLR completeness

HLR-CACHE (Result caching) and HLR-CPU (Cross-platform CPU core detection) are now defined in docs/compliance/HLR.md, removing the orphan source tags and restoring DAL-C Achieved in strict mode.

C6: Ada_CRDT make targets

The covex/prove/badges/sbom/coverage-gate targets resolve the sibling ../adacovex binary when present and fall back to alr exec -- adacovex otherwise, so make prove / make badges / make sbom work both in the workspace and on CI.

C7: CI result-cache persistence

The composite action gains a result-cache input (default on) that persists ~/.adacovex/cache between workflow runs with actions/cache; content-addressed entries make restoring a stale cache always safe, so incremental branches get mostly cache hits.

C8: Toolchain-aware proof cache and standalone gnatprove deployment

The GNATprove result-cache key now folds in the resolved prover identity (the manifest-pinned version for alire-managed deployments, else the resolved executable/toolchain path), so a proof produced by one gnatprove is never reused after an upgrade or a different on-PATH / cached / downloaded toolchain – stale entries simply miss and are transparently re-proved, with no explicit invalidation. The prove subcommand also stops composing the target’s entire dev-manifest dependency set: instead of alr exec -- gnatprove (which could pull covex / gnatdoc_bin / gnatformat_bin and, for dev-only gnatprove, swap manifests for the run), it deploys only the self-contained gnatprove binary crate into ~/.adacovex/toolchain via alr -n get gnatprove=<version> and runs the deployed binary directly. The manifest version set expression (^15.1.0, ~15.1.0, …) is reduced to the bare version alr accepts. CI proof runs now depend on a single crate download instead of the full dev-manifest dependency closure, and the dev-manifest swap machinery is gone.

Fixes

H1: Cache eviction

The cache root is stored without a trailing separator, and the eviction helpers (Count_Files, Oldest_File) guard on Ada.Directories.Kind instead of Exists, which returns False for a bare directory on some GNAT versions. Together these make --cache-max eviction actually enforce the entry cap (previously all entries were retained).

Test Suite

336/336 native tests passing; counts unchanged (no test files modified in this release).

Proof Results

Self-assessment remains Platinum (all VCs proved, 0 unproved, AoRTE-free). make prove re-ran gnatprove 15.1.0 against the current tree: 503/503 VCs proved across 38 analysed units. The cache, CLI, main-flow, and prove-resolution changes live in non-SPARK units (Adacovex. Cache, Adacovex. CPUs, `Adacovex.

Config, Adacovex. Prove, adacovex_main), so no SPARK proof metrics regress. Ada_CRDT re-proved clean too: 584/584 VCs (44 justified) across 34 analysed units, Platinum. Proof runs now deploy gnatprove standalone via alr -n get gnatprove=15.1.0into~/.adacovex/toolchain` and execute that binary directly; identical inputs hit the newly toolchain-aware result cache (verified: 30 hit(s), 0 miss(es) on re-run).

Traceability

New HLRs: -- HLR-CACHE on Adacovex. Cache (Result caching) and -- HLR-CPU on Adacovex. CPUs (Cross-platform CPU core detection). Existing tags continue to cover the changed packages: -- HLR-SCAN on `Adacovex.

Parsers. Source(scanning + patch application),– HLR-CLIonAdacovex. Config(path normalization, prove options),– HLR-PROVEonAdacovex. Prove, and – HLR-PROOFonAdacovex.

Parsers. GNATprove`.