fix(retention): the pod creator governs retention, not any member - #880
Merged
Conversation
#878 protected a pod if ANY member was Pro. That reads more generous and behaves worse: membership is cheap and unilateral, so a single Pro admin who has joined everything silently confers unlimited retention on the whole instance. Measured on live data before changing it — one Pro admin protected 95 of 235 pods, 78% of all messages. Retention was being decided by who happened to join a room rather than by who owns it, and the only way to remove protection would have been to remove a person. Retention is a property of the room, as it is in every other team tool: a paid user in someone else's free workspace gets that workspace's policy. Same live data after: 61 pods protected, 34 lose protection — all of them pods a Pro user joined but did not create. Every pod has createdBy (verified: 0 without), so nothing falls through the selector. The honest cost is that a Pro user does not get unlimited history in pods they did not create, so the copy now says so — "Unlimited history in pods you create", in both locales, plus the two billing-panel notes. Shipping the mechanism without the copy would have been the third promise-drifts-from-code bug in one day, after the "Free in beta" badge and the tax-exclusive price. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XeUH4HVDsDHYPsHJthXjB8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sam's call, and the right one. #878 shipped "ANY Pro member protects the pod";
this narrows it to the creator.
Why the member rule was wrong
It reads more generous and behaves worse. Membership is cheap and unilateral,
so one Pro admin who has joined everything silently confers unlimited retention
on the entire instance. Measured on live data before changing anything:
Retention was being decided by who happened to join a room rather than by who
owns it — and the only way to remove protection would have been to remove a
person. It also meant free-tier storage could never be reclaimed on any pod an
admin had wandered into.
Retention is a property of the room, the way it is in every other team tool: a
paid user in someone else's free workspace gets that workspace's policy.
Every pod has
createdBy(verified on live data: 0 without), so nothingfalls through the selector.
The copy moved with it
The honest cost is that a Pro user does not get unlimited history in pods they
did not create. So the promise now says so, in both locales:
pricing.pro.items.history→ "Unlimited history in pods you create —nothing expires at 30 days"
billing.freeNoteandbilling.proNotescoped to matchShipping the mechanism without the copy would have been the third
promise-drifts-from-code bug in a single day, after the "Free in beta" badge
sitting above a $12 price and the tax-exclusive checkout. The rule from those:
when the mechanism narrows, the sentence that sells it narrows in the same
commit.
Verification
Two new tests pin the rule — that the selector is
createdBy, and that itcontains no
membersclause, so a future "generous" edit has to argue with the95/235 measurement. 73 billing + retention tests pass, 20 frontend copy/billing
tests pass.
Related: #878, #879.