Preserve reviewed tip 11e0946999 and incorporate exact current upstream 59ed65739c additively. Publication remains subject to combined-source validation and outstanding exact-head check repairs.
Change-source: pulse-maintainer
A History reply carries its source: the history store, readings Pulse
holds in memory because the store has none for the range, or a lone
current reading when no history exists yet. The drawer readout ignored
it and always said "Latest stored", so memory and live readings were
presented as stored history. The canvas charts did badge the source, but
as "Buffer" and "Live", words a reader has no reason to know.
One shared vocabulary now covers both. Stored history (and demo data)
keeps "Latest stored" / "Stored". Memory readings read "Latest recorded"
/ "Recorded", with one line above the drawer charts saying the store has
none for this range yet, and a "Recent only" badge on canvas charts. A
lone current reading reads "Current", badged "Current only".
The drawer charts gained a min-max band (#2917) and a phone fold
(#2923); the storage disk and pool charts, drawn by the canvas
HistoryChart, had neither.
Band: each stored point is a bucket average with its lowest and highest
reading. When any bucket spreads, the chart now draws a 20% band between
them behind the line, so a short spike survives downsampling. The area
fill under the line is gone, so storage charts read like the drawer
charts; a flat series is a line alone.
Phone fold: a disk detail stacked five charts on a phone. It now shows
the first History chart plus any chart whose SMART card is out of
bounds, and folds the rest, Live I/O included, behind one button. Folded
charts read nothing until opened. The button is a shared
PhoneChartsToggle that the drawer History now uses too.
The visual pass also caught short windows repeating a time label
("Oct 2" four times); the time axis now states each label once.
The pause change's receipt named its pre-rebase parent, so the range check could not bind it after #2928 landed. This receipt records the browser pass of the final content of every frontend file the pause, resize and axis commits change, bound to its own parent.
The canvas History chart always drew four time labels, so in a narrow
card, such as a disk's live I/O charts three abreast, they ran together
("12:04 PM12:07 PM12:10 PM12:14 PM"). It now measures its labels and
draws as many evenly spaced times as the plot fits, down to the first
and last.
The drawer charts format sub-kilobyte rates as "<1K/s" on purpose, so a
quiet link printed "<1K/s" on two gridlines, which tells the reader
nothing. Both chart kinds now blank a middle gridline label that repeats
a neighbour; the gridline stays and the end labels always remain.
The range-label test imported two storage modules inside its body and
timed out under load; they are now static imports.
A History chart sizes its point cap from its width, and the cap was part
of the selection that decides when a chart starts over. Any resize, a
window drag, a drawer or sidebar change, even a full-page screenshot,
cleared the readings and showed a "Loading history" spinner until the
re-read at the new cap returned.
The cap now only shapes the request. The series a chart shows (target,
metric, range, organisation, lock) decides when it starts over, so a
resize re-reads the same series quietly with its readings on screen.
Pointer inspection still resets on a resize, because its pixel positions
moved.
The guest-storage-2263 browser proof now narrows and restores the
viewport and takes a full-page capture with a disk open: the old hook
showed spinners, the new one keeps the charts.
Retain exact Web commits and their parent-bound browser receipts. Existing form accessibility, shipped documentation synchronization and test typing only; collection defaults, saved payloads, TLS and credentials are unchanged. Retained incremental source and consuming browser proof is adequate; native recovery and hosted acceptance remain separate.
Change-source: pulse-maintainer
The guest drawer keeps Overview mounted behind the Manage tab so
switching back does not jump. Its own history charts already paused
there, but an expanded physical disk's charts kept polling every 10-30
seconds and the disk list kept refreshing on live updates, all for a
view nobody could see.
HistoryChart now takes enabled: false aborts its read and stops polling
while keeping the readings it shows, and resuming the same selection
reads at once without a loading spinner before polling again. The
drawer's historyEnabled reaches DiskDetail through GuestPhysicalDisks,
which also holds the list's realtime refresh through
useUnifiedResources' realtimeEnabled.
The guest-storage-2263 browser proof now hides and shows the Overview
with the clock running: the old code read disk history while hidden,
the new code reads none and resumes with the same chart nodes.
The focus handoff from #2925 tracked Retry focus with focus/blur
handlers. Chromium blurs a focused element when it leaves the DOM, and
the Show branch removes the button before the error effect runs, so the
flag was already false and focus fell to the page. jsdom never blurs on
removal, which is why the unit test passed. Read document.activeElement
when the Retry branch is disposed instead, and make the refresh test
model the removal blur so it fails against the old code.
The worker-browser proofs for history response, pointer, inspection,
window and the three PBS fixtures still clicked the removed History tab
and Refresh button. They now read the charts on Overview, drive reads
through the 30-second poll, select series paths rather than every path
(bands and dots add paths), and mount fixtures in a shared app runtime
(fixtureRuntime.tsx) because drawers read the WebSocket and theme
contexts. The PBS refresh proof is what caught the focus regression.
The restored star reminder looked like a routine status notice. The
prompt now uses the earlier “Enjoying Pulse?” heading, a GitHub badge
with a gold star, a colour accent and a full-width action. Its copy asks
for support based on usefulness and discovery.
The existing first-return timing, single lifetime appearance, permanent
dismissal, notice priority and shared actions are preserved. Phone
controls retain 44px touch targets and the card clears the measured
bottom navigation.
Validation: 14 banner tests, frontend type-check and lint, production
frontend and matching mock backend builds, and source-bound Playwright
on /proxmox/overview at 1440×900, 800×900, 390×844 and 320×740 in light
and dark themes. The browser matrix covers wrapping, focus and keyboard
actions, outside click and Escape, new-tab safety, permanent dismissal
and reload, notice priority, transport states and command-palette
suppression.
The focus handoff from #2925 tracked Retry focus with focus/blur
handlers. Chromium blurs a focused element when it leaves the DOM, and
the Show branch removes the button before the error effect runs, so the
flag was already false and focus fell to the page. jsdom never blurs on
removal, which is why the unit test passed. Read document.activeElement
when the Retry branch is disposed instead, and make the refresh test
model the removal blur so it fails against the old code.
The worker-browser proofs for history response, pointer, inspection,
window and the three PBS fixtures still clicked the removed History tab
and Refresh button. They now read the charts on Overview, drive reads
through the 30-second poll, select series paths rather than every path
(bands and dots add paths), and mount fixtures in a shared app runtime
(fixtureRuntime.tsx) because drawers read the WebSocket and theme
contexts. The PBS refresh proof is what caught the focus regression.
Preserve the accepted cc6eb37ae9 history while incorporating current published History alert ownership and removal of the refresh control.
Change-source: pulse-maintainer
The complete frontend suite on the safety-control candidate passed 23,490 cases but stopped on the repository-versus-shipped issue-triage copy check. Mirror the eight current metadata-intake lines from the already integrated root document without changing policy, parser or tests. Verify the actual served asset through the existing Docs renderer on desktop and narrow WebKit, including native consumer bytes and index/back navigation; retain the prior failure separately.
Contract-Neutral: Exact shipped documentation mirror and source-bound consuming receipt only; the root policy, parser, existing routes, APIs, permissions and runtime behaviour are unchanged.
Change-source: pulse-maintainer
The restored reminder used a muted compact notice. Bring back the
Enjoying Pulse heading, a GitHub badge with a gold star, a colour accent
and a full-width action. Focus the copy on usefulness and project
support while preserving one-time appearance and permanent dismissal.
Contract-Neutral: Presentation and copy only. Existing notice admission, shared action ownership, destination and persistence contracts are unchanged.
A final review of the drawer series (screenshots plus the full diff)
and a real alert on the preview found several problems:
- A Docker host drew its container's 85% memory trigger on the host's
own memory chart and turned the host reading red. Needs attention
rightly lists nested alerts; the charts now take triggers only from
getOwnAlertsForUnifiedResource, the resource's exact-key alerts.
- A container drawer listed none of its own alerts. The matcher now
answers to docker:<host>/<container id> (or /name:<name>), the key
the alert engine writes, so it lists them and charts the trigger.
- Docker and resource-detail drawers printed the alert's breach-time
message ("memory at 99.5%") beside a chart reading 70%. They now use
the shared attention copy the Proxmox drawers use: "Memory 70% now,
recovering".
- Disk temperature and storage capacity alerts reached no chart; an
alert line drawn before any history sat at an arbitrary height; the
dashed line had no visible label (the legend now says "alert at
85.0%"); a phone panel shown for an alert hid again when the alert
cleared, under a reader mid-inspection; facts strips stated a used
memory amount for a retained reading.
The Refresh history button is gone: the charts poll every 30 seconds.
Retry history still appears for a failed read, and when a successful
retry removes it, focus moves to the history region instead of the
page. Tests that used Refresh to trigger a read now advance the poll on
a fake interval clock.
Give the existing PVE collection controls concise accessible names and separate help. Associate VM collection with the full independent-recovery precaution and SMART with its drive-standby warning. Refer to the warning text rather than its named note: the actual Chromium accessibility tree showed that referring to the note exposes only its title. Keep per-editor IDs, defaults, saves, credentials and guest behaviour unchanged. Extend the existing safe editor fixture with actual accessibility-tree, keyboard and phone-touch checks, retaining all six consuming journeys and viewed pixels.
Contract-Neutral: Existing form accessibility and its tests only; public API/data/collection contracts, collector defaults, save payloads, TLS, credentials and guest requests are unchanged.
Change-source: pulse-maintainer
Retain exact reviewed Delivery and Web commits. The diagnostic collector preserves strict goldens and records bounded renderer facts; source-p67_zn71 and retained browser controls cover the new test code. No runtime frontend changes or pending graph are included.
Change-source: pulse-maintainer
Retain the useful reason to disable unneeded collectors as well as the new guest-read limits and safety guidance. Preserve the existing copy guard rather than weakening it. Recheck the final PVE producer on desktop and phone, retaining unchanged PBS/PMG branch proof. Browser evidence records actual input hashes instead of a permanently hardcoded source parent.
Contract-Neutral: Existing collection guidance and browser-proof metadata only; collector defaults, API saves, credentials, TLS and guest request behaviour are unchanged.
Change-source: pulse-maintainer
Replace the existing full-visibility promise with the actual guest-agent availability and permission limits. Put the backup precaution beside VM collection, preserving independent thaw and every-covered-filesystem write checks rather than implying that an OK backup or a running VM proves recovery. Exercise the production connection editor with harmless fixtures, without probing a guest or replacing credentials.
Contract-Neutral: Copy and an accessible landmark on an existing form; collection defaults, guest requests, connection saves, credential handling and TLS policy are unchanged.
Change-source: pulse-maintainer
Bind current desktop and 390px Docs navigation, reviewed pixels and the existing empty Diagnostics panel to byte-identical shipped guides. Retain original browser fixture failures and the unmodified live-check/privacy boundaries. This records help usability, not native recovery.
Contract-Neutral: Browser receipt metadata only; no runtime, renderer, documentation content or contract delta.
Change-source: pulse-maintainer
Complete the retained three phone topologies after the corrected viewport reached ordinary browser admission. Real touch, snapshot correlation, range retention, explicit target withdrawal and hidden-Overview polling pass at 390px, with all six originals inspected. Preserve the completed desktop consumers and the separate adverse authentication/native jobs.
Contract-Neutral: This records new previously missing phone consumer evidence for unchanged production contracts; no runtime, monitoring or access behaviour changes.
Change-source: pulse-maintainer
Bind the actual current retirement notice to its parent with desktop/390px, light/dark and existing entitled/unlicensed controls. Preserve the independently inspected ten originals and the auth golden-comparison failures separately; no full probation, native phone, installed monitoring or release claim is made.
Contract-Neutral: Evidence-only receipt records existing source consumer proof; no additional runtime or contract change.
Change-source: pulse-maintainer
Preserve the exact reviewed history and own-parent Docker receipt; complete the remaining isolated auth, retirement, navigation and PBS proof.
Contract-Neutral: Additive source composition preserves runtime contracts; imported fixture and browser-guard repairs do not change product behaviour.
Change-source: pulse-maintainer
Bind both shipped guides to their producer parent, actual Docs navigation and shared phone controls at desktop and narrow viewports. Retain native pixel observations and the safe fixture limits.
Contract-Neutral: Browser verification metadata only; no rendered source, runtime, access or collection contract changes.
Change-source: pulse-maintainer
Record a new desktop/phone browser pass for the integrated final bytes. Active warnings, History ranges/spread, truthful unknown-versus-zero disk facts, retained tab identity and hidden-tab polling are exercised and the eight original captures inspected. Imported receipts and history remain unchanged.
Contract-Neutral: Fresh consuming proof for unchanged integrated runtime; no drawer or monitoring contract delta.
Change-source: pulse-maintainer
Incorporate the upstream frontier present at batch review without re-parenting reviewed source or repeating unrelated qualification.
Change-source: pulse-maintainer
Bind actual Docs producer responses, desktop keyboard and phone touch links, and inspected navigation/bucket-bound pixels to the unchanged guide source.
Contract-Neutral: Browser evidence metadata only; no product or subsystem contract change.
Change-source: pulse-maintainer
Preserve the exact 9eb52f5c candidate ancestry. Select its already browser-verified whole NodeDrawerOverview file and retain current disk guidance, pressure fixture and viewport protection. No new combined frontend content or changed release packet.
Change-source: pulse-maintainer
Record fresh desktop and phone consuming proof for the five newly combined frontend files. Keep all earlier receipts/history intact; inspect all 36 originals natively, preserve failed attempts and reuse completed identical-source scenes. Correct only the qualification driver's actual peak format and settled range waiter.
Contract-Neutral: Own-parent browser evidence and qualification-driver corrections only; no runtime or subsystem contract delta.
Change-source: pulse-maintainer
With history charts on every drawer's Overview, a phone stacked three or
four chart panels before a guest's facts, a node's hardware or an
agent's details: a guest drawer ran 1043px tall at 390px wide.
Below the sm breakpoint the shared chart component now shows the first
panel (Utilization) and any panel carrying an active alert, then one
full-width "Show Network I/O, Disk I/O, Thermals" button that reveals
the rest. The guest drawer drops to 657px. Wider layouts are unchanged.
It is a CSS class on panels that stay mounted, so it adds no read and
the hidden panels keep their data for when they are shown.
Preserve accepted 0efe3f7a12 and exact upstream ebfdc9d669 additively. Keep quiet unavailable captions, keyboard and touch reading explanations, stopped-agent provenance and primary CPU readings. Preserve stable denied-update help outside Details and all regression assertions.
Change-source: pulse-maintainer
Bind the existing Docs producer to its own parent: twelve desktop and phone navigation/code rows and eight native pixel inspections. Keep the first missing-touch-context failure and unavailable source-suite/build result explicit; this browser receipt is not native Kubernetes acceptance or delivery.
Contract-Neutral: Record existing-guide browser evidence only; no runtime, contract, entitlement or navigation delta.
Change-source: pulse-maintainer
The drawer range picker said "24 hours", the physical disk detail said
"Last 24 hours" and the storage pool detail said "24h", so the same
choice read three ways depending on where a reader opened history.
historyChartModel now owns one label table, and the drawer, disk and
pool pickers all take their option names from it: "1 hour", "24 hours",
"7 days". That matches how the rest of the app names durations (system
settings, Patrol schedule). The chart header's compact segmented range
buttons keep their short "24h" tokens; they are a different control and
are hidden inside these details.
Every resource drawer now charts history on its Overview. The storage
page's pool and physical-disk details were the last to keep it behind a
History tab, and that was their only other tab, so a reader opened a
pool or disk and then had to switch tabs to see whether it was filling
up or heating.
Both now render one view with no tab strip. A pool detail leads with its
Capacity Trend card, the range picker in the card header, followed by
configuration, topology and devices. A disk detail keeps its health
verdict and SMART facts first, as the evidence behind the verdict, then
its History charts with the range picker beside the heading, then live
I/O.
The storage contract had required these charts to stay behind the
History tab; it now records the 2026-10-13 decision instead.
Preserve exact published 170f726c history and min-max bands, primary CPU temperature and quiet captions alongside truthful disk unknowns, stale-Agent qualification and always-visible stable update guidance. Keep the existing text clipping controls rather than a tbody-ratio tolerance. Fresh consuming proof follows on these resolved bytes.
Change-source: pulse-maintainer
PR 2913 moved the Proxmox guest and node drawers' charts onto Overview
and removed their History tab. The Docker host drawer and the shared
resource-detail drawer (agent machines, containers, PBS, TrueNAS,
Kubernetes and other platform rows) still kept the charts a tab away,
so the same kind of drawer behaved two ways depending on the page.
Both now render the history charts on Overview under the attention
list, opening on 24 hours with the range picker beside them, and drop
the History tab. Charts stop polling while another tab shows, and an
active alert on a charted metric draws its trigger the same way as in
the Proxmox drawers. A resource whose metrics target drops for one
snapshot simply loses its charts until the target returns; the
selected tab is kept.
Storage page disk and pool details keep their own History tab; they
are separate components and their Overview has no charts to repeat.
E2E specs 27 and 63 no longer click History; the drawer read starts
when it opens. The manual tab-retention proof now selects Manage. Its
fixture page fails before the drawer renders (no WebSocket provider)
on main as well, so it was not run.
Drawer charts plot one average per time bucket, so a short CPU burst or
I/O spike inside a 6-minute bucket (24h) or an hourly rollup (7d) shrinks into
the average and disappears. The trend cards this Overview replaced
stated a "24h low-high" range; the charts had nothing in its place.
Each stored point already carries its bucket's min and max. A tinted,
outlined band now spans those extremes behind every line, so a spike
stands as a spire above the average. Series whose buckets never spread
draw no band. While a time is inspected, the legend names that bucket's
peak when it rises at least a tenth of the plot above the average, and
the accessible value states each reading's average and range.
Spec 86 also allows sub-pixel clipping when it checks that the drawer's
Memory rows are fully in view. With the charts on Overview, CI placed
that table on a fractional offset and the rounded table border clipped
0.4% of it (ratio 0.9956), failing an assertion of exactly 1.
Record actual desktop and phone consuming proof and native pixel inspection. Correct the test to distinguish native same-page fragments from routed cross-document links; the served guides are unchanged. Preserve the first failed suite and its three unrelated five-second timeouts for final validation.
Contract-Neutral: Documentation proof and test correction only; no runtime contract change.
Change-source: pulse-maintainer
Opening a Proxmox guest or node drawer showed 24-hour trend cards for
CPU, memory and disk on Overview, then a History tab with the same
metrics again, in a different chart style and opening on 7 days, plus
network, disk I/O and thermals. One tab was a superset of the other,
so the reader had to reconcile two views of the same data.
The guest and node drawers now chart history on Overview itself, under
the alerts line and Worth checking, opening on 24 hours with the range
picker beside the charts. The History tab and the trend cards are gone.
The charts stop polling while Manage is shown, show the live reading
(qualified current or last known) until history is stored, and an
offline or stale node says so in one line instead of offering live
values.
What the cards carried and the charts lacked moves with them:
- An active alert on a charted metric tones its reading and, when it has
a numeric trigger, draws it as a dashed line. I/O triggers are
converted from the alert engine's MiB/s to the charts' bytes per
second, and networkIn/networkOut map to the netin/netout series.
- The facts strip states the amounts the percentages are of: guest
vCPUs and used-of-total RAM and disk, node used-of-total RAM and root
disk (capacity only while a node's readings are withheld).
The range picker now mints its id once per instance, so a guest and a
node drawer open together no longer share a label target. Legend
readings are a step larger and the timestamp quieter, and the charts
use two columns at medium widths. Docker host and resource-detail
drawers keep their History tab for now.