From 2f2f729d35f35dac186dd1ed7aec3ebf5cddd923 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 29 Apr 2026 11:09:57 +0100 Subject: [PATCH] Use neutral self-hosted monitoring copy --- docs/PULSE_PRO.md | 14 ++++----- docs/UPGRADE_v6.md | 4 +-- docs/releases/RELEASE_NOTES_v6.md | 7 +++-- docs/releases/RELEASE_NOTES_v6_RC2_DRAFT.md | 13 +++++---- docs/releases/V6_CHANGELOG.md | 8 ++--- docs/releases/V6_CHANGELOG_RC1.md | 11 +++---- docs/releases/V6_CHANGELOG_RC2_DRAFT.md | 15 +++++----- .../V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md | 14 +++++---- docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md | 14 +++++---- .../documentation_currentness_test.py | 29 +++++++++++++++++++ .../release_promotion_policy_test.py | 10 ++++--- 11 files changed, 89 insertions(+), 50 deletions(-) diff --git a/docs/PULSE_PRO.md b/docs/PULSE_PRO.md index e26a7986a..a37d58722 100644 --- a/docs/PULSE_PRO.md +++ b/docs/PULSE_PRO.md @@ -16,7 +16,7 @@ User-facing plans map to internal tiers as follows: - **Cloud**: `msp` or `enterprise` Notes: -- `lifetime` keeps the same runtime feature set as Pro, but lifetime and grandfathered recurring legacy entitlements remain uncapped for self-hosted monitoring and child-resource volume. Other migrated legacy paid installs can still carry cohort continuity metadata for support and audit, but self-hosted monitoring volume is no longer the paid gate. +- `lifetime` keeps the same runtime feature set as Pro, and lifetime plus grandfathered recurring legacy entitlements are not metered by self-hosted monitoring or child-resource volume under the current v6 policy. Other migrated legacy paid installs can still carry cohort continuity metadata for support and audit, but self-hosted monitoring volume is no longer the paid gate. - `pro_plus` remains a legacy compatibility tier for existing holders. It is not a current public self-hosted plan because monitored-system volume is no longer the paid boundary. - Items marked **Cloud*** require the `enterprise` tier rather than the base `msp` tier. - If you are self-hosting, you can use capability keys and `GET /api/license/features` to discover exactly what is active in your instance. @@ -63,19 +63,19 @@ Runtime rules: - Deduplication follows canonical unified-resource identity rather than transport-specific state. Migration policy: -- Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their grandfathered recurring price until cancellation. Self-hosted monitoring and child-resource volume remain uncapped under the current v6 policy. -- Existing lifetime license holders remain valid and uncapped. +- Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their grandfathered recurring price until cancellation. Self-hosted monitoring and child-resource volume are not metered under the current v6 policy. +- Existing lifetime license holders remain valid, with self-hosted monitoring and child-resource volume not metered under the current v6 policy. - Supported legacy paid v5 migrations outside that recurring grandfathered path can still exchange into the v6 activation model without losing self-hosted monitoring access. Migration metadata can preserve the original cohort for support and audit, but monitored-system volume is no longer the paid gate. ### Paid Customer Continuity Matrix | Customer cohort | What happens in v6 | Pricing and capacity outcome | |---|---|---| -| Legacy recurring subscriber from a v5 or earlier Pulse Pro monthly/annual plan, already active before the public v6 pricing cutover | The install can migrate into the v6 activation model without forcing a repurchase. | The existing recurring price stays in place while the subscription remains continuously active; self-hosted monitoring and child-resource volume remain uncapped under the current v6 policy. | -| Existing lifetime license holder | The license remains valid through the v6 licensing transition. | Lifetime remains permanently valid; self-hosted monitoring and child-resource volume stay uncapped. | +| Legacy recurring subscriber from a v5 or earlier Pulse Pro monthly/annual plan, already active before the public v6 pricing cutover | The install can migrate into the v6 activation model without forcing a repurchase. | The existing recurring price stays in place while the subscription remains continuously active; self-hosted monitoring and child-resource volume are not metered under the current v6 policy. | +| Existing lifetime license holder | The license remains valid through the v6 licensing transition. | Lifetime remains permanently valid; self-hosted monitoring and child-resource volume are not metered under the current v6 policy. | | Legacy paid v5 license migrated into v6 outside the recurring grandfathered path | The install can still exchange into the v6 activation model without forcing a repurchase. Migration records can still preserve the original cohort for support and audit. | Self-hosted monitoring stays available; monitored-system volume is no longer sold as a paid gate on current v6 self-hosted plans. | -| Former recurring subscriber who already canceled or later lapses/cancels | A later return is treated as a new paid purchase, not as a grandfathered renewal. | The old grandfathered price does not resume automatically; current public v6 pricing applies for paid features while self-hosted monitoring remains unlimited. | -| New self-hosted v6 purchase | The purchase uses the current Community / Relay / Pro self-hosted plans. | Core monitoring stays unlimited; paid value comes from convenience, AI, history, and advanced admin features. | +| Former recurring subscriber who already canceled or later lapses/cancels | A later return is treated as a new paid purchase, not as a grandfathered renewal. | The old grandfathered price does not resume automatically; current public v6 pricing applies for paid features while self-hosted monitoring remains included without a monitored-system volume gate. | +| New self-hosted v6 purchase | The purchase uses the current Community / Relay / Pro self-hosted plans. | Core monitoring is included by default; paid value comes from convenience, AI, history, and advanced admin features. | Support rule: - If any self-hosted v6 install shows a bounded monitored-system, guest, or child-resource volume cap after activation or migration, treat it as a bug rather than as intended policy. diff --git a/docs/UPGRADE_v6.md b/docs/UPGRADE_v6.md index 004800760..99db7292f 100644 --- a/docs/UPGRADE_v6.md +++ b/docs/UPGRADE_v6.md @@ -147,13 +147,13 @@ Pulse v6 uses the activation/grant model for active licensing, but it can migrat - The exchanged v6 entitlement depends on the original cohort. Lifetime, active pre-cutover recurring Pro, and other migrated legacy paid installs do not all land on the same commercial continuity posture. -- Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their grandfathered recurring price until cancellation. Self-hosted monitoring and child-resource volume remain uncapped under the current v6 policy. If they cancel and later return, current v6 pricing applies for paid features. +- Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their grandfathered recurring price until cancellation. Self-hosted monitoring and child-resource volume are not metered under the current v6 policy. If they cancel and later return, current v6 pricing applies for paid features. #### Paid Upgrade Truth Table When an existing paid user asks what changes for them specifically, use this rule set: -- Legacy recurring Pulse Pro subscriptions from v5 or earlier that were already active before the public v6 pricing cutover keep their current recurring price while the subscription remains continuously active. Self-hosted monitoring and child-resource volume remain uncapped under the current v6 policy. +- Legacy recurring Pulse Pro subscriptions from v5 or earlier that were already active before the public v6 pricing cutover keep their current recurring price while the subscription remains continuously active. Self-hosted monitoring and child-resource volume are not metered under the current v6 policy. - Existing lifetime customers remain permanently valid, with self-hosted monitoring and child-resource volume not metered under the current v6 policy. - Legacy paid v5 licenses migrated into v6 outside the recurring grandfathered path can still exchange into the v6 activation model without repurchasing. Migration records can preserve the original cohort for support and audit, but self-hosted monitoring volume is no longer the paid gate. - Former recurring customers who already canceled, or who cancel and later return, do not resume the old grandfathered pricing automatically; they re-enter on current public v6 pricing for paid features while self-hosted monitoring remains included without a monitored-system volume gate. diff --git a/docs/releases/RELEASE_NOTES_v6.md b/docs/releases/RELEASE_NOTES_v6.md index 55f1e4bd6..b0e9c0bcb 100644 --- a/docs/releases/RELEASE_NOTES_v6.md +++ b/docs/releases/RELEASE_NOTES_v6.md @@ -55,10 +55,11 @@ self-hosted checkout tier. ### Existing paid customer continuity is explicit -- Existing lifetime customers remain valid and uncapped. +- Existing lifetime customers remain valid, with self-hosted monitoring volume + not metered under the current v6 policy. - Legacy recurring Pulse Pro subscribers who were already active before the - public v6 pricing cutover remain uncapped while that subscription stays - active. + public v6 pricing cutover keep their existing recurring price while that + subscription stays active. - Supported legacy paid migrations can still exchange into the v6 activation model without repurchasing. - If a self-hosted v6 install still shows a bounded monitored-system cap after diff --git a/docs/releases/RELEASE_NOTES_v6_RC2_DRAFT.md b/docs/releases/RELEASE_NOTES_v6_RC2_DRAFT.md index 87f06a2a5..ee382ccfc 100644 --- a/docs/releases/RELEASE_NOTES_v6_RC2_DRAFT.md +++ b/docs/releases/RELEASE_NOTES_v6_RC2_DRAFT.md @@ -10,7 +10,7 @@ The purpose of this RC is not to expand the product again. It is to correct the main sources of friction that `rc.1` exposed in real user feedback: - self-hosted monitored-system caps should not be the v6 monetization boundary -- existing paid customer continuity must be unambiguous and uncapped where +- existing paid customer continuity must be unambiguous where previously promised - the product and account surfaces should explain the current commercial model clearly instead of carrying stale cap-era copy @@ -40,20 +40,21 @@ Current self-hosted v6 packaging is: | Pro | Included | 90 days | Relay plus AI operations, automation, and advanced admin features | Legacy `Pro+` remains continuity-only for existing holders. It is not a public -no-cap self-hosted checkout tier. +self-hosted checkout tier in the current core-monitoring-included model. ### Existing Paid Customer Continuity Is Explicit -- Existing lifetime licenses remain valid and uncapped. +- Existing lifetime licenses remain valid, with self-hosted monitoring volume + not metered under the current v6 policy. - Legacy recurring Pulse Pro subscribers who were already active before the - public v6 pricing cutover remain uncapped while that subscription stays - active. + public v6 pricing cutover keep their existing recurring price while that + subscription stays active. - Supported legacy paid migrations can still exchange into the v6 activation model without losing self-hosted monitoring access. - If a self-hosted v6 install still shows a bounded monitored-system cap after activation or migration, treat that as a bug rather than intended policy. -### Billing and Upgrade Surfaces Match the No-Cap Model +### Billing and Upgrade Surfaces Match the Core-Monitoring-Included Model The local billing plan surface, Pulse Account upgrade handoff, and related pricing copy now describe self-hosted upgrades as plan selection plus paid diff --git a/docs/releases/V6_CHANGELOG.md b/docs/releases/V6_CHANGELOG.md index b7a1127b4..68268451f 100644 --- a/docs/releases/V6_CHANGELOG.md +++ b/docs/releases/V6_CHANGELOG.md @@ -46,8 +46,8 @@ volume. licenses into v6 entitlements. - **Self-hosted core monitoring is no longer commercially capped on current - public plans.** Community, Relay, and Pro now keep self-hosted core - monitoring unlimited. Relay sells remote/mobile convenience plus 14-day + public plans.** Community, Relay, and Pro include self-hosted core + monitoring by default. Relay sells remote/mobile convenience plus 14-day history, while Pro adds AI operations, automation, advanced admin surfaces, and 90-day history. @@ -67,7 +67,7 @@ volume. 5. **License activation and paid continuity after upgrade.** If the v5 system has a paid license, verify the v6 entitlement state, lifetime or recurring - continuity cohort, and self-hosted no-cap commercial posture immediately + continuity cohort, and core-monitoring-included commercial posture immediately after first boot. 6. **Upgrade against a real v5 data copy.** Use a copy of an actual v5 data directory and verify sessions, alert configuration, AI settings, metrics history, audit history, and filesystem assumptions after the v6 startup migration. @@ -101,7 +101,7 @@ volume. states are recorded and surfaced instead of being silently ignored. - **Monitored-system counting is still deliberate where continuity needs it.** - Current public self-hosted plans are no-cap, but canonical monitored-system + Current public self-hosted plans include core monitoring by default, but canonical monitored-system identity still matters for migration truth, inventory language, and the remaining continuity cohorts that are preserved inside the v6 model. diff --git a/docs/releases/V6_CHANGELOG_RC1.md b/docs/releases/V6_CHANGELOG_RC1.md index 70d50ae96..489e409d9 100644 --- a/docs/releases/V6_CHANGELOG_RC1.md +++ b/docs/releases/V6_CHANGELOG_RC1.md @@ -2,10 +2,11 @@ _This changelog is based on the shipped `v6.0.0-rc.1` tag compared with `v5.1.27`. It does not describe later branch-only work on `pulse/v6-release`._ -_Pricing/limit note: this rc.1 note predates the later no-cap public self-hosted -model. Current v6 Community, Relay, and Pro self-hosted plans keep core -monitoring unlimited; paid self-hosted value is in Relay/mobile, history, -AI operations, and admin features rather than monitored-system capacity._ +_Pricing/limit note: this rc.1 note predates the later current public +self-hosted model. Current v6 Community, Relay, and Pro self-hosted plans +include core monitoring by default; paid self-hosted value is in Relay/mobile, +history, AI operations, and admin features rather than monitored-system +capacity._ ## What v6 changes at a high level @@ -23,7 +24,7 @@ For existing Pulse v5 operators, this is not just a visual refresh. The default - **Adding infrastructure is more structured.** The shipped RC includes cluster agent deployment workflows with candidate discovery, preflights, jobs, event streams, cancel, and retry paths. That is a real workflow change from v5's more manual install-command model. -- **Licensing and activation behave differently.** V6 tracks entitlement state, commercial posture, and paid-license continuity more explicitly. Later v6 branch work removed the early self-hosted monitored-system capacity ladder and retired ordinary self-hosted trial acquisition; current Community, Relay, and Pro self-hosted plans keep core monitoring unlimited. +- **Licensing and activation behave differently.** V6 tracks entitlement state, commercial posture, and paid-license continuity more explicitly. Later v6 branch work removed the early self-hosted monitored-system capacity ladder and retired ordinary self-hosted trial acquisition; current Community, Relay, and Pro self-hosted plans include core monitoring by default. - **Hosted, org, and relay/mobile capabilities are also part of the shipped RC.** They are present in `v6.0.0-rc.1`, but most existing self-hosted v5 operators can treat them as second-wave testing rather than the first things to validate. diff --git a/docs/releases/V6_CHANGELOG_RC2_DRAFT.md b/docs/releases/V6_CHANGELOG_RC2_DRAFT.md index c7c65d995..c2c0dac81 100644 --- a/docs/releases/V6_CHANGELOG_RC2_DRAFT.md +++ b/docs/releases/V6_CHANGELOG_RC2_DRAFT.md @@ -28,22 +28,23 @@ The current self-hosted paid model is: and advanced admin features Legacy `Pro+` remains continuity-only for existing holders. It is not a public -self-hosted checkout tier for the no-cap model. +self-hosted checkout tier for the current core-monitoring-included model. ### 2. Paid-customer continuity is stricter and less surprising `rc.2` carries the fixes that make the actual continuity policy match the intended policy: -- lifetime remains uncapped -- active legacy recurring v5 Pulse Pro continuity remains uncapped while the +- lifetime licenses are not metered by self-hosted monitoring volume +- active legacy recurring v5 Pulse Pro continuity is not metered by + self-hosted monitoring volume while the subscription stays active - other supported legacy paid migrations can still exchange into v6 without losing self-hosted monitoring access - stale self-hosted capped entitlements are normalized back to the current core-monitoring-included contract on refresh -### 3. Billing, plan, and account surfaces now match the no-cap model +### 3. Billing, plan, and account surfaces now match the core-monitoring-included model The product and Pulse Account no longer frame self-hosted upgrades as buying more monitored-system capacity. @@ -55,7 +56,7 @@ Instead, the self-hosted paid story is now consistently: - Pro: Relay plus AI operations, automation, governance, and longer history -The no-cap model now flows through the local billing plan surface, Pulse +The core-monitoring-included model now flows through the local billing plan surface, Pulse Account handoff, and the shared plan-definition owners rather than being only a docs promise. @@ -68,8 +69,8 @@ continues, and any finite admission freeze applies only to those explicit policy contexts. It is not a public self-hosted capacity upsell. For the normal current self-hosted Community / Relay / Pro path, the plan -surface now simply treats core monitoring as unlimited instead of carrying stale -cap-era UI chrome. +surface now presents core monitoring as included by default instead of carrying +stale cap-era UI chrome. ### 5. Two early `rc.1` regressions are fixed diff --git a/docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md b/docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md index 7e4e954fa..384dd389e 100644 --- a/docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md +++ b/docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md @@ -29,8 +29,8 @@ No. Server upgrade and Unified Agent upgrade remain separate operations. ### Does self-hosted v6 still cap monitored systems? -No for the current public self-hosted plans. Community, Relay, and Pro now keep -core self-hosted monitoring unlimited. +No for the current public self-hosted plans. Community, Relay, and Pro include +core self-hosted monitoring by default. Monitored systems still matter for product understanding, migration truth, and inventory language, but they are no longer the self-hosted paid gate. @@ -54,10 +54,12 @@ Use this cohort breakdown: - Legacy recurring monthly or annual subscribers from v5 or earlier who were already active before the public v6 pricing cutover: - keep the current recurring price plus uncapped self-hosted monitoring and - child-resource volume while the subscription remains continuously active. + keep the current recurring price, with self-hosted monitoring and + child-resource volume not metered while the subscription remains continuously + active under the current v6 policy. - Existing lifetime customers: - remain permanently valid and uncapped. + remain permanently valid, with self-hosted monitoring and child-resource + volume not metered under the current v6 policy. - Legacy paid v5 licenses migrated into v6 outside the recurring grandfathered path: can still exchange into the v6 activation model without repurchasing. @@ -69,7 +71,7 @@ Use this cohort breakdown: Canonical short reply: -`Current self-hosted v6 plans no longer charge by monitored-system count. Lifetime customers remain uncapped. Legacy recurring Pulse Pro subscribers who were already active before the public v6 pricing cutover remain uncapped while that subscription stays active. Other supported legacy paid installs can still exchange into the v6 activation model without repurchasing, but self-hosted monitoring volume is no longer the paid gate.` +`Current self-hosted v6 plans no longer charge by monitored-system count. Lifetime customers remain valid, and self-hosted monitoring volume is no longer the paid gate. Legacy recurring Pulse Pro subscribers who were already active before the public v6 pricing cutover keep their existing recurring price while that subscription stays active. Other supported legacy paid installs can still exchange into the v6 activation model without repurchasing.` ### What if a self-hosted v6 install still shows a monitored-system cap? diff --git a/docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md b/docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md index fe57b9186..ab6fc32a2 100644 --- a/docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md +++ b/docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md @@ -64,10 +64,12 @@ Use this cohort breakdown: - Legacy recurring monthly or annual subscribers from v5 or earlier who were already active before the public v6 pricing cutover: - keep the current recurring price plus uncapped self-hosted monitoring and - child-resource volume while the subscription remains continuously active. + keep the current recurring price, with self-hosted monitoring and + child-resource volume not metered while the subscription remains continuously + active under the current v6 policy. - Existing lifetime customers: - remain permanently valid and uncapped. + remain permanently valid, with self-hosted monitoring and child-resource + volume not metered under the current v6 policy. - Legacy paid v5 licenses migrated into v6 outside the recurring grandfathered path: can still exchange into the v6 activation model without repurchasing. @@ -77,15 +79,15 @@ Use this cohort breakdown: any later return uses current public v6 pricing rather than resuming the old grandfathered terms. - New self-hosted v6 purchasers: - take the current Community / Relay / Pro model with unlimited core - monitoring. + take the current Community / Relay / Pro model with core monitoring included + by default. If a self-hosted v6 install shows a bounded monitored-system cap after activation or migration, treat that as a product bug, not as intended policy. Canonical short reply: -`Lifetime customers remain uncapped. Legacy recurring Pulse Pro subscribers who were already active before the public v6 pricing cutover remain uncapped while that subscription stays active. Other migrated legacy paid installs can still exchange into the v6 activation model without repurchasing, but self-hosted monitoring volume is no longer the paid gate. Former recurring subscribers who return later re-enter on current v6 pricing, and current self-hosted v6 purchases keep core monitoring unlimited.` +`Lifetime customers remain valid, and self-hosted monitoring volume is no longer the paid gate. Legacy recurring Pulse Pro subscribers who were already active before the public v6 pricing cutover keep their existing recurring price while that subscription stays active. Other migrated legacy paid installs can still exchange into the v6 activation model without repurchasing. Former recurring subscribers who return later re-enter on current v6 pricing, and current self-hosted v6 purchases include core monitoring by default.` ### Will old bookmarks and familiar v5 pages still work? diff --git a/scripts/release_control/documentation_currentness_test.py b/scripts/release_control/documentation_currentness_test.py index 2149070a0..8d4e39e04 100644 --- a/scripts/release_control/documentation_currentness_test.py +++ b/scripts/release_control/documentation_currentness_test.py @@ -138,6 +138,35 @@ class DocumentationCurrentnessTest(unittest.TestCase): pulse_pro_doc, ) + def test_public_self_hosted_docs_avoid_unlimited_monitoring_claims(self) -> None: + public_docs = ( + "docs/PULSE_PRO.md", + "docs/UPGRADE_v6.md", + "docs/releases/RELEASE_NOTES_v6.md", + "docs/releases/RELEASE_NOTES_v6_RC2_DRAFT.md", + "docs/releases/V6_CHANGELOG.md", + "docs/releases/V6_CHANGELOG_RC1.md", + "docs/releases/V6_CHANGELOG_RC2_DRAFT.md", + "docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md", + "docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md", + "frontend-modern/public/docs/README.md", + ) + forbidden_phrases = ( + "core monitoring unlimited", + "core monitoring stays unlimited", + "core monitoring remains unlimited", + "monitoring unlimited", + "unlimited core", + "no-cap", + "no cap", + "remain uncapped", + "remains uncapped", + ) + for rel in public_docs: + content = read(rel).lower() + for phrase in forbidden_phrases: + self.assertNotIn(phrase, content, msg=f"{rel} contains stale paid-cap wording: {phrase}") + if __name__ == "__main__": unittest.main() diff --git a/scripts/release_control/release_promotion_policy_test.py b/scripts/release_control/release_promotion_policy_test.py index 6516fc0c7..02ac92940 100644 --- a/scripts/release_control/release_promotion_policy_test.py +++ b/scripts/release_control/release_promotion_policy_test.py @@ -142,19 +142,21 @@ class ReleasePromotionPolicyTest(unittest.TestCase): with self.subTest(rel=rel): support_pack = read(rel) self.assertIn( - "current recurring price plus uncapped self-hosted monitoring and", + "keep the current recurring price, with self-hosted monitoring and", support_pack, ) - self.assertIn("child-resource volume while the subscription remains continuously active", support_pack) + self.assertIn("child-resource volume not metered", support_pack) + self.assertIn("core monitoring included", support_pack) self.assertNotIn("uncapped monitored-system plus guest", support_pack) self.assertNotIn("uncapped monitored-system and guest capacity", support_pack) self.assertNotIn("guest-capacity continuity", support_pack) + self.assertNotIn("core monitoring unlimited", normalize_ws(support_pack)) def test_rc1_changelog_keeps_current_free_first_licensing_posture(self) -> None: changelog = read("docs/releases/V6_CHANGELOG_RC1.md") normalized = normalize_ws(changelog) self.assertIn("Pricing/limit note", changelog) - self.assertIn("core monitoring unlimited", normalized) + self.assertIn("include core monitoring by default", normalized) self.assertIn("not a monitoring-volume paywall", normalized) self.assertNotIn( "monitored-system limits, commercial posture, and trial eligibility", @@ -193,7 +195,7 @@ class ReleasePromotionPolicyTest(unittest.TestCase): self.assertNotIn("### License, Trial, and Entitlements", upgrade_guide) self.assertIn("does not expose a general in-app trial, trial-return callback, or hosted AI quickstart", normalize_ws(upgrade_guide)) self.assertIn( - "Self-hosted monitoring and child-resource volume remain uncapped under the current v6 policy", + "Self-hosted monitoring and child-resource volume are not metered under the current v6 policy", upgrade_guide, ) self.assertIn("monitored-system, guest, or child-resource volume cap", upgrade_guide)