Commit Graph

8039 Commits

Author SHA1 Message Date
rcourtman 322f4fc50d Bind RG06 agent and host identity 2026-07-12 20:12:00 +01:00
rcourtman d518e7d33d Use canonical default tenant in RG06 2026-07-12 20:08:10 +01:00
rcourtman fedc77ef62 Route RG06 through canonical registry 2026-07-12 20:04:40 +01:00
rcourtman 06dcd59121 Bind RG06 report projection identity 2026-07-12 19:59:35 +01:00
rcourtman e0e6842cb5 Fix RG06 ext4 pressure fixture 2026-07-12 19:56:47 +01:00
rcourtman 7fd7e2b160 fix(frontend): key drawer guest web-interface URLs by the canonical workload id
The infrastructure resource drawer saved guest metadata (web interface
URLs) under the unified resource hash or the discovery resource id, a
keyspace no workloads table reads: the tables and the workloads drawer
resolve metadata by the canonical id (instance:node:vmid for PVE guests,
resource id otherwise), which is also the key v5 upgrades carry over in
guest_metadata.json. A URL saved from that drawer was stranded where
only the same drawer could read it back.

Route the drawer's guest metadata id through
getCanonicalWorkloadIdForResource, and canonicalize the resource type
inside that helper so lxc/oci-container/qemu spellings build the same
node-scoped id the workloads surfaces use.

Refs #1556
2026-07-12 19:52:21 +01:00
rcourtman 10b73e1964 fix(docker-agent): preserve shared network namespaces through container updates
One-click updates recreated containers from the raw inspected config, so
Docker rejected the create for any container using network_mode:
container:<id> (compose service:<x>) or host with "conflicting options:
hostname and the network mode", leaving the workload stopped under its
_pulse_backup_ name until the rollback rename restored it. Docker fills
Config.Hostname with the namespace owner's ID on such containers, so the
verbatim copy always tripped the daemon validation (verified against a
real Docker 29.5.2 daemon: verbatim create 409s, sanitized create
succeeds and the replacement starts in the shared namespace).

Strip the namespace-owned settings before ContainerCreate: hostname and
domainname for container:/host modes, plus exposed/published ports,
links, DNS options, and extra hosts for container: mode, all of which
the daemon derives from the owning namespace. Bridge and user-defined
networks are untouched.

Refs #1564
2026-07-12 19:48:18 +01:00
rcourtman 99aa2bd6eb Add Colima autonomy release proof 2026-07-12 19:47:56 +01:00
rcourtman 2d47c12e6d Normalize Pulse Intelligence release gates 2026-07-12 14:42:07 +01:00
rcourtman c07927adbd Classify action routes and operation transports 2026-07-12 13:55:19 +01:00
rcourtman e6d40f3c11 fix: bound denied model tool loops 2026-07-12 13:29:21 +01:00
rcourtman 90edcfe017 Fix strict APT lifecycle fixture 2026-07-12 13:00:02 +01:00
rcourtman 0062128414 Add durable Docker restart lifecycle proof 2026-07-12 12:11:16 +01:00
rcourtman 906d4823aa test(frontend): branch coverage for 7 pure modules (GLM wave 0712 tier 2d) 2026-07-12 10:49:05 +01:00
rcourtman 48ecb93848 test(frontend): branch coverage for 8 pure modules (GLM wave 0712 tier 2c) 2026-07-12 10:07:06 +01:00
rcourtman 353c5c63a4 test(frontend): branch coverage for 12 pure modules (GLM wave 0712 tier 2b) 2026-07-12 09:49:55 +01:00
rcourtman 00ff2e805c test(frontend): branch coverage for 6 pure modules (GLM wave 0712 tier 2a) 2026-07-12 09:19:35 +01:00
rcourtman 243f10f3c0 test(frontend): branch coverage for 5 pure modules (GLM wave 0712 batch 3b) 2026-07-12 08:19:49 +01:00
rcourtman 8f6888b7a4 test(frontend): branch coverage for 9 pure modules (GLM wave 0712 batch 3) 2026-07-12 08:05:51 +01:00
rcourtman 512606c40b test(frontend): branch coverage for 16 pure modules (GLM wave 0712 batch 2) 2026-07-12 07:34:44 +01:00
rcourtman 8321ed55c5 test(frontend): branch coverage for 7 pure modules (GLM wave 0712) 2026-07-12 06:36:22 +01:00
rcourtman b0ee11e162 Add trusted APT action review
Refs #1491
2026-07-12 06:33:42 +01:00
rcourtman d6838d3a25 Complete durable APT workflow continuity 2026-07-12 05:23:02 +01:00
rcourtman 71ad92ef71 test(frontend): branch-coverage tests for 10 more pure presentation/model modules 2026-07-12 04:39:10 +01:00
rcourtman 4aac79dc72 Add durable agent operation receipts 2026-07-12 04:16:22 +01:00
rcourtman 516179e5fa test(frontend): branch-coverage tests for 16 more pure model/presentation modules 2026-07-12 03:30:26 +01:00
rcourtman 1968ba210c test(frontend): de-brittle actionAudit verified-outcome assertion
The 'trusted action review workspace' change (e13abf84f) reworked the verified
verification-outcome copy, breaking a branchcov2 assertion that hard-coded the old
label/detail. Assert 'VERIFIED' normalises to the canonical 'verified' result
instead of exact copy, so the test stays focused on the toLowerCase branch.
2026-07-12 03:18:07 +01:00
rcourtman e77ab9518d Add safe APT workflow foundations 2026-07-12 02:53:01 +01:00
rcourtman e13abf84fa Add trusted action review workspace 2026-07-12 01:43:00 +01:00
rcourtman 1294695d6a test(frontend): branch-coverage tests for 28 pure model/presentation modules 2026-07-12 01:04:46 +01:00
rcourtman d8066ace0b Merge remote-tracking branch 'origin/main' 2026-07-12 00:21:36 +01:00
rcourtman 82c7c52727 Expose server-authored action policy provenance 2026-07-12 00:18:43 +01:00
mz 010d6435b8 Harden dotted hostname identity pin compatibility
Refs #1559
2026-07-11 23:41:07 +01:00
rcourtman 76f1084c9b Enforce server-owned Patrol Autopilot acknowledgement 2026-07-11 23:12:00 +01:00
rcourtman b7b897651b Add canonical action result truth 2026-07-11 21:27:00 +01:00
rcourtman cd7886aa44 Enforce server-owned action approval authority 2026-07-11 19:49:17 +01:00
rcourtman e5dbbb3145 Derive cluster-scoped canonical host IDs from full hostnames
Sibling of #1559: canonicalIDFromIdentity hashed the short hostname in
its cluster arm, so two machine-keyless Docker Swarm members with FQDN
hostnames sharing a first label (cloud.a, cloud.b) derived the same
cluster:<swarm>:cloud canonical ID and fully merged in the registry.
PVE is unaffected (single-label node names hash identically).

Both hostname-derived arms now hash NormalizeFullHostname. Derivation
stays a pure function of identity so store-less registries keep deriving
the same IDs as the durable one. Compatibility for hosts minted under
the short era: journal reads already merge both eras via
ResourceIdentityPin.EraIDs, and new canonical-ID succession re-keys
resource_operator_state and action_audits rows to the successor ID at
pin persist (never across a contradicting machine key, never while the
old ID is still live, never rewriting journal rows) so operator intent
like never-auto-remediate survives the era change. Already-merged
keyless pairs cannot be retroactively split; the merged rows succeed to
whichever member persists first.
2026-07-11 19:05:14 +01:00
rcourtman a23a8fad9a Addresses #1558 2026-07-11 19:02:14 +01:00
rcourtman aefc631374 Addresses #1559
The code fix (preserve full dotted hostnames in identity pins and the
presentation host coalescer, with short/FQDN equivalence kept for
matching) rode commit 1d3b8e194 through a shared-index race. This
commit carries the unified-resources subsystem contract update and
moves the end-to-end regression test into registry_test.go.
2026-07-11 18:31:45 +01:00
rcourtman 0b6b97115b Addresses #1557 2026-07-11 18:30:43 +01:00
rcourtman 76dc690840 Suppress recovery notifications when the firing never left the queue
An alert that resolved while its firing notification was still in the
grouping window or waiting in the persistent queue (alert delay pushes
activation close to resolution; quiet-hours replay defers delivery)
produced a recovery-only notification: CancelAlert dropped the queued
firing, but LastNotified had been set optimistically at dispatch, so
the resolved-notification gate believed the firing had been sent.

CancelAlert now reports whether it cancelled a firing notification that
had not been delivered (grouping window entries and pending queue rows;
mid-send rows are excluded because their delivery may still complete),
and handleAlertResolved suppresses the recovery in that case. This also
covers the quiet-hours replay bypass: a recovery only follows a deferred
firing if the replay was actually delivered.

Addresses #1553
2026-07-11 18:28:28 +01:00
rcourtman 1d3b8e1949 Addresses #1555 2026-07-11 18:25:17 +01:00
rcourtman 175309b8f7 Thread alert emails with their resolved notifications
Every email covering a single alert now carries In-Reply-To and
References headers set to a deterministic incident thread ID derived
from the alert ID and firing start time, so mail clients thread the
firing, re-notification, and resolved emails of one incident together.
Message-ID stays unique per send because re-notified incidents send
multiple emails and some providers de-duplicate on Message-ID. Grouped
emails skip threading since firing and resolved batches rarely contain
the same alert set.

Addresses #1543 (discussion)
2026-07-11 18:22:07 +01:00
rcourtman 5a6871813f Grant CAP_NET_RAW to the installed systemd unit for ICMP probes
The installer's unit hardens with NoNewPrivileges=true, which strips the
ping binary's setuid/file capabilities, so ICMP availability probes could
never work on a systemd install. Grant the capability ambiently instead,
document the systemctl edit override for existing units, and pin the
hardening block with an install test and contract clause.

Addresses #1554 (discussion)
2026-07-11 18:15:22 +01:00
rcourtman a44e5513ca Register template funcs on the enhanced ntfy payload path
The ntfy branch of prepareEnhancedWebhookExecution parsed the payload
template without templateFuncMap(), so the built-in ntfy preset (which
uses {{.Type | title}}) failed to parse and Test sends returned HTTP
400 with "function \"title\" not defined". Register the func map on
that parse, matching the generic webhook path, and add a regression
test that renders the actual built-in ntfy preset template.

Addresses #1549
2026-07-11 18:11:22 +01:00
rcourtman 71ea14e4dd Add durable action dispatch continuity 2026-07-11 16:08:44 +01:00
rcourtman f510b99095 Enforce the canonical mutation plane 2026-07-11 15:19:41 +01:00
rcourtman c74c88fb86 Fix dispatch-time policy revocation 2026-07-11 14:29:26 +01:00
rcourtman e65bef8e84 Fix atomic action lifecycle replay 2026-07-11 14:02:32 +01:00
rcourtman c0bbed1c59 test(frontend): branch-coverage tests for 19 more pure frontend modules
Wave 2 of coverage_backlog_2026-07-11 (items 17-35): new *.branchcov.test.ts
covering top uncovered-branch functions in patrolRunPresentation,
infrastructureSelectors, resourceDetailDiscoveryModel, thresholdsResourceModel,
infrastructureSummaryCache, monitoredSystemPresentation, connectionsTableModel,
activeTurnStatus, resourceStoragePresentation, storagePoolDetailPresentation,
cephSummaryPresentation, settingsNavigationModel, workloadMetricHistoryModel,
resourceCorrelationPresentation, recoveryItemTypePresentation,
setupCompletionModel, storagePageState, discoveryPresentation, searchQuery.
GLM-authored, verify-gated: vitest (888 tests) + full type-check + eslint +
adversarial GLM review (KEEP 19/19). Tests only, no source changes.
2026-07-11 13:05:13 +01:00