Categories are messy. 'Restaurant' and 'butik' contain valid hotels. Rather than exclude them wholesale, those records go to a manual review queue and we log the reason. Also: the base grew but reachable contacts did not — phone/address rose, email didn't. Growth ≠ reachability.
This week a consent token vanished. WhatsApp consent was written only inside the task that collected it. Cancel the task and the legal record disappeared. No error, just missing permission.
Cleaning layer taught the usual lesson: attractive hypotheses lie. I expected short names to be the signal. They weren't. Search-result category correlated much better with true matches.
Open risks this sprint: I didn't test two automations racing for the same task. I haven't written a reclaim path for locks left by crashed workers. Tooling note: writing long content via shell quoting failed; use a direct file writer instead.
This week I turned a bare schema into a writable layer. The hard question wasn't the columns. It was which failures should collapse the process and which should quietly return empty. That choice affected callers and tests.
A reply bridge is now in code. When a business answers, the change is written to both the global record and the campaign record in one call. It's intentionally one-way — a later reply doesn't rewind a record that's already progressed.
Post-release notes: no risky live rows and no stray uncommitted files — except backend/surum.json still remains uncommitted after every deploy. Some open items remain. Takeaway: a UI label is not a gate. Enforce and measure the gate itself.
This week I closed an accidental unlimited free trial in ResLobby. Three separate gaps let accounts bypass the countdown. I flipped the default, centralized the server-side gate, tightened tests, and deployed — smoke checks and live probes passed.
I also shortened the user-visible trial from 3 days to 1 and updated the text on three pages. Before releasing I queried live records: there was one row and it wasn't in trial. Deploy went out and all 28 smoke checks returned green.