Resolve app entitlement by ServiceType; rename LOS to MLOS

Featurekamo-shared-library
Shipped
August 8, 2026 at 4:45 PM UTC
Author
Kamo
Commit
c906e8e

Entitlement resolved ServiceType.name() against **************** The catalog's codes are marketing codes (USERS, VIDEO_CONF, HR_SYSTEM, ...) and never matched, so planFeatureIncluded's missing-row default granted every app on every plan — the billing-to-app link was inert. Catalog rows now carry a typed nullable service_type and resolution goes through it, so an app can be renamed without moving entitlement. - **************** typed service_type column (persisted as the id). - **************** resolve by ServiceType; honour add-ons via the previously unread **************** jsonb; missing-row behaviour behind kamo.entitlement.fail-open (default true until the catalog matrix is seeded). - SubscriptionService: carry serviceType through create/update/DTOs, and derive feature_code from the name when omitted — the settings dialog never sent one, so every create from the UI hit the NOT NULL constraint. - CommerceType: bind each vertical to its required app (MORTGAGE->MLOS, PERSONAL_LOANS->LOS). - AppliedModelEnforcementService: getAllowedCommerceTypes intersects the security-model allow-list with entitlement; assertCommerceTypeAllowed already covers create and edit. - ServiceType: LOS -> MLOS keeping id 14 (ORG_FEATURES persists the id, not the name, so no data migration); new LOS(25) for personal loans — id 25 because reusing 14 would reassign every existing mortgage row. - RoleRightType: MLOS_* rebound, ids 139-144 unchanged; personal-loan LOS_* added at 190-195. - PhiModule.PLOS added: the rename left the personal-loan app mapped to the mortgage PHI module and mortgage unmapped, which compiled clean.

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