Codebase assessment toolkit

Audit any codebase — and prove every word of it.

ASSAY assesses an unfamiliar codebase for security, code quality, and long‑term supportability, then ships a defensible verdict. Every finding is source‑verified before it ships, and your code never has to leave your infrastructure.

🎯 Live‑exploited 🔍 Source‑verified ⚠️ Agent‑reported ⚖️ Judged
Any languageNode, Python, .NET, Go and more — metrics derive from git and your own tooling
Any modelBring your own — the kit's code calls no LLM and locks to no provider
Zero egress--offline runs air‑gapped and makes provably zero network calls
Zero depsNo runtime dependencies; deterministic, reproducible measurement
Two tools, one pipeline

One tells you what is wrong. The other tells you how long it has been wrong.

ASSAY pairs an assessment engine with a history dashboard. They share one report format and stay in sync — but neither depends on the other to run.

audit-kit

The assessment engine

A repeatable method plus a zero‑dependency CLI that reads a codebase and its full git history, adjudicates every finding, and publishes a Word / PDF / HTML deliverable.
  • A structured method: recon, nine specialist lenses, a non‑negotiable verification gate
  • Every finding labelled with its evidence tier — retractions kept in the report
  • Deterministic supportability metrics measured straight from git and your toolchain
  • Publishes to a branded .docx with a live table of contents, index and page numbers
audit-dashboard

The history dashboard

Joins a finished assessment to the repository's git history and renders one self‑contained, themeable HTML page — no server, no build step, nothing to install.
  • Shows when each finding's line was first written, by whom, in which commit
  • A timeline, an accumulation plot, a file treemap and a lens icicle — all cross‑filtered
  • Pins to the exact commit the report names, and refuses to guess a stale location
  • Re‑derives the verification ratio and raises a banner when the report disagrees with itself
assessment.md  →  audit-dash  →  a single HTML file you can open anywhere
The method

Five steps. The rigour never bends.

A depth flag scales the scope — --light, --thorough or --full — but step two is never skipped. Agents are used for reach; a human adjudicates.

0

Recon

Map the stack, domain, data sensitivity and existing gates into a recon map every lens reads first.

you · ~10 min
1

Fan out

Up to nine specialist lenses run in parallel, each narrowed to the surfaces recon actually found.

3–9 lenses
2

Verify

Every high‑severity finding is confirmed in the primary source. This is the step that makes it worth reading.

you · required
3

Synthesize

An executive summary that leads with the answer, plus a technical appendix — every finding evidence‑labelled.

you
4

Publish

A self‑verifying build to .docx, PDF, HTML or SARIF — the format the reader already uses.

scripted
Nine lenses: authz & isolation · injection & uploads · LLM surface · backend correctness · frontend · infrastructure & CI/CD · leaked secrets & confidential data · OWASP crypto/design/integrity · maintainability & SOLID.
The differentiator

A plausible, wrong finding is worse than no finding.

Scanners and agents are excellent at locating candidate issues across a large codebase, and unreliable at adjudicating them. ASSAY uses them for reach, then makes a human confirm each high‑severity finding in the source before it ships.

The output is a defensible verdict, not raw scanner output. Every finding carries its evidence tier, and retractions stay in the report — because a report with no retractions either got lucky or didn't verify.

🎯 Live‑exploited — measured 🔍 Source‑verified ⚠️ Agent‑reported — pending
# audit-kit attest — the discipline, made legible

Verification attestation
 critical/high coverage  15 / 15
 🎯 live‑exploited     3
 🔍 source‑verified    12
 ⚠️ agent‑reported    0
 retractions kept     2

# counts do not prove correctness.
# compare against the source.
audit-kit · capabilities

Everything you need to measure, verify and ship a verdict.

🎯

Adjudicated findings

Every finding is source‑verified before it ships and labelled with its evidence tier. The report is a defensible verdict, retractions and all.

📐

Deterministic metrics

Repo age, velocity, application LOC, bus factor, churn hotspots, cyclomatic complexity, coverage, mutation, vulnerable deps and an AI‑authorship signal — all from git and your toolchain.

🧭

Language agnostic

Node, Python, .NET and Go out of the box; any language via lizard complexity. Anything it can't run, you pass in — LCOV, SARIF, npm/pip/dotnet audit JSON.

📄

Word, PDF & HTML

Builds a .docx with a cover page, live clickable TOC, index and page numbers — no pandoc, no LaTeX. Export the same layout to PDF, or a print‑ready standalone HTML on any platform.

🎨

Corporate branding

Brand at the shell: pour the report into your own .docx template and its theme, cover, header and footer genuinely drive the document — no fragile post‑hoc template swap.

🛡️

Scanner orchestration

secscan normalises Semgrep, gitleaks, Trivy and OWASP ZAP into one severity‑sorted worklist — every row pending until a human adjudicates it. Refuses any non‑local target.

📊

SARIF & readiness

Emit findings as SARIF 2.1.0 for GitHub code scanning or Defender, evidence tiers preserved. A weighted readiness score with derived stoplights rolls the verdict into one number.

⏱️

Continuous monitoring

A scheduled CI workflow runs the deterministic checks every week and gates on only two objective, severe signals — a runtime past end‑of‑life and critical/high vulnerable deps — reporting the rest.

🔌

Two ways in

Install the /audit skill and run the whole method end to end from any repo, or scaffold a workspace with audit-kit new and run the prompts by hand or from CI. No lock‑in.

Self‑verifying build

The build compares every heading against the generated TOC and throws if one is missing. Counts don't prove correctness — so the kit checks against the source, the same thing its reports do.

Command reference

One CLI, no dependencies to install.

Requires Node 24+. The .docx build additionally uses Microsoft Word on Windows; every metric and the print‑ready HTML run on macOS and Linux too.

CommandWhat it does
audit-kit new

Scaffold an engagement workspace — prompts, template and config.

audit-kit scan

Measure the whole supportability table deterministically → paste‑ready report rows.

audit-kit secscan

Run SAST / secrets / dependency / DAST scanners in containers against a local target → a candidate worklist.

audit-kit readiness

The verdict table with derived stoplights and the weighted readiness score rolled up from it.

audit-kit attest

A verification attestation — evidence tiers, critical/high coverage and retractions, counted from the findings.

audit-kit build

Markdown → .docx (and --pdf) with cover page, live TOC, index and page numbers.

audit-kit html

Markdown → self‑contained, print‑ready HTML — no Word required.

audit-kit sarif

Findings as SARIF 2.1.0 for GitHub code scanning or Defender, evidence tiers preserved.

audit-kit tokens

What each lens pass consumed, counted from the run's own transcripts — the AI‑assist cost, measured.

audit-kit skill

Install the /audit skill so the full method runs end to end from any repo.

audit-kit doctor

Check prerequisites — Node, Word, Docker and the dashboard.

audit-dashboard · the ASSAY dashboard

How long has it been wrong, who was in the room, and does it live in the code that changes every week?

One self‑contained HTML file that computes every chart in the browser from an embedded data block. Open it anywhere — no server, no build, nothing to install. It themes light and dark, and it prints.

01

KPI row

Findings across how many lenses, critical/high, the verification ratio, and the median age of a finding's code at the pinned commit.

02

Timeline & accumulation

Every finding placed at the commit that first wrote its line, banded by severity — with an accumulation plot showing how long the risk has been latent.

03

Findings table

Severity, evidence, location, a stable check id, and an Introduced column — the date and author of the commit that first wrote the line.

04

File treemap & lens icicle

Two directions of the file ↔ issue relationship: where issues land by file, and the issues grouped lens → file → finding.

05

Churn, overlaid

Commits touching each file up to the assessed commit — high churn × complexity made visible as the next likely defect site.

06

Supply chain, kept apart

The judged supply‑chain worklist and the measured dependency‑integrity check each get their own card — never merged.

📌

The commit is not optional

Line numbers mean something only at the commit the report names. The dashboard pins to it and stops if the checkout doesn't contain it — rather than blaming HEAD and inventing a plausible, wrong answer.

⚠️

Stale locations reported, not guessed

A location git can't resolve gets git's own reason — "there is no path X in the commit" — shown in the row and counted in a banner. That's a finding about the report, and more useful than a blank.

🔎

Filters scope every view

Filter by severity, evidence, lens or churn hotspot and the KPIs, both plots, the table, treemap, icicle and churn chart all re‑render together. The frame never moves, so the numbers always agree.

🧮

Derives, then compares

It recomputes the verification ratio from the findings table and raises a banner when the report's prose disagrees with its own numbers. Counts don't prove correctness.

👁️

Colourblind‑safe by design

Severity rides the position, not the colour. Every plotted value is repeated in the findings table — a report whose whole purpose is not to mislead can't ship a chart that does.

🎨

One themeable file

Rebrand by editing the design tokens; ships a light/dark toggle. No CDN, no fonts, no fetch — the same no‑egress guarantee as the page it reports on.

No data egress

Bring your own model. Your source never leaves the building.

The kit's own code calls no LLM. The mechanical half — scan, secscan, readiness, attest, build, the dashboard — is pure, deterministic Node. The intelligent half is done by an agent driving a model you choose, and it's deliberately not locked to one provider.

TierYou run it withWhat leaves your network
TurnkeyThe /audit skillPrompts + code excerpts to your model provider
BYO keyA thin runner on an agent SDKPrompts + code excerpts to your provider
BYO any modelAny agent runtime, or by handNothing — on a self‑hosted model
The deterministic half's only network calls, ever, are dependency‑metadata lookups to public registries — package names and versions, never your code. And you can prove the boundary rather than trust it.
$ audit-kit scan --offline

# runs and makes ZERO network calls.
# run it air‑gapped.

 ✓ git history, application LOC
 ✓ complexity, bundled runtime‑EOL
 ✕ registry / advisory tools skipped
 ✕ executes no target code

# the one property a per‑seat SaaS
# competitor cannot match.
Deliverables

The format the reader already uses.

.docx Editable Word, live TOC & index .pdf Immutable, bookmarked .html Print‑ready, self‑contained .sarif GitHub code scanning / Defender dashboard One themeable HTML file CI summary Weekly monitoring report

Start auditing in three commands.

No dependencies to install. Clone it, put audit-kit on your PATH, and check your prerequisites.

getting started
$ git clone <repo> && cd codebase-audit-kit $ npm link # puts audit-kit on your PATH $ audit-kit doctor # check prerequisites ✓ Node 24 · Word · Docker · audit-dash $ audit-kit new engagements/acme ✓ ready — open the repo and run /audit