Files
pulse/pkg/server/telemetry_pulse_intelligence_test.go
T
rcourtman 3420fcdee4 Add schema v17 Patrol provider, cost, autonomy, and outcome telemetry
The 2026-09-01 Patrol assessment could not answer four questions from
telemetry: what share of Patrol installs run local versus cloud models,
what Patrol costs an install per month (issue 1789 estimates ~104k input
tokens per full run at ~5.5 runs a day, above the Pro fee on non-Flash
tiers), how the 240 of 255 fleet investigations that produced no plan
actually ended, and which effective Patrol mode an install runs.

Schema v17 adds closed buckets only. ai_provider_class classifies the
Patrol model route (none, local, cloud_byok, cloud_subscription,
hosted_quickstart, unknown) with a syntactic private-host check on custom
OpenAI-compatible endpoints; it never resolves DNS or carries a provider,
model, endpoint, or account. pulse_intelligence_patrol_autonomy_level is
the effective level after licence and Autopilot gating. The two token
fields bucket the existing local usage ledger's Patrol events, so exact
counts and prices stay on the install. Thirteen investigation outcome
counters partition the findings already counted as investigated, one
bucket per finding, adding no finding, resource, or session identity.

The strings are never omitted, so an empty value can only mean a pre-v17
sender; the receiver stores those as unknown. PRIVACY.md, its shipped
mirror, the Settings preview interface, and the security-privacy and
api-contracts subsystem notes carry the disclosure, and the coverage gap
is registered in status.json.

The agent-lifecycle and storage-recovery contracts name internal/api under
their extension points, so both record that this telemetry is adjacent
adoption analytics and never agent or storage state. The stable E2E tier
pins the public schema version, so the disclosure spec moves to 17, and
the Settings preview interface change carries a browser receipt from a
scratch build of this tree at 1280x800 and 390x844. status.json also drops
an identical duplicate of the ai-provider-guided-setup coverage-gap record
that two merges each appended, which the private governance audit rejects.

The bucket for a legacy config still pointing at the retired Pulse-hosted
route is named hosted_legacy: the shipped privacy document discloses the
vocabulary verbatim and the frontend copy contract keeps that document
free of the retired hosted quickstart wording, so the telemetry package
now pins the vocabulary at the source.
2026-09-02 11:09:25 +01:00

1160 lines
50 KiB
Go

package server
import (
"testing"
"time"
"github.com/rcourtman/pulse-go-rewrite/internal/agentcapabilities"
"github.com/rcourtman/pulse-go-rewrite/internal/config"
"github.com/rcourtman/pulse-go-rewrite/internal/telemetry"
"github.com/rcourtman/pulse-go-rewrite/pkg/aicontracts"
)
func TestApplyPulseIntelligenceTelemetrySnapshot_AggregatesContentFreeLoopCounts(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
recent := now.Add(-2 * time.Hour)
old := now.Add(-(telemetry.PulseIntelligenceTelemetryWindow + time.Hour))
persistence := config.NewConfigPersistence(t.TempDir())
if err := persistence.SaveAIUsageHistory([]config.AIUsageEventRecord{
{Timestamp: recent, UseCase: "chat"},
{Timestamp: recent.Add(-time.Minute), UseCase: "CHAT", ContextScope: "resource_context", ToolCallCount: 3},
{Timestamp: recent.Add(-2 * time.Minute), UseCase: "chat", FindingID: "finding-123", ToolCallCount: 2},
{Timestamp: recent, UseCase: "patrol", InputTokens: 6_000_000, OutputTokens: 120_000},
{Timestamp: recent, UseCase: "unknown", ToolCallCount: 99, InputTokens: 50_000_000},
{Timestamp: recent, UseCase: "patrol_readiness", InputTokens: 50_000_000},
{Timestamp: old, UseCase: "chat", ToolCallCount: 99},
}); err != nil {
t.Fatalf("SaveAIUsageHistory: %v", err)
}
if err := persistence.SavePatrolRunHistory([]config.PatrolRunRecord{
{StartedAt: recent.Add(-5 * time.Minute), CompletedAt: recent, NewFindings: 2},
{StartedAt: recent.Add(-time.Hour), CompletedAt: recent.Add(-30 * time.Minute), NewFindings: 3},
{StartedAt: old, CompletedAt: old, NewFindings: 99},
}); err != nil {
t.Fatalf("SavePatrolRunHistory: %v", err)
}
if err := persistence.SaveAIFindings(map[string]*config.AIFindingRecord{
"recent-last-investigated": {
ID: "recent-last-investigated",
LastInvestigatedAt: &recent,
},
"recent-record-started": {
ID: "recent-record-started",
InvestigationStatus: "running",
InvestigationRecord: &aicontracts.InvestigationRecord{
ID: "investigation-recent",
FindingID: "recent-record-started",
StartedAt: recent.Add(-15 * time.Minute),
},
},
"recent-resolved": {
ID: "recent-resolved",
ResolvedAt: &recent,
},
"recent-fix-verified": {
ID: "recent-fix-verified",
InvestigationOutcome: "fix_verified",
InvestigationRecord: &aicontracts.InvestigationRecord{
ID: "investigation-verified",
FindingID: "recent-fix-verified",
CompletedAt: &recent,
},
},
"old-last-investigated": {
ID: "old-last-investigated",
LastInvestigatedAt: &old,
},
"old-resolved": {
ID: "old-resolved",
ResolvedAt: &old,
},
}); err != nil {
t.Fatalf("SaveAIFindings: %v", err)
}
if err := persistence.SaveExternalAgentActivityHistory([]config.ExternalAgentActivityRecord{
{Timestamp: recent, Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityFleetContext},
{Timestamp: recent.Add(-time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityResourceContext},
{Timestamp: recent.Add(-2 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityEventStream},
{Timestamp: recent.Add(-3 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityProvisioning},
{Timestamp: recent.Add(-4 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityOperatorState},
{Timestamp: recent.Add(-5 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityFindingList},
{Timestamp: recent.Add(-6 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityFindingDecision},
{Timestamp: recent.Add(-7 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityActionPlan},
{Timestamp: recent.Add(-8 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityActionDecision},
{Timestamp: recent.Add(-9 * time.Minute), Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityActionExecute},
{Timestamp: recent.Add(-10 * time.Minute), Surface: config.ExternalAgentActivitySurfacePulseMCP, Activity: config.ExternalAgentActivityActionExecute},
{Timestamp: recent.Add(-10 * time.Minute), Surface: "support_api", Activity: config.ExternalAgentActivityResourceContext},
{Timestamp: old, Surface: config.ExternalAgentActivitySurfaceAgentAPI, Activity: config.ExternalAgentActivityResourceContext},
}); err != nil {
t.Fatalf("SaveExternalAgentActivityHistory: %v", err)
}
if err := persistence.SaveWorkflowPromptActivityHistory([]config.WorkflowPromptActivityRecord{
{Timestamp: recent, Surface: config.WorkflowPromptActivitySurfacePulseAssistant, PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop},
{Timestamp: recent.Add(-time.Minute), Surface: config.WorkflowPromptActivitySurfacePulseMCP, PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop},
{Timestamp: recent.Add(-2 * time.Minute), Surface: config.WorkflowPromptActivitySurfacePulsePatrol, PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop},
{Timestamp: recent.Add(-2*time.Minute - time.Second), Surface: config.WorkflowPromptActivitySurfacePatrolControl, PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop},
{Timestamp: recent.Add(-3 * time.Minute), Surface: config.WorkflowPromptActivitySurfacePatrolAutonomy, PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop},
{Timestamp: recent.Add(-4 * time.Minute), Surface: config.WorkflowPromptActivitySurfaceProActivation, PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop},
{Timestamp: recent.Add(-2 * time.Minute), Surface: config.WorkflowPromptActivitySurfacePulseAssistant, PromptName: agentcapabilities.PulseWorkflowPromptTriageFleet},
{Timestamp: old, Surface: config.WorkflowPromptActivitySurfacePulseAssistant, PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop},
}); err != nil {
t.Fatalf("SaveWorkflowPromptActivityHistory: %v", err)
}
expiredAt := now.Add(-time.Minute)
cfg := &config.Config{
APITokens: []config.APITokenRecord{
{Scopes: []string{config.ScopeWildcard}, CreatedAt: recent},
{Scopes: []string{config.ScopeWildcard}, ExpiresAt: &expiredAt, CreatedAt: recent},
},
}
snap := telemetry.Snapshot{PaidLicense: true}
actions := telemetry.PulseIntelligenceActionSnapshot{
ActionPlans30d: 4,
ApprovalRequests30d: 2,
RejectedActionDecisions30d: 1,
ApprovedActionDecisions30d: 1,
ApprovedActionAttempts30d: 1,
ApprovedActionSuccesses30d: 1,
PatrolActionPlans30d: 6,
PatrolApprovalRequests30d: 5,
PatrolRejectedActionDecisions30d: 1,
PatrolApprovedActionDecisions30d: 4,
PatrolApprovedActionAttempts30d: 3,
PatrolApprovedActionSuccesses30d: 2,
ApprovedActionInFlight30d: 2,
ApprovedActionUnclassified30d: 3,
ApprovedActionRefusalsPlanStale30d: 4,
ApprovedActionRefusalsPolicy30d: 5,
ApprovedActionRefusalsCapability30d: 6,
ApprovedActionRefusalsTargetChanged30d: 7,
ApprovedActionRefusalsPrerequisite30d: 8,
ApprovedActionRefusalsContract30d: 9,
ApprovedActionRefusalsOther30d: 10,
VerifiedFindingResolutions30d: 1,
PatrolAutonomyLevel: "assisted",
}
applyPulseIntelligenceTelemetrySnapshot(&snap, persistence, cfg, actions, now)
if snap.PulseIntelligenceAssistantAICalls30d != 3 {
t.Fatalf("assistant AI calls = %d, want 3", snap.PulseIntelligenceAssistantAICalls30d)
}
if snap.PulseIntelligencePatrolAutonomyLevel != "assisted" {
t.Fatalf("patrol autonomy level = %q, want assisted", snap.PulseIntelligencePatrolAutonomyLevel)
}
if snap.AIProviderClass != telemetry.AIProviderClassNone {
t.Fatalf("provider class default = %q, want none", snap.AIProviderClass)
}
// Only use_case=patrol tokens count; readiness preflights and unknown use
// cases must not inflate the Patrol cost bucket.
if snap.PulseIntelligencePatrolInputTokensBucket30d != telemetry.PatrolInputTokens5M20M ||
snap.PulseIntelligencePatrolOutputTokensBucket30d != telemetry.PatrolOutputTokens100K500K {
t.Fatalf("patrol token buckets = %q/%q, want 5m_20m/100k_500k",
snap.PulseIntelligencePatrolInputTokensBucket30d, snap.PulseIntelligencePatrolOutputTokensBucket30d)
}
outcomeTotal := snap.PulseIntelligencePatrolInvestigationOutcomeFixVerified30d +
snap.PulseIntelligencePatrolInvestigationOutcomeFixQueued30d +
snap.PulseIntelligencePatrolInvestigationOutcomeFixExecuted30d +
snap.PulseIntelligencePatrolInvestigationOutcomeFixRejected30d +
snap.PulseIntelligencePatrolInvestigationOutcomeFixFailed30d +
snap.PulseIntelligencePatrolInvestigationOutcomeFixVerificationUnknown30d +
snap.PulseIntelligencePatrolInvestigationOutcomeResolved30d +
snap.PulseIntelligencePatrolInvestigationOutcomeNeedsAttention30d +
snap.PulseIntelligencePatrolInvestigationOutcomeCannotFix30d +
snap.PulseIntelligencePatrolInvestigationOutcomeTimedOut30d +
snap.PulseIntelligencePatrolInvestigationOutcomeInProgress30d +
snap.PulseIntelligencePatrolInvestigationOutcomeFailed30d +
snap.PulseIntelligencePatrolInvestigationOutcomeOther30d
if outcomeTotal != snap.PulseIntelligencePatrolInvestigations30d {
t.Fatalf("outcome buckets sum to %d, want investigations %d", outcomeTotal, snap.PulseIntelligencePatrolInvestigations30d)
}
if snap.PulseIntelligencePatrolInvestigationOutcomeFixVerified30d != 1 ||
snap.PulseIntelligencePatrolInvestigationOutcomeInProgress30d != 1 ||
snap.PulseIntelligencePatrolInvestigationOutcomeOther30d != 1 {
t.Fatalf("outcome partition = verified %d / in_progress %d / other %d, want 1/1/1",
snap.PulseIntelligencePatrolInvestigationOutcomeFixVerified30d,
snap.PulseIntelligencePatrolInvestigationOutcomeInProgress30d,
snap.PulseIntelligencePatrolInvestigationOutcomeOther30d)
}
if snap.PulseIntelligenceAssistantContextAICalls30d != 2 {
t.Fatalf("assistant context AI calls = %d, want 2", snap.PulseIntelligenceAssistantContextAICalls30d)
}
if snap.PulseIntelligenceAssistantToolCalls30d != 5 {
t.Fatalf("assistant tool calls = %d, want 5", snap.PulseIntelligenceAssistantToolCalls30d)
}
if snap.PulseIntelligencePatrolAICalls30d != 1 {
t.Fatalf("patrol AI calls = %d, want 1", snap.PulseIntelligencePatrolAICalls30d)
}
if snap.PulseIntelligencePatrolRuns30d != 2 {
t.Fatalf("patrol runs = %d, want 2", snap.PulseIntelligencePatrolRuns30d)
}
if snap.PulseIntelligencePatrolNewFindings30d != 5 {
t.Fatalf("patrol new findings = %d, want 5", snap.PulseIntelligencePatrolNewFindings30d)
}
if snap.PulseIntelligencePatrolInvestigations30d != 3 {
t.Fatalf("patrol investigations = %d, want 3", snap.PulseIntelligencePatrolInvestigations30d)
}
if snap.PulseIntelligencePatrolResolvedFindings30d != 2 {
t.Fatalf("patrol resolved findings = %d, want 2", snap.PulseIntelligencePatrolResolvedFindings30d)
}
if !snap.PulseIntelligenceExternalAgentEnabled || !snap.PulseIntelligenceExternalAgentUsed30d {
t.Fatalf("external-agent booleans = enabled %v used %v, want true/true", snap.PulseIntelligenceExternalAgentEnabled, snap.PulseIntelligenceExternalAgentUsed30d)
}
if !snap.PulseIntelligenceExternalAgentOperationsLoopReady {
t.Fatalf("wildcard token should make the Pulse MCP operations loop ready: %#v", snap)
}
if !snap.PulseIntelligenceMCPAdapterUsed30d {
t.Fatalf("MCP adapter use should be true when a recent pulse_mcp activity marker exists: %#v", snap)
}
if snap.PulseIntelligenceExternalAgentContextRequests30d != 2 ||
snap.PulseIntelligenceExternalAgentEventStreamRequests30d != 1 ||
snap.PulseIntelligenceExternalAgentProvisioningRequests30d != 1 ||
snap.PulseIntelligenceExternalAgentOperatorStateRequests30d != 1 ||
snap.PulseIntelligenceExternalAgentFindingRequests30d != 2 ||
snap.PulseIntelligenceExternalAgentActionRequests30d != 4 {
t.Fatalf("external-agent class counters not applied: %#v", snap)
}
if snap.PulseIntelligenceActionPlans30d != 4 ||
snap.PulseIntelligenceApprovalRequests30d != 2 ||
snap.PulseIntelligenceRejectedActionDecisions30d != 1 ||
snap.PulseIntelligenceApprovedActionDecisions30d != 1 ||
snap.PulseIntelligenceApprovedActionAttempts30d != 1 ||
snap.PulseIntelligenceApprovedActionSuccesses30d != 1 ||
snap.PulseIntelligencePatrolActionPlans30d != 6 ||
snap.PulseIntelligencePatrolApprovalRequests30d != 5 ||
snap.PulseIntelligencePatrolRejectedActionDecisions30d != 1 ||
snap.PulseIntelligencePatrolApprovedActionDecisions30d != 4 ||
snap.PulseIntelligencePatrolApprovedActionAttempts30d != 3 ||
snap.PulseIntelligencePatrolApprovedActionSuccesses30d != 2 ||
snap.PulseIntelligenceApprovedActionInFlight30d != 2 ||
snap.PulseIntelligenceApprovedActionUnclassified30d != 3 ||
snap.PulseIntelligenceApprovedActionRefusalsPlanStale30d != 4 ||
snap.PulseIntelligenceApprovedActionRefusalsPolicy30d != 5 ||
snap.PulseIntelligenceApprovedActionRefusalsCapability30d != 6 ||
snap.PulseIntelligenceApprovedActionRefusalsTargetChanged30d != 7 ||
snap.PulseIntelligenceApprovedActionRefusalsPrerequisite30d != 8 ||
snap.PulseIntelligenceApprovedActionRefusalsContract30d != 9 ||
snap.PulseIntelligenceApprovedActionRefusalsOther30d != 10 ||
snap.PulseIntelligenceVerifiedFindingResolutions30d != 1 {
t.Fatalf("action telemetry counters were not copied: %#v", snap)
}
if snap.PulseIntelligenceOperationsLoopStarterRequests30d != 6 ||
snap.PulseIntelligenceAssistantOperationsLoopStarterRequests30d != 1 ||
snap.PulseIntelligencePatrolOperationsLoopStarterRequests30d != 1 ||
snap.PulseIntelligencePatrolControlOperationsLoopStarterRequests30d != 4 ||
snap.PulseIntelligenceProActivationOperationsLoopStarterRequests30d != 2 ||
snap.PulseIntelligenceMCPOperationsLoopStarterRequests30d != 1 {
t.Fatalf("workflow starter telemetry = %#v, want total 6, assistant 1, patrol 1, patrol-control 4, legacy pro activation 2, mcp 1", snap)
}
if !snap.PulseIntelligenceLoopConfigured {
t.Fatalf("Pulse Intelligence loop should be configured when an external-agent token exists: %#v", snap)
}
if !snap.PulseIntelligenceLoopActive30d {
t.Fatalf("Pulse Intelligence loop should be active when recent Assistant, Patrol, external-agent, or action activity exists: %#v", snap)
}
if !snap.PulseIntelligenceCompleteOperationsLoop30d {
t.Fatalf("Pulse Intelligence complete operations loop should be active when Patrol issue evidence, contextual collaboration, and governed action decisions all exist: %#v", snap)
}
if !snap.PulseIntelligenceApprovedExecutionLoop30d {
t.Fatalf("Pulse Intelligence approved-execution loop should be active when the complete loop includes an approved action attempt: %#v", snap)
}
if !snap.PulseIntelligenceResolvedOperationsLoop30d {
t.Fatalf("Pulse Intelligence resolved operations loop should be active when a Patrol finding has a linked, independently verified action resolution: %#v", snap)
}
if !snap.PulseIntelligencePatrolControlResolvedOperationsLoop30d {
t.Fatalf("Patrol-control resolved operations loop should be active when Patrol-control starter, issue evidence, contextual collaboration, approved decision, and verified outcome all exist: %#v", snap)
}
if !snap.PulseIntelligencePatrolControlCompletedOperationsLoop30d {
t.Fatalf("Patrol-control completed operations loop should be active when Patrol-control starter, issue evidence, contextual collaboration, and terminal decision proof all exist: %#v", snap)
}
if !snap.PulseIntelligencePatrolControlPaidCompletedOperationsLoop30d ||
!snap.PulseIntelligencePatrolControlPaidResolvedOperationsLoop30d {
t.Fatalf("paid Patrol-control loop cohorts should be active when paid posture and Patrol-control proof coexist: %#v", snap)
}
if !snap.PulseIntelligenceProActivationCompletedOperationsLoop30d ||
!snap.PulseIntelligenceProActivationResolvedOperationsLoop30d ||
!snap.PulseIntelligenceProActivationPaidCompletedOperationsLoop30d ||
!snap.PulseIntelligenceProActivationPaidResolvedOperationsLoop30d {
t.Fatalf("legacy Pro-activation cohorts should mirror Patrol-control proof for continuity: %#v", snap)
}
if !snap.PulseIntelligenceGovernedActionActive30d {
t.Fatalf("Pulse Intelligence governed-action loop should be active when recent action/approval records exist: %#v", snap)
}
if !snap.PulseIntelligenceAssistantOperationsLoop30d ||
!snap.PulseIntelligenceAssistantApprovedExecutionLoop30d ||
!snap.PulseIntelligenceAssistantApprovedActionSuccessLoop30d ||
!snap.PulseIntelligenceAssistantResolvedOperationsLoop30d {
t.Fatalf("Assistant source-specific loop evidence should be active when Assistant collaboration completes the loop: %#v", snap)
}
if !snap.PulseIntelligenceExternalAgentOperationsLoop30d ||
!snap.PulseIntelligenceExternalAgentApprovedExecutionLoop30d ||
!snap.PulseIntelligenceExternalAgentApprovedActionSuccessLoop30d ||
!snap.PulseIntelligenceExternalAgentResolvedOperationsLoop30d {
t.Fatalf("external-agent source-specific loop evidence should be active when external-agent collaboration completes the loop: %#v", snap)
}
if !snap.PulseIntelligenceMCPAdapterOperationsLoop30d ||
!snap.PulseIntelligenceMCPAdapterApprovedExecutionLoop30d ||
!snap.PulseIntelligenceMCPAdapterApprovedActionSuccessLoop30d ||
!snap.PulseIntelligenceMCPAdapterResolvedOperationsLoop30d {
t.Fatalf("MCP adapter source-specific loop evidence should be active when pulse-mcp collaboration completes the loop: %#v", snap)
}
}
func TestApplyPulseIntelligenceTelemetrySnapshot_OperationsLoopStarterIsActiveNotComplete(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
persistence := config.NewConfigPersistence(t.TempDir())
if err := persistence.SaveWorkflowPromptActivityHistory([]config.WorkflowPromptActivityRecord{{
Timestamp: now.Add(-time.Hour),
Surface: config.WorkflowPromptActivitySurfacePulseAssistant,
PromptName: agentcapabilities.PulseWorkflowPromptOperationsLoop,
}}); err != nil {
t.Fatalf("SaveWorkflowPromptActivityHistory: %v", err)
}
snap := telemetry.Snapshot{AIEnabled: true}
applyPulseIntelligenceTelemetrySnapshot(&snap, persistence, nil, telemetry.PulseIntelligenceActionSnapshot{}, now)
if snap.PulseIntelligenceOperationsLoopStarterRequests30d != 1 ||
snap.PulseIntelligenceAssistantOperationsLoopStarterRequests30d != 1 ||
snap.PulseIntelligencePatrolOperationsLoopStarterRequests30d != 0 ||
snap.PulseIntelligencePatrolControlOperationsLoopStarterRequests30d != 0 ||
snap.PulseIntelligenceProActivationOperationsLoopStarterRequests30d != 0 ||
snap.PulseIntelligenceMCPOperationsLoopStarterRequests30d != 0 {
t.Fatalf("workflow starter telemetry = %#v, want one assistant operation-loop starter", snap)
}
if !snap.PulseIntelligenceLoopConfigured || !snap.PulseIntelligenceLoopActive30d {
t.Fatalf("starter use should configure and activate the Pulse Intelligence loop when AI is enabled: %#v", snap)
}
if snap.PulseIntelligenceCompleteOperationsLoop30d ||
snap.PulseIntelligenceApprovedExecutionLoop30d ||
snap.PulseIntelligenceResolvedOperationsLoop30d ||
snap.PulseIntelligencePatrolControlCompletedOperationsLoop30d ||
snap.PulseIntelligencePatrolControlResolvedOperationsLoop30d ||
snap.PulseIntelligenceProActivationCompletedOperationsLoop30d ||
snap.PulseIntelligenceProActivationResolvedOperationsLoop30d ||
snap.PulseIntelligenceGovernedActionActive30d ||
snap.PulseIntelligenceAssistantOperationsLoop30d ||
snap.PulseIntelligenceAssistantApprovedExecutionLoop30d ||
snap.PulseIntelligenceAssistantApprovedActionSuccessLoop30d ||
snap.PulseIntelligenceAssistantResolvedOperationsLoop30d ||
snap.PulseIntelligenceExternalAgentOperationsLoop30d ||
snap.PulseIntelligenceExternalAgentApprovedExecutionLoop30d ||
snap.PulseIntelligenceExternalAgentApprovedActionSuccessLoop30d ||
snap.PulseIntelligenceExternalAgentResolvedOperationsLoop30d ||
snap.PulseIntelligenceMCPAdapterOperationsLoop30d ||
snap.PulseIntelligenceMCPAdapterApprovedExecutionLoop30d ||
snap.PulseIntelligenceMCPAdapterApprovedActionSuccessLoop30d ||
snap.PulseIntelligenceMCPAdapterResolvedOperationsLoop30d {
t.Fatalf("starter-only activity must not satisfy completed, approved, resolved, or governed action loops: %#v", snap)
}
}
func TestApplyPulseIntelligenceAdoptionSnapshot_PatrolControlResolvedRequiresStatusProof(t *testing.T) {
base := telemetry.Snapshot{
PulseIntelligencePatrolControlOperationsLoopStarterRequests30d: 1,
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovedActionDecisions30d: 1,
PulseIntelligenceApprovedActionSuccesses30d: 1,
PulseIntelligenceVerifiedFindingResolutions30d: 1,
PulseIntelligenceExternalAgentEnabled: true,
PulseIntelligenceExternalAgentOperationsLoopReady: true,
}
tests := []struct {
name string
mut func(*telemetry.Snapshot)
want bool
}{
{
name: "complete status proof",
want: true,
},
{
name: "missing Patrol-control starter",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligencePatrolControlOperationsLoopStarterRequests30d = 0
},
},
{
name: "missing patrol issue evidence",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligencePatrolNewFindings30d = 0
},
},
{
name: "missing contextual collaboration",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceAssistantContextAICalls30d = 0
},
},
{
name: "approved success without approved decision",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceApprovedActionDecisions30d = 0
},
},
{
name: "approved decision without linked verified outcome",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceVerifiedFindingResolutions30d = 0
},
},
{
name: "MCP readiness is not required",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceExternalAgentOperationsLoopReady = false
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
snap := base
if tt.mut != nil {
tt.mut(&snap)
}
applyPulseIntelligenceAdoptionSnapshot(&snap)
if snap.PulseIntelligencePatrolControlResolvedOperationsLoop30d != tt.want {
t.Fatalf("PulseIntelligencePatrolControlResolvedOperationsLoop30d = %v, want %v: %#v",
snap.PulseIntelligencePatrolControlResolvedOperationsLoop30d,
tt.want,
snap,
)
}
if snap.PulseIntelligenceProActivationResolvedOperationsLoop30d != snap.PulseIntelligencePatrolControlResolvedOperationsLoop30d {
t.Fatalf("legacy Pro-activation resolved loop should mirror Patrol-control proof: %#v", snap)
}
})
}
}
func TestApplyPulseIntelligenceAdoptionSnapshot_PatrolControlCompletedIncludesRejectedDecision(t *testing.T) {
base := telemetry.Snapshot{
PulseIntelligencePatrolControlOperationsLoopStarterRequests30d: 1,
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceRejectedActionDecisions30d: 1,
PulseIntelligenceExternalAgentEnabled: true,
PulseIntelligenceExternalAgentOperationsLoopReady: true,
}
tests := []struct {
name string
mut func(*telemetry.Snapshot)
want bool
}{
{
name: "rejected governed decision completes the Patrol-control loop",
want: true,
},
{
name: "approved decision needs verified outcome",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceRejectedActionDecisions30d = 0
snap.PulseIntelligenceApprovedActionDecisions30d = 1
},
},
{
name: "approved decision with verified outcome completes the Patrol-control loop",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceRejectedActionDecisions30d = 0
snap.PulseIntelligenceApprovedActionDecisions30d = 1
snap.PulseIntelligenceApprovedActionSuccesses30d = 1
snap.PulseIntelligenceVerifiedFindingResolutions30d = 1
},
want: true,
},
{
name: "starter is required",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligencePatrolControlOperationsLoopStarterRequests30d = 0
},
},
{
name: "patrol issue evidence is required",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligencePatrolNewFindings30d = 0
},
},
{
name: "contextual collaboration is required",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceAssistantContextAICalls30d = 0
},
},
{
name: "MCP readiness is not required",
mut: func(snap *telemetry.Snapshot) {
snap.PulseIntelligenceExternalAgentOperationsLoopReady = false
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
snap := base
if tt.mut != nil {
tt.mut(&snap)
}
applyPulseIntelligenceAdoptionSnapshot(&snap)
if snap.PulseIntelligencePatrolControlCompletedOperationsLoop30d != tt.want {
t.Fatalf("PulseIntelligencePatrolControlCompletedOperationsLoop30d = %v, want %v: %#v",
snap.PulseIntelligencePatrolControlCompletedOperationsLoop30d,
tt.want,
snap,
)
}
if snap.PulseIntelligenceProActivationCompletedOperationsLoop30d != snap.PulseIntelligencePatrolControlCompletedOperationsLoop30d {
t.Fatalf("legacy Pro-activation completed loop should mirror Patrol-control proof: %#v", snap)
}
if snap.PulseIntelligencePatrolControlResolvedOperationsLoop30d && snap.PulseIntelligenceRejectedActionDecisions30d > 0 {
t.Fatalf("rejected terminal decision must not set resolved-loop proof: %#v", snap)
}
})
}
}
func TestApplyPulseIntelligenceAdoptionSnapshot_PaidPatrolControlCohortsRequirePaidLicense(t *testing.T) {
verified := telemetry.Snapshot{
PulseIntelligencePatrolControlOperationsLoopStarterRequests30d: 1,
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovedActionDecisions30d: 1,
PulseIntelligenceApprovedActionSuccesses30d: 1,
PulseIntelligenceVerifiedFindingResolutions30d: 1,
PulseIntelligenceExternalAgentEnabled: true,
PulseIntelligenceExternalAgentOperationsLoopReady: true,
}
rejected := telemetry.Snapshot{
PulseIntelligencePatrolControlOperationsLoopStarterRequests30d: 1,
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceRejectedActionDecisions30d: 1,
PulseIntelligenceExternalAgentEnabled: true,
PulseIntelligenceExternalAgentOperationsLoopReady: true,
}
tests := []struct {
name string
snapshot telemetry.Snapshot
wantCompleted bool
wantResolved bool
}{
{
name: "paid verified loop records paid completed and paid resolved cohorts",
snapshot: func() telemetry.Snapshot { s := verified; s.PaidLicense = true; return s }(),
wantCompleted: true,
wantResolved: true,
},
{
name: "paid rejected terminal loop records paid completed only",
snapshot: func() telemetry.Snapshot { s := rejected; s.PaidLicense = true; return s }(),
wantCompleted: true,
},
{
name: "free verified loop does not record paid cohorts",
snapshot: verified,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
snap := tt.snapshot
applyPulseIntelligenceAdoptionSnapshot(&snap)
if snap.PulseIntelligencePatrolControlPaidCompletedOperationsLoop30d != tt.wantCompleted {
t.Fatalf("PulseIntelligencePatrolControlPaidCompletedOperationsLoop30d = %v, want %v: %#v",
snap.PulseIntelligencePatrolControlPaidCompletedOperationsLoop30d,
tt.wantCompleted,
snap,
)
}
if snap.PulseIntelligencePatrolControlPaidResolvedOperationsLoop30d != tt.wantResolved {
t.Fatalf("PulseIntelligencePatrolControlPaidResolvedOperationsLoop30d = %v, want %v: %#v",
snap.PulseIntelligencePatrolControlPaidResolvedOperationsLoop30d,
tt.wantResolved,
snap,
)
}
if snap.PulseIntelligenceProActivationPaidCompletedOperationsLoop30d != snap.PulseIntelligencePatrolControlPaidCompletedOperationsLoop30d ||
snap.PulseIntelligenceProActivationPaidResolvedOperationsLoop30d != snap.PulseIntelligencePatrolControlPaidResolvedOperationsLoop30d {
t.Fatalf("legacy Pro-activation paid cohorts should mirror Patrol-control paid cohorts: %#v", snap)
}
})
}
}
func TestPulseIntelligenceExternalAgentActivityRecognizesContentFreeCollaboration(t *testing.T) {
if pulseIntelligenceExternalAgentActivity(nil) {
t.Fatal("nil snapshot should not report external-agent activity")
}
if !pulseIntelligenceExternalAgentActivity(&telemetry.Snapshot{
PulseIntelligenceExternalAgentContextRequests30d: 1,
}) {
t.Fatal("context request count should report external-agent collaboration")
}
if !pulseIntelligenceExternalAgentActivity(&telemetry.Snapshot{
PulseIntelligenceMCPAdapterUsed30d: true,
}) {
t.Fatal("MCP adapter marker should report external-agent collaboration")
}
}
func TestApplyPulseIntelligenceTelemetrySnapshot_DoesNotPromoteOrdinaryAIToken(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
lastUsed := now.Add(-time.Hour)
cfg := &config.Config{
APITokens: []config.APITokenRecord{
{Scopes: []string{config.ScopeAIChat}, LastUsedAt: &lastUsed, CreatedAt: now.Add(-2 * time.Hour)},
},
}
snap := telemetry.Snapshot{}
applyPulseIntelligenceTelemetrySnapshot(&snap, nil, cfg, telemetry.PulseIntelligenceActionSnapshot{}, now)
if snap.PulseIntelligenceExternalAgentEnabled || snap.PulseIntelligenceExternalAgentUsed30d {
t.Fatalf("ordinary AI token should not be treated as external-agent capable: %#v", snap)
}
if snap.PulseIntelligenceLoopConfigured || snap.PulseIntelligenceLoopActive30d ||
snap.PulseIntelligenceCompleteOperationsLoop30d ||
snap.PulseIntelligenceApprovedExecutionLoop30d ||
snap.PulseIntelligenceResolvedOperationsLoop30d ||
snap.PulseIntelligenceGovernedActionActive30d {
t.Fatalf("ordinary AI token should not set Pulse Intelligence adoption state: %#v", snap)
}
}
func TestApplyPulseIntelligenceTelemetrySnapshot_PromotesReadOnlyMCPTokenAsConfiguredOnly(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
expiredAt := now.Add(-time.Minute)
cfg := &config.Config{
APITokens: []config.APITokenRecord{
{Scopes: []string{config.ScopeMonitoringRead}, CreatedAt: now.Add(-2 * time.Hour)},
{Scopes: []string{config.ScopeSettingsWrite}, ExpiresAt: &expiredAt, CreatedAt: now.Add(-3 * time.Hour)},
},
}
snap := telemetry.Snapshot{}
applyPulseIntelligenceTelemetrySnapshot(&snap, config.NewConfigPersistence(t.TempDir()), cfg, telemetry.PulseIntelligenceActionSnapshot{}, now)
if !snap.PulseIntelligenceExternalAgentEnabled {
t.Fatalf("read-only MCP-capable token should configure the external-agent surface: %#v", snap)
}
if snap.PulseIntelligenceExternalAgentOperationsLoopReady {
t.Fatalf("read-only MCP-capable token must not satisfy full operations-loop readiness: %#v", snap)
}
if snap.PulseIntelligenceExternalAgentUsed30d {
t.Fatalf("configured MCP-capable token should not count as external-agent activity without route activity: %#v", snap)
}
if !snap.PulseIntelligenceLoopConfigured ||
snap.PulseIntelligenceLoopActive30d ||
snap.PulseIntelligenceCompleteOperationsLoop30d ||
snap.PulseIntelligenceApprovedExecutionLoop30d ||
snap.PulseIntelligenceResolvedOperationsLoop30d {
t.Fatalf("configured but unused MCP-capable token should configure, not activate, the Pulse Intelligence loop: %#v", snap)
}
}
func TestApplyPulseIntelligenceTelemetrySnapshot_PromotesFullMCPTokenAsOperationsLoopReady(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
cfg := &config.Config{
APITokens: []config.APITokenRecord{
{
Scopes: pulseIntelligenceExternalAgentSurfaceScopes(agentcapabilities.CanonicalManifest()),
CreatedAt: now.Add(-2 * time.Hour),
},
},
}
snap := telemetry.Snapshot{}
applyPulseIntelligenceTelemetrySnapshot(&snap, config.NewConfigPersistence(t.TempDir()), cfg, telemetry.PulseIntelligenceActionSnapshot{}, now)
if !snap.PulseIntelligenceExternalAgentEnabled ||
!snap.PulseIntelligenceExternalAgentOperationsLoopReady {
t.Fatalf("full Pulse MCP token should configure and ready the operations loop: %#v", snap)
}
}
func TestApplyPulseIntelligenceTelemetrySnapshot_DoesNotCombinePartialMCPTokensForOperationsLoopReadiness(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
surfaceScopes := pulseIntelligenceExternalAgentSurfaceScopes(agentcapabilities.CanonicalManifest())
if len(surfaceScopes) < 2 {
t.Fatalf("Pulse MCP operations loop should require multiple scopes, got %v", surfaceScopes)
}
cfg := &config.Config{
APITokens: []config.APITokenRecord{
{Scopes: []string{surfaceScopes[0]}, CreatedAt: now.Add(-2 * time.Hour)},
{Scopes: []string{surfaceScopes[1]}, CreatedAt: now.Add(-time.Hour)},
},
}
snap := telemetry.Snapshot{}
applyPulseIntelligenceTelemetrySnapshot(&snap, config.NewConfigPersistence(t.TempDir()), cfg, telemetry.PulseIntelligenceActionSnapshot{}, now)
if !snap.PulseIntelligenceExternalAgentEnabled {
t.Fatalf("partial Pulse MCP tokens should still configure the external-agent surface: %#v", snap)
}
if snap.PulseIntelligenceExternalAgentOperationsLoopReady {
t.Fatalf("split partial Pulse MCP tokens must not satisfy full operations-loop readiness: %#v", snap)
}
}
func TestApplyPulseIntelligenceTelemetrySnapshot_DoesNotInferExternalAgentUsageFromGenericTokenLastUse(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
lastUsed := now.Add(-time.Hour)
cfg := &config.Config{
APITokens: []config.APITokenRecord{
{Scopes: []string{config.ScopeWildcard}, LastUsedAt: &lastUsed, CreatedAt: now.Add(-2 * time.Hour)},
},
}
snap := telemetry.Snapshot{}
applyPulseIntelligenceTelemetrySnapshot(&snap, config.NewConfigPersistence(t.TempDir()), cfg, telemetry.PulseIntelligenceActionSnapshot{}, now)
if !snap.PulseIntelligenceExternalAgentEnabled {
t.Fatalf("external-agent capable token should configure the surface: %#v", snap)
}
if !snap.PulseIntelligenceExternalAgentOperationsLoopReady {
t.Fatalf("wildcard token should satisfy full operations-loop readiness: %#v", snap)
}
if snap.PulseIntelligenceExternalAgentUsed30d {
t.Fatalf("generic token last-use should not count as external-agent activity without route activity: %#v", snap)
}
if !snap.PulseIntelligenceLoopConfigured ||
snap.PulseIntelligenceLoopActive30d ||
snap.PulseIntelligenceCompleteOperationsLoop30d ||
snap.PulseIntelligenceApprovedExecutionLoop30d ||
snap.PulseIntelligenceResolvedOperationsLoop30d {
t.Fatalf("configured but unused external-agent surface should not activate the 30-day loop: %#v", snap)
}
}
func TestApplyPulseIntelligenceTelemetrySnapshot_DerivesConfiguredWithoutRecentActivity(t *testing.T) {
now := time.Date(2026, 6, 20, 9, 30, 0, 0, time.UTC)
snap := telemetry.Snapshot{
AIEnabled: true,
PatrolEnabled: true,
AIActionsEnabled: true,
}
applyPulseIntelligenceTelemetrySnapshot(&snap, nil, nil, telemetry.PulseIntelligenceActionSnapshot{}, now)
if !snap.PulseIntelligenceLoopConfigured {
t.Fatalf("enabled Assistant/Patrol/action settings should configure the Pulse Intelligence loop: %#v", snap)
}
if snap.PulseIntelligenceLoopActive30d {
t.Fatalf("configured settings without recent usage should not count as 30-day activity: %#v", snap)
}
if snap.PulseIntelligenceCompleteOperationsLoop30d {
t.Fatalf("configured settings without recent usage should not count as complete operations-loop activity: %#v", snap)
}
if snap.PulseIntelligenceApprovedExecutionLoop30d {
t.Fatalf("configured settings without recent usage should not count as approved-execution loop activity: %#v", snap)
}
if snap.PulseIntelligenceResolvedOperationsLoop30d {
t.Fatalf("configured settings without recent usage should not count as resolved operations-loop activity: %#v", snap)
}
if snap.PulseIntelligenceGovernedActionActive30d {
t.Fatalf("enabled action settings without action audit records should not count as governed-action activity: %#v", snap)
}
}
func TestApplyPulseIntelligenceAdoptionSnapshot_SourceSpecificLoopEvidence(t *testing.T) {
tests := []struct {
name string
snap telemetry.Snapshot
wantAssistantLoop bool
wantAssistantResolved bool
wantExternalLoop bool
wantExternalResolved bool
wantMCPLoop bool
wantMCPResolved bool
}{
{
name: "assistant collaboration stays first party",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligencePatrolResolvedFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovalRequests30d: 1,
PulseIntelligenceApprovedActionDecisions30d: 1,
PulseIntelligenceApprovedActionAttempts30d: 1,
PulseIntelligenceApprovedActionSuccesses30d: 1,
PulseIntelligenceVerifiedFindingResolutions30d: 1,
},
wantAssistantLoop: true,
wantAssistantResolved: true,
},
{
name: "external agent activity stays outside mcp subset",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligencePatrolResolvedFindings30d: 1,
PulseIntelligenceExternalAgentContextRequests30d: 1,
PulseIntelligenceApprovalRequests30d: 1,
PulseIntelligenceApprovedActionDecisions30d: 1,
PulseIntelligenceApprovedActionAttempts30d: 1,
PulseIntelligenceApprovedActionSuccesses30d: 1,
PulseIntelligenceVerifiedFindingResolutions30d: 1,
},
wantExternalLoop: true,
wantExternalResolved: true,
},
{
name: "pulse mcp is the mcp subset and external-agent umbrella",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligencePatrolResolvedFindings30d: 1,
PulseIntelligenceMCPAdapterUsed30d: true,
PulseIntelligenceApprovalRequests30d: 1,
PulseIntelligenceApprovedActionDecisions30d: 1,
PulseIntelligenceApprovedActionAttempts30d: 1,
PulseIntelligenceApprovedActionSuccesses30d: 1,
PulseIntelligenceVerifiedFindingResolutions30d: 1,
},
wantExternalLoop: true,
wantExternalResolved: true,
wantMCPLoop: true,
wantMCPResolved: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
snap := tt.snap
applyPulseIntelligenceAdoptionSnapshot(&snap)
if snap.PulseIntelligenceAssistantOperationsLoop30d != tt.wantAssistantLoop ||
snap.PulseIntelligenceAssistantApprovedExecutionLoop30d != tt.wantAssistantLoop ||
snap.PulseIntelligenceAssistantApprovedActionSuccessLoop30d != tt.wantAssistantResolved ||
snap.PulseIntelligenceAssistantResolvedOperationsLoop30d != tt.wantAssistantResolved {
t.Fatalf("Assistant loop evidence mismatch: %#v", snap)
}
if snap.PulseIntelligenceExternalAgentOperationsLoop30d != tt.wantExternalLoop ||
snap.PulseIntelligenceExternalAgentApprovedExecutionLoop30d != tt.wantExternalLoop ||
snap.PulseIntelligenceExternalAgentApprovedActionSuccessLoop30d != tt.wantExternalResolved ||
snap.PulseIntelligenceExternalAgentResolvedOperationsLoop30d != tt.wantExternalResolved {
t.Fatalf("external-agent loop evidence mismatch: %#v", snap)
}
if snap.PulseIntelligenceMCPAdapterOperationsLoop30d != tt.wantMCPLoop ||
snap.PulseIntelligenceMCPAdapterApprovedExecutionLoop30d != tt.wantMCPLoop ||
snap.PulseIntelligenceMCPAdapterApprovedActionSuccessLoop30d != tt.wantMCPResolved ||
snap.PulseIntelligenceMCPAdapterResolvedOperationsLoop30d != tt.wantMCPResolved {
t.Fatalf("MCP adapter loop evidence mismatch: %#v", snap)
}
})
}
}
func TestApplyPulseIntelligenceAdoptionSnapshot_CompleteLoopRequiresIssueEvidenceCollaborationAndDecision(t *testing.T) {
tests := []struct {
name string
snap telemetry.Snapshot
wantActive bool
wantComplete bool
wantApproved bool
wantResolved bool
}{
{
name: "generic assistant and governed action is active but incomplete",
snap: telemetry.Snapshot{
PulseIntelligenceAssistantAICalls30d: 3,
PulseIntelligenceActionPlans30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol and governed action without contextual collaboration is incomplete",
snap: telemetry.Snapshot{
PulseIntelligencePatrolRuns30d: 1,
PulseIntelligenceActionPlans30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol and contextual collaboration without governed action is incomplete",
snap: telemetry.Snapshot{
PulseIntelligencePatrolRuns30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol run assistant tool collaboration and approval request is active but incomplete",
snap: telemetry.Snapshot{
PulseIntelligencePatrolRuns30d: 1,
PulseIntelligenceAssistantToolCalls30d: 2,
PulseIntelligenceApprovalRequests30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol issue assistant collaboration and rejected action decision completes governed action only",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceRejectedActionDecisions30d: 1,
},
wantActive: true,
wantComplete: true,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol issue assistant collaboration and approved action decision completes without execution",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovedActionDecisions30d: 1,
},
wantActive: true,
wantComplete: true,
wantApproved: false,
wantResolved: false,
},
{
name: "generic patrol run with approved action attempt remains incomplete without issue evidence",
snap: telemetry.Snapshot{
PulseIntelligencePatrolRuns30d: 1,
PulseIntelligenceExternalAgentUsed30d: true,
PulseIntelligenceApprovedActionAttempts30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol issue external-agent collaboration and governed action completes the loop",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceExternalAgentUsed30d: true,
PulseIntelligenceApprovedActionAttempts30d: 1,
},
wantActive: true,
wantComplete: true,
wantApproved: true,
wantResolved: false,
},
{
name: "patrol issue external-agent capability activity and governed action completes the loop",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceExternalAgentContextRequests30d: 1,
PulseIntelligenceApprovedActionAttempts30d: 1,
},
wantActive: true,
wantComplete: true,
wantApproved: true,
wantResolved: false,
},
{
name: "patrol issue MCP adapter collaboration and governed action completes the loop",
snap: telemetry.Snapshot{
PulseIntelligencePatrolNewFindings30d: 1,
PulseIntelligenceMCPAdapterUsed30d: true,
PulseIntelligenceApprovedActionAttempts30d: 1,
},
wantActive: true,
wantComplete: true,
wantApproved: true,
wantResolved: false,
},
{
name: "external-agent capability activity without patrol is active but incomplete",
snap: telemetry.Snapshot{
PulseIntelligenceExternalAgentActionRequests30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol AI call assistant context and approval request is active but incomplete",
snap: telemetry.Snapshot{
PulseIntelligencePatrolAICalls30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovalRequests30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "patrol investigation assistant context and approval request waits for a decision",
snap: telemetry.Snapshot{
PulseIntelligencePatrolInvestigations30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovalRequests30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
{
name: "resolved operations loop requires linked independently verified finding resolution",
snap: telemetry.Snapshot{
PulseIntelligencePatrolResolvedFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovedActionAttempts30d: 1,
PulseIntelligenceApprovedActionSuccesses30d: 1,
PulseIntelligenceVerifiedFindingResolutions30d: 1,
},
wantActive: true,
wantComplete: true,
wantApproved: true,
wantResolved: true,
},
{
name: "unlinked finding resolution and action success do not resolve",
snap: telemetry.Snapshot{
PulseIntelligencePatrolResolvedFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovedActionAttempts30d: 1,
PulseIntelligenceApprovedActionSuccesses30d: 1,
},
wantActive: true,
wantComplete: true,
wantApproved: true,
wantResolved: false,
},
{
name: "patrol resolution without governed action decision does not complete or resolve the operations loop",
snap: telemetry.Snapshot{
PulseIntelligencePatrolResolvedFindings30d: 1,
PulseIntelligenceAssistantContextAICalls30d: 1,
PulseIntelligenceApprovalRequests30d: 1,
},
wantActive: true,
wantComplete: false,
wantApproved: false,
wantResolved: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
snap := tt.snap
applyPulseIntelligenceAdoptionSnapshot(&snap)
if snap.PulseIntelligenceLoopActive30d != tt.wantActive {
t.Fatalf("PulseIntelligenceLoopActive30d = %v, want %v: %#v",
snap.PulseIntelligenceLoopActive30d,
tt.wantActive,
snap,
)
}
if snap.PulseIntelligenceCompleteOperationsLoop30d != tt.wantComplete {
t.Fatalf("PulseIntelligenceCompleteOperationsLoop30d = %v, want %v: %#v",
snap.PulseIntelligenceCompleteOperationsLoop30d,
tt.wantComplete,
snap,
)
}
if snap.PulseIntelligenceApprovedExecutionLoop30d != tt.wantApproved {
t.Fatalf("PulseIntelligenceApprovedExecutionLoop30d = %v, want %v: %#v",
snap.PulseIntelligenceApprovedExecutionLoop30d,
tt.wantApproved,
snap,
)
}
if snap.PulseIntelligenceResolvedOperationsLoop30d != tt.wantResolved {
t.Fatalf("PulseIntelligenceResolvedOperationsLoop30d = %v, want %v: %#v",
snap.PulseIntelligenceResolvedOperationsLoop30d,
tt.wantResolved,
snap,
)
}
})
}
}
// Patrol run volume must reflect every run in the window, not the operator
// history cap the runs are stored under.
func TestApplyPulseIntelligencePatrolRunSnapshotIgnoresHistoryCap(t *testing.T) {
persistence := config.NewConfigPersistence(t.TempDir())
now := time.Now().UTC()
since := now.AddDate(0, 0, -30)
const historyCap = 100
total := 0
runs := make([]config.PatrolRunRecord, 0, historyCap)
for at := now.AddDate(0, 0, -2); at.Before(now); at = at.Add(10 * time.Minute) {
runs = append([]config.PatrolRunRecord{{ID: at.Format(time.RFC3339Nano), StartedAt: at, CompletedAt: at}}, runs...)
if len(runs) > historyCap {
runs = runs[:historyCap]
}
total++
if err := persistence.SavePatrolRunHistory(runs); err != nil {
t.Fatalf("SavePatrolRunHistory: %v", err)
}
}
if total <= historyCap {
t.Fatalf("test needs more runs than the cap, got %d", total)
}
snap := &telemetry.Snapshot{}
applyPulseIntelligencePatrolRunSnapshot(snap, persistence, since)
if snap.PulseIntelligencePatrolRuns30d != total {
t.Fatalf("PulseIntelligencePatrolRuns30d = %d, want %d", snap.PulseIntelligencePatrolRuns30d, total)
}
}
// The Patrol blocked cause must ride the router snapshot into the outbound
// ping unchanged, so a blocked install is distinguishable in the fleet from
// one whose Patrol runs and finds nothing.
func TestApplyPulseIntelligenceTelemetrySnapshotCarriesPatrolBlockedCause(t *testing.T) {
snap := &telemetry.Snapshot{}
actionSnapshot := telemetry.PulseIntelligenceActionSnapshot{
PatrolBlockedCause: "provider_not_configured",
}
applyPulseIntelligenceTelemetrySnapshot(snap, nil, nil, actionSnapshot, time.Now().UTC())
if snap.PulseIntelligencePatrolBlockedCause != "provider_not_configured" {
t.Fatalf("PulseIntelligencePatrolBlockedCause = %q, want provider_not_configured", snap.PulseIntelligencePatrolBlockedCause)
}
}
func TestApplyPulseIntelligenceTelemetrySnapshotSchemaV17DefaultsWithoutPersistence(t *testing.T) {
snap := &telemetry.Snapshot{}
applyPulseIntelligenceTelemetrySnapshot(snap, nil, nil, telemetry.PulseIntelligenceActionSnapshot{}, time.Now().UTC())
if snap.AIProviderClass != telemetry.AIProviderClassNone {
t.Fatalf("AIProviderClass = %q, want none", snap.AIProviderClass)
}
if snap.PulseIntelligencePatrolAutonomyLevel != "monitor" {
t.Fatalf("PulseIntelligencePatrolAutonomyLevel = %q, want monitor", snap.PulseIntelligencePatrolAutonomyLevel)
}
if snap.PulseIntelligencePatrolInputTokensBucket30d != telemetry.PatrolTokenBucketZero ||
snap.PulseIntelligencePatrolOutputTokensBucket30d != telemetry.PatrolTokenBucketZero {
t.Fatalf("token buckets = %q/%q, want zero/zero", snap.PulseIntelligencePatrolInputTokensBucket30d, snap.PulseIntelligencePatrolOutputTokensBucket30d)
}
// A pre-existing provider class from the config pass must survive.
snap = &telemetry.Snapshot{AIProviderClass: telemetry.AIProviderClassLocal}
applyPulseIntelligenceTelemetrySnapshot(snap, nil, nil, telemetry.PulseIntelligenceActionSnapshot{PatrolAutonomyLevel: "garbage"}, time.Now().UTC())
if snap.AIProviderClass != telemetry.AIProviderClassLocal || snap.PulseIntelligencePatrolAutonomyLevel != "monitor" {
t.Fatalf("provider class/autonomy = %q/%q, want local/monitor", snap.AIProviderClass, snap.PulseIntelligencePatrolAutonomyLevel)
}
}