Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
c7021ec
feat(view): runs sidebar, in-app scan runner, shared run discovery
eFAILution Jun 13, 2026
79ef49f
docs(view): add terminal viewer screenshots for runs sidebar + scan r…
eFAILution Jun 13, 2026
102336a
docs(roadmap): add Argus Console epic roadmap
eFAILution Jun 13, 2026
9fed1fe
feat(console): Argus Console — bare-argus home launcher + live settings
eFAILution Jun 13, 2026
5ec4bf4
fix(console): brand-green theme, centered wordmark, tagline + font (P…
eFAILution Jun 13, 2026
1127384
fix(console): commit PNG screenshots so the wordmark renders on GitHub
eFAILution Jun 13, 2026
59fa357
fix(console): center the wordmark as a block
eFAILution Jun 13, 2026
82d1e7b
Merge pull request #262 from huntridge-labs/feat/argus-console
eFAILution Jun 13, 2026
89b20cb
feat(remediation): Tier-1 deterministic Fix engine + TUI Fix overlay
eFAILution Jun 13, 2026
d26d93d
Merge pull request #263 from huntridge-labs/feat/fix-mitigation
eFAILution Jun 13, 2026
73c6daf
feat(console): form editor for argus.yml (Configure screen)
eFAILution Jun 13, 2026
5e12dc4
Merge pull request #264 from huntridge-labs/feat/console-config-editor
eFAILution Jun 13, 2026
9966581
feat(console): in-app init wizard (Initialize screen)
eFAILution Jun 13, 2026
e375afe
Merge pull request #265 from huntridge-labs/feat/console-init-wizard
eFAILution Jun 13, 2026
9a075f8
docs(console): roadmap the modernization program (Phases 5-12)
eFAILution Jun 13, 2026
3aac8db
Merge pull request #266 from huntridge-labs/docs/console-roadmap-v2
eFAILution Jun 13, 2026
1a3de07
feat(console): command palette for the Console (Ctrl+P)
eFAILution Jun 13, 2026
e6838b2
Merge pull request #267 from huntridge-labs/feat/console-modern-nav
eFAILution Jun 13, 2026
acf6f2b
feat(view): live vulnerability intelligence — EPSS + CISA KEV (Phase 6)
eFAILution Jun 13, 2026
99a41a4
Merge pull request #268 from huntridge-labs/feat/console-enrichment
eFAILution Jun 13, 2026
0858479
feat(view): bulk triage → OpenVEX + ignore files (Phase 7)
eFAILution Jun 13, 2026
3f0a05d
Merge pull request #269 from huntridge-labs/feat/console-suppressions
eFAILution Jun 13, 2026
c66706d
feat(view): dependency-free visual analytics on the dashboard (Phase 8)
eFAILution Jun 13, 2026
760880e
Merge pull request #270 from huntridge-labs/feat/console-charts
eFAILution Jun 13, 2026
9b6ae5f
feat(core): terminal graphics capability detection (Phase 9 foundation)
eFAILution Jun 13, 2026
3d4d3ec
Merge pull request #271 from huntridge-labs/feat/console-graphics
eFAILution Jun 13, 2026
d2d5324
feat(view): AI-assisted triage — explain a finding (Phase 10 foundation)
eFAILution Jun 13, 2026
b7f4b61
Merge pull request #272 from huntridge-labs/feat/console-ai
eFAILution Jun 13, 2026
9715df4
feat(view): reachability heuristic — is the dep imported? (Phase 12 f…
eFAILution Jun 13, 2026
406137c
Merge pull request #273 from huntridge-labs/feat/console-reachability
eFAILution Jun 13, 2026
eef12eb
docs: browser & reporting roadmap; retire Console Phase 11 (web serve)
eFAILution Jun 13, 2026
c79e838
docs(browser): add B0 — design system & motion foundation
eFAILution Jun 13, 2026
771070b
Merge pull request #274 from huntridge-labs/docs/browser-roadmap
eFAILution Jun 13, 2026
b0467a1
feat(browser): dashboard charts + motion foundation + docs screenshot…
eFAILution Jun 13, 2026
5f48da1
Merge pull request #275 from huntridge-labs/feat/browser-redesign
eFAILution Jun 13, 2026
9cafbac
docs(browser): regenerate screenshots without the local home path
eFAILution Jun 13, 2026
342ebbc
Merge pull request #276 from huntridge-labs/fix/browser-screenshots-path
eFAILution Jun 13, 2026
4e70565
feat(browser): command palette (Cmd/Ctrl-K) + light-mode theme fixes …
eFAILution Jun 13, 2026
f1bc97c
Merge pull request #277 from huntridge-labs/feat/browser-command-palette
eFAILution Jun 13, 2026
95ecaed
feat(browser): add opt-in EPSS/KEV Risk column to findings table
eFAILution Jun 13, 2026
b04412b
Merge pull request #278 from huntridge-labs/feat/browser-risk-columns
eFAILution Jun 13, 2026
8fac3d3
feat(browser): formal vulnerability report with server-side PDF (B4)
eFAILution Jun 13, 2026
4e3b7cf
Merge pull request #279 from huntridge-labs/feat/browser-report
eFAILution Jun 13, 2026
62fbbf1
feat(browser): persistent sticky scan-context bar (B0 IA)
eFAILution Jun 13, 2026
6c974e4
Merge pull request #280 from huntridge-labs/feat/browser-context-bar
eFAILution Jun 13, 2026
dd6eeb9
fix(console): Configure screen — column overlap, enum picker, focus loss
eFAILution Jun 13, 2026
db76e06
test(console): cover _ChoiceScreen construction (codecov/patch)
eFAILution Jun 13, 2026
b2c5a02
Merge pull request #281 from huntridge-labs/fix/console-config-editor-ux
eFAILution Jun 13, 2026
83d26c7
fix(viewers): resolve latest run for findings + open report in a new tab
eFAILution Jun 13, 2026
2dbc0bd
Merge pull request #282 from huntridge-labs/fix/view-findings-resolut…
eFAILution Jun 13, 2026
6e580a9
feat(view): directory picker for findings — open a scan from anywhere…
eFAILution Jun 14, 2026
7823be6
Merge pull request #283 from huntridge-labs/feat/tui-results-picker
eFAILution Jun 14, 2026
632238e
feat(console): system-readiness chip on the home screen
eFAILution Jun 14, 2026
e83a531
Merge pull request #284 from huntridge-labs/feat/tui-system-status
eFAILution Jun 14, 2026
0a14f47
feat(console): live-preview theme dropdown in Settings
eFAILution Jun 14, 2026
ad2a58f
Merge pull request #285 from huntridge-labs/feat/tui-theme-picker
eFAILution Jun 14, 2026
1eb3b8d
feat(view): loading feedback for init, scan startup, and run switching
eFAILution Jun 14, 2026
4ff2c57
Merge pull request #286 from huntridge-labs/feat/tui-loading-feedback
eFAILution Jun 14, 2026
091909a
docs(readme): bold refresh — showcase the Console, browser, and PDF r…
eFAILution Jun 14, 2026
e080d86
Merge pull request #287 from huntridge-labs/docs/readme-refresh
eFAILution Jun 14, 2026
d34ddd7
fix(browser): replace stale "argus serve" with "argus view browser"
eFAILution Jun 14, 2026
37c7d68
docs(readme): link the hero "Find it / Triage it / Prove it" to their…
eFAILution Jun 14, 2026
0644a10
docs(readme): restore the AICaC badge
eFAILution Jun 14, 2026
e1b9c59
docs(.ai): trim the MUMPS scanner purpose to a high-level blurb
eFAILution Jun 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
202 changes: 197 additions & 5 deletions .ai/architecture.yaml

Large diffs are not rendered by default.

86 changes: 86 additions & 0 deletions .ai/decisions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2454,3 +2454,89 @@ decisions:
already covers the container case via its scanner-summary-* pattern.

'
ADR-031:
title: Formal vulnerability report — UI-free model, HTML-first, server-side PDF behind [report]
date: '2026-06-13'
status: accepted
context: |-
Browser roadmap Phase B4. Stakeholders and auditors need a single,
authoritative artifact — "here is what we scanned, what we found, and
proof of which tooling/commit produced it" — that can be archived and
handed to a government body. The interactive dashboard is the wrong
shape for that: it's collapsible, filterable, and dynamically scaled.
A formal report must be linear, complete, and provenance-bearing.
Argus already records the raw provenance facts (argus version,
scan_context commit_sha + repo_root, the toolchain image-digest +
cosign-verification block from #240/#243, and the signed attestation
from #241/#244) — they were just never assembled into one document.
decision: |-
Build the report in three layers, mirroring the established UI-free-core
pattern: (1) argus/core/report.py — a pure, dependency-free ReportModel +
build_report() that assembles provenance, the executive summary (reusing
findings_view.compute_summary so counts can't diverge from the dashboard),
and severity-grouped findings; (2) a standalone report.html.j2 + report.css
(does NOT extend the app chrome — it's a print document) rendered by a
/report route, always available; (3) a server-side /report.pdf route that
renders the same HTML to PDF via WeasyPrint, behind an opt-in [report]
extra. The PDF is generated server-side (not via the browser print dialog)
so it is deterministic and one click away. WeasyPrint's edge lives in
argus/viewers/browser/report_pdf.py, lazily imported and raising
ViewerUnavailable with an install hint when absent — the same guarded-extra
pattern the Console epic used. Attestation status is detected from the
cosign bundle / in-toto statement written alongside argus-results.json.
consequences:
positive:
- One authoritative, archivable artifact with cryptographic-grade provenance (commit, image digests + verification, attestation status) — not just a screenshot.
- Report counts/severities reuse the shared findings_view logic, so the report can never disagree with the dashboard or TUI.
- The core model is pure and fully unit-tested without WeasyPrint installed; only the thin PDF edge needs the native stack.
- Graceful degradation — /report HTML is always served; without the [report] extra the browser's own Print → Save-as-PDF produces the same document, so nothing hard-breaks.
- WeasyPrint (heavy native Pango/cairo stack) stays isolated behind an opt-in extra, preserving the viewer's otherwise zero-new-runtime-dep posture.
negative:
- WeasyPrint can't be exercised in the default test env (not installed); the PDF success path is tested via an injected fake renderer, and live PDF rendering is only smoke-verified where the extra is present.
- The report's provenance is only as complete as the scan recorded — an in-memory or non-git scan shows "not recorded" fields (surfaced honestly rather than fabricated).
implementation: |-
- argus/core/report.py — ReportModel, ReportProvenance, SeverityGroup,
build_report(); attestation detection from sibling bundle/statement files;
provenance from ScanSummary.scan_context + .toolchain + argus.__version__
(version + timestamp injectable for deterministic tests).
- argus/viewers/browser/report_pdf.py — guarded WeasyPrint edge
(is_available(), render_pdf(html, stylesheet=, base_url=)).
- argus/viewers/browser/templates/report.html.j2 — standalone print doc;
links /static/report.css when pdf=False (strict CSP), omits the link when
pdf=True so WeasyPrint receives the CSS explicitly (no HTTP fetch).
- argus/viewers/browser/static/report.css — print-optimized, @page rules +
page numbers, fixed severity hues, defines --fg/--surface-alt/--fg-muted
so the shared inline-SVG charts render on a light document.
- argus/viewers/browser/app.py — /report (HTML) + /report.pdf routes; a
"Report" nav link in base.html.j2.
- pyproject.toml — [report] = ["weasyprint>=62"]; folded into [all].
- Tests: argus/tests/core/test_report.py (model, provenance, attestation,
grouping) + argus/tests/viewers/browser/test_report_route.py (HTML render,
PDF guard-degradation + injected success path).
- Docs: docs/view-browser.md (Formal report section + screenshot),
scripts/docsite/capture_view_browser.py (/report capture).
related:
- ADR-021
pr_references:
- '(browser Phase B4 — formal vulnerability report; merges into feat/tui-explorer-and-scan-runner)'
alternatives_considered:
- name: Client-side PDF (browser print / JS PDF library)
rejected_because: |-
Browser print is per-browser non-deterministic and pushes layout control
to the user's print dialog; a JS PDF lib (jsPDF/pdfmake) would add a heavy
front-end dependency and can't see the server-side provenance facts. A
server-side render is deterministic (same scan → same bytes) and is the
"one click" the requirement called for. Browser print is kept only as the
no-extra fallback.
- name: Bundle WeasyPrint into the [browser] extra
rejected_because: |-
WeasyPrint pulls a heavy native stack (Pango, cairo, …). Making it a hard
dependency of the browser viewer would punish every user who just wants
the dashboard. Isolating it behind [report] keeps the common install light
and matches the supply-chain-tool principle of minimizing its own surface.
- name: A new reporter plugin (argus.reporters entry-point) instead of a viewer route
rejected_because: |-
The report's value is the interactive HTML preview + one-click server-side
PDF in the same surface the findings are viewed in. A batch reporter would
not give the on-screen preview, and the provenance assembly is naturally a
view concern over a loaded ScanSummary, not a scan-time emit.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ repos:
--skip=**/package-lock.json,
--skip=pnpm-lock.yaml,
--skip=**/pnpm-lock.yaml,
"--ignore-words-list=assertIn,froms,intoto",
"--ignore-words-list=assertIn,froms,intoto,iterm",
-w
]
# renovate: datasource=github-tags depName=adrienverge/yamllint versioning=semver
Expand Down
Loading
Loading