| Area | What changed | Proof |
Backups & audit readiness from the AWS credit plan | Daily backups (35-day keep) + a monthly copy stored in Oregon (1-year keep) for all six production tables; live-restore turned on for the three tables that lacked it; the infrastructure change recorder (AWS Config), continuous security checks (Security Hub), and the external-access analyzer are all on. | First on-demand backup of the main table (1.5 GB) completed; Config recorder confirmed recording; alarms verified. |
| AppFolio sync stops dying | The sync that mirrors AppFolio every minute was being killed at the 15-minute limit — not once, 112 times (Aug 9–11). Root cause: it ran pinned at 100% of its memory for 11 straight days, crawled, and got killed mid-property. Five fixes merged: a time budget so a run always exits cleanly (and reports what it skipped), memory doubled to 2 GB with a "getting full" alarm and the deploy script fixed so a manual deploy can't silently shrink it back, a retry cap on bad ticks, and the read pattern that was eating the memory (one query per tenant per tick → one per property). | Alarm live and OK; memory 2 GB confirmed; every fix has a regression test proven to fail on the old code. Cost: ~+$21/month. |
| The text loop gets faster | Your 51s and 33s test turns were traced step by step: ~20s of every turn was spent loading every conversation the property ever had, messages included (1,770 on the Willows; Camellia is at 786 and growing) just to find your one thread — twice. That's now a direct lookup. Separately, on a first-contact text, ~11s of prospect-record bookkeeping sat in front of the reply; those writes now happen right after the reply goes out (with guards so a serverless freeze can't drop them). | Direct-lookup fix live since 11:32pm. Bookkeeping fix approved, merging. On the test bench the bookkeeping went from 11.3s → 0.76s. Full before/after on real texts is blocked by the outage above — the measuring harness is built and ready (see below). |
| AppFolio verification-code storm | You saw 16 codes in an hour; the real number was ~740 in two weeks (150 on Aug 14). Culprit: the seven "is the lease countersigned yet?" pollers (one per pending Camellia lease) each did a full AppFolio login with a fresh code every hour just to learn "not yet." Fix merged: they now ask a cheap read-only feed first (no login) and only do the real fetch when it says the lease is signed — with a hard rule that a real check still happens at least weekly so a stale row can never silently strand a notice. | Renewal worker with the fix rolled out at 9:37am. 120 codes today up to 9:27am; expect a sharp drop from here. Nothing was terminated — the pollers keep running, just cheaply. Caveat: the cheap feed only covers "waiting on the PM's signature"; a lease waiting on the tenant's signature still does the full walk once a day. |