- Shipped
- September 7, 2026 at 7:28 AM UTC
- Author
- Kamo
- Commit
- 519091e
The marketing funnel, read six ways, one track per counter already carried on MARKETING_TRACKING_CODES: DRAW_A_CROWD uniqueVisitors 1 .. 50,000 BRING_THEM_BACK visits 2 .. 100,000 HOLD_THEIR_ATTENTION pageRequests 4 .. 200,000 SIGN_THEM_UP uniqueSignups 1 .. 250 PLANT_A_FLAG orgsCreated 1 .. 250 MAKE_IT_PAY paidAccounts 1 .. 250 Summed across EVERY code a member owns, not per code. A member who runs one link and a member who runs eight are doing the same job, and scoring per code would pay the careful one less for labelling their channels separately. RARITY IS WHERE THE FUNNEL IS EXPRESSED. The three traffic tracks share UNCOMMON because they are three views of the same traffic — the thresholds sit at roughly 1:2:4 because that is the shape traffic has, so one afternoon levels all three, and three rarities would celebrate that afternoon at three different volumes. The three conversion tracks then run 1..250 with IDENTICAL thresholds and escalating rarity — RARE, EPIC, LEGENDARY — because the same numbers are far harder one step further down the funnel, and that is worth saying once in the rarity rather than by inventing three sets of numbers to remember. MAKE_IT_PAY is the catalogue's only LEGENDARY and should stay rare company. `totalsForMember` answers all six in ONE row. It runs on every achievements read, so six sums would be six round trips on a page load — and the six have to be read at one instant, or ingest moving between two of them records a member as having more organizations than signups, which is not a state the funnel can be in. Inactive codes are included deliberately: retiring a link stops it counting new traffic, and must not also take away the levels its traffic already earned. `distinctCodeOwners` is the backfill sweep's worklist — members who own a code rather than every member on the platform, which would be most of the cost for none of the result. Also here: **************** which compiles every hand-written @Query on that repository through Hibernate's own parser with no database. A malformed @Query is invisible to the compiler and to every mocked-repository test; Spring Data validates it while building the bean, so the first thing that notices is the pod, and the way it notices is a crash loop. This project has no @DataJpaTest harness, so those queries had no coverage of any kind until now. The catalogue tests grew three guards worth having: no two achievements may wear the same icon, no two levels anywhere may share a title, and no level title may collide with a MemberRank name — the HUD shows a rank and a level side by side.