Decision — Legacy-Backlog Cert Routing (completion ≤ 2025-12-31 → Stephaney)

Decided by: Dustin, 2026-07-06/07. Shipped: entirely-api e91866f (session 56).

The rule

Every certification for a project whose completion date is on or before 2025-12-31 (TRIAGE_COMPLETION_CUTOFF, resolved through TRIAGE_COMPLETION_DATE_CHAIN — the same qualifier the triage system uses) routes:

Scope and precedence

  • Applies to JES accounts only (ACCOUNT_JES_TRIAGE + TRIAGE_ELIGIBLE_ACCOUNTS). Groundworks legacy projects are NOT Stephaney’s — they keep their own routes.
  • Takes precedence over the triage→originating-branch swap. The swap survives only for triage-owned projects with a post-cutoff or unresolvable completion date.
  • Jurisdiction CCs (Anne Arundel ipbpri@aacounty.org) still apply additively downstream in routes.cert.resolve_route.
  • Post-cutoff (2026+) projects are untouched: branch certs go to branch lists; the MAN-9096 guard (branch-owned desk reviews stay at the branch) is unaffected.
  • Invoices are deliberately NOT covered — legacy-project invoices still follow INVOICE_ROUTES (corporate AP + branch CC). A parallel legacy rule on the invoice side is an open question for Dustin.

Why

Audit (session 56) of all cert sends since 2026-05-01: 20 legacy sends, 0 matched the intended recipients. The JES Triage route had an empty CC list, and there was no date-based rule at all — branch-owned legacy projects went to branch distribution lists, and triage-owned ones swapped back to the branch whenever an originating-branch breadcrumb existed.

Where it lives

  • config.CERT_ROUTES[ACCOUNT_JES_TRIAGE] (the CC)
  • config.resolve_cert_route_account_id (the date rule — single source shared by send path, portal display, preflight, cert-gen)
  • config.resolve_completion_date (moved from services/triage_eligibility.py, which re-exports it)
  • Pinned by tests/test_cert_pipeline.py::TestTriageCertRouting (7 legacy-rule tests)

Related: session-56, CERT_ROUTES, triage_eligibility