Commit Graph

12060 Commits

Author SHA1 Message Date
pulse-triage[bot] ac995ef565 Keep pending notification groups occurrence-qualified
Coalesce repeated firing callbacks before delivery into the newest complete occurrence snapshot, retaining distinct and unknown identities and the original grouping deadline. Discard the transient index on cancellation, flush, disable and stop; cancel abandoned firing timers before queue shutdown. Verify ordering, concurrency, routing, persistent restart and actual loopback firing/recovery delivery without changing escalation or retry policy.

Change-source: pulse-maintainer
2026-10-03 03:10:14 +01:00
pulse-triage[bot] 661d7c7b2e Activate paired firing work in the receipt-ordering fixture
The queue discovers one concurrent batch at a time; the first HTTP control incorrectly expected another batch to start while the held response was unfinished. Admit both snapshots through the deferred bootstrap owner and then use normal queue activation. Preserve the runtime policy and timeout, and verify each received message explicitly.

Change-source: pulse-maintainer
2026-10-03 02:35:18 +01:00
pulse-triage[bot] 0dcd592ef2 Keep notification cooldowns ordered by alert occurrence
A late provider completion must retain its own firing receipt without replacing a newer occurrence’s repeat-delivery cooldown. Preserve the latest completion and highest delivered severity within one occurrence, keeping genuine new occurrences and severity increases eligible. Exercise reverse HTTP completion, duplicate admission and durable recovery receipts alongside legacy ordering controls.

Change-source: pulse-maintainer
2026-10-03 02:28:48 +01:00
pulse-triage[bot] a9533eb82a Merge reviewed disk History collection-independence repair
Preserve exact reviewed c9a0f0bf6a and its parent-bound browser receipt. Retain adequate source-epbmtbp7 frontend proof; delivery and native appliance acceptance remain with their existing owners.

Change-source: pulse-maintainer
2026-10-03 02:19:40 +01:00
pulse-triage[bot] c8cf1047bc Merge reviewed occurrence-qualified alert recovery
Retain exact Core candidate d0d621a7c2 and source proof; preserve current main frontend content.

Change-source: pulse-maintainer
2026-10-03 02:13:17 +01:00
pulse-triage[bot] 489ec9f441 Compose published Pulse main with reviewed snapshot and troubleshooting repairs
Preserve reviewed b6a42d8a and upstream 74fd189f ancestry. Runtime files merge unchanged; resolve the browser manifest conflict using the retained drawer receipt for the newly proposed UI range. Upstream table evidence remains in its original committed history; no new browser run is claimed.

Contract-Neutral: Additive reviewed-source composition and evidence conflict resolution only; no API, persistence, access or retention contract changes.
Change-source: pulse-maintainer
2026-10-03 02:04:04 +01:00
pulse-triage[bot] c9a0f0bf6a Keep stored disk History independent of current collection
Use stable disk-family chart entries so missing current SMART or temperature fields cannot hide stored observations, and matching snapshots do not remount charts or restart reads. Preserve existing identity, live collection status and entitlement boundaries; cover cancellation, measured zero, empty series and desktop/phone presentation.

Change-source: pulse-maintainer
2026-10-03 01:39:20 +01:00
pulse-triage[bot] d0d621a7c2 Exercise detector admission in partial-delivery recovery proof
Drive firings through the existing monitor callback instead of sending them directly through the notifier. This records the detector notification state required by the unchanged recovery policy; keep that policy and all failed attempts intact.

Change-source: pulse-maintainer
2026-10-03 01:38:16 +01:00
pulse-triage[bot] 1c9440546a Use destination receipts for delayed partial-delivery recovery
A cancelled retry and a lost RAM cooldown marker do not mean that no destination received the old firing. Keep quiet-hours and recovery controls, then let persistent occurrence/destination receipts select the actual recipients. Add an HTTP 200/503, restart and recurrence control so the newer firing survives and only the previously informed destination receives the old recovery.

Change-source: pulse-maintainer
2026-10-03 01:29:51 +01:00
pulse-triage[bot] 74fd189fd0 Restore bounded alert delivery and evidence-first TrueNAS troubleshooting (#2428)
## What changed and why

Alert cleanup now retires an expired flapping episode together with its
suppression deadline. Previously either cleanup owner could remove the
deadline but leave the episode latched, suppressing notifications
without a newly bounded cooldown. Active alert identity, unexpired
suppression and ordinary repeat-notification cooldown remain unchanged.

TrueNAS troubleshooting now distinguishes stale polling, missing
telemetry, authentication failures and session turnover. The existing
guides preserve polling evidence before a manual connection test updates
timestamps, use the actual 60-second default and avoid credential resets
or destructive reproductions. This addresses the diagnostic gaps exposed
by #2382, #2396 and #2400; it does not claim those native incidents are
all resolved.

## Reviewed source included

Complete unpublished range:
`0e90236d3bb901dc84d4d07e70d4d2a09d5e6705..971ebde8afdc0f55dd0ea77a0358467caf62ea73`
(five commits, including additive integration history).

- TrueNAS guide candidate `4b0f23e0a7a7d03df391f83896cbf4b48657bd24` (2
October).
- Alert cleanup candidate `d813c936e464eb09bb9ae7e6c7ac33716acde378` (2
October).
- Integration tips `e9294420`, `71382de0`, `971ebde8` preserve the
original candidates and published main ancestry without rewriting them.

## Validation

- Accepted alert candidate evidence: six parent-failing cleanup cases
pass on final; full alerts correctness/races, ten focused race repeats,
notification correctness, library vet/build and 132 governance checks
pass. The integrated alert files are identical to that candidate. These
proofs used Go 1.26.7; declared Go 1.26.8 CI remains required.
- Accepted guide evidence: seven guide checks, three polling controls
and 25 Docs/viewer tests; desktop Chromium and phone WebKit
navigation/readability checks. Integrated guide/test files are unchanged
from that candidate.
- Exact combined head: seven guide checks pass in offline source proof
`source-x4fm8fxy`, exit 0, complete output and completed guest shutdown.
The preceding confined lightweight attempt could not create loopback
sockets (five errors); it is an execution-context limitation, not a
pass.
- Publication provenance and whitespace checks pass; live main matches
the range base.

Required exact-head CI and independent source review still gate landing.
Real-duration alert queue/HTTP acceptance remains with its existing
owner after an interrupted proof; native monitoring acceptance and
containing-release delivery remain separate. No release, tag or
deployment is changed by this PR.


[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
2026-10-03 00:21:44 +00:00
rcourtman 2448a71860 Let table callers own the cell padding they ask for (#2427)
## Defect

`TableCell` and `TableHead` in
`frontend-modern/src/components/shared/Table.tsx` prepend `px-2 sm:px-3
py-*` to the caller's class. Tailwind emits every padding utility at
equal specificity in spacing-scale order, so a caller's smaller utility
loses to the base no matter where it sits in the string: `px-1` loses to
`px-2`, `sm:px-1.5` loses to `sm:px-3`, and `p-0` loses to both axes.

Measured on 2026-10-02 against `origin/main` with a Playwright sweep of
every table on every platform page, tab, Alerts and Settings page at
1440, 1280, 900, 700, 560 and 390px:

- DiskList cells asked for `px-1 sm:px-1.5 lg:px-2` and rendered 8px
below 640px and 12px at 640–1023px.
- The platform helper's `px-1.5 sm:px-2` cell padding had never taken
effect since it was introduced in May; 58 platform tables rendered
8/12px while the stylesheet already pins their headers at 6px, so
left-aligned header text sat 6px left of its column at desktop widths.
- Workloads header cells (`TableHead`) rendered 8/12px over raw `td`
data cells at 6/8px.
- Expansion wrappers that pass `p-0` (`InlineDetailTableRow`, windowing
spacers) carried 8/12px of horizontal and 2px of vertical padding; the
physical-disk detail row asked for 16px and got 12px at 640px and up.

PR #2409 and PR #2418 worked around the primitive with layout-mode
`!px-1` overrides.

## Fix

Apply the convention `TableHeader` already uses for `border-*` and
`TableBody` for `divide-*` to padding. When the caller's class names a
side's padding (`p-*`, `px-*`, `pl-*`/`ps-*`, `pr-*`/`pe-*`, `py-*`,
`pt-*`, `pb-*`, with or without `!`), the base padding for that side is
omitted. Sides the caller leaves alone keep the base, so a `pr-2` column
keeps its left inset. Prefixed-only variants such as `lg:px-0` do not
count as ownership and keep layering on the base as before. The class
resolves inside the JSX attribute, so layout-mode class switches stay
reactive. Nothing passed means the base is unchanged.

Five unit tests cover the base, full and single-side ownership,
important and larger values, `p-*`, prefixed-only classes, and
reactivity.

## Blast radius, measured before and after on the same mock stack

- 455 table states compared across both sweeps: clipped-cell count
improved in 89, unchanged in 362, and worse in 4. All four "worse" cases
have identical or wider content boxes after the change and differ only
in live mock values (`28s ago` vs `8s ago`, a usage label 2px longer),
so they are data drift, not layout.
- Platform tables: cells 12→8px at 700px and up, 8→6px at 390/560px;
header rows 29→21px (the helper's declared `py-0.5` now applies).
Headers and cells now line up within 2px instead of 6px.
- DiskList at 390px: cells 8→4px, matching the composed class.
Physical-disk detail row 12→16px at 640px and up.
- Inline detail rows (`p-0`): cell padding 12/12/2/2 → 0, so the detail
panel's own `px-2 sm:px-4` inset is the only inset (28px → 16px at
desktop).
- Alerts overview stats, alert history, AI cost table, Settings
infrastructure tables: now render the padding their classes name; no
clipping regressions.
- The storage pools table (StoragePoolRow) is unchanged: its cells
already carried 8px.

## Overrides

- `ProxmoxReplicationTable.tsx` keeps its compact-mode `!px-1`: it must
beat the platform helper's own `px-1.5 sm:px-2` in the same class
string, which this primitive change cannot do for it. Without it compact
cells would render 6/8px instead of 4px.
- The DiskList/StoragePoolRow `!px-1` overrides from PR #2418 are not on
`main` (that PR is still open and currently conflicting on the receipt).
Once it lands, its layout-mode `!px-1` is redundant with the composed
`px-1 sm:px-1.5 lg:px-2` and can be dropped in the same pass that
rebases it.

Browser verification receipt covers the touched runtime file at the
viewports above.
2026-10-03 01:21:18 +01:00
pulse-triage[bot] 2c57a54ec4 Preserve sending-row crash recovery in the occurrence fixture
Assert surviving row status before restart, then expect the existing sending-to-pending crash recovery after reopening the queue. The initial source-dtamnmrn fixture failure is retained; runtime source and delivery policy are unchanged.

Change-source: pulse-maintainer
2026-10-03 01:20:39 +01:00
pulse-triage[bot] b6a42d8a4f Merge reviewed evidence-preserving performance help
Preserve exact candidate 286c8a1f51. Retained copied-recipe, mirror, Docs viewer and desktop/phone browser evidence covers this existing guide improvement; no runtime or installed performance claim.

Change-source: pulse-maintainer
2026-10-03 01:17:20 +01:00
pulse-triage[bot] d7de6d1f6b Merge reviewed current-snapshot resource details repair
Preserve exact candidate 0d8d5beb5f and its browser-bound parent. Retained full frontend proof and desktop/phone regressions cover this existing monitoring-trust repair.

Change-source: pulse-maintainer
2026-10-03 01:17:10 +01:00
pulse-triage[bot] 8f42497b8f Keep delayed alert recovery scoped to its resolved occurrence
Capture the resolved alert before asynchronous callbacks and carry its start/end identity through monitor recovery. Cancel only that occurrence in grouping, cooldown and persistent firing rows, retaining newer incidents, operational links, destination receipts and failed attempts. Keep the explicit identifier-wide cancellation API and legacy callback IDs. Add snapshot, restart and connected queue-to-HTTP regression controls.

Change-source: pulse-maintainer
2026-10-03 01:16:42 +01:00
rcourtman b22571f196 Let table callers own the cell padding they ask for
TableCell and TableHead composed `px-2 sm:px-3 py-*` ahead of the
caller's class, but Tailwind emits every padding utility at the same
specificity in spacing-scale order, so a caller's `px-1` lost to the
base `px-2` and `sm:px-1.5` lost to `sm:px-3` wherever it sat in the
string. Measured on 2026-10-02: DiskList cells carried 16px of
horizontal padding on a 390px phone although their class asked for
8px, and 24px at 640-1023px although it asked for 12px; the Workloads
header cells sat at 8/12px above data cells at 6/8px; the platform
helper's `px-1.5 sm:px-2` had never taken effect on a cell since it
was introduced in May. PR #2409 and PR #2418 worked around it with
layout-mode `!px-1` overrides.

Apply the convention TableHeader already uses for borders and
TableBody for dividers to padding: when the caller's class names a
side's padding (`p-*`, `px-*`, `pl-*`, `pr-*`, `py-*`, `pt-*`, `pb-*`,
with or without `!`), the base padding for that side is left out, so
the caller's utility is the only one on the element. Sides the caller
leaves alone keep the base, so a `pr-2` column still gets its left
inset, and prefixed-only variants such as `lg:px-0` keep layering on
the base as before. The base is unchanged when nothing is passed, and
the class is resolved inside the JSX attribute so layout-mode class
switches stay reactive.

Platform tables pick up the helper's declared 6/8px cell padding,
which lines data cells up under the 6px headers the stylesheet already
pins, and their header rows drop to the helper's 2px vertical padding.
2026-10-03 01:01:00 +01:00
pulse-triage[bot] 971ebde8af Merge reviewed bounded flapping cleanup repair
Change-source: pulse-maintainer
2026-10-03 00:58:10 +01:00
pulse-triage[bot] 71382de071 Merge published main frontier for alert cleanup review
Change-source: pulse-maintainer
2026-10-03 00:58:09 +01:00
pulse-triage[bot] 286c8a1f51 Make write and CPU troubleshooting bounded and evidence-preserving
Give existing help readers scoped process/container samples, honest units and unchanged-workload baselines. Exercise the exact copied recipes, including stopped services, missing counters and failed or empty container reads, without touching a database or service.

Contract-Neutral: Existing-guide documentation and recipe tests only; no runtime, API, persistence, access or retention change.
Change-source: pulse-maintainer
2026-10-03 00:45:25 +01:00
pulse-triage[bot] 0e90236d3b Keep storage History and TrueNAS polling responsive and correctly attributed (#2420)
## What changes and why

- Storage History readings can be inspected by touch without a later
compatibility-focus event replacing the selected sample. Scrolling,
gesture cancellation, keyboard inspection and measured zero readings are
preserved.
- Storage pool details use the owning host's physical disks,
temperatures, SMART facts and topology counts. Repeated device paths and
UnRAID group names no longer mix facts from different hosts; unknown
ownership does not invent membership.
- TrueNAS skips app-stat subscriptions for empty app inventories,
disposes of failed retried streams, and preserves successful retried
log-tail completion. Session-close diagnostics use classified local
causes rather than private wire data. This repairs the empty-inventory
path reported in #2396. A later reviewed repair now handles matching
subscription-termination notifications without stalled acknowledgement
or stream reads. The association is source-derived, without a retained
native capture; #2400's reported 60-second close remains unexplained.

PBS History guidance also now recognises the drawer's batched `metrics`
response rather than asking readers to find a separate CPU request that
the drawer does not send. This follows the empty-batch response supplied
in #1723 and preserves privacy-safe diagnostics.

These are repairs to existing monitoring and inspection surfaces, not
new collectors or features. The storage defects were reproduced in the
existing desktop/phone presentation.

## Included source

Complete unpublished range:
`f26182f98ccd0e9ee1089bf651d41e0003871ed2..90c436c83d616eccbe544bf3737b13c3b6251e53`.

Reviewed candidates:
- `7c48430d5a3ed0eefc677b6a5ccc50ee4bc0920a` — History touch inspection.
- `34f73590bbb72c01a3e16e6085227849556a2b1d` — pool disk ownership.
- `b8cc3b44f8b7e1bd927b0368b10d59f37ede2187` — TrueNAS empty-app/stream
lifecycle.
- `7b370c7db9941bba4037a888230cb513c02927c0` — PBS batch-aware
diagnostic guidance.
- `f0ea29480e172631e71ed8da54de95e9cfabda22` — exact subscription
termination and polling recovery.

Integration merges preserve their original identities and incorporate
the published mock-replication, Kubernetes job-time, audit and
release-source-mapping frontiers. Additive merge
`90c436c83d616eccbe544bf3737b13c3b6251e53` incorporates current main's
Patrol weekly-summary scheduling (#2423). The conflict was limited to
appending both frontend contracts and retaining the unchanged upstream
receipt pointer; runtime source is byte-identical to the respective
verified candidates. No accepted commit was rewritten.

## Validation

- Retained storage candidate proof: 21,743 tests passed, three skipped;
typecheck, lint, production/embedded builds and budgets passed, with
complete output and guest shutdown.
- Retained Chromium/WebKit parent/final controls cover touch inspection
and 12 pool-ownership presentation states, including mounted host
replacement and isolated History requests.
- Retained TrueNAS proofs cover correctness, races, vet, five focused
race repeats, connected monitoring/API checks, backend compilation and
132 completion-guard tests. Initial missing-object setup and a later
governance-import exit 1 remain adverse evidence; corrected discovery
passed separately.
- Retained PBS guide proof `source-h1cvqpr3`: eleven tests and inspected
production Docs in desktop Chromium and phone WebKit.
- Retained termination-repair evidence: full TrueNAS correctness/races,
five focused race repeats, connected three-poll recovery, persisted
exact PBS batches and identity controls, vet, server/agent builds and
132 governance tests. Eight completed attempts retain three adverse
fixture exits; their corrected controls are separate results.
- Publication composition: browser range guard confirms all seven
changed frontend runtime files across the original common-base range
match in-range receipts; completion guard passes on the composed
published-base range without overrides. Tested runtime blobs remain
identical, provenance checks and diff whitespace checks pass, and both
remote/main ancestry and a clean checkout were verified.

A redundant confined-host guide check failed to open localhost sockets
(eight errors); this is an execution-context failure, not a passing
check. The unchanged guide retains its successful disposable-VM proof.

Limits: local Go proof used 1.26.7 rather than declared 1.26.8, and
backend compilation used an embed fixture. Exact-head CI remains
required. Synthetic presentation and source proofs do not establish
native appliance acceptance, whole-report resolution, release
availability or promotion readiness. This does not alter the frozen
published v6.4.6 RC.


[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)


[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
2026-10-02 23:43:50 +00:00
pulse-triage[bot] 0d8d5beb5f Keep open resource details on current snapshots
Read replacement snapshots reactively through the existing drawer state and Overview. Key local state and reads by canonical resource ID, and keep availability selections on the current fleet rather than a clicked snapshot. Preserve same-ID History range and tab continuity while withdrawing lost targets. Parent regressions and Chromium/WebKit controls reproduce stale headings, history targets and false Up details; retain scoped tests, browser proof and the unified-resources contract.

Change-source: pulse-maintainer
2026-10-03 00:40:53 +01:00
pulse-triage[bot] e929442038 Merge reviewed evidence-preserving TrueNAS help
Change-source: pulse-maintainer
2026-10-03 00:33:23 +01:00
pulse-triage[bot] d813c936e4 Retire alert flapping episodes when cleanup expires their hold
Both cleanup owners removed only the deadline, leaving a latched episode that could suppress notifications without a new cooldown. Share dispatch expiry with cleanup, preserve unexpired policies and active occurrence identity, and verify renewed delivery, bounded rearming, diagnosis and one-shot callbacks without bypassing ordinary repeat-notification cooldown.

Change-source: pulse-maintainer
2026-10-03 00:33:08 +01:00
pulse-triage[bot] 4b0f23e0a7 Distinguish TrueNAS stale polling from failed authentication
Preserve existing polling evidence before a connection test updates its ledger. Explain freshness, optional telemetry and session turnover using the read-only projection, correct the 60-second default, and keep diagnostic steps free of credentials and destructive reproductions.

Contract-Neutral: Documentation and existing-guide checks only; no runtime, API, transport, identity, access or retention change.
Change-source: pulse-maintainer
2026-10-03 00:07:05 +01:00
pulse-triage[bot] 90c436c83d Merge published Patrol report scheduling frontier
Retain both History/storage and Reporting contracts; keep the upstream browser receipt unchanged. Earlier accepted receipts remain in history, with runtime blobs preserved.

Change-source: pulse-maintainer
2026-10-03 00:06:26 +01:00
rcourtman f26182f98c Offer the Patrol weekly summary as a scheduled report type (#2423)
The `patrol_digest` report schedule kind has been on main since early
September, but only the API could create one: the Settings > Reporting
form had no way to choose it, so the weekly "what Patrol did" email
never reached the customers it was built for, the ones who have stopped
opening Pulse.

The schedule form now has a Report type choice between the performance
report and the Patrol weekly summary. The choice shows only while the
session reports Patrol can run (AI on with a provider configured), and
an existing summary schedule keeps showing its type so it stays editable
after AI is switched off. Choosing the summary reduces the form to a
name, weekday, time, timezone and optional recipients: cadence is pinned
to weekly and delivery to email, and the format, resource picker, tag
filter, retention, attach and save-copy controls are hidden because the
server fixes those values. The save path no longer demands a resource
scope for this kind, and the schedules table describes a summary as
"Patrol activity, last 7 days".

Verification: model, hook and panel tests cover the gating, the pinned
fields and the saved payload; the browser receipt records a Pro-licensed
pass of `/settings/support/reporting` at 1280 and 375 pixels, including
create, save, edit, and a run without an email destination that surfaces
the server's message naming the missing setting. Design note updated in
`docs/PATROL_WEEKLY_DIGEST.md`; demand ledger entry "Patrol weekly
digest (what Patrol did for you)" in pulse-pro.
2026-10-03 00:02:38 +01:00
pulse-triage[bot] 290783d3db Merge reviewed TrueNAS subscription termination repair
Preserve exact candidate f0ea29480e and retained source-proof identities. Rejected stream readers end promptly while ordinary polls recover; native appliance and containing-release evidence remain separate.

Change-source: pulse-maintainer
2026-10-03 00:01:10 +01:00
pulse-triage[bot] f6c6910582 Merge reviewed PBS History diagnostic guidance
Change-source: pulse-maintainer
2026-10-02 23:39:07 +01:00
pulse-triage[bot] f0ea29480e Handle exact TrueNAS subscription termination without stalled reads
Recognise matching notify_unsubscribed events before and after acknowledgement, preserve unrelated streams and clean log completion, and retain only numeric errno with fixed diagnostics. Keep nonempty Apps inventory and poll-ledger progress while rejected stats recover on the next ordinary poll. The reporter supplied a source-derived envelope, not a retained capture; native acceptance and delivery remain separate.

Change-source: pulse-maintainer
2026-10-02 23:32:38 +01:00
rcourtman 9211e37405 Merge remote-tracking branch 'origin/main' into feat/patrol-digest-report-type 2026-10-02 23:16:14 +01:00
rcourtman f43972c321 Offer the Patrol weekly summary as a scheduled report type
The patrol_digest report schedule kind has been on main since early
September, but only the API could create one: the Settings > Reporting
form had no way to choose it, so the weekly "what Patrol did" email never
reached the customers it was built for, the ones who have stopped opening
Pulse. The schedule form now has a Report type choice between the
performance report and the Patrol weekly summary. The choice shows only
while the session reports Patrol can run (AI on with a provider), and an
existing summary schedule keeps showing its type so it stays editable
after AI is switched off.

Choosing the summary reduces the form to a name, weekday, time, timezone
and optional recipients. Cadence is pinned to weekly and delivery to
email, and the format, resource picker, tag filter, retention, attach and
save-copy controls are hidden because the server fixes those values; the
save path no longer demands a resource scope for this kind. The schedules
table describes a summary as "Patrol activity, last 7 days". Model, hook
and panel tests cover the gating, the pinned fields and the saved
payload, and the browser receipt records a Pro-licensed pass at 1280 and
375 pixels, including a run without an email destination that surfaces
the server's message naming the missing setting.
2026-10-02 23:13:34 +01:00
pulse-triage[bot] 7b370c7db9 Make PBS History diagnostics recognise batched responses
The existing drawer fetches all metrics without a metric query field. Explain metrics-object and single-metric points responses so readers do not wait for an absent CPU request or mistake missing CPU and measured zero for the same result.

Contract-Neutral: Clarify existing History diagnostics and protect mirrored documentation; no runtime, API, identity, access, retention or response-shape change.
Change-source: pulse-maintainer
2026-10-02 23:07:46 +01:00
pulse-triage[bot] 038579a28d Merge reviewed TrueNAS empty-app and stream lifecycle repairs
Change-source: pulse-maintainer
2026-10-02 23:02:43 +01:00
pulse-triage[bot] 4c3149b706 Merge published audit and release mapping frontier
Change-source: pulse-maintainer
2026-10-02 23:02:35 +01:00
pulse-triage[bot] b052d29b19 Bound audit overhead and preserve the published release source mapping (#2412)
## What changed and why

Reduce configuration-fetch audit overhead without hiding access events
(#2320). The suppression tracker now remembers at most 4,096
organisation/agent pairs and uses an expiry index instead of repeated
full-map scans. Existing agents keep daily suppression; unremembered
agents at capacity are conservatively audited on every fetch.
Token/configuration changes and every failure remain audited. No audit
history is deleted.

The Apprise confidentiality test now observes the autonomous queue
dispatcher instead of starting a competing manual batch. Its lifecycle,
retry, configuration and confidentiality assertions remain intact.

Preserve the exact 6.4.6 release-line mapping for the already-published
packet. The fallback to main incorrectly rejected its immutable source
during convergence. This maps that version only, not future patches, and
changes no candidate product source.

## Included source and upstream reconciliation

Complete new publication range:
`e6540da45da4de4bcb954463373d8ea9f196eb56..35d8c7c13d3665b2ffe2fe4fd61e8952c46e21b1`.

- Reviewed Delivery correction:
`3578b0044740087e7589f19bca450245f610aced`.
- Reviewed Core changes: `e225bf2abcb4189dcedd457292248e72a945dc74` and
`6ab5383412f156f286c38623f9b86f2b0d3151f0`, integrated by
`94ce8496b7d79e9b77d43493adc432c954d5e8b7`.
- Additive upstream merge: `35d8c7c13d3665b2ffe2fe4fd61e8952c46e21b1`,
incorporating published Proxmox table repairs at
`e6540da45da4de4bcb954463373d8ea9f196eb56`.

Every reviewed commit identity and ancestry is preserved. No upstream
frontend source or dependency manifest changes in this proposal.

## Validation and limits

Recorded independent-review evidence: Core returned four complete
source-proof receipts covering connected
configuration-fetch/authorization tests, five race repeats,
notifications correctness/races and ten queue-fixture repeats,
vet/builds, 135 governance tests, 23 docs-sync tests and frontend
production build/budgets. Its fixed controls retained a maximum of 4,096
keys versus 12,288 in the predecessor; saturated in-memory lookup
measurements are not installed write-rate or CPU acceptance.

Delivery returned a complete offline source proof of 947 release-control
tests (8 skipped), with guest shutdown. The exact-version tests reject
unrelated versions. These are reviewed owner returns, not new
qualification executions by this publication gate.

On the combined committed source, provenance, whitespace, ancestry,
canonical completion, browser-verification scope, control-plane audit,
all 62 shipped-document mirrors and the 211-file public-document check
pass. Core runtime and Go manifests are byte-identical to the reviewed
Core candidate; release-control source/policy is byte-identical to the
reviewed Delivery candidate; frontend runtime and graph are
byte-identical to current upstream. Sufficient heavy/browser evidence
was therefore not replayed.

Core used Go 1.26.7 rather than declared 1.26.8, with an explicit
backend embed fixture and a separately proved frontend build. Required
exact-head CI remains necessary before landing. This proposal does not
establish installed outcomes, release readiness, successful convergence
or stable delivery, and does not replace or recut the published v6.4.6
candidate.


[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
2026-10-02 21:59:54 +00:00
pulse-triage[bot] fa1c96ce3d Merge reviewed storage pool disk ownership repair
Accept exact candidate 34f73590bb with retained source and browser proof. Resolve only the shared receipt pointer; runtime content remains exact to its non-merge proof commits.

Change-source: pulse-maintainer
2026-10-02 22:55:17 +01:00
pulse-triage[bot] fbceed04dc Merge published Kubernetes job time presentation
Preserve published source and exact browser receipts; resolve only the shared receipt pointer.

Change-source: pulse-maintainer
2026-10-02 22:55:01 +01:00
rcourtman 78796b411c Show Kubernetes job times as an age, not a raw timestamp (#2411)
The Workload Controllers table printed Job and CronJob timestamps
exactly as the agent reports them, so at 1440px the Detail cell read
"Last success: 2026-10-02T19:59:14.523639+01:00" in a 119px column
and was cut off before the time. A user could not tell when the job
last ran.

The cell now says "Last success 31m ago" or "Completed 2h ago" through
the shared platform relative-time formatter, with the absolute local
time on hover, matching how the Events table shows its observed time.
The Detail column takes 12% instead of 9% so every label the column
can produce fits whole, taken from the Kind, Current and Available
columns which hold short values. The Detail span truncates to the cell
with an ellipsis instead of being cut at the cell edge.

Contract-Neutral: presentation of existing Kubernetes controller time
fields only; owning unified-resources clause updated; no
frontend-primitives clause, primitive, or API change
2026-10-02 22:53:54 +01:00
pulse-triage[bot] 589e0bac94 Merge published mock replication repair
Change-source: pulse-maintainer
2026-10-02 22:47:53 +01:00
pulse-triage[bot] 34f73590bb Keep pool disk facts on the owning storage host
Repeated device paths and UnRAID group names must not attach foreign SMART, temperatures or topology counts to a pool. Preserve canonical children, require host or scoped native ownership for inferred membership, and compare exact device identifiers. Cover live target changes and real desktop/phone presentations.

Change-source: pulse-maintainer
2026-10-02 22:34:17 +01:00
pulse-triage[bot] b8cc3b44f8 Skip empty TrueNAS app stats and explain session disposal
Avoid a needless subscription when Apps has no inventory, preserve second-attempt stream cleanup and bounded log-tail completion, and record only classified local socket-close causes without private wire data. This repairs the empty-inventory path in #2396; the exact rejection envelope and the cause of #2400 remain unconfirmed.

Change-source: pulse-maintainer
2026-10-02 22:24:02 +01:00
rcourtman e33c6be1ef Keep mock replication jobs on schedule and off their own node (#2410)
The mock generator stamped each job's last and next sync once at
startup, with the last sync up to an hour old on a 15-minute schedule.
Most jobs therefore started out overdue, and on a long-running demo
every job read as hours overdue in red while still reporting Healthy.
The demo's Replication tab looked broken to anyone evaluating Pulse.

Replication timing now follows the fixture clock. Each job keeps a
stable phase inside its schedule window, so a healthy job last synced
less than one interval ago and is next due in the future, and a
failing job's last good sync falls behind by its failure count.

The target node was picked by index and could equal the source, which
showed a job replicating pve1 to pve1. The source is no longer a
candidate, and an estate without a second node gets no jobs.
2026-10-02 22:16:29 +01:00
pulse-triage[bot] 689079622d Merge reviewed Storage History touch inspection
Preserve candidate 7c48430d5a and its exact runtime bytes alongside the reviewed main frontier. Resolve only the shared browser receipt file to the candidate receipt; original non-merge receipts remain the integration evidence.

Change-source: pulse-maintainer
2026-10-02 22:12:46 +01:00
pulse-triage[bot] 35d8c7c13d Merge published Proxmox table repairs with reviewed audit and release controls
Preserve the reviewed local tip and incorporate current upstream additively. The frontend/table changes are disjoint from the audit, Apprise fixture and exact-version release mapping corrections.

Change-source: pulse-maintainer
2026-10-02 22:05:52 +01:00
rcourtman 4fd5e7a82d Show Kubernetes job times as an age, not a raw timestamp
The Workload Controllers table printed Job and CronJob timestamps
exactly as the agent reports them, so at 1440px the Detail cell read
"Last success: 2026-10-02T19:59:14.523639+01:00" in a 119px column
and was cut off before the time. A user could not tell when the job
last ran.

The cell now says "Last success 31m ago" or "Completed 2h ago" through
the shared platform relative-time formatter, with the absolute local
time on hover, matching how the Events table shows its observed time.
The Detail column takes 12% instead of 9% so every label the column
can produce fits whole, taken from the Kind, Current and Available
columns which hold short values. The Detail span truncates to the cell
with an ellipsis instead of being cut at the cell edge.

Contract-Neutral: presentation of existing Kubernetes controller time fields only; owning unified-resources clause updated; no frontend-primitives clause, primitive, or API change
2026-10-02 22:05:16 +01:00
rcourtman e6540da45d Stop Proxmox tables clipping the values users came for (#2409)
On a 1440px screen the Mail Gateway table showed a spam count as "3…"
and the Ceph table showed its Services column as "mon…". Both tables
use fixed layout and sized only their always-on columns, so the
optional ones split the few percent left over. Every visible column
now takes a weighted share through the shared platform helper.

Replication hid the reason a job failed. The error column had 8% of
the row and clipped mid-word, mid-width layouts dropped the column,
and the phone expansion omitted it. Rows now expand at every width to
the full job record with the whole error first, the error column is
wider, and search matches error text.

Backups sortable headers rendered in sentence case beside uppercase
plain headers because a button resets text-transform. Coverage rows
truncated node and workload names while short cells sat half empty,
and empty evidence cells repeated their header ("No PVE backup file")
until they truncated too. They now read "None" with the long form on
hover.

On phones the Ceph row clipped every value and the pool usage bar
clipped "50.1%" to "0.1%". The phone projection keeps five values
that fit whole. The FSID column, which never fit, leaves the row and
stays searchable and whole in the expansion.

Contract-Neutral: presentation sizing and labels only; owning
unified-resources clause updated; no storage-recovery or
frontend-primitives clause, API or primitive change
2026-10-02 21:52:34 +01:00
pulse-triage[bot] 94ce8496b7 Merge reviewed config-fetch audit bounds and Apprise fixture
Preserve exact Core candidate commits after independent diff and retained-proof review. Bound suppression state without evicting recent agents or hiding audit events; retain the real-worker confidentiality assertions.

Change-source: pulse-maintainer
2026-10-02 21:47:47 +01:00
pulse-triage[bot] 7c48430d5a Make stored History readings inspectable by touch
Real Chromium and WebKit first taps selected the latest reading instead of the tapped observation. Select and retain the actual sample across compatibility focus and mouse events, shared-chart focus transfer and matching refreshes. Reject pan, cancellation and multiple contacts without preventing native scrolling. Preserve mouse and keyboard inspection, source ownership, units and access.

Change-source: pulse-maintainer
2026-10-02 21:45:50 +01:00
rcourtman 9f39a092b1 Keep mock replication jobs on schedule and off their own node
The mock generator stamped each job's last and next sync once at
startup, with the last sync up to an hour old on a 15-minute schedule.
Most jobs therefore started out overdue, and on a long-running demo
every job read as hours overdue in red while still reporting Healthy.
The demo's Replication tab looked broken to anyone evaluating Pulse.

Replication timing now follows the fixture clock. Each job keeps a
stable phase inside its schedule window, so a healthy job last synced
less than one interval ago and is next due in the future, and a
failing job's last good sync falls behind by its failure count.

The target node was picked by index and could equal the source, which
showed a job replicating pve1 to pve1. The source is no longer a
candidate, and an estate without a second node gets no jobs.
2026-10-02 21:45:13 +01:00
rcourtman d564267248 Stop Proxmox tables clipping the values users came for
On a 1440px screen the Mail Gateway table showed a spam count as "3…"
and the Ceph table showed its Services column as "mon…". Both tables
use fixed layout and sized only their always-on columns, so the
optional ones split the few percent left over. Every visible column
now takes a weighted share through the shared platform helper.

Replication hid the reason a job failed. The error column had 8% of
the row and clipped mid-word, mid-width layouts dropped the column,
and the phone expansion omitted it. Rows now expand at every width to
the full job record with the whole error first, the error column is
wider, and search matches error text.

Backups sortable headers rendered in sentence case beside uppercase
plain headers because a button resets text-transform. Coverage rows
truncated node and workload names while short cells sat half empty,
and empty evidence cells repeated their header ("No PVE backup file")
until they truncated too. They now read "None" with the long form on
hover.

On phones the Ceph row clipped every value and the pool usage bar
clipped "50.1%" to "0.1%". The phone projection keeps five values
that fit whole. The FSID column, which never fit, leaves the row and
stays searchable and whole in the expansion.

Contract-Neutral: presentation sizing and labels only; owning unified-resources clause updated; no storage-recovery or frontend-primitives clause, API or primitive change
2026-10-02 21:37:40 +01:00