adacovex 1.21.0¶
Date: 2026-08-23
Version bumped 1.20.0 -> 1.21.0.
Changes¶
C1: Fix raw CSS rendered as text in --serve dashboard¶
The dashboard page shell (resources/dashboard.html) had a duplicated
</style> tag: the custom dashboard CSS was closed, the vendored
charts.min.css was then inlined outside any <style> block, and a
second </style> closed the head. Browsers rendered the entire vendored
CSS as literal text at the top of the page. The template is now a single
<style> block (custom CSS + vendored Charts.css + a single </style>)
regenerated via tools/gen-dashboard.py, so the page is self-contained and
valid HTML again. No visual change beyond the bug being gone.
C2: Dependency tree text spacing, scope filtering, and overview collation¶
The tree’s typography is tightened: line-height 1.5 -> 1.65, node margins 4px -> 6px, leaf padding 6x8 -> 8x12, gaps 8px -> 10px, and a hover border-color: var(--accent) transition. Every <li class="dep-node"> now carries data-scope (base / dev / transitive / vendored) and data-name, and the toolbar gains four scope checkboxes (base, dev, transitive, vendored – all checked by default) plus Expand all / Collapse all. A new filterByScope() JS function composes the name filter and the scope filters so dev and vendored deps can be hidden without losing the hierarchy (and re-renders the nomnoml diagram when visible). The dep-filter input is now visually consistent with the global search box (padding:7px 12px; border-radius:8px; font-size:.88rem).
The Overview tab is also more useful: after the Source Overview / Quick Stats grid it now shows a collation chart-grid with three mini visuals (SPARK donut, Tests pie, Docs bar) so the key pies/bars are visible without leaving the overview. The same data-scope attribute drives the scope pie in C3.
C3: Charts – pie, bar, line, area and scope-aware extras where suitable¶
Renderers.HTML.Render_Charts now has a graph-aware overload
(Doc, Proof, Tests, Graph) (the old 3-arg form remains as a wrapper) and
emits four new visuals in the Charts tab (now 8 cards total):
Tests Pass/Fail pie – passed vs failed slice (previously only the per-category bar existed, so a single failing test was easy to miss);
Dependencies by Scope pie – counts of base / dev / transitive / vendored components from the resolved graph (skipped when the graph is empty);
Proof (line) –
charts-css linevariant of the proof categories, same data as the column chart but as a line, for trend-appropriate comparison;Docs Area –
charts-css areavariant of the doc coverage bar.
Existing charts are kept (SPARK donut now proved vs unproved, proof
categories column, test categories bar normalised to the max, doc coverage
bar) and now correctly use 0..1 --size fractions. The chart grid stays
repeat(auto-fit, minmax(280px, 1fr)) inside the tab panel. The Overview
tab also gains a collation row with three mini charts (SPARK donut, Tests
pie, Docs bar) for a quick summary without leaving the overview. See
docs/dashboard.md#metrics-charts.
C4: Dependency hierarchy alternative view with vendored nomnoml and graphre¶
The Dependencies tab gains a second view: Tree (default) vs
Diagram (nomnoml). The diagram is rendered with vendored
nomnoml 1.7.0 (MIT, resources/nomnoml.js, 71 KB) plus its layout engine graphre 0.1.3 (MIT, resources/graphre.js, 38 KB, inlined before nomnoml as global.graphre). Without graphre, nomnoml.draw throws graphlib is undefined (the UMD wrapper require('graphre') expects global.graphre). Both are inlined into the single-file dashboard template so the diagram works offline. ADACOVEX_GRAPH (injected as __GRAPH_JSON__ by the Ada renderer) is converted to nomnoml source ([parent]-->[child] edges, #direction: right, plus a legend note) and drawn via nomnoml.draw(canvas, src). The view switch is persisted in localStorage (adacovex-dep-view) and hash-routed, with Re-render and Download PNG buttons.
Scope checkboxes filter both views (tree hides nodes via data-scope, diagram re-renders from the filtered set after filterByScope()). Control characters (\x01) in the vendored graphre bundle are sanitized to \x01 escapes so the Ada template remains pure ASCII and make ascii-check passes. Credits and license updated in docs/THIRD_PARTY_NOTICES.md.
C5: Vendor FlexSearch for dashboard search indexing and responsive layout¶
The dashboard header gains a global search box (packages, HLRs, deps) powered by vendored FlexSearch 0.7.31 (Apache-2.0, resources/flexsearch.js, 16 KB, inlined before the theme/tab script). At page load the index is hydrated robustly for both FlexSearch 0.7 (FlexSearch. Index) and 0.8 (FlexSearch as constructor) APIs: FlexSearch. Index({tokenize:'forward'}) with a try fallback, populated from ADACOVEX_GRAPH.dependencies and from rendered data-name attributes.
Queries are served from the index (20-hit limit) with a DOM fallback, and hits appear in a search-hits dropdown (absolute, max-height:240px, z-index:10) that is keyboard-focusable and jumps to the Dependencies tab while seeding dep-filter. The header is now responsive: flex:1 1 200px search box with @media(max-width:640px) stacking, and the dep-filter input in the Dependencies toolbar is unified to the same padding:7px 12px; border-radius:8px; font-size:.88rem as the global box (previously 8px 10px / .9rem vs .88rem). See docs/dashboard.md and docs/THIRD_PARTY_NOTICES.md.
C6: Man pages are now single source of truth from source¶
Adacovex. Renderers. Man no longer hard-codes the . SH OPTIONS list. Render_Page now derives the option list at runtime from `Adacovex.
Config. Flag_List(the sameKnown_Flagsthat drives–helpand shell completion), iterating the space-separated flag table and emitting a. TPentry per flag via a centralDesc_Formap. Adding a flag toKnown_Flagsautomatically adds a man entry (with a fallback generic line) even before a bespoke description is added, so the man page,–help`, and completion can never drift.
A future tools/gen-man.py generator (parity with gen-dashboard.py / gen-version.py) is documented as the next step, but the runtime derivation already makes Flag_List the single source. The man --check / man --dir / man --force flow and the installed page header (adacovex vX. Y. Z) are unchanged.
C7: Check for vendored dependencies including JS assets¶
Discover_Vendored_Components in parsers-manifest.adb now scans
resources/ (and vendor/ / assets/ if present) for *.js / *.css
assets in addition to .adacovex/patches/*.ads. Each charts.min.css,
nomnoml.js, graphre.js, and flexsearch.js is added as a
Scope_Vendored pkg:generic/<name> dependency of the root, so
adacovex --target=. (and --emit-metrics / /api/deps) now lists the
vendored JS/CSS that the dashboard inlines. The dashboard’s scope pie and
its filter checkboxes therefore show vendored vs dev vs transitive vs base
correctly, and make check can gate on vendored presence. The result-cache
schema is bumped s3 -> s4 so stale graphs without vendored assets are
never served.
Fixes¶
H1: Dashboard served valid HTML again and nomnoml no longer throws¶
Covered by C1: the duplicated </style> that caused the vendored CSS to be
rendered as text is removed. make ascii-check and tools/gen-dashboard.py --check both pass; the served page at http://127.0.0.1:8080/ now shows
styled cards, not raw CSS. Covered by C4: vendored graphre.js is now
inlined before nomnoml.js so nomnoml.draw no longer throws
graphlib is undefined (global.graphre is defined by the UMD wrapper).
Control characters (\x01) in the graphre bundle are sanitized to \x01
escapes so the Ada template remains pure ASCII and alr build no longer
errors with control character not allowed in string.
Test Suite¶
886 tests passing (unchanged) across 14 categories. No new test categories
added in this release; the existing HTML rendering, man page, and server
routing expectations continue to pin the dashboard shell and the /api/deps
route. A follow-up will add renderer tests for the new chart pies and the
data-scope attribute.
Proof Results¶
Platinum, 720/720 VCs proved across 49 analysed units (unchanged from
1.20.0): the chart pies, dep-tree scope attributes, nomnoml/flexsearch
inlining (tooling-bundled JS), and the dynamic man page all live in
default-off bodies or are Python/JS tooling – no new SPARK obligations. 0
unproved, 0 justified. Re-verified with adacovex prove --target=. --force under gnatprove 16.1.0 (--steps=10000).
Traceability¶
No new HLRs. Coverage:
HLR-DASH– C1 raw-CSS fix, C2 tree spacing, C3 scope/test pies, C4 nomnoml diagram, C5 FlexSearch indexing (renderer, dashboard docs, third-party notices);HLR-CLI/HLR-DOC– C6 man page single source (man renderer, config flag list);HLR-SBOM– dependency graph already covers scope filtering (no new SBOM surface).
See docs/dashboard.md, docs/cli-reference.md, docs/THIRD_PARTY_NOTICES.md.