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.
distinct ID ID... Declare overlapping findings to be different defects.
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, and overlaps neither merged nor declared distinct; 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": "..."}
{"op": "distinct", "id": "F4", "data": {"ids": ["F5"]}, "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.4.0

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.4.0
File Size Uploaded Provenance Actions
audit_findings-0.4.0.tar.gz 28.0 kB Without provenance Details for audit_findings-0.4.0.tar.gz

Built distribution (wheel)

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

Total release size: 59.4 kB

Release files / audit_findings-0.4.0.tar.gz

Download URL audit_findings-0.4.0.tar.gz
Size 28.0 kB
Tags Source
SHA-256 checksum
How to use checksums
ba4f6dcb53376cd325f0963417a4695297831898883f34a71a96faab06daf46a
BLAKE2b-256 checksum
How to use checksums
99cce9ce04a055bc1b4723879505421486396123ca6642faea4b9c7752b4a45a
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.4.0-py3-none-any.whl

Download URL audit_findings-0.4.0-py3-none-any.whl
Size 31.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8f606d7dabd5c4543ce1939d941e03a03356dc673a69002aa7d4fced44d72b77
BLAKE2b-256 checksum
How to use checksums
4846a8c9f83e79312ac826e8b828f977a2a323794f2bb78874a3b8c1fb6aa1cc
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.4.0

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