Commit Graph

8746 Commits

Author SHA1 Message Date
courtmanr@gmail.com 2e31e338bb feat(agent): collect Windows storage temperatures 2026-07-30 19:51:54 +01:00
courtmanr@gmail.com 9e8b3ee6ff feat(agent): add REST custom metrics 2026-07-30 19:08:28 +01:00
courtmanr@gmail.com c0233ad56b feat(agent): add secure custom numeric sensors 2026-07-30 18:34:02 +01:00
courtmanr@gmail.com 9c772a7200 feat(agent): collect NVIDIA telemetry on Windows 2026-07-30 18:01:37 +01:00
courtmanr@gmail.com e13f42667e feat(kubernetes): add OpenShift-safe Helm profile 2026-07-30 17:38:02 +01:00
courtmanr@gmail.com 32a215203c feat(storage): surface PBS host physical disks 2026-07-30 17:23:38 +01:00
courtmanr@gmail.com 6c82a3c47c feat(monitoring): promote GPU load to first-class metrics 2026-07-30 16:58:52 +01:00
courtmanr@gmail.com 218661a396 feat(storage): surface Proxmox ZFS datasets 2026-07-30 16:45:13 +01:00
courtmanr@gmail.com c700454b18 docs(branding): complete subsystem governance evidence 2026-07-30 16:30:18 +01:00
courtmanr@gmail.com 672db9113f feat(branding): customize application identity 2026-07-30 16:25:36 +01:00
courtmanr@gmail.com 647d062531 feat(patrol): allow reopening dismissed findings 2026-07-30 15:47:55 +01:00
courtmanr@gmail.com a38d21bb86 feat(alerts): add initial delivery routing 2026-07-30 15:37:53 +01:00
courtmanr@gmail.com 206d3a1c4d feat(kubernetes): scope overview workloads by cluster 2026-07-30 15:10:49 +01:00
courtmanr@gmail.com 4e03ecd9aa test(notifications): align email routing expectations 2026-07-30 15:05:44 +01:00
courtmanr@gmail.com 9245da363f docs(governance): record notification tag routing contract 2026-07-30 14:54:34 +01:00
courtmanr@gmail.com 51d4b12415 feat(notifications): route alerts by resource tags 2026-07-30 14:48:42 +01:00
courtmanr@gmail.com 6e710cd4aa feat(docker): show container update target details 2026-07-30 13:55:43 +01:00
courtmanr@gmail.com ff0a7a4827 Align Apprise topic copy tests 2026-07-30 13:22:47 +01:00
courtmanr@gmail.com 4ff4b61ccc Restore Apprise Telegram topic delivery 2026-07-30 13:10:59 +01:00
courtmanr@gmail.com f985e616d6 Allow in-place API token scope edits (#1629) 2026-07-30 12:06:19 +01:00
courtmanr@gmail.com d201b14f1b Document host-relative memory contracts (#1326) 2026-07-30 11:34:09 +01:00
courtmanr@gmail.com 046158bda5 Add host-relative guest memory view (#1326) 2026-07-30 11:31:00 +01:00
courtmanr@gmail.com 110ed3eb2b Support guest filesystem alert overrides (#1205) 2026-07-30 10:59:27 +01:00
courtmanr@gmail.com 69cfce92d3 Expose per-resource alert delay controls (#1497) 2026-07-30 10:27:39 +01:00
courtmanr@gmail.com cb1768d484 Update node modal form shape proofs 2026-07-30 09:48:24 +01:00
courtmanr@gmail.com 101735588c Add Docker host web interface access (#1276) 2026-07-30 09:31:28 +01:00
courtmanr@gmail.com 6922c8ad57 Fix PBS datastore exclusions before detail polling (#1105) 2026-07-30 09:21:57 +01:00
courtmanr@gmail.com 53c5122665 fix(updates): keep LXC installer guidance release-local (#1408)
Contract-Neutral: Issue #1408 keeps release-local signed-installer guidance; update APIs and deployment behavior are unchanged, with direct model coverage.
2026-07-30 01:02:50 +01:00
courtmanr@gmail.com c3c6b96cbd test(agent): keep QNAP watchdog proof cross-platform (#1617) 2026-07-30 00:54:04 +01:00
courtmanr@gmail.com 4d4567e4a4 fix(updates): stop recommending unsafe LXC helper (#1408)
Contract-Neutral: Issue #1408 changes update guidance only; update APIs and deployment behavior are unchanged, with direct UI regression coverage.
2026-07-30 00:49:27 +01:00
courtmanr@gmail.com 378ffcde16 docs: define QNAP watchdog singleton contract (#1617) 2026-07-30 00:43:31 +01:00
courtmanr@gmail.com 69475117be fix(agent): prevent duplicate QNAP watchdogs (#1617) 2026-07-30 00:40:27 +01:00
courtmanr@gmail.com 94c908419b Fix discovery blocklist for configured subnets (#1616) 2026-07-30 00:18:48 +01:00
courtmanr@gmail.com 41978482e7 Restore cross-platform verification coverage
Use a native absolute path in the SMART override test so Windows verifies the same contract as Unix. Move the metrics concurrency proof into the canonical verification artifact and document that live ingestion remains independent from lifecycle maintenance.
2026-07-29 23:17:58 +01:00
courtmanr@gmail.com 0c5944b8eb Preserve full poll budget for large PVE clusters
Do not let a short per-request connection timeout shrink the whole inventory cycle below its 90-second default. The seven-node support bundle for #1437 showed hundreds of successful guest reads followed by exact 30-second cancellation and dead-lettering, preventing a coherent generation from publishing. Larger request timeouts can still expand the cycle up to MAX_POLL_TIMEOUT.\n\nFixes #1437
2026-07-29 23:11:45 +01:00
courtmanr@gmail.com 7c91724191 Keep metrics ingestion live during maintenance
Run startup maintenance, rollups, and retention on a lifecycle-owned worker separate from buffered metric ingestion. SQLite still serializes write transactions, while maintenance CPU/read work can no longer stop writeCh from draining until it drops live batches. Join both workers before closing the shared database.\n\nFixes #1601
2026-07-29 23:07:20 +01:00
courtmanr@gmail.com f1ae0af646 Stop warning for permitted unsigned remote config
When remote-config signature enforcement is disabled, an unsigned response is an expected compatibility state rather than a warning. Keep its structured diagnostic at debug while preserving warning/error behavior for required, expired, future, or invalid signatures.\n\nFixes #1538
2026-07-29 23:03:00 +01:00
courtmanr@gmail.com 02d47ba514 Merge remote-tracking branch 'origin/main' into feature/external-probe-alerting 2026-07-29 22:26:35 +01:00
courtmanr@gmail.com 1684244f76 document integration contracts and canonical proofs 2026-07-29 22:22:46 +01:00
courtmanr@gmail.com c5d7941d08 Merge remote-tracking branch 'origin/main' into feature/external-probe-alerting 2026-07-29 22:21:04 +01:00
courtmanr@gmail.com ad054defaf fix outstanding integration and agent regressions 2026-07-29 22:10:04 +01:00
courtmanr@gmail.com 0ff0a37f8d Use server time for probe freshness 2026-07-29 21:28:26 +01:00
courtmanr@gmail.com d4e5326059 Ratchet private boundary audit debt 2026-07-29 20:09:23 +01:00
courtmanr@gmail.com 352c8cef7a Fix companion compatibility CI 2026-07-29 20:09:23 +01:00
courtmanr@gmail.com a53d45e2d3 Harden external probe outage alerting 2026-07-29 20:09:23 +01:00
courtmanr@gmail.com f4dd8096aa Prepare v6.2.0-rc.4 release
Fourth candidate on the v6.2.0 line, superseding v6.2.0-rc.3 and still following stable v6.1.2. This hardening cut includes action recovery, kiosk containment, alert and notification accounting, node-restricted Proxmox storage, container-runtime selection, and host CPU sampling fixes that landed after rc.3. Version pins move to 6.2.0-rc.4 across the repo root, Docker bootstrap defaults, and Helm metadata; stable install pointers remain on v6.1.2 until governed promotion.
v6.2.0-rc.4
2026-07-29 14:49:51 +01:00
courtmanr@gmail.com 8aeffc456d Parallelize Build and Test and add a local pre-push check
The Build and Test workflow ran everything in one serial job — frontend
lint/tests/build, the full go test -race sweep, and benchmarks — for a
37-55 minute wall clock on every push. The job now splits into parallel
jobs: frontend (lint, unit tests, type-check, bundle build and size gate),
backend tests sharded three ways with internal/api on its own shard since
it alone takes ~10m under -race, script smoke tests with the backend
build, and benchmarks with the existing baseline cache flow. Backend jobs
satisfy the frontend embed with a stub index.html, which unit tests do
not assert against; the real bundle is still built and size-gated by the
frontend job and by release builds. Expected wall clock is roughly the
slowest single job, 10-15 minutes.

A new changes job skips the build/test jobs when a push touches only
docs/ and Markdown, mirroring the path filters Core E2E already has. The
gitleaks secret scan deliberately stays unconditional since this workflow
is the only per-push scan and docs can leak secrets too.

scripts/dev-prepush.sh runs the checks that most often turn main red,
scoped to the outgoing commits: the canonical completion guard in CI
mode, the registry snapshot tests when registry.json changed, the
mutation registry audits, build plus tests for touched Go packages, and
the frontend type-check. It exists because CI verdicts arrive well after
the push; today's unclassified force-fail route would have failed it
locally in about a minute.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 14:32:01 +01:00
courtmanr@gmail.com 848e166f5d Fix alert and notification telemetry signals 2026-07-29 14:17:19 +01:00
rcourtman 000986f125 Keep kiosk sessions off settings surfaces and silence the truncated-status security banner (#1650)
Kiosk mode is frontend-only and a kiosk API token carries monitoring:read
alone, but the shell treated kiosk as a display preference rather than an
authority fact. Pressing Escape on a kiosk display revealed the full header,
the navigation, and a security-warning banner offering links into Settings.

Three separate bugs produced that:

Escape called toggleKioskMode() unconditionally. setKioskMode(false) writes
'false' to sessionStorage, so the exit was sticky for the rest of the browser
session and the auto-enable effect never re-armed. Escape now exits kiosk only
for a session that can reach settings; a scope-limited session gets the
temporary header reveal the hover and touch affordances already provide.

The redirect that keeps sessions off /settings, /patrol and the
alert-configuration tabs ran only while kiosk was on, so once Escape had turned
kiosk off a kiosk-token session could navigate into Settings. It now also keys
off whether the session's token can read settings, so it holds with kiosk off.
The panels themselves already 403 server-side; this is UI containment, not an
auth change.

/api/security/status truncates its payload by authority and names the tier in
detailLevel. A token without settings:read gets an 'authenticated' payload with
no posture fields at all, which the banner read as disabled controls and turned
into a false security score with an "Enable Security" link. The visibility
helper now refuses to assert anything the payload does not carry: an
authenticated payload raises nothing, a public payload is authoritative for
hasAuthentication only so a genuinely unauthenticated instance is still warned
about, and a privileged payload keeps the full assessment. The remaining global
banners deep-link into settings too, so that block is gated on the same
settings-access predicate.

Scope membership is now decided once by sessionHasSettingsAccess in
AppLayout.tsx and shared with App.tsx instead of being re-derived inline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 14:06:50 +01:00
courtmanr@gmail.com 8aac88588c Classify the action force-fail route in the mutation registry (#1649)
The Canonical Governance mutation registry audit scans the real router
sources and fails closed on any infrastructure route it cannot resolve to
a registry disposition, so the new POST /api/actions/{id}/force-fail
route broke the audit on main. Register it as the lifecycle entry
action.api.force-fail, executed by internal/actionlifecycle.Service.ForceFail
under the same execute_action capability, admin approval floor, and
committed-lifecycle delivery as execute, and classify the route in the
runtime surface catalogue.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 12:33:49 +01:00