Plan · 21 August · revised

Collections — driving the rest to done

Revised after measuring production. The earlier diagnosis of “everything says Past due” was wrong on the main point, and the correction changes what to build first.

⚠️ What the measurement overturned

The config is stamped, and the parser is wired at all three call sites. The reason no account shows a real stage is neither of those: the parsers went live 20 Aug 19:01Z, and exactly two emails have arrived since — a pest-control invoice and a lease-copy request. The 1,534 older signals were extracted before the parser existed, so they carry no facts and never will on their own.

The eviction evidence is already in the mailbox. One real signal, 19 Aug: subject RE: Follow Up for Case - 641732 - Luis Ruiz. The case number and the resident are in the subject line.

What a backfill recovers — measured, read-only

Re-parsing all 1,535 historical signals from their stored from + subject:

OutcomeCount
Would claim a parse218
filed54
judgment16
eviction_scheduled13
at_firm13
Distinct case references recovered24
Carrying a unit number0

The zero is the design constraint, not a failure

Unit matching reads the body, and bodies are not stored on signals. So a subject-only backfill can never bind a signal to a resident by unit.

It does not need to. It recovers 24 case references, and binding a case reference to a tenancy is exactly what the human-authored link already shipped to do. The link is the binding mechanism — which makes the operator surface the unlock for everything else, not a nicety at the end.

The order to build it

  1. Provenance names the message building now

    Today a stage says “Read off collections mail about this unit” — it never says WHICH mail. It should carry the subject, sender, date and the quoted line, so clicking a stage shows why we said it. Pure code, no prod write, and it is the thing that makes every later stage trustworthy rather than asserted.

  2. Make evicted reachable

    Nothing maps to it today; writ_at_sheriffeviction_scheduled is as deep as the ladder goes. Mail that says “eviction proceeding… key return” is evidence, so this is a mapping gap rather than an absent source. Retires one of the three “can never match” filter options by making it true.

  3. The backfill — dry-run first, apply only on your say-so

    Writes collections facts onto 218 historical signals. Built to print its whole diff and write nothing by default. Applying it is a production write and will not run without explicit approval.

  4. The operator surface for the case link

    Write #1 shipped the endpoint, not a UI. Until a person can link a case, the 24 recovered references bind to nobody and the backfill lights nothing. This is the unlock.

  5. The stop-more caller

    Blocked on #6054 landing. The rules are written; this is the plumbing that performs the write.

  6. The unlinked-case alert

    Independent of everything above. An unlinked case writes nothing but still raises the alarm — the message most likely to land on an unlinked case is the assistance approval that arrives after a writ.

  7. Release proposals

    A fifth ReviewType on /review. Largest of the set, and last.

In flight

#6052 cards clean   #6054 stop-more rules checks   #5930 demand builder checks

None failing. All three merge as their verdicts land.

Closed out

PropFlow Docs