Commit Graph

1702 Commits

Author SHA1 Message Date
rcourtman 9e60f2aec6 Scrub stale community billing caps
Refs #1429
2026-04-19 12:17:20 +01:00
rcourtman 9c3d96cab2 Add unified connections API (list + probe) with Disabled flag
Introduces GET /api/connections and POST /api/connections/probe as the
backend half of the one-ledger / one-editor connection redesign.

- GET /api/connections aggregates PVE/PBS/PMG/VMware/TrueNAS/agent rows
  into a unified Connection shape with derived state (active, paused,
  unauthorized, unreachable, stale, pending) computed from in-memory
  scheduler health plus agent Host.LastSeen. No new persisted state.
- POST /api/connections/probe fingerprints a host across the five
  supported products in parallel (2s dial + 1s read, 3s total, max 5
  concurrent). Admin-gated (RequireAdmin + ScopeSettingsWrite) to block
  unauthenticated SSRF against internal hosts.
- Disabled bool on PVEInstance/PBSInstance/PMGInstance (zero-value =
  enabled, preserves existing nodes.json); pollers skip disabled
  instances at client init, reconnect, and per-node iteration.
- NodeConfigRequest/Response gain Enabled; write path translates
  *bool -> Disabled so omitted field leaves state untouched.
- ConnectionsAPI frontend client (list/probe) typed off the Go shape.

Contracts updated: api-contracts, monitoring, agent-lifecycle,
performance-and-scalability, storage-recovery. Proofs added:
contract_test.go JSON snapshot for Connection and ProbeResponse,
monitoring guardrails for the Disabled-skip behavior, and a vitest
mock-client test for ConnectionsAPI.

Frontend editor / drawer / table rewrite lands in a separate block.
2026-04-19 11:42:53 +01:00
rcourtman fae27b3a8f Fix first-run bootstrap token guidance 2026-04-19 10:33:11 +01:00
rcourtman 329f59eddb Add health-state indicators to Infrastructure, Storage, Workloads, and Recovery summaries
Summary cards now show degraded/alerting/failing counts rather than raw
online/offline splits, giving operators an at-a-glance health posture without
drilling into the full resource list.

- InfrastructureSummary/infrastructureSummaryModel: adds degraded and alerting
  counts derived from resource statuses and active alerts
- StorageSummary/StoragePageSummary/useStoragePageSummary: adds poolsDegraded
  and disksFailing indicators, shows "all healthy" when zero degradation
- WorkloadsSummary/useDashboardWorkloadDerivedState: adds alerting guest count
  from activeAlerts accessor, included in summary header counts
- RecoverySummary: adds aggregate health-state summary row
- useDashboardState: threads alertsEnabled through workload derived state
- Fix monitored-system cap test helper to use TierEnterprise so limits are
  honored (self-hosted tiers are now uncapped per the v6 product model)
- Update registry and governance test snapshots to include
  useStoragePageSummary.test.ts in the storage-product-surface proof set
2026-04-19 08:35:45 +01:00
rcourtman edb732074f Route pro-feature paywall keys to billing plan page for self-hosted instances
The purchase-start handoff (/auth/license-purchase-start) requires a configured
PublicURL and fails silently on local self-hosted instances without one. Routes
ai_alerts, ai_autofix, relay, rbac, audit_logging, advanced_sso,
agent_profiles, long_term_metrics, and trial_expired to the self-hosted billing
plan page so upgrade CTAs remain functional on local instances.
2026-04-19 00:33:02 +01:00
rcourtman 85a2dd06d4 Remove hasAIAlertsFeature and runtimeCapabilitiesLoading from alert surfaces
These props were passed through the entire alerts component tree but are no
longer needed — AI alert gating is handled by the shared license/entitlements
layer without each surface needing its own capabilities fetch. Removes the
onMount capabilities load, the paywall-viewed tracking effect, and the
dependent prop chain through OverviewTab, HistoryTab, and all alert card
surfaces.
2026-04-19 00:31:59 +01:00
rcourtman fa2768ae78 Align test suite with single-route infrastructure architecture
Updates all test files broken by the collapse of infrastructure sub-routes
(/install, /platforms, /connections) into one /settings/infrastructure entry.
Key contract deltas:

- settingsNavCatalog/Model: infrastructure-connections and infrastructure-install
  tabs removed; infrastructure-systems is the single sidebar entry
- infrastructureWorkspaceModel: getInfrastructureWorkspaceViewFromPath renamed
  to deriveAddStepFromLegacyPath; buildInfrastructureWorkspacePath now always
  returns /settings/infrastructure regardless of argument
- settingsNavigationModel: deriveAgentFromPath and isProxmoxSettingsPath use
  normalised (not canonical) path so Proxmox deep links still resolve to the
  correct agent before the canonical-path redirect fires
- useSettingsNavigation: Proxmox agent sync moved before the redirect early-
  return so deep links seed the correct selectedAgent
- InfrastructureInstallerSection: "Open Platform connections" button replaced
  with informational text; navigate target updated to flat workspace path
- useInfrastructureDiscoveryRuntimeState: currentTab parameter removed (tab
  collapse means discovery is always active when the workspace is mounted)
- SetupCompletionPanel: unified INFRASTRUCTURE_PATH constant replaces the two
  distinct INFRASTRUCTURE_INSTALL_PATH / INFRASTRUCTURE_PLATFORMS_PATH
- All navigation call sites (Dashboard, DashboardStateCards, Infrastructure
  empty-state) updated to /settings/infrastructure
- Contract updates: agent-lifecycle, api-contracts, frontend-primitives
2026-04-19 00:29:38 +01:00
rcourtman 264c9377a2 Remove infrastructure setup modals 2026-04-18 22:58:17 +01:00
rcourtman b850e4fb2c Rework infrastructure setup flows as centered modals 2026-04-18 22:16:13 +01:00
rcourtman f754dfa9b9 Redesign infrastructure settings around one ledger 2026-04-18 21:33:37 +01:00
rcourtman 1c2b195d51 Collapse infrastructure settings to one sidebar entry 2026-04-18 21:10:01 +01:00
rcourtman 295753be1a Move infrastructure IA split into settings shell 2026-04-18 20:45:30 +01:00
rcourtman 53a9339e4e Add infrastructure workspace peer navigation 2026-04-18 19:09:06 +01:00
rcourtman 90c5c63ced Separate infrastructure subviews from systems ledger 2026-04-18 18:52:11 +01:00
rcourtman d78bc64583 Recenter infrastructure settings on monitored systems 2026-04-18 18:46:25 +01:00
rcourtman 8883e36f0b Collapse infrastructure settings to ledger-first workspace 2026-04-18 17:13:34 +01:00
rcourtman 847d09d17b Unify settings infrastructure ledger 2026-04-18 14:54:53 +01:00
rcourtman b666d131b0 Migrate Docker integrations to maintained Moby modules 2026-04-18 11:40:38 +01:00
rcourtman 35429774b4 Probe /api/health in hot-dev backend monitor
The supervisor's backend health monitor in scripts/hot-dev.sh only
checked whether a `./pulse` process existed via pgrep. If the Go binary
hung, panicked into recovery without exiting, or failed to bind :7655
while the process stayed alive, the monitor saw a healthy process count
and never restarted, leaving the dev frontend talking to a dead listener.
Hit that twice in one session.

Add an HTTP probe of /api/health on the dev port. After two consecutive
5s polls where the process exists but /api/health is unreachable, kill
the process and restart the same way the dead/duplicate branches do.
Cut the poll interval from 10s to 5s so the worst-case unresponsive
window is ~10s instead of ~30s. Bring deployment-installability into
line by naming alive-but-unresponsive recovery as part of the dev-runtime
orchestration boundary, and cover the new branch with static-source
assertions in scripts/tests/test-hot-dev-bg.sh.
2026-04-18 10:56:33 +01:00
rcourtman e6b0d47bd6 Gate Docker mutations on authz-plugin posture 2026-04-18 10:45:25 +01:00
rcourtman 8d0aec6e4d Add back-to-inventory header on infrastructure subviews
The connections-table flip in 00c6dc2dd removed the workspace's top-of-
page subtab strip but left the install panel and platforms workspace
rendering bare with no path back to the inventory table. Operators who
clicked Add a system, picked a platform, and landed on
/settings/infrastructure/install or /settings/infrastructure/platforms/*
had to leave Settings entirely and return to the tab to get back to the
table.

Render a persistent breadcrumb header above every non-inventory view
inside InfrastructureWorkspace: a "← Connections and Inventory" button
that navigates back to the bare /settings/infrastructure route, plus a
heading naming the current subview. Inventory itself is unchanged.

Bring agent-lifecycle rule 7 into line by requiring this back-to-
inventory affordance on every detail route under /settings/infrastructure
so deeper surfaces are never reachable without a visible return path.
Cover the new header on install and platforms subviews — and its absence
on the inventory landing — in InfrastructureWorkspace.test.tsx.
2026-04-18 10:43:38 +01:00
rcourtman 2dc4e43033 Wire Connections & Inventory nav to the unified table
settingsTabPath('infrastructure-operations') and the initial-tab resolver
still returned /settings/infrastructure/install from the pre-flip
workspace, so clicking the Settings nav dropped users on the install
detail page instead of the unified Connections table shipped in
00c6dc2dd. Point the tab path and canonical resolver at the bare
/settings/infrastructure, extend deriveTabFromPath to recognise that
prefix as the infrastructure-operations tab, and bring
frontend-primitives rule 13 into line with the already-flipped
agent-lifecycle rule 7 so both contracts name the bare
/settings/infrastructure as the canonical landing. Update the three
guardrail suites (settingsRouting, settingsNavigation.integration,
settingsArchitecture) that encode the tab->path map so they reflect the
new landing.
2026-04-18 10:27:04 +01:00
rcourtman f0b37dbfe1 Document remediation execute approval contract 2026-04-18 09:57:02 +01:00
rcourtman 00c6dc2dd4 Collapse infrastructure workspace onto one connections table
Replace the three-subtab install/connect/inventory narrative with a
single unified connections view at /settings/infrastructure. The base
route now renders one alpha-sorted table whose rows cover every
monitored system — Proxmox VE, PBS, PMG, TrueNAS, VMware, and agent
hosts — under the same name/kind/method/status/last-reported shape.
Adding a new system goes through a single "Add a system" picker whose
tiles route operators straight into the right flow:
/settings/infrastructure/install for the agent choice and
/settings/infrastructure/platforms/<kind> for Proxmox, TrueNAS, and
VMware. The install, platforms, and operations routes remain reachable
as detail surfaces, and read-only sessions continue to redirect the
install view back to the inventory base and suppress the add-system
entry point.

Update the agent-lifecycle subsystem contract to reflect that the
workspace shell no longer mandates a "bare routes default to install"
first-host narrative or a three-subtab layout. Refresh the guardrail
and integration tests that pinned the old tab shape and the legacy
operations landing route.
2026-04-18 00:00:34 +01:00
rcourtman 280b3dd5f7 Distribute infrastructure full-width columns 2026-04-17 23:39:19 +01:00
rcourtman 446a70ee69 Trim infrastructure workspace onboarding papercuts
Rename the third subtab to "Inventory" and hide the first-system
orientation card once any platform connection or agent resource exists.
In the installer, drop the two cross-pointer callouts, replace the
locked-state placeholder with a disabled command preview, collapse the
uninstall block into a details disclosure, and keep the Platform
connections CTA as an inline link next to the target-profile note.
Remove the dead CalloutCard branch from ProxmoxSettingsPanel and update
the architecture guardrails accordingly. Pin the "Inventory" label and
the orientation-card gating into the agent-lifecycle contract so the
workspace-shell rule stays aligned with the surfaced narrative.
2026-04-17 23:37:15 +01:00
rcourtman 00da144dd8 Remove v6 RC banner from app shell 2026-04-17 20:06:57 +01:00
rcourtman 4e4fcb5dbe Move operations tools into settings support 2026-04-17 20:03:54 +01:00
rcourtman 865fa45ff2 Resolve patrol-product-language-ai-boundary decision
Audit of customer-facing Patrol surfaces against the patrol-intelligence
contract (obligation #5) confirms the migration boundary:

- Customer chrome (page titles, nav, route labels, summary copy, actions,
  empty states) leads with Patrol/Pulse Patrol/Pulse Assistant
- Internal identifiers (file names, stores, types, transport fields,
  log tags) stay under the shared AI-runtime carve-out
- `/settings/system-ai` is the provider/configuration carve-out where
  AI terminology is reserved; its chrome is already product-first
  ("Assistant & Patrol")
- The AgentProfilesPanel "Ideas" tooltip was the last customer-facing
  surface outside those carve-outs and was neutralized in the prior
  commit

With the boundary documented, the only release-ready blocker is RA8
(rc-to-ga-promotion-readiness), which is held intentionally for the
governed RC-to-GA rehearsal.
2026-04-17 16:39:49 +01:00
rcourtman 85191a9051 Remove blanket Community-visible upgrade marketing surfaces
Cut three surfaces that nagged Community users without explicit feature
engagement: the Dashboard RelayOnboardingCard paywall, the app-wide
ActiveUseTrialNudge (already dead code with no render sites), and the
SetupCompletionPanel "Monitor from Anywhere" Relay trial block.

Feature-gated discovery that fires only when a user clicks a locked
feature (alert investigate, history ranges, Patrol AI modes, Settings
panels) is intentionally left alone — those are user-initiated, not
blanket funnels.

Governance cascade: cloud-paid.md extends the Settings no-funnel rule
to Dashboard and setup completion; registry.json, status.json readiness
assertions RA5/RA18, frontend-primitives/storage-recovery/
performance-and-scalability contracts, the high-risk verification
matrix, the relay registration proof script, the subsystem lookup
tests, and the obsolete integration spec are all scrubbed of
references to the removed files. Blocked-record regenerated against
current VERSION=6.0.0-rc.2 so the promotion-policy test no longer
diffs on a stale rc.1 artifact.
2026-04-17 14:49:28 +01:00
rcourtman d35762b029 Remove Community-user upgrade CTAs from Settings plan page
Settings -> Plan was funneling Community users through marketing:
the monitored-system upgrade arrival banner (which triggered
license-server portal handoffs that emsofo hit as "Pulse Account
unavailable"), the trial-start CTA, the inactive-Pro upsell, and
the capacity-section Upgrade button all rendered unsolicited for
users without paid features.

Plan page now shows factual license state only for Community
users. Trial starting is still reachable from other entry points
(dashboard onboarding, patrol). Contract updated to forbid
regression. Dashboard-level nags remain; inventory pending.
2026-04-17 14:18:06 +01:00
rcourtman 80d9588d49 Remove unimplemented white-label claims and fix TOS product description
White-label branding was advertised as a Cloud Enterprise feature in
docs/CLOUD.md and docs/PULSE_PRO.md while the underlying capability is
still marked "not implemented" in features.go. Pulled from the customer-
facing matrix and prose so we are not selling a vapor feature.

TERMS.md described Pulse Pro as "infrastructure monitoring and AI-powered
automation" — narrowed to "infrastructure monitoring tool with AI-assisted
operations" so the legal document matches the product's actual posture.

Also trimmed the Pro row subtitle in the self-hosted pricing table to
drop "automation" since the AI autonomy surface is framed as assistance
with approval, not automated operations.
2026-04-17 10:50:00 +01:00
rcourtman 6ec64c55ed Fix stale v6-rc-cut active-target reference in control-plane doc
The `Current State` section of `docs/release-control/internal/CONTROL_PLANE.md`
still described `v6-rc-cut` as the active engineering target and listed
`v6-rc-stabilization` as planned. The active target has been
`v6-rc-stabilization` since the first governed RC shipped, and
`documentation_currentness_test` now fails on that drift. Update items 2, 4,
and 5 to match the current governed state.
2026-04-16 22:57:37 +01:00
rcourtman b19991f4ae Fix published release body rendering 2026-04-16 22:20:17 +01:00
rcourtman 6fcdcf8b8e Add pre-release Helm chart smoke gate 2026-04-16 21:48:35 +01:00
rcourtman f2746960d6 Relax mounted storage-root hardening semantics 2026-04-16 21:37:11 +01:00
rcourtman 9855973e5b Fix non-root storage hardening for Helm startup 2026-04-16 21:26:02 +01:00
rcourtman d1a807e9c5 Fix Helm release-line branch fidelity and smoke diagnostics 2026-04-16 21:05:11 +01:00
rcourtman 447280a0ce Fix release-line demo workflow dispatch and verification 2026-04-16 20:54:01 +01:00
rcourtman 2868b44cf9 chore(release): bump version to 6.0.0-rc.2 2026-04-16 16:22:27 +01:00
rcourtman 596bcfb5e8 Make release candidate banner rc-version agnostic 2026-04-16 16:15:31 +01:00
rcourtman 7c1c5d396a Own mock runtime fixtures under monitoring 2026-04-16 16:00:23 +01:00
rcourtman 16d86ac094 Own VERSION under deployment-installability 2026-04-16 15:31:42 +01:00
rcourtman d1600d5ef1 Own prerelease feedback intake under deployment-installability 2026-04-16 15:18:46 +01:00
rcourtman 92d1b22fb1 Own upgrade guide under deployment-installability 2026-04-16 15:06:54 +01:00
rcourtman 954a7c06c7 Tighten rc release packet runbook 2026-04-16 14:57:07 +01:00
rcourtman 78c5107b47 Own release packet docs under deployment-installability 2026-04-16 14:52:30 +01:00
rcourtman f29104d693 Draft rc2 changelog packet 2026-04-16 14:45:14 +01:00
rcourtman 02194a237e Draft rc2 release notes packet 2026-04-16 12:22:03 +01:00
rcourtman 76bbf16105 Lock self-hosted paid extras packaging 2026-04-16 12:15:06 +01:00