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;
statusprints a compact summary to resume from, including the findings subagents recorded that nobody has reviewed yet;--agent NAMElabels 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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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.