adacovex 1.13.0

Date: 2026-08-18 Version bumped 1.12.0 -> 1.13.0.

Changes

C1: man --force and the OPTIONS wrap fix

The man renderer’s OPTIONS descriptions carried a leading tab that misaligned every wrapped continuation line (groff placed the first line at the .TP tab stop but wrapped lines at the paragraph indent). Descriptions are now emitted as single logical lines so groff wraps them with the proper hanging indent – the whole page (SYNOPSIS, MODES, OPTIONS, ENVIRONMENT, EXIT STATUS) renders cleanly. man also gains --force: normally adacovex man skips re-installing when the installed page already matches the binary, and --force always overwrites (useful to repair a corrupted page or re-run mandb).

C2: unknown flags rejected with a “did you mean” suggestion

An unknown --flag now fails with exit code 1 and prints “Unknown option” plus a suggestion of the closest known flag (edit distance <= 2), so a typo like --target=. --theme=dar or --srev is caught instead of silently ignored. Known flags are unaffected and help topics still resolve for unknown-but-fuzzy-matching inputs.

C3: doc-sync tools scan the whole tree (no hardcoded file lists)

tools/update-proof-status.py and tools/update-test-count.py previously rewrote a hardcoded list of docs, which let stale metrics live in any file not on the list (e.g. the 601/601 test count in alire/long-description.txt re-propagated to every manifest by the next make description). Both tools now share tools/live_files.py, which derives the file set from the tree: every text file is scanned except generated outputs (docs/api-docs, docs/badges, docs/test_result.md, sbom.json, the generated Ada specs), historical records (past-release changelogs and past proof ledgers keep their release-time numbers), and the tools themselves. Both also gained a --check mode that fails when any live file carries a stale metric, and tools/update-doc-links.py gained the same. The stale pre-1.12.0 VC counts in CONTRIBUTING.md and the crate-description proved/total phrasing are covered by new anchored patterns, as are the JSON API sample fields ("total_vcs" / "proved_vcs" / "tests_passed" / "tests_failed" in the README and CLI reference) and the Makefile help’s “Platinum, N VCs” comma form – so every number in the docs is anchored to generated artifacts (obj/gnatprove/gnatprove.out and docs/test_result.md) rather than a hand-written claim.

C4: make check gate ordering + tree-wide count-sync checks

make check now runs cheap static gates first (ascii, spark-off, changelog, version source, doc links) so a formatting or sync problem fails before the expensive build + SPARK proof, then build / test / prove / doc / sbom, then the count-sync checks (test-count --check, proof-status --check, description --check) so a stale metric anywhere in the tree fails the gate loudly instead of silently drifting into the next release. The README’s Makefile-targets section, make help, and the AGENTS.md table were updated accordingly.

C5: README slimmed (433 lines, was 508)

Detail duplicated from the docs was trimmed and pointed at its canonical page: the VCS snapshot table (now one line, pointing at cli-reference’s VCS section), the compliance-artifacts-identical paragraph (pointing at standards.md), the full Makefile-targets table (pointing at AGENTS.md), the install/bundle instructions (condensed with the attestation + Linux-x86-64 notes kept), and the trust section (tightened). The JSON API section, flag table, and examples remain in the README.

C6: AI/LLM usage documented on a dedicated page

The Ken Thompson Reflections on Trusting Trust reference, the AI assistance disclosure, and the “why should I trust your code” argument moved out of the README into docs/llm-usage.md, which also documents how LLM agents are expected to work on the tree under AGENTS.md (match conventions, zero library dependency, SPARK discipline, make check as the contract, regenerate generated files rather than hand-editing them) and how every number in the docs is anchored to generated artifacts via the tree-wide sync tools rather than a written claim. The README now links to the page.

C7: unknown flags with no suggestion print the full usage

An unknown flag that has no close-enough known flag (edit distance > 2) now prints the full usage text to stdout after the one-line error, so a completely unrecognized token lands the user on the flag list instead of a bare error. Near-miss typos still get just the “did you mean” hint (no usage dump). A new Unknown_No_Suggest config flag drives the behaviour; config tests cover all three cases (no-match flag, near-miss flag, no-match bare word).

C8: adacovex action works when referenced via uses: ./

The action’s build/download steps read github.action_repository, which is empty when the action is referenced by a local path (uses: ./) – the consumer branch then tried to clone https://github.com/.git and failed with exit 128, breaking adacovex’s own consumer-run-tests CI job. Both steps now fall back to github.repository (the workflow’s own repo, which IS adacovex for the self-test), and the build step falls back to github.sha for the ref so the scratch clone checks out the exact commit under test.

C9: installation methods on a dedicated page

docs/installation.md now covers the three install routes (Alire manifest dependency, alr install, release bundle / source build), the per-method version source, and keeping the man page in sync. The README’s install section shrank to a two-line summary pointing at it, the giant CLI flag table was dropped (the brief subcommand code block remains, with the full table in docs/cli-reference.md), the JSON API section was condensed to the endpoint + a curl example, and the README’s documentation table now links the dashboard/JSON-API section directly. The README also now calls out that --serve serves a viewable HTML dashboard at / (not just an API).

C10: LLM-usage page expanded

The page gained a “Working in a fork or branch” section (the make check workflow as arbiter), a “served dashboard as a trust surface” section, and an “honest limits” section (presence vs accuracy, SPARK-proof bar, changelog validator) – all anchored to the same gates and artifacts as the rest of the docs.

C11: generated-file generators skip rewriting when unchanged

tools/gen-version.py and tools/gen-dashboard.py now compare the generated output against the committed file and skip the write (printing “up to date”) when byte-identical, so make build no longer touches two generated files on every run – git status stays quiet and the build output is shorter.

Test Suite

659 tests (was 501), across 12 categories. The CLI-config category (124 checks, up from 112) adds: man --force parsing (with and without the prove-options guard), unknown-flag rejection with exit code 1, “did you mean” suggestions for near-miss flags (single/multi character edits, missing dashes), and the Unknown_No_Suggest contract (set for a no-match unknown flag and bare word, unset for a near-miss flag that produces a suggestion); the HTML/Markdown renderers category (34 checks) covers the dashboard’s theme dropdown (all three options, the data-initial-theme CLI-theme marker, the Save settings button, saveTheme persistence, the ? theme= query param, the embed hint, the bundled template shell, data-theme override, prefers-color-scheme, and localStorage, plus no leftover __CARDS__/__THEME__ placeholders) on top of the standard-aware dashboard and JSON output; the DAL compliance category (16) gained the cached-HLR parse round-trip; the SBOM generator category (118) gained the dependency-graph cache round-trip; the Man page renderer category (18 checks) covers page structure, the embedded version, an install/read-back round-trip, the Update_Database man-db contract, and a SYNOPSIS regression check (single quoted . B lines, no `.

RI` concatenation); the VCS support category (29 checks) covers marker-file detection for every VCS, display and tool-binary names, and the UX-conversion recommendations.

Proof Results

Platinum, 408/408 VCs proved across 45 analysed units (up from 44): the --theme additions (the Dashboard_Theme type and its To_String / To_Theme / Is_Valid_Theme conversions in Adacovex.Types) reuse the already-proved uppercase/parse patterns and add 7 VCs, all proved; the new bundled dashboard template package (Adacovex.Dashboard_Template, a String constant generated from resources/dashboard.html) adds one analysed unit with no proof obligations; the CLI config parser (including the Unknown_No_Suggest field), VCS, and man-page packages are non-SPARK I/O code and add no proof obligations. Proven with make prove under gnatprove 16.1.0 (--steps=10000).

Traceability

No new HLRs. The man --force and unknown-flag work stays covered by the existing HLR-CLI (src/core/adacovex-config.ads); the doc-sync, generator, and gate changes are Python/Makefile tooling that adds no traceability, and the installation/LLM-usage pages are documentation. The action and CI changes are workflow files that add no traceability.