Commit Graph

12590 Commits

Author SHA1 Message Date
pulse-triage[bot] 3c95617bd1 Integrate reviewed truthful guest History presentation
Preserve the exact reviewed Web commits and their own-parent browser receipts alongside the supplied main frontier.

Change-source: pulse-maintainer
2026-10-05 07:20:38 +01:00
pulse-triage[bot] 757ae22ece Integrate reviewed private Metrics History guidance
Preserve the exact reviewed documentation candidate and its retained privacy/query proof; no runtime or storage changes.

Change-source: pulse-maintainer
2026-10-05 07:14:39 +01:00
pulse-triage[bot] c635e0dda0 Preserve reviewed maintenance alongside current upstream presentation
Additively incorporate the exact observed main frontier without advancing PR2486 or rewriting accepted work. The newer canonical range remains deferred pending its existing source-check and composition-proof routes.

Change-source: pulse-maintainer
2026-10-05 07:04:09 +01:00
rcourtman a28b105645 Mark the alerting Mail Gateway number, keep rows single-line (#2496)
An earlier change (#2490) named the alert type on a second line under
the gateway name. The shared platform-table contract keeps summary rows
on one line, with context in an operational column, a tooltip or the
drawer.

Each gateway alert is about one number in the row, so that number now
carries it. The message shows on hover and for screen readers.

- Queue, hold and message-age alerts colour Queue.
- Deferred alerts colour Deferred.
- Quarantine alerts colour Quarantine.
- Inbound spam and virus anomalies colour the Spam and Virus columns.

Alerts with no column of their own (offline, outbound anomalies) stay on
the status dot, a screen-reader summary, the row tint and the drawer.

Verified at 1440 and 390, light and dark, including the phone drawer.
2026-10-05 07:00:59 +01:00
pulse-triage[bot] d358adf7d0 Verify composed container labels and host context
Record inspected desktop and touch-WebKit phone light/dark evidence for the final fractional CPU, silent-host and shared-column content. Exercise the actual mobile Filters and View controls before flat-row drawer expansion; production container source is unchanged.

Change-source: pulse-maintainer
2026-10-05 06:51:02 +01:00
pulse-triage[bot] c420758068 Keep history diagnostics private and match current query types
Reuse the tested API helper, explain point/source and access distinctions, and preserve data before storage tuning. Copied examples now exercise private success/error responses, redirects, incomplete transport and encoded IDs.

Contract-Neutral: Documentation and recipe checks align with existing history API behaviour; no runtime, storage, entitlement or authentication contract changes.
Change-source: pulse-maintainer
2026-10-05 06:47:09 +01:00
pulse-triage[bot] ca255a0e3f Keep retained guest readings truthful in canonical History
Share the original memory observation policy with the dedicated guest drawer and carry filesystem deferrals through the existing History presentation. Preserve measured zero, stored samples, source and access isolation, and same-ID read budgets. Record fresh eight-state browser proof; native thaw and workload recovery remain independent.

Change-source: pulse-maintainer
2026-10-05 06:42:55 +01:00
pulse-triage[bot] cadb669610 Integrate reviewed private-help checks without replacing stronger fixtures
Preserve the reviewed candidate commits as the second parent and retain canonical one-shot, redirect, partial-response and disclosure controls in the overlapping API/PBS smoke fixtures. Keep the candidate's canonical PBS guard, scoped private temperature-file assertions and unchanged-verdict audit diagnostics.

Contract-Neutral: Integration of test-only private-help adapters; no runtime, guides, dependencies or frontend source changed.
Change-source: pulse-maintainer
2026-10-05 06:39:53 +01:00
pulse-triage[bot] 2ed68c9ebe Incorporate supplied upstream frontier for private-help test review
Change-source: pulse-maintainer
2026-10-05 06:39:20 +01:00
rcourtman b7b26bdfdf Merge remote-tracking branch 'origin/main' into fix/mail-gateway-single-line 2026-10-05 06:34:23 +01:00
rcourtman dbbf74646b Mark the alerting Mail Gateway number, keep rows single-line
The earlier change named the alert type on a second line under the
gateway name. The shared platform-table contract keeps summary rows on one
line, with context in an operational column, a tooltip or the drawer.

Each gateway alert is about one number in the row, so that number now
carries it: queue, hold and message-age alerts colour Queue, deferred
alerts colour Deferred, quarantine alerts Quarantine, and inbound spam and
virus anomalies their columns, with the message on hover and for screen
readers. Alerts with no column of their own, such as offline or outbound
anomalies, stay on the status dot, a screen-reader summary, the row tint
and the drawer.
2026-10-05 06:31:34 +01:00
rcourtman fdcffc6411 Say which TrueNAS services and VMs should be running (#2495)
The Services tab gave SMART a red dot with no reason, beside the same
Stopped pill as SSH, and spent a column on process IDs. The VMs tab
spent two columns on the bootloader and device counts. None of those
columns answers whether something is wrong.

- A service stopped while set to start at boot, and a VM set to
autostart that is stopped, say "should be running" beside the state,
with the full sentence on hover.
- The State column is hidden on phones, so the service drawer gains a
Condition row and the VM drawer gains the same row and summary note
(skipped while TrueNAS data is stale).
- A VM stopped without autostart gets no note: someone stopped it on
purpose.
- Process IDs, bootloader and device counts stay in the drawers.
- Rows stay single-line, as the shared platform-table rhythm requires.

Verified at 1440 and 390, including the phone drawer for SMART. The mock
has no stopped autostart VM, so that case is covered by component and
drawer-model tests.
2026-10-05 06:31:10 +01:00
rcourtman f30be8b48f Say which TrueNAS services and VMs should be running
The Services tab gave a red dot to SMART with no reason, beside the same
Stopped pill as SSH, and spent a column on process IDs. The VMs tab spent
two columns on the bootloader and device counts. None of those columns
answers whether something is wrong.

A service stopped while set to start at boot, and a VM set to autostart
that is stopped, now say "should be running" beside the state, with the
full sentence on hover. Services also gain a drawer Condition row, since
the State column is hidden on phones. A VM stopped without autostart gets
no note, because someone stopped it on purpose. Process IDs, bootloader
and device counts stay in the drawers. Rows stay single-line, as the
shared platform-table rhythm requires.
2026-10-05 06:13:52 +01:00
pulse-triage[bot] c0f0474423 Keep Bash temperature guidance tests with their non-Windows runner
The reviewed phase-aware runner and PBS helper exclude Windows. Apply the same build constraint to their existing Bash temperature consumers so Windows test compilation does not retain unresolved runPBSRecipe references. Linux test content, guides and runtime are unchanged.

Contract-Neutral: Align an existing Bash-only test file with its non-Windows test helper; no runtime, guide, dependency or platform contract change.
Change-source: pulse-maintainer
2026-10-05 05:59:59 +01:00
pulse-triage[bot] f6e5b697fd Integrate reviewed phase-aware copied-guidance checks
Retain exact candidate 87790b9042 after independent diff and hash-bound proof review. Only test observer source changes; guides and runtime stay unchanged.

Change-source: pulse-maintainer
2026-10-05 05:59:42 +01:00
pulse-triage[bot] ea99f6ef65 Incorporate supplied upstream frontier for diagnostic-test review
Retain the batch-start main frontier before integrating the independently reviewed documentation-test candidate. No publication or deployment.

Change-source: pulse-maintainer
2026-10-05 05:58:53 +01:00
rcourtman 94ac386abf Make availability checks agree across Settings and Machines (#2493)
Settings said "2 down" where Machines said "1 offline, 3 need
attention" for the same checks. Settings counted any failed latest
probe as down, while Machines and the alert engine count a check offline
only once it has failed its threshold number of times in a row.

Settings now classifies each check with the Machines status of its
resource when that is loaded, and otherwise reads the target the way the
availability poller does, so both pages report the same counts in the
same words. A check that is failing but not yet offline is amber, with
the threshold on hover.

The Machines table shows 24h uptime beside the latest result (it existed
only in the Fleet view), and only when most of the window had a
determinate answer, refreshing every five minutes. Failures read "3 in a
row" instead of "3/2", polling cadence moves to the widest tables, and
the duplicate Manage link is gone.
2026-10-05 05:51:46 +01:00
pulse-triage[bot] 87790b9042 Separate copied-guidance preparation, request and cleanup deadlines
A bounded synthetic comparison shows the whole-shell watchdog can kill a POST before its own curl deadline or expire before a PBS request starts. Observe each phase privately, preserve curl arguments and exact request limits, cancel owned descendants and retain incomplete pipe results. Exercise delayed preparation, one-shot transport, private responses and every cancellation phase without changing any guide or runtime.

Contract-Neutral: Repair Bash documentation test timing and owned-child observation only; no guide, mirror, runtime, API, authentication, request deadline, dependency or permission contract changes.
Change-source: pulse-maintainer
2026-10-05 05:39:25 +01:00
pulse-triage[bot] ecd693faf7 Integrate reviewed token-aware permission help and composed webhook proof
Change-source: pulse-maintainer
2026-10-05 05:36:35 +01:00
pulse-triage[bot] e4dde6563a Incorporate supplied upstream frontier for this candidate batch
Change-source: pulse-maintainer
2026-10-05 05:35:30 +01:00
pulse-triage[bot] 4bcca1a100 Scope private helper checks and retain audit retry diagnostics
Bind the new 0600 assertion only to the reviewed temperature cleanup helper rather than impose it on the unchanged public Unified Agent installer recipe. Include the captured canned audit output when its existing one-call assertion fails, preserving verdicts, call counts and timing controls. The complete second proof retains its fail-closed two-call observation without a cause or successful-retry claim.

Contract-Neutral: Test adapter scope and failure diagnostics only; existing guide, audit verdict and timing contracts are unchanged.
Change-source: pulse-maintainer
2026-10-05 05:33:35 +01:00
rcourtman c4b3db4058 Show Mail Gateway alerts on the gateway they belong to (#2490)
A gateway Proxmox reported online could be failing its job: mail held
in the queue past the configured age. The Mail Gateway table ignored
alerts, so that gateway rendered green and counted as Healthy while the
problem sat only on the Alerts page. Alerts are keyed by the PMG
instance id and rows by the unified id, so nothing joined them.

Rows now match unacknowledged alerts across the gateway's identity
aliases. An alerted, reachable gateway reads and filters as needing
attention (red when an alert is critical) and names the alert type under
its name. Its expansion leads with the exact alert message. On phones,
six tracks truncated "mail-gateway-eu" and "mail-gateway-us" to the same
text; the node count moves into the expansion so names stay whole.
2026-10-05 05:32:49 +01:00
rcourtman 53029b08ea Make availability checks agree across Settings and Machines
Settings said "2 down" where Machines said "1 offline, 3 need
attention" for the same checks. Settings counted any failed latest
probe as down, while Machines and the alert engine count a check offline
only once it has failed its threshold number of times in a row.

Settings now classifies each check with the Machines status of its
resource when that is loaded, and otherwise reads the target the way the
availability poller does, so both pages report the same counts in the
same words. A check that is failing but not yet offline is amber, with
the threshold on hover.

The Machines table shows 24h uptime beside the latest result (it existed
only in the Fleet view), and only when most of the window had a
determinate answer, refreshing every five minutes. Failures read "3 in a
row" instead of "3/2", polling cadence moves to the widest tables, and
the duplicate Manage link is gone.
2026-10-05 05:31:04 +01:00
rcourtman 26ba0aa323 Explain backup protection in plain words (#2492)
The Coverage tooltip and expansion render the posture explanation
verbatim, and it read like the model: "a current subject-linked
backup", "older than the configured freshness window", "a newer
provider failure", "a stronger protection claim".

Each explanation now says what Pulse found in plain words and stays true
to its branch: the stale case names the window ("the newest confirmed
backup is older than 7 days"), the failure case no longer claims a
timing it cannot know, and partial history without a backup no longer
says a backup exists. The window formatter never rounds a sub-hour or
fractional window up. The frontend fallbacks for checking, unrated and
unknown rows and the snapshot-only tooltip use the same voice.
2026-10-05 05:23:34 +01:00
pulse-triage[bot] 221a86057e Integrate reviewed pass-local system grouping index
Preserve exact Core candidate ab15c4db8a and its two prerequisite commits. Retained connected proof and complete cost samples support allocation and scaling gains, not native CPU/RSS relief.

Change-source: pulse-maintainer
2026-10-05 05:21:49 +01:00
pulse-triage[bot] eb9cf740bf Preserve copied-recipe isolation across guide smoke tests
Keep the shared direct-curl recorder compatible with the other existing guides while binding API requests to its reviewed private helper. Update the temperature selector to the reviewed fail-closed temporary download and retain disable-first TLS and mode checks. The first broad proof caught both adapter faults before publication.

Contract-Neutral: Test-only adapters for existing reviewed guide contracts; no runtime, guide, dependency or frontend change.
Change-source: pulse-maintainer
2026-10-05 05:20:34 +01:00
pulse-triage[bot] ac0ca51c75 Integrate reviewed private API and PBS documentation fixtures
Change-source: pulse-maintainer
2026-10-05 05:16:30 +01:00
pulse-triage[bot] 7cd001f03d Incorporate upstream WebKit navigation test fix at batch frontier
Change-source: pulse-maintainer
2026-10-05 05:15:52 +01:00
pulse-triage[bot] 899414d8ca Verify composed webhook instructions in both themes
Preserve the exact reviewed permission-help commit and the composed light-mode heading plus multiline service instructions. Record a fresh parent-bound browser receipt after inspecting eight Discord and Telegram captures across Chromium desktop and WebKit phone light/dark states. The fixture uses production form/state/CSS with source-exact public templates and no notification operation; earlier harness failures remain retained separately.

Contract-Neutral: Browser verification and offline fixture only; no runtime, schema, permission, notification, navigation or dependency contract change.
Change-source: pulse-maintainer
2026-10-05 05:11:04 +01:00
rcourtman 1e9f593749 Reload the Patrol briefing E2E page by navigation on WebKit (#2491)
Patrol's workspace views became routes, so the briefing spec's tab
click now pushes a history entry before it reloads twice. Playwright's
WebKit build hits a release assertion in
WebCore::Navigation::initializeForNewWindow when a pushState-created
entry is reloaded and the page navigates again, so the second reload
crashed the page on mobile-safari. It reproduces with a bare
history.pushState on any route, so this is not Pulse behaviour.

The spec now reloads by navigating to the current URL, which loads the
same document without tripping the assertion. It passes on
mobile-safari, chromium and mobile-chrome.
2026-10-05 05:09:30 +01:00
rcourtman 73c9e15491 Merge remote-tracking branch 'origin/main' into fix/mail-gateway-says-why 2026-10-05 05:08:03 +01:00
rcourtman b10b52021e Move the Mail Gateway drawer note into the drawer hierarchy clause
The note sat before the same frontend-primitives heading another lane used and conflicted with main. Taking main's file with the note folded into the existing object-drawer clause lets main merge cleanly.
2026-10-05 05:06:28 +01:00
pulse-triage[bot] e02f949b09 Preserve reviewed monitoring repairs with current upstream overviews
Compose exact upstream a82a8e0474 additively without changing accepted commits. Resolve the append-only registry-test conflict by retaining both the reviewed metadata invalidation control and upstream stale-health control. Existing PR2486 remains unchanged while normal source-check corrections are pending.

Change-source: pulse-maintainer
2026-10-05 05:05:48 +01:00
rcourtman 43c38253b6 Explain backup protection in plain words
The Coverage tooltip and expansion render the posture explanation
verbatim, and it read like the model: "a current subject-linked
backup", "older than the configured freshness window", "a newer
provider failure", "a stronger protection claim".

Each explanation now says what Pulse found in plain words and stays true
to its branch: the stale case names the window ("the newest confirmed
backup is older than 7 days"), the failure case no longer claims a
timing it cannot know, and partial history without a backup no longer
says a backup exists. The window formatter never rounds a sub-hour or
fractional window up. The frontend fallbacks for checking, unrated and
unknown rows and the snapshot-only tooltip use the same voice.
2026-10-05 05:03:08 +01:00
pulse-triage[bot] 8ad902ed1f Bind guide checks to private PBS and API response recipes
Repair deterministic governance and script-smoke failures against the reviewed guides without restoring public response output, literal credential commands or clobbering downloads. Exercise the actual shared API helper and independently verify private, unique response files, methods, bodies and hostile curl defaults.

Contract-Neutral: Update test adapters for the existing reviewed credential-private guide contract; no runtime or guide change.
Change-source: pulse-maintainer
2026-10-05 04:59:34 +01:00
rcourtman 6e48d61186 Reload the Patrol briefing E2E page by navigation on WebKit
Patrol's workspace views became routes, so the briefing spec's tab
click now pushes a history entry before it reloads twice. Playwright's
WebKit build hits a release assertion in
WebCore::Navigation::initializeForNewWindow when a pushState-created
entry is reloaded and the page navigates again, so the second reload
crashed the page on mobile-safari. It reproduces with a bare
history.pushState on any route, so this is not Pulse behaviour.

The spec now reloads by navigating to the current URL, which loads the
same document without tripping the assertion. It passes on
mobile-safari, chromium and mobile-chrome.
2026-10-05 04:48:40 +01:00
rcourtman a82a8e0474 Lead the Kubernetes overview with the nodes that are not Ready (#2489)
The Kubernetes overview said "2/3 nodes" in amber on the cluster row
but no surface on the page named the node, and active health signals
rendered at the bottom, after every healthy deployment, pod and
controller. On the Nodes tab a node's state was a hover title on a
dot that screen readers never heard.

Health signals and the nodes that are not Ready, cordoned or degraded
now lead the overview, each only while it has rows, using the existing
Kubernetes alerts and nodes tables. The full node inventory stays on
the Nodes tab, and the attention list keeps its own sort. The nodes
table names the state in a Status column beside the name, as kubectl
does, and announces it on phones where that column is demoted.
2026-10-05 04:40:56 +01:00
pulse-triage[bot] 5082c60d27 Restore documentation fixtures for private API and PBS recipes
Execute the actual API helper and PBS private-file/download handoffs, keeping their response-privacy assertions separate from shared credential-transport fixtures. Verify one-shot requests, exact methods and JSON, retained private responses and failure exits, TLS and preparation. Match the temperature cleanup test to its current non-clobbering download, without changing any guide.

Contract-Neutral: Repair connected documentation fixtures only; no guide, mirror, runtime, API, authentication, dependency or permission contract changes.
Change-source: pulse-maintainer
2026-10-05 04:35:48 +01:00
rcourtman 20eed2127b Show Mail Gateway alerts on the gateway they belong to
A gateway Proxmox reported online could be failing its job: mail held
in the queue past the configured age. The Mail Gateway table ignored
alerts, so that gateway rendered green and counted as Healthy while the
problem sat only on the Alerts page. Alerts are keyed by the PMG
instance id and rows by the unified id, so nothing joined them.

Rows now match unacknowledged alerts across the gateway's identity
aliases. An alerted, reachable gateway reads and filters as needing
attention (red when an alert is critical) and names the alert type under
its name. Its expansion leads with the exact alert message. On phones,
six tracks truncated "mail-gateway-eu" and "mail-gateway-us" to the same
text; the node count moves into the expansion so names stay whole.
2026-10-05 04:34:24 +01:00
rcourtman 6df55d0d01 Say when a Docker host goes silent, and stop repeating host columns (#2482)
A Docker host whose agent stopped reporting kept showing its last CPU,
memory and disk bars as if they were live, with only an orange dot to
hint otherwise. The tables now read the backend's telemetry_stale
reason: that host's metric cells are dimmed, Uptime shows how long it
has been silent, and its container group header says "No report for 1h".

Health could only carry that reason when nothing outranked it, so a
silent host with an offline alert lost the signal. The verdict still
leads with the alert, and a stale source now adds a trailing
telemetry_stale reason. The first reason, which the state summary
reports, is unchanged.

Grouped by host, the containers table also repeated the host name and
engine on every row, about a quarter of its width. Those columns are
dropped in grouped mode and the group header names the engine once;
flat mode keeps them, and a saved sort on either hidden column no longer
reorders grouped rows.

Verified in a browser on a mock estate at 1440 and 390 with the rebuilt
backend (receipt included). Go: internal/unifiedresources, internal/api
summary and internal/monitoring health tests pass; full frontend suite
passes apart from the known Mac-only agentInstallCommand cases.
2026-10-05 04:32:23 +01:00
pulse-triage[bot] ab15c4db8a Index only possible grouping owners and exercise real pass boundaries
Maximum-priority roots cannot be better than any group in a snapshot, so leave them out of the temporary owner indexes while retaining every resource and group. Correct new fixtures to respect existing attachment semantics: differently ranked hosts may already merge, and an agent's first-pass IP attachment must remain ambiguous until its two owners merge. Cover equal-priority Proxmox cost before any timing run.

Contract-Neutral: Candidate-only priority pruning and faithful regression fixtures preserve all stored/published resources, identity, strict attachment ambiguity, evidence precedence, public schemas and counted-system admission.
Change-source: pulse-maintainer
2026-10-05 04:29:10 +01:00
rcourtman b3fefdba2c Make Patrol and Actions views linkable (#2488)
Patrol's Inbox, Protection and Activity views and the Actions Open and
History views lived in component state. A bookmark, a shared link or a
reload always opened the default view, and back/forward did nothing.

Each view is now a route: /patrol, /patrol/protection,
/patrol/activity, /actions and /actions/history. Tabs navigate without
scrolling the page. Lifecycle-driven switches in Actions (a deep-linked
review whose action has settled) replace history instead of pushing.
The Patrol finding handoff scrolls to the findings once Activity has
mounted. The Inbox's ?attention= selection is read from the real address
when leaving the Inbox and restored on return, because the attention
workbench writes it straight to history and the router's copy can be
stale.
2026-10-05 04:26:54 +01:00
pulse-triage[bot] cf62ee09bc Keep grouping proof helpers callable and pin admission ambiguity
Rename the parameterised benchmark bridge so Go does not discover it as a benchmark entry point. Preserve the reference's exact-owner keys even for empty internal sets while retaining nonempty hostname-form admission. Pin unique versus ambiguous host attachment in the real monitored-count/prospective-admission path without mutating stored inventory.

Contract-Neutral: Test harness correction and faithful internal owner representation only; complete inventory, canonical identity, grouping evidence, counted-system admission and public schemas stay unchanged.
Change-source: pulse-maintainer
2026-10-05 04:18:17 +01:00
pulse-triage[bot] 5e967c49f5 Merge reviewed token-aware Proxmox permission help
Change-source: pulse-maintainer
2026-10-05 04:15:03 +01:00
pulse-triage[bot] b67a0ab573 Retain reviewed main work alongside upstream Notifications presentation
Change-source: pulse-maintainer
2026-10-05 04:14:38 +01:00
pulse-triage[bot] ff46264503 Reuse sorted owner buckets within each system-grouping pass
Build complete hostname/IP/form owner indexes once in priority order, visit only strictly better owners and reject once two distinct qualifying roots prove ambiguity. Preserve exact/short/IP evidence precedence, metadata freshness, exclusions and all resources. Bind the immediate-parent algorithm and enumerate targets independently; exercise real provider grouping and connected Infrastructure output.

Contract-Neutral: Pass-local representation and cost only; complete inventory, strict better-priority and ambiguity rules, evidence ordering, identity, public schemas, observations and alert policy are unchanged and covered by exhaustive and connected reference controls.
Change-source: pulse-maintainer
2026-10-05 04:14:27 +01:00
rcourtman 42ce399baf Lead the Kubernetes overview with the nodes that are not Ready
The Kubernetes overview said "2/3 nodes" in amber on the cluster row
but no surface on the page named the node, and active health signals
rendered at the bottom, after every healthy deployment, pod and
controller. On the Nodes tab a node's state was a hover title on a
dot that screen readers never heard.

Health signals and the nodes that are not Ready, cordoned or degraded
now lead the overview, each only while it has rows, using the existing
Kubernetes alerts and nodes tables. The full node inventory stays on
the Nodes tab, and the attention list keeps its own sort. The nodes
table names the state in a Status column beside the name, as kubectl
does, and announces it on phones where that column is demoted.
2026-10-05 04:11:16 +01:00
rcourtman 27f020f033 Lead Notifications with where alerts go (#2487)
A user opening Notifications wants to know where their alerts go and
how to send them to Discord, Telegram or email. The page opened on nine
"held, delivery not turned on" rows that repeated the paused banner,
then a fully expanded but disabled SMTP form and Apprise form, with
webhooks (where Discord, Telegram and ntfy live, and the destination
issues ask about most) near the bottom.

Unless delivery is degraded, destinations now lead: webhooks first,
described by the services they reach, then email and Apprise, then the
delivery log. A degraded queue still keeps its log directly under the
recovery controls. A switched-off email or Apprise destination is one
line saying what turning it on does, with "Show settings" to inspect the
form without enabling it. A new webhook opens on the service choice
instead of the generic JSON form, and setup steps keep their line
breaks.

Delivery health now sets its snapshot and availability in one batch.
Set separately, the attention flag briefly read a half-updated pair and
unmounted the warning mid-refresh.
2026-10-05 04:08:21 +01:00
pulse-triage[bot] 70bf9b8db9 Preserve reviewed monitoring work with current light-mode presentation
Compose exact upstream ff7e945f44 additively; retain every reviewed candidate and existing proposal identity.

Change-source: pulse-maintainer
2026-10-05 04:04:00 +01:00
rcourtman ff7e945f44 Render light-mode banner and callout text at full strength (#2485)
Light-mode text on tinted callouts, banners and selection cards drew at
25% alpha: CalloutCard titles and bodies in every tone (the Security
overview's "Recommended hardening steps"), the Alerts thresholds help,
the update-channel card titles, Patrol and Action banners. The Tailwind
v3 config redefined each colour's 900 and 950 shades as 25% alpha so
dark-mode backgrounds could tint, which also faded every light-mode
text-*-900. The Tailwind 4 migration kept that parity by rewriting the
usages to -900/25.

Every light-mode text-*-900/25 and text-*-950/25, hover included, now
uses the solid shade. Dark variants, backgrounds, borders and rings keep
their tint, so dark mode is unchanged.

Contract-Neutral: restores light-mode text colour tokens only; no
behaviour, data, route or contract change
2026-10-05 03:53:22 +01:00