Decisions
September 23, 2026 ยท View on GitHub
One entry per decision: date, what was decided, why, what it costs. Reversals are new entries, never edits. Measured figures carry their host and libzstd version.
ADR-001 (2026-09-23) Releases are snapshots, not milestones
A version number marks what a stranger can verify (./verify.sh), nothing about what
comes next. Fixes ship as soon as they are judged; a research result gets its own
release and paper. Consequence: v1.0.2 is a maintenance release for users of 1.0.1.
ADR-002 (2026-09-23) The decoder fails closed
Every zstd frame is checked for error and exact size (zdec_ok); parallel paths raise
g_dec_err, entry points reset and check it, range paths return nullptr and the
library returns ACEAPEX_ERR_DATA. Before: a failed frame left malloc garbage and the
call reported success (region on a pre-field archive without FSE_CHUNK, 21.09).
Guarded by the contract claim region_fails_closed_legacy. Commit f3814f6.
ADR-003 (2026-09-23) Ratio expectations are keyed by libzstd version
Archive bytes depend on the code and the libzstd version and on nothing else about the host: identical to five decimals on 16/12/4/2 cores and three compilers at 1.5.5. The contract carries the 1.4.8 figures (the papers) and the 1.5.5 figures, judged at 1e-5 on both; an unknown version gets 1 percent and says so in the record. Rejected: a silent wide tolerance (3.2 to 3.8 percent since 1f92b5a) while the record said 1e-5.
ADR-004 (2026-09-23) Core-count dependence of archive bytes: withdrawn
Suspected on 22.09 from three different default ratios; refuted: LIT_LANES 2 and 16
give byte-identical archives on chr1, enwik8 and silesia, and the differences were
libzstd (ADR-003). The 3.72329 default figure of 11.09 reproduces on no known host and
was replaced by 3.72821 (1.4.8) / 3.73164 (1.5.5).
ADR-005 (2026-09-22) Paper tags are immutable; judges live in main
verify.sh checks each paper tag out into a detached worktree and runs
verify/judges/<tag>.sh from main, so a judge can improve without touching what was
submitted. A fail with a stated condition and reason (verify/known/<tag>.tsv) is
reported as known-deviation in its own column, never as pass. First entry: the
paper5-v1 ratios on libzstd other than 1.4.8.
ADR-006 (2026-09-21) The CLI is built from the library translation unit
make compiles src/aceapex_api.cpp with -DACEAPEX_CLI: one copy of the codec, and
the CLI reaches the public API (aceapex r). g++ src/aceapex_main.cpp alone still
builds c/d/t. Judged: archives byte-identical to the previous binary. Commit 7e393f8.
ADR-007 (2026-09-21) aceapex_depth.cpp stays a fork, unported, for now
The reproduction contract builds its encoder from aceapex_depth.cpp (4f0797f), a
2035-line fork that predates the chunk field; its archives are read by the library
through FSE_CHUNK in the environment, stated in the contract. Only the fork carries
--fai, --region/--range, --profile, --view. Porting the field into the fork or
merging the fork into src/ is a separate decision; the contract is not the place.
Open
- GPU figures in the README were taken in July on code that predates the literal transform, literal chunking and the chunk field. The README front page is rewritten only after they are re-measured on the current code (plan B3), with dates.
- Second independent decoder: none. Blocks any path to a standard.
rans1_v4(order-1 literals) replaces the DNA transform rather than adding to it; the default ratio would be recomputed as a whole. Undecided.