diff --git a/docs/CLOUD.md b/docs/CLOUD.md index 002cb5155..3d3391172 100644 --- a/docs/CLOUD.md +++ b/docs/CLOUD.md @@ -31,7 +31,7 @@ For organisations that need multi-tenant management: |---|---| | Multi-Tenant Mode | `multi_tenant` | | Multi-User Mode | `multi_user` | -| Unlimited Instances | `unlimited` | +| Hosted Capacity Policy | `unlimited` | See [Plans & Entitlements](PULSE_PRO.md) for the full feature matrix. diff --git a/docs/release-control/v6/internal/subsystems/cloud-paid.md b/docs/release-control/v6/internal/subsystems/cloud-paid.md index eef32da95..2f25c0b15 100644 --- a/docs/release-control/v6/internal/subsystems/cloud-paid.md +++ b/docs/release-control/v6/internal/subsystems/cloud-paid.md @@ -533,6 +533,12 @@ Community limit enforcement. entitlement refresh paths may preserve historical billing fields for old state, but new trial or hosted workspaces must not mint quickstart credits or imply a managed-model allowance as part of the commercial contract. +18. Keep the `unlimited` feature key neutral in shared metadata. It is a + hosted/MSP capacity-policy marker, not a self-hosted monitoring-volume + product promise. Runtime and generated feature catalogs must label it as + hosted capacity policy, keep it hidden from self-hosted plan cards, and + avoid customer-facing "Unlimited Instances" copy that sounds like the old + capped self-hosted packaging. ## Current State @@ -1787,7 +1793,10 @@ The same runtime-readiness rule also excludes placeholder and plan-marker entries like `white_label`, `multi_user`, and `unlimited` from dev/demo entitlement payloads when there is no corresponding operable runtime surface; those belong in tier metadata and plan semantics, not in live capability -advertising for a free dev shell. +advertising for a free dev shell. The `unlimited` feature key is a hosted/MSP +capacity-policy marker and must use neutral hosted-capacity wording in shared +metadata rather than customer-facing "Unlimited Instances" copy that implies a +self-hosted monitoring-volume tier. The same distinction applies to customer-facing self-hosted billing presentation. `frontend-modern/src/components/Settings/useProLicensePanelState.ts` and `frontend-modern/src/utils/licensePresentation.ts` may label operable diff --git a/frontend-modern/src/utils/selfHostedFeatureCatalog.generated.ts b/frontend-modern/src/utils/selfHostedFeatureCatalog.generated.ts index 0819178fe..5911511de 100644 --- a/frontend-modern/src/utils/selfHostedFeatureCatalog.generated.ts +++ b/frontend-modern/src/utils/selfHostedFeatureCatalog.generated.ts @@ -335,8 +335,8 @@ export const SELF_HOSTED_FEATURE_CATALOG: readonly GeneratedSelfHostedFeatureCat }, { "key": "unlimited", - "displayName": "Unlimited Instances", - "comparisonName": "Unlimited Instances", + "displayName": "Hosted Capacity Policy", + "comparisonName": "Hosted Capacity Policy", "showInComparisonTable": false, "displayableInSelfHostedPlan": false, "roles": { diff --git a/internal/license/coverage_additional_test.go b/internal/license/coverage_additional_test.go index a1b0a683c..f6b63aa3c 100644 --- a/internal/license/coverage_additional_test.go +++ b/internal/license/coverage_additional_test.go @@ -86,7 +86,7 @@ func TestGetFeatureDisplayNameCoversKnownFeaturesAndFallback(t *testing.T) { {feature: FeatureMultiUser, want: "Multi-User Mode"}, {feature: FeatureWhiteLabel, want: "White-Label Branding"}, {feature: FeatureMultiTenant, want: "Multi-Tenant Mode"}, - {feature: FeatureUnlimited, want: "Unlimited Instances"}, + {feature: FeatureUnlimited, want: "Hosted Capacity Policy"}, {feature: FeatureAgentProfiles, want: "Centralized Agent Profiles"}, {feature: FeatureAuditLogging, want: "Audit Logging"}, {feature: FeatureSSO, want: "Basic SSO (OIDC)"}, diff --git a/pkg/licensing/features.go b/pkg/licensing/features.go index 7afcfbfe3..06c2ab980 100644 --- a/pkg/licensing/features.go +++ b/pkg/licensing/features.go @@ -38,7 +38,7 @@ const ( FeatureMultiUser = "multi_user" // Multi-user (likely merged with RBAC) FeatureWhiteLabel = "white_label" // Custom branding - NOT IMPLEMENTED YET FeatureMultiTenant = "multi_tenant" // Multi-tenant organizations - FeatureUnlimited = "unlimited" // Unlimited instances (for MSP/volume deals) + FeatureUnlimited = "unlimited" // Hosted capacity policy marker for MSP/enterprise deals // Internal-only runtime capabilities. These must never be added to public // tier defaults or public pricing contracts. @@ -297,7 +297,7 @@ var proFeatures = appendFeatures(relayFeatures, FeatureAdvancedReporting, ) -// mspFeatures adds multi-tenant and unlimited on top of pro. +// mspFeatures adds multi-tenant and hosted capacity policy on top of pro. var mspFeatures = appendFeatures(proFeatures, FeatureUnlimited, FeatureMultiTenant, diff --git a/pkg/licensing/features_test.go b/pkg/licensing/features_test.go index 953262e14..b9aec8493 100644 --- a/pkg/licensing/features_test.go +++ b/pkg/licensing/features_test.go @@ -231,7 +231,7 @@ func TestGetFeatureDisplayName(t *testing.T) { {FeatureMultiUser, "Multi-User Mode"}, {FeatureWhiteLabel, "White-Label Branding"}, {FeatureMultiTenant, "Multi-Tenant Mode"}, - {FeatureUnlimited, "Unlimited Instances"}, + {FeatureUnlimited, "Hosted Capacity Policy"}, {FeatureAgentProfiles, "Centralized Agent Profiles"}, {FeatureAuditLogging, "Audit Logging"}, {FeatureSSO, "Basic SSO (OIDC)"}, diff --git a/pkg/licensing/self_hosted_feature_catalog.go b/pkg/licensing/self_hosted_feature_catalog.go index fa060a221..3c0e747df 100644 --- a/pkg/licensing/self_hosted_feature_catalog.go +++ b/pkg/licensing/self_hosted_feature_catalog.go @@ -290,8 +290,8 @@ var featureMetadataCatalog = map[string]FeatureMetadata{ }, FeatureUnlimited: { Key: FeatureUnlimited, - DisplayName: "Unlimited Instances", - ComparisonName: "Unlimited Instances", + DisplayName: "Hosted Capacity Policy", + ComparisonName: "Hosted Capacity Policy", DisplayableInPlanUI: false, SelfHostedRoles: SelfHostedFeatureRoles{ Community: SelfHostedFeatureRoleHidden,