# 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
`` tag: the custom dashboard CSS was closed, the vendored
`charts.min.css` was then inlined *outside* any `` closed the head. Browsers rendered the entire vendored
CSS as literal text at the top of the page. The template is now a single
``)
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 `
` 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 line` variant of the proof categories,
same data as the column chart but as a line, for trend-appropriate
comparison;
- **Docs Area** -- `charts-css area` variant 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](https://github.com/skanaar/nomnoml) (MIT, `resources/nomnoml.js`, 71 KB) plus its layout engine [graphre 0.1.3](https://github.com/cytoscape/graphre) (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](https://github.com/nextapps-de/flexsearch) (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 same `Known_Flags` that drives `--help` and shell completion), iterating the space-separated flag table and emitting a `. TP` entry per flag via a central `Desc_For` map. Adding a flag to `Known_Flags` automatically 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/` 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 `` 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`.