Commit Graph

10282 Commits

Author SHA1 Message Date
pulse-triage[bot] 2a926cddcf Merge pull request #1905 from rcourtman/maintainer/20260905T100105Z-release-v6.4
Protect PBS history through rebuilds and restarts
2026-09-05 11:38:02 +01:00
pulse-triage[bot] 141d578535 test(monitoring): backport PBS observation lifecycle regression coverage
Backport-of: c590a01f33

Protect the existing release-line repair d33f81709e for candidate regression #1882 across repeated registry rebuilds and SQLite close/reopen. No runtime or product scope change.

Validation: focused test passes; restoring rebuild timestamps fails with 18 samples instead of 3; lifecycle and canonical-storage tests pass three race repetitions.

Contract-Neutral: regression coverage for existing observation-time behaviour.

Change-source: pulse-maintainer
2026-09-05 10:13:41 +01:00
pulse-triage[bot] e04291d5fa Merge pull request #1903 from rcourtman/maintainer/20260905T080159Z-release-v6.4
Keep v6.4 alerts and navigation reliable through reconnects
2026-09-05 09:22:23 +01:00
pulse-triage[bot] fba4c0f5f3 Merge current upstream release/v6.4 after PR #1902 integration
Preserve the reviewed reconnect navigation backport while incorporating the canonical merge of the critical-transition alert repair.

Change-source: pulse-maintainer
2026-09-05 06:03:56 +01:00
pulse-triage[bot] d8f2c99163 Merge pull request #1902 from rcourtman/maintainer/20260905T040121Z-release-v6.4
Notify when provider incidents become critical
2026-09-05 06:02:18 +01:00
pulse-triage[bot] 09156b2d84 fix(web): backport reconnect navigation admission regression
Backport-of: 672a497076 (runtime, tests and matching contracts; fresh release-line browser receipt).

Reproduced alert-only admission failure on 2c4b27fc4b. 87 focused tests, three isolated Chromium checks and three focused alert race repetitions pass. Published artifact qualification and restarted patch soak remain outstanding.

Change-source: pulse-maintainer
2026-09-05 05:09:33 +01:00
pulse-triage[bot] 2c4b27fc4b Merge upstream release/v6.4 after PR #1901 integration
Change-source: pulse-maintainer
2026-09-05 04:56:15 +01:00
pulse-triage[bot] 74eb3487d9 Merge pull request #1901 from rcourtman/maintainer/20260905T030322Z-release-v6.4
Preserve TrueNAS emergency alerts on the v6.4 patch line
2026-09-05 04:38:41 +01:00
pulse-triage[bot] 096d1a6170 fix(alerts): backport provider critical transition dispatch
Reproduced on release candidate 7f44ccd047: WARNING to EMERGENCY retained severity but dispatched only once instead of twice. Backport the existing delivery repair and acknowledgement/rate-budget lifecycle regression coverage; no new product scope.

Backport-of: 4752d5b4b7 (code and tests), b116d05592

Validation: five focused race repetitions passed; pre-fix active transition failed. Appliance/provider receipt and restarted candidate soak remain outstanding.

Change-source: pulse-maintainer
2026-09-05 04:13:33 +01:00
pulse-triage[bot] 7f44ccd047 Merge current upstream release/v6.4 for publication
Change-source: pulse-maintainer
2026-09-05 04:05:20 +01:00
pulse-triage[bot] 31c939b3ef Merge pull request #1897 from rcourtman/maintainer/20260905T010422Z-release-v6.4
Prevent false storage alerts on the v6.4 patch line
2026-09-05 02:56:32 +01:00
pulse-triage[bot] d40d5206d0 fix(truenas): backport emergency incident retention
Backport runtime mapping and regression tests from 65a024b3d3. Candidate v6.4.3-rc.1 and stable v6.4.1 omit the documented EMERGENCY severity. Include release-line monitoring and unified-resource contracts for the repaired projection and recovery boundary.

Reproduced omitted projection, zero notification callbacks and false recovery before the fix. Affected package suites and focused race tests passed in the initial turn. Appliance and external-provider receipt remain unqualified.

Change-source: pulse-maintainer
2026-09-05 02:31:06 +01:00
pulse-triage[bot] d01a3ec423 test(alerts): cover TrueNAS escalation and interrupted recovery
The INFO and NOTICE repairs need lifecycle coverage beyond isolated severity transitions. Verify that escalation retains identity and that renewed actionable evidence interrupts recovery, preventing a later single INFO observation from clearing the incident.

Change-source: pulse-maintainer
(cherry picked from commit 62c66d2a48)
2026-09-05 02:06:04 +01:00
pulse-triage[bot] 2a7d8e242f fix(alerts): preserve actionable TrueNAS NOTICE incidents
Correct the INFO backport so native TrueNAS NOTICE remains actionable while retaining informational canonical severity. Preserve the provider level as optional evidence and pin projection, JSON compatibility, alert activation, and confirmed recovery boundaries.

Adapted from ff1d010dd9 for release/v6.4.

Change-source: pulse-maintainer
2026-09-05 01:46:02 +01:00
pulse-triage[bot] 059328e386 fix(alerts): keep TrueNAS information out of actionable incidents
Issue #1892 reports successful replication information requiring acknowledgement. Preserve provider information on resources while excluding TrueNAS INFO-level conditions from active alert synchronisation. Warning conditions still activate and clear when downgraded to information.

Resource-incident timeline events contain numeric placeholders, not threshold evidence. Avoid displaying these as a fictitious 0 >= 0 trigger while retaining numeric metric formatting. Focused regressions reproduce both failures and pass with these changes.

Change-source: pulse-maintainer
(cherry picked from commit 7726539f83)
2026-09-05 01:41:12 +01:00
pulse-triage[bot] d5b4c86a9a fix(truenas): recognise finished replication outcomes (#1892)
TrueNAS emits FINISHED for successful replication, but the recovery mapper treated it as unknown. Recognise that provider state while preserving error precedence and the missing-run guard; add regression coverage reproducing the reported outcome.

Change-source: pulse-maintainer
(cherry picked from commit 62c6e07477)
2026-09-05 01:41:12 +01:00
pulse-triage[bot] dc54789eb9 fix(unraid): suppress parity warning for explicit pool-only arrays
Issue #1895 reports parity alerts when mdNumDisks=0 on a pool-only Unraid system. Array service state alone does not establish that a parity array exists.

Preserve the optional disk count from collection through canonical runtime conversion and suppress only the no-parity warning for an explicit zero. Missing or malformed counts retain legacy behaviour, and disk failure reasons remain active.

Validated focused Unraid tests in hostagent, storagehealth, monitoring, unifiedresources and alerts, including JSON zero preservation and canonical round trip. The new pool-only regression fails against the previous warning condition. Both agent and server need this change; no release or reporter retest is claimed.

Change-source: pulse-maintainer
(cherry picked from commit 3334cccfd9)
2026-09-05 01:04:09 +01:00
pulse-triage[bot] ac44f232e6 Isolate host and Docker CPU sampling baselines (#1894)
Near-synchronous host and Docker reports consumed a shared CPU baseline, measuring collection bursts rather than each module's reporting interval. Retain a collector per host collector and a separate Docker module collector while preserving the package-level convenience API and disk filters.

Add an interleaved-counter regression covering both collection entry points. It fails when routed through the shared baseline and passes with isolated state. All hostmetrics, hostagent and dockeragent tests pass, as do the focused CPU regression tests under the race detector.

Change-source: pulse-maintainer
(cherry picked from commit 0f972f42f2)
2026-09-04 22:56:45 +01:00
pulse-triage[bot] 657211f056 Fix portable root ownership for installer lifecycle state
Issue #1890 reports macOS agent updates stopping because the root group does not exist. Use numeric superuser ownership in the two shared lifecycle writes without relaxing failure handling or the least-privilege group boundary. Add a regression fixture that rejects named root ownership and checks that chown failures still prevent replacement.

Change-source: pulse-maintainer
(cherry picked from commit 19c2b6a925)
2026-09-04 22:46:06 +01:00
pulse-triage[bot] c4593e8bce Adapt release-line fallback fixture to verified assets
The release line carries an additional oversized-metadata regression fixture. Model its published archive HEAD response so the backported existence check retains coverage without treating that fixture as a deleted release.

Refs: #1881

Contract-Neutral: backport test adaptation only

Change-source: pulse-maintainer
2026-09-04 22:27:14 +01:00
pulse-triage[bot] f62a80aac7 Verify feed fallback release assets
GitHub's Atom feed can retain entries for deleted releases. Probe the deterministic runtime archive without following redirects before exposing a feed candidate, and continue to the next published version when the candidate is stale. Keep custom update servers from falling through to the public feed on a 403.

Contract-Neutral: Update discovery validation only; no wire, persisted-data, or subsystem contract change
Refs: #1881
Change-source: pulse-maintainer
(cherry picked from commit 3193db66b0)
2026-09-04 22:26:02 +01:00
pulse-triage[bot] a867dd8d0e Fall back when release metadata exceeds bounds
GitHub's release list now exceeds the update check's 1 MiB safety limit,
causing valid installations to report that updates are unavailable. Keep the
bound and use the existing bounded Atom feed only for the typed over-limit
condition so malformed metadata remains a hard error.

Accept both release-name and bare-tag feed entries, and do not substitute the
public GitHub feed for a configured custom update server.

Contract-Neutral: Update discovery error handling only; no wire, persisted-data, or subsystem contract change
Refs: #1881
Change-source: pulse-maintainer
(cherry picked from commit a186bd205e)
2026-09-04 22:26:02 +01:00
pulse-triage[bot] f27d5b4620 Merge release/v6.4 backport candidate for coordination
Change-source: pulse-maintainer
2026-09-04 11:50:02 +01:00
pulse-triage[bot] 1656428982 Keep explicitly included tmpfs mounts distinct
Operators can explicitly select tmpfs paths that automatic filesystem
filtering would otherwise hide. Multiple such mounts commonly share both the
generic tmpfs device name and capacity, so applying normal storage
deduplication to them silently dropped configured disks from collection.

Limit device-and-capacity deduplication to normally visible storage while
preserving it for NAS bind mounts and subvolumes.

Change-source: issue #1875
2026-09-04 11:29:27 +01:00
pulse-triage[bot] f60d162e64 Merge current release/v6.4 telemetry guard
Incorporate the upstream test-telemetry protection without rewriting the reviewed local backport tip.

Change-source: pulse-maintainer
2026-09-04 11:08:00 +01:00
Richard Courtman 85c37443a6 Stop test binaries reporting to the production telemetry endpoint
Backport of the main-branch guard. pkg/server tests boot the real server
through Run() with the version literal "test-version", which normalizes to
0.0.0-test-version, and each test runs against its own t.TempDir(), so
every run mints a fresh install ID. The service-health failure reporter
sends synchronously from a deferred handler as soon as Run() returns an
error, so any test exercising a startup failure posts one ping.

This line still emitted after main was fixed: release-line lane work runs
pkg/server tests on this branch, and those pings arrive with the old
version classifier too, so they land mislabelled as ordinary prereleases
and re-contaminate install-population reads that were just corrected.

send() now refuses the production endpoint whenever testing.Testing()
reports true. The check compares against productionPingEndpoint, so
telemetry's own tests keep asserting on ping content through a redirected
endpoint. Verified on this branch: three runs of the failing-startup
tests, zero pings received.
2026-09-04 10:58:31 +01:00
rcourtman 142c49f8f2 Merge pull request #1887 from rcourtman/claude/telemetry-guard-backport-v6.4
Stop test binaries reporting to the production telemetry endpoint
2026-09-04 10:10:02 +01:00
Richard Courtman 0c788079d0 Stop test binaries reporting to the production telemetry endpoint
Backport of the main-branch guard. pkg/server tests boot the real server
through Run() with the version literal "test-version", which normalizes to
0.0.0-test-version, and each test runs against its own t.TempDir(), so
every run mints a fresh install ID. The service-health failure reporter
sends synchronously from a deferred handler as soon as Run() returns an
error, so any test exercising a startup failure posts one ping.

This line still emitted after main was fixed: release-line lane work runs
pkg/server tests on this branch, and those pings arrive with the old
version classifier too, so they land mislabelled as ordinary prereleases
and re-contaminate install-population reads that were just corrected.

send() now refuses the production endpoint whenever testing.Testing()
reports true. The check compares against productionPingEndpoint, so
telemetry's own tests keep asserting on ping content through a redirected
endpoint. Verified on this branch: three runs of the failing-startup
tests, zero pings received.
2026-09-04 10:07:27 +01:00
pulse-triage[bot] d33f81709e Keep PBS metric writes tied to observations
Canonical registry rebuilds can run several times between PBS polls. Reuse the metric source sighting time so unchanged datastore capacity does not create a fresh raw sample on every rebuild.

Contract-Neutral: behavioral regression fix; metric contract and agent lifecycle boundaries unchanged
Change-source: pulse-maintainer
2026-09-04 10:01:56 +01:00
pulse-triage[bot] 9f3beb1718 Raise Go crypto security floor
Exclude the SSH connection deadlock advisories published against x/crypto versions before v0.56.0.

Contract-Neutral: dependency-only security floor update; no runtime contract changed
Change-source: pulse-maintainer
2026-09-04 10:01:55 +01:00
pulse-triage[bot] adf9e7c765 Fall back when GitHub release metadata outgrows cap
GitHub's releases API response now exceeds the updater's 1 MiB
metadata limit. This causes v6.4.3-rc.1 update checks to fail even
though the releases Atom feed remains bounded.

Retain the safety cap and use the existing bounded Atom path only for
the default GitHub source. Custom update servers remain fail-closed.

Contract-Neutral: update-source recovery fix only; no public contract change
Change-source: pulse-maintainer
2026-09-04 08:02:06 +01:00
pulse-triage[bot] b710f3ea06 Apply Unraid empty-slot semantics in storage health
Use the reviewed placeholder-filesystem rule when storage health assesses structured Unraid state, while retaining explicit DISK_NP_MISSING members as critical evidence.

Change-source: pulse-maintainer

Contract-Neutral: Unraid fsType=auto placeholder normalization is applied consistently at storage-health assessment without changing contracts
2026-09-04 06:04:48 +01:00
pulse-triage[bot] d107a1e703 Ignore Unraid auto filesystem on empty slots
Treat Unraid's fsType=auto value as a placeholder rather than disk assignment evidence at both agent collection and server ingestion boundaries. Preserve real assigned and explicit missing members.

Change-source: pulse-maintainer
Contract-Neutral: Unraid fsType=auto placeholder normalization fixes false missing-slot alerts without changing wire or subsystem contracts
(cherry picked from commit fd843da7dfc51bba29bb5ddcbcdb4480d0e67079)
(cherry picked from commit 7a6456969d)
2026-09-04 06:04:48 +01:00
pulse-triage[bot] 9b12b2fee8 Keep release-line refresh proof current
Backport the browser-only refresh proof corrections from main. Exercise the
always-present History tab, follow the Proxmox surface's source-scoped canonical
resource query, trigger the metadata refresh path, and await the completed
response before checking drawer and viewport stability.

Contract-Neutral: browser regression coverage only; no runtime or API change.
Change-source: pulse-maintainer

Backport-of: 07c2f9ffa0
Backport-of: cf5e363979
2026-09-04 05:52:46 +01:00
pulse-triage[bot] 37ce538806 Keep same-name Proxmox sites separate in realtime
The browser compatibility coalescer could undo the server's provider-scoped split after websocket reconciliation. Honour machine and provider identity before merging same-hostname rows.

(cherry picked from commit 724a8a4960)
2026-09-04 05:05:29 +01:00
pulse-triage[bot] c1b671631d Keep repeated Proxmox cluster labels provider-scoped
A cluster name is an operator-selected display label, not global machine identity. Two independently configured estates using the same label could share one linked agent and then collapse into one presentation row after delayed cluster detection. Require node identity, exact endpoint, or host corroboration across provider instances instead.

Refs #1753

Change-source: pulse-maintainer
(cherry picked from commit 384dc53608)
2026-09-04 03:25:23 +01:00
pulse-triage[bot] 54a0b953d5 Collect disks from the agent mount namespace
gopsutil defaults to PID 1's mount table, which differs from the namespace created for Pulse's hardened systemd service. Enumerate the collector's own mount table so explicitly included tmpfs and bind mounts are discoverable, while preserving deliberate host-proc overrides for container deployments.

Change-source: pulse-maintainer
(cherry picked from commit 9d5cdfa088)
2026-09-04 01:32:07 +01:00
pulse-triage[bot] e952418663 Keep infrastructure dialog dismissal in place
The stable-row focus fallback ran after the shared dialog cleanup and could scroll a lower Manage trigger into view. Preserve the existing focus return without changing the operator's viewport, and cover the real desktop and narrow browser path.

Contract-Neutral: frontend focus-restoration bugfix; no API or persisted-data change.

Change-source: pulse-maintainer
(cherry picked from commit da9800ff2f)
2026-09-04 01:32:07 +01:00
pulse-triage[bot] fbedb2d50d Keep inline drawers from moving the viewport
Shared subtabs used scrollIntoView for horizontal visibility, allowing remounted or programmatically changed drawers to scroll the whole application shell. Reuse the horizontal rail controller instead, and restore disclosure focus without scrolling when a detail row closes.

Record the shared primitive contract and its registry-approved guardrails, with desktop and narrow Backups browser coverage for visible Overview and Manage states, off-screen tab changes, and non-scrolling focus return.

Change-source: pulse-maintainer
(cherry picked from commit 59e9f5ea2b)
2026-09-04 01:29:09 +01:00
pulse-triage[bot] 562607f7a2 Keep infrastructure edits mounted across polls
Connection-ledger refreshes replaced the selected connection snapshot and re-ran the credential slot renderer, destroying unsaved form state despite the node-level dirty guard. Keep the editor owner bound to the selected source while allowing the surrounding live row and dialog description to refresh.

Regression coverage advances both lastSeen and the endpoint, proving the form mounts once and retains input while live context updates.

Contract-Neutral: frontend state-lifetime bugfix; no API or persisted-data change.
Change-source: pulse-maintainer
2026-09-03 22:03:49 +01:00
pulse-triage[bot] b4a00e1ca5 Accept TrueNAS CORE 12 legacy REST versions
CORE 12 appliances can report versions such as TrueNAS-12.0-U5 without a CORE product marker, and they do not expose the JSON-RPC endpoint required by modern SCALE releases. The existing legacy check therefore rejected a supported REST-capable appliance before collection could begin.

Recognise the explicit TrueNAS 12 family while retaining the fail-closed boundary for modern releases, and cover negotiation with the reported version string.

Contract-Neutral: TrueNAS legacy-version negotiation fix; no wire, API, persisted-data, or subsystem contract change
Change-source: pulse-maintainer
2026-09-03 22:03:18 +01:00
Richard Courtman 1694e673a6 Send max_completion_tokens to GPT-5 models and learn it from the API
Patrol's readiness probe against a GPT 5.6 Luna deployment on Azure AI
Foundry failed with "Unsupported parameter: 'max_tokens' is not supported
with this model. Use 'max_completion_tokens' instead." The provider only
switched fields for o1/o3/o4 models, and only on api.openai.com, so the
GPT-5 family was sent max_tokens everywhere and Azure hosts were treated
as generic OpenAI-compatible endpoints.

Treat the GPT-5 family as reasoning models on the official and Azure
OpenAI hosts. Because an Azure deployment name need not reveal the model,
also act on the API's own instruction: when a 400 names max_completion_
tokens, re-send once in that form, drop the non-default temperature those
models refuse, and remember the answer for the life of the client so later
requests, including Patrol's streaming probes, go straight out correctly.

Refs #1837

Contract-Neutral: OpenAI provider parameter selection fix for issue 1837; no wire, API, or subsystem contract change
2026-09-03 21:28:58 +01:00
rcourtman f2c76f1ab6 Merge pull request #1872 from rcourtman/claude/backport-qualification-v6.4
Backport: qualify release candidates against the branch that owns their version
2026-09-02 18:40:02 +01:00
Richard Courtman 85fb558f0a Qualify release candidates against the branch that owns their version
The secure-runtime qualification required the candidate commit to be an
ancestor of origin/main. Under the release train a patch candidate is cut
from release/vX.Y and is not on main at all, so v6.4.3-rc.1's
qualification failed at "Verify detached release source" before running
any check, and the steward correctly refused to treat the candidate as
stable-capable. Resolve the branch the control plane maps the version to,
fetch that, check ancestry against it, and hand the same ref to the
attestation so the receipt records the line it was verified against.

Refs #1753

Contract-Neutral: release qualification checks ancestry against the mapped release branch; no product or contract change
(cherry picked from commit 79d87a4a2c)
2026-09-02 18:39:30 +01:00
rcourtman 0869ba406d Check out the repository before the Helm chart version step
de41ea1883 replaced the chart-version step's output echoes with
scripts/write_github_output.py, but that step runs before the repository
is checked out, so the script does not exist yet and the Helm publish
fails with "can't open file ... write_github_output.py" on every release.
The v6.4.3-rc.1 run 33580123246 hit it after all other staging succeeded.
Run the checkout first; nothing in it depends on the version outputs.
v6.4.3-rc.1 helm-chart-6.4.3-rc.1
2026-09-02 03:22:30 +01:00
rcourtman 198f0ca11a Map the v6.4.3 patch line to release/v6.4
The v6.4.3-rc.1 dispatch from main (run 33579042375) failed inside the
compiler dispatch: main advanced one minute after the release pipeline
pinned its source SHA, so the exact-SHA identity check on the compiler run
correctly refused the moved head. With the maintainer landing pull requests
every few minutes, a candidate dispatched from main cannot hold its SHA for
the minutes between prepare and compile.

Declare release/v6.4 for the 6.4.3 version prefix, created from main at the
exact-SHA-qualified commit 56e51e622e, so the workflow refuses a v6.4.3
dispatch from any other branch and the compiler binding stays exact. This is
the delivery contract's branch-per-train rule applied to the patch line that
predates the first train; earlier 6.4.x versions keep their historical main
mapping, and the 6.5 train mapping is unchanged.
2026-09-02 02:36:57 +01:00
rcourtman 56e51e622e Merge pull request #1825 from rcourtman/topic/release-train
Adopt the release train: promote the soaked candidate, not the branch tip
2026-09-02 02:08:32 +01:00
rcourtman 5f0a487404 Merge pull request #1823 from rcourtman/pulse/secure-runtime-rootful-qualification
Add rootful runtime qualification packet
2026-09-02 01:48:16 +01:00
rcourtman 9e33945b55 Merge pull request #1833 from rcourtman/claude/assistant-bias-to-act-v2
Submit advertised lifecycle actions through pulse_control, not prose
2026-09-02 01:36:05 +01:00
rcourtman df7ad9be43 Adopt the release train: promote the soaked candidate, not the branch tip
Stable promotions built whatever the dispatch branch was at that second.
The resolver checked that HEAD descends from the promoted release
candidate but never that its content matches, so v6.4.0 shipped 64
changed files, including product code, that v6.4.0-rc.12 had not
soaked. Every v6 version was mapped to main, which now moves every few
minutes under the autonomous maintainer, so each fix to a candidate
brought everything landed since and stable was never an exact soaked
commit. Five of six stable minor releases shipped under version-bound
owner exceptions that waived the soak.

From v6.5.0 the release train applies (RELEASE_PROMOTION_POLICY.md,
"Release Train"): a two-week train sized to measured velocity, a
release/v6.N branch per train declared in the control plane so the
workflow refuses a dispatch from anywhere else, a stable promotion that
may differ from its candidate only in release metadata unless
hotfix_exception names active customer harm, and a seven day soak for
minor releases. The 6.4.x line stays on main so the v6.4.3-rc.1
candidate already prepared there is unaffected. The gap is registered
as coverage gap release-train-exact-candidate-promotion.
2026-09-02 01:17:38 +01:00