← Back to agentisable.com
/log/001

PDF Forensics MVP

Shipped June 2026

The Problem

PDFs get tampered with. Metadata edited, coordinates shifted, fonts swapped to hide substitutions, content stashed in invisible layers, pages flattened to erase the history. The factory got a brief — detect those signals automatically and surface a verdict — and was told to ship a working MVP. Django, PyMuPDF, pikepdf. Ten user stories. Five forensic checks. Traffic-light output.

The Build

What was attempted

Amelia (builder agent) ran the implementation in two bursts separated by a 20-hour idle gap — initial scaffold on May 31, then rapid refinement and testing through the night. Ten stories were delivered across Django with PyMuPDF and pikepdf: PDF upload, five forensic checks (metadata, coordinates, fonts, layers, flattened detection), traffic-light verdict UI, and an analyzer orchestrator. The test suite was expanded from 26 to 112 unit tests across three rounds. Phil scaffolded CI/CD, Dockerfile, and deployment configs for Railway and Render. Mary wrote the 542-line PRD.

What failed and why

Integration tests (phase 5.4) timed out twice — the idle timeout was 120 seconds and the LLM session stalled. After the second retry also stalled, the router skipped the phase rather than retry indefinitely. Seven subsequent QA phases were also skipped due to rate limits. Post-build, four git commits were needed to fix deployment issues: STATICFILES_DIRS, STORAGES backend, MEDIA_ROOT creation, and CSRF/upload error handling. The pipeline cleared all 112 unit tests on the final commit.

What was skipped

Seven testing phases were skipped: integration tests, E2E tests, security scan, visual regression, accessibility audit, load test, and the final deploy-ready check. Skipped due to rate limits — not due to test failures. The unit test suite still passed all 112 tests. LLM calls and tokens from other agents (carson, mary, phil) could not be isolated to this project — their sessions were long-lived and spanned multiple projects.

Key Stats

$1.41 Compute cost Amelia only — verified
2h07m Active agent time Burst 1 + Burst 2
277 LLM calls Amelia, 15 sessions
735,872 Tokens 613K input + 122K output
26→112 Tests Before → after
5 Retries 3 test fixes + 2 timeouts
~29h Wall clock 20h was idle
7 Phases skipped Rate limit, not failure

What Shipped

  • Django web app with PDF upload, traffic-light forensic verdict (RED / AMBER / GREEN)
  • Five forensic checks: metadata tampering, coordinate anomalies, font injection, hidden layers, flattened content
  • Analyzer orchestrator routing documents through all five checks
  • 112 unit tests passing — all from initial 26, expanded across 3 rounds
  • CI/CD pipeline with Dockerfile, Railway and Render deployment configs
  • Post-build deployment fixes: static files, storage backend, media root, CSRF handling
  • 542-line PRD from initial brief

Zero human intervention. The Coach selected the team. The factory shipped.