docs(engagement): Phase 14 as built — retention #205
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/engagement-phase-14"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The documentation half of ENGAGEMENT.md Phase 14 — the last phase of the workstream.
Code: RunicGateway/website#182 · Site: RunicGateway/runicgateway.com#TBD
website/ENGAGEMENT.mdwebsite/BACKEND_DESIGN.mdA new Engagement retention section carrying the reference: the horizon table for all four tables, why the outbox sweep is terminal-only, why each floor is a correctness bound rather than a UI nicety, why suppressions do not expire, why this retention worker got a screen when
team_activity's anduser_notifications' did not, and thereclaimStaledefect the sweep depended on. Plus the three new routes in the admin table and theaddress_hashreversal onGET /suppressions.Three findings worth not re-deriving
address_hash, so the row had no handle and the only way out was a prompt asking the operator to retype an address the screen has never shown them.reclaimStalecould not give up, so an interrupted send never reached a terminal status and no retention sweep could ever have bounded the outbox. The bound depended on fixing it.MAX_COOLDOWN_SECONDSis smaller than the horizon's floor). It is not dead code: it catches a hand-edited row and a future raise of that ceiling.And one the phase text had wrong in the other direction: the Play Data Safety answers correctly did not move, because
deploy-engagementis deployment-scoped andPLAY_DATA_SAFETY.mdis generated from the app-scoped entries only — Play asks what the app collects, not what a self-hosted deployment keeps.The last phase of the workstream. ENGAGEMENT.md gets Phase 14's as-built (the six org-lead decisions, three findings, the acceptance line discharged and one rig trap), and its header now reads COMPLETE rather than "Phase 14 is scoped and not started". BACKEND_DESIGN.md gets the reference: a new "Engagement retention" section with the horizon table, why the outbox sweep is terminal-only, why each floor is a correctness bound rather than a UI nicety, why suppressions do not expire, and why this one got a screen when team_activity and user_notifications did not. Plus the three new routes in the admin table and the address_hash reversal on GET /suppressions. Three findings worth not re-deriving: * the per-row purge could not be built without reversing Phase 9's decision to strip address_hash — the row had no handle, and the existing lift asks for an address the screen has never shown. * reclaimStale could not give up, so an interrupted send never became terminal and no retention sweep could ever have bounded the outbox. * the cooldown warning is unreachable through the UI by construction (MAX_COOLDOWN_SECONDS is smaller than the horizon's floor). It is not dead: it catches a hand-edited row, and a future raise of that ceiling. And one the phase text got wrong in the other direction: the Play Data Safety answers correctly did NOT move, because deploy-engagement is deployment-scoped and PLAY_DATA_SAFETY.md is generated from the app-scoped entries only. Code: website#TBD. Co-Authored-By: Claude <noreply@anthropic.com>