- Ya
- 8 Agosti 2026, 16:47 UTC
- Mwandishi
- Kamo
- Ahadi ya
- a9a5b38
Entitlement now resolves on a typed service_type column, but no catalog row carried one, so every plan still resolved to 'everything included' via the fail-open default. This seeds the matrix so kamo.entitlement.fail-open can eventually be turned off without dark-firing apps. - AppEntitlementCatalogMigration (@Order(51), after PlatformOwnerPlanSeeder): idempotent backfill. Creates an 'Applications' feature category with one BOOLEAN row per non-core app bound to its ServiceType, re-binds any pre-existing row that has the code but no serviceType, and inserts the missing plan-to-app rows per tier. Insert-if-missing only — it never deletes and never overwrites an operator's isIncluded, so a tier edited in the settings UI survives reboots. Also re-binds the existing VIDEO_CONF / AI_ASSISTANT / HR_SYSTEM / ESIGNATURES / EMAIL_HOSTING add-ons, which were granting nothing. - KamoCRMPricingLoader: same matrix for a fresh cluster. The app rows are appended inside upsertFeatures rather than written in a second pass, because upsertPlanFeatures deletes the plan's rows before inserting — a second call would silently wipe the marketing matrix. Note this loader is disabled (early return, and its DataLoader call is commented out), which is why the migration above is the production path.