Frame 01Current roleProduction AIApr 2026 to present

Verita AI: production LLM systems that have to show their work

Software engineer on a small team, across five workstreams: a vision-LLM audit pipeline, the core of an LLM data-annotation platform, a rubric verifier for an AI interviewing product, SOC 2 Type II readiness during a live audit, and the security tooling underneath all of it. What I built and why, at interview depth. The client is not named.

Role
Software engineer
Backend
Python, Django / DRF, PostgreSQL, Celery, SQS
Frontend
React, TypeScript, Vite
Infrastructure
AWS, Terraform, Docker, GitHub Actions
The 30-second version

A vision-LLM audit pipeline

When a remote contractor bills for a day of work, what was that day? The answer sets what people get paid, so "the model thinks it looks fine" does not survive a dispute.

I built the pipeline that reads session frames from screen recordings with a vision model, checks each frame against that project's task policy, and buckets the time: genuine work, AI-assisted work, off-task activity, and frames the model could not read. Guideline violations are flagged from the same read. The output is a sealed ledger, priced and recomputable from the underlying rows, so a disputed figure can be traced instead of argued about.

An illustration of the read pass: every session frame is classified before an hour is billed. The frames and their proportions are illustrative, not production data.
SESSION frames VLM READ what is on screen task policy CLASSIFY 4 buckets clean AI-assisted off-task unreadable SEALED LEDGER priced, recomputable EVIDENCE FRAMES RETAINED

One session through the pipeline. The task policy is per project, so the same screen can be clean on one and off-task on another.

Choosing the read model was an evaluation problem, not a preference. I benchmarked candidates across providers through OpenRouter on a golden set of human-labelled sessions, comparing precision, recall and cost per session. The pipeline reached 80% precision and recall on that set, and has sealed 264 sessions in production.

ChoseOverBecauseCost
A ledger recomputable from its rowsStored totals per sessionA disputed number has to trace back to the frames that produced itRecompute is slower than a lookup, and sealing is an explicit step
Benchmarking read models across providersCommitting to one vendorPrecision and recall on the golden set were the decision, not the brandA golden set had to be labelled and kept current
An "unreadable" bucketForcing every frame into a work categoryAn unreadable frame counted as clean is a billing error nobody seesSome time stays unclassified and needs a person
Why it holds up

Three checks. The golden set turns "seems accurate" into a precision and recall number. The ledger is recomputable from its rows, so a changed row no longer adds up to the sealed total. And a coverage check is supposed to assert that every session was read before a run can seal. That last one was wired to the wrong flag; see "What I found".

An LLM data-annotation platform

Distributed annotators produce training data here, and the client's, reviewer's and operator's views must never leak into each other. I built the core: five-role access control with an explicit capability matrix, a workflow state machine with audited transitions and calibration routing, screening and qualification gates before an annotator can claim work, an append-only audit log, and 10+ annotation widget types on the React side.

Two decisions I would defend anywhere. The permission model is tested by a table-driven matrix over every endpoint and every persona, with a completeness guard that fails when an endpoint is added without an assertion, because permission bugs live in the endpoint nobody remembered to test. And audit coverage is derived from the URL configuration rather than a hand-kept list, so the check proves all 54 endpoints are covered instead of trusting the list. Over this work the test suite grew from 210 to 1,239 tests.

The ingestion path took real time too. Remote images are fetched with private address ranges blocked, so a crafted URL cannot turn the server into a proxy for the internal network, then re-hosted to S3 through presigned uploads. Enqueueing moved off the request cycle into asynchronous SQS batches after 1,000-image imports began timing out. That path delivered 6,756 processed images to a client, with geo-derived metadata backfilled.

A rubric verifier, and a testing standard

For an AI interviewing product, I delivered the second generation of the finance-interview rubric verifier in six days: LLM-judge claim validation against the rubric, shadow-verifier gating so a new version runs on production traffic without changing outcomes, and hard execution time limits so a slow evaluation fails predictably instead of hanging.

The lasting contribution was a standard rather than code. A test only counts once a deliberate defect in the source has shown it can fail, and the defect itself has to be confirmed as landed, because a mutation that silently did not apply produces a test that looks proven and is not. Tests that pass against broken code are worse than no tests. They transfer confidence without earning it.

Kill the mutant: a deliberate defect goes into a small function, and a test that still passes has proven nothing. This mirrors the standard, not any Verita source; the function and tests are illustrative.

SOC 2 Type II, during a live audit window

I led readiness while the observation period was already running, which removes the option of fixing things quietly. Control coverage moved from 154 to 165 of 173, which is 95%.

The recurring lesson: most compliance failures are not missing controls. They are controls configured once and never verified as working. The interesting work is proving the alarm fires, not installing the alarm.

The security pipeline

I built a pipeline that runs five scanners (gitleaks, OpenGrep, Bandit, Trivy, CodeQL) and hands the merged output to a reasoning model for triage: deduplicating across engines, dropping false positives, and ranking by exploitability. On the production codebase it reduced 345 raw findings to 33 verified vulnerabilities, nine of them critical: remote code execution, SSRF, IDOR and exposed credentials.

The generalised version is open source, with no findings and no customer code in it. The 345 to 33 result belongs here, on the internal run; the public repo ships the method, not the numbers. Read that case study.

What I found

The most useful things I found were not features. Each was silent, and each was caught by asking a question the system was not asking itself.

Finding: four runs sealed with zero reads

Investigating why the pipeline had never flagged a violation in production, I found four completed runs sealed without the vision model ever being invoked. A coverage warning was gated on the wrong flag, so a run with no reads looked identical to one with full coverage. 73 sessions had been recorded as clean without being read. The lesson is that a warning is not a gate. What hid it: sealed runs and sessions recorded as clean, with nothing asking whether they had been read.

Finding: session ids were not globally unique

The deduplication key assumed session identifiers were unique across the system. They were not, so the key was quietly wrong. Nothing failed and nothing warned, which is the point: a wrong key does not announce itself.

Finding: file-integrity rules that never fired

The file-integrity rules had been installed in a form that could not produce an alert. An installed agent counts as evidence until someone changes a watched file and waits for the alert that does not come. Found while wiring monitoring to alerting for SOC 2.

Finding: backups failing on permissions, silently

Backup jobs were failing on missing role permissions and paging nobody. A backup that fails quietly is indistinguishable from one that ran, until the day it is needed. Found in a backup and access review.

A hash-chained ledger as one way to seal rows: each row commits to the previous row's hash, so a changed count in any sealed row breaks the chain from that row on. Toggle the wrong-flag bug to watch a run with zero reads seal and still verify. Illustrative; the production schema is not public.

Outcome, and what it does not prove

ClaimProof

The audit pipeline runs in production.

Proof264 sessions sealed. Source: my résumé.

The read model was chosen on evidence.

Proof80% precision and recall on a golden evaluation set, benchmarked across providers via OpenRouter. Source: my résumé.

The platform core is tested, not just written.

ProofSuite grew from 210 to 1,239 tests; audit coverage derived over all 54 endpoints. Source: my résumé.

SOC 2 readiness moved during a live audit.

Proof154 to 165 of 173 controls, 11 databases migrated, 40+ artifacts. Source: my résumé.

What it does not prove. 80% on a golden set is not 80% in production; the set is finite and production drifts from it. 1,239 tests says nothing about which would fail, which is why the mutation standard exists. 165 of 173 controls is readiness, not the auditor's opinion. And none of it is public; the numbers are my résumé's and this page is my account of them.

Honest notes

Sources Résumé This case study, written by me Scope: software engineer on a small team Verified 3 Sep 2026

Elsewhere