Pulse/pkg/licensing
rcourtman 6be2af1c19 Let providers evaluate MSP without asking permission first
Two mandatory round-trips stood between an interested MSP and their first
screen, and neither was technical.

setup.sh required four image digests shipped as literal <pin>
placeholders, so the only way to get them was to ask. All four images are
publicly readable, so there was never anything to hand out. setup.sh now
resolves each blank pin to an immutable digest from its published tag via
buildx imagetools and writes it back to .env; hand-set values are left
alone.

setup.sh then died outright without a licence file, so nobody could start
the stack, create a workspace, or see the portal until a human minted a
licence for them. The control plane already ran unlicensed via
ProviderMSPPlanSourceEnvFallback; only the installer refused. A licence
path that is set but missing is still a hard failure, since that is a
misconfiguration rather than a choice.

Unlicensed now means evaluation rather than the cheapest paid tier. The
env fallback defaulted to msp_starter, handing every unlicensed
deployment the full 5-client Starter allowance and leaving no boundary
between evaluating and buying. Adds msp_eval at 2 workspaces: same
capabilities, smaller cap, not purchasable, not on the public ladder.

An isolation guarantee is the one claim a provider cannot evaluate from a
screenshot, and both MSP leads this year went quiet at exactly this step.

Contracts: cloud-paid records the unlicensed plan rule and the
strictly-below-paid invariant; deployment-installability records
credential-free, correspondence-free installability.

Verification: TestMSPEvalCapStaysBelowCheapestPaidTier,
TestCanonicalizePlanVersion_MSPEval,
TestProviderMSPSetupScriptSupportsUnlicensedEvaluation. The last was
negative-tested by reintroducing a <pin> placeholder and confirming it
fails. ensure_image_pins exercised against the live registries.
licensing, cloudcp, control-plane and installtests all green.
2026-08-03 16:31:24 +01:00
..
testsupport Move license test signers to testsupport 2026-04-28 19:12:21 +01:00
activation_store.go Harden scanned request and storage boundaries 2026-07-09 17:22:29 +01:00
activation_store_test.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
activation_test_helpers_test.go Remove 198 unreachable Go functions 2026-06-03 12:29:37 +01:00
activation_types.go Classify license server transport failures as retryable 2026-08-02 00:04:40 +01:00
activation_types_coverage_test.go test(coverage): agentexec codecs and licensing service branch coverage 2026-07-14 14:45:55 +01:00
activation_types_test.go Classify license server transport failures as retryable 2026-08-02 00:04:40 +01:00
billing_state_normalization.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
billing_state_normalization_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
billing_store.go Retire hosted AI quickstart runtime 2026-04-28 16:11:27 +01:00
capability_aliases.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
capability_aliases_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
cloud_paid_guardrails_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
commercial_migration.go Clarify v5 migration recovery states 2026-07-07 21:46:07 +01:00
commercial_migration_load.go fix(licensing): surface unreadable persisted v5 licenses and retry failed startup exchanges 2026-06-11 08:44:35 +01:00
commercial_migration_load_test.go fix(licensing): surface unreadable persisted v5 licenses and retry failed startup exchanges 2026-06-11 08:44:35 +01:00
commercial_migration_test.go Clarify v5 migration recovery states 2026-07-07 21:46:07 +01:00
contracts.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
database_source.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
database_source_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
dev_mode_dev.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
dev_mode_features.go Remove 198 unreachable Go functions 2026-06-03 12:29:37 +01:00
dev_mode_release.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
entitlement_lease.go Make provider-MSP client runtimes verifiably licensed via chained entitlement leases 2026-06-10 13:58:52 +01:00
entitlement_lease_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
entitlement_payload.go Remove unreachable exported functions from pkg/ 2026-07-10 00:27:35 +01:00
entitlement_payload_test.go Surface paid runtime mismatch in licensing 2026-05-06 17:18:35 +01:00
entitlement_source.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
entitlements.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
evaluator.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
evaluator_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
feature_map.go Register the external_probe Pro entitlement 2026-07-27 11:13:04 +01:00
feature_map_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
features.go Let providers evaluate MSP without asking permission first 2026-08-03 16:31:24 +01:00
features_test.go Let providers evaluate MSP without asking permission first 2026-08-03 16:31:24 +01:00
grant_claims_contract_test.go Fix activation fingerprint and license period status 2026-07-09 11:30:26 +01:00
grant_refresh.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
grant_refresh_test.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
grant_verification_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
host_lifecycle.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
host_lifecycle_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
hosted_entitlement_test_helpers_test.go Fix release-mode licensing test expectations 2026-04-28 18:58:35 +01:00
hosted_subscription.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
hosted_subscription_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
http.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
http_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
installation_status_poll.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
installation_status_poll_test.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
legacy_v5_monitored_system_limit_aliases.go Remove unreachable exported functions from pkg/ 2026-07-10 00:27:35 +01:00
license_server_client.go Classify license server transport failures as retryable 2026-08-02 00:04:40 +01:00
license_server_client_test.go Classify license server transport failures as retryable 2026-08-02 00:04:40 +01:00
licensing_features_pure_branchcov0716_test.go Add Go branch-coverage tests for alerts monitoring model-resolution ai and licensing helpers 2026-07-16 15:17:45 +01:00
models.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
models_test.go Carry the max_users grant claim into instance license limits 2026-07-08 16:56:07 +01:00
monitored_system_limit.go Remove 198 unreachable Go functions 2026-06-03 12:29:37 +01:00
monitored_system_limit_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
overflow_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
persistence.go fix(licensing): decrypt v5.0.0-era license.enc sealed with raw machine-id material 2026-06-11 08:36:11 +01:00
persistence_test.go fix(licensing): decrypt v5.0.0-era license.enc sealed with raw machine-id material 2026-06-11 08:36:11 +01:00
provider_chain_test.go Make provider-MSP client runtimes verifiably licensed via chained entitlement leases 2026-06-10 13:58:52 +01:00
public_key.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
public_key_test.go Fix release-mode licensing test expectations 2026-04-28 18:58:35 +01:00
purchase_return.go Restrict purchase return HTTP callbacks to loopback 2026-04-22 09:49:36 +01:00
purchase_return_test.go Add self-hosted commercial continuity proof 2026-05-13 16:44:26 +01:00
quickstart_credits.go Retire hosted AI quickstart runtime 2026-04-28 16:11:27 +01:00
quickstart_credits_test.go Retire hosted AI quickstart runtime 2026-04-28 16:11:27 +01:00
self_hosted_feature_catalog.go Register the external_probe Pro entitlement 2026-07-27 11:13:04 +01:00
service.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
service_activate_test.go Fix activation fingerprint and license period status 2026-07-09 11:30:26 +01:00
service_coverage_test.go test(coverage): agentexec codecs and licensing service branch coverage 2026-07-14 14:45:55 +01:00
service_state_branchcov0718_test.go Add Go branch-coverage tests for twelve pure backend helpers 2026-07-19 15:10:09 +01:00
stripe_subscription.go Let providers evaluate MSP without asking permission first 2026-08-03 16:31:24 +01:00
stripe_subscription_test.go Let providers evaluate MSP without asking permission first 2026-08-03 16:31:24 +01:00
subscription_state.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
subscription_test.go Preserve customer data across plan downgrades 2026-07-14 11:47:25 +01:00
subscription_transitions.go Preserve customer data across plan downgrades 2026-07-14 11:47:25 +01:00
testing_helpers.go Gate licensing test helpers out of release builds 2026-04-22 06:18:40 +01:00
token_source.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
token_source_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
trial_activation.go Clarify hosted entitlement signing compatibility 2026-04-28 18:47:19 +01:00
trial_activation_public_key_override_dev.go Compile out release env guardrail bypasses 2026-04-22 00:05:57 +01:00
trial_activation_public_key_override_release.go Compile out release env guardrail bypasses 2026-04-22 00:05:57 +01:00
trial_activation_release_test.go Compile out release env guardrail bypasses 2026-04-22 00:05:57 +01:00
trial_activation_test.go Clarify hosted entitlement signing compatibility 2026-04-28 18:47:19 +01:00
trial_start.go Retire self-hosted trial posture prompts 2026-04-28 17:39:09 +01:00
trial_start_test.go Retire self-hosted trial posture prompts 2026-04-28 17:39:09 +01:00
types.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
upgrade.go Register the external_probe Pro entitlement 2026-07-27 11:13:04 +01:00
upgrade_reasons.go Encode canonical self-hosted feature metadata 2026-04-23 15:30:42 +01:00
upgrade_test.go Register the external_probe Pro entitlement 2026-07-27 11:13:04 +01:00
user_limit.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
user_limit_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00