Skip to content

The Drift Log · Audit, then actually repair

Dashboard for Measuring Audit‑to‑Repair Cycle Time

21 October 2026 · 3 min read · 631 words · established

A vaulted library of glowing green crystal blocks in ordered bays

Track audit‑to‑repair time by pairing immutable detection timestamps with merge dates and visualizing the lag on a simple dashboard.

Audits stall at the report

Teams run static analysis, security scans, or architectural reviews. The tool spits out a JSON file, a PDF, a ticket. Nothing else happens. The audit cycle ends with a report that sits in a backlog. Engineers never see whether a finding turns into a pull request, let alone when that PR lands. The cost of the audit is recorded, but the benefit of the repair is invisible. Without a signal, accountability evaporates and the audit becomes a compliance checkbox rather than an asset.

Measuring the lag between finding and fix

The only way to turn the audit into an asset is to treat each finding as a work item with a deadline. The metric that matters is time‑to‑merge: the interval from the moment a finding is recorded to the moment a repair PR is merged. This metric belongs on the same dashboard that shows defect count or test coverage, because it directly links audit effort to code‑base health.

A reliable repair metric must satisfy three conditions:

  • The timestamp of the finding is immutable. Use the audit JSON’s detectedAt field, which is generated by the scanner and never altered by downstream tooling.
  • The timestamp of the merge is taken from the repository’s commit metadata, not from a separate issue tracker.
  • The calculation is repeatable. The same inputs always produce the same result, because no AI model intervenes.

When those conditions hold, the metric can be aggregated per audit run, per component, or per team. The result is a simple time series that shows whether the audit cycle is shrinking or expanding.

A minimal dashboard in three steps

1. Export audit findings

Run your favourite scanner with the --output json flag and store the file in a known location, e.g. audit/2024-10-21.json. The file contains an array of objects, each with a id, detectedAt, and a ruleId.

[
  { "id": "F123", "detectedAt": "2024-10-21T09:12:00Z", "ruleId": "no‑unused‑var" },
  { "id": "F124", "detectedAt": "2024-10-21T09:13:15Z", "ruleId": "sql‑injection‑risk" }
]

2. Correlate with merge events

Query the repository for commits whose message contains the finding id. A short script using the HTTP API can do this without installing a full client library.

curl -s "https://api.github.com/repos/owner/repo/commits?per_page=100" |
jq -r '.[] | select(.commit.message | test("F123")) |
  "\(.sha) \(.commit.author.date)"'

The output yields the merge timestamp for each finding that has been repaired. If no commit matches, the finding remains open.

3. Render the chart

Feed the paired timestamps into a lightweight charting tool such as Chart.js. The code below creates a bar chart where each bar’s height is the number of days between detection and merge.

<canvas id="auditChart"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
fetch('audit/2024-10-21.json')
  .then(r => r.json())
  .then(findings => {
    const promises = findings.map(f =>
      fetch(`/merge-time?finding=${f.id}`).then(r => r.text()));
    return Promise.all(promises).then(times => ({
      labels: findings.map(f => f.id),
      data: times.map(t => (new Date(t) - new Date(findings.find(f => f.id===t).detectedAt)) / 86400000)
    }));
  })
  .then(({labels, data}) => {
    new Chart(document.getElementById('auditChart'), {
      type: 'bar',
      data: { labels, datasets: [{ label: 'Days to merge', data }] },
      options: { scales: { y: { beginAtZero: true } } }
    });
  });
</script>

The dashboard updates automatically whenever a new audit JSON appears or a repair PR lands. Teams can see, at a glance, which rule ids linger longest and which owners consistently close the loop.

How SHPBL helps you close the loop

SHPBL supplies a model‑independent library that harvests audit findings from any repository and produces the same immutable JSON format used above. The library’s certification harness records a verdict for each artifact, so you can trust that the detectedAt timestamps are repeatable. Access the data through the plain HTTP API, the typed TypeScript client, or the offline edition that runs from files – all gated by the same entitlement meter. A free repository evaluation shows how the library would ingest your existing audit pipelines. See the full method at / and the evaluation lane at /evaluation.

Take action on Monday

  1. Run your scanner with --output json and store the file in a known folder.
  2. Add the short script that extracts merge timestamps from your VCS.
  3. Drop the chart snippet into an internal dashboard page and point it at the new JSON file.

By the end of the week you will have a live repair metric that turns every audit into a measurable asset. The data will surface bottlenecks, justify remediation budgets, and give engineers a clear line of sight from finding to fix.

Keep reading

Next in the log

The Strategic Master Library · written and reviewed under the house's own epistemic rules: nothing claimed that we cannot show.