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-certs page 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-timeline extracted_stats; ProjectDetail chip at n>=5): Arlington median 76.5d issuefinal, Anne Arundel 27d; “Fairfax” vs “Fairfax County” kept as distinct extracted labels deliberately.
  • Repeat-property (intake_enrichment_service.find_prior_work → intake enrichment prior_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).