Warden writes a predictable bundle of files toDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/DevDonzo/warden/llms.txt
Use this file to discover all available pages before exploring further.
scan-results/ after every run. These artifacts are the product of the control plane — not the terminal output. Terminal logs are ephemeral; artifacts are durable. A CI job can assert on agent-run-record.json. A dashboard can parse history.json to plot risk-score trends. A downstream agent can read agent-run-record.json to understand what happened in a previous run without replaying it. Every JSON artifact has a corresponding schema in schemas/ so consumers can validate structure without reading source code.
Artifacts Reference
scan-results.json — Normalized scanner output
scan-results.json — Normalized scanner output
Written by the scanner (Watchman agent) immediately after a successful scan. Contains the raw, normalized vulnerability data that every downstream step operates on.Location:
Each
scan-results/scan-results.jsonSchema: schemas/scan-results.schema.jsonKey fields:| Field | Type | Description |
|---|---|---|
timestamp | string | ISO 8601 timestamp of when the scan ran |
scanner | string | Scanner that produced the result (snyk, npm-audit, pip-audit, nmap, metasploit, mock) |
scanMode | "sast" | "dast" | Which workflow produced the result |
projectPath | string | Target path or URL |
summary.total | number | Total vulnerability count |
summary.critical | number | Count of critical-severity findings |
summary.high | number | Count of high-severity findings |
summary.medium | number | Count of medium-severity findings |
summary.low | number | Count of low-severity findings |
vulnerabilities[] | Vulnerability[] | Full list of findings |
Vulnerability object is required to carry id, title, severity, packageName, version, fixedIn, and description. DAST findings additionally carry targetHost, targetPort, service, serviceVersion, exploitAvailable, and exploitModule.warden-report.md — Human-readable operator report
warden-report.md — Human-readable operator report
A Markdown document written for human operators and reviewers. Summarizes the scan, remediation plan, applied fixes, and any warnings from the run.Location:
scan-results/warden-report.mdContents:- Run metadata: timestamp, mode, target, finding counts, fix counts, risk score, and posture.
- Summary paragraph from the remediation plan.
- Immediate Actions — prioritized list of recommended next steps.
- Manual Follow-Ups — packages that have no available automated fix.
- Strategic Improvements — longer-term recommendations derived from scan patterns and run warnings.
- Automation Output — branches created and pull request URLs opened during the run.
- Findings — one line per vulnerability with severity, ID, package, version, and fix versions.
- Warnings — any non-fatal issues encountered during the run (scanner fallbacks, missing tokens, etc.).
scan-results.html — HTML report
scan-results.html — HTML report
A self-contained HTML report generated by the
HtmlReportGenerator Watchman agent. Suitable for sharing with stakeholders who prefer a browser-viewable format without requiring a Markdown renderer.Location: scan-results/scan-results.htmlThe HTML report is derived from the same ScanResult data as the Markdown report. It does not embed policy decision or remediation plan data — for machine-readable decision context, use agent-run-record.json.agent-run-record.json — The handoff record
agent-run-record.json — The handoff record
The most important artifact for downstream automation.
agent-run-record.json is the complete handoff record: it captures what Warden found, what it decided, what it changed, and why it mattered — in a machine-readable format that CI jobs, dashboards, and other agents can consume without parsing terminal output.Location: scan-results/agent-run-record.jsonSchema: schemas/agent-run-record.schema.jsonFull schema structure:whyMatters is a string array that answers “why did this run matter?” in plain language. It always contains four entries: total vulnerability breakdown, fix ratio, risk score with posture, and the remediation plan summary.topFindings is the top five vulnerabilities sorted by severity then CVSS score. Each entry carries id, title, severity, packageName, and version.policyDecision records the exact output of evaluatePolicy(), including which gates fired and whether the approval requirement was satisfied.warden-approval-request.json — Blocked-fix notice
warden-approval-request.json — Blocked-fix notice
Written only when the After review, re-run with
requireApprovalAboveSeverity policy gate fires and no valid --approval-token approved was provided. The file signals to a human reviewer or downstream system that Warden identified fixable vulnerabilities but was not authorized to apply them.Location: scan-results/warden-approval-request.json--approval-token approved to allow the fix loop to execute. See Policy Gates for the full approval flow.history.json — Longitudinal run history
history.json — Longitudinal run history
An append-only array of
The trend is derived by comparing the current entry’s
RunHistoryEntry objects, one per Warden run. Used by RunHistoryService to compute the run trend (improving, worsening, unchanged, first-run) and expose longitudinal data to dashboards and reporting tools.Location: scan-results/history.jsonSchema: schemas/history.schema.jsonThe schema defines an array where each entry is required to have:| Field | Type | Description |
|---|---|---|
timestamp | string | Scan timestamp from ScanResult |
mode | "sast" | "dast" | Workflow that ran |
targetPath | string | Path or URL scanned |
repository | string (optional) | Remote repository URL if cloned |
totalVulnerabilities | number | Total finding count |
critical | number | Critical finding count |
high | number | High finding count |
medium | number | Medium finding count |
low | number | Low finding count |
appliedFixes | number | Fixes successfully applied |
attemptedFixes | number | Fixes attempted (selected for remediation) |
autoFixableCount | number | Vulnerabilities with a fixedIn version |
manualCount | number | Vulnerabilities requiring manual remediation |
riskScore | number (0–100) | Risk score at time of run |
riskScore and totalVulnerabilities to the previous entry. A lower risk score or lower total vulnerability count is improving; higher is worsening; equal is unchanged.memory.json — Recurring vulnerable package hotspots
memory.json — Recurring vulnerable package hotspots
Tracks which packages have appeared as vulnerabilities across multiple runs for a given repository or target path. The
MemoryService uses this data to surface persistent hotspots that survive individual fix cycles — packages that keep reappearing despite remediation attempts.Location: scan-results/memory.jsonSchema: schemas/memory.schema.jsonThe memory store is a JSON object keyed by repoKey (the repository URL or target path). Each entry holds:| Field | Type | Description |
|---|---|---|
runCount | number | Total number of Warden runs recorded for this repo |
packages | object | Map of package name → { occurrences, lastSeverity } |
occurrences increments once per scan in which the package appears vulnerable. lastSeverity is promoted (never demoted) — if a package was medium last run and high this run, lastSeverity becomes high.The MemorySnapshot returned to the run result exposes the top five hotspots sorted by occurrences descending, then lastSeverity descending:.warden-baseline.json — Accepted-risk baseline
.warden-baseline.json — Accepted-risk baseline
A committed snapshot of a scan result that defines the accepted-risk state of the repository. Once a baseline exists,
Each
warden baseline --check compares the current scan against it and flags only new or worsened findings — ignoring vulnerabilities that were already known and accepted at baseline creation time.Location: .warden-baseline.json (repository root, committed to version control)The baseline is created with warden baseline --create and should be committed alongside your source code.Key fields from WardenBaseline:| Field | Type | Description |
|---|---|---|
schemaVersion | 1 | Always 1 — used for forward-compatibility checks |
generatedAt | string | ISO 8601 timestamp of baseline creation |
scanTimestamp | string | Timestamp from the source ScanResult |
scanner | ScannerType | Scanner that produced the baseline scan |
scanMode | "sast" | "dast" | Mode of the baseline scan |
riskScore | number | Risk score at baseline creation |
summary | ScanSummary | Severity counts at baseline |
findings[] | BaselineFinding[] | Fingerprinted snapshot of each vulnerability |
BaselineFinding carries a deterministic fingerprint built from ecosystem, package name (or host:port:service for DAST), and vulnerability ID. Fingerprints are what allow compareBaseline() to identify new, resolved, and worsened findings regardless of ordering changes between runs.Why Schemas Matter
Every JSON artifact inscan-results/ has a corresponding schema in schemas/ that follows the JSON Schema 2020-12 specification. This enables:
- CI assertion jobs — validate that
agent-run-record.jsonmatches the expected schema before consuming its fields, catching Warden version mismatches before they cause silent failures. - Dashboards and reporting tools — parse
history.jsonwith confidence about field names and types without coupling to Warden’s TypeScript internals. - Downstream agents — a subsequent AI agent can read
agent-run-record.jsonand understandwhyMatters,policyDecision, andtopFindingsas structured data rather than scraping terminal logs. - Cross-run comparisons — the deterministic structure of
history.jsonandmemory.jsonmakes it straightforward to build trend analysis on top of multiple runs without a dedicated database.