mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-07-09 16:00:59 +00:00
7370 lines
244 KiB
JSON
7370 lines
244 KiB
JSON
{
|
|
"version": "6.0",
|
|
"updated_at": "2026-04-29",
|
|
"scope": {
|
|
"active_repos": [
|
|
"pulse",
|
|
"pulse-enterprise",
|
|
"pulse-mobile",
|
|
"pulse-pro"
|
|
],
|
|
"control_plane_repo": "pulse",
|
|
"ignored_repos": [
|
|
"pulse-5.1.x",
|
|
"pulse-refactor-streams"
|
|
],
|
|
"repo_catalog": [
|
|
{
|
|
"id": "pulse",
|
|
"purpose": "Core desktop/runtime repo and canonical Pulse v6 release-control authority.",
|
|
"visibility": "public"
|
|
},
|
|
{
|
|
"id": "pulse-enterprise",
|
|
"purpose": "Closed-source enterprise and paid runtime features that should not ship as open-source surfaces.",
|
|
"visibility": "private"
|
|
},
|
|
{
|
|
"id": "pulse-mobile",
|
|
"purpose": "Mobile client, mobile relay flows, approval UX, and device-local auth/state handling.",
|
|
"visibility": "private"
|
|
},
|
|
{
|
|
"id": "pulse-pro",
|
|
"purpose": "Financial, operational, checkout, license-server, and relay-server surfaces that back commercial flows.",
|
|
"visibility": "private"
|
|
}
|
|
]
|
|
},
|
|
"source_precedence": [
|
|
"docs/release-control/v6/internal/SOURCE_OF_TRUTH.md",
|
|
"docs/release-control/v6/internal/status.json",
|
|
"docs/release-control/v6/status.schema.json",
|
|
"docs/release-control/v6/internal/CANONICAL_DEVELOPMENT_PROTOCOL.md",
|
|
"docs/release-control/v6/internal/subsystems/registry.json",
|
|
"docs/release-control/v6/internal/subsystems/registry.schema.json"
|
|
],
|
|
"execution_model": "direct-repo-sessions",
|
|
"readiness": {
|
|
"repo_ready_rule": "all lanes target-met and evidence-present plus all repo-ready assertions passed",
|
|
"rc_ready_rule": "repo_ready plus all rc-ready assertions passed plus zero rc-ready open_decisions plus all rc-ready release_gates passed",
|
|
"release_ready_rule": "rc_ready plus all release-ready assertions passed plus zero release-ready open_decisions plus all release-ready release_gates passed"
|
|
},
|
|
"readiness_assertions": [
|
|
{
|
|
"id": "RA1",
|
|
"summary": "Governed surfaces that should use the unified resource model do not keep shipping on legacy equivalents.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts",
|
|
"unified-resources"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "ra1-unified-resource-guardrails",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/unifiedresources",
|
|
"-run",
|
|
"TestNoDirectStateAccessForMigratedResources|TestNoLegacyHostResourceTypeSymbol|TestNoLegacyMigrationHintsInRuntimeCode|TestV6AgentRegistrationArtifactsStayCanonical|TestV6BroadLegacyAliasCoverage|TestV6ReleaseFacingAPITestsCoverLegacyHostRejection|TestV6DirectHostAliasValidatorCoverage",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/__tests__/UnifiedResourceTable.workloads-link.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/hooks/__tests__/useUnifiedResources.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/code_standards_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA2",
|
|
"summary": "New users can complete Pulse Pro Relay signup through paid activation without manual operator intervention or ambiguous provisioning steps.",
|
|
"kind": "journey",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L8",
|
|
"L12"
|
|
],
|
|
"subsystem_ids": [
|
|
"cloud-paid",
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [
|
|
"hosted-signup-billing-replay"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "hosted-signup-api-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestHostedLifecycle|TestHostedSignupSuccess|TestHostedSignupValidationFailures|TestHostedSignupHostedModeGate|TestHostedSignupRateLimit|TestHostedSignupRateLimit_NoProvisioningSideEffects|TestHostedSignupCleanupOnRBACFailure|TestHostedSignupFailsClosedWithoutPublicURL",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "hosted-signup-provisioner-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/hosted",
|
|
"-run",
|
|
"TestProvisionTenantSuccess|TestProvisionTenantIdempotentDuplicateEmail|TestProvisionTenantIdempotentDuplicateEmailCaseInsensitive|TestProvisionTenantValidationFailures|TestProvisionTenantPartialFailureRollback|TestProvisionHostedSignupSuccess",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/hosted-signup-billing-replay-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/hosted-signup-billing-replay-production-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/hosted-signup-billing-replay-production-fixed-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/BillingAdminPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/hosted_lifecycle_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/hosted_signup_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/hosted/provisioner_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA3",
|
|
"summary": "After first successful entitlement activation, Pulse preserves paid state across supported sessions and upgrades without repeated license entry.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L5",
|
|
"L8"
|
|
],
|
|
"subsystem_ids": [
|
|
"cloud-paid",
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [
|
|
"paid-feature-entitlement-gating",
|
|
"upgrade-state-and-entitlement-preservation"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "entitlement-gating-api-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestHandleActivateLicense_ExchangesLegacyJWTInStrictV6|TestHandleActivateLicense_ClearsCommercialMigrationStateOnNativeActivation|TestHandleActivateLicense_ActivationKeyClearsStaleLegacyPersistence|TestGetTenantComponents_AutoExchangesPersistedLegacyJWT|TestGetTenantComponents_SkipsExchange_WhenActivationStateExists|TestGetTenantComponents_PersistsCommercialMigrationState_WhenAutoExchangeFails|TestRequireLicenseFeature_HostedEntitlementsBlockMissingFeature|TestRequireLicenseFeature_HostedEntitlementsAllowGrantedFeature|TestLicenseGatedEmptyResponse_HostedEntitlementsReturnEmptyArrayWhenLocked",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "upgrade-state-migration-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./tests/migration",
|
|
"-run",
|
|
"TestV5PaidLicenseUpgrade_CommercialMigrationFailureMatrix|TestV5PaidLicenseUpgrade_RealLicenseServerExchange|TestV5DataDir_CSRFLegacyMapFormat|TestV5DataDir_CSRFTokenFileContinuity|TestV5DataDir_SessionLegacyMapFormat|TestV5DataDir_SessionTokenContinuity|TestV5DowngradeSafety|TestV5FullUpgradeScenario",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/upgrade-state-and-entitlement-preservation-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/license_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/licensing_handlers_auto_migrate_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_commercial_migration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_real_exchange_upgrade_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_session_db_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA4",
|
|
"summary": "Typical end users cannot trivially unlock Pulse Pro features by stripping client-only checks while server and hosted entitlements still deny access.",
|
|
"kind": "trust-gate",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L6",
|
|
"L9",
|
|
"L12"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts",
|
|
"cloud-paid"
|
|
],
|
|
"release_gate_ids": [
|
|
"paid-feature-entitlement-gating"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "entitlement-gating-api-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestHandleActivateLicense_ExchangesLegacyJWTInStrictV6|TestHandleActivateLicense_ClearsCommercialMigrationStateOnNativeActivation|TestHandleActivateLicense_ActivationKeyClearsStaleLegacyPersistence|TestGetTenantComponents_AutoExchangesPersistedLegacyJWT|TestGetTenantComponents_SkipsExchange_WhenActivationStateExists|TestGetTenantComponents_PersistsCommercialMigrationState_WhenAutoExchangeFails|TestRequireLicenseFeature_HostedEntitlementsBlockMissingFeature|TestRequireLicenseFeature_HostedEntitlementsAllowGrantedFeature|TestLicenseGatedEmptyResponse_HostedEntitlementsReturnEmptyArrayWhenLocked",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/pages/__tests__/AIIntelligence.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/license_handlers_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA5",
|
|
"summary": "Ordinary self-hosted v6 users do not see paid service prompts, trial CTAs, plan upsells, or paid-only navigation by default; commercial surfaces are reachable only through explicit handoff, direct route, hosted mode, or active entitlement/recovery state.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L8",
|
|
"L9",
|
|
"L12"
|
|
],
|
|
"subsystem_ids": [
|
|
"cloud-paid",
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [
|
|
"paid-feature-entitlement-gating"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "frontend-paid-surface-visibility-tests",
|
|
"cwd": "frontend-modern",
|
|
"run": [
|
|
"npm",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/stores/__tests__/sessionPresentationPolicy.test.ts",
|
|
"src/stores/__tests__/license.test.ts",
|
|
"src/components/Settings/__tests__/ProLicensePanel.test.tsx",
|
|
"src/utils/__tests__/licensePresentation.test.ts",
|
|
"src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"src/components/Settings/__tests__/settingsNavigation.integration.test.tsx",
|
|
"src/components/Settings/__tests__/AISettings.test.tsx",
|
|
"src/components/Settings/__tests__/ReportingPanel.test.tsx",
|
|
"src/components/Settings/__tests__/RelaySettingsPanel.runtime.test.tsx",
|
|
"src/components/Settings/__tests__/AgentProfilesPanel.test.tsx",
|
|
"src/components/Infrastructure/deploy/__tests__/ConfirmStep.test.tsx",
|
|
"src/utils/__tests__/deployStatusPresentation.test.ts",
|
|
"src/components/shared/__tests__/HistoryChart.test.tsx",
|
|
"src/components/shared/__tests__/TrialBanner.test.tsx",
|
|
"src/pages/__tests__/AIIntelligence.test.tsx",
|
|
"src/features/patrol/__tests__/patrolCommercialBoundary.test.ts"
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-paid-prompt-browser-visibility",
|
|
"run": [
|
|
"env",
|
|
"PULSE_E2E_USE_LOCAL_BACKEND=1",
|
|
"npm",
|
|
"--prefix",
|
|
"tests/integration",
|
|
"test",
|
|
"--",
|
|
"tests/58-self-hosted-trial-rate-limit-ui.spec.ts",
|
|
"--project=chromium"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/self-hosted-paid-services-opt-in-surface-2026-04-25.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/ProLicensePanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/settingsNavigation.integration.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/useProLicensePanelState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/pages/__tests__/AIIntelligence.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/stores/__tests__/sessionPresentationPolicy.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/stores/licenseCommercial.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/stores/sessionPresentationPolicy.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/58-self-hosted-trial-rate-limit-ui.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA6",
|
|
"summary": "Supported upgrades preserve core state, entitlements, and first-session continuity without manual repair steps.",
|
|
"kind": "journey",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L5",
|
|
"L8"
|
|
],
|
|
"subsystem_ids": [
|
|
"cloud-paid",
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [
|
|
"upgrade-state-and-entitlement-preservation"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "csrf-state-migration-api-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestCSRFTokenStore_Load_CurrentFormat_SkipsNilAndExpired|TestCSRFTokenStore_Load_MigratesLegacyFormat",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "upgrade-state-migration-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./tests/migration",
|
|
"-run",
|
|
"TestV5PaidLicenseUpgrade_CommercialMigrationFailureMatrix|TestV5PaidLicenseUpgrade_RealLicenseServerExchange|TestV5DataDir_CSRFLegacyMapFormat|TestV5DataDir_CSRFTokenFileContinuity|TestV5DataDir_SessionLegacyMapFormat|TestV5DataDir_SessionTokenContinuity|TestV5DowngradeSafety|TestV5FullUpgradeScenario",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/upgrade-state-and-entitlement-preservation-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/csrf_store_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/licensing_handlers_auto_migrate_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/11-first-session.spec.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_full_upgrade_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_real_exchange_upgrade_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_session_db_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA7",
|
|
"summary": "Monitored-system volume caps are retired end to end: runtime writes admit infrastructure regardless of stale plan-limit metadata, entitlements scrub retired monitored-system limits, and UI surfaces use monitored-system counts only for informational billing/support context.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L6",
|
|
"L8",
|
|
"L12",
|
|
"L16"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts",
|
|
"cloud-paid",
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [
|
|
"paid-feature-entitlement-gating"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "monitored-system-allocation-backend-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestHandleAddNode_AllowsNewCountedSystemWithCapsRetired|TestHandleAutoRegister_AllowsNewCountedSystemWithCapsRetired|TestDockerAgentHandlers_HandleReport_AllowsNewMonitoredSystemWithCapsRetired|TestKubernetesAgentHandlers_HandleReport_AllowsNewMonitoredSystemWithCapsRetired|TestUnifiedAgentHandlers_HandleReport_AllowsNewHostsWithCapsRetired|TestHandleCreateJob_AcceptsAllTargetsWithMonitoredSystemCapsRetired|TestContract_DeployHandlersDoNotSurfaceLicenseSlotCapacityCopy|TestBuildEntitlementPayloadWithUsage_CurrentValues",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"cwd": "frontend-modern",
|
|
"id": "monitored-system-allocation-frontend-tests",
|
|
"run": [
|
|
"npm",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/components/Settings/__tests__/OrganizationBillingPanel.test.tsx",
|
|
"src/components/Settings/__tests__/ProLicensePanel.test.tsx",
|
|
"src/components/Settings/__tests__/MonitoredSystemLedgerPanel.test.tsx",
|
|
"src/components/Infrastructure/deploy/__tests__/ConfirmStep.test.tsx",
|
|
"src/hooks/__tests__/useDeployWizard.test.ts"
|
|
]
|
|
},
|
|
{
|
|
"id": "monitored-system-allocation-limit-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./pkg/licensing",
|
|
"-run",
|
|
"TestClaims_EffectiveLimitsScrubsRetiredCloudPlanMonitoringLimit|TestLicenseStatusJSON_OmitsRetiredMonitoredSystemFields|TestBuildEntitlementPayload_ActiveLicenseOmitsRetiredMonitoredSystemLimit|TestNormalizeBillingState_ScrubsRetiredMonitoredSystemLimitAliases",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/OrganizationBillingPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/config_handlers_add_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/config_handlers_auto_register_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/deploy_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/docker_agents_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/entitlement_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/kubernetes_agents_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/truenas_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/unified_agent_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "pkg/licensing/features_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "pkg/licensing/monitored_system_limit_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA8",
|
|
"summary": "Stable or GA promotion happens only after an exercised RC, live release-pipeline proof, a recorded rollback target, a written v5 maintenance-only support policy, and a coherent self-hosted commercial package.",
|
|
"kind": "trust-gate",
|
|
"blocking_level": "release-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L1",
|
|
"L2",
|
|
"L9",
|
|
"L11",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"subsystem_ids": [],
|
|
"release_gate_ids": [
|
|
"known-rc-issue-closure-for-ga",
|
|
"rc-to-ga-promotion-readiness",
|
|
"self-hosted-commercial-ga-coherence"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "release-promotion-policy-tests",
|
|
"run": [
|
|
"python3",
|
|
"scripts/release_control/release_promotion_policy_test.py"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": ".github/workflows/release-dry-run.yml",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/PRE_RELEASE_CHECKLIST.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/RC_TO_GA_REHEARSAL_TEMPLATE.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-blocked-2026-04-21.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-26.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-28.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-blocked-2026-03-26.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/self-hosted-commercial-ga-coherence-2026-04-20.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/RELEASE_PROMOTION_POLICY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/V5_MAINTENANCE_SUPPORT_POLICY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/release_promotion_policy_test.py",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA9",
|
|
"summary": "A real v5-installed Pulse Unified Agent upgrades through v6 release assets into one canonical v6 agent identity, preserves one-shot update continuity metadata, keeps legacy persisted host-agent token scopes valid at the v6 canonical agent endpoints, and does not drift agent-count or fallback behavior during the crossover.",
|
|
"kind": "journey",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L11",
|
|
"L12",
|
|
"L16"
|
|
],
|
|
"subsystem_ids": [
|
|
"agent-lifecycle"
|
|
],
|
|
"release_gate_ids": [
|
|
"unified-agent-v5-upgrade-continuity"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "unified-agent-first-report-continuity-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/hostagent",
|
|
"-run",
|
|
"TestNew_CarriesUpdatedFromIntoFirstV6Report|TestAgentSendReport_SetsHeadersAndPostsJSON",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "unified-agent-install-fallback-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestDownloadUnifiedInstallScript|TestDownloadUnifiedInstallScriptPS|TestProxyInstallScriptFromGitHub|TestContract_InstallScriptReleaseAssetURL|TestDownloadUnifiedAgent|TestUnifiedAgentHandlers_LegacyV5ReportUpgradesToSingleCanonicalUnifiedAgent|TestUnifiedAgentEndpointsAcceptLegacyUnifiedAgentReportScopeAlias|TestNormalizeRequestedScopesCanonicalizesLegacyUnifiedAgentAliases|TestContract_APITokenScopeAliasNormalization",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "unified-agent-update-handoff-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/agentupdate",
|
|
"-run",
|
|
"TestCheckAndUpdateToFirstHostReportCarriesPreviousVersionOnce|TestUpdateToFirstHostReportCarriesPreviousVersionOnce|TestPerformUpdatePersistsPreviousVersionForNextStart",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/unified-agent-v5-upgrade-continuity-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/agentupdate/coverage_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/agentupdate/update_hostagent_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_regression_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_tokens_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/unified_agent_more_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/unified_agent_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/unified_agent_upgrade_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/config/api_tokens_coverage_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/hostagent/agent_new_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA10",
|
|
"summary": "Active Pulse v6 guidance reflects the current governed behavior of the codebase, and legacy or historical documentation does not remain part of the active v6 guidance surface.",
|
|
"kind": "invariant",
|
|
"blocking_level": "release-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L9"
|
|
],
|
|
"subsystem_ids": [],
|
|
"release_gate_ids": [
|
|
"documentation-currentness-and-legacy-cleanup"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "documentation-currentness-tests",
|
|
"run": [
|
|
"python3",
|
|
"scripts/release_control/documentation_currentness_test.py"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/control_plane.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/internal/CONTROL_PLANE.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/CANONICAL_DEVELOPMENT_PROTOCOL.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-agent-security-2026-05-04.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/SOURCE_OF_TRUTH.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/README.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/documentation_currentness_test.py",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA11",
|
|
"summary": "Pulse Hosted works as a real offered v6 tier: customers can sign up or sign in to a hosted tenant, enter a working hosted runtime, and use hosted billing/admin surfaces without self-hosted fallback paths or broken post-provisioning behavior.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L4",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"release_gate_ids": [
|
|
"cloud-hosted-tier-runtime-readiness"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "cloud-hosted-tier-runtime-api",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestHostedLifecycle|TestHostedOrgAdminHandlers|TestHostedSignupSuccess|TestHostedSignupValidationFailures|TestHostedSignupHostedModeGate|TestHostedSignupRateLimit|TestHostedSignupRateLimit_NoProvisioningSideEffects|TestHostedSignupCleanupOnRBACFailure|TestHostedSignupFailsClosedWithoutPublicURL|TestStripeWebhook_",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "cloud-hosted-tier-runtime-frontend",
|
|
"run": [
|
|
"npx",
|
|
"vitest",
|
|
"run",
|
|
"src/pages/__tests__/HostedSignup.test.tsx",
|
|
"src/components/Settings/__tests__/BillingAdminPanel.test.tsx",
|
|
"src/components/Settings/__tests__/OrganizationBillingPanel.test.tsx"
|
|
],
|
|
"cwd": "frontend-modern"
|
|
},
|
|
{
|
|
"id": "cloud-hosted-tier-runtime-go",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/cloudcp/...",
|
|
"./internal/hosted/...",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-fixed-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-followup-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-recovered-2026-03-26.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-remediated-2026-04-24.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-runtime-build-contract-2026-04-24.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-storage-blocker-2026-04-23.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-storage-guardrails-production-2026-04-24.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/cloud-paid.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/BillingAdminPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/OrganizationBillingPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/hosted_lifecycle_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/hosted_org_admin_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/hosted_signup_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/stripe/cloud_lifecycle_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/hosted/provisioner_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA12",
|
|
"summary": "Multi-tenant Pulse is sound: tenant isolation, organization membership, RBAC scope, tenant-scoped runtime state, sharing, and migration all fail closed outside the intended tenant boundary instead of partially behaving like a single-tenant system.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L4",
|
|
"L6",
|
|
"L12",
|
|
"L13",
|
|
"L14",
|
|
"L17"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts",
|
|
"monitoring",
|
|
"organization-settings"
|
|
],
|
|
"release_gate_ids": [
|
|
"multi-tenant-runtime-isolation-and-coherence"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "multi-tenant-runtime-api",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestOrgHandlers|TestMultiTenant|TestResourceHandlers_NonDefaultOrg|TestSetMultiTenantMonitor_WiresHandlers|TestMultiTenantStateProvider|TestMultiTenantAPITokenRemainsScopedToIssuingOrg",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "multi-tenant-runtime-frontend",
|
|
"run": [
|
|
"npx",
|
|
"vitest",
|
|
"run",
|
|
"src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
|
|
"src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"src/utils/__tests__/rbacPermissions.test.ts",
|
|
"src/utils/__tests__/rbacPresentation.test.ts",
|
|
"src/utils/__tests__/organizationRolePresentation.test.ts",
|
|
"src/utils/__tests__/organizationSettingsPresentation.test.ts"
|
|
],
|
|
"cwd": "frontend-modern"
|
|
},
|
|
{
|
|
"id": "multi-tenant-runtime-migration",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./tests/migration",
|
|
"-run",
|
|
"TestV5DataDir_MultiTenantMigration",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "multi-tenant-runtime-monitoring",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/monitoring",
|
|
"-run",
|
|
"TestMultiTenantMonitor",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/multi-tenant-runtime-isolation-and-coherence-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/organization-settings.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/organizationRolePresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/organizationSettingsPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/rbacPermissions.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/rbacPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/api_token_org_scope_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/org_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/rbac_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/resources_tenant_security_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/router_helpers_more_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/multi_tenant_monitor_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/03-multi-tenant.spec.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_to_v6_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA13",
|
|
"summary": "MSP support works as a real v6 product mode: one provider account can onboard, view, and manage multiple client tenants from one control surface with canonical MSP plan handling and without cross-client leakage, scope confusion, or per-client operational drift.",
|
|
"kind": "journey",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L4",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"release_gate_ids": [
|
|
"msp-provider-tenant-management"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "msp-account-and-registry-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/cloudcp/account",
|
|
"./internal/cloudcp/registry",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "msp-frontend-tests",
|
|
"run": [
|
|
"npx",
|
|
"vitest",
|
|
"run",
|
|
"src/components/Settings/__tests__/OrganizationBillingPanel.test.tsx",
|
|
"src/pages/__tests__/CloudPricing.test.tsx"
|
|
],
|
|
"cwd": "frontend-modern"
|
|
},
|
|
{
|
|
"id": "msp-lifecycle-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/cloudcp/stripe",
|
|
"-run",
|
|
"TestMSPLifecycle_AccountToPortal",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "msp-plan-guardrails",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/cloudcp",
|
|
"./pkg/licensing",
|
|
"-run",
|
|
"TestPublicCloudSignupCheckoutMetadataRejectsMSPPlanForPublicSignup|TestMSPPlanAliasCanonicalizationContract",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-production-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-production-fixed-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-production-followup-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/cloud-paid.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/OrganizationBillingPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/account/handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/public_cloud_signup_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/registry/registry_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/stripe/msp_lifecycle_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "pkg/licensing/grant_claims_contract_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA14",
|
|
"summary": "API tokens remain least-privilege and correctly scoped: every token stays bound to its intended user, org, and scope, cannot silently widen authority through legacy alias handling, and stops working when revoked.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L1",
|
|
"L6",
|
|
"L11",
|
|
"L14",
|
|
"L16"
|
|
],
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"api-contracts",
|
|
"security-privacy"
|
|
],
|
|
"release_gate_ids": [
|
|
"api-token-scope-and-assignment"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "api-token-scope-backend",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"Test(APIToken|SecurityTokens|SystemSettings|MultiTenant)|TestNormalizeRequestedScopesCanonicalizesLegacyUnifiedAgentAliases|TestUnifiedAgentEndpointsRequireAgentReportScope|TestUnifiedAgentEndpointsAcceptLegacyUnifiedAgentReportScopeAlias|TestMultiTenantAPITokenRemainsScopedToIssuingOrg|TestContract_APITokenScopeAliasNormalization",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "api-token-scope-frontend",
|
|
"run": [
|
|
"npx",
|
|
"vitest",
|
|
"run",
|
|
"src/components/Settings/__tests__/APITokenManager.test.tsx",
|
|
"src/utils/__tests__/apiClient.org.test.ts",
|
|
"src/utils/__tests__/apiTokenPresentation.test.ts"
|
|
],
|
|
"cwd": "frontend-modern"
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/api-token-scope-and-assignment-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/security-privacy.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/__tests__/security.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/APITokenManager.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/apiClient.org.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/apiTokenPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/api_token_org_scope_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_regression_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_status_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_tokens_owner_binding_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_tokens_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/system_settings_telemetry_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA15",
|
|
"summary": "Assigned user privileges fail closed: a user cannot view, mutate, or destroy anything beyond the permissions granted by their effective organization membership and role, including cross-org and destructive paths.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L4",
|
|
"L6",
|
|
"L12",
|
|
"L14",
|
|
"L17"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts",
|
|
"organization-settings"
|
|
],
|
|
"release_gate_ids": [
|
|
"organization-user-scope-and-rbac"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "user-privilege-backend",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestOrgHandlersViewerCannotManageOrg|TestOrgHandlersTokenListAllowedButWriteForbidden|TestOrgHandlersCrossOrgIsolation|TestOrgHandlersShareIsolationAcrossOrganizations|TestMultiTenantRBACRoleUpdateChangesPermissions",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "user-privilege-frontend",
|
|
"run": [
|
|
"npx",
|
|
"vitest",
|
|
"run",
|
|
"src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
|
|
"src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"src/utils/__tests__/organizationRolePresentation.test.ts",
|
|
"src/utils/__tests__/organizationSettingsPresentation.test.ts",
|
|
"src/utils/__tests__/rbacPermissions.test.ts",
|
|
"src/utils/__tests__/rbacPresentation.test.ts"
|
|
],
|
|
"cwd": "frontend-modern"
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/organization-user-scope-and-rbac-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/organizationRolePresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/organizationSettingsPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/rbacPermissions.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/rbacPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/org_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/rbac_handlers_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA16",
|
|
"summary": "Commercial continuity fails closed across cancellation and re-entry: active grandfathered v5 recurring customers keep their legacy recurring price plus uncapped self-hosted monitoring and child-resource volume only while the subscription remains continuous, cancellation revokes paid access cleanly, and any later re-entry uses current public v6 pricing rather than reviving grandfathered terms.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L11",
|
|
"L12"
|
|
],
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"release_gate_ids": [
|
|
"commercial-cancellation-reactivation"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "commercial-cancellation-reactivation-proof",
|
|
"run": [
|
|
"python3",
|
|
"scripts/release_control/internal/commercial_cancellation_reactivation_proof.py"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/COMMERCIAL_CANCELLATION_REACTIVATION_E2E_TEST_PLAN.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/commercial-cancellation-reactivation-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/commercial-cancellation-reactivation-external-e2e-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/ProLicensePanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "pkg/licensing/billing_state_normalization_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/internal/commercial_cancellation_reactivation_proof.py",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA17",
|
|
"summary": "Pulse Mobile access stays coherent against a real Pulse instance: pairing, secure persistence, relay reconnect, approval flows, and auth or revocation transitions recover cleanly and fail closed instead of leaving stale mobile access behind.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L5",
|
|
"L6",
|
|
"L7",
|
|
"L12"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts",
|
|
"relay-runtime"
|
|
],
|
|
"release_gate_ids": [
|
|
"mobile-relay-auth-approvals"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "mobile-relay-auth-approvals-proof",
|
|
"run": [
|
|
"python3",
|
|
"scripts/release_control/internal/mobile_relay_auth_approvals_proof.py"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/mobile-relay-auth-approvals-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/internal/mobile_relay_auth_approvals_proof.py",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-enterprise",
|
|
"path": "internal/aiautofix/handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "src/__tests__/mobileRelayAuthApprovals.rehearsal.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "src/hooks/__tests__/useRelayLifecycle.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "src/stores/__tests__/approvalStore.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "src/stores/__tests__/authStore.test.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA18",
|
|
"summary": "Relay runtime remains resilient under registration and reconnect pressure: fresh registration, reconnect, stale-session recovery, and disconnect drain all recover predictably without stranding clients in resume loops, dead sessions, or lost inflight work.",
|
|
"kind": "invariant",
|
|
"blocking_level": "rc-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L5",
|
|
"L6",
|
|
"L7",
|
|
"L12"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts",
|
|
"relay-runtime"
|
|
],
|
|
"release_gate_ids": [
|
|
"relay-registration-reconnect-drain"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "relay-registration-reconnect-drain-proof",
|
|
"run": [
|
|
"python3",
|
|
"scripts/release_control/internal/relay_registration_reconnect_drain_proof.py"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/relay-registration-reconnect-drain-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/RelaySettingsPanel.runtime.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/relay/client_managed_runtime_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/internal/relay_registration_reconnect_drain_proof.py",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "src/relay/__tests__/client-hardening.test.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA19",
|
|
"summary": "Comparable Pulse settings surfaces use the canonical settings page-shell contract: shared SettingsPanel framing, consistent header structure, and no ad hoc top-level layout chrome unless explicitly approved.",
|
|
"kind": "invariant",
|
|
"blocking_level": "release-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L8"
|
|
],
|
|
"subsystem_ids": [
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [
|
|
"settings-surface-layout-consistency"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "settings-architecture-guardrails",
|
|
"cwd": "frontend-modern",
|
|
"run": [
|
|
"npx",
|
|
"vitest",
|
|
"run",
|
|
"src/components/Settings/__tests__/settingsArchitecture.test.ts"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/settings-surface-layout-consistency-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/SOURCE_OF_TRUTH.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/frontend-primitives.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/15-settings-shell-consistency.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA20",
|
|
"summary": "Pulse's TrueNAS support claim is bounded to the current API-first floor: onboarding is through platform connections without requiring unified-agent bootstrap, TrueNAS projects into the canonical resource model and shared infrastructure/workload/storage/recovery/alert surfaces, Assistant support is read-first with bounded app control, and broader TrueNAS administration is not part of the current floor.",
|
|
"kind": "invariant",
|
|
"blocking_level": "release-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6",
|
|
"L9",
|
|
"L13",
|
|
"L15"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"storage-recovery",
|
|
"unified-resources"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "truenas-api-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestTrueNASHandlers_",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "truenas-runtime-floor-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/monitoring",
|
|
"./internal/recovery/mapper/truenas",
|
|
"./internal/truenas",
|
|
"-run",
|
|
"TestFeatureFlagDefaultsTrueNASOnUnlessExplicitlyDisabled|TestGetAppLogsUsesRPCSubscription|TestProviderGetAppConfigReturnsCanonicalApp|TestRegistryIngestRecordsTreatsTrueNASAsGenericDataSource|TestStartAndStopAppUseRPCMethods|TestTrueNASDiskRecordsPopulatePhysicalDiskMeta|TestTrueNASPollerGetAppConfigUsesTenantScopedProvider|TestTrueNASResourcesFlowThroughUnifiedTypesWithoutSpecialCasing",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/SOURCE_OF_TRUTH.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/alerts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/monitoring.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/storage-recovery.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/unified-resources.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Storage/__tests__/DiskList.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Storage/__tests__/Storage.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/hooks/__tests__/useUnifiedResources.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/hooks/__tests__/useWorkloads.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/truenas_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/truenas_poller_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/recovery/mapper/truenas/mapper_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/truenas/client_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/truenas/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/truenas/provider_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/evals/tasks/truenas-node-add.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/21-truenas-settings-platform-connections.spec.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/28-truenas-alert-resource-links.spec.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/32-truenas-workloads-resource-deeplink.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA21",
|
|
"summary": "Legacy Pulse-hosted AI aliases are retired for v6 GA: settings and runtime payloads must clear `quickstart:*` model strings, fail closed on the retired provider, and route operators to BYOK or local-provider setup instead of a managed-model promise.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "quickstart-model-alias-browser-proof",
|
|
"cwd": "tests/integration",
|
|
"run": [
|
|
"/usr/bin/env",
|
|
"PULSE_E2E_SKIP_DOCKER=1",
|
|
"PULSE_E2E_USE_LOCAL_BACKEND=1",
|
|
"npm",
|
|
"test",
|
|
"--",
|
|
"tests/51-quickstart-cross-surface.spec.ts",
|
|
"--project=chromium"
|
|
]
|
|
},
|
|
{
|
|
"id": "quickstart-model-alias-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/config",
|
|
"./internal/ai",
|
|
"./internal/api",
|
|
"-run",
|
|
"Quickstart|DefaultModelForProvider|HostedAISettings|HostedTenantAISettings|HandleGetPatrolStatus|AISettingsHandler_",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "quickstart-model-alias-frontend-tests",
|
|
"cwd": "frontend-modern",
|
|
"run": [
|
|
"npm",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/components/Settings/__tests__/AISettings.test.tsx"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/AISettings.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/config/ai.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/51-quickstart-cross-surface.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA22",
|
|
"summary": "Pulse does not hardcode vendor BYOK model IDs into setup or runtime defaults: AI settings may submit credentials without a concrete model, and the backend must resolve and persist the effective provider model from the live provider catalog.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L6"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "byok-model-resolution-browser-proof",
|
|
"cwd": "tests/integration",
|
|
"run": [
|
|
"/usr/bin/env",
|
|
"PULSE_E2E_USE_LOCAL_BACKEND=1",
|
|
"npm",
|
|
"test",
|
|
"--",
|
|
"tests/52-ai-settings-provider-setup.spec.ts",
|
|
"--project=chromium"
|
|
]
|
|
},
|
|
{
|
|
"id": "byok-model-resolution-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/config",
|
|
"./internal/ai",
|
|
"./internal/api",
|
|
"-run",
|
|
"DefaultModelForProvider|AIConfig_GetModel|AIConfig_GetPreferredModelForProvider|SelectRecommendedProviderModel|Service_TestConnection_Extended|UpdateSettings_ResolvesProviderModelWhenOmitted|TestConnection_Ollama|TestProvider_Ollama|RouteTestConnection|AITestConnectionRouteWithValidScope|RouteTestProvider|AITestProviderRouteWithValidScope",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "byok-model-resolution-frontend-tests",
|
|
"cwd": "frontend-modern",
|
|
"run": [
|
|
"npm",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/components/Settings/__tests__/AISettings.test.tsx"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/AISettings.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/useAISettingsState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/model_resolution.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/model_resolution_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handlers.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/config/ai.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/52-ai-settings-provider-setup.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA23",
|
|
"summary": "Patrol agentic execution keeps one stable execution identifier across retries, agentic turns, and evaluation so runtime traces and follow-up work describe a single Patrol run without depending on retired hosted quickstart billing.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "patrol-execution-identity-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/chat",
|
|
"./internal/ai",
|
|
"-run",
|
|
"ExecutePatrolStream|RunEvaluationPass|RetriesWithProviderDerivedSeedBudget",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/service.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/service_patrol_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_ai.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_ai_more_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA24",
|
|
"summary": "Docker release builds must keep the embedded frontend's shipped-doc inputs available inside the container build context: `Dockerfile` and `.dockerignore` jointly own staging `docs/**`, `SECURITY.md`, and `TERMS.md` so hosted runtime image builds do not depend on workstation-local files or silently drop public docs from the frontend embed sync.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L1"
|
|
],
|
|
"subsystem_ids": [
|
|
"deployment-installability"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "docker-release-build-shipped-doc-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./scripts/installtests",
|
|
"-run",
|
|
"TestDocker(AndDemoBuildsUseCanonicalReleaseLdflags|fileStagesShippedDocsForEmbeddedFrontendBuild)",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": ".dockerignore",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "Dockerfile",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/deployment-installability.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/installtests/build_release_assets_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA25",
|
|
"summary": "Hosted and self-hosted v6 AI bootstrap must stay BYOK/local-provider only: commercial billing state may authorize hosted tenancy, but it must not create quickstart credits, mint hosted-model tokens, or persist a managed-model AI config.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L6"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"cloud-paid"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "hosted-ai-bootstrap-retirement-runtime-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"./pkg/licensing",
|
|
"-run",
|
|
"Quickstart|HostedAISettings|HostedTenantAISettings|HostedEntitlement|TrialStart|BillingState",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/cloud-paid.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/config/entitlement_billing_state.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "pkg/licensing/license_server_client.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA26",
|
|
"summary": "Infrastructure Settings and Infrastructure realtime identity are release-critical configuration surfaces: they must keep adding, discovering, installing agents, verifying API plus Pulse Agent coverage, cold-start ledger hydration, source grouping, source/member status separation, non-replayed setup success notifications, and websocket plus REST resource identity stable before release-ready claims.",
|
|
"kind": "journey",
|
|
"blocking_level": "release-ready",
|
|
"proof_type": "hybrid",
|
|
"lane_ids": [
|
|
"L6",
|
|
"L8",
|
|
"L16"
|
|
],
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"api-contracts",
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [
|
|
"settings-surface-layout-consistency"
|
|
],
|
|
"proof_commands": [
|
|
{
|
|
"id": "infrastructure-realtime-broadcast-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/monitoring",
|
|
"-run",
|
|
"TestBroadcastResourceProjectionCoalescesSplitHostIdentities|TestConvertResourcesForBroadcastCoalescesSplitHostResources"
|
|
]
|
|
},
|
|
{
|
|
"id": "infrastructure-settings-workspace-tests",
|
|
"run": [
|
|
"npm",
|
|
"--prefix",
|
|
"frontend-modern",
|
|
"test",
|
|
"--",
|
|
"src/utils/__tests__/resourceStateAdapters.test.ts",
|
|
"src/stores/__tests__/websocket-unified.test.ts",
|
|
"src/stores/__tests__/websocket-resilience.test.ts",
|
|
"src/components/Settings/__tests__/connectionsTableModel.test.ts",
|
|
"src/components/Settings/__tests__/InfrastructureSourceManager.test.tsx",
|
|
"src/components/Settings/__tests__/InfrastructureWorkspace.test.tsx",
|
|
"src/components/Settings/__tests__/useConnectionsLedger.test.ts",
|
|
"src/components/Settings/__tests__/settingsArchitecture.test.ts",
|
|
"src/utils/__tests__/discoveryPresentation.test.ts"
|
|
]
|
|
},
|
|
{
|
|
"id": "infrastructure-state-resource-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestContract_StateAndResourceListShareCanonicalMockResourceContract|TestBuildAutoRegisterEventDataUsesCanonicalAutoRegisterTokenIdentity|TestContract_AutoRegisterWebSocketEventJSONSnapshot|TestContract_CanonicalAutoRegisterEventJSONSnapshot|TestAutoRegisterWebSocketEventTypeDistinguishesCreatedFromExistingRefresh"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/connectionsTableModel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/InfrastructureSourceManager.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/InfrastructureWorkspace.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/useConnectionsLedger.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/connectionsTableModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/DiscoverySettingsForm.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/InfrastructureInstallerSection.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/SettingsPageShell.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/useConnectionsLedger.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/stores/__tests__/websocket-resilience.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/stores/__tests__/websocket-unified.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/resourceStateAdapters.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/resourceStateAdapters.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/config_handlers_canonical_auto_register_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/config_setup_handlers.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/canonical_guardrails_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor_unified_state_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA27",
|
|
"summary": "Patrol readiness owns server-authored runtime and configuration safety: provider, model, settings-persistence, and tool-calling prerequisites must travel as structured `/api/ai/patrol/status`, settings-save, and Patrol action errors. Settings saves must persist recoverable provider/model changes while returning structured readiness, and known not-ready states must block manual, scheduled, and scoped Patrol runs before they become generic interrupted-analysis failures.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"patrol-intelligence"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "patrol-readiness-browser-contract-tests",
|
|
"run": [
|
|
"/usr/bin/env",
|
|
"PULSE_E2E_USE_HOT_DEV=1",
|
|
"PULSE_E2E_SKIP_PLAYWRIGHT_INSTALL=1",
|
|
"npm",
|
|
"--prefix",
|
|
"tests/integration",
|
|
"test",
|
|
"--",
|
|
"tests/18-patrol-runtime-state.spec.ts",
|
|
"--project=chromium"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-readiness-frontend-tests",
|
|
"run": [
|
|
"npm",
|
|
"--prefix",
|
|
"frontend-modern",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/api/__tests__/patrol.test.ts",
|
|
"src/pages/__tests__/AIIntelligence.test.tsx"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-readiness-runtime-gate-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai",
|
|
"-run",
|
|
"RunPatrol_BlocksNotReadyRuntimeBeforeLLM|RunScopedPatrol_BlocksNotReadyRuntimeBeforeLLM",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-readiness-settings-save-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"UpdateSettingsPersistsNotReadyPatrolModelWithReadiness|UpdateSettingsDoesNotLockUnrelatedSavesBehindExistingPatrolReadiness|HandleForcePatrol_BlocksNotReadyPatrolModel",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-readiness-status-contract-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"PatrolReadiness|PatrolStatus|Contract_PatrolStatusResponseJSONSnapshot",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/patrol-intelligence.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/__tests__/patrol.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/patrol.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/__tests__/patrolInvestigationContextModel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/PatrolIntelligenceBanners.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/PatrolIntelligenceHeader.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/patrolInvestigationContextModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/usePatrolIntelligenceState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/pages/__tests__/AIIntelligence.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_coverage_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_init.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_readiness.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_readiness_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_run.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_runtime_failure.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_runtime_failure_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/service.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handlers.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handlers_patrol_actions_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_patrol_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/18-patrol-runtime-state.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA28",
|
|
"summary": "Pulse Patrol remains a simple scheduled LLM probe and governance surface: Pulse supplies observed infrastructure context, evidence, policy posture, approval state, and governed execution boundaries, while the configured LLM owns diagnosis, alert-resolution judgment, remediation reasoning, tool choice, and next-step reasoning. Patrol UI, Assistant session summaries, and Assistant handoffs must not present or persist Patrol-authored remediation plans, internal step lists, command summaries, next-step recommendations, route-owned recommendation metadata, or suggested prompt chips as the answer.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6",
|
|
"L8",
|
|
"L20",
|
|
"L23"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"frontend-primitives",
|
|
"patrol-intelligence"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "patrol-assistant-compact-briefing-tests",
|
|
"run": [
|
|
"npm",
|
|
"--prefix",
|
|
"frontend-modern",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/components/AI/Chat/__tests__/AIChat.test.tsx",
|
|
"src/components/AI/Chat/__tests__/ChatMessages.test.tsx",
|
|
"src/features/patrol/__tests__/patrolInvestigationContextModel.test.ts",
|
|
"src/components/patrol/__tests__/ApprovalSection.test.tsx",
|
|
"src/components/AI/__tests__/FindingsPanel.test.ts",
|
|
"src/features/patrol/__tests__/PatrolIntelligenceSummary.test.tsx",
|
|
"src/pages/__tests__/AIIntelligence.test.tsx",
|
|
"src/utils/__tests__/patrolPagePresentation.test.ts",
|
|
"src/utils/__tests__/patrolSummaryPresentation.test.ts",
|
|
"src/utils/__tests__/aiChatPresentation.test.ts",
|
|
"src/api/__tests__/aiChat.test.ts",
|
|
"src/stores/__tests__/aiChat.test.ts"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-assistant-session-summary-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/chat",
|
|
"-run",
|
|
"TestSessionStore_List|TestService_ExecuteStream_AttachesModelOnlyHandoffContext"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-model-owned-probe-runtime-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai",
|
|
"-run",
|
|
"TestRunAIAnalysis_TriageQuietStillCallsLLM|TestRunEvaluationPass",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-model-owned-remediation-runtime-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai",
|
|
"-run",
|
|
"TestPatrolService_RecordFindingDoesNotGenerateTemplateRemediationPlan|TestShouldResolveAlert|TestReviewAndResolveAlerts"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-unified-finding-no-auto-remediation-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/unified",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/frontend-primitives.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/patrol-intelligence.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/__tests__/FindingsPanel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/__tests__/AIChat.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/__tests__/ChatMessages.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/index.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/FindingsPanel.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/patrol/__tests__/ApprovalSection.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/__tests__/PatrolIntelligenceSummary.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/__tests__/patrolInvestigationContextModel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/patrolInvestigationContextModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/pages/__tests__/AIIntelligence.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/patrolPagePresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/aiChatPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/patrolPagePresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/session.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/types.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_ai.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_findings.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_run.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_triage_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/unified/integration.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/unified/integration_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA29",
|
|
"summary": "Pulse intelligence comes from the operator-selected large language model using governed Pulse tools over data the model cannot reach on its own: agent-collected machine evidence, canonical APIs, metrics, discovery records, and resource state. Interactive Pulse Assistant chat therefore behaves like a governed LLM tool surface, not a Pulse-authored intent router: the operator's selected model receives the user turn and governed tools, decides whether tools are needed, and Pulse must not use prompt heuristics to force tool_choice, force a named tool, retry because an expected tool was not used, hide tools from the model by keyword detection, rewrite recent-context turns into Pulse-targeted instructions, fuzzy-match plain chat text into resource context before the model acts, synthesize/prefill/auto-submit product-authored Assistant prompts from handoffs, keyword-match prior remediation history into suggested fixes, or generate Patrol handoff attention/decision/remediation guidance before the model reasons. Pulse only provides current context and enforces approvals, resource resolution, FSM gates, and tool policy after that model choice; any model-visible policy block must describe the boundary without naming a required next tool. The chat surface must echo user messages before network/session creation finishes and must not render Pulse-owned explore or internal workflow status cards as assistant output.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "assistant-backend-handoff-policy-boundary-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai",
|
|
"./internal/ai/chat",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestBuildPatrolRunAssistantHandoffUsesBackendSafeRunContext|TestFSM|TestService_ExecuteStream_InteractiveChatLetsModelChooseTools|TestHandleChat_|TestContract_AIHandler",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-chat-model-owned-routing-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/chat",
|
|
"-run",
|
|
"TestService_ExecuteStream_InteractiveChatLetsModelChooseTools|TestFilterToolsForPrompt_ReadOnlyAndSpecialty|TestAgenticLoop",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-chat-optimistic-echo-tests",
|
|
"run": [
|
|
"npm",
|
|
"--prefix",
|
|
"frontend-modern",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/components/AI/Chat/__tests__/useChat.test.ts",
|
|
"src/components/AI/Chat/__tests__/MessageItem.test.tsx"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-chat-stream-contract-tests",
|
|
"run": [
|
|
"npm",
|
|
"--prefix",
|
|
"frontend-modern",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/api/__tests__/aiChatEvents.test.ts"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-context-prefetch-structured-mentions-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/chat",
|
|
"-run",
|
|
"TestContextPrefetcher",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-neutral-session-context-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/chat",
|
|
"-run",
|
|
"TestInjectRecentSessionContext",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-no-automatic-tool-retry-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/chat",
|
|
"-run",
|
|
"TestAgenticLoop_DoesNotAutoRecoverStructuredToolCall|TestEnsureFinalTextResponse|TestCommandExtraction",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-patrol-handoff-neutral-context-tests",
|
|
"run": [
|
|
"npm",
|
|
"--prefix",
|
|
"frontend-modern",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/features/patrol/__tests__/patrolInvestigationContextModel.test.ts",
|
|
"src/components/AI/Chat/__tests__/AIChat.test.tsx"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-remediation-memory-context-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai",
|
|
"./internal/ai/memory",
|
|
"-run",
|
|
"TestService_Remediation|TestService_BuildRemediationContext_Empty|TestService_BuildSystemPrompt_FindingContextDoesNotForceLifecycleTool|TestRemediationLog_(LogAndRetrieve|Stats|RecentStatsBranches|FormatAndStats)",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "assistant-tool-policy-facts-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/ai/tools",
|
|
"-run",
|
|
"TestExecuteReadLogs|TestRoutingMismatch|TestWriteExecutionContext|TestExecutionIntent|TestReadExec|TestStrictResolution",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/agent-lifecycle.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/frontend-primitives.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/patrol-intelligence.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/registry.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/storage-recovery.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/__tests__/aiChatEvents.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/generated/aiChatEvents.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/__tests__/FindingsPanel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/__tests__/AIChat.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/__tests__/ChatMessages.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/__tests__/MessageItem.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/__tests__/useChat.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/ChatMessages.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/hooks/useChat.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/index.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/MessageItem.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/types.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/FindingsPanel.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Alerts/alertAssistantHandoffModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Alerts/incidentAssistantHandoffModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/__tests__/patrolInvestigationContextModel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/patrolInvestigationContextModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/stores/__tests__/aiChat.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/stores/aiChat.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/aiChatPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/aiChatPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/agentic.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/agentic_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/agentic_final.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/agentic_prompt.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/context_prefetch.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/context_prefetch_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/fsm.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/fsm_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/read_routing_hints.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/service.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/service_execute_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/service_recent_context_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/service_tooling_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/chat/types.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/memory/memory_coverage_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/memory/memory_extended_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/memory/memory_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/memory/remediation.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/memory/remediation_memory_regression_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_assistant_handoff.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_assistant_handoff_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/service.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/service_remediation_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/tools/tools_file.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/tools/tools_query.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/tools/tools_read.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/tools/tools_read_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/unified/alerts.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handler.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handler_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/generate-types.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA30",
|
|
"summary": "Inside-guest runtime visibility is explicit and privacy-bounded: Pulse may show Docker/Podman workloads from a VM or LXC when a guest-local agent or another explicit guest reporting path reports them. Pulse may additionally show Docker workloads from LXC guests through a Proxmox host agent only when explicit LXC Docker inventory opt-in is enabled; that path must stay read-only, VMID-allowlistable, and limited to Docker host/container summary plus aggregate stats without docker inspect, environment values, mounts, files, commands, or process details. A local Unified Agent Docker/Podman disable must remain a hard opt-out that remote profiles and auto-detection cannot reverse.",
|
|
"kind": "trust-gate",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L14",
|
|
"L16"
|
|
],
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"security-privacy"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "agent-docker-privacy-opt-out-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./cmd/pulse-agent",
|
|
"-run",
|
|
"TestApplyRemoteSettingsHonorsLocalDockerOptOut|TestDockerAutoDetectHonorsExplicitDisable|TestLoadConfig_Comprehensive",
|
|
"-count=1"
|
|
]
|
|
},
|
|
{
|
|
"id": "proxmox-guest-docker-collection-opt-in-tests",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/monitoring",
|
|
"./internal/api",
|
|
"./internal/config",
|
|
"-run",
|
|
"TestProxmoxGuestDockerInventoryUsesCanonicalReportIngestPath|TestAgentDockerInventoryCollector|TestMonitorCollectProxmoxGuestDockerInventory|TestParseProxmoxGuestDockerInventoryVMIDs|TestContract_ProxmoxGuestDockerDetectionRequiresExplicitOptIn|TestLoad_EnvOverrides_ProxmoxGuestDockerDetectionOptIn|TestLoad_ProxmoxGuestDockerDetectionEnvOptIn",
|
|
"-count=1"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "cmd/pulse-agent/main.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "cmd/pulse-agent/main_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/AGENT_SECURITY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/CENTRALIZED_MANAGEMENT.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/CONFIGURATION.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/agent-lifecycle.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/monitoring.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/performance-and-scalability.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/security-privacy.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/storage-recovery.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/UNIFIED_AGENT.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/router.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/config/config.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/config/config_env_overrides_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/config/config_load_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/canonical_guardrails_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/docker_detection.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/docker_detection_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor_pve_guest_poll.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA31",
|
|
"summary": "Platform overview inventory stays table-first: native provider facts belong in dense provider tables and governed platform tabs, not standalone summary-card strips or decorative card grids.",
|
|
"kind": "invariant",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L8",
|
|
"L21"
|
|
],
|
|
"subsystem_ids": [
|
|
"frontend-primitives"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "platform-overview-table-first-guardrails",
|
|
"run": [
|
|
"npm",
|
|
"--prefix",
|
|
"frontend-modern",
|
|
"test",
|
|
"--",
|
|
"--run",
|
|
"src/features/platformPage/__tests__/platformOverviewLayout.guardrails.test.ts"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/status.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/platformPage/__tests__/platformOverviewLayout.guardrails.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/truenas/TrueNASPageSurface.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/truenas/TrueNASSystemsTable.tsx",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "RA32",
|
|
"summary": "Pulse v6 must be agent-operable for infrastructure onboarding at the canonical API contract layer, not only through UI automation or an MCP-only shim: agents can discover LAN candidates, list configured sources, validate proposed credentials, add/update/remove/test/refresh Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway sources through typed manifest schemas, and source reads must keep credential secrets redacted.",
|
|
"kind": "trust-gate",
|
|
"blocking_level": "repo-ready",
|
|
"proof_type": "automated",
|
|
"lane_ids": [
|
|
"L6",
|
|
"L16",
|
|
"L20"
|
|
],
|
|
"subsystem_ids": [
|
|
"api-contracts"
|
|
],
|
|
"release_gate_ids": [],
|
|
"proof_commands": [
|
|
{
|
|
"id": "agent-provisioning-capability-contract",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./internal/api",
|
|
"-run",
|
|
"TestHandleAgentCapabilitiesManifest|TestAgentCapabilitiesManifest|TestAgentSubstrate_NodeProvisioningCapabilitiesRouteThroughHTTPBoundary"
|
|
]
|
|
},
|
|
{
|
|
"id": "mcp-manifest-schema-projection",
|
|
"run": [
|
|
"go",
|
|
"test",
|
|
"./cmd/pulse-mcp"
|
|
]
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "cmd/pulse-mcp/main.go",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "cmd/pulse-mcp/main_test.go",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "cmd/pulse-mcp/README.md",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/agent_capabilities.go",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/agent_capabilities_test.go",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/agent_substrate_e2e_test.go",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"evidence_reference_policy": {
|
|
"format": "repo-qualified-relative-paths",
|
|
"allowed_kinds": [
|
|
"file",
|
|
"dir"
|
|
],
|
|
"absolute_paths_forbidden": true,
|
|
"local_repo": "pulse"
|
|
},
|
|
"priority_engine": {
|
|
"formula": "behind_score = (max(0,target-current)*4) + criticality + staleness + dependency + blocker_bonus",
|
|
"floor_rule": {
|
|
"release_critical_lanes": [
|
|
"L1",
|
|
"L2",
|
|
"L3",
|
|
"L7",
|
|
"L8",
|
|
"L9",
|
|
"L10",
|
|
"L11",
|
|
"L12"
|
|
],
|
|
"minimum_score": 6
|
|
},
|
|
"weights": {
|
|
"gap_multiplier": 4,
|
|
"criticality_range": "0-5",
|
|
"staleness_range": "0-3",
|
|
"dependency_range": "0-3",
|
|
"blocker_bonus": 8
|
|
}
|
|
},
|
|
"lanes": [
|
|
{
|
|
"id": "L1",
|
|
"name": "Self-hosted release confidence",
|
|
"target_score": 9,
|
|
"current_score": 9,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Self-hosted RC confidence is at the current floor; the remaining residual is the lane-local self-hosted promotion package follow-up.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "self-hosted-ga-promotion-package"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"deployment-installability"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-proxmox-runtime-token-permission-proof-2026-05-05.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-installer-bundle-fallback-2026-05-01.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/self-hosted-installer-disk-preflight-2026-05-01.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/deployment-installability.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "install.sh",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/installtests/root_install_sh_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L2",
|
|
"name": "Conversion/commercial readiness",
|
|
"target_score": 9,
|
|
"current_score": 9,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Commercial readiness is coherent for explicit preview, checkout handoff, paid-user activation/recovery, and hosted-mode paths, while default self-hosted app surfaces stay free-first and non-promotional; the production public flip and release-day rollout execution remain a separate promotion-time follow-up.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "commercial-ga-promotion-package"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/COMMERCIAL_CANCELLATION_REACTIVATION_E2E_TEST_PLAN.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-msp-price-audit-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/paid-feature-claim-proof-matrix-2026-04-29.md",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/self-hosted-commercial-ga-coherence-2026-04-20.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/self-hosted-paid-services-opt-in-surface-2026-04-25.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/cloud-paid.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/paid_feature_claims_proof.py",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse-pro",
|
|
"path": "V6_LAUNCH_CHECKLIST.md",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L3",
|
|
"name": "Cloud paid readiness",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Cloud-paid runtime and billing surfaces are at the current tracked RC floor, including real cancellation/reactivation continuity across checkout, entitlement boundaries, and the shared commercial billing shell/model now used by both self-hosted Pulse Pro and hosted organization billing.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"cloud-paid"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/cloud-paid.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/BillingAdminPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/BillingAdminPanel.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/CommercialBillingSections.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/commercialBillingModel.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L4",
|
|
"name": "Hosted MSP readiness",
|
|
"target_score": 6,
|
|
"current_score": 6,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Hosted MSP support is at the current tracked RC floor, including real tenant-management behavior and the exercised MSP provisioning and replay proof.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-2026-03-13.md",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L5",
|
|
"name": "Mobile go-live readiness",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Mobile go-live readiness is at the current GA floor: the build 4 candidate has current simulator/emulator evidence plus physical Android and iOS proof for the native companion role, hosted pairing, reconnect, push routing, approval actions, instance switching, and revoked-access fail-closed behavior. The remaining bounded residual is explicit store-publication execution and post-GA mobile hardening, not a release-readiness blocker.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "mobile-post-rc-hardening"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/PRE_RELEASE_CHECKLIST.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/mobile-product-purpose-ga-blocker-2026-04-24.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "store/listing.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "store/release-readiness.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-pro",
|
|
"path": "V6_LAUNCH_CHECKLIST.md",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L6",
|
|
"name": "Architecture coherence",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Architecture coherence now carries the canonical Connected infrastructure projection and frontend state contract by construction; the remaining residual is limited to later cross-surface cleanup outside those normalized contracts.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "architecture-post-rc-canonicalization"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"notifications",
|
|
"patrol-intelligence"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/notifications.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/responseUtils.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/streaming.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/alerts/OverviewTab.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/alertIncidentPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/alertOverviewPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/connectionErrorPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/connections_grouping.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/connections_grouping_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/resources.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-enterprise",
|
|
"path": "docs/V6_REPO_REALIGNMENT.md",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L7",
|
|
"name": "Relay infrastructure readiness",
|
|
"target_score": 9,
|
|
"current_score": 9,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Relay infrastructure now carries an explicit backend-owned mobile capability boundary: the dedicated Pulse Mobile relay credential is limited to the governed runtime route inventory instead of depending on scattered compatibility gates.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"relay-runtime"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/RELAY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/relay_mobile_capability.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/relay",
|
|
"kind": "dir"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "src/relay",
|
|
"kind": "dir"
|
|
},
|
|
{
|
|
"repo": "pulse-pro",
|
|
"path": "relay-server",
|
|
"kind": "dir"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L8",
|
|
"name": "First-session & UX polish",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "First-session UX reached the RC floor with the runtime wizard reduced to welcome and security, direct handoff into Infrastructure Operations install, and setup completion retained only as a separate preview surface; broader polish and parity work remain intentionally outside the current prerelease target.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "first-session-post-rc-polish"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"frontend-primitives"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/AppLayout.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/Settings.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/SetupWizard/SetupCompletionPanel.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/SetupWizard/SetupWizard.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/pages/Proxmox.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/pages/RuntimeHome.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/11-first-session.spec.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/19-telemetry-disclosure.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L9",
|
|
"name": "Documentation readiness",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Documentation is current enough for the RC floor, and the remaining residual is the lane-local GA-facing promotion and release communication follow-up.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "documentation-ga-promotion-package"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs",
|
|
"kind": "dir"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/releases/RELEASE_NOTES_v6.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "README.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-pro",
|
|
"path": "landing-page",
|
|
"kind": "dir"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L10",
|
|
"name": "Performance & scalability",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Performance is at the current release floor, but additional scalability headroom and non-blocking performance polish remain post-RC follow-up.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "performance-post-rc-headroom"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"performance-and-scalability"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/__tests__/UnifiedResourceTable.performance.contract.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/infrastructureSelectors.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/resourceDetailMappers.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/UnifiedResourceTable.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Workloads/__tests__/workloadInventorySourceIssues.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Workloads/__tests__/WorkloadsSurface.performance.contract.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Workloads/useWorkloadsState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Workloads/workloadInventorySourceIssues.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Workloads/workloadSelectors.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Workloads/WorkloadsSurface.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/hooks/__tests__/useWorkloads.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/hooks/useWorkloads.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/http_metrics.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "pkg/metrics/store.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/02-navigation-perf.spec.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/74-infrastructure-workloads-resource-coherence.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L11",
|
|
"name": "v5-to-v6 migration safety",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Migration safety is at the RC floor; any remaining same-lane hardening is outside the current release-gate slice.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "migration-post-ga-hardening"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/LEGACY_HOST_CLASSIFICATION_2026-03-05.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/V5_TO_V6_COMMERCIAL_MIGRATION_AUDIT_2026-03-07.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/UPGRADE_v6.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/scripts/sync-embed-dist.mjs",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/frontend_embed_sync_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/12-v5-commercial-migration.spec.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_commercial_migration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_full_upgrade_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_session_db_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/migration/v5_to_v6_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L12",
|
|
"name": "E2E journey coverage",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "The end-to-end journey suite covers the RC floor; broader same-lane journey expansion remains outside the current release-gate slice.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "journey-post-ga-expansion"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/COMMERCIAL_CANCELLATION_REACTIVATION_E2E_TEST_PLAN.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/commercial-cancellation-reactivation-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/journeys",
|
|
"kind": "dir"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L13",
|
|
"name": "Core monitoring runtime",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Core monitoring runtime is at the current tracked floor: discovery, metrics-history, and platform-runtime proof routing now land on explicit governed routes, while broader ReadState convergence remains owned by architecture coherence.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"monitoring",
|
|
"unified-resources"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-docker-agent-reconnect-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/monitoring.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/registry.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/unified-resources.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/TRUENAS.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/UNIFIED_RESOURCES.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/UnifiedResourceTable.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/resources.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/canonical_guardrails_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/metrics_history.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor_backup_poll_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor_backups.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor_unified_state_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/poll_providers.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/code_standards_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/metrics_targets.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/registry.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/subsystem_lookup_test.py",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L14",
|
|
"name": "Security, identity, and privacy",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Security, identity, and privacy is at the current governed floor: privacy disclosures, telemetry controls, RBAC boundaries, and shared token/auth settings surfaces now route through explicit subsystem ownership with exercised proof across the remaining shared token and auth boundaries.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"organization-settings",
|
|
"security-privacy"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/PRIVACY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/organization-settings.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/security-privacy.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/__tests__/security.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/OrganizationSharingPanel.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/RBACPaywallPanels.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/SecurityPostureSummary.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/organizationRolePresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/organizationSettingsPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/api_token_org_scope_integration_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/org_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/rbac_handlers_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_status_additional_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/security_tokens_owner_binding_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/system_settings_telemetry_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/telemetry/telemetry.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "SECURITY.md",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L15",
|
|
"name": "Storage and recovery",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Storage and recovery have reached the governed RC floor. Filter coherence is proven across all four transport surfaces (rollups, points, series, facets), storage URL state now normalizes canonical source/status/node/resource selections, and recovery route-backed query, provider, outcome, and stale-only filters round-trip through shared links while facets still narrow with the selected timeline day. Broader storage health UX polish and additional recovery timeline hardening remain post-RC follow-up.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "storage-recovery-post-rc-hardening"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"storage-recovery"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/RECOVERY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/storage-recovery.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/STORAGE_ARCHITECTURE.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Storage/__tests__/storagePageState.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Storage/Storage.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/recovery/recovery_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L16",
|
|
"name": "Agent lifecycle and fleet operations",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Agent lifecycle and fleet operations are at the current governed RC floor: canonical auto-register now converges on one v6 contract, install-command consumers fail closed through shared validated boundaries, profile-management surfaces preserve the canonical malformed-payload and missing-profile resync contract across settings and deploy surfaces, and the runtime-side Unified Agent reporting path now uses the canonical product terminology.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [
|
|
"agent-lifecycle"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/AGENT_SECURITY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-agent-privilege-docs-2026-05-01.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-ai-discovery-adapter-origin-2026-05-01.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-proxmox-api-first-onboarding-2026-05-05.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-proxmox-runtime-token-permission-proof-2026-05-05.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-proxmox-setup-permission-proof-2026-05-05.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-root-agent-hardening-2026-05-05.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/unified-agent-v5-upgrade-continuity-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/agent-lifecycle.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/frontend-primitives.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/UNIFIED_AGENT.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/UPGRADE_v5.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/agentProfiles.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/nodes.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/connectionsTableModel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/InfrastructureSourceManager.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/InfrastructureWorkspace.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/useConnectionsLedger.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/AgentProfilesPanel.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/ConnectionEditor/ConnectionEditor.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/ConnectionEditor/CredentialSlots/NodeCredentialSlot.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/connectionsTableModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/NodeModalAuthenticationSection.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/NodeModalSetupGuideSection.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/useConnectionsLedger.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/useNodeModalState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/infrastructureOnboardingPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/nodeModalPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/agentupdate/update.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/agent_install_command_shared_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/config_handlers_setup_script_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/config_setup_handlers.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/setup_script_render.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/unified_agent.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/hostagent/agent.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/hostagent/proxmox_setup.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/hostagent/proxmox_setup_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/install.sh",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L17",
|
|
"name": "Customer account portal",
|
|
"target_score": 6,
|
|
"current_score": 6,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Pulse Account is now a first-class governed customer-account surface at the current RC floor: hosted accounts land directly in Workspaces, the signed-in shell stays task-first across Workspaces, Access, Billing, and Support, and MSP plus self-serve commercial actions converge on one coherent authenticated account boundary.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/CUSTOMER_ACCOUNT_PORTAL_SPEC.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-recovered-2026-03-26.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-production-followup-2026-03-13.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/organization-user-scope-and-rbac-2026-03-12.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/cloud-paid.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/portal/frontend/src/shell_view.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/portal/frontend/src/shell_view.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/cloudcp/portal/page.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-pro",
|
|
"path": "landing-page/manage.html",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse-pro",
|
|
"path": "landing-page/retrieve-license.html",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L18",
|
|
"name": "Policy-aware data governance",
|
|
"target_score": 6,
|
|
"current_score": 6,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Policy-aware data governance now has a first-class governed floor: resource sensitivity, handling-boundary, and redaction posture remain available through the route-backed Resource Privacy/Data Handling surface without occupying the normal Settings sidebar as an empty read-only destination, non-local AI provider requests use the shared resource-policy sanitizer at the final model boundary, and privacy copy reflects the runtime behavior. Broader enterprise DLP, provider-retention posture, and non-resource prompt-secret detection remain a named post-RC hardening track.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "policy-aware-data-governance-post-rc-hardening"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/PRIVACY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/security-privacy.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/public/docs/PRIVACY.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/AISettingsDialogs.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/DataHandlingPanel.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/quickstartCopyContract.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/modelboundary/resource_policy_sanitizer.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/modelboundary/resource_policy_sanitizer_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/policy_metadata.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/policy_metadata_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L19",
|
|
"name": "Resource change intelligence",
|
|
"target_score": 6,
|
|
"current_score": 6,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Resource change intelligence now has a first-class governed floor: canonical resource relationships, durable resource-change envelopes, AI/Patrol recent-change presentation, dedicated resource timeline/facet reads, relationship-aware resource timelines, and an operator-visible resource relationship map are all owned by the unified-resource and API-contract boundary. Broader surfaced timeline IA, enterprise correlation depth, and cross-resource investigation workflows remain a named post-RC hardening track.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "resource-change-intelligence-post-rc-hardening"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/resource-relationship-map-surface-2026-04-29.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/unified-resources.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/resources.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/__tests__/ResourceCorrelationSummary.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/__tests__/ResourceDetailDrawer.history.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/ResourceChangeSummary.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/ResourceCorrelationSummary.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/ResourceDetailDrawerOverviewTab.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/useResourceDetailDrawerDerivedState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/useResourceDetailDrawerHistoryState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/types/resource.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/resourceCorrelationPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/resourceChangePresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/resourceCorrelationPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/intelligence.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_ai.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/resources.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/resources_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/change_emission.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/change_emission_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/change_filters.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/change_presentation.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/change_presentation_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/changes.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/relationship_presentation.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/relationship_presentation_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/relationships.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/store.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/store_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L20",
|
|
"name": "Action governance and auditability",
|
|
"target_score": 6,
|
|
"current_score": 6,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Action governance now has a first-class governed floor: tool capability declarations include typed agent-operable infrastructure onboarding over the canonical node lifecycle and LAN-discovery APIs, approval-backed action plans, plan-level preflight and dry-run posture, fail-closed action-audit normalization, bounded lifecycle events, API-visible action audit preflight, and a resource-scoped action-history surface are owned by the shared AI, API, security, Patrol, and unified-resource contracts. Broader enterprise policy execution, richer dry-run providers, multi-actor approvals, full onboarding import-plan approvals, and deeper safe-execution contracts remain named post-RC hardening tracks.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "action-governance-auditability-post-rc-hardening"
|
|
},
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "agent-operable-onboarding-import-planning"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "cmd/pulse-mcp/main.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "cmd/pulse-mcp/main_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/action-audit-resource-history-surface-2026-04-29.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/patrol-intelligence.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/security-privacy.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/unified-resources.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/V6_BRIDGE_RELEASE_FOUNDATION_SPEC.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/__tests__/actionAudit.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/actionAudit.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/__tests__/ResourceDetailDrawer.history.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/ResourceActionHistory.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Infrastructure/useResourceDetailDrawerHistoryState.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/types/actionAudit.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/actionAuditPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/actionAuditPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/approval/store.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/approval/store_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/tools/action_audit.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/agent_capabilities.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/agent_capabilities_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/agent_substrate_e2e_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/actions.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/actions_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/store.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/unifiedresources/store_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L21",
|
|
"name": "Platform admission execution",
|
|
"target_score": 6,
|
|
"current_score": 6,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Platform admission execution now has a first-class governed floor: the platform support manifest carries readiness stage, primary mode, canonical projections, onboarding paths, and per-surface support-floor classification into a generated frontend projection, while VMware vSphere remains admitted at first-lab-ready instead of being mislabeled as fully supported. Live vCenter proof, deeper recovery/control coverage, and future admitted-platform runtime depth remain a named post-RC hardening track.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "platform-admission-execution-post-rc-hardening"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/PLATFORM_SUPPORT_MANIFEST.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/PLATFORM_SUPPORT_MODEL.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/vmware-vcenter-phase1-proof-blocked-2026-03-30.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/agent-lifecycle.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/alerts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/frontend-primitives.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/monitoring.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/registry.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/storage-recovery.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/unified-resources.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/VMWARE_VCENTER_PHASE1_ALERTS_AND_ASSISTANT_SPEC.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/VMWARE_VCENTER_PHASE1_API_RUNTIME_SPEC.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/VMWARE_VCENTER_PHASE1_ONBOARDING_SPEC.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/VMWARE_VCENTER_PHASE1_PROOF_MATRIX.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/VMWARE_VCENTER_PHASE1_RESOURCE_PROJECTION_SPEC.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/scripts/canonical-platform-audit.mjs",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/types/__tests__/resource.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/infrastructureOnboardingPresentation.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/sourcePlatformOptions.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/__tests__/sourcePlatforms.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/infrastructureOnboardingPresentation.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/platformSupportManifest.generated.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/platformSupportManifest.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/sourcePlatformOptions.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/utils/sourcePlatforms.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/vmware_handlers.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/mock/platform_support_contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/vmware_poller.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/vmware/provider.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/generate_platform_support_frontend_module.py",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L22",
|
|
"name": "Fleet governance and rollout control",
|
|
"target_score": 6,
|
|
"current_score": 6,
|
|
"status": "partial",
|
|
"completion": {
|
|
"state": "bounded-residual",
|
|
"summary": "Fleet governance and rollout control now has a first-class governed floor: /api/connections carries enrollment, liveness, version drift, adapter health, config rollout, credential status, update posture, and remote-control posture as a canonical fleet projection, Infrastructure systems surfaces those facts as a central fleet-governance strip plus row-level attention signals without paid-surface or monitor-count gating, and first-login Infrastructure resource snapshots rehydrate recent standalone agent continuity instead of waiting for a fresh live report. Deeper desired-vs-applied config drift, staged rollout operations, richer credential rotation state, and command-policy enforcement remain a named post-RC hardening track.",
|
|
"tracking": [
|
|
{
|
|
"kind": "lane-followup",
|
|
"id": "fleet-governance-rollout-control-post-rc-hardening"
|
|
}
|
|
]
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/agent-lifecycle.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/frontend-primitives.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/registry.json",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/storage-recovery.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/V6_BRIDGE_RELEASE_FOUNDATION_SPEC.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/__tests__/connections.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/api/connections.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/connectionsTableModel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/InfrastructureSourceManager.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/InfrastructureWorkspace.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/useConnectionsLedger.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/connectionsTableModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/useConnectionsLedger.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/connections_aggregator.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/connections_aggregator_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/connections_types.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/resources.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/canonical_guardrails_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/monitoring/monitor_unified_state_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/remoteconfig/signature.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/remoteconfig/signature_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "tests/integration/tests/75-settings-infrastructure-fleet-status-coherence.spec.ts",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "L23",
|
|
"name": "Pulse Intelligence proactive operations",
|
|
"target_score": 8,
|
|
"current_score": 8,
|
|
"status": "target-met",
|
|
"completion": {
|
|
"state": "complete",
|
|
"summary": "Pulse Intelligence proactive operations now has a first-class governed floor: Patrol owns structured detection, investigation, readiness, and run-history records; Assistant handoffs rehydrate safe backend-owned context from those records; and approval, action-audit, resource-policy, and timeline contracts keep explanation, collaboration, approval, and governed action out of generic chat.",
|
|
"tracking": []
|
|
},
|
|
"blockers": [],
|
|
"subsystems": [],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/AI.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/pulse-intelligence-proactive-operations-lane-2026-05-08.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/ai-runtime.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/api-contracts.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/patrol-intelligence.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/security-privacy.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/subsystems/unified-resources.md",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/__tests__/FindingsPanel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/__tests__/AIChat.test.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/Chat/index.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/AI/FindingsPanel.tsx",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/__tests__/patrolInvestigationContextModel.test.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/features/patrol/patrolInvestigationContextModel.ts",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_assistant_handoff.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/ai/patrol_assistant_handoff_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handler.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/ai_handler_test.go",
|
|
"kind": "file"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "internal/api/contract_test.go",
|
|
"kind": "file"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"release_gates": [
|
|
{
|
|
"id": "api-token-scope-and-assignment",
|
|
"summary": "Confirm API tokens are assigned to the correct user and org context, enforce scope boundaries including legacy persisted host-agent scope aliases, and revoke cleanly.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "managed-runtime-exercise",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L1",
|
|
"L6",
|
|
"L11",
|
|
"L14",
|
|
"L16"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/api-token-scope-and-assignment-2026-03-12.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "cloud-hosted-tier-runtime-readiness",
|
|
"summary": "Confirm the actual hosted Pulse tier works end to end after provisioning: hosted auth, runtime entry, and hosted billing/admin surfaces all function coherently.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L4",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-account-portal-proxy-2026-04-24.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-blocked-2026-03-25.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-fixed-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-followup-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-recovered-2026-03-26.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-production-remediated-2026-04-24.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-runtime-build-contract-2026-04-24.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-storage-blocker-2026-04-23.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/cloud-hosted-tier-runtime-readiness-storage-guardrails-production-2026-04-24.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "commercial-cancellation-reactivation",
|
|
"summary": "Confirm grandfathered v5 recurring continuity holds while active, completed cancellation revokes paid state, and re-entry after cancellation uses current public v6 pricing.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L11",
|
|
"L12"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/commercial-cancellation-reactivation-2026-03-12.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/commercial-cancellation-reactivation-external-e2e-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "documentation-currentness-and-legacy-cleanup",
|
|
"summary": "Confirm active v6-facing guidance is current, and any legacy or historical docs are clearly archived or demoted instead of remaining current guidance.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "release-ready",
|
|
"minimum_evidence_tier": "local-rehearsal",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L9"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-agent-security-2026-05-04.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-contribution-policy-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-v6-rc3-packet-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-v6-rc4-packet-2026-05-05.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "hosted-signup-billing-replay",
|
|
"summary": "Confirm hosted signup, org provisioning, billing-admin visibility, and webhook replay succeed in the real checkout path.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L4",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/hosted-signup-billing-replay-2026-03-12.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/hosted-signup-billing-replay-production-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/hosted-signup-billing-replay-production-fixed-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "known-rc-issue-closure-for-ga",
|
|
"summary": "Confirm Pulse v6 GA is feature-complete relative to the prerelease issue set: every known RC-era user-visible issue intended for v6 is fixed in the candidate, proven invalid, or conservatively superseded instead of being carried knowingly into GA.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "release-ready",
|
|
"minimum_evidence_tier": "managed-runtime-exercise",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L1",
|
|
"L2",
|
|
"L8",
|
|
"L10",
|
|
"L12",
|
|
"L13",
|
|
"L15",
|
|
"L16"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/agent-lifecycle-ai-discovery-adapter-origin-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-2026-04-21.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-audit-log-store-resilience-2026-05-28.md",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-authorized-keys-symlink-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-backup-orphan-readiness-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-blocked-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-ceph-monitors-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-docker-agent-reconnect-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-docker-update-alert-disable-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-duplicate-metrics-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-installer-bundle-fallback-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-late-issue-intake-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-late-issue-integration-2026-05-28.md",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-metric-threshold-coloring-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-metrics-write-amplification-2026-05-03.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-rc3-followup-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-summary-sparkline-tooltip-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-truenas-smart-unavailable-2026-05-28.md",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-v5-129-delta-2026-05-01.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "mobile-product-purpose-and-first-run-clarity",
|
|
"summary": "Confirm Pulse Mobile communicates its GA role in the actual app experience: a normal paired self-hosted or Relay-backed operator should understand it as a native companion for status, alerts, push/device trust, Relay-backed Open Pulse handoff, and contextual recovery, not as a miniature web dashboard or command-approval control center.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "release-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L5"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/mobile-product-purpose-ga-blocker-2026-04-24.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse-mobile",
|
|
"path": "store/release-readiness.json",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "mobile-relay-auth-approvals",
|
|
"summary": "Confirm pulse-mobile pairing, persistence, relay reconnect, auth transitions, and approval flows work against a real instance.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L5",
|
|
"L7",
|
|
"L12"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/mobile-relay-auth-approvals-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "msp-provider-tenant-management",
|
|
"summary": "Confirm MSP mode behaves as a real provider workflow: one account can manage multiple client tenants coherently without cross-client leakage or MSP/public-plan confusion.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L4",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-production-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-production-fixed-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/msp-provider-tenant-management-production-followup-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/multi-tenant-ga-readiness-revalidation-2026-04-23.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "multi-tenant-runtime-isolation-and-coherence",
|
|
"summary": "Confirm multi-tenant Pulse behaves as a coherent tenant-isolated product across org scope, runtime state, sharing, and migration.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "managed-runtime-exercise",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L4",
|
|
"L6",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/multi-tenant-ga-readiness-revalidation-2026-04-23.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/multi-tenant-runtime-isolation-and-coherence-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "organization-user-scope-and-rbac",
|
|
"summary": "Confirm user creation, organization membership, RBAC scope, and cross-org sharing fail closed outside intended access.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "managed-runtime-exercise",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L4",
|
|
"L9",
|
|
"L12",
|
|
"L14",
|
|
"L17"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/multi-tenant-ga-readiness-revalidation-2026-04-23.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/organization-user-scope-and-rbac-2026-03-12.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "paid-feature-entitlement-gating",
|
|
"summary": "Confirm free-versus-paid feature gating and agent allocation accounting match entitlements across UI, API, hosted, and upgrade surfaces.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "managed-runtime-exercise",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L6",
|
|
"L9",
|
|
"L12",
|
|
"L16"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/paid-feature-claim-proof-matrix-2026-04-29.md",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/paid-feature-entitlement-gating-2026-03-12.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "scripts/release_control/paid_feature_claims_proof.py",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "paid-runtime-build-attribution-alerting",
|
|
"summary": "Confirm active paid licenses cannot silently run on the public community runtime: Pulse must detect non-Pro or unknown runtime identity for paid installs, surface a clear private-runtime warning in-product, preserve runtime-build telemetry for support, and expose Pro/community/unknown runtime status in admin support views.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "release-ready",
|
|
"minimum_evidence_tier": "managed-runtime-exercise",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L9",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/paid-runtime-build-attribution-alerting-2026-05-07.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "rc-to-ga-promotion-readiness",
|
|
"summary": "Confirm stable or GA promotion is coming from an exercised RC with live release-pipeline proof, rollback instructions, and a written v5 maintenance-only policy.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "release-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L1",
|
|
"L9",
|
|
"L11",
|
|
"L12"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-26.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-28.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-04-04.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-blocked-2026-03-26.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "relay-registration-reconnect-drain",
|
|
"summary": "Confirm relay fresh registration, reconnect, stale-session recovery, and disconnect drain behavior hold under real pressure.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "managed-runtime-exercise",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L5",
|
|
"L7",
|
|
"L12"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/relay-registration-reconnect-drain-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-commercial-ga-coherence",
|
|
"summary": "Confirm the self-hosted GA commercial package is coherent end-to-end: public landing, explicit in-app commercial handoff, checkout/account/license-management flows, and GA-facing guidance all describe the same Community / Relay / Pro product without proactive self-hosted trial pressure, legacy v5 bridge posture, or contradictory plan copy.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "release-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L2",
|
|
"L9",
|
|
"L12",
|
|
"L17"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/self-hosted-commercial-ga-coherence-2026-04-20.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/self-hosted-commercial-ga-coherence-paid-runtime-docker-policy-2026-04-24.md",
|
|
"kind": "file",
|
|
"evidence_tier": "managed-runtime-exercise"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "settings-surface-layout-consistency",
|
|
"summary": "Confirm comparable settings surfaces present the canonical page shell, with consistent header framing and no ad hoc top-level layout chrome.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "release-ready",
|
|
"minimum_evidence_tier": "local-rehearsal",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L8"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/settings-surface-layout-consistency-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "local-rehearsal"
|
|
},
|
|
{
|
|
"repo": "pulse",
|
|
"path": "frontend-modern/src/components/Settings/__tests__/settingsArchitecture.test.ts",
|
|
"kind": "file",
|
|
"evidence_tier": "test-proof"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "unified-agent-v5-upgrade-continuity",
|
|
"summary": "Confirm a real v5-installed Pulse Unified Agent upgrades through candidate v6 RC assets into one canonical v6 agent identity without duplicate registration, stale fallback or legacy-scope breakage, or agent-count drift.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L11",
|
|
"L12",
|
|
"L16"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/unified-agent-v5-upgrade-continuity-2026-03-12.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "upgrade-state-and-entitlement-preservation",
|
|
"summary": "Confirm supported upgrades preserve state, entitlements, and first-session continuity without repair flows.",
|
|
"owner": "project-owner",
|
|
"blocking_level": "rc-ready",
|
|
"minimum_evidence_tier": "real-external-e2e",
|
|
"status": "passed",
|
|
"verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md",
|
|
"lane_ids": [
|
|
"L3",
|
|
"L5",
|
|
"L8"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"repo": "pulse",
|
|
"path": "docs/release-control/v6/internal/records/upgrade-state-and-entitlement-preservation-2026-03-13.md",
|
|
"kind": "file",
|
|
"evidence_tier": "real-external-e2e"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"lane_followups": [
|
|
{
|
|
"id": "architecture-post-rc-canonicalization",
|
|
"summary": "Track the remaining post-RC architecture cleanup that still belongs to L6 after canonicalizing Connected infrastructure and the frontend state contract by construction, including retirement of newly legacy or clearly obsolete old-way internal paths unless a boundary-only exception is explicitly governed.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-03-13",
|
|
"lane_ids": [
|
|
"L6"
|
|
],
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"alerts",
|
|
"notifications",
|
|
"patrol-intelligence"
|
|
]
|
|
},
|
|
{
|
|
"id": "documentation-ga-promotion-package",
|
|
"summary": "Track the GA-facing documentation and release communication package that should only be finalized when promotion is actually being executed.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-03-13",
|
|
"lane_ids": [
|
|
"L9"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "first-session-post-rc-polish",
|
|
"summary": "Track broader first-session polish and parity work that is intentionally outside the RC stabilization floor after the default landing surface moved from Dashboard to provider-first platform handoff; future first-session orientation belongs to the selected provider/runtime platform plus Add infrastructure, not a dashboard-home or legacy Infrastructure default surface.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-03-13",
|
|
"lane_ids": [
|
|
"L8"
|
|
],
|
|
"subsystem_ids": [
|
|
"frontend-primitives"
|
|
]
|
|
},
|
|
{
|
|
"id": "mobile-post-rc-hardening",
|
|
"summary": "Track explicit Pulse Mobile store-publication execution and post-GA mobile hardening beyond the current proof floor. Build 4 has current physical Android and iOS companion-role proof; public rollout still requires a separate human-triggered release operation, and future mobile hardening must not reopen the GA readiness gate unless new evidence regresses.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-03-13",
|
|
"lane_ids": [
|
|
"L5"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "performance-post-rc-headroom",
|
|
"summary": "Track additional scalability headroom and non-blocking performance polish beyond the current release floor.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-03-13",
|
|
"lane_ids": [
|
|
"L10"
|
|
],
|
|
"subsystem_ids": [
|
|
"performance-and-scalability"
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-ga-promotion-package",
|
|
"summary": "Track the lane-local self-hosted GA promotion package: stable candidate inputs, rollback clarity, and dry-run capture once GA promotion is actually being executed.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-03-13",
|
|
"lane_ids": [
|
|
"L1"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "storage-recovery-post-rc-hardening",
|
|
"summary": "Track broader storage health UX polish and recovery timeline hardening beyond the current RC floor, including additional filter coherence edge cases and storage panel presentation improvements.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-03-14",
|
|
"lane_ids": [
|
|
"L15"
|
|
],
|
|
"repo_ids": [
|
|
"pulse"
|
|
],
|
|
"subsystem_ids": [
|
|
"storage-recovery"
|
|
],
|
|
"cross_repo": false
|
|
},
|
|
{
|
|
"id": "commercial-ga-promotion-package",
|
|
"summary": "Track the production public flip and release-day execution work for the self-hosted commercial package now that preview, external checkout handoff, paid-user recovery paths, and Pulse Account coherence are proved; default self-hosted app surfaces must stay free-first and non-promotional.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-20",
|
|
"lane_ids": [
|
|
"L2"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "journey-post-ga-expansion",
|
|
"summary": "Track broader same-lane end-to-end journey expansion beyond the current GA floor now that prerelease-to-GA promotion proof is recorded.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-20",
|
|
"lane_ids": [
|
|
"L12"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "migration-post-ga-hardening",
|
|
"summary": "Track remaining same-lane migration-safety hardening beyond the current GA floor now that prerelease-to-GA promotion proof is recorded.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-20",
|
|
"lane_ids": [
|
|
"L11"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "action-governance-auditability-post-rc-hardening",
|
|
"summary": "Track broader action-governance hardening beyond the current canonical action-audit and resource-scoped action-history floor, including richer provider dry-runs, enterprise policy execution, multi-actor or MFA approval chains, and deeper safe-execution contracts for future controlled operations.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-25",
|
|
"lane_ids": [
|
|
"L20"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "fleet-governance-rollout-control-post-rc-hardening",
|
|
"summary": "Track broader fleet-governance rollout control beyond the current fleet projection floor, including desired-versus-applied config drift, staged config rollout state, richer credential rotation/expiry health, agent command-policy enforcement, and runtime proof across remote-control safety states.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-25",
|
|
"lane_ids": [
|
|
"L22"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "platform-admission-execution-post-rc-hardening",
|
|
"summary": "Track broader platform-admission execution beyond the current first-lab-ready support-floor projection, including live vCenter proof before VMware can move to supported, recovery/control expansion, and future admitted-platform proof across setup, canonical projections, alerts, assistant read, and bounded control.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-25",
|
|
"lane_ids": [
|
|
"L21"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "policy-aware-data-governance-post-rc-hardening",
|
|
"summary": "Track broader policy-aware data-governance hardening beyond the current resource-policy floor, including enterprise DLP posture, provider-retention disclosure, non-resource prompt-secret detection, and additional external-model boundary proof where future paid or hosted AI surfaces add new data paths.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-25",
|
|
"lane_ids": [
|
|
"L18"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "resource-change-intelligence-post-rc-hardening",
|
|
"summary": "Track broader resource-change intelligence hardening beyond the current canonical timeline and relationship-map floor, including surfaced cross-resource timeline IA, enterprise correlation depth, and investigation workflows that promote relationship-aware timelines from backend foundation into deeper operator workflows.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-04-25",
|
|
"lane_ids": [
|
|
"L19"
|
|
],
|
|
"subsystem_ids": []
|
|
},
|
|
{
|
|
"id": "agent-operable-onboarding-import-planning",
|
|
"summary": "Track the remaining agent-operable onboarding hardening beyond the current typed node lifecycle and LAN-discovery manifest floor: candidate import plans, credential-grant handoffs, dry-run diffs, human approval before applying multi-source imports, and richer discovery-to-provisioning verification.",
|
|
"owner": "project-owner",
|
|
"status": "planned",
|
|
"recorded_at": "2026-05-28",
|
|
"lane_ids": [
|
|
"L20"
|
|
],
|
|
"subsystem_ids": []
|
|
}
|
|
],
|
|
"coverage_gaps": [],
|
|
"candidate_lanes": [],
|
|
"work_claims": [],
|
|
"open_decisions": [],
|
|
"source_of_truth_file": "docs/release-control/v6/internal/SOURCE_OF_TRUTH.md",
|
|
"resolved_decisions": [
|
|
{
|
|
"id": "ga-floor-policy",
|
|
"summary": "Staged release policy locked; deeper Hosted MSP and Pulse Account portal expansion is post-GA and not a GA floor gate.",
|
|
"kind": "release-policy",
|
|
"decided_at": "2026-02-27",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L4",
|
|
"L17"
|
|
]
|
|
},
|
|
{
|
|
"id": "msp-pricing-band-lock",
|
|
"summary": "MSP pricing locked at Starter/Growth/Scale = $149/$249/$399 monthly with 10/25/50 workspace breakpoints.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-02-27",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L4"
|
|
]
|
|
},
|
|
{
|
|
"id": "stripe-mapping-contract-lock",
|
|
"summary": "Cloud/MSP Stripe mapping contract is locked; concrete price IDs remain operational fill-in tasks.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-02-27",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L4"
|
|
]
|
|
},
|
|
{
|
|
"id": "host-type-migration-boundary-audit",
|
|
"summary": "Host-type migration audit completed; remaining host references are compatibility boundaries, internal shims, or non-resource terminology.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-03-05",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L11",
|
|
"L13",
|
|
"L16"
|
|
]
|
|
},
|
|
{
|
|
"id": "trial-authority-saas-controlled",
|
|
"summary": "Trial acquisition for ordinary self-hosted v6 is retired: SaaS/cloud may own hosted trial/signup state, but the local runtime must not expose local trial start or the retired trial activation return path.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-03-06",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L11"
|
|
]
|
|
},
|
|
{
|
|
"id": "v5-license-bridge-landed",
|
|
"summary": "The v5-to-v6 license migration bridge landed, including upgrade exchange, activation input acceptance, and aligned public migration guidance.",
|
|
"kind": "migration",
|
|
"decided_at": "2026-03-06",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L11"
|
|
]
|
|
},
|
|
{
|
|
"id": "browser-proof-commercial-migration",
|
|
"summary": "Browser-level proof exists for unresolved v5 commercial migration states via the upgraded-fixture commercial migration spec.",
|
|
"kind": "migration",
|
|
"decided_at": "2026-03-07",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L11"
|
|
]
|
|
},
|
|
{
|
|
"id": "commercial-migration-truth-table-owned",
|
|
"summary": "The v5 commercial migration truth table is owned by v6 release-control and unresolved paid-license states must remain preserved through migration.",
|
|
"kind": "migration",
|
|
"decided_at": "2026-03-07",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L11"
|
|
]
|
|
},
|
|
{
|
|
"id": "embedded-frontend-drift-protection",
|
|
"summary": "Embedded frontend drift protection landed through synced dist assets, embed parity tests, and native embedded migration UI proof.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-03-07",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L11"
|
|
]
|
|
},
|
|
{
|
|
"id": "orchestrator-retired",
|
|
"summary": "The v6 release-control orchestrator was retired; direct repo-aware sessions and governance guardrails are the only supported execution path.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-03-11",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "top-level-governance-split",
|
|
"summary": "SOURCE_OF_TRUTH.md now owns only stable governance and locked decisions; live lane state and evidence references live only in status.json.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-03-11",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "stable-release-promotion-model",
|
|
"summary": "v6 and later releases use an opt-in RC preview channel plus a promotion-only stable channel; stable customers must receive only already-validated builds, unattended auto-update exposure remains stable-only, and GA stays blocked until rollback instructions and the v5 maintenance-only policy are explicit.",
|
|
"kind": "release-policy",
|
|
"decided_at": "2026-03-12",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L1",
|
|
"L3",
|
|
"L11",
|
|
"L12"
|
|
]
|
|
},
|
|
{
|
|
"id": "v5-maintenance-support-policy",
|
|
"summary": "Once v6 reaches stable or GA, v5 moves to a 90-day maintenance-only window for critical security issues, critical correctness/data-loss issues, and safe migration blockers only; after that window, v5 is unsupported.",
|
|
"kind": "release-policy",
|
|
"decided_at": "2026-03-12",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "v5-pro-price-grandfathering",
|
|
"summary": "Legacy recurring Pulse Pro subscriptions already active before the public v6 pricing cutover keep their existing recurring price plus uncapped self-hosted monitoring and child-resource volume through the v6 pricing change until they cancel; renewals must preserve that grandfathered state, while any return after cancellation re-enters on current v6 pricing.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-03-12",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L11"
|
|
]
|
|
},
|
|
{
|
|
"id": "cloud-msp-price-id-propagation",
|
|
"summary": "The 13 canonical Cloud/MSP v6 price IDs are populated in the governed pulse-pro operations doc, launch checklist, and license-server env mapping template.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-03-13",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L4"
|
|
]
|
|
},
|
|
{
|
|
"id": "cloud-msp-stripe-prices",
|
|
"summary": "The 13 canonical Cloud/MSP v6 price IDs already exist as active live recurring Stripe prices and match the governed commercial mappings.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-03-13",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L4"
|
|
]
|
|
},
|
|
{
|
|
"id": "mobile-usefulness-floor",
|
|
"summary": "Pulse Mobile is considered useful enough for the v6 RC line when it preserves at least one trusted paired instance across relaunches, surfaces relay/runtime state clearly in the main shell, fails closed into a recoverable disconnected state on stale or revoked access, and supports live approval visibility and action recovery; broader parity remains post-RC scope.",
|
|
"kind": "release-policy",
|
|
"decided_at": "2026-03-13",
|
|
"subsystem_ids": [
|
|
"frontend-primitives",
|
|
"relay-runtime"
|
|
],
|
|
"lane_ids": [
|
|
"L5",
|
|
"L7",
|
|
"L8",
|
|
"L12"
|
|
]
|
|
},
|
|
{
|
|
"id": "accidental-prerelease-tags-do-not-count-as-shipped-rcs",
|
|
"summary": "Accidental prerelease git tags do not count as shipped prerelease lineage. Local-only false-start prerelease tags must be cleared or superseded before the first real governed prerelease is published, and only actually published prerelease tags may be treated as valid stable-promotion `promoted_from_tag` lineage.",
|
|
"kind": "release-policy",
|
|
"decided_at": "2026-03-14",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L1",
|
|
"L9",
|
|
"L11",
|
|
"L12"
|
|
]
|
|
},
|
|
{
|
|
"id": "monitored-systems-counting-contract",
|
|
"summary": "Commercial counting for Pulse v6 is based on monitored systems, not installed agents: each top-level monitored system counts once regardless of collection path, while child resources remain included and API-only monitoring must consume the same cap as agent-backed monitoring.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-03-17",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L2"
|
|
]
|
|
},
|
|
{
|
|
"id": "pulse-not-agent-sandbox-boundary",
|
|
"summary": "Pulse is not a universal agent sandbox; it is the infrastructure-specific context, policy, and action plane that sandboxed agents should use.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-03-17",
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"security-privacy",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L14"
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-pricing-band-lock-v2",
|
|
"summary": "Historical RC1 self-hosted pricing lock: Pulse v6 temporarily carried a capped Community / Relay / Pro / Pro+ self-hosted ladder during RC1, but that direction was superseded on 2026-04-16 by `self-hosted-core-monitoring-free` and must not be treated as the final GA self-hosted pricing truth.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-03-17",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L2"
|
|
]
|
|
},
|
|
{
|
|
"id": "v6-bridge-release-foundation",
|
|
"summary": "Pulse v6 is a bridge release toward a resource + policy + control platform: it must land irreversible primitives for canonical resources, policy-aware routing, governed actions, and fleet control without attempting the full private operational broker in one release.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-03-17",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"security-privacy",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L14",
|
|
"L16"
|
|
]
|
|
},
|
|
{
|
|
"id": "canonical-timeline-source-precedence",
|
|
"summary": "Unified-resource change history is the canonical durable backend timeline; alert incident memory remains a derived investigation projection for alert-local notes, analysis, commands, runbooks, and lifecycle breadcrumbs.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-03-20",
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13"
|
|
]
|
|
},
|
|
{
|
|
"id": "mobile-public-release-stays-non-public-until-product-ready",
|
|
"summary": "Pulse Mobile may complete store setup and candidate submission plumbing before GA, but public rollout stays non-public until a human explicitly runs the separate release operation. The build 4 product bar was met on 2026-04-26 through fresh physical Android and iOS proof plus the explicit product-ready judgment recorded in the mobile blocker record.",
|
|
"kind": "release-policy",
|
|
"decided_at": "2026-03-28",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L5"
|
|
]
|
|
},
|
|
{
|
|
"id": "mixed-private-infrastructure-operations-direction",
|
|
"summary": "Pulse is moving toward the unified operations layer for mixed private infrastructure: operators should get one coherent place to monitor, investigate, and safely act across mixed estates, and new platform work is admitted only when it strengthens that operator surface rather than landing opportunistically.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-03-30",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"storage-recovery",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L15",
|
|
"L16"
|
|
]
|
|
},
|
|
{
|
|
"id": "mobile-incident-companion-ia-v1",
|
|
"summary": "Superseded for GA by `mobile-product-role-and-audience`: Pulse Mobile's public-facing IA now centers on Status, Alerts, Open Pulse, Access, and Settings as a native companion for paired status, alert recovery, push/device trust, Relay-backed dashboard handoff, and safe contextual action. The earlier Home/Findings/Instances/Approvals/More incident-companion shape is not the current GA surface.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-03-30",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L5"
|
|
]
|
|
},
|
|
{
|
|
"id": "platform-support-model-v1",
|
|
"summary": "Pulse v6 platform support is governed by one canonical model: owning platform surfaces declare primary ingestion, canonical resource projections, and support-floor surfaces; `docker` is the canonical Docker / Podman container-runtime lens and workload surface rather than an exclusive owning platform, and the shell labels that destination as Docker for operator recognition while shared runtime badges and management copy keep Docker / Podman or containers wording where precise; `kubernetes` remains a first-class orchestrator platform; runtime variants such as `podman` plus transport helpers are not top-level platforms.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-03-30",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"storage-recovery",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L15",
|
|
"L16"
|
|
]
|
|
},
|
|
{
|
|
"id": "vmware-vsphere-vcenter-first-admission-model",
|
|
"summary": "VMware vSphere is the current admitted strategic platform direction under the governed platform model: phase 1 stays vCenter-first and API-first, projects ESXi hosts as `agent`, VMs as `vm`, datastores as `storage`, keeps direct ESXi out of scope, treats snapshots as read-side workload context rather than recovery support, and leaves assistant control read-only until the governed action model expands.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-03-30",
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"storage-recovery",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L15"
|
|
]
|
|
},
|
|
{
|
|
"id": "vmware-vsphere-vcenter-support-claim-ratchet",
|
|
"summary": "VMware vSphere is already an admitted strategic platform direction, but it is not a supported Pulse platform until one real vCenter capability is recorded in LOCAL_CAPABILITIES.md and the governed phase-1 proof matrix passes; implementation and contract work may proceed against the locked model before that point, but product, settings, and assistant surfaces must not claim VMware support.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-03-30",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"storage-recovery",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L15",
|
|
"L16"
|
|
]
|
|
},
|
|
{
|
|
"id": "platform-admission-first-lab-ready-stage",
|
|
"summary": "Admitted but not yet supported platforms now have one governed pre-support checkpoint, `first-lab-ready`: the architecture is locked, the shared phase floor is implemented, automated non-live proof is strong enough that the next highest-value step is live validation, and the support claim remains blocked until that live proof passes.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-03-31",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"storage-recovery",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L15",
|
|
"L16"
|
|
]
|
|
},
|
|
{
|
|
"id": "rc-publication-judgment",
|
|
"summary": "Pulse v6 current `pulse/v6-release` candidate is approved for the first governed RC publication after the 2026-04-09 packet recorded a passing full active-target proof; `rc-publication-judgment` is resolved and prerelease publication may proceed on the governed v6 release line.",
|
|
"kind": "release-policy",
|
|
"decided_at": "2026-04-09",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L1",
|
|
"L8",
|
|
"L9",
|
|
"L12"
|
|
]
|
|
},
|
|
{
|
|
"id": "legacy-grandfathering-eligibility-cutoff",
|
|
"summary": "Uncapped grandfathered recurring continuity applies only to legacy recurring Pulse Pro subscriptions that were already active before the public v6 pricing cutover; public pricing and checkout copy must not imply that brand-new pre-cutover purchases automatically qualify for that legacy continuity.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-04-15",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-core-monitoring-free",
|
|
"summary": "Pulse v6 self-hosted core monitoring is not a paid gate: homelab users must not be monetized on monitored-system volume itself, monitored systems remain the canonical counted unit for product understanding and migration truth, and paid self-hosted value must come from optional extras, hosted convenience, business workflow, support, or similar non-core surfaces.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-04-16",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-paid-extras-packaging",
|
|
"summary": "Pulse v6 self-hosted paid packaging is now locked to Community / Relay / Pro with core monitoring included and not sold by monitored-system volume on every self-hosted tier: Relay sells remote access, mobile, push, and convenience plus 14-day history; Pro sells Relay plus AI operations, automation, advanced administration, and 90-day history; legacy Pro+ remains continuity-only and is not a public no-cap self-hosted checkout tier; Cloud and MSP continue as separate hosted/commercial offers.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-04-16",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L2",
|
|
"L3",
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "patrol-product-language-ai-boundary",
|
|
"summary": "Patrol product-language migration boundary audited: customer-facing page titles, nav, route chrome, summary copy, actions, and empty states lead with Patrol/Pulse Patrol/Pulse Assistant. Internal file, store, type, transport, and log identifiers retain the shared AI-runtime boundary. The `/settings/system-ai` panel is the explicit provider/configuration carve-out where AI terminology is reserved; its chrome already leads with 'Assistant & Patrol'. The remaining AgentProfilesPanel 'Ideas' tooltip was product-neutralized to 'Suggest profiles for your estate'.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-04-17",
|
|
"subsystem_ids": [
|
|
"patrol-intelligence"
|
|
],
|
|
"lane_ids": [
|
|
"L6"
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-plans-surface-entitlement-first",
|
|
"summary": "The self-hosted v6 commercial settings surface is plan-owned rather than tier-owned: the settings nav label is `Plans`, the page title is `Self-hosted plan`, and the canonical plan state must foreground the current tier plus available capabilities so paid upgrades can confirm what their key enabled without making default Community look like it is missing an activation key.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-04-22",
|
|
"subsystem_ids": [
|
|
"cloud-paid",
|
|
"frontend-primitives"
|
|
],
|
|
"lane_ids": [
|
|
"L3",
|
|
"L8",
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "dashboard-home-estate-orientation-contract",
|
|
"summary": "Superseded by `provider-first-platform-landing-surface`: Dashboard no longer remains the default landing surface or a preserved overview path. The prior estate-orientation requirement now belongs to provider-first platform handoff and Add infrastructure, not a dashboard-home or legacy Infrastructure default surface.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-04-23",
|
|
"subsystem_ids": [
|
|
"frontend-primitives"
|
|
],
|
|
"lane_ids": [
|
|
"L8"
|
|
]
|
|
},
|
|
{
|
|
"id": "self-hosted-paid-surface-classification",
|
|
"summary": "Current v6 self-hosted paid surfaces now classify commercial capabilities explicitly: only the primary Pro pillars (root-cause analysis, safe remediation, 90-day history, and included admin extras) may be marketed in customer-facing copy and upgrade prompts; compatibility-only gates such as `kubernetes_ai` remain valid runtime facts but non-marketed, and legacy claims such as `incident memory`, `scheduled remediations`, and `execution audit trail` stay retired unless rebuilt into first-class product surfaces.",
|
|
"kind": "pricing",
|
|
"decided_at": "2026-04-23",
|
|
"subsystem_ids": [
|
|
"cloud-paid"
|
|
],
|
|
"lane_ids": [
|
|
"L3",
|
|
"L9"
|
|
]
|
|
},
|
|
{
|
|
"id": "mobile-product-role-and-audience",
|
|
"summary": "Pulse Mobile v6 GA is a native companion for paired status, alerts, push/device trust, Relay-backed Open Pulse handoff, and contextual recovery from notifications or deep links. Full monitoring depth remains in the mobile-optimized web app, and the native app must not read as a miniature dashboard or approvals-first control center.",
|
|
"kind": "governance",
|
|
"decided_at": "2026-04-24",
|
|
"subsystem_ids": [],
|
|
"lane_ids": [
|
|
"L5"
|
|
]
|
|
},
|
|
{
|
|
"id": "infrastructure-default-landing-surface",
|
|
"summary": "Superseded by `provider-first-platform-landing-surface`: the 2026-04-29 Dashboard retirement moved authenticated users off Dashboard and onto Infrastructure/Add infrastructure, but current v6 runtime handoff now belongs to provider-first platform selection rather than legacy Infrastructure.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-04-29",
|
|
"subsystem_ids": [
|
|
"frontend-primitives"
|
|
],
|
|
"lane_ids": [
|
|
"L8",
|
|
"L13"
|
|
]
|
|
},
|
|
{
|
|
"id": "agent-ready-operations-api-cli-contract",
|
|
"summary": "Agent-ready Pulse product work is API/CLI-first: stable HTTP APIs and a deterministic CLI must own resources, timelines, capability discovery, governed action planning, approvals, execution, verification, and audit; MCP may exist only as a compatibility adapter over those contracts, not as the source-of-truth protocol or a lane by itself.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-05-03",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"security-privacy",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L14",
|
|
"L16",
|
|
"L18",
|
|
"L19",
|
|
"L20",
|
|
"L21",
|
|
"L22"
|
|
]
|
|
},
|
|
{
|
|
"id": "pulse-intelligence-product-contract",
|
|
"summary": "Pulse Pro's AI direction is proactive infrastructure intelligence: Patrol is the detection and investigation engine, Assistant is the contextual conversation, approval, and governed action surface, and generic chat polish is not the canonical product objective.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-05-06",
|
|
"subsystem_ids": [
|
|
"ai-runtime",
|
|
"api-contracts",
|
|
"patrol-intelligence",
|
|
"security-privacy",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L14",
|
|
"L18",
|
|
"L19",
|
|
"L20",
|
|
"L23"
|
|
]
|
|
},
|
|
{
|
|
"id": "platform-page-membership-overlap-v1",
|
|
"summary": "Pulse v6 primary IA remains platform-first rather than a generic mixed systems page, with a dedicated container-runtime lens for Docker / Podman workloads: a single physical or agent-backed system may appear on multiple platform or runtime pages when it participates in multiple contracts, and each page must show only the workloads and native resources relevant to that scope. Workload platform membership is a canonical resource contract, not a page-local platformType guess: Docker/Podman containers reported from a Proxmox host or LXC may appear in both the Proxmox Workloads table and the container-runtime lens, while TrueNAS apps that expose Docker-compatible runtime metadata remain TrueNAS-owned and do not become Docker-managed action targets. Host identity stays separate from runtime membership, so an Unraid server that reports Docker containers can appear on the container-runtime page while still reading as an Unraid-profiled host rather than a generic Docker server.",
|
|
"kind": "architecture",
|
|
"decided_at": "2026-05-17",
|
|
"subsystem_ids": [
|
|
"agent-lifecycle",
|
|
"ai-runtime",
|
|
"alerts",
|
|
"api-contracts",
|
|
"monitoring",
|
|
"storage-recovery",
|
|
"unified-resources"
|
|
],
|
|
"lane_ids": [
|
|
"L6",
|
|
"L13",
|
|
"L15",
|
|
"L16"
|
|
]
|
|
},
|
|
{
|
|
"id": "provider-first-platform-landing-surface",
|
|
"summary": "Pulse v6 authenticated root, login handoff, primary navigation, and Standalone eligibility are owned by the frontend-primitives provider-first platform contract; adjacent subsystem docs may reference that owner but must not carry a second route/order definition. Legacy Infrastructure is retired rather than route-compatible.",
|
|
"kind": "contract",
|
|
"decided_at": "2026-05-23",
|
|
"subsystem_ids": [
|
|
"frontend-primitives"
|
|
],
|
|
"lane_ids": [
|
|
"L8"
|
|
]
|
|
}
|
|
]
|
|
}
|