Seed app entitlement for every root, and stop inventing plan tiers

FixInitializerService
Shipped
August 8, 2026 at 5:15 PM UTC
Author
Kamo
Commit
817695d

Two defects found by checking prod before flipping kamo.entitlement.fail-open. Sign Pink is a second entitlement root (isPlatformProduct, with its own FREE/BUSINESS/PRO plans). The runner only seeded the top-level org, so Sign Pink's plans would have had no app rows at all — and once a missing row means deny, that revokes every app from every Sign Pink tenant. It now seeds every org that is top-level, isPlatformProduct, or owns plans. The per-tier app matrix was invented. An explicit isIncluded=false row denies regardless of the fail-open flag, so seeding a guessed tier list takes apps away from orgs that have them today — the guessed FREE tier would have stripped POS, MEET, KB, MARKETING, EMAIL, AI_SUPPORT, HRS, ESIG and VOIP from the four live FREE_DEFAULT orgs at migration time. Without the owner's commercial intent the only defensible exclusion is an app that has not shipped, so inclusion now derives from DevelopmentStageType: COMPLETED included, unreleased excluded. That still gates MLOS and the personal-loan app properly while changing nothing an org uses today; tiers are curated per plan in the settings UI, which this runner never overwrites. Verified against prod after running: 21 app features on each root, 105 plan rows for KamoCRM and 63 for Sign Pink, zero uncovered plan-by-app combinations, MLOS(14) and LOS(25) excluded on all 8 plans, and zero shipped apps wrongly excluded.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing