Commit Graph

4535 Commits

Author SHA1 Message Date
pulse-triage[bot] 8033fa581a fix(monitoring): serialize delivery health alert projection
Concurrent timer and queue callbacks could apply an older health snapshot after a newer one, hiding a new delivery failure or resurrecting a dismissed warning. Serialize the complete read/apply operation without holding the monitor or queue mutex across alert updates.

Add isolated channel-controlled stale-clear and stale-raise regression cases. Removing the lock fails both final-state assertions; restored code passes 100 race-enabled focused repetitions. This does not qualify the integrated release candidate or clear unrelated adverse evidence.

Change-source: pulse-maintainer
Contract-Neutral: Restores monitoring contract extension point 21 immediate canonical delivery-warning reconciliation by serializing existing read/apply operations; no public API, verdict, throttle, alert identity, or agent-lifecycle contract changes. Existing isolated ordering regression tests cover both stale-clear and stale-raise outcomes.
2026-09-06 20:02:06 +01:00
pulse-triage[bot] 05e31eadf0 test(monitoring): synchronise canonical token host fixture
GetMonitor starts polling concurrently, so monitor.mu does not protect the fixture host slice from State.GetSnapshot. Use the state-owned UpsertHost setter to match the reader lock while retaining all canonical-token diagnostics assertions. Addresses the fixture race reported in PR1943 rest-1; no production behaviour changes.

Change-source: pulse-maintainer
2026-09-06 19:46:16 +01:00
pulse-triage[bot] 4fd68c72b2 test(monitoring): guard startup against blocked alert replay
Hold the replay serialization lock while attaching the resource store to prove history catch-up stays off the router construction path. Retain the imported-history and idempotence assertions after releasing replay so availability cannot be achieved by dropping repair.

Change-source: pulse-maintainer
2026-09-06 14:54:46 +01:00
pulse-triage[bot] d4f3f2f15d test(alerts): verify storage restart lifecycle through HTTP receipts
Callback and queue restart tests cover separate boundaries. Exercise the monitor handlers and ordinary dispatcher together so missing capacity cannot silently produce a recovery, restart cannot replace incident identity, and recurrence still reaches a local HTTP receiver.

Change-source: pulse-maintainer
2026-09-06 14:34:03 +01:00
pulse-triage[bot] bfd4ce6c85 Merge candidate 20260906T125520Z-core-runtime
Change-source: pulse-maintainer
2026-09-06 14:16:35 +01:00
pulse-triage[bot] 35181d4c91 fix(tests): supply valid PBS datastore health fixture
The advanced proposal's complete backend shard exposed a shared PBS fixture that returned an array from the datastore-status endpoint. Supply the healthy datastore observation those node-metric lifecycle tests intend, preventing the live datastore evaluator from fabricating an unrelated connectivity incident.

Change-source: pulse-maintainer
2026-09-06 14:12:46 +01:00
pulse-triage[bot] f5eba15cf6 test(pbs): enforce datastore policy through live polling
Cover disabled alerting, storage suppression and canonical datastore overrides before the polled capacity lifecycle. Removing the conversion alias makes the disabled-override regression case fail.

Change-source: pulse-maintainer
2026-09-06 14:02:02 +01:00
pulse-triage[bot] 64575d7b7d test(pbs): preserve capacity incidents across failed datastore listings
Fresh PBS polling now evaluates datastore alerts directly. Protect the missing-list boundary so permission errors, upstream failures, malformed responses and empty listings cannot silently resolve an existing capacity incident during unified sync; retain observed recovery and recurrence checks.

Change-source: pulse-maintainer
2026-09-06 13:24:18 +01:00
pulse-triage[bot] 3b21ed22a4 fix(pbs): evaluate configured datastore alerts on live polls
Connect fresh PBS storage observations to the existing capacity and connectivity evaluator. Exercise HTTP polling through unified sync, absent counter retention, confirmed empty recovery and recurrence with alternate counter names.

Change-source: pulse-maintainer
2026-09-06 12:59:04 +01:00
pulse-triage[bot] 2e93644991 test(alerts): protect storage connectivity recovery across restart
Exercise mirror and SQLite restoration through missing connectivity, independent healthy capacity, confirmed recovery and a second restart. Negative control fails in both modes with the old missing-status recovery behaviour.

Change-source: pulse-maintainer
2026-09-06 12:24:27 +01:00
pulse-triage[bot] 5aa9d44b0a test(alerts): cover storage recurrence across persistent restarts
The storage persistence regression stopped after recovery, leaving a later occurrence untested. Extend both recovery-mirror and SQLite paths through renewed pressure, restart, missing capacity and measured recovery to protect occurrence identity without claiming notification receipt.

Change-source: pulse-maintainer
2026-09-06 11:58:18 +01:00
pulse-triage[bot] 1a3450a5b0 test(config): protect failed dormant host ownership transfer
Verify failed node-link persistence rolls back both the displaced owner and replacement, preserves report watermarks and reservations, and permits a durable retry on the same store. A rollback-omission negative control reproduces the assertion failure; no runtime behaviour changes.

Change-source: pulse-maintainer
2026-09-06 11:29:44 +01:00
pulse-triage[bot] 449f3b1bc8 fix(monitoring): persist operator host node link intent
Commit link and unlink journal updates before publishing state, preserve manual selections across report and provider refresh boundaries, and reserve dormant owners across restart. Re-evaluate known automatic associations using provider names while retaining legacy unknown links.

Change-source: pulse-maintainer
2026-09-06 11:13:59 +01:00
pulse-triage[bot] c268d25e54 test(monitoring): protect manual links against stale association cleanup
Record reproduced restart gaps and legacy provenance ambiguity; do not enable destructive cleanup.\n\nChange-source: pulse-maintainer

Change-source: pulse-maintainer
2026-09-06 10:19:41 +01:00
pulse-triage[bot] 7f80c2c0b8 test(monitoring): protect asymmetric bridge association boundaries
Symmetric bridge fixtures can pass when one address inventory loses its filter. Exercise repeated ingestion with one-sided Docker bridges and valid custom management bridges, checking both link directions. Mutation checks reject loss of either filter and the earlier broad bridge exclusion.

Change-source: pulse-maintainer
2026-09-06 09:33:06 +01:00
pulse-triage[bot] 2ed9965968 fix(monitoring): preserve custom bridge link evidence
Limit automatic Docker bridge filtering to the generated br-<12 hex> convention so custom management bridges such as br-mgmt remain eligible for host association. Keep docker-prefixed and non-global-unicast exclusions intact.

Change-source: pulse-maintainer
2026-09-06 09:28:51 +01:00
pulse-triage[bot] 386fc0415e fix(monitoring): reject host-local addresses in agent auto-linking
A Docker bridge or link-local address can be unique among monitored PVE nodes but also exist on an unrelated NAS. Counting PVE owners alone then creates a false reciprocal agent association. Exclude host-local IPs and known Docker bridge interfaces from automatic network evidence, preserving management bridges and explicit unicast report IPs.

Seven synthetic negative cases fail before this repair and pass afterwards. Focused matcher and host-report tests pass under the race detector. This prevents a reproduced backend misassociation; it does not establish the cause or resolution of issue #1930, whose diagnostic payload remains unavailable.

Change-source: pulse-maintainer
2026-09-06 09:18:59 +01:00
pulse-triage[bot] 088f597907 Merge current upstream main after PR #1929
Preserve the reviewed alert and TrueNAS work while incorporating the canonical API metrics optimization and patrol qualification record.

Change-source: pulse-maintainer
2026-09-06 09:12:03 +01:00
rcourtman cf98358c0e Merge pull request #1929 from rcourtman/fix/retained-history-coverage
perf(api): avoid rune decoding in route label checks
2026-09-06 09:08:50 +01:00
pulse-triage[bot] 9a8ee6a5a7 fix(alerts): keep normalized offline capacity suppressed
Use the normalized connectivity status consistently when deciding whether storage capacity is actionable, preserving the existing offline suppression rule for case and whitespace variants.

Change-source: pulse-maintainer
2026-09-06 08:45:39 +01:00
pulse-triage[bot] 2e661e075a fix(alerts): preserve storage incidents when connectivity is unknown
Do not count empty or unknown storage status as recovery evidence. Normalise status spelling for connectivity checks while leaving capacity evaluation independent and preserving existing inactive/disabled storage behaviour.

Change-source: pulse-maintainer
2026-09-06 08:40:29 +01:00
rcourtman a2f0ef8817 perf(api): avoid rune decoding in route label checks
Route labels classify ASCII digits and hexadecimal UUID bytes. Scan those
bytes directly while preserving numeric precedence, Unicode names and
invalid UTF-8 handling. This reduces the shared normaliser overhead exposed
by paired landing benchmarks without changing the benchmark gate.

Refs #1928

Contract-Neutral: ASCII route-label optimization preserves label values, identifier precedence, Unicode and invalid UTF-8 behavior, and agent lifecycle authority.
2026-09-06 08:31:26 +01:00
pulse-triage[bot] 7425089632 test(alerts): verify PBS webhook receipts across manager restart
Existing HTTP receipt coverage exercised uninterrupted operation while restart coverage ended at internal callbacks. Recreate both disk-backed managers during a missing-observation incident and after recovery to verify local transport delivery, incident identity, retained history and recurrence together. This does not qualify an installed binary or external provider.

Change-source: pulse-maintainer
2026-09-06 08:23:10 +01:00
rcourtman 6d2d188867 Merge pull request #1928 from rcourtman/fix/retained-history-coverage
fix(patrol): preserve evidence across history and access failures
2026-09-06 08:18:16 +01:00
rcourtman 173d74a8e4 test(patrol): exercise dependency and restart fault oracles
Validate the checked-in dependency and three service restart fault contracts
against disposable Docker resources before using them to assess model output.
Verify baseline, injected fault, refused duplicate injection, explicit fixture
recovery, and two-pass cleanup with unchanged pre-existing inventory.

These opt-in tests make no Pulse or model request. Fixture recovery is teardown
and does not count as an approval, rejection, execution or customer outcome.
Record exact live, owning-package and source-bound proof in the redesign plan.
2026-09-06 07:42:32 +01:00
rcourtman 58caeda69b fix(assistant): retain monitored targets without command access
Resolve monitored topology before checking command connections so unavailable
inspection retains the known resource and parent node. Prevent known targets
from falling through to a colliding agent ID, and preserve the single-agent
requirement when no target is supplied.

Use one failed tool envelope for diagnostic reads and file mutations. Missing
connections neither prove an installation problem nor count as successful
writes. Hypervisor lifecycle authority remains on its canonical action path.

Verify disconnected and unknown targets, collision isolation, all affected
tool handlers, token/WebSocket scope boundaries, and the linked Patrol and
Assistant failure journey at desktop and narrow widths.
2026-09-06 07:27:05 +01:00
rcourtman b964eea767 fix(hostmetrics): retire disk probes before publishing results
A completed probe remained discoverable after its first caller returned,
allowing the next collection to reuse stale filesystem measurements.
Remove it and publish completion within one registry critical section.
Keep in-flight sharing, cancellation and timeout behaviour intact.

The controlled regression fails before this change. Twenty full package
runs and three race runs pass on the worker.

Refs #1928
2026-09-06 06:28:00 +01:00
rcourtman 618700db5e test(patrol): qualify bounded service storage failures
Add a disposable service-storage fault with an independent filesystem
oracle, bounded tmpfs writes, identity checks and verified recovery.
Exercise overwrite and symlink refusal without contacting a model.

Align the published schema with supported summary-term groups and validate
the complete catalogue in CI. Record the exact proof and remaining model
and missing-access qualification limits in the customer-journey plan.
2026-09-06 06:04:56 +01:00
pulse-triage[bot] dc2839a050 Merge pull request #1927 from rcourtman/maintainer/20260906T041917Z
Protect alert recovery receipts across gaps and crashes
2026-09-06 05:59:04 +01:00
rcourtman f26668aa6d perf(metrics): reuse retained query plans and output series
Canonical tier reconciliation rebuilt SQL and probed absent preferred tiers
for each fallback point, regressing batch reads and allocation costs. Reuse
bounded query shapes with current bindings and snapshot-scoped absence
checks, then append consecutive points directly to their output series.

Preserve coverage and ordering semantics and verify fresh bindings after
new preferred observations arrive. Integrate current main test additions.
2026-09-06 05:36:19 +01:00
rcourtman 3347f561ec Merge pull request #1920 from rcourtman/fix/retained-history-coverage
fix(ai): preserve canonical evidence through diagnostic workflows
2026-09-06 05:30:17 +01:00
pulse-triage[bot] 11e2bd907d test(notifications): verify post-crash webhook event receipts
Extend abrupt-exit resolution coverage through the real notification processor and local HTTP receiver. Assert surviving grouped members and the resolved event, retaining terminal cancellation and dispatch assertions. This does not establish installed provider receipt or exactly-once crash delivery.

Validation: restart/crash tests passed ten race-enabled repetitions; broader receipt/restart selection passed three. Negative control erasing the recovery event fails the HTTP event/member assertion.

Change-source: pulse-maintainer
2026-09-06 04:34:13 +01:00
rcourtman ab9e0e4d3d fix(patrol): align qualification schema with action scenarios
The runtime and three restart scenarios use health_process_stop, but the
published schema rejected it. Accept that implemented injector and check
actual catalogue fault types against the schema to prevent recurrence.

Record the remaining missing-access and storage qualification gaps.
2026-09-06 04:33:20 +01:00
rcourtman f779bf064a Merge current main and verify diagnostic workflows
Integrate the latest alert, delivery and action-result changes with the
Patrol evidence conversation. Replace the conflicted browser receipt
with current source-bound qualification and fix shared warning-card
wrapping exposed by the intermediate-width check.

Real diagnostic and autonomous action outcome qualification stays open.
2026-09-06 04:22:09 +01:00
pulse-triage[bot] 4d87bd37c5 test(monitoring): verify PBS observation-gap webhook receipts
Manager callback tests do not establish notification transport receipt. Exercise real monitor callbacks and the queued generic webhook path through firing, missing metrics, recovery and a distinct renewed breach, protecting against false recovery messages when PBS observations disappear.

Validation: ten focused race-enabled repetitions passed; three paired repetitions with the existing guest recovery transport test passed. Removing the PBS missing-metrics guard makes this test fail on a false recovery webhook. No runtime behaviour changes.
Change-source: pulse-maintainer
2026-09-06 04:11:18 +01:00
rcourtman 61607333cc fix(ai): keep Patrol decisions in one evidence conversation
Remove contextless evaluator and assessment passes, signal-count budgets,
and post-finding prompt replacement. Keep evidence tools available until
explicit run limits and retain incomplete assessments and provider errors
alongside accepted decisions. Failed file reads now preserve error status
through the model, telemetry and saved Assistant history.

Full chat, AI and tools packages, focused Patrol API and race tests pass.
Real read-only and scripted browser checks preserve failed reads and linked
uncertainty. Real-model and verified action outcome qualification remain open.
2026-09-06 03:59:37 +01:00
pulse-triage[bot] 26d0af7a68 test(alerts): cover checkpoint recovery mirror write failures
SQLite remains authoritative when the JSON recovery mirror cannot be renamed. Exercise firing and resolved snapshots across restart so a failed mirror cannot silently lose or resurrect an incident. Close the event store before shutdown to prevent a second checkpoint from masking failure; also verify error reporting and temporary-file cleanup.

Change-source: pulse-maintainer
2026-09-06 03:51:04 +01:00
pulse-triage[bot] e63704d890 test(alerts): verify PBS capacity callbacks across restart
Missing capacity and a measured empty datastore both report zero usage. Protect the existing distinction across durable manager restarts so missing observations cannot send a false recovery, while genuine recovery and subsequent high usage still dispatch callbacks. Assert incident identity and persisted lifecycle event counts as well as the callback boundary.

Change-source: pulse-maintainer
2026-09-06 03:18:43 +01:00
rcourtman 668af3fe6b fix(ai): preserve uncertain investigation conclusions
Tool-call totals do not establish diagnostic sufficiency. Preserve seed-only
and failed-read conclusions, remove count-based completion instructions from
evidence, and retain configured limits and authority checks.

Keep findings grouped under alerts selectable in the shared review panel so
their investigations and access limits remain available to Assistant.
2026-09-06 02:47:55 +01:00
pulse-triage[bot] bb1d177d87 test(alerts): isolate pending threshold fixtures from persisted state
Main CI job 101407611069 failed when the pending-start test restored unrelated active alerts from the shared data directory. A synthetic persisted alert reproduces the same failure locally. Give all three legacy threshold fixtures their own temporary directory and stop their workers during cleanup, retaining every threshold and pending-start assertion.

Validation: seeded-directory focused race tests pass 30 repetitions after failing before the repair. No production alert behaviour changes.
Change-source: pulse-maintainer
2026-09-06 02:46:05 +01:00
rcourtman c5d2f56dda fix(ai): preserve diagnostic evidence and proposal boundaries
Keep canonical disk risk, source freshness and retained history intact when
Assistant and Patrol gather evidence. Proposal acceptance validates an action
contract and must not rewrite uncertain conclusions as established root cause.

Preserve complete subscription tool batches without exposing routing envelopes
as answers. Keep wide answer tables readable and keyboard-scrollable on mobile.
Optimize retained tier reconciliation without discarding gaps or newer samples.

Record failed real-model diagnoses and outstanding autonomous qualification
separately from passing data-path and interface checks.
2026-09-06 01:54:28 +01:00
pulse-triage[bot] da5be2db15 fix(alerts): preserve storage override identity during config reload
Retain storage policy aliases in durable metric and forecast metadata and use them during active-alert re-evaluation. Recover exact legacy PBS aliases from the recorded instance and datastore identity. Prevent a configuration reload from fabricating recovery against global defaults after restart.

Change-source: pulse-maintainer
2026-09-06 01:47:11 +01:00
pulse-triage[bot] 6252023fab test(notifications): preserve recovery receipts through provider outage
Successful ntfy transitions alone do not prove a rejected recovery can be retried after restart. Exercise real HTTP 503/202 responses and SQLite reopen, retaining the firing receipt on failure and clearing it only after recovery succeeds. Assert failed and successful audits remain truthful without replaying the firing notification.

Change-source: pulse-maintainer
2026-09-06 01:31:27 +01:00
pulse-triage[bot] 806990af2b test(notifications): verify queued ntfy lifecycle HTTP receipts
Exercise the real queue processor alongside direct delivery for warning, critical, recovery and same-identity refiring. Require HTTP payload/header receipt and committed sent state, using an isolated temporary queue.

Change-source: pulse-maintainer
2026-09-06 01:02:48 +01:00
pulse-triage[bot] b34ca8ec3d Merge candidate 20260905T230019Z-core-runtime
Preserve the reviewed recurring-alert restart regression and its exact ancestry on current canonical main.

Change-source: pulse-maintainer
2026-09-06 00:57:00 +01:00
pulse-triage[bot] bde794de79 test(relay): serve revocation fixture over trusted TLS
The workspace-scoped managed relay proof still supplied an HTTP revocation origin after the canonical relay began enforcing HTTPS-only credential transport. Use a local TLS server and pass its certificate to the child process so the combined canonical repositories exercise the production boundary rather than failing during startup.

Change-source: pulse-maintainer
2026-09-06 00:53:30 +01:00
pulse-triage[bot] a61ef55d56 Protect recurring alert delivery after resolution and restart
Resolution must retire obsolete queue rows without permanently muting a resource condition. Extend the restart/retry regression to require delivery of a new incident sharing the resolved alert ID, alongside recovery and surviving grouped alerts.

Change-source: pulse-maintainer
2026-09-06 00:13:19 +01:00
pulse-triage[bot] 2a833eccdf Guard resolved notification durability across abrupt process exit
Exercise pending, interrupted, failed and dead-lettered grouped alerts without closing SQLite before restart. Verify that resolution survives and retry preserves only live members and genuine recovery. Also fix the disabled-delivery test race found by repeated race testing: queue construction already starts workers, so use the locked processor setter and await reconciliation.

Change-source: pulse-maintainer
2026-09-05 23:52:17 +01:00
pulse-triage[bot] 229d8668af Record disabled queued notifications as cancelled, not delivered
Distinguish policy skips from provider success so suppressed jobs do not create false sent rows or successful audit entries. Reconcile cancelled queue health after releasing alert gates, preserve real attempt history, and cover all three providers for firing/recovery and global/destination disablement.

Change-source: pulse-maintainer
2026-09-05 23:29:16 +01:00
pulse-triage[bot] f9b5f6254a Merge candidate 20260905T215524Z-core-runtime
Preserve the reviewed notification retry finality fix and its exact ancestry after incorporating the batch-start upstream main.

Change-source: pulse-maintainer
2026-09-05 23:15:23 +01:00