ML Feature Wave + Portal Surfacing (2026-08-07)
Parallel wave (entirely-api 1fd5ec3 + 348e28c, entirely-portal 144e365)
turning the extracted-document corpus into daily surfaces. Disjoint
file-ownership across 4 agents + main session; one integration deploy
(plus one hotfix: a parallel session’s uncommitted permit_lookup rename got
snapshotted into the image mid-edit — ~4 min API outage; lesson: check git
status for OTHER sessions’ dirty files before building an image).
- Cert QA (
services/cert_qa_service.py→ check_guardrails): outlier piers-per-production-day certs route to review with the comparison attached. Empirical: median 4.0/day, p95 7.0 — the “6-7/day” rule of thumb is the p95 edge. 50-sample floor, 1h cache, never blocks. - Missing-cert sweep (
/ops/missing-certs+ portal/missing-certspage for triage/up_admin/up_owner): permit evidence with no cert anywhere, conservative suppression, self-reporting coverage. NB projects.cancelled lives in raw_data→>scancelled_flag (string-truthy). - Permit timelines (
services/permit_timeline_service.py, additive on/history/permit-timelineextracted_stats; ProjectDetail chip at n>=5): Arlington median 76.5d issue→final, Anne Arundel 27d; “Fairfax” vs “Fairfax County” kept as distinct extracted labels deliberately. - Repeat-property (
intake_enrichment_service.find_prior_work→ intake enrichmentprior_work+/portal/projects/{id}/prior-work+ ProjectDetail card): street-key + existing fuzzy matcher, scope summaries strictly from extracted data, 2s bound, soft-fail.
Gated remainder: OCR queue (tooling decision: tesseract in worker image vs host sidecar; ~630+ skipped_no_text), Shepherd v2 / routing calibration / quarterly report (event accrual, ~Oct-Nov).