From 0080108fa835aa3071ffe96b0888cbfd7afef3dc Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 15 Apr 2026 10:54:03 +0100 Subject: [PATCH] Own pulse-pro grandfathering under cloud-paid --- .../v6/internal/subsystems/cloud-paid.md | 7 ++++++- .../v6/internal/subsystems/registry.json | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/release-control/v6/internal/subsystems/cloud-paid.md b/docs/release-control/v6/internal/subsystems/cloud-paid.md index 107ec5559..520f12d3c 100644 --- a/docs/release-control/v6/internal/subsystems/cloud-paid.md +++ b/docs/release-control/v6/internal/subsystems/cloud-paid.md @@ -99,13 +99,18 @@ agreement, and cloud-specific enforcement rules. dev build metadata, or anonymous telemetry. 4. `internal/api/payments_webhook_handlers.go` shared with `api-contracts`: commercial payment webhook handlers carry both API payload contract and cloud-paid billing boundary ownership. 5. `internal/api/public_signup_handlers.go` shared with `api-contracts`: hosted signup handlers carry both API payload contract and cloud-paid hosted provisioning boundary ownership. - That shared monitored-system presentation boundary also owns disabled provider-connection copy. Commercial entitlement surfaces must treat canonical zero-delta and removal-only TrueNAS or VMware previews as non-consuming or capacity-freeing changes rather than warning users that a disabled connection still grows monitored-system usage. +The real `pulse-pro` license-server legacy checkout issuance, recurring +renewals, manual issue, and legacy exchange flows are part of that same +cloud-paid continuity boundary as well. Those flows must resolve grandfathered +recurring continuity from explicit active pre-cutover state, not from bare +legacy plan IDs, stale historical tokens, or issue timestamps alone. + ## Extension Points 1. Add or change limits through `pkg/licensing/` diff --git a/docs/release-control/v6/internal/subsystems/registry.json b/docs/release-control/v6/internal/subsystems/registry.json index d8c0172a4..ba0de5b61 100644 --- a/docs/release-control/v6/internal/subsystems/registry.json +++ b/docs/release-control/v6/internal/subsystems/registry.json @@ -1719,6 +1719,9 @@ "internal/cloudcp/stripe/provisioner.go", "internal/hosted/provisioner.go", "pulse-pro:.github/workflows/deploy-v6-preview-demo.yml", + "pulse-pro:license-server/grandfathering.go", + "pulse-pro:license-server/main.go", + "pulse-pro:license-server/v6_handlers.go", "pulse-pro:scripts/audit_v6_preview_demo.sh", "pulse-pro:scripts/audit_v6_preview_demo_browser.cjs", "pulse-pro:scripts/bootstrap-v6-demo-preview.sh" @@ -2323,6 +2326,22 @@ "frontend-modern/src/utils/__tests__/pricingHandoff.test.ts" ] }, + { + "id": "legacy-grandfathering-cutover", + "label": "legacy recurring grandfathering cutover proof", + "match_prefixes": [], + "match_files": [ + "pulse-pro:license-server/grandfathering.go", + "pulse-pro:license-server/main.go", + "pulse-pro:license-server/v6_handlers.go" + ], + "allow_same_subsystem_tests": false, + "test_prefixes": [], + "exact_files": [ + "pulse-pro:license-server/grandfathering_test.go", + "pulse-pro:license-server/main_test.go" + ] + }, { "id": "public-demo-preview-operations", "label": "public demo preview operations proof",