EveryDocumentation Index
Fetch the complete documentation index at: https://docs.agentguardian.io/llms.txt
Use this file to discover all available pages before exploring further.
findings[] entry in scan.json is a one-attack record with
enough context to replay the attack, audit the verdict, and route to a
fix. Source of truth:
models/finding.py
- the per-finding emission in
reports/json_report.py.
When to use this page
- You opened a finding in
scan.jsonand want to know what every field means before you triage it. - You’re writing a parser that walks
scan.jsonand needs to know which fields are guaranteed present vs nullable. - You want to replay a finding deterministically (the PoV gate output
trigger_prompt).
The finding shape
Identity
| Field | Type | Source | Notes |
|---|---|---|---|
id | str (min 1) | Generated per finding at emit time. | Stable id for cross-emitter joins (SARIF properties.finding_id, JUnit <testcase id=…>, Markdown anchor). |
probe_id | str (min 1) | The shipped probe’s id field (e.g. ASI01-GH-005). | Maps back to the YAML in src/agent_guardian/probes/. |
created_at | datetime (ISO 8601) | When the evaluator’s fail verdict was written. | UTC if no tzinfo, else local-with-offset. |
probe_id is your group-by key.
Mapping (the OWASP / MITRE / CSA triple)
Every finding carries the same triple, inherited from the probe YAML. The triple-framework gate inmodels/probe.py:_coerce_probe
enforces that all three are populated before a probe loads.
| Field | Type | Notes |
|---|---|---|
asi | AsiCategory enum (ASI01–ASI10) | OWASP ASI 2026 category. |
mitre_atlas | list[MitreTechnique] (min 1) | Mix of numeric AML.T* ids and named agent-specific techniques (AI Agent Context Poisoning, Memory Manipulation). |
csa_category | CsaCategory enum | CSA Agentic Risk taxonomy bucket. |
rules[].properties.asi / properties.mitre_atlas /
properties.csa, JUnit <system-out> tags, Markdown’s per-finding
header. Cross-emitter consistency is asserted by the canonical
schema.
Verdict
| Field | Type | Notes |
|---|---|---|
severity | Severity enum (critical/high/medium/low) | Probe-level; see Severity levels. |
success | bool | true ⇔ the attack landed (defense failed). |
attempt_count | int ≥ 1 | The turn counter at which this finding was written. Used to derive attack_reliability when no PoV gate. |
confidence | float 0–1 | Evaluator-reported judging confidence. Conservative — low when the evaluator was undecided. |
summary | str (min 1) | One-line natural-language description of what landed. |
success=true is what the AIVSS penalty counts (and what the
high-severity band cap fires on). A finding emitted with
success=false is recorded for trend tracking but does not penalise
the score.
Evidence + replay
| Field | Type | Notes |
|---|---|---|
trigger_prompt | str | null | The exact attacker turn that produced this finding. Nullable for v1.0rc1 findings predating M2 Pattern 2. |
transcript_ref | str | null | Relative path (inside the bundle dir) to the per-finding turn log. Convention: evidence/<finding_id>/turns.jsonl. |
pov_reference | str | null | Relative path to the PoV reproducer script. Convention: pov/<finding_id>.py. Populated only when --pov-gate was passed and the PoV passed. |
pov_reliability | float 0–1 | null | N-fold Wilson-lower-bounded rerun success rate. Findings whose reliability falls below the gate are dropped before scoring. |
The replay contract
trigger_prompt is deliberately sufficient to replay the attack
against the same target — no hidden state, no extra config. The PoV
runner does exactly that: rerun trigger_prompt N times under the
same target adapter and report the success rate.
--pov-gate) runs this automatically before scoring and
drops findings whose reliability falls below the gate threshold so the
score never reflects a one-in-twenty flake.
Redaction (always on)
PII and credential redaction is on by default for every emitter. The sharedredact_finding
helper scrubs five fields before serialisation:
summarydescription(probe-level; carried into the SARIF rule)trigger_prompttranscript_ref(the path string, in case it embeds an identifier)evidencepayload bytes (the contents oftranscript_ref)
password= assignments. Install
agent-guardian[full] to layer presidio on top for richer PII (names,
phone numbers, emails).
This isn’t a knob — a security scanner must never re-emit a captured
secret.
What the bundle directory looks like
--bundle ./out/ emits a checksummed tree alongside the JSON report:
manifest.json carries SHA-256 + byte count for every file plus
the scan envelope (id, AIVSS, band, formula version). This is the
artifact you archive for audit — see
reports/bundle.py.
Walking findings in code
The minimal idiom — group by ASI category, surface the critical-band findings first:Next step
AIVSS score
The five-step pipeline + the
mode_authoritative rule that gates
--fail-under.Severity levels
The four severity tiers + how each contributes to the headline.
Report schema
Field-by-field reference for
agentguardian-scan-v1.JSON export
Sample
scan.json end-to-end + the canonical-form rules.