mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-10 02:25:56 +00:00
2674 lines
123 KiB
Python
2674 lines
123 KiB
Python
#!/usr/bin/env python3
|
|
"""Unit tests for telemetry_adoption_report."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime, timedelta, timezone
|
|
from pathlib import Path
|
|
import gzip
|
|
import json
|
|
import sqlite3
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import time
|
|
import unittest
|
|
from unittest import mock
|
|
|
|
|
|
SCRIPT_DIR = Path(__file__).resolve().parents[1]
|
|
REPO_ROOT = SCRIPT_DIR.parent
|
|
sys.path.insert(0, str(SCRIPT_DIR))
|
|
|
|
import telemetry_adoption_report as report
|
|
|
|
|
|
class TelemetryAdoptionReportTest(unittest.TestCase):
|
|
def test_normalize_reported_version_strips_v_prefix(self) -> None:
|
|
self.assertEqual(report.normalize_reported_version("v6.0.0-rc.1"), "6.0.0-rc.1")
|
|
|
|
def test_normalize_reported_version_converts_git_describe(self) -> None:
|
|
self.assertEqual(
|
|
report.normalize_reported_version("v6.0.0-rc.1-45-gABCDEF"),
|
|
"6.0.0-rc.1+git.45.gabcdef",
|
|
)
|
|
|
|
def test_fetch_rows_remote_parses_json_lines_stream(self) -> None:
|
|
db_stats = {"latest_ping": "2026-07-17 00:00:00", "total_rows": 2, "total_distinct_installs": 2}
|
|
rows = [
|
|
{"install_id": "a", "received_at": "2026-07-17 00:00:00"},
|
|
{"install_id": "b", "received_at": "2026-07-16 00:00:00"},
|
|
]
|
|
analysis_facts = [
|
|
{
|
|
"install_id": "a",
|
|
"latest_received_at": "2026-07-17 00:00:00",
|
|
"first_free_at": "2026-07-17 00:00:00",
|
|
"first_paid_at": None,
|
|
"signal_fields": [],
|
|
"free_signal_fields": [],
|
|
}
|
|
]
|
|
first_counts = [0] * len(report.TARGET_RELEASE_ACTIVITY_COUNT_FIELDS)
|
|
increase_totals = list(first_counts)
|
|
increase_totals[0] = 2
|
|
decrease_totals = list(first_counts)
|
|
target_release_facts = [
|
|
{
|
|
"version": "6.3.0-rc.3",
|
|
"install_id": "a",
|
|
"heartbeat_count": 2,
|
|
"same_version_pair_count": 1,
|
|
"first_received_at": "2026-07-16 23:00:00",
|
|
"latest_received_at": "2026-07-17 00:00:00",
|
|
"latest_schema_version": 14,
|
|
"latest_known_install_age_bucket": "31_90d",
|
|
"first_counts": first_counts,
|
|
"increase_totals": increase_totals,
|
|
"decrease_totals": decrease_totals,
|
|
}
|
|
]
|
|
stdout = "\n".join(
|
|
[
|
|
json.dumps(
|
|
{
|
|
"db_stats": db_stats,
|
|
"row_columns": list(report.REPORT_ROW_COLUMNS),
|
|
"unavailable_columns": [],
|
|
}
|
|
),
|
|
*(
|
|
json.dumps(
|
|
{
|
|
"a": [
|
|
fact["install_id"],
|
|
fact["latest_received_at"],
|
|
fact["first_free_at"],
|
|
fact["first_paid_at"],
|
|
fact["signal_fields"],
|
|
fact["free_signal_fields"],
|
|
]
|
|
}
|
|
)
|
|
for fact in analysis_facts
|
|
),
|
|
*(
|
|
json.dumps(
|
|
{
|
|
"t": [
|
|
fact["version"],
|
|
fact["install_id"],
|
|
fact["heartbeat_count"],
|
|
fact["same_version_pair_count"],
|
|
fact["first_received_at"],
|
|
fact["latest_received_at"],
|
|
fact["latest_schema_version"],
|
|
fact["latest_known_install_age_bucket"],
|
|
fact["first_counts"],
|
|
fact["increase_totals"],
|
|
fact["decrease_totals"],
|
|
]
|
|
}
|
|
)
|
|
for fact in target_release_facts
|
|
),
|
|
*(
|
|
json.dumps(
|
|
{
|
|
"r": [row.get(column) for column in report.REPORT_ROW_COLUMNS]
|
|
}
|
|
)
|
|
for row in rows
|
|
),
|
|
"",
|
|
]
|
|
)
|
|
completed = subprocess.CompletedProcess(
|
|
args=[],
|
|
returncode=0,
|
|
stdout=gzip.compress(stdout.encode("utf-8")),
|
|
stderr=b"",
|
|
)
|
|
with mock.patch.object(report.subprocess, "run", return_value=completed) as run_mock:
|
|
result = report.fetch_rows_remote(
|
|
"pulse-license",
|
|
"/opt/licenses.sqlite",
|
|
30,
|
|
target_version="v6.3.0-rc.3",
|
|
)
|
|
expanded_rows = [
|
|
{column: row.get(column) for column in report.REPORT_ROW_COLUMNS}
|
|
for row in rows
|
|
]
|
|
self.assertEqual(
|
|
result,
|
|
{
|
|
"db_stats": db_stats,
|
|
"rows": expanded_rows,
|
|
"pulse_intelligence_analysis_facts": analysis_facts,
|
|
"target_release_analysis_facts": target_release_facts,
|
|
"unavailable_columns": [],
|
|
},
|
|
)
|
|
remote_script = run_mock.call_args.kwargs["input"].decode("utf-8")
|
|
self.assertNotIn("fetchall", remote_script)
|
|
self.assertNotIn("SELECT *", remote_script)
|
|
self.assertIn("received_at >= datetime('now', ?)", remote_script)
|
|
self.assertEqual(
|
|
run_mock.call_args.args[0][-5],
|
|
",".join(report.REPORT_ROW_COLUMNS),
|
|
)
|
|
self.assertEqual(
|
|
run_mock.call_args.args[0][-4],
|
|
",".join(report.REPORT_HISTORY_SIGNAL_COLUMNS),
|
|
)
|
|
self.assertEqual(run_mock.call_args.args[0][-3], "6.3.0-rc.3")
|
|
self.assertEqual(
|
|
run_mock.call_args.args[0][-2],
|
|
",".join(report.TARGET_RELEASE_ACTIVITY_COUNT_FIELDS),
|
|
)
|
|
self.assertEqual(run_mock.call_args.args[0][-1], "")
|
|
self.assertIn("ROW_NUMBER() OVER (", remote_script)
|
|
self.assertIn("GROUP BY install_id", remote_script)
|
|
self.assertIn("MIN(CASE WHEN paid_license = 0", remote_script)
|
|
self.assertIn("target_analysis_sql", remote_script)
|
|
self.assertIn("PRAGMA table_info(telemetry_pings)", remote_script)
|
|
self.assertIn("0 AS \" + name", remote_script)
|
|
compile(remote_script, "<telemetry-remote-fetch>", "exec")
|
|
|
|
def test_report_projection_and_signal_specs_cover_recent_schema_fields(self) -> None:
|
|
recent_count_fields = {
|
|
"availability_probe_targets",
|
|
"availability_probe_agents",
|
|
"rbac_custom_roles",
|
|
"rbac_user_assignments",
|
|
"audit_reads_30d",
|
|
"report_schedules",
|
|
"report_schedules_enabled",
|
|
"report_schedules_run_30d",
|
|
"agent_profiles",
|
|
"update_attempts_30d",
|
|
"update_successes_30d",
|
|
"update_failures_30d",
|
|
}
|
|
projected = set(report.REPORT_ROW_COLUMNS)
|
|
self.assertTrue(recent_count_fields <= projected)
|
|
self.assertIn("alert_ai_enabled", projected)
|
|
self.assertIn("update_last_failure_category", projected)
|
|
self.assertTrue(set(report.SERVICE_HEALTH_ROW_FIELDS) <= projected)
|
|
self.assertNotIn("business_estate", projected)
|
|
|
|
specs = {entry["field"]: entry for entry in report.telemetry_signal_specs()}
|
|
for field in recent_count_fields:
|
|
self.assertEqual(specs[field]["type"], "count")
|
|
self.assertEqual(specs[field]["group"], "deep")
|
|
self.assertEqual(specs["alert_ai_enabled"]["type"], "bool")
|
|
self.assertEqual(specs["alert_ai_enabled"]["group"], "deep")
|
|
|
|
def test_remote_target_release_query_executes_and_emits_compact_pair_deltas(self) -> None:
|
|
empty_header = gzip.compress(
|
|
(
|
|
json.dumps(
|
|
{
|
|
"db_stats": {},
|
|
"row_columns": list(report.REPORT_ROW_COLUMNS),
|
|
}
|
|
)
|
|
+ "\n"
|
|
).encode("utf-8")
|
|
)
|
|
completed = subprocess.CompletedProcess(
|
|
args=[],
|
|
returncode=0,
|
|
stdout=empty_header,
|
|
stderr=b"",
|
|
)
|
|
with mock.patch.object(report.subprocess, "run", return_value=completed) as run_mock:
|
|
report.fetch_rows_remote(
|
|
"pulse-license",
|
|
"/unused.sqlite",
|
|
7,
|
|
target_version="6.3.0-rc.3",
|
|
)
|
|
remote_script = run_mock.call_args.kwargs["input"]
|
|
|
|
numeric_columns = {
|
|
"schema_version",
|
|
"version_is_development",
|
|
"version_is_published_release",
|
|
"notification_failures_7d",
|
|
*(key for key, _ in report.ADOPTION_COUNT_FIELDS),
|
|
*(key for key, _ in report.FEATURE_BOOL_FIELDS),
|
|
*(key for key, _ in report.USER_BASE_BOOL_FIELDS),
|
|
*(key for key, _ in report.USER_BASE_COUNT_FIELDS),
|
|
*(key for key, _ in report.PULSE_INTELLIGENCE_BOOL_FIELDS),
|
|
*(key for key, _ in report.PULSE_INTELLIGENCE_COUNT_FIELDS),
|
|
}
|
|
column_definitions = ", ".join(
|
|
f"{column} {'INTEGER' if column in numeric_columns else 'TEXT'}"
|
|
for column in report.REPORT_ROW_COLUMNS
|
|
)
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "install-a",
|
|
"version": "6.3.0-rc.3",
|
|
"received_at": (now - timedelta(hours=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": 4,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"version": "6.3.0-rc.3",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": 6,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"version": "6.2.1",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": 6,
|
|
},
|
|
]
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
db_path = str(Path(temp_dir) / "telemetry.sqlite")
|
|
conn = sqlite3.connect(db_path)
|
|
try:
|
|
conn.execute(f"CREATE TABLE telemetry_pings ({column_definitions})")
|
|
for row in rows:
|
|
columns = ", ".join(row)
|
|
placeholders = ", ".join("?" for _ in row)
|
|
conn.execute(
|
|
f"INSERT INTO telemetry_pings ({columns}) VALUES ({placeholders})",
|
|
tuple(row.values()),
|
|
)
|
|
conn.commit()
|
|
finally:
|
|
conn.close()
|
|
|
|
result = subprocess.run(
|
|
[
|
|
sys.executable,
|
|
"-",
|
|
db_path,
|
|
"7",
|
|
",".join(report.REPORT_ROW_COLUMNS),
|
|
",".join(report.REPORT_HISTORY_SIGNAL_COLUMNS),
|
|
"6.3.0-rc.3",
|
|
",".join(report.TARGET_RELEASE_ACTIVITY_COUNT_FIELDS),
|
|
],
|
|
input=remote_script,
|
|
capture_output=True,
|
|
check=True,
|
|
)
|
|
|
|
records = [
|
|
json.loads(line)
|
|
for line in gzip.decompress(result.stdout).decode("utf-8").splitlines()
|
|
]
|
|
target_record = next(record["t"] for record in records if "t" in record)
|
|
alerts_index = report.TARGET_RELEASE_ACTIVITY_COUNT_FIELDS.index("alerts_fired_30d")
|
|
self.assertEqual(target_record[0], "6.3.0-rc.3")
|
|
self.assertEqual(target_record[2], 2)
|
|
self.assertEqual(target_record[3], 1)
|
|
self.assertEqual(target_record[8][alerts_index], 4)
|
|
self.assertEqual(target_record[9][alerts_index], 2)
|
|
self.assertEqual(target_record[10][alerts_index], 0)
|
|
|
|
def test_compact_intelligence_facts_match_full_history_analysis(self) -> None:
|
|
numeric_columns = {
|
|
"schema_version",
|
|
"version_is_development",
|
|
"version_is_published_release",
|
|
*(key for key, _ in report.ADOPTION_COUNT_FIELDS),
|
|
*(key for key, _ in report.FEATURE_BOOL_FIELDS),
|
|
*(key for key, _ in report.USER_BASE_BOOL_FIELDS),
|
|
*(key for key, _ in report.USER_BASE_COUNT_FIELDS),
|
|
*(key for key, _ in report.PULSE_INTELLIGENCE_BOOL_FIELDS),
|
|
*(key for key, _ in report.PULSE_INTELLIGENCE_COUNT_FIELDS),
|
|
}
|
|
column_definitions = ", ".join(
|
|
f"{column} {'INTEGER' if column in numeric_columns else 'TEXT'}"
|
|
for column in report.REPORT_ROW_COLUMNS
|
|
)
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "install-a",
|
|
"received_at": (now - timedelta(hours=6)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"paid_license": 0,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"received_at": (now - timedelta(hours=5)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"received_at": (now - timedelta(hours=4)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"paid_license": 0,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"received_at": (now - timedelta(hours=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"paid_license": 1,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"paid_license": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"paid_license": 1,
|
|
},
|
|
]
|
|
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
db_path = str(Path(temp_dir) / "telemetry.sqlite")
|
|
conn = sqlite3.connect(db_path)
|
|
try:
|
|
conn.execute(f"CREATE TABLE telemetry_pings ({column_definitions})")
|
|
for row in rows:
|
|
columns = ", ".join(row)
|
|
placeholders = ", ".join("?" for _ in row)
|
|
conn.execute(
|
|
f"INSERT INTO telemetry_pings ({columns}) VALUES ({placeholders})",
|
|
tuple(row.values()),
|
|
)
|
|
conn.commit()
|
|
finally:
|
|
conn.close()
|
|
|
|
fetched_rows = report.fetch_rows_local(db_path, 1)["rows"]
|
|
|
|
self.assertEqual(len(fetched_rows), len(rows))
|
|
facts = [
|
|
{
|
|
"install_id": "install-a",
|
|
"latest_received_at": rows[-1]["received_at"],
|
|
"first_free_at": rows[0]["received_at"],
|
|
"first_paid_at": rows[3]["received_at"],
|
|
"signal_fields": [
|
|
"pulse_intelligence_loop_configured",
|
|
"pulse_intelligence_approved_action_successes_30d",
|
|
],
|
|
"free_signal_fields": ["pulse_intelligence_loop_configured"],
|
|
}
|
|
]
|
|
self.assertEqual(
|
|
report.analyze_pulse_intelligence_facts(facts),
|
|
report.analyze_pulse_intelligence_rows(rows),
|
|
)
|
|
self.assertEqual(fetched_rows[0]["received_at"], rows[-1]["received_at"])
|
|
|
|
def test_fetch_rows_remote_rejects_empty_response(self) -> None:
|
|
completed = subprocess.CompletedProcess(
|
|
args=[],
|
|
returncode=0,
|
|
stdout=gzip.compress(b"\n"),
|
|
stderr=b"",
|
|
)
|
|
with mock.patch.object(report.subprocess, "run", return_value=completed):
|
|
with self.assertRaisesRegex(RuntimeError, "empty response"):
|
|
report.fetch_rows_remote("pulse-license", "/opt/licenses.sqlite", 30)
|
|
|
|
def test_classify_reported_version_requires_real_published_tag(self) -> None:
|
|
identity = report.classify_reported_version(
|
|
"v6.0.0-rc.2",
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
self.assertEqual(identity.version, "6.0.0-rc.2")
|
|
self.assertEqual(identity.channel, "rc")
|
|
self.assertFalse(identity.is_published_release)
|
|
|
|
def test_classify_row_version_uses_stored_identity_fields(self) -> None:
|
|
identity = report.classify_row_version(
|
|
{
|
|
"version": "6.0.0-rc.1",
|
|
"version_raw": "v6.0.0-rc.1-45-gABCDEF",
|
|
"version_channel": "rc",
|
|
"version_build": "git.45.gabcdef",
|
|
"version_is_development": 0,
|
|
"version_is_published_release": 1,
|
|
},
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
self.assertEqual(identity.version, "6.0.0-rc.1")
|
|
self.assertEqual(identity.raw_version, "v6.0.0-rc.1-45-gABCDEF")
|
|
self.assertEqual(identity.channel, "rc")
|
|
self.assertEqual(identity.build, "git.45.gabcdef")
|
|
self.assertFalse(identity.is_development)
|
|
self.assertTrue(identity.is_published_release)
|
|
|
|
def test_classify_row_version_still_requires_real_published_release(self) -> None:
|
|
identity = report.classify_row_version(
|
|
{
|
|
"version": "6.0.0-rc.2",
|
|
"version_channel": "rc",
|
|
"version_is_published_release": 1,
|
|
},
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
self.assertEqual(identity.version, "6.0.0-rc.2")
|
|
self.assertFalse(identity.is_published_release)
|
|
|
|
def test_latest_rc_version_uses_published_order_and_ignores_non_app_prereleases(self) -> None:
|
|
self.assertEqual(
|
|
report.latest_rc_version(
|
|
[
|
|
{
|
|
"version": "6.0.0-rc.1",
|
|
"is_prerelease": True,
|
|
"published_at": "2026-05-20T10:00:00Z",
|
|
},
|
|
{
|
|
"version": "6.0.0",
|
|
"is_prerelease": False,
|
|
"published_at": "2026-05-21T10:00:00Z",
|
|
},
|
|
{
|
|
"version": "helm-chart-5.1.33",
|
|
"is_prerelease": True,
|
|
"published_at": "2026-05-23T10:00:00Z",
|
|
},
|
|
{
|
|
"version": "6.0.0-rc.2",
|
|
"is_prerelease": True,
|
|
"published_at": "2026-05-22T10:00:00Z",
|
|
},
|
|
]
|
|
),
|
|
"6.0.0-rc.2",
|
|
)
|
|
|
|
def test_latest_target_release_version_prefers_latest_stable_release(self) -> None:
|
|
self.assertEqual(
|
|
report.latest_target_release_version(
|
|
[
|
|
{
|
|
"version": "6.1.2",
|
|
"is_prerelease": False,
|
|
"published_at": "2026-07-26T22:11:46Z",
|
|
},
|
|
{
|
|
"version": "6.2.0-rc.1",
|
|
"is_prerelease": True,
|
|
"published_at": "2026-07-27T08:00:00Z",
|
|
},
|
|
{
|
|
"version": "helm-chart-6.1.2",
|
|
"is_prerelease": False,
|
|
"published_at": "2026-07-27T09:00:00Z",
|
|
},
|
|
]
|
|
),
|
|
"6.1.2",
|
|
)
|
|
|
|
def test_latest_target_release_version_falls_back_to_latest_rc(self) -> None:
|
|
self.assertEqual(
|
|
report.latest_target_release_version(
|
|
[
|
|
{
|
|
"version": "6.2.0-rc.1",
|
|
"is_prerelease": True,
|
|
"published_at": "2026-07-27T08:00:00Z",
|
|
}
|
|
]
|
|
),
|
|
"6.2.0-rc.1",
|
|
)
|
|
|
|
def test_compare_semver_precedence_orders_rc_stable_and_patch_rollbacks(self) -> None:
|
|
self.assertLess(report.compare_semver_precedence("6.3.0-rc.2", "6.3.0-rc.3"), 0)
|
|
self.assertGreater(report.compare_semver_precedence("6.3.0", "6.3.0-rc.3"), 0)
|
|
self.assertLess(report.compare_semver_precedence("6.2.1", "6.3.0-rc.3"), 0)
|
|
self.assertEqual(report.compare_semver_precedence("6.3.0+build.2", "6.3.0"), 0)
|
|
|
|
def test_target_release_service_health_uses_direct_version_change_observations(self) -> None:
|
|
now = datetime(2026, 8, 29, 12, tzinfo=timezone.utc)
|
|
rows = {
|
|
"healthy-upgrade": {
|
|
"install_id": "healthy-upgrade",
|
|
"received_at": "2026-08-29 11:00:00",
|
|
"version": "6.5.0",
|
|
"service_health_observed": 1,
|
|
"service_health_healthy": 1,
|
|
"service_health_cohort": "version_change",
|
|
"service_health_previous_version": "6.4.0",
|
|
"service_health_previous_observed": 1,
|
|
"service_health_previous_healthy": 1,
|
|
},
|
|
"broken-upgrade": {
|
|
"install_id": "broken-upgrade",
|
|
"received_at": "2026-08-29 10:00:00",
|
|
"version": "6.5.0",
|
|
"service_health_observed": 1,
|
|
"service_health_healthy": 0,
|
|
"service_health_failure_category": "frontend_assets",
|
|
"service_health_cohort": "version_change",
|
|
"service_health_previous_version": "6.4.0",
|
|
"service_health_previous_observed": 1,
|
|
"service_health_previous_healthy": 1,
|
|
# Rolling counters are deliberately irrelevant to this summary.
|
|
"update_successes_30d": 99,
|
|
},
|
|
"legacy-target": {
|
|
"install_id": "legacy-target",
|
|
"received_at": "2026-08-29 09:00:00",
|
|
"version": "6.5.0",
|
|
"service_health_observed": 0,
|
|
},
|
|
"other-release": {
|
|
"install_id": "other-release",
|
|
"received_at": "2026-08-29 11:30:00",
|
|
"version": "6.4.0",
|
|
"service_health_observed": 1,
|
|
"service_health_healthy": 0,
|
|
"service_health_failure_category": "listener",
|
|
},
|
|
}
|
|
|
|
summary = report.summarize_target_release_service_health(
|
|
rows,
|
|
{"6.4.0", "6.5.0"},
|
|
"6.5.0",
|
|
now=now,
|
|
)
|
|
|
|
self.assertEqual(summary["target_installs"], 3)
|
|
self.assertEqual(summary["observed_installs"], 2)
|
|
self.assertEqual(summary["unobserved_installs"], 1)
|
|
self.assertEqual(summary["healthy_installs"], 1)
|
|
self.assertEqual(summary["unhealthy_installs"], 1)
|
|
self.assertEqual(summary["comparable_version_change_installs"], 2)
|
|
self.assertEqual(
|
|
{entry["transition"]: entry["installs"] for entry in summary["transitions"]},
|
|
{"healthy_to_healthy": 1, "healthy_to_unhealthy": 1},
|
|
)
|
|
self.assertEqual(
|
|
{entry["category"]: entry["installs"] for entry in summary["failure_categories"]},
|
|
{"healthy": 1, "frontend_assets": 1},
|
|
)
|
|
|
|
def test_target_release_followup_excludes_first_heartbeat_baselines_and_flags_rollbacks(self) -> None:
|
|
now = datetime(2026, 8, 19, 12, tzinfo=timezone.utc)
|
|
|
|
def row(
|
|
install_id: str,
|
|
version: str,
|
|
hour: int,
|
|
**signals: object,
|
|
) -> dict[str, object]:
|
|
return {
|
|
"install_id": install_id,
|
|
"version": version,
|
|
"platform": "binary",
|
|
"received_at": now.replace(hour=hour).strftime("%Y-%m-%d %H:%M:%S"),
|
|
**signals,
|
|
}
|
|
|
|
rows = [
|
|
row("followup", "6.3.0-rc.2", 7, alerts_fired_30d=38),
|
|
row(
|
|
"followup",
|
|
"6.3.0-rc.3",
|
|
8,
|
|
alerts_fired_30d=40,
|
|
pulse_intelligence_patrol_ai_calls_30d=100,
|
|
),
|
|
row(
|
|
"followup",
|
|
"6.3.0-rc.3",
|
|
10,
|
|
alerts_fired_30d=43,
|
|
pulse_intelligence_patrol_ai_calls_30d=100,
|
|
),
|
|
row("baseline-only", "6.3.0-rc.3", 9, alerts_fired_30d=500),
|
|
row("rollback", "6.3.0-rc.3", 7, pulse_intelligence_patrol_runs_30d=10),
|
|
row("rollback", "6.3.0-rc.3", 8, pulse_intelligence_patrol_runs_30d=12),
|
|
row("rollback", "6.2.1", 11, pulse_intelligence_patrol_runs_30d=12),
|
|
row("forward", "6.3.0-rc.3", 8),
|
|
row("forward", "6.3.0", 11),
|
|
row("drift", "6.3.0-rc.3", 8),
|
|
row("drift", "feature/local-build", 11),
|
|
]
|
|
full_summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[-1]["received_at"],
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 5,
|
|
},
|
|
rows,
|
|
published_versions={"6.2.1", "6.3.0-rc.2", "6.3.0-rc.3", "6.3.0"},
|
|
target_version="v6.3.0-rc.3",
|
|
now=now,
|
|
)
|
|
summary = full_summary["target_release_followup"]
|
|
|
|
self.assertEqual(summary["installs_seen"], 5)
|
|
self.assertEqual(summary["current_target_installs"], 2)
|
|
self.assertEqual(summary["same_version_followup_installs"], 2)
|
|
self.assertEqual(summary["current_target_followup_installs"], 1)
|
|
self.assertEqual(summary["departed_followup_installs"], 1)
|
|
self.assertEqual(summary["without_later_same_version_heartbeat"], 3)
|
|
self.assertEqual(summary["rollback_installs"], 1)
|
|
self.assertEqual(
|
|
summary["rollback_transitions"],
|
|
[{"destination_version": "6.2.1", "installs": 1}],
|
|
)
|
|
self.assertEqual(
|
|
summary["forward_transitions"],
|
|
[{"destination_version": "6.3.0", "installs": 1}],
|
|
)
|
|
self.assertEqual(
|
|
summary["unclassified_transitions"],
|
|
[{"destination_version": "0.0.0-feature-local-build", "installs": 1}],
|
|
)
|
|
|
|
signals = {entry["field"]: entry for entry in summary["activity_signals"]}
|
|
alerts = signals["alerts_fired_30d"]
|
|
self.assertEqual(alerts["first_heartbeat_baseline_total"], 540)
|
|
self.assertEqual(alerts["same_version_total_increase"], 3)
|
|
self.assertEqual(alerts["same_version_increased_installs"], 1)
|
|
self.assertEqual(alerts["current_target_total_increase"], 3)
|
|
self.assertEqual(alerts["departed_total_increase"], 0)
|
|
patrol_calls = signals["pulse_intelligence_patrol_ai_calls_30d"]
|
|
self.assertEqual(patrol_calls["first_heartbeat_baseline_total"], 100)
|
|
self.assertEqual(patrol_calls["same_version_total_increase"], 0)
|
|
self.assertEqual(patrol_calls["same_version_unchanged_installs"], 2)
|
|
patrol_runs = signals["pulse_intelligence_patrol_runs_30d"]
|
|
self.assertEqual(patrol_runs["same_version_total_increase"], 2)
|
|
self.assertEqual(patrol_runs["current_target_total_increase"], 0)
|
|
self.assertEqual(patrol_runs["departed_total_increase"], 2)
|
|
|
|
rendered = report.format_text(full_summary, "rcourtman/Pulse", 7)
|
|
self.assertIn("Target release follow-up (6.3.0-rc.3):", rendered)
|
|
self.assertIn("first target-version heartbeat in the source window is baseline only", rendered)
|
|
self.assertIn("Alerts fired (30d): +3 across 1 install(s)", rendered)
|
|
self.assertIn("rollback transitions:", rendered)
|
|
self.assertIn("6.2.1: 1 install(s)", rendered)
|
|
|
|
def test_alert_quality_comparison_rejects_640_vs_632_legacy_schemas(self) -> None:
|
|
now = datetime(2026, 8, 29, 12, tzinfo=timezone.utc)
|
|
rows = [
|
|
{
|
|
"install_id": "target-install",
|
|
"version": "6.4.0",
|
|
"schema_version": 13,
|
|
"known_install_age_bucket": "31_90d",
|
|
"received_at": now.replace(hour=8).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": 100,
|
|
},
|
|
{
|
|
"install_id": "target-install",
|
|
"version": "6.4.0",
|
|
"schema_version": 13,
|
|
"known_install_age_bucket": "31_90d",
|
|
"received_at": now.replace(hour=10).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": 102,
|
|
},
|
|
{
|
|
"install_id": "baseline-install",
|
|
"version": "6.3.2",
|
|
"schema_version": 12,
|
|
"known_install_age_bucket": "91_365d",
|
|
"received_at": now.replace(hour=7).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": 40,
|
|
},
|
|
{
|
|
"install_id": "baseline-install",
|
|
"version": "6.3.2",
|
|
"schema_version": 12,
|
|
"known_install_age_bucket": "91_365d",
|
|
"received_at": now.replace(hour=11).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": 80,
|
|
},
|
|
]
|
|
full_summary = report.summarize_rows(
|
|
{"latest_ping": rows[-1]["received_at"], "total_rows": 4, "total_distinct_installs": 2},
|
|
rows,
|
|
{"6.4.0", "6.3.2"},
|
|
target_version="6.4.0",
|
|
baseline_version="6.3.2",
|
|
now=now,
|
|
)
|
|
summary = full_summary["alert_quality_release_comparison"]
|
|
self.assertEqual(summary["status"], "schema_not_comparable")
|
|
self.assertEqual(summary["matched_exposure_strata"], [])
|
|
self.assertIn("schema 14", summary["reason"])
|
|
rendered = report.format_text(full_summary, "rcourtman/Pulse", 7)
|
|
self.assertIn("Alert-quality release comparison (6.4.0 vs 6.3.2):", rendered)
|
|
self.assertIn("status: schema_not_comparable", rendered)
|
|
|
|
def test_alert_quality_comparison_uses_only_matched_followup_exposure(self) -> None:
|
|
now = datetime(2026, 8, 29, 12, tzinfo=timezone.utc)
|
|
|
|
def rows_for(version: str, install: str, fired: tuple[int, int], resolved: tuple[int, int]):
|
|
return [
|
|
{
|
|
"install_id": install,
|
|
"version": version,
|
|
"schema_version": 14,
|
|
"known_install_age_bucket": "31_90d",
|
|
"received_at": now.replace(hour=hour).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"alerts_fired_30d": fired[index],
|
|
"alerts_resolved_30d": resolved[index],
|
|
"alerts_repeat_occurrences_30d": index,
|
|
}
|
|
for index, hour in enumerate((8, 10))
|
|
]
|
|
|
|
rows = rows_for("6.4.1", "target", (100, 104), (70, 73)) + rows_for(
|
|
"6.4.0", "baseline", (30, 35), (20, 22)
|
|
)
|
|
summary = report.summarize_rows(
|
|
{"latest_ping": rows[-1]["received_at"], "total_rows": 4, "total_distinct_installs": 2},
|
|
rows,
|
|
{"6.4.1", "6.4.0"},
|
|
target_version="6.4.1",
|
|
baseline_version="6.4.0",
|
|
now=now,
|
|
)["alert_quality_release_comparison"]
|
|
self.assertEqual(summary["status"], "descriptive_matched_strata")
|
|
self.assertEqual(len(summary["matched_exposure_strata"]), 1)
|
|
stratum = summary["matched_exposure_strata"][0]
|
|
self.assertEqual(stratum["heartbeat_count_bucket"], "2")
|
|
self.assertEqual(stratum["target"]["positive_changes"]["alerts_fired_30d"], 4)
|
|
self.assertEqual(stratum["baseline"]["positive_changes"]["alerts_fired_30d"], 5)
|
|
self.assertEqual(stratum["target"]["resolution_per_fired"], 0.75)
|
|
def test_compact_target_release_facts_match_local_one_pass_analysis(self) -> None:
|
|
rows = [
|
|
{
|
|
"install_id": "install-a",
|
|
"version": "6.3.0-rc.3",
|
|
"received_at": "2026-08-19 08:00:00",
|
|
"alerts_fired_30d": 7,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"version": "6.3.0-rc.3",
|
|
"received_at": "2026-08-19 09:00:00",
|
|
"alerts_fired_30d": 9,
|
|
},
|
|
{
|
|
"install_id": "install-a",
|
|
"version": "6.2.1",
|
|
"received_at": "2026-08-19 10:00:00",
|
|
"alerts_fired_30d": 9,
|
|
},
|
|
]
|
|
original_parse_received_at = report.parse_received_at
|
|
with mock.patch.object(
|
|
report,
|
|
"parse_received_at",
|
|
wraps=original_parse_received_at,
|
|
) as parse_received_at:
|
|
local = report.analyze_target_release_rows(
|
|
rows,
|
|
{"6.3.0-rc.3", "6.2.1"},
|
|
"6.3.0-rc.3",
|
|
)
|
|
self.assertEqual(parse_received_at.call_count, 3)
|
|
|
|
analysis = local["install-a"]
|
|
facts = [{
|
|
"install_id": "install-a",
|
|
"heartbeat_count": analysis.heartbeat_count,
|
|
"same_version_pair_count": analysis.same_version_pair_count,
|
|
"first_received_at": analysis.first_received_at.strftime("%Y-%m-%d %H:%M:%S"),
|
|
"latest_received_at": analysis.latest_received_at.strftime("%Y-%m-%d %H:%M:%S"),
|
|
"first_counts": list(analysis.first_counts),
|
|
"increase_totals": list(analysis.increase_totals),
|
|
"decrease_totals": list(analysis.decrease_totals),
|
|
}]
|
|
self.assertEqual(report.analyze_target_release_facts(facts), local)
|
|
|
|
def test_value_loop_reconciles_schema_v4_action_outcomes_and_refusals(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
summary = report.summarize_pulse_intelligence_value_loop(
|
|
{
|
|
"install-a": {
|
|
"install_id": "install-a",
|
|
"received_at": now.strftime("%Y-%m-%d %H:%M:%S"),
|
|
"schema_version": 4,
|
|
"pulse_intelligence_approved_action_attempts_30d": 7,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
"pulse_intelligence_approved_action_failures_pre_dispatch_30d": 2,
|
|
"pulse_intelligence_approved_action_failures_execution_30d": 1,
|
|
"pulse_intelligence_approved_action_failures_unverified_30d": 1,
|
|
"pulse_intelligence_approved_action_stuck_executing_30d": 1,
|
|
"pulse_intelligence_approved_action_in_flight_30d": 1,
|
|
"pulse_intelligence_approved_action_unclassified_30d": 0,
|
|
"pulse_intelligence_approved_action_refusals_plan_stale_30d": 1,
|
|
"pulse_intelligence_approved_action_refusals_policy_30d": 1,
|
|
"pulse_intelligence_verified_finding_resolutions_30d": 1,
|
|
}
|
|
},
|
|
now=now,
|
|
)
|
|
accounting = summary["approved_action_outcome_accounting"]
|
|
self.assertEqual(accounting["attempts"], 7)
|
|
self.assertEqual(accounting["accounted"], 7)
|
|
self.assertEqual(accounting["gap"], 0)
|
|
self.assertEqual(accounting["overflow"], 0)
|
|
self.assertEqual(accounting["pre_dispatch_refusals"], 2)
|
|
self.assertEqual(accounting["refusal_categories_accounted"], 2)
|
|
self.assertEqual(accounting["refusal_category_gap"], 0)
|
|
|
|
def test_security_docs_use_current_agent_install_surface(self) -> None:
|
|
security_docs = (
|
|
REPO_ROOT / "SECURITY.md",
|
|
REPO_ROOT / "frontend-modern/public/docs/SECURITY.md",
|
|
)
|
|
|
|
for path in security_docs:
|
|
with self.subTest(path=path.relative_to(REPO_ROOT)):
|
|
content = path.read_text(encoding="utf-8")
|
|
self.assertIn("Settings → Infrastructure → Install on a host", content)
|
|
self.assertIn("Proxmox or Machines page", content)
|
|
self.assertNotIn("Settings → Agents → Installation commands", content)
|
|
self.assertNotIn("Settings -> Agents -> Installation commands", content)
|
|
|
|
def test_summarize_rows_uses_latest_install_state_and_splits_release_validation(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "install-a",
|
|
"version": "v6.0.0-rc.1",
|
|
"version_channel": "rc",
|
|
"version_is_published_release": 1,
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_loop_active_30d": 1,
|
|
"pulse_intelligence_assistant_ai_calls_30d": 9,
|
|
"pulse_intelligence_assistant_context_ai_calls_30d": 4,
|
|
"pulse_intelligence_external_agent_enabled": 1,
|
|
"pulse_intelligence_external_agent_used_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_used_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "install-b",
|
|
"version": "v6.0.0-rc.2",
|
|
"version_channel": "rc",
|
|
"version_is_published_release": 1,
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=5)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"agent_hosts": 3,
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_loop_active_30d": 1,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 2,
|
|
"pulse_intelligence_action_plans_30d": 2,
|
|
"pulse_intelligence_approval_requests_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "install-b",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "startup",
|
|
},
|
|
{
|
|
"install_id": "install-c",
|
|
"version": "feature/new-metric",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=2, hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"agent_hosts": 2,
|
|
"paid_license": 1,
|
|
"patrol_enabled": 1,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
},
|
|
{
|
|
"install_id": "install-d",
|
|
"version": "v6.0.0-rc.1",
|
|
"version_channel": "rc",
|
|
"version_is_published_release": 1,
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_loop_active_30d": 1,
|
|
"pulse_intelligence_complete_operations_loop_30d": 1,
|
|
"pulse_intelligence_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_used_30d": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_action_plans_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[0]["received_at"],
|
|
"total_rows": 5,
|
|
"total_distinct_installs": 4,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
target_version="v6.0.0-rc.2",
|
|
)
|
|
|
|
self.assertEqual(summary["active_latest"]["active_24h"], 2)
|
|
self.assertEqual(summary["active_latest"]["active_72h"], 3)
|
|
self.assertEqual(summary["active_latest"]["active_7d"], 3)
|
|
self.assertEqual(summary["latest_install_windows"]["24h"]["active_installs"], 2)
|
|
self.assertEqual(summary["latest_install_windows"]["72h"]["active_installs"], 3)
|
|
self.assertEqual(summary["latest_install_windows"]["7d"]["active_installs"], 3)
|
|
self.assertEqual(
|
|
summary["published_version_split_72h"],
|
|
[{"version": "6.0.0-rc.1", "installs": 1}],
|
|
)
|
|
self.assertEqual(
|
|
summary["non_release_version_split_72h"],
|
|
[
|
|
{"version": "0.0.0-feature-new-metric", "installs": 1},
|
|
{"version": "6.0.0-rc.2", "installs": 1},
|
|
],
|
|
)
|
|
self.assertEqual(
|
|
summary["latest_install_windows"]["24h"]["published_versions"],
|
|
[{"version": "6.0.0-rc.1", "installs": 1}],
|
|
)
|
|
self.assertEqual(
|
|
summary["latest_install_windows"]["72h"]["non_release_versions"],
|
|
[
|
|
{"version": "0.0.0-feature-new-metric", "installs": 1},
|
|
{"version": "6.0.0-rc.2", "installs": 1},
|
|
],
|
|
)
|
|
self.assertEqual(
|
|
summary["latest_install_windows"]["7d"]["platforms"],
|
|
[
|
|
{"platform": "binary", "installs": 2},
|
|
{"platform": "docker", "installs": 1},
|
|
],
|
|
)
|
|
deep_sources = {entry["field"]: entry for entry in summary["deep_signal_sources_7d"]}
|
|
self.assertEqual(
|
|
deep_sources["agent_hosts"]["versions"],
|
|
[
|
|
{
|
|
"version": "0.0.0-feature-new-metric",
|
|
"installs": 1,
|
|
"total": 2,
|
|
"is_published_release": False,
|
|
},
|
|
{
|
|
"version": "6.0.0-rc.2",
|
|
"installs": 1,
|
|
"total": 3,
|
|
"is_published_release": False,
|
|
},
|
|
],
|
|
)
|
|
self.assertEqual(
|
|
deep_sources["patrol_enabled"]["versions"],
|
|
[
|
|
{
|
|
"version": "0.0.0-feature-new-metric",
|
|
"installs": 1,
|
|
"total": 1,
|
|
"is_published_release": False,
|
|
},
|
|
],
|
|
)
|
|
target_coverage = summary["target_release_coverage_7d"]
|
|
self.assertEqual(target_coverage["version"], "6.0.0-rc.2")
|
|
self.assertEqual(target_coverage["active_installs"], 1)
|
|
self.assertEqual(target_coverage["platforms"], [{"platform": "docker", "installs": 1}])
|
|
signals = {entry["field"]: entry for entry in target_coverage["signals"]}
|
|
self.assertEqual(signals["agent_hosts"]["nonzero_installs"], 1)
|
|
self.assertEqual(signals["agent_hosts"]["total"], 3)
|
|
self.assertEqual(signals["agent_hosts"]["group"], "deep")
|
|
self.assertEqual(signals["pve_nodes"]["group"], "core")
|
|
pulse_loop = summary["pulse_intelligence_value_loop_7d"]
|
|
self.assertEqual(pulse_loop["active_installs"], 3)
|
|
self.assertEqual(pulse_loop["paid_installs"], 2)
|
|
self.assertEqual(pulse_loop["free_installs"], 1)
|
|
loop_flags = {entry["field"]: entry for entry in pulse_loop["boolean_signals"]}
|
|
self.assertEqual(loop_flags["pulse_intelligence_loop_configured"]["installs"], 3)
|
|
self.assertEqual(loop_flags["pulse_intelligence_loop_configured"]["paid_installs"], 2)
|
|
self.assertEqual(loop_flags["pulse_intelligence_loop_active_30d"]["installs"], 2)
|
|
self.assertEqual(loop_flags["pulse_intelligence_governed_action_active_30d"]["free_installs"], 1)
|
|
loop_counts = {entry["field"]: entry for entry in pulse_loop["count_signals"]}
|
|
self.assertEqual(loop_counts["pulse_intelligence_assistant_ai_calls_30d"]["total"], 9)
|
|
self.assertEqual(loop_counts["pulse_intelligence_assistant_ai_calls_30d"]["paid_total"], 9)
|
|
self.assertEqual(loop_counts["pulse_intelligence_assistant_context_ai_calls_30d"]["total"], 4)
|
|
self.assertEqual(loop_counts["pulse_intelligence_assistant_context_ai_calls_30d"]["paid_total"], 4)
|
|
self.assertEqual(loop_counts["pulse_intelligence_action_plans_30d"]["free_total"], 2)
|
|
self.assertEqual(loop_counts["pulse_intelligence_approved_action_successes_30d"]["free_total"], 1)
|
|
cohorts = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_outcome_cohorts"]["cohorts"]
|
|
}
|
|
self.assertEqual(cohorts["loop_configured"]["installs"], 4)
|
|
self.assertEqual(cohorts["loop_configured"]["retained_7d"], 3)
|
|
self.assertEqual(cohorts["loop_configured"]["retained_7d_rate_pct"], 75)
|
|
self.assertEqual(cohorts["loop_configured"]["paid_latest"], 2)
|
|
self.assertEqual(cohorts["loop_configured"]["paid_latest_rate_pct"], 50)
|
|
self.assertEqual(cohorts["loop_configured"]["free_latest"], 2)
|
|
self.assertEqual(cohorts["loop_active_30d"]["installs"], 3)
|
|
self.assertEqual(cohorts["loop_active_30d"]["retained_7d"], 2)
|
|
self.assertEqual(cohorts["loop_active_30d"]["retained_7d_rate_pct"], 66.67)
|
|
self.assertEqual(cohorts["complete_operations_loop_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["complete_operations_loop_30d"]["free_latest"], 1)
|
|
self.assertEqual(cohorts["complete_operations_loop_30d"]["retained_7d"], 0)
|
|
self.assertEqual(cohorts["complete_operations_loop_30d"]["retained_7d_rate_pct"], 0)
|
|
self.assertEqual(cohorts["approved_execution_loop_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["approved_execution_loop_30d"]["free_latest"], 1)
|
|
self.assertEqual(cohorts["assistant_activity"]["installs"], 1)
|
|
self.assertEqual(cohorts["assistant_context_activity"]["installs"], 1)
|
|
self.assertEqual(cohorts["patrol_activity"]["installs"], 2)
|
|
self.assertEqual(cohorts["patrol_activity"]["retained_7d"], 1)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["installs"], 2)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["retained_7d"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["retained_7d"], 1)
|
|
self.assertEqual(cohorts["governed_action_active_30d"]["installs"], 2)
|
|
self.assertEqual(cohorts["governed_action_active_30d"]["retained_7d"], 1)
|
|
self.assertEqual(cohorts["approved_action_execution_30d"]["installs"], 2)
|
|
self.assertEqual(cohorts["approved_action_execution_30d"]["retained_7d"], 1)
|
|
self.assertEqual(cohorts["approved_action_success_30d"]["installs"], 2)
|
|
self.assertEqual(cohorts["approved_action_success_30d"]["retained_7d"], 1)
|
|
funnel = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_operations_loop_funnel"]["stages"]
|
|
}
|
|
self.assertEqual(funnel["configured"]["installs"], 4)
|
|
self.assertEqual(funnel["configured"]["retained_7d"], 3)
|
|
self.assertEqual(funnel["configured"]["retained_7d_rate_pct"], 75)
|
|
self.assertEqual(funnel["patrol_activity"]["installs"], 2)
|
|
self.assertEqual(funnel["patrol_activity"]["retained_7d"], 1)
|
|
self.assertEqual(funnel["patrol_activity"]["retained_7d_rate_pct"], 50)
|
|
self.assertEqual(funnel["assistant_mcp_collaboration"]["installs"], 2)
|
|
self.assertEqual(funnel["assistant_mcp_collaboration"]["retained_7d"], 1)
|
|
self.assertEqual(funnel["governed_action"]["installs"], 2)
|
|
self.assertEqual(funnel["governed_action"]["retained_7d"], 1)
|
|
self.assertEqual(funnel["approved_action_execution"]["installs"], 2)
|
|
self.assertEqual(funnel["approved_action_execution"]["retained_7d"], 1)
|
|
self.assertEqual(funnel["approved_action_success"]["installs"], 2)
|
|
self.assertEqual(funnel["approved_action_success"]["retained_7d"], 1)
|
|
self.assertEqual(funnel["complete_operations_loop"]["installs"], 1)
|
|
self.assertEqual(funnel["complete_operations_loop"]["retained_7d"], 0)
|
|
self.assertEqual(funnel["complete_operations_loop"]["free_latest"], 1)
|
|
self.assertEqual(funnel["approved_execution_loop"]["installs"], 1)
|
|
self.assertEqual(funnel["approved_execution_loop"]["retained_7d"], 0)
|
|
self.assertEqual(funnel["approved_execution_loop"]["free_latest"], 1)
|
|
|
|
def test_pulse_intelligence_outcome_cohorts_record_observed_conversion(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "converted",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_assistant_ai_calls_30d": 1,
|
|
"pulse_intelligence_assistant_context_ai_calls_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_used_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "converted",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_loop_active_30d": 1,
|
|
"pulse_intelligence_assistant_ai_calls_30d": 3,
|
|
"pulse_intelligence_assistant_context_ai_calls_30d": 3,
|
|
"pulse_intelligence_mcp_adapter_used_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "still-free",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "paid-first",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_loop_active_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "unknown-first",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=4)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"pulse_intelligence_loop_configured": 1,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[1]["received_at"],
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 4,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
|
|
cohorts = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_outcome_cohorts"]["cohorts"]
|
|
}
|
|
self.assertEqual(cohorts["loop_configured"]["installs"], 3)
|
|
self.assertEqual(cohorts["loop_configured"]["paid_latest"], 1)
|
|
self.assertEqual(cohorts["loop_configured"]["free_latest"], 2)
|
|
self.assertEqual(cohorts["loop_configured"]["observed_free_starts"], 2)
|
|
self.assertEqual(cohorts["loop_configured"]["observed_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["loop_configured"]["observed_free_to_paid_rate_pct"], 50)
|
|
self.assertEqual(cohorts["loop_configured"]["observed_signal_free_starts"], 2)
|
|
self.assertEqual(cohorts["loop_configured"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["loop_configured"]["observed_signal_free_to_paid_rate_pct"], 50)
|
|
self.assertEqual(cohorts["loop_active_30d"]["installs"], 3)
|
|
self.assertEqual(cohorts["loop_active_30d"]["observed_free_starts"], 2)
|
|
self.assertEqual(cohorts["loop_active_30d"]["observed_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["loop_active_30d"]["observed_free_to_paid_rate_pct"], 50)
|
|
self.assertEqual(cohorts["loop_active_30d"]["observed_signal_free_starts"], 2)
|
|
self.assertEqual(cohorts["loop_active_30d"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["loop_active_30d"]["observed_signal_free_to_paid_rate_pct"], 50)
|
|
self.assertEqual(cohorts["assistant_activity"]["installs"], 1)
|
|
self.assertEqual(cohorts["assistant_activity"]["observed_free_starts"], 1)
|
|
self.assertEqual(cohorts["assistant_activity"]["observed_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["assistant_activity"]["observed_free_to_paid_rate_pct"], 100)
|
|
self.assertEqual(cohorts["assistant_activity"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(cohorts["assistant_activity"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["assistant_activity"]["observed_signal_free_to_paid_rate_pct"], 100)
|
|
self.assertEqual(cohorts["assistant_context_activity"]["installs"], 1)
|
|
self.assertEqual(cohorts["assistant_context_activity"]["observed_free_starts"], 1)
|
|
self.assertEqual(cohorts["assistant_context_activity"]["observed_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["assistant_context_activity"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(cohorts["assistant_context_activity"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["observed_free_starts"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["observed_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["patrol_activity"]["installs"], 1)
|
|
self.assertEqual(cohorts["patrol_activity"]["observed_free_starts"], 1)
|
|
self.assertEqual(cohorts["patrol_activity"]["observed_free_to_paid"], 0)
|
|
self.assertEqual(cohorts["patrol_activity"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(cohorts["patrol_activity"]["observed_signal_free_to_paid"], 0)
|
|
|
|
def test_pulse_intelligence_mcp_adapter_counts_as_external_agent_outcome(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "adapter-only",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_mcp_adapter_used_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "adapter-only",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[1]["received_at"],
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 1,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
|
|
cohorts = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_outcome_cohorts"]["cohorts"]
|
|
}
|
|
self.assertEqual(
|
|
cohorts["external_agent_used_30d"]["label"],
|
|
"Capability API/MCP adapter used 30d",
|
|
)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["paid_latest"], 1)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_used_30d"]["installs"], 1)
|
|
|
|
stages = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_operations_loop_funnel"]["stages"]
|
|
}
|
|
self.assertEqual(stages["assistant_mcp_collaboration"]["installs"], 1)
|
|
self.assertEqual(stages["assistant_mcp_collaboration"]["observed_signal_free_to_paid"], 1)
|
|
|
|
def test_pulse_intelligence_operations_funnel_requires_all_loop_parts(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "full-loop-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
"pulse_intelligence_external_agent_used_30d": 1,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "full-loop-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=6)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
},
|
|
{
|
|
"install_id": "paid-first-full-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=7)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
"pulse_intelligence_external_agent_used_30d": 1,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "full-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "full-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_external_agent_used_30d": 1,
|
|
"pulse_intelligence_assistant_ai_calls_30d": 2,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_action_plans_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "patrol-only",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "collaboration-action",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_assistant_ai_calls_30d": 4,
|
|
"pulse_intelligence_assistant_context_ai_calls_30d": 4,
|
|
"pulse_intelligence_action_plans_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "patrol-collaboration",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=4)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 2,
|
|
"pulse_intelligence_external_agent_used_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "generic-chat-action",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=5)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_assistant_ai_calls_30d": 5,
|
|
"pulse_intelligence_action_plans_30d": 1,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[1]["received_at"],
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 7,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
|
|
stages = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_operations_loop_funnel"]["stages"]
|
|
}
|
|
self.assertEqual(stages["configured"]["installs"], 7)
|
|
self.assertEqual(stages["patrol_activity"]["installs"], 5)
|
|
self.assertEqual(stages["assistant_mcp_collaboration"]["installs"], 5)
|
|
self.assertEqual(stages["governed_action"]["installs"], 5)
|
|
self.assertEqual(stages["approved_action_execution"]["installs"], 3)
|
|
self.assertEqual(stages["approved_action_success"]["installs"], 3)
|
|
self.assertEqual(stages["approved_action_success"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(stages["approved_action_success"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["complete_operations_loop"]["installs"], 3)
|
|
self.assertEqual(stages["complete_operations_loop"]["paid_latest"], 3)
|
|
self.assertEqual(stages["complete_operations_loop"]["retained_7d"], 3)
|
|
self.assertEqual(stages["complete_operations_loop"]["observed_free_starts"], 2)
|
|
self.assertEqual(stages["complete_operations_loop"]["observed_free_to_paid"], 2)
|
|
self.assertEqual(stages["complete_operations_loop"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(stages["complete_operations_loop"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["approved_execution_loop"]["installs"], 3)
|
|
self.assertEqual(stages["approved_execution_loop"]["paid_latest"], 3)
|
|
self.assertEqual(stages["approved_execution_loop"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(stages["approved_execution_loop"]["observed_signal_free_to_paid"], 1)
|
|
|
|
def test_pulse_intelligence_operations_funnel_reports_mcp_adapter_loop_value(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "adapter-loop-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_used_30d": 1,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_action_plans_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "adapter-loop-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
},
|
|
{
|
|
"install_id": "direct-agent-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
"pulse_intelligence_external_agent_used_30d": 1,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "adapter-without-patrol",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_mcp_adapter_used_30d": 1,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_action_plans_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "adapter-without-action",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=4)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_used_30d": 1,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[1]["received_at"],
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 4,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
|
|
stages = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_operations_loop_funnel"]["stages"]
|
|
}
|
|
self.assertEqual(stages["complete_operations_loop"]["installs"], 2)
|
|
self.assertEqual(stages["approved_execution_loop"]["installs"], 2)
|
|
self.assertEqual(stages["approved_action_success"]["installs"], 2)
|
|
|
|
adapter_loop = stages["mcp_adapter_operations_loop"]
|
|
self.assertEqual(adapter_loop["label"], "Pulse MCP adapter operations loop")
|
|
self.assertEqual(
|
|
adapter_loop["required_signal_groups"],
|
|
["mcp_adapter_operations_loop"],
|
|
)
|
|
self.assertEqual(adapter_loop["installs"], 1)
|
|
self.assertEqual(adapter_loop["retained_7d"], 1)
|
|
self.assertEqual(adapter_loop["retained_7d_rate_pct"], 100)
|
|
self.assertEqual(adapter_loop["paid_latest"], 1)
|
|
self.assertEqual(adapter_loop["paid_latest_rate_pct"], 100)
|
|
self.assertEqual(adapter_loop["observed_free_starts"], 1)
|
|
self.assertEqual(adapter_loop["observed_free_to_paid"], 1)
|
|
self.assertEqual(adapter_loop["observed_free_to_paid_rate_pct"], 100)
|
|
self.assertEqual(adapter_loop["observed_signal_free_starts"], 1)
|
|
self.assertEqual(adapter_loop["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(adapter_loop["observed_signal_free_to_paid_rate_pct"], 100)
|
|
|
|
adapter_approved = stages["mcp_adapter_approved_execution_loop"]
|
|
self.assertEqual(
|
|
adapter_approved["required_signal_groups"],
|
|
["mcp_adapter_approved_execution_loop"],
|
|
)
|
|
self.assertEqual(adapter_approved["installs"], 1)
|
|
self.assertEqual(adapter_approved["retained_7d_rate_pct"], 100)
|
|
self.assertEqual(adapter_approved["paid_latest_rate_pct"], 100)
|
|
self.assertEqual(adapter_approved["observed_signal_free_to_paid_rate_pct"], 100)
|
|
|
|
adapter_success = stages["mcp_adapter_approved_success_loop"]
|
|
self.assertEqual(
|
|
adapter_success["required_signal_groups"],
|
|
["mcp_adapter_approved_success_loop"],
|
|
)
|
|
self.assertEqual(adapter_success["installs"], 1)
|
|
self.assertEqual(adapter_success["retained_7d_rate_pct"], 100)
|
|
self.assertEqual(adapter_success["paid_latest_rate_pct"], 100)
|
|
self.assertEqual(adapter_success["observed_signal_free_to_paid_rate_pct"], 100)
|
|
|
|
def test_pulse_intelligence_reports_source_specific_loop_value(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "assistant-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 2,
|
|
"pulse_intelligence_assistant_operations_loop_starter_requests_30d": 2,
|
|
"pulse_intelligence_assistant_operations_loop_30d": 1,
|
|
"pulse_intelligence_assistant_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_assistant_approved_action_success_loop_30d": 1,
|
|
"pulse_intelligence_assistant_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_rejected_action_decisions_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "assistant-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 2,
|
|
"pulse_intelligence_assistant_operations_loop_starter_requests_30d": 2,
|
|
"pulse_intelligence_assistant_operations_loop_30d": 1,
|
|
"pulse_intelligence_assistant_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_assistant_approved_action_success_loop_30d": 1,
|
|
"pulse_intelligence_assistant_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_rejected_action_decisions_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "direct-agent-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_external_agent_operations_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_approved_action_success_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_resolved_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "patrol-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=4)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_operations_loop_starter_requests_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "patrol-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(minutes=40)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_operations_loop_starter_requests_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "legacy-pro-entry-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=5)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_control_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_pro_activation_operations_loop_starter_requests_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "legacy-pro-entry-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(minutes=20)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_control_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_pro_activation_operations_loop_starter_requests_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "mcp-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_external_agent_operations_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_approved_action_success_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_operations_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_approved_action_success_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_mcp_operations_loop_starter_requests_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "mcp-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(minutes=30)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_external_agent_operations_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_approved_action_success_loop_30d": 1,
|
|
"pulse_intelligence_external_agent_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_operations_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_approved_execution_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_approved_action_success_loop_30d": 1,
|
|
"pulse_intelligence_mcp_adapter_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_mcp_operations_loop_starter_requests_30d": 1,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": (now - timedelta(minutes=20)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 5,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
|
|
loop_flags = {
|
|
entry["field"]: entry
|
|
for entry in summary["pulse_intelligence_value_loop_7d"]["boolean_signals"]
|
|
}
|
|
self.assertEqual(loop_flags["pulse_intelligence_assistant_operations_loop_30d"]["installs"], 1)
|
|
self.assertEqual(loop_flags["pulse_intelligence_external_agent_operations_loop_30d"]["installs"], 2)
|
|
self.assertEqual(loop_flags["pulse_intelligence_mcp_adapter_operations_loop_30d"]["installs"], 1)
|
|
self.assertEqual(
|
|
loop_flags["pulse_intelligence_mcp_adapter_resolved_operations_loop_30d"]["paid_installs"],
|
|
1,
|
|
)
|
|
|
|
loop_counts = {
|
|
entry["field"]: entry
|
|
for entry in summary["pulse_intelligence_value_loop_7d"]["count_signals"]
|
|
}
|
|
self.assertEqual(loop_counts["pulse_intelligence_operations_loop_starter_requests_30d"]["total"], 5)
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_assistant_operations_loop_starter_requests_30d"]["total"],
|
|
2,
|
|
)
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_patrol_operations_loop_starter_requests_30d"]["total"],
|
|
1,
|
|
)
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_patrol_control_operations_loop_starter_requests_30d"]["total"],
|
|
1,
|
|
)
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_pro_activation_operations_loop_starter_requests_30d"]["total"],
|
|
1,
|
|
)
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_mcp_operations_loop_starter_requests_30d"]["total"],
|
|
1,
|
|
)
|
|
self.assertEqual(loop_counts["pulse_intelligence_rejected_action_decisions_30d"]["total"], 1)
|
|
|
|
cohorts = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_outcome_cohorts"]["cohorts"]
|
|
}
|
|
self.assertEqual(cohorts["assistant_operations_loop_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["assistant_operations_loop_30d"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["assistant_resolved_operations_loop_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["external_agent_operations_loop_30d"]["installs"], 2)
|
|
self.assertEqual(cohorts["external_agent_operations_loop_30d"]["paid_latest"], 2)
|
|
self.assertEqual(cohorts["external_agent_resolved_operations_loop_30d"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_operations_loop_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["mcp_adapter_resolved_operations_loop_30d"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["operations_loop_starter_requests"]["installs"], 4)
|
|
self.assertEqual(cohorts["patrol_operations_loop_starter_requests"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(
|
|
cohorts["patrol_control_operations_loop_starter_requests"]["observed_signal_free_to_paid"],
|
|
2,
|
|
)
|
|
self.assertEqual(
|
|
cohorts["pro_activation_operations_loop_starter_requests"]["observed_signal_free_to_paid"],
|
|
1,
|
|
)
|
|
self.assertEqual(cohorts["mcp_operations_loop_starter_requests"]["observed_signal_free_to_paid"], 1)
|
|
|
|
stages = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_operations_loop_funnel"]["stages"]
|
|
}
|
|
self.assertEqual(stages["complete_operations_loop"]["installs"], 3)
|
|
self.assertEqual(stages["approved_execution_loop"]["installs"], 3)
|
|
self.assertEqual(stages["resolved_operations_loop"]["installs"], 3)
|
|
self.assertEqual(stages["assistant_operations_loop"]["installs"], 1)
|
|
self.assertEqual(stages["assistant_operations_loop"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["assistant_approved_success_loop"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["assistant_resolved_operations_loop"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["external_agent_operations_loop"]["installs"], 2)
|
|
self.assertEqual(stages["external_agent_resolved_operations_loop"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["mcp_adapter_operations_loop"]["installs"], 1)
|
|
self.assertEqual(stages["mcp_adapter_resolved_operations_loop"]["observed_signal_free_to_paid"], 1)
|
|
|
|
def test_pulse_intelligence_reports_patrol_control_resolved_loop_as_first_class_signal(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "legacy-pro-completed-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=4)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_pro_activation_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_pro_activation_completed_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "legacy-pro-completed-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_pro_activation_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_pro_activation_completed_operations_loop_30d": 1,
|
|
"pulse_intelligence_pro_activation_paid_completed_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "explicit-patrol-control-completed-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_patrol_control_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_control_completed_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "explicit-patrol-control-completed-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(minutes=90)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_patrol_control_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_control_completed_operations_loop_30d": 1,
|
|
"pulse_intelligence_patrol_control_paid_completed_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "explicit-patrol-control-resolved-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_patrol_control_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_control_resolved_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "explicit-patrol-control-resolved-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_patrol_control_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_patrol_control_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_patrol_control_paid_resolved_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "legacy-pro-resolved-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_pro_activation_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_pro_activation_resolved_operations_loop_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "legacy-pro-resolved-loop",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(minutes=45)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_pro_activation_operations_loop_starter_requests_30d": 1,
|
|
"pulse_intelligence_pro_activation_resolved_operations_loop_30d": 1,
|
|
"pulse_intelligence_pro_activation_paid_resolved_operations_loop_30d": 1,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[-1]["received_at"],
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 4,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
|
|
loop_flags = {
|
|
entry["field"]: entry
|
|
for entry in summary["pulse_intelligence_value_loop_7d"]["boolean_signals"]
|
|
}
|
|
patrol_control_completed = loop_flags[
|
|
"pulse_intelligence_patrol_control_completed_operations_loop_30d"
|
|
]
|
|
self.assertEqual(patrol_control_completed["installs"], 1)
|
|
self.assertEqual(patrol_control_completed["paid_installs"], 1)
|
|
patrol_control_resolved = loop_flags[
|
|
"pulse_intelligence_patrol_control_resolved_operations_loop_30d"
|
|
]
|
|
self.assertEqual(patrol_control_resolved["installs"], 1)
|
|
self.assertEqual(patrol_control_resolved["paid_installs"], 1)
|
|
legacy_completed = loop_flags["pulse_intelligence_pro_activation_completed_operations_loop_30d"]
|
|
self.assertEqual(legacy_completed["installs"], 1)
|
|
self.assertEqual(legacy_completed["paid_installs"], 1)
|
|
legacy_resolved = loop_flags["pulse_intelligence_pro_activation_resolved_operations_loop_30d"]
|
|
self.assertEqual(legacy_resolved["installs"], 1)
|
|
self.assertEqual(legacy_resolved["paid_installs"], 1)
|
|
|
|
cohorts = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_outcome_cohorts"]["cohorts"]
|
|
}
|
|
self.assertEqual(cohorts["patrol_control_operations_loop_starter_requests"]["installs"], 4)
|
|
self.assertEqual(cohorts["pro_activation_operations_loop_starter_requests"]["installs"], 2)
|
|
self.assertEqual(cohorts["patrol_control_completed_operations_loop_30d"]["installs"], 2)
|
|
self.assertEqual(
|
|
cohorts["patrol_control_completed_operations_loop_30d"]["observed_signal_free_to_paid"],
|
|
2,
|
|
)
|
|
self.assertEqual(cohorts["patrol_control_resolved_operations_loop_30d"]["installs"], 2)
|
|
self.assertEqual(
|
|
cohorts["patrol_control_resolved_operations_loop_30d"]["observed_signal_free_to_paid"],
|
|
2,
|
|
)
|
|
self.assertEqual(cohorts["patrol_control_paid_completed_operations_loop_30d"]["paid_latest"], 2)
|
|
self.assertEqual(cohorts["patrol_control_paid_resolved_operations_loop_30d"]["paid_latest"], 2)
|
|
|
|
stages = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_operations_loop_funnel"]["stages"]
|
|
}
|
|
self.assertNotIn("pro_activation_completed_operations_loop", stages)
|
|
self.assertNotIn("pro_activation_resolved_operations_loop", stages)
|
|
self.assertEqual(stages["complete_operations_loop"]["installs"], 2)
|
|
self.assertEqual(stages["resolved_operations_loop"]["installs"], 2)
|
|
self.assertEqual(stages["patrol_control_completed_operations_loop"]["installs"], 2)
|
|
self.assertEqual(
|
|
stages["patrol_control_completed_operations_loop"]["observed_signal_free_to_paid"],
|
|
2,
|
|
)
|
|
self.assertEqual(stages["patrol_control_resolved_operations_loop"]["installs"], 2)
|
|
self.assertEqual(
|
|
stages["patrol_control_resolved_operations_loop"]["observed_signal_free_to_paid"],
|
|
2,
|
|
)
|
|
|
|
def test_pulse_intelligence_reports_external_agent_capability_activity(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
rows = [
|
|
{
|
|
"install_id": "capability-loop-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
"pulse_intelligence_external_agent_context_requests_30d": 2,
|
|
"pulse_intelligence_external_agent_action_requests_30d": 1,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "capability-loop-before-paid",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 1,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_runs_30d": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
"pulse_intelligence_external_agent_context_requests_30d": 3,
|
|
"pulse_intelligence_external_agent_action_requests_30d": 2,
|
|
"pulse_intelligence_governed_action_active_30d": 1,
|
|
"pulse_intelligence_approved_action_attempts_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "assistant-only",
|
|
"version": "v6.0.0-rc.1",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_assistant_ai_calls_30d": 4,
|
|
},
|
|
]
|
|
|
|
summary = report.summarize_rows(
|
|
{
|
|
"latest_ping": rows[1]["received_at"],
|
|
"total_rows": len(rows),
|
|
"total_distinct_installs": 2,
|
|
},
|
|
rows,
|
|
published_versions={"6.0.0-rc.1"},
|
|
)
|
|
|
|
loop_counts = {
|
|
entry["field"]: entry
|
|
for entry in summary["pulse_intelligence_value_loop_7d"]["count_signals"]
|
|
}
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_external_agent_context_requests_30d"]["installs"],
|
|
1,
|
|
)
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_external_agent_context_requests_30d"]["total"],
|
|
3,
|
|
)
|
|
self.assertEqual(
|
|
loop_counts["pulse_intelligence_external_agent_context_requests_30d"]["paid_total"],
|
|
3,
|
|
)
|
|
self.assertEqual(loop_counts["pulse_intelligence_approved_action_successes_30d"]["installs"], 1)
|
|
|
|
cohorts = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_outcome_cohorts"]["cohorts"]
|
|
}
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["paid_latest"], 1)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(cohorts["external_agent_used_30d"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["external_agent_context_requests"]["installs"], 1)
|
|
self.assertEqual(cohorts["external_agent_context_requests"]["paid_latest"], 1)
|
|
self.assertEqual(cohorts["external_agent_context_requests"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(cohorts["external_agent_action_requests"]["installs"], 1)
|
|
self.assertEqual(cohorts["external_agent_action_requests"]["paid_latest"], 1)
|
|
self.assertEqual(cohorts["approved_action_success_30d"]["installs"], 1)
|
|
self.assertEqual(cohorts["approved_action_success_30d"]["paid_latest"], 1)
|
|
|
|
stages = {
|
|
entry["key"]: entry
|
|
for entry in summary["pulse_intelligence_operations_loop_funnel"]["stages"]
|
|
}
|
|
self.assertEqual(stages["assistant_mcp_collaboration"]["installs"], 1)
|
|
self.assertEqual(stages["assistant_mcp_collaboration"]["paid_latest"], 1)
|
|
self.assertEqual(stages["complete_operations_loop"]["installs"], 1)
|
|
self.assertEqual(stages["complete_operations_loop"]["paid_latest"], 1)
|
|
self.assertEqual(stages["complete_operations_loop"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(stages["complete_operations_loop"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["approved_execution_loop"]["installs"], 1)
|
|
self.assertEqual(stages["approved_execution_loop"]["paid_latest"], 1)
|
|
self.assertEqual(stages["approved_execution_loop"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(stages["approved_execution_loop"]["observed_signal_free_to_paid"], 1)
|
|
self.assertEqual(stages["approved_action_success"]["installs"], 1)
|
|
self.assertEqual(stages["approved_action_success"]["paid_latest"], 1)
|
|
self.assertEqual(stages["approved_action_success"]["observed_signal_free_starts"], 1)
|
|
self.assertEqual(stages["approved_action_success"]["observed_signal_free_to_paid"], 1)
|
|
|
|
def test_precomputed_pulse_intelligence_analysis_matches_reference_helpers(self) -> None:
|
|
rows = [
|
|
{
|
|
"install_id": "mixed-posture",
|
|
"received_at": "2026-07-20 09:00:00",
|
|
"paid_license": "yes",
|
|
"pulse_intelligence_patrol_resolved_findings_30d": 1,
|
|
"pulse_intelligence_approved_action_successes_30d": 1,
|
|
},
|
|
{
|
|
"install_id": "mixed-posture",
|
|
"received_at": "2026-07-18 09:00:00",
|
|
"paid_license": 0,
|
|
"pulse_intelligence_patrol_new_findings_30d": 1,
|
|
"pulse_intelligence_assistant_context_ai_calls_30d": 2,
|
|
},
|
|
{
|
|
"install_id": "mixed-posture",
|
|
"received_at": "2026-07-19 09:00:00",
|
|
"paid_license": "false",
|
|
"pulse_intelligence_approved_action_decisions_30d": 1,
|
|
"pulse_intelligence_external_agent_action_requests_30d": "3",
|
|
"pulse_intelligence_mcp_adapter_used_30d": "true",
|
|
},
|
|
{
|
|
"install_id": "mixed-posture",
|
|
"received_at": "2026-07-17 09:00:00",
|
|
"paid_license": None,
|
|
"pulse_intelligence_patrol_runs_30d": -1,
|
|
"pulse_intelligence_loop_configured": "not-a-bool",
|
|
},
|
|
]
|
|
|
|
analysis = report.analyze_pulse_intelligence_install(rows)
|
|
expected_free_start, expected_conversion = report.pulse_intelligence_observed_conversion(rows)
|
|
self.assertEqual(analysis.observed_free_start, expected_free_start)
|
|
self.assertEqual(analysis.observed_free_to_paid, expected_conversion)
|
|
|
|
for key, _, bool_fields, count_fields in report.PULSE_INTELLIGENCE_OUTCOME_COHORTS:
|
|
with self.subTest(cohort=key):
|
|
expected_match = any(
|
|
report.pulse_intelligence_row_matches_cohort(row, bool_fields, count_fields)
|
|
for row in rows
|
|
)
|
|
expected_free_signal, expected_signal_conversion = (
|
|
report.pulse_intelligence_signal_observed_conversion(
|
|
rows,
|
|
bool_fields,
|
|
count_fields,
|
|
)
|
|
)
|
|
self.assertEqual(key in analysis.cohort_keys, expected_match)
|
|
self.assertEqual(key in analysis.free_cohort_keys, expected_free_signal)
|
|
self.assertEqual(
|
|
key in analysis.free_cohort_keys and analysis.first_paid_at is not None,
|
|
expected_signal_conversion,
|
|
)
|
|
|
|
expected_groups: set[str] = set()
|
|
for row in rows:
|
|
expected_groups.update(report.pulse_intelligence_row_signal_groups(row))
|
|
report.pulse_intelligence_derive_signal_groups(expected_groups)
|
|
self.assertEqual(analysis.signal_groups, expected_groups)
|
|
|
|
for key, _, required_groups in report.PULSE_INTELLIGENCE_OPERATIONS_FUNNEL_STAGES:
|
|
with self.subTest(stage=key):
|
|
expected_free_signal, expected_signal_conversion = (
|
|
report.pulse_intelligence_stage_signal_observed_conversion(
|
|
rows,
|
|
required_groups,
|
|
)
|
|
)
|
|
observed_free_signal = all(
|
|
group in analysis.free_signal_groups for group in required_groups
|
|
)
|
|
self.assertEqual(observed_free_signal, expected_free_signal)
|
|
self.assertEqual(
|
|
observed_free_signal and analysis.first_paid_at is not None,
|
|
expected_signal_conversion,
|
|
)
|
|
|
|
def test_pulse_intelligence_production_scale_performance_guard(self) -> None:
|
|
now = datetime(2026, 7, 23, 12, tzinfo=timezone.utc)
|
|
rows: list[dict[str, object]] = []
|
|
latest_by_install: dict[str, dict[str, object]] = {}
|
|
# Match the high-cardinality shape of the production 14-day window,
|
|
# where many installs contribute a small number of heartbeat rows.
|
|
install_count = 12_000
|
|
rows_per_install = 10
|
|
for install_index in range(install_count):
|
|
install_id = f"install-{install_index:04d}"
|
|
for row_index in range(rows_per_install):
|
|
row: dict[str, object] = {
|
|
"install_id": install_id,
|
|
"received_at": (
|
|
now - timedelta(minutes=rows_per_install - row_index)
|
|
).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"paid_license": row_index >= rows_per_install // 2,
|
|
"pulse_intelligence_loop_configured": 1,
|
|
"pulse_intelligence_patrol_new_findings_30d": row_index % 3 == 0,
|
|
"pulse_intelligence_assistant_context_ai_calls_30d": row_index % 5,
|
|
"pulse_intelligence_external_agent_context_requests_30d": row_index % 7,
|
|
"pulse_intelligence_approved_action_decisions_30d": row_index % 11 == 0,
|
|
"pulse_intelligence_approved_action_attempts_30d": row_index % 13 == 0,
|
|
"pulse_intelligence_approved_action_successes_30d": row_index % 17 == 0,
|
|
}
|
|
rows.append(row)
|
|
latest_by_install[install_id] = row
|
|
|
|
original_parse_received_at = report.parse_received_at
|
|
started = time.perf_counter()
|
|
with mock.patch.object(
|
|
report,
|
|
"parse_received_at",
|
|
wraps=original_parse_received_at,
|
|
) as parse_received_at:
|
|
analyses = report.analyze_pulse_intelligence_rows(rows)
|
|
report.summarize_pulse_intelligence_outcome_cohorts(
|
|
rows,
|
|
latest_by_install,
|
|
now=now,
|
|
analysis_by_install=analyses,
|
|
)
|
|
report.summarize_pulse_intelligence_operations_funnel(
|
|
rows,
|
|
latest_by_install,
|
|
now=now,
|
|
analysis_by_install=analyses,
|
|
)
|
|
elapsed = time.perf_counter() - started
|
|
|
|
self.assertEqual(len(analyses), install_count)
|
|
self.assertEqual(parse_received_at.call_count, len(rows))
|
|
self.assertLess(
|
|
elapsed,
|
|
8.0,
|
|
f"120,000-row high-cardinality Pulse Intelligence aggregation took {elapsed:.3f}s",
|
|
)
|
|
|
|
def test_is_mock_fleet_row_matches_scaled_fixture_signature(self) -> None:
|
|
self.assertTrue(report.is_mock_fleet_row({"kubernetes_pods": 120, "vmware_hosts": 7}))
|
|
self.assertTrue(report.is_mock_fleet_row({"kubernetes_pods": 600, "vmware_hosts": 35}))
|
|
self.assertFalse(report.is_mock_fleet_row({"kubernetes_pods": 120, "vmware_hosts": 4}))
|
|
self.assertFalse(report.is_mock_fleet_row({"kubernetes_pods": 119, "vmware_hosts": 7}))
|
|
self.assertFalse(report.is_mock_fleet_row({"kubernetes_pods": 0, "vmware_hosts": 0}))
|
|
self.assertFalse(report.is_mock_fleet_row({}))
|
|
|
|
def test_summarize_rows_excludes_mock_fleet_rows_by_default(self) -> None:
|
|
now = datetime.now(timezone.utc).replace(microsecond=0)
|
|
real_row = {
|
|
"install_id": "install-real",
|
|
"version": "v6.1.0-rc.2",
|
|
"platform": "binary",
|
|
"received_at": (now - timedelta(hours=2)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"kubernetes_pods": 37,
|
|
"vmware_hosts": 2,
|
|
}
|
|
mock_row = {
|
|
"install_id": "install-mock",
|
|
"version": "v6.1.0-rc.2",
|
|
"platform": "docker",
|
|
"received_at": (now - timedelta(hours=3)).strftime("%Y-%m-%d %H:%M:%S"),
|
|
"event": "heartbeat",
|
|
"kubernetes_pods": 240,
|
|
"vmware_hosts": 14,
|
|
"pve_nodes": 10,
|
|
}
|
|
db_stats = {"latest_ping": real_row["received_at"], "total_rows": 2, "total_distinct_installs": 2}
|
|
|
|
summary = report.summarize_rows(db_stats, [real_row, mock_row], published_versions=set())
|
|
self.assertEqual(summary["active_latest"]["active_24h"], 1)
|
|
self.assertEqual(
|
|
summary["mock_fleet_exclusions"],
|
|
{"enabled": True, "rows": 1, "installs": 1},
|
|
)
|
|
text = report.format_text(summary, "rcourtman/Pulse", 7)
|
|
self.assertIn("mock fixture fleet excluded from window: 1 row(s) across 1 install(s)", text)
|
|
|
|
included = report.summarize_rows(
|
|
db_stats, [real_row, mock_row], published_versions=set(), include_mock_fleet=True
|
|
)
|
|
self.assertEqual(included["active_latest"]["active_24h"], 2)
|
|
self.assertEqual(
|
|
included["mock_fleet_exclusions"],
|
|
{"enabled": False, "rows": 0, "installs": 0},
|
|
)
|
|
|
|
def test_summarize_user_base_signals_uses_latest_active_install_rows(self) -> None:
|
|
now = datetime(2026, 7, 23, 12, tzinfo=timezone.utc)
|
|
summary = report.summarize_user_base_signals(
|
|
{
|
|
"active-v2": {
|
|
"received_at": "2026-07-23 10:00:00",
|
|
"schema_version": 2,
|
|
"deployment_method": "docker_compose",
|
|
"known_install_age_bucket": "1_7d",
|
|
"activation_stage": "outcome_observed",
|
|
"time_to_first_monitored_resource_bucket": "under_15m",
|
|
"estate_size_bucket": "11_50",
|
|
"auth_configured": 1,
|
|
"monitoring_active": 1,
|
|
"outcome_observed_30d": 1,
|
|
"configured_connections": 3,
|
|
"alerts_fired_30d": 4,
|
|
"notification_deliveries_7d": 2,
|
|
},
|
|
"active-legacy": {
|
|
"received_at": "2026-07-22 10:00:00",
|
|
},
|
|
"stale": {
|
|
"received_at": "2026-07-01 10:00:00",
|
|
"schema_version": 2,
|
|
"configured_connections": 99,
|
|
},
|
|
},
|
|
now=now,
|
|
)
|
|
|
|
self.assertEqual(summary["active_installs"], 2)
|
|
self.assertEqual(
|
|
summary["schema_versions"],
|
|
[{"version": "2", "installs": 1}, {"version": "legacy", "installs": 1}],
|
|
)
|
|
deployment = next(
|
|
item for item in summary["category_signals"] if item["field"] == "deployment_method"
|
|
)
|
|
self.assertEqual(
|
|
deployment["label"],
|
|
"Deployment method signal (best effort; upgraded installs often report container_other or binary_other)",
|
|
)
|
|
self.assertEqual(
|
|
deployment["buckets"],
|
|
[{"bucket": "docker_compose", "installs": 1}, {"bucket": "legacy_unknown", "installs": 1}],
|
|
)
|
|
known_age = next(
|
|
item
|
|
for item in summary["category_signals"]
|
|
if item["field"] == "known_install_age_bucket"
|
|
)
|
|
self.assertEqual(
|
|
known_age["label"],
|
|
"Time since first schema-v2 lifecycle observation",
|
|
)
|
|
configured = next(
|
|
item for item in summary["count_signals"] if item["field"] == "configured_connections"
|
|
)
|
|
self.assertEqual(configured, {
|
|
"field": "configured_connections",
|
|
"label": "Configured connections",
|
|
"installs": 1,
|
|
"total": 3,
|
|
})
|
|
|
|
def test_summarize_user_base_signals_keeps_notification_failure_semantics_separate(self) -> None:
|
|
now = datetime(2026, 7, 23, 12, tzinfo=timezone.utc)
|
|
summary = report.summarize_user_base_signals(
|
|
{
|
|
"legacy-attempt-failures": {
|
|
"received_at": "2026-07-23 10:00:00",
|
|
"schema_version": 2,
|
|
"notification_attempts_7d": 5,
|
|
"notification_deliveries_7d": 1,
|
|
"notification_failures_7d": 4,
|
|
},
|
|
"terminal-failures": {
|
|
"received_at": "2026-07-23 11:00:00",
|
|
"schema_version": 3,
|
|
"notification_attempts_7d": 4,
|
|
"notification_deliveries_7d": 2,
|
|
"notification_failures_7d": 1,
|
|
},
|
|
},
|
|
now=now,
|
|
)
|
|
|
|
signals = {item["field"]: item for item in summary["count_signals"]}
|
|
self.assertEqual(
|
|
signals["notification_attempt_failures_7d_schema_v2"],
|
|
{
|
|
"field": "notification_attempt_failures_7d_schema_v2",
|
|
"label": "Notification failed attempts (7d, legacy schema v2)",
|
|
"installs": 1,
|
|
"total": 4,
|
|
},
|
|
)
|
|
self.assertEqual(
|
|
signals["notification_terminal_failures_7d_schema_v3"],
|
|
{
|
|
"field": "notification_terminal_failures_7d_schema_v3",
|
|
"label": "Notification terminal failures (7d, schema v3+)",
|
|
"installs": 1,
|
|
"total": 1,
|
|
},
|
|
)
|
|
|
|
def test_format_text_includes_user_base_privacy_bounded_signals(self) -> None:
|
|
rendered = report.format_text(
|
|
{
|
|
"db_stats": {},
|
|
"latest_install_windows": {
|
|
label: {
|
|
"active_installs": 0,
|
|
"published_versions": [],
|
|
"non_release_versions": [],
|
|
"platforms": [],
|
|
"adoption_counts": [],
|
|
"feature_enabled_installs": [],
|
|
}
|
|
for label, _ in report.DEFAULT_LATEST_INSTALL_WINDOWS
|
|
},
|
|
"user_base_signals_7d": {
|
|
"active_installs": 2,
|
|
"schema_versions": [{"version": "2", "installs": 2}],
|
|
"category_signals": [{
|
|
"field": "activation_stage",
|
|
"label": "Highest observed activation stage",
|
|
"buckets": [{"bucket": "monitoring", "installs": 2}],
|
|
}],
|
|
"boolean_signals": [{
|
|
"field": "monitoring_active",
|
|
"label": "Monitoring currently active",
|
|
"installs": 2,
|
|
}],
|
|
"count_signals": [{
|
|
"field": "alerts_resolved_30d",
|
|
"label": "Alerts resolved (30d)",
|
|
"installs": 1,
|
|
"total": 4,
|
|
}],
|
|
},
|
|
},
|
|
"rcourtman/Pulse",
|
|
7,
|
|
)
|
|
self.assertIn("User-base lifecycle and outcomes (7d):", rendered)
|
|
self.assertIn("Highest observed activation stage: monitoring 2", rendered)
|
|
self.assertIn("Alerts resolved (30d): 4 across 1 installs", rendered)
|
|
self.assertIn(
|
|
"for upgraded installs it is only a lower bound, not original installation age",
|
|
rendered,
|
|
)
|
|
self.assertIn(
|
|
"upgraded installs often fall back to container_other or binary_other",
|
|
rendered,
|
|
)
|
|
|
|
def test_format_text_includes_latest_install_windows(self) -> None:
|
|
summary = {
|
|
"db_stats": {
|
|
"latest_ping": "2026-04-14 10:04:08",
|
|
"total_rows": 3228,
|
|
"total_distinct_installs": 229,
|
|
},
|
|
"latest_install_windows": {
|
|
"24h": {
|
|
"active_installs": 127,
|
|
"published_versions": [{"version": "6.0.0-rc.1", "installs": 91}],
|
|
"non_release_versions": [{"version": "6.0.0-rc.2", "installs": 32}],
|
|
"platforms": [{"platform": "docker", "installs": 66}],
|
|
},
|
|
"72h": {
|
|
"active_installs": 153,
|
|
"published_versions": [{"version": "6.0.0-rc.1", "installs": 117}],
|
|
"non_release_versions": [{"version": "6.0.0-rc.2", "installs": 32}],
|
|
"platforms": [{"platform": "binary", "installs": 83}],
|
|
},
|
|
"7d": {
|
|
"active_installs": 157,
|
|
"published_versions": [{"version": "6.0.0-rc.1", "installs": 118}],
|
|
"non_release_versions": [{"version": "6.0.0-rc.2", "installs": 32}],
|
|
"platforms": [{"platform": "binary", "installs": 87}],
|
|
},
|
|
},
|
|
"deep_signal_sources_7d": [
|
|
{
|
|
"field": "agent_hosts",
|
|
"label": "Agent hosts",
|
|
"type": "count",
|
|
"versions": [
|
|
{
|
|
"version": "6.0.0-rc.2",
|
|
"installs": 4,
|
|
"total": 18,
|
|
"is_published_release": False,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"field": "patrol_enabled",
|
|
"label": "Patrol enabled",
|
|
"type": "bool",
|
|
"versions": [
|
|
{
|
|
"version": "6.0.0-rc.2",
|
|
"installs": 2,
|
|
"total": 2,
|
|
"is_published_release": False,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"pulse_intelligence_value_loop_7d": {
|
|
"active_installs": 157,
|
|
"paid_installs": 42,
|
|
"free_installs": 115,
|
|
"boolean_signals": [
|
|
{
|
|
"field": "pulse_intelligence_loop_configured",
|
|
"label": "Loop configured",
|
|
"installs": 31,
|
|
"paid_installs": 18,
|
|
"free_installs": 13,
|
|
},
|
|
{
|
|
"field": "pulse_intelligence_governed_action_active_30d",
|
|
"label": "Governed action active 30d",
|
|
"installs": 6,
|
|
"paid_installs": 5,
|
|
"free_installs": 1,
|
|
},
|
|
],
|
|
"count_signals": [
|
|
{
|
|
"field": "pulse_intelligence_assistant_ai_calls_30d",
|
|
"label": "Assistant AI calls 30d",
|
|
"installs": 21,
|
|
"paid_installs": 12,
|
|
"free_installs": 9,
|
|
"total": 88,
|
|
"paid_total": 61,
|
|
"free_total": 27,
|
|
},
|
|
{
|
|
"field": "pulse_intelligence_action_plans_30d",
|
|
"label": "Action plans 30d",
|
|
"installs": 4,
|
|
"paid_installs": 4,
|
|
"free_installs": 0,
|
|
"total": 9,
|
|
"paid_total": 9,
|
|
"free_total": 0,
|
|
},
|
|
],
|
|
},
|
|
"pulse_intelligence_outcome_cohorts": {
|
|
"retention_window": "7d",
|
|
"cohorts": [
|
|
{
|
|
"key": "loop_configured",
|
|
"label": "Loop configured",
|
|
"installs": 51,
|
|
"retained_7d": 31,
|
|
"paid_latest": 24,
|
|
"free_latest": 27,
|
|
"observed_free_starts": 19,
|
|
"observed_free_to_paid": 6,
|
|
"observed_signal_free_starts": 12,
|
|
"observed_signal_free_to_paid": 5,
|
|
},
|
|
{
|
|
"key": "assistant_activity",
|
|
"label": "Assistant activity",
|
|
"installs": 21,
|
|
"retained_7d": 18,
|
|
"paid_latest": 12,
|
|
"free_latest": 9,
|
|
"observed_free_starts": 8,
|
|
"observed_free_to_paid": 3,
|
|
"observed_signal_free_starts": 6,
|
|
"observed_signal_free_to_paid": 3,
|
|
},
|
|
],
|
|
},
|
|
"pulse_intelligence_operations_loop_funnel": {
|
|
"retention_window": "7d",
|
|
"stages": [
|
|
{
|
|
"key": "patrol_activity",
|
|
"label": "Patrol detection/investigation",
|
|
"required_signal_groups": ["patrol"],
|
|
"installs": 17,
|
|
"retained_7d": 14,
|
|
"paid_latest": 11,
|
|
"free_latest": 6,
|
|
"observed_free_starts": 7,
|
|
"observed_free_to_paid": 2,
|
|
"observed_signal_free_starts": 5,
|
|
"observed_signal_free_to_paid": 2,
|
|
},
|
|
{
|
|
"key": "complete_operations_loop",
|
|
"label": "Complete operations loop",
|
|
"required_signal_groups": ["patrol_issue", "collaboration", "governed_decision"],
|
|
"installs": 9,
|
|
"retained_7d": 8,
|
|
"paid_latest": 7,
|
|
"free_latest": 2,
|
|
"observed_free_starts": 4,
|
|
"observed_free_to_paid": 2,
|
|
"observed_signal_free_starts": 3,
|
|
"observed_signal_free_to_paid": 1,
|
|
},
|
|
],
|
|
},
|
|
"target_release_coverage_7d": {
|
|
"version": "6.0.0-rc.6",
|
|
"active_installs": 74,
|
|
"platforms": [{"platform": "binary", "installs": 54}],
|
|
"signals": [
|
|
{
|
|
"field": "pve_nodes",
|
|
"label": "PVE nodes",
|
|
"type": "count",
|
|
"group": "core",
|
|
"nonzero_installs": 55,
|
|
"total": 131,
|
|
},
|
|
{
|
|
"field": "ai_enabled",
|
|
"label": "AI enabled",
|
|
"type": "bool",
|
|
"group": "core",
|
|
"nonzero_installs": 19,
|
|
"total": 19,
|
|
},
|
|
{
|
|
"field": "agent_hosts",
|
|
"label": "Agent hosts",
|
|
"type": "count",
|
|
"group": "deep",
|
|
"nonzero_installs": 0,
|
|
"total": 0,
|
|
},
|
|
{
|
|
"field": "patrol_enabled",
|
|
"label": "Patrol enabled",
|
|
"type": "bool",
|
|
"group": "deep",
|
|
"nonzero_installs": 0,
|
|
"total": 0,
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
rendered = report.format_text(summary, "rcourtman/Pulse", 7)
|
|
|
|
self.assertIn("Latest install state (24h):", rendered)
|
|
self.assertIn("Latest install state (72h):", rendered)
|
|
self.assertIn("Latest install state (7d):", rendered)
|
|
self.assertIn(" - 6.0.0-rc.1: 118", rendered)
|
|
self.assertIn(" - 6.0.0-rc.2: 32", rendered)
|
|
self.assertIn("Deep telemetry signal sources (7d):", rendered)
|
|
self.assertIn("- Agent hosts: 6.0.0-rc.2: 4 installs, total 18", rendered)
|
|
self.assertIn("- Patrol enabled: 6.0.0-rc.2: 2 installs", rendered)
|
|
self.assertIn("Target release latest-state signal coverage (7d, 6.0.0-rc.6):", rendered)
|
|
self.assertIn("latest rolling totals show signal availability, not activity caused by this release", rendered)
|
|
self.assertIn(" - PVE nodes: 55 installs, total 131", rendered)
|
|
self.assertIn(" - AI enabled: 19 installs", rendered)
|
|
self.assertIn(" - Agent hosts, Patrol enabled", rendered)
|
|
self.assertIn("Pulse Intelligence value loop (7d):", rendered)
|
|
self.assertIn("- paid posture: paid 42, free/community 115", rendered)
|
|
self.assertIn(" - Loop configured: 31 installs (paid 18, free/community 13)", rendered)
|
|
self.assertIn(" - Action plans 30d: 4 installs, total 9 (paid 4 / 9; free/community 0 / 0)", rendered)
|
|
self.assertIn("Pulse Intelligence activation and retention:", rendered)
|
|
self.assertIn("- source window: last 7 day(s)", rendered)
|
|
self.assertIn("- retention definition: latest ping within 7d", rendered)
|
|
self.assertIn(
|
|
" - Loop configured: 51 installs, retained 7d 31 (60.8%), latest paid 24, latest free/community 27",
|
|
rendered,
|
|
)
|
|
self.assertIn(
|
|
"observed free/community starts 19, free-to-paid 6 (31.6%), signal while free/community 12, signal-to-paid 5 (41.7%)",
|
|
rendered,
|
|
)
|
|
self.assertIn(
|
|
" - Assistant activity: 21 installs, retained 7d 18 (85.7%), latest paid 12, latest free/community 9",
|
|
rendered,
|
|
)
|
|
self.assertIn(
|
|
"observed free/community starts 8, free-to-paid 3 (37.5%), signal while free/community 6, signal-to-paid 3 (50.0%)",
|
|
rendered,
|
|
)
|
|
self.assertIn("Pulse Intelligence operations loop funnel:", rendered)
|
|
self.assertIn(
|
|
" - Patrol detection/investigation: 17 installs, retained 7d 14 (82.4%), latest paid 11, latest free/community 6",
|
|
rendered,
|
|
)
|
|
self.assertIn(
|
|
" - Complete operations loop: 9 installs, retained 7d 8 (88.9%), latest paid 7, latest free/community 2",
|
|
rendered,
|
|
)
|
|
self.assertIn(
|
|
"observed free/community starts 4, free-to-paid 2 (50.0%), signal while free/community 3, signal-to-paid 1 (33.3%)",
|
|
rendered,
|
|
)
|
|
|
|
def test_privacy_docs_keep_relay_mobile_handoff_copy_aligned(self) -> None:
|
|
repo_root = Path(__file__).resolve().parents[2]
|
|
canonical = (repo_root / "docs" / "PRIVACY.md").read_text(encoding="utf-8")
|
|
bundled = (
|
|
repo_root / "frontend-modern" / "public" / "docs" / "PRIVACY.md"
|
|
).read_text(encoding="utf-8")
|
|
|
|
expected = "Pulse Mobile pairing for handoff"
|
|
self.assertIn(expected, canonical)
|
|
self.assertIn(expected, bundled)
|
|
self.assertNotIn("mobile app pairing", canonical)
|
|
self.assertNotIn("mobile app pairing", bundled)
|
|
|
|
def test_privacy_docs_disclose_derived_pulse_intelligence_reports(self) -> None:
|
|
repo_root = Path(__file__).resolve().parents[2]
|
|
privacy_docs = (
|
|
repo_root / "docs" / "PRIVACY.md",
|
|
repo_root / "frontend-modern" / "public" / "docs" / "PRIVACY.md",
|
|
)
|
|
|
|
for path in privacy_docs:
|
|
with self.subTest(path=path.relative_to(repo_root)):
|
|
content = path.read_text(encoding="utf-8")
|
|
self.assertIn("aggregate Pulse Intelligence adoption reports", content)
|
|
self.assertIn("Assistant, direct external-agent, or MCP collaboration", content)
|
|
self.assertIn("Pulse Intelligence Assistant operations loop 30d", content)
|
|
self.assertIn("Pulse Intelligence external agent operations loop 30d", content)
|
|
self.assertIn("Pulse Intelligence Patrol control completed operations loop 30d", content)
|
|
self.assertIn("Pulse Intelligence MCP operations loop starter requests 30d", content)
|
|
self.assertIn("Pulse Intelligence Assistant context AI calls 30d", content)
|
|
self.assertIn("approved action success", content)
|
|
self.assertIn("rejected action decisions", content)
|
|
self.assertIn("completed Patrol control work", content)
|
|
self.assertIn("observed free-to-paid movement", content)
|
|
self.assertIn(
|
|
"Pulse Intelligence agent/MCP route in the current 30-day telemetry window",
|
|
content,
|
|
)
|
|
self.assertIn("Pulse Intelligence MCP adapter used 30d", content)
|
|
self.assertIn("Compatibility mirror of the Patrol control completed field", content)
|
|
self.assertNotIn("Pro activation completed-loop proof", content)
|
|
self.assertIn("route parameters, resource IDs", content)
|
|
self.assertIn("Those reports do not add prompts, findings", content)
|
|
self.assertIn("account links, or exact commercial tiers", content)
|
|
self.assertIn(
|
|
"not precise evidence of the original installation path",
|
|
content,
|
|
)
|
|
self.assertIn(
|
|
"time since Pulse first created the schema-v2 lifecycle record",
|
|
content,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|