Renewals: overnight brief, Oct 16

2026-10-16 · Proposed — pending review · full design: Renewals with the team in the loop

TL;DR The engine Overnight Practice rounds Next

TL;DR

Team replies to Clara's renewal list now run through one decision engine, and nothing is on at a customer. Good: the engine never acted wrongly on real customer material. Bad: the reader that turns a reply into rows drops two of three replies over one unclear line.

The engine in one picture

flowchart LR
  P[("Property system<br/>AppFolio today")] --> A["Adapter"]
  A --> L["Monthly list<br/>to the team"]
  L --> T["Team replies<br/>by email"]
  T --> E{{"Decision<br/>engine"}}
  E --> G["Send gate<br/>STOP · do not contact"]
  G --> R(["Tenant"])
  E -.- N["Skips if a human started it.<br/>Checks the world before<br/>each follow-up (next)."]
  G -. "write back<br/>(built, not wired)" .-> P
  classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420
  classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420
  classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420
  classDef neutral fill:#eef1ee,stroke:#8a958f,color:#1d2420
  class P,A,L,T,E,G,R live
  class N soon
Solid = live. Dashed = built, not wired yet.

Good: one path from the property system to the tenant, with the team deciding. Gap: the check before each follow-up and the write-back are not wired.

Overnight, practice rounds, next

What changed overnight

flowchart LR
  b1["Approval reply:<br/>'the rest goes out'"] --> a1["Says exactly<br/>what goes out"]
  b2["'Do not contact'<br/>was not a decision"] --> a2["Parks the row,<br/>stops outreach"]
  b3["AppFolio code<br/>inside the engine"] --> a3["Behind an adapter,<br/>dark"]
  b4["Approval release + STOP<br/>never seen live"] --> a4["Proven on the<br/>Willows sandbox"]
  classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420
  classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420
  class b1,b2,b3,b4 gap
  class a1,a2,a3,a4 live
Red = before, green = after. Every fix is live everywhere, no switch.

Good: on the Willows sandbox, one approval released a held offer, STOP blocked it, and "do not contact" parked the row.

Practice rounds

Camellia meetings: what the engine did with each unit

44% right9%46% no decision shape yet

Monday board: clear decisions the engine got right

91% right9%

Monday board: replies where anything was recorded

33% recorded67% frozen by one unclear row

right / recordedasked backno decision shape yetmissed / lost

Engine right, reader loses rows. Read-only replay, graded by a separate judge.

Good: no wrong actions in either round, and 91% of clear calls right. Bad: 67% of replies recorded nothing because of one unclear row.

Where to attack next

flowchart LR
  S1["1 · Fix the reader<br/>matching bugs (filed)"] --> S2["2 · Two policy calls<br/>'gonna renew'<br/>paper leases"]
  S2 --> S3["3 · Western Slope dry runs<br/>Oct 20 and Oct 27"]
  S3 --> F{{"Fede decides<br/>the flip"}}
  classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420
  classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420
  classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420
  classDef neutral fill:#eef1ee,stroke:#8a958f,color:#1d2420
  class S1 soon
  class S2 gap
  class S3 neutral
  class F neutral
The engine is ready; the reader is not.

Decisions to settle: hub section 4.

PropFlow Docs