docs: implementation plan for package inventory and CVE findings

17 tasks, TDD where the logic is pure. Corrects two spec claims:
the server reads features via License.HasFeature rather than admin's
entitlement directly, and shared/mail/render_test.go does not exist.
This commit is contained in:
2026-08-06 10:49:10 +01:00
parent 00c03c365d
commit fe7bc300e2
2 changed files with 3139 additions and 5 deletions
File diff suppressed because it is too large Load Diff
@@ -392,16 +392,26 @@ CVE; most fields would be disabled in the UI and the uptime graphs would be
polluted with a signal that is not uptime.
This adds one `notify` payload type and a `vuln_digest.html.tmpl` /
`vuln_digest.txt.tmpl` pair in `shared/mail`, since `render_test.go` fails on
any template no case covers.
`vuln_digest.txt.tmpl` pair in `shared/mail`. Note that `shared/mail` templates
are parsed in `init()`, so a mistyped field is a boot-time panic — CLAUDE.md
describes a `render_test.go` guarding against exactly this, but **that file does
not exist**; the repository has no Go tests at all today. The implementation
plan adds it alongside this feature's own tests.
---
## Entitlement
`entitlement.features.vuln_scanning`, a boolean alongside the existing
per-instance feature toggles, so it can later be priced as a catalogue
`feature` component without a second migration. Off on Free.
The feature name is `vuln_scanning`, and it crosses the two services the way
every other feature does:
- **admin** carries it as a per-instance entitlement toggle, so it can later be
priced as a catalogue `feature` component without a second migration;
- **the licence** snapshots it into `License.Features []string` at issue time;
- **the server** asks `lic.HasFeature("vuln_scanning")` and never switches on
tier, so changing what a tier includes needs no server release.
Off on Free.
**The gate is checked at `ReportPackages`, not at display.** Gating only the UI
would still pay every write cost, and storage is the expensive half.