adacovex 1.44.0¶
Date: 2026-09-04
Version bumped 1.43.0 -> 1.44.0.
Changes¶
C1: Persistent stat-stamp store (cross-process dirty tracking)¶
The 1.28.0 stamp map dies with the process, so every adacovex invocation
re-opened and re-hashed every unchanged file: sources for scan keys,
manifests, lockfiles, and whole vendored trees for graph keys. 1.44.0
adds a persistent stat-stamp store at ~/.adacovex/stamps/
(machine-local, outside the result cache, so --cache-dir redirection
and cache wipes never cost a re-hash). A record holds the file’s size,
mtime, record time, and SHA-256 digest, keyed by the digest of the path;
a lookup is one open plus four short reads and validates exactly two
stats (size + mtime) against the stored pair. Two safety rules keep a
stale digest from ever being served for edited content: the size AND
mtime must both match, and a file modified during the second the record
was written is never recorded (git’s racy-clean rule). Records expire
after 30 days.
Measured on the self-audit tree: warm-run syscalls drop from ~12k to
~2k (newfstatat ~26.8k -> ~2k), pipeline warm from ~35 ms to ~23 ms,
and pipeline cold from ~86 ms to ~60 ms – a wiped result cache on a
stamped machine now re-serialises instead of re-hashing. New
Persistent_Stamp_Hits / Persistent_Stamp_Misses counters and a
Reset_Process_Stamps diagnostic (also useful to long-lived --serve
processes) make the fast path testable.
C2: The stamp store is size-gated by measurement¶
Consulting the store for small files is a net loss: a lookup costs two
stats plus one open/read/close, while re-hashing a 10 KB source costs
the same open plus a cheap SHA-256 over a tiny payload – measured on
the self-audit tree, stamping the 38 .ads sources made warm runs
slower, not faster. Files below 16 KiB are therefore never recorded and
never looked up; the store earns its keep on the payloads where
re-hashing dominates (vendored manifests, lockfiles, generated assets).
This cost model is the same one language servers apply when deciding
whether dirty-tracking pays for a given document.
C3: Incremental-processing design credited to the studied projects¶
The design was informed by studying two reference projects for their incremental-processing techniques – the Ada Language Server (persistent indexed file sets, cross-session dirty tracking) and tree-sitter (reusable single-buffer parse input) – and the stamp validation follows the shape of git’s index dirty tracking, racy-clean guard included. Neither project is linked into adacovex. The performance-engineering tools the work relies on (perf, strace, hyperfine) are now credited with upstream links in the Third-Party Notices and Credits pages.
Fixes¶
F1: Test-count and stamp-regression hardening¶
The 1.43.0 documentation edits left the perf guide’s optimisation
history without the 1.44.0 entry; the comparison table now tracks the
last five trees. A stamp-store miss counter dropped during development
was restored and pinned by tests (a silent fast-path regression is
visible as Persistent_Stamp_Hits = 0 with a non-empty store, the same
failure shape as the 1.28 name-length bug).
Test Suite¶
The native suite grows from 1222 to 1228 tests across 17 categories, all
passing. Result-cache tests 22+ pin the new store: first hash of a
16 KiB+ file is a store miss, an unchanged file is served from the store
after Reset_Process_Stamps, a size change forces a re-hash with a
changed digest, and a sub-gate file never creates a stamp record.
Proof Results¶
Platinum, 0 unproved, 0 justified, 876 VCs (876 proved) under gnatprove 16.1.0 across 56 analysed units – unchanged: this release touches the cache layer (I/O only, no proof-affecting contracts). Measured at the binary level (hyperfine, 12 logical cores, 10 proof jobs): prove warm ~44 ms, prove cold ~36.4 s at 876 VCs (solver-dominated; the adacovex-side share shrank again), pipeline warm ~23 ms, pipeline cold ~60 ms, warm-run syscalls ~2k. The perf guide’s comparison table now tracks 1.40.0 through 1.44.0.
Traceability¶
No new HLRs. The release changes cache internals, tests, and documentation only; the existing tags below cover it.
HLR-ARCH– C1/C2 the persistent stamp store and its size gate (the on-disk result cache and its machine-local satellite stores are build/architecture infrastructure), F1 the test-count sync, and the perf/credits/notices documentation refresh.HLR-CACHE– C1 the stamp store’s TTL, eviction-independent layout, andReset_Process_Stampscontract.HLR-SCAN/HLR-MANIFEST– C1 the store serves the scan and graph key hashing paths that those parsers drive.