- Shipped
- September 7, 2026 at 5:06 AM UTC
- Author
- Kamo
- Commit
- 5e8f95f
Three entities, seven rights and two enum appends behind Growth Hub: a short ordered list of things an organisation asks of everybody — leave a review, share the launch post — handed out one at a time and proved with a screenshot an admin approves. The one rule everything is read from: a member's standing on a request comes from their LATEST submission and from nothing else. There is no `completed` column anywhere in this feature, deliberately — two facts about the same thing eventually disagree, and the day they did a member would either lose credit for work they had done or be asked to do it twice. GrowthSubmissionStatus carries that argument. VIEW_GROWTH_HUB is a ROOT right, which is the call worth defending. Every other marketing right hangs off VIEW_MARKETING, but taking part is something an organisation asks of everybody — the receptionist, the engineers, people who will never open the Marketing app — and parenting it there would grant that whole app to every member merely being asked to leave a review. MANAGE_GROWTH_HUB is the half that does hang off VIEW_MARKETING, because it gates a tab on that settings page. The five widget rights hang off VIEW_GROWTH_HUB: the widget shows a member their own queue, so the right to take part is the right that gates its data. Ids 311-317; 304-310 belong to the gamification block that landed alongside. Two ImageAssocType constants, appended so no ordinal shifts. GROWTH_REQUEST_IMAGE allows delete and overwrite — it is org artwork an admin curates. GROWTH_SUBMISSION_ EVIDENCE allows neither: it is the evidence behind an approval, and a member who could replace it afterwards could have work approved on one screenshot and leave a different one in its place. Checked pg_constraint across all five tables carrying assoc_id before shipping — none has a frozen CHECK, so there is nothing to drop.