Skip to main content

audit-findings

Records the findings of a code or interface audit in an append-only log and renders them into a PDF report, an HTML report, and ready-to-paste GitHub issues. It is the tool behind the audit-* skills in fabiommendes/skills.

The log lets several agents record findings in parallel, and an audit continue across sessions, without any of them reading or rewriting the whole report:

  • every write goes through the command line, which holds a file lock, assigns ids, and validates the record before appending it;
  • a finding's location and snippet are checked against the source when it is recorded, so mistakes surface to the agent that made them;
  • status prints a compact summary to resume from, including the findings subagents recorded that nobody has reviewed yet;
  • --agent NAME labels who made each change, and removed records keep the reason, so a later session does not record them again.

Usage

uvx audit-findings --help

Records are JSON objects passed on stdin:

audit-findings -a webserver init <<'EOF'
{"lang": "en", "title": "Security Audit Report", "project": "acme-api"}
EOF

audit-findings -a webserver add category <<'EOF'
[{"id": "idor", "title": "IDOR"},
 {"id": "xss", "title": "XSS", "applies": false, "note": "no HTML rendering"}]
EOF

audit-findings -a webserver add finding <<'EOF'
{"category": "idor", "severity": "critical",
 "title": "GET /invoices/{id} does not check the tenant",
 "location": "src/api/invoices.py:42-47",
 "snippet": "return db.query(Invoice).filter(Invoice.id == invoice_id).first()",
 "description": "...", "impact": "...", "fix": "..."}
EOF
# prints the new id: F1

audit-findings -a webserver status
audit-findings -a webserver render

The log is docs/audits/<area>/findings.jsonl. --area and --dir may be omitted when the project holds a single log.

Command Purpose
init Create the log; optional meta JSON on stdin.
import FILE Create the log from an existing findings.json.
add KIND Add a record or an array of records; prints the ids.
update ID Merge a JSON object into a record; null deletes a field.
remove ID... --reason TEXT Remove records nothing else refers to, saying why.
merge DUPLICATE KEPT Move references to the kept finding and remove the duplicate.
accept ID... Mark records as reviewed; a later update clears the mark.
start, done, reopen Track progress per category.
status, list, show Read the log; show includes who changed a record and when.
coverage [--all] List findings that no issue or no recommendation refers to; fails if any.
check Check every location and snippet against the source again.
build Validate and write findings.json.
render [FILE] Build, then write report.pdf, report.html, issues.md.

Record kinds: category, finding, strength, risk, recommendation, issue, inventory (a coverage table), and row (a row of one). The fields are described in the audit-report skill.

Log format

Each line of findings.jsonl is one event:

{"op": "add", "type": "finding", "id": "F3", "data": {"...": "..."}, "agent": "a1", "ts": "2026-10-08T12:00:00+00:00"}
{"op": "update", "id": "F3", "data": {"severity": "high"}, "ts": "..."}
{"op": "remove", "id": "F3", "reason": "duplicate of F1", "ts": "..."}
{"op": "accept", "id": "F4", "ts": "..."}

Replaying the events gives the current records; build turns them into findings.json. Removed ids are never reused.

Metadata

Release files for audit-findings 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for audit-findings 0.3.1
File Size Uploaded Provenance Actions
audit_findings-0.3.1.tar.gz 26.1 kB Without provenance Details for audit_findings-0.3.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for audit-findings 0.3.1
File Interpreter ABI Platform Actions
audit_findings-0.3.1-py3-none-any.whl Python 3 none any Details for audit_findings-0.3.1-py3-none-any.whl

Total release size: 55.5 kB

Release files / audit_findings-0.3.1.tar.gz

Download URL audit_findings-0.3.1.tar.gz
Size 26.1 kB
Tags Source
SHA-256 checksum
How to use checksums
71232259a8a8c4f7855c16ff869fac6c6c3a1509fb80931c697e658a302c73a1
BLAKE2b-256 checksum
How to use checksums
41beb69e1de84e126bd87a5c53e7f5ae54e15305fdc26b5cc5d5efc040014b30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.24 {"installer":{"name":"uv","version":"0.12.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / audit_findings-0.3.1-py3-none-any.whl

Download URL audit_findings-0.3.1-py3-none-any.whl
Size 29.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f95c064b8048cb8d7927f7e82daaf8f1a0f63db7e24db72f69e2fe0eb92f4793
BLAKE2b-256 checksum
How to use checksums
d03e6641eaf86dc617af999f8fbca3deda1cc95a48970a614f06f69d02e7c603
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.24 {"installer":{"name":"uv","version":"0.12.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for audit-findings 0.3.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page