- Shipped
- August 8, 2026 at 8:59 PM UTC
- Author
- Kamo
- Commit
- 359a9a1
FeatureController derived "is this app offered" from the enum's stage in four separate places, so the answer could only be changed by redeploying the platform. Every one of them now reads AppCatalogService, along with the display name, description and deprecation. The one behavioural subtlety is the root-org gate. It used to read "stage is not COMPLETED, so child orgs may not enable this" — the dogfooding path. It now reads "the platform does not currently offer this". While no override exists those are the same sentence, because unset availability resolves to stage == COMPLETED. Once an operator publishes an app that is still in TESTING, only the new form does the right thing: without it the app would stay silently blocked for every child org. PlatformAppCatalogController is gated to top-level-org owners, the same audience as the neighbouring platform tabs, and reports whether an available app is actually in the plan matrix — an app no plan mentions resolves through the fail-open setting rather than through anything the operator chose.