Skip to content

feat(view): bulk triage → OpenVEX + ignore files (Phase 7)#269

Merged
eFAILution merged 1 commit into
feat/tui-explorer-and-scan-runnerfrom
feat/console-suppressions
Jun 13, 2026
Merged

feat(view): bulk triage → OpenVEX + ignore files (Phase 7)#269
eFAILution merged 1 commit into
feat/tui-explorer-and-scan-runnerfrom
feat/console-suppressions

Conversation

@eFAILution

Copy link
Copy Markdown
Collaborator

Description

Phase 7 — bulk triage at scale with a durable audit trail. Multi-select findings (or focus one), press S, pick a status + reason, and Argus records the decision to OpenVEX + scanner ignore files. Targets the integration branch (feat/tui-explorer-and-scan-runner, PR #261).

This answers the "where do not_affected / fixed triage decisions come from?" question the OpenVEX reporter (argus/reporters/openvex.py, #229) deliberately left open.

Changes Made

  • Added new core module (argus/core/suppressions.py)
  • Modified existing scanner/workflow (terminal viewer)
  • Updated documentation

Details

  • argus/core/suppressions.py (UI-free): decision_for(action, …) maps a triage action → TriageDecision; to_vex_statement / build_vex_document / merge_vex_documents emit + merge an OpenVEX v0.2.0 doc (audit trail = status + justification + reason + author + timestamp, keyed by CVE+product, idempotent content @id); trivyignore_entries / gitleaksignore_entries + write_suppressions append to .trivyignore / .gitleaksignore (never clobber, merges existing VEX). Reuses the OpenVEX vocabulary of the signed-attestation reporter — a TUI decision and a CI VEX speak the same language.
  • Status → VEX mapping: false-positive → not_affected/vulnerable_code_not_present; not-exploitable → not_affected/vulnerable_code_not_in_execute_path; accept-risk → affected + action_statement; under-investigation → under_investigation (VEX only, no ignore entry).
  • Viewer (app.py): S opens a status+reason modal (SuppressScreen) over the focused finding or the multi-select set; writes to the repo root; toasts the artifacts written. Command-palette entry mirrors it.
  • Follow-on (noted): a "hide suppressed" filter view (touches the pure filter/sort core).

Testing

  • Unit tests added/updated — test_suppressions.py (20 tests): action mapping, VEX statement/document shape, deterministic @id, merge dedup + version bump, CVE-less skip, ignore-entry formatting, and write_suppressions (VEX + trivy + gitleaks, merge-existing, append-without-clobber, under-investigation writes no ignore).
  • Manual testing — real-Textual Pilot: a Log4Shell CVE → VEX not_affected + .trivyignore; a gitleaks finding (no CVE) → .gitleaksignore fingerprint, correctly excluded from VEX.
  • Full suite: 4106 passed, 21 skipped, coverage gate met. (3 local-only viewers/browser failures are pre-existing + green in CI.)

Security Considerations

  • Security enhancement — turns ad-hoc triage into a reviewable, machine-readable VEX audit trail; writes are append/merge (never clobber); under-investigation never silently suppresses (records VEX, writes no ignore entry).

AI Context Updates (.ai/)

  • .ai/architecture.yaml updated (core/suppressions.py + viewer S action, both mirror blocks)

Checklist

  • Code follows project style guidelines
  • Documentation updated (docs/view-terminal.md — keybind + "Triage & suppression" section)
  • Changelog updated (handled by release-it)
  • All tests pass
  • Reviewed by at least one maintainer
  • Reviewed CONTRIBUTING.md guidelines

Related Issues

Console epic — docs/developer/CONSOLE-ROADMAP.md, Phase 7. Builds on the OpenVEX reporter (#229).

lazygit-style triage at scale for findings, with a durable audit trail
instead of a spreadsheet. Multi-select (or focus a finding), press `S`,
pick a status (false-positive / not-exploitable / accept-risk /
under-investigation) and type a reason; Argus records the decision to two
places so it sticks:

- argus-results.openvex.json — an OpenVEX v0.2.0 document (the audit trail:
  per-CVE status + justification + reason + author + timestamp). Re-triaging
  a finding updates its statement and bumps the version; an existing VEX file
  is merged, never clobbered.
- .trivyignore / .gitleaksignore — so the next scan honours the decision.
  CVE findings → .trivyignore (reason as a comment); secret findings →
  .gitleaksignore (fingerprint). under-investigation records VEX only.

argus/core/suppressions.py (UI-free) does the work — decision_for,
to_vex_statement, build_vex_document, merge_vex_documents, the ignore-entry
formatters, and write_suppressions — all unit-tested (20 tests), reusing the
same OpenVEX vocabulary as the signed-attestation reporter so a TUI decision
and a CI-generated VEX speak the same language. This answers the "where do
not_affected/fixed decisions come from?" question the OpenVEX reporter
(#229) deliberately left open.

Viewer: `S` opens a status+reason modal (SuppressScreen); a command-palette
entry mirrors it. The "hide suppressed" filter view is a noted follow-on.
@codecov

codecov Bot commented Jun 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 93.16239% with 8 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
argus/core/suppressions.py 93.16% 8 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions

Copy link
Copy Markdown
Contributor

🔒 Argus Container Security Scan

Branch: feat/console-suppressions
Commit: a2fd12d

📊 Combined Findings Summary

🚨 Critical ⚠️ High 🟡 Medium 🔵 Low 📦 Total 🔢 Unique
3 82 79 67 231 231

Scanned: 5 containers | Build Failures: 0

📦 Container Breakdown

Container Image 🚨 Crit ⚠️ High 🟡 Med 🔵 Low Total Unique Status
cli ghcr.io/huntridge-labs/argus/cli:a2fd12d33a93504e100d02396a827ab90e1d86bd 1 62 41 4 108 108
scanner-bandit ghcr.io/huntridge-labs/argus/scanner-bandit:a2fd12d33a93504e100d02396a827ab90e1d86bd 0 0 0 0 0 0
scanner-mumps ghcr.io/huntridge-labs/argus/scanner-mumps:a2fd12d33a93504e100d02396a827ab90e1d86bd 0 0 0 0 0 0
scanner-opengrep ghcr.io/huntridge-labs/argus/scanner-opengrep:a2fd12d33a93504e100d02396a827ab90e1d86bd 2 8 32 63 105 105
scanner-supply-chain ghcr.io/huntridge-labs/argus/scanner-supply-chain:a2fd12d33a93504e100d02396a827ab90e1d86bd 0 12 6 0 18 18

🔍 Detailed Findings by Container

🚨 cli - 108 vulnerabilities (45 unique)

Image: ghcr.io/huntridge-labs/argus/cli:a2fd12d33a93504e100d02396a827ab90e1d86bd

Combined (Deduplicated)

🚨 Critical ⚠️ High 🟡 Medium 🔵 Low Total Unique
1 62 41 4 108 45
🔷 Trivy Scanner (108 findings, 43 unique)
CVE Severity Package Version Fixed
CVE-2025-68121 🚨 CRITICAL stdlib v1.24.11 1.24.13, 1.25.7, 1.26.0-rc.3
CVE-2026-32280 ⚠️ HIGH stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-32281 ⚠️ HIGH stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-32283 ⚠️ HIGH stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-33810 ⚠️ HIGH stdlib v1.26.1 1.26.2
CVE-2026-33811 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-33814 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39820 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39823 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39825 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39836 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-42499 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-42504 ⚠️ HIGH stdlib v1.26.1 1.25.11, 1.26.4
CVE-2025-61726 ⚠️ HIGH stdlib v1.24.11 1.24.12, 1.25.6
CVE-2026-25679 ⚠️ HIGH stdlib v1.24.11 1.25.8, 1.26.1
CVE-2026-32280 ⚠️ HIGH stdlib v1.24.11 1.25.9, 1.26.2
CVE-2026-32281 ⚠️ HIGH stdlib v1.24.11 1.25.9, 1.26.2
CVE-2026-32283 ⚠️ HIGH stdlib v1.24.11 1.25.9, 1.26.2
CVE-2026-33811 ⚠️ HIGH stdlib v1.24.11 1.25.10, 1.26.3
CVE-2026-33814 ⚠️ HIGH stdlib v1.24.11 1.25.10, 1.26.3
CVE-2026-39820 ⚠️ HIGH stdlib v1.24.11 1.25.10, 1.26.3
CVE-2026-39823 ⚠️ HIGH stdlib v1.24.11 1.25.10, 1.26.3
CVE-2026-39825 ⚠️ HIGH stdlib v1.24.11 1.25.10, 1.26.3
CVE-2026-39836 ⚠️ HIGH stdlib v1.24.11 1.25.10, 1.26.3
CVE-2026-42499 ⚠️ HIGH stdlib v1.24.11 1.25.10, 1.26.3
CVE-2026-42504 ⚠️ HIGH stdlib v1.24.11 1.25.11, 1.26.4
CVE-2026-46680 ⚠️ HIGH github.com/containerd/containerd/v2 v2.2.2 2.0.9, 2.2.4, 2.3.1
CVE-2026-34040 ⚠️ HIGH github.com/docker/docker v28.5.2+incompatible 29.3.1
CVE-2026-41567 ⚠️ HIGH github.com/docker/docker v28.5.2+incompatible N/A
CVE-2026-42306 ⚠️ HIGH github.com/docker/docker v28.5.2+incompatible N/A
CVE-2026-44973 ⚠️ HIGH github.com/go-git/go-billy/v5 v5.8.0 5.9.0
CVE-2026-45022 ⚠️ HIGH github.com/go-git/go-git/v5 v5.18.0 5.19.0
CVE-2026-33811 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-33814 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39820 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39823 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39825 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39836 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-42499 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-42504 ⚠️ HIGH stdlib v1.26.2 1.25.11, 1.26.4
CVE-2026-46680 ⚠️ HIGH github.com/containerd/containerd/v2 v2.2.2 2.0.9, 2.2.4, 2.3.1
CVE-2026-44973 ⚠️ HIGH github.com/go-git/go-billy/v5 v5.8.0 5.9.0
CVE-2026-45022 ⚠️ HIGH github.com/go-git/go-git/v5 v5.18.0 5.19.0
CVE-2026-33811 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-33814 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39820 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39823 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39825 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-39836 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3
CVE-2026-42499 ⚠️ HIGH stdlib v1.26.2 1.25.10, 1.26.3

...and 58 more

⚓ Grype Scanner (0 findings, 0 unique)

✅ No vulnerabilities detected by Grype

scanner-bandit - 0 vulnerabilities (0 unique)

Image: ghcr.io/huntridge-labs/argus/scanner-bandit:a2fd12d33a93504e100d02396a827ab90e1d86bd

Combined (Deduplicated)

🚨 Critical ⚠️ High 🟡 Medium 🔵 Low Total Unique
0 0 0 0 0 0
🔷 Trivy Scanner (0 findings, 0 unique)

✅ No vulnerabilities detected by Trivy

⚓ Grype Scanner (0 findings, 0 unique)

✅ No vulnerabilities detected by Grype

scanner-mumps - 0 vulnerabilities (0 unique)

Image: ghcr.io/huntridge-labs/argus/scanner-mumps:a2fd12d33a93504e100d02396a827ab90e1d86bd

Combined (Deduplicated)

🚨 Critical ⚠️ High 🟡 Medium 🔵 Low Total Unique
0 0 0 0 0 0
🔷 Trivy Scanner (0 findings, 0 unique)

✅ No vulnerabilities detected by Trivy

⚓ Grype Scanner (0 findings, 0 unique)

✅ No vulnerabilities detected by Grype

🚨 scanner-opengrep - 106 vulnerabilities (49 unique)

Image: ghcr.io/huntridge-labs/argus/scanner-opengrep:a2fd12d33a93504e100d02396a827ab90e1d86bd

Combined (Deduplicated)

🚨 Critical ⚠️ High 🟡 Medium 🔵 Low Total Unique
2 8 32 63 106 49
🔷 Trivy Scanner (106 findings, 48 unique)
CVE Severity Package Version Fixed
CVE-2026-42496 🚨 CRITICAL perl-base 5.40.1-6 N/A
CVE-2026-8376 🚨 CRITICAL perl-base 5.40.1-6 N/A
CVE-2025-69720 ⚠️ HIGH libncursesw6 6.5+20250216-2 N/A
CVE-2025-69720 ⚠️ HIGH libtinfo6 6.5+20250216-2 N/A
CVE-2025-69720 ⚠️ HIGH ncurses-base 6.5+20250216-2 N/A
CVE-2025-69720 ⚠️ HIGH ncurses-bin 6.5+20250216-2 N/A
CVE-2026-42497 ⚠️ HIGH perl-base 5.40.1-6 N/A
CVE-2026-48959 ⚠️ HIGH perl-base 5.40.1-6 N/A
CVE-2026-48962 ⚠️ HIGH perl-base 5.40.1-6 N/A
CVE-2026-9538 ⚠️ HIGH perl-base 5.40.1-6 N/A
CVE-2026-27456 🟡 MEDIUM bsdutils 1:2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM bsdutils 1:2.41-5 N/A
CVE-2026-27456 🟡 MEDIUM libblkid1 2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM libblkid1 2.41-5 N/A
CVE-2026-42250 🟡 MEDIUM libbz2-1.0 1.0.8-6 N/A
CVE-2026-5435 🟡 MEDIUM libc-bin 2.41-12+deb13u3 N/A
CVE-2026-5450 🟡 MEDIUM libc-bin 2.41-12+deb13u3 N/A
CVE-2026-5928 🟡 MEDIUM libc-bin 2.41-12+deb13u3 N/A
CVE-2026-6238 🟡 MEDIUM libc-bin 2.41-12+deb13u3 N/A
CVE-2026-5435 🟡 MEDIUM libc6 2.41-12+deb13u3 N/A
CVE-2026-5450 🟡 MEDIUM libc6 2.41-12+deb13u3 N/A
CVE-2026-5928 🟡 MEDIUM libc6 2.41-12+deb13u3 N/A
CVE-2026-6238 🟡 MEDIUM libc6 2.41-12+deb13u3 N/A
CVE-2026-27456 🟡 MEDIUM liblastlog2-2 2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM liblastlog2-2 2.41-5 N/A
CVE-2026-34743 🟡 MEDIUM liblzma5 5.8.1-1 N/A
CVE-2026-27456 🟡 MEDIUM libmount1 2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM libmount1 2.41-5 N/A
CVE-2026-27456 🟡 MEDIUM libsmartcols1 2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM libsmartcols1 2.41-5 N/A
CVE-2026-27456 🟡 MEDIUM libuuid1 2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM libuuid1 2.41-5 N/A
CVE-2026-27456 🟡 MEDIUM login 1:4.16.0-2+really2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM login 1:4.16.0-2+really2.41-5 N/A
CVE-2026-27456 🟡 MEDIUM mount 2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM mount 2.41-5 N/A
CVE-2025-15649 🟡 MEDIUM perl-base 5.40.1-6 N/A
CVE-2026-7010 🟡 MEDIUM perl-base 5.40.1-6 N/A
CVE-2026-5704 🟡 MEDIUM tar 1.35+dfsg-3.1 N/A
CVE-2026-27456 🟡 MEDIUM util-linux 2.41-5 N/A
CVE-2026-3184 🟡 MEDIUM util-linux 2.41-5 N/A
CVE-2026-27171 🟡 MEDIUM zlib1g 1:1.3.dfsg+really1.3.1-1+b1 N/A
CVE-2011-3374 🔵 LOW apt 3.0.3 N/A
TEMP-0841856-B18BAF 🔵 LOW bash 5.2.37-2+b9 N/A
CVE-2022-0563 🔵 LOW bsdutils 1:2.41-5 N/A
CVE-2025-14104 🔵 LOW bsdutils 1:2.41-5 N/A
CVE-2017-18018 🔵 LOW coreutils 9.7-3 N/A
CVE-2025-5278 🔵 LOW coreutils 9.7-3 N/A
CVE-2011-3374 🔵 LOW libapt-pkg7.0 3.0.3 N/A
CVE-2022-0563 🔵 LOW libblkid1 2.41-5 N/A

...and 56 more

⚓ Grype Scanner (0 findings, 0 unique)

✅ No vulnerabilities detected by Grype

⚠️ scanner-supply-chain - 18 vulnerabilities (18 unique)

Image: ghcr.io/huntridge-labs/argus/scanner-supply-chain:a2fd12d33a93504e100d02396a827ab90e1d86bd

Combined (Deduplicated)

🚨 Critical ⚠️ High 🟡 Medium 🔵 Low Total Unique
0 12 6 0 18 18
🔷 Trivy Scanner (18 findings, 18 unique)
CVE Severity Package Version Fixed
CVE-2026-32280 ⚠️ HIGH stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-32281 ⚠️ HIGH stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-32283 ⚠️ HIGH stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-33810 ⚠️ HIGH stdlib v1.26.1 1.26.2
CVE-2026-33811 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-33814 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39820 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39823 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39825 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-39836 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-42499 ⚠️ HIGH stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-42504 ⚠️ HIGH stdlib v1.26.1 1.25.11, 1.26.4
CVE-2026-27145 🟡 MEDIUM stdlib v1.26.1 1.25.11, 1.26.4
CVE-2026-32282 🟡 MEDIUM stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-32288 🟡 MEDIUM stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-32289 🟡 MEDIUM stdlib v1.26.1 1.25.9, 1.26.2
CVE-2026-39826 🟡 MEDIUM stdlib v1.26.1 1.25.10, 1.26.3
CVE-2026-42507 🟡 MEDIUM stdlib v1.26.1 1.25.11, 1.26.4
⚓ Grype Scanner (0 findings, 0 unique)

✅ No vulnerabilities detected by Grype


Generated by Argus

@eFAILution eFAILution merged commit 3f0a05d into feat/tui-explorer-and-scan-runner Jun 13, 2026
26 checks passed
@eFAILution eFAILution deleted the feat/console-suppressions branch June 13, 2026 14:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant