An app id an older build cannot name must not fail every feature read

Fixkamo-shared-library
Shipped
September 8, 2026 at 1:09 AM UTC
Author
Kamo
Commit
cd87743

ServiceType ships inside each service's jar while ORG_FEATURES is shared, so a newly added app is ALWAYS in the database before the older readers have been rebuilt. That window opens on every deploy and closes only when the last service is rolled — it is the normal case, not an edge one. ServiceTypeConverter threw on an id it did not recognise. Hibernate raises that while materialising the row, so the failure was not scoped to the row or even to the app: the whole org_features read failed, for every organization, on every service still running the older jar. That happened tonight. Ids 34 and 35 (KAMO_UNIVERSE, CHESS) were written against the root org at 23:50 UTC; SecurityService had been built before those constants existed. From then on GET /api/security/features answered 500, so the apps settings page listed zero available and zero unavailable apps, and the org payload came back with no features at all — which is what actually hurt, because with no app switched on the permission editors render no app security group, and every right tagged to an app silently vanishes from all five of them. It reads as "half my rights are gone", and nothing anywhere says why. So an unknown id now resolves to null and the row is skipped, which is what every caller was already written to expect — AppliedModelEnforcementService, **************** and **************** all guard for a null type — and what RoleRightTypeConverter, the only other converter of this shape, has always done. The id is logged once per service so a stale build still announces itself. Nothing changes on the write path: convertToDatabaseColumn only ever sees a real constant, so a row an older build cannot read is left exactly as written.

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