Commit Graph

9117 Commits

Author SHA1 Message Date
rcourtman c17664b3da Distinguish MSP evaluation issuance from readiness 2026-08-11 14:50:47 +01:00
rcourtman 2bc4ed7254 Split bounded pipeline metrics writes from synchronous batch writes
6b79aa997 bounded WriteBatchSync itself, which broke its read-your-writes
contract on slow disks: CI's metrics write-amplification and 500-node
load tests count committed rows after writing, and mock seeding reads
store coverage straight back, so the 2-second early return failed both
(runs 31475700902, 31494553977). Fast local disks masked it.

WriteBatchSync returns to a full commit wait. The monitoring pipeline's
four sync sites move to WriteBatchBounded, which carries the bounded
enqueue-plus-wait semantics, so the #1437 slow-disk stall fix stays
exactly where the hazard is. Both paths share prepareWriteBatch
validation, and a new regression test pins WriteBatchSync waiting past
the bounded budget.

Refs #1437

Contract-Neutral: behavioral fix: split bounded pipeline writes from synchronous batch writes, restores read-your-writes (#1437 follow-up), no public contract delta
2026-08-11 14:42:42 +01:00
rcourtman b6da28da0a Clarify MSP paid conversion evidence 2026-08-11 14:36:09 +01:00
rcourtman 9449a6909e Make provider MSP evaluation activation attributable 2026-08-11 14:27:29 +01:00
rcourtman 52489e8926 Scale connection stale cutoff by the adaptive planned poll interval
Adaptive polling deliberately stretches an instance's cadence toward its
max interval (5 minutes by default) while data is fresh, but the
connections aggregator judged staleness against the configured cadence
with a 2-minute floor. Any adaptive-enabled install therefore cycled
healthy PVE/PBS/PMG connections into stale for the back half of every
stretched poll gap: the Infrastructure page dropped the source badge
from API + Agent to Agent and connection-degraded alerts fired against
a schedule the poller was honoring.

The aggregator now scales the active-to-stale cutoff by the scheduler's
currently planned interval when that exceeds the configured cadence,
via Monitor.PlannedPollInterval and per-instance planned intervals in
the aggregator inputs. A plan tighter than the configured cadence never
tightens the cutoff, so genuine poll outages still trip the floor on
time. Connection-degraded alerts and the runtime inventory gate consume
the same derived state and inherit the fix.

Refs #1437

Contract-Neutral: behavioral fix: stale cutoff follows adaptive planned interval (#1437), no public contract delta
2026-08-11 14:05:06 +01:00
rcourtman 246f7bb6f2 Document hosted_runtime target and builder pointer for reporter test images
The reporter-test-image policy named the tag shape and version stamp but
not the build mechanics, so each agent rediscovered them. Name the
hosted_runtime Dockerfile target as the server-only diagnostic image,
warn that BUILD_AGENT=0 does not skip agent artifacts on the default
target, and point at LOCAL_CAPABILITIES.md for the workstation's default
builder.

Refs #1437
2026-08-11 13:27:27 +01:00
rcourtman a04941b55a Implement canonical resource monitoring policy 2026-08-11 11:52:01 +01:00
rcourtman 6b79aa9972 Bound synchronous metrics writes so a slow disk cannot stall monitoring
WriteBatchSync waited unboundedly for the ingestion worker's commit. The
monitoring pipeline calls it inline from state broadcast, agent ingest,
and poll publish, so a metrics disk slow enough to back up the write
queue froze the monitor after its first cycle: polls stopped being
scheduled, PollStatus.LastSuccess never advanced, and healthy API
sources degraded to stale/agent-only while SQLite ground through
retention maintenance (107s cleanup, multi-second commits on the
reporter's instance).

enqueueAndWait now shares a single 2s budget across enqueue and commit.
A queue that cannot accept the batch within the budget drops it with a
warning, matching enqueueWrite's saturation behavior. A batch that
enqueues but has not committed stays queued and is not lost; the caller
moves on and a rate-limited warning records the backlog. Healthy disks
keep read-your-writes semantics.

Refs #1437

Contract-Neutral: behavioral fix: bound metrics store sync write wait (#1437), no public contract delta
2026-08-11 09:58:29 +01:00
rcourtman c45a950a74 Format Patrol presentation proof 2026-08-10 22:39:11 +01:00
rcourtman dfcfe3fbd1 Fix tenant-scoped service discovery execution 2026-08-10 19:53:08 +01:00
rcourtman b2dd6abfd8 Document reporter test image validation path 2026-08-10 15:32:52 +01:00
rcourtman 44a3f19454 Fix large Proxmox cluster poll exhaustion 2026-08-10 14:39:01 +01:00
rcourtman 04d6c43f20 Stop stamping Patrol attention rows with evidence-timing noise
Every attention row on every install (and all 38 rows on the public demo)
carried a warning 'Evidence incomplete; timing unavailable' / 'Evidence
timing unavailable' metadata line. Unknown freshness just means the evidence
source publishes no validity window - only availability-poller evidence does
- so it is not an operator-facing warning, and the 'timing unavailable' claim
was false with per-envelope observation times rendered beside it.

- Presentation: the scan row now surfaces an evidence phrase only for states
  worth a glance (unavailable, incomplete, stale, or window-backed current);
  complete evidence with unknown freshness stays quiet on the row and shows
  a muted 'Evidence recorded' badge in the detail, mirroring the existing
  unavailable-protection row rule.
- Alerts bridge: provider incidents without a backing availability check now
  carry a first-class complete/confirmed envelope derived from the observed
  incident payload instead of falling to the legacy partial shim, and each
  sync merges the cycle's freshly observed envelopes into the active alert so
  raise-time evidence does not age out while the condition is still observed.

Verified live on a scratch mock instance at 1280px and 744px: all 44+ mock
attention rows now project complete evidence and render without the noise
line; detail shows 'Evidence recorded' with per-observation timestamps.
2026-08-10 09:47:06 +01:00
rcourtman f3bfc7c72a Keep offline agents removable after restart 2026-08-10 09:34:42 +01:00
rcourtman bcb172c127 Authorize unsigned Windows artifacts for v6.2.1 v6.2.1 helm-chart-6.2.1 2026-08-10 08:24:09 +01:00
rcourtman 5112ae3ea4 Document update-check age in v6.2.1 2026-08-10 08:01:26 +01:00
rcourtman 49b40911a4 Show the age of the last update check on the updates panel
The Up to date verdict on the Pulse server updates panel can come from the
frontend's 24h localStorage cache, but it rendered with no timestamp, so a
day-old verdict read as a live comparison. A user on rc.9 read Up to date
minutes after v6.2.0 published and concluded the updater was broken.

The status cell now carries the age of the check the verdict came from
(Checked 3 hours ago, or Not checked yet when this browser has never
checked). Copy stays in the updatesPresentation owner, the store exposes
lastCheckedAt for the verdict actually displayed, and the line is hidden
for source builds, where checks are disabled.

Refs #1601
2026-08-10 06:40:21 +01:00
rcourtman 8bde827941 Sync shipped v6.2.1 upgrade guide 2026-08-10 01:09:08 +01:00
rcourtman 5a865820a6 Prepare v6.2.1 emergency patch release 2026-08-10 00:54:43 +01:00
rcourtman 2dc035060b Clarify Pro commercial context contract 2026-08-10 00:41:25 +01:00
rcourtman 766253ed04 feat(commercial): treat the compiled Pro edition as commercial context
The Plans & Billing navigation entry is suppressed for sessions without
commercial context, which hid the only activation-form entry point from
exactly the customers who need it: a fresh Pro install has no license yet,
so hideUpgrade stayed true until the key the customer could not find a
place to paste was pasted. The compiled Pro binary is only distributed
through the paid broker flow, so a Pro-edition session is commercial
context by construction — edition.IsPro() now sets commercialContext in
securityStatusPresentationPolicy.

Ordinary free self-hosted sessions run the community binary and keep the
opt-in default (the edition marker keys off the compiled binary, never
license state). Demo mode and white-label keep full suppression via
hideCommercial, which wins over edition-derived context. Complements
1b9bc9482 (setup-completion activation pointer); together a fresh Pro
install gets both the first-run pointer and a permanently visible
Plans & Billing entry. api-contracts, storage-recovery, and
agent-lifecycle contracts record the policy delta.
2026-08-10 00:32:14 +01:00
rcourtman 1b9bc9482e feat(setup): point unlicensed Pro installs at license activation
A fresh Pro install has no way to discover where its activation key goes:
the Plans & Billing nav entry is navigation-suppressed until a license or
subscription exists (hideWhenUpgradeHidden), which hides the only panel
holding the activation form exactly while the install is unlicensed. A Pro
customer hit this after the broker download flow and emailed support.

The setup completion panel now probes /api/license/runtime-capabilities
and /api/license/status with the setup token and, only when the compiled
Pro build reports no valid license, renders an Activate Pulse Pro card
linking straight to /settings/pulse-intelligence/billing/plan (direct
routes stay reachable by design). Community builds, licensed installs,
and failed probes all keep the card hidden, so the self-hosted opt-in
commercial posture is untouched. The pro-unlicensed preview scenario
keeps browser proof deterministic; strings are localized in EN/DE/ES;
agent-lifecycle, frontend-primitives, and security-privacy contracts
record the new handoff and catalog boundaries.
2026-08-10 00:02:45 +01:00
rcourtman a7849c9ef0 Fix strict subscription tool schemas
Refs #1697
2026-08-09 21:00:07 +01:00
rcourtman 837ce57106 Fix agent download preflight redirects (#1696) 2026-08-09 20:57:52 +01:00
rcourtman 6c150973b4 Fix Agent Doctor credential recovery 2026-08-09 20:47:11 +01:00
rcourtman cd63e0848a Record v6.2.0 release completion 2026-08-09 20:06:42 +01:00
rcourtman 83273de91c Fix post-activation demo convergence 2026-08-09 19:54:14 +01:00
rcourtman cba3b3e857 Resume v6.2.0 release execution v6.2.0 helm-chart-6.2.0 2026-08-09 16:54:18 +01:00
rcourtman 1213b6d918 Stabilize remaining API performance proofs 2026-08-09 16:52:19 +01:00
rcourtman 53d9d00d8d Claim v6.2.0 release execution 2026-08-09 16:14:40 +01:00
rcourtman fe14b195d0 Stabilize API performance release proofs 2026-08-09 16:12:19 +01:00
rcourtman be18f99d24 fix(rbac): make SSO user access manageable 2026-08-09 13:36:07 +01:00
rcourtman 70f7ca9f6f fix(pbs): skip superuser-only node lookup for tokens 2026-08-09 12:25:07 +01:00
rcourtman 2a95ae35c3 Record v6.2.0 rehearsal stop condition 2026-08-09 12:11:07 +01:00
rcourtman e2a2e7d4d2 Record v6.2.0 Windows signing exception 2026-08-09 11:05:20 +01:00
rcourtman f962fe83b1 fix(tests): stop alerts manager leak and settle frontend guardrails
Clears the red main streak that began at 63a0adf9a:
- newTestConfigHandlers never stopped its alerts.Manager, leaking a
  periodicSaveAlerts goroutine that logs through the global zerolog
  logger and races with the authorization-refusal contract test's
  logger swap under -race
- InfrastructureAgentDoctorPage used a raw select, tripping the
  settings native-select guardrail; converted to the shared labelled
  FormSelect primitive
- the metric-title residual pin still expected the removed -1 sentinel
  copy; aligned with the Off-control wording from 16179dd0a

Contract-Neutral: test-only CI red fix: stops alerts.Manager goroutine leak in api test helper, converts agent doctor raw select to the canonical FormSelect primitive the frontend-primitives contract already mandates, updates a stale test pin; no public contract delta
2026-08-09 11:00:51 +01:00
rcourtman e9904157e7 Prepare v6.2.0 stable release 2026-08-09 10:43:19 +01:00
rcourtman b9811cdf53 fix(settings): prevent credential autofill in provider controls 2026-08-09 10:31:03 +01:00
rcourtman c94ed3906e fix(frontend): ignore stale agent versions in platform notices 2026-08-09 10:29:31 +01:00
rcourtman 37e3c81b03 test(alerts): prove stopped guests preserve posture incidents 2026-08-09 10:20:08 +01:00
rcourtman c33ed56f1f fix(alerts): preserve backup posture for offline guests (#1693) 2026-08-09 10:08:40 +01:00
rcourtman 16179dd0a5 Improve 6.2 usability across core workflows 2026-08-09 01:16:15 +01:00
rcourtman 63a0adf9ac Repair rejected agent credentials safely 2026-08-09 00:51:38 +01:00
rcourtman 4e1d2f6d5d fix(telemetry): scale adoption reporting 2026-08-09 00:35:40 +01:00
Richard Courtman 1b804cf206 fix(release): wait for convergence metadata 2026-08-08 22:18:39 +01:00
Richard Courtman e245aa11e2 fix(release): add activation-only recovery 2026-08-08 22:10:49 +01:00
Richard Courtman 894e0eb213 chore(release): prepare v6.2.0-rc.11 v6.2.0-rc.11 2026-08-08 20:26:15 +01:00
rcourtman fe5dfd11ec docs(monitoring): define HTTP probe fallback contract 2026-08-08 20:03:19 +01:00
rcourtman 2018aa8a9a fix(monitoring): retry unsupported HEAD probes with GET 2026-08-08 20:00:11 +01:00
rcourtman 8d5594caf8 test(release): bound Windows TLS fixture setup 2026-08-08 19:37:49 +01:00