Extend paid claim proof boundary

This commit is contained in:
rcourtman 2026-04-29 23:40:32 +01:00
parent d77e959fb9
commit 72fe17a5d9
5 changed files with 41 additions and 9 deletions

View file

@ -114,7 +114,9 @@ into first-class product surfaces:
## Paid Feature Proof Map
Use this map before adding or changing public Pulse Pro/Relay copy. A feature is safe to sell only
when the claim has a runtime gate, presentation copy, and at least one regression proof.
when the claim has a runtime gate, presentation copy, and at least one regression proof. The
automated proof bundle also checks that ordinary self-hosted sessions stay free-first and do not
surface upgrade prompts unless the user deliberately enters a commercial path.
| Claim | Runtime source | Regression proof |
|---|---|---|

View file

@ -976,6 +976,7 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
"exact_files": [
"frontend-modern/src/api/__tests__/agentProfiles.test.ts",
"frontend-modern/src/components/Settings/__tests__/AgentProfilesPanel.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/agentProfilesPresentation.test.ts",
],
}
@ -1904,6 +1905,7 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
"exact_files": [
"frontend-modern/src/api/__tests__/agentProfiles.test.ts",
"frontend-modern/src/components/Settings/__tests__/AgentProfilesPanel.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/agentProfilesPresentation.test.ts",
],
}
@ -1939,6 +1941,7 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
"exact_files": [
"frontend-modern/src/api/__tests__/agentProfiles.test.ts",
"frontend-modern/src/components/Settings/__tests__/AgentProfilesPanel.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/agentProfilesPresentation.test.ts",
],
}
@ -2510,6 +2513,7 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
"frontend-modern/src/components/Settings/__tests__/SecurityPostureSummary.test.tsx",
"frontend-modern/src/components/Settings/__tests__/dataHandlingPanelModel.test.ts",
"frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/stores/__tests__/systemSettings.test.ts",
],
}
@ -2537,6 +2541,7 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
"exact_files": [
"frontend-modern/src/components/Settings/__tests__/APITokenManager.test.tsx",
"frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
],
}
],

View file

@ -278,6 +278,23 @@ def build_command_specs(args: argparse.Namespace) -> list[CommandSpec]:
"src/components/Settings/__tests__/RelaySettingsPanel.runtime.test.tsx",
],
),
CommandSpec(
name="pulse-frontend-free-first-commercial-boundary",
cwd=str(frontend_dir),
command=[
"npm",
"test",
"--",
"src/stores/__tests__/sessionPresentationPolicy.test.ts",
"src/__tests__/useAppRuntimeState.test.ts",
"src/features/patrol/__tests__/patrolCommercialBoundary.test.ts",
"src/pages/__tests__/AIIntelligence.test.tsx",
"src/components/Alerts/__tests__/InvestigateAlertButton.test.tsx",
"src/components/shared/__tests__/MonitoredSystemLimitWarningBanner.test.tsx",
"src/components/SetupWizard/__tests__/SetupCompletionPanel.guardrails.test.ts",
"src/pages/__tests__/PricingHandoff.test.tsx",
],
),
CommandSpec(
name="pulse-pro-public-pricing-and-checkout-contract",
cwd=str(pulse_pro_license_server_dir),
@ -422,7 +439,7 @@ def render_markdown_report(title: str, results: list[CommandResult]) -> str:
"",
"## Scope",
"",
"This proof checks that self-hosted paid claims map to concrete public copy, entitlement, API, UI, Pro admin-extra, license-server, and relay-server behavior.",
"This proof checks that self-hosted paid claims map to concrete public copy, entitlement, API, UI, Pro admin-extra, license-server, and relay-server behavior, while ordinary self-hosted sessions stay free-first and non-promotional.",
"",
"## Results",
"",

View file

@ -164,18 +164,20 @@ class PaidFeatureClaimsProofTest(unittest.TestCase):
)
specs = proof.build_command_specs(args)
self.assertEqual(len(specs), 8)
self.assertEqual(len(specs), 9)
self.assertEqual(specs[0].cwd, str(pulse_dir.resolve()))
self.assertEqual(specs[4].cwd, str(frontend_dir.resolve()))
self.assertEqual(specs[5].cwd, str(pulse_pro_license_server_dir.resolve()))
self.assertEqual(specs[6].cwd, str(pulse_pro_relay_server_dir.resolve()))
self.assertEqual(specs[7].cwd, str(pulse_enterprise_dir.resolve()))
self.assertEqual(specs[5].cwd, str(frontend_dir.resolve()))
self.assertEqual(specs[6].cwd, str(pulse_pro_license_server_dir.resolve()))
self.assertEqual(specs[7].cwd, str(pulse_pro_relay_server_dir.resolve()))
self.assertEqual(specs[8].cwd, str(pulse_enterprise_dir.resolve()))
names = {spec.name for spec in specs}
self.assertIn("pulse-licensing-paid-feature-contract", names)
self.assertIn("pulse-api-history-entitlement-enforcement", names)
self.assertIn("pulse-pro-admin-extras-api-contract", names)
self.assertIn("pulse-pro-admin-extras-core-packages", names)
self.assertIn("pulse-frontend-paid-claim-contract", names)
self.assertIn("pulse-frontend-free-first-commercial-boundary", names)
self.assertIn("pulse-pro-public-pricing-and-checkout-contract", names)
self.assertIn("pulse-pro-relay-entitlement-runtime", names)
self.assertIn("pulse-enterprise-pro-admin-extras-runtime", names)

View file

@ -1271,6 +1271,7 @@ class SubsystemLookupTest(unittest.TestCase):
[
"frontend-modern/src/components/Settings/__tests__/APITokenManager.test.tsx",
"frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
],
)
security_match = next(
@ -1629,6 +1630,7 @@ class SubsystemLookupTest(unittest.TestCase):
[
"frontend-modern/src/api/__tests__/agentProfiles.test.ts",
"frontend-modern/src/components/Settings/__tests__/AgentProfilesPanel.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/agentProfilesPresentation.test.ts",
],
)
@ -1661,6 +1663,7 @@ class SubsystemLookupTest(unittest.TestCase):
[
"frontend-modern/src/api/__tests__/agentProfiles.test.ts",
"frontend-modern/src/components/Settings/__tests__/AgentProfilesPanel.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/agentProfilesPresentation.test.ts",
],
)
@ -3146,6 +3149,7 @@ class SubsystemLookupTest(unittest.TestCase):
"frontend-modern/src/components/Settings/__tests__/OrganizationOverviewPanel.test.tsx",
"frontend-modern/src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
"frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
"frontend-modern/src/utils/__tests__/orgUtils.test.ts",
"frontend-modern/src/utils/__tests__/organizationRolePresentation.test.ts",
@ -3346,6 +3350,7 @@ class SubsystemLookupTest(unittest.TestCase):
"frontend-modern/src/components/Settings/__tests__/OrganizationOverviewPanel.test.tsx",
"frontend-modern/src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
"frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
"frontend-modern/src/utils/__tests__/orgUtils.test.ts",
"frontend-modern/src/utils/__tests__/organizationRolePresentation.test.ts",
@ -3384,6 +3389,7 @@ class SubsystemLookupTest(unittest.TestCase):
"frontend-modern/src/components/Settings/__tests__/OrganizationOverviewPanel.test.tsx",
"frontend-modern/src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
"frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
"frontend-modern/src/components/shared/SharedPrimitives.guardrails.test.ts",
"frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
"frontend-modern/src/utils/__tests__/orgUtils.test.ts",
"frontend-modern/src/utils/__tests__/organizationRolePresentation.test.ts",
@ -3535,7 +3541,7 @@ class SubsystemLookupTest(unittest.TestCase):
{
"heading": "## Extension Points",
"path": "frontend-modern/src/api/orgs.ts",
"line": 74,
"line": 79,
"heading_line": 70,
},
],
@ -3572,7 +3578,7 @@ class SubsystemLookupTest(unittest.TestCase):
{
"heading": "## Shared Boundaries",
"path": "internal/api/access_control_handlers.go",
"line": 127,
"line": 131,
"heading_line": 88,
}
],
@ -3611,7 +3617,7 @@ class SubsystemLookupTest(unittest.TestCase):
{
"heading": "## Extension Points",
"path": "internal/api/access_control_handlers.go",
"line": 76,
"line": 81,
"heading_line": 70,
},
],