Observed-action scan
Reads an agent's session transcript and maps what it actually did — every tool call — to framework controls. Action-level coverage, not just files at rest.
Audit what your agent did — not just what your repo contains.
A deterministic Rust scanner that maps an AI coding agent's observed actions — or a repository — to compliance and agentic-security framework controls, surfacing candidate risks with citations for a human to confirm.
cargo install apohara-compliance
Candidates with citations, never verdicts — what the scanner actually emits.
apohara-compliance-scanner scan-session session.jsonl --format md
Candidates with citations, never verdicts — each maps a triggering signal to controls a human confirms. SARIF 2.1.0 + Markdown output, CI-ready. v2.2 carries the bound triple on real AgentDyn successes (169/236 last-gen open-ended) with the honest co-headline (28.7 % FP on resisted, ~20 % precision-on-success).
One signal resolves across a ten-framework crosswalk — each carried control traces to a cited source.
Three scan surfaces · five additive passes (v1.0 → v2.2) · one deterministic crosswalk · CI-ingestible output.
Reads an agent's session transcript and maps what it actually did — every tool call — to framework controls. Action-level coverage, not just files at rest.
Walks a repository (respecting .gitignore) and maps its contents to the same frameworks. A gitignore-aware static surface alongside the action-level one.
Reads OTLP-exported logs/traces an OpenTelemetry exporter wrote to disk (offline, file-only — no socket). Post-hoc and exporter-bounded.
Opt-in additive pass correlates an ordered pair — untrusted content followed by a write to a memory/RAG sink — to surface OWASP ASI06 (Memory & Context Poisoning) candidates. Candidate-only, never a runtime guarantee.
Additive v2.0 pass correlates injection markers in tool-result: data the agent READ with later sensitive sinks (exfil / destructive / financial). v2.1 closes the representation gap with a reserved sink: channel + const SINK_GRAMMAR role tokens. Post-hoc; recognisable-in-log ≠ would-have-prevented.
Same frozen rules run over real successful indirect-injection trajectories (AgentDyn): 169 / 236 (71.6 %) post-hoc recognition on last-gen open-ended, with the honest co-headline — 28.7 % FP on resisted, ~20 % precision-on-success. A correlation surfacer, NOT a success / causation discriminator.
SARIF 2.1.0 + Markdown, ingestible by code scanning. Deterministic — no LLM, same input ⇒ same bytes. Suppressions supported via project config.
Gap lists carried controls with no candidate evidence — "no signal observed for X", never "you fail X". Baseline diff emits only new findings via SARIF baselineState.
A shlex-backed pass catches flag-reordered destructive commands a substring scan cannot (rm -r -f / rm -fr / quoted-arg variants), folded into AGT-MIS-004. sink: channel excluded from the single-action loop by a one-line guard.
The product's core integrity claim — what it gives you, and what it is not.
main; v1.1.0 is the latest crates.io / GitHub Release tag.Install, scan, then confirm or suppress each candidate.
$ cargo install apohara-compliance--format sarif for CI.$ apohara-compliance-scanner scan-session session.jsonl --format md$ apohara-compliance-scanner scan-otlp ./otel-export.json --format sarifbaselineState.$ apohara-compliance-scanner scan-repo . --baseline baseline.json --only-new --format sarif