Retained full-suite proof reports an inherited agent-cooldown before the invalid-UTF8 lock case dispatches any command. Give each synthetic case a distinct base path, keeping all clients in that case on its shared key. A same-listener control retains the prior uncertainty fence unchanged. No runtime guest guard, native target or assertion is weakened.
Change-source: pulse-maintainer
The retained 277ec211 source proof times out on a correctly retained target, with injected requests zero and its pin unchanged. This test owns routing and trust, not a latency SLO. Use explicit five-second client and ten-second caller fixture bounds, record elapsed work, and retain every routing/pin/guest assertion. Runtime timeouts and timeout controls are unchanged; the original failed receipt remains adverse evidence, not a diagnosed host fault.
Change-source: pulse-maintainer
Preserve contradictory rows before monitoring constructs its endpoint trust map. A final matching row must not mask earlier disagreement during saved-view consolidation. Cover both merge orders and retain the existing agreeing-format path; strengthen lifecycle configuration ownership checks.
Change-source: pulse-maintainer
Carry exact duplicate-row conflicts into owned client trust before map deduplication. Keep unresolved saved trust through initialization, missing-client retry and topology refresh without replacing pins or stopping trusted siblings. Cover actual monitor lifecycle routes and member projections alongside client TLS controls.
Change-source: pulse-maintainer
Resolve all saved pins for an endpoint before credential-bearing construction. Contradictory trust is an explicit failure, not a missing-pin fallback or first-use opportunity. Preserve independent authorities, agreeing formats and saved configuration; prove zero provider work, sibling monitoring and normal reload through the member projection.
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".
Stacked on #2932 (same chart files); it carries that commit until #2932
lands.
Preserve exact Delivery commit 8d8a1790ad and composition ancestry. Retained source qualification supports service-state and running-executable admission; raw output equality and installed recovery remain unverified. Infra tip is already canonical ancestry.
Change-source: pulse-maintainer
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
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.
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".
Failed-install forms accept attempted release asset names, but archive and platform suffixes currently become part of the affected-version label. Recognise the published server archive naming shapes, keep companion binaries and verification files out of server version evidence, and preserve unknown fields, bare prerelease qualifiers, Community-owned labels and the live-state fence. Reproduce the actual silent label consumer on five affected inputs and qualify archive, formatting and adverse controls without reporter collection or public contact.
Contract-Neutral: Silent issue classification and regression controls only; no product runtime, subsystem shape, rendered product surface, dependency, grant or public-contact behaviour change.
Change-source: pulse-maintainer
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 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.
This branch carries the whole drawer chart stack: #2929 (pause hidden
disk charts) and #2930 (keep readings through a resize), plus a receipt
commit. #2929's receipt named its pre-rebase parent, which failed the
range check on both; the last commit records a fresh browser pass of the
final content bound to its own parent. Merging this lands all three.
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 corrected unknown, incomplete or removed version field currently retains old exact-version affects labels beside needs-version-info. Reconcile those synchronizer-owned assertions with the live bug report, preserving Community labels and the pre-write state fence. Verify corrected fields, delayed events, removals-only writes and no-op/non-bug controls without public contact.
Contract-Neutral: Issue classification metadata and regression controls only; no product runtime, subsystem shape, rendered surface, dependency, grant or public-contact behaviour change.
Change-source: pulse-maintainer
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.
Use scoped, detached producer tuples for canonical guests on failed nodes instead of publishing enrichment-only projections as readings. Keep original metric provenance, guest collection state and observation times, without cloning unrelated fleet data or changing guest command safety. The connected admission proof exposed and now covers this complete preservation path.
Change-source: pulse-maintainer
Keep stderr and trailing blank records in service-state and running-PID admission. Incomplete reads must not authorise installation, restart, rollback or update success. Require production caller and real-process controls for both read boundaries; preserve existing recovery, trust and deadlines.
Change-source: pulse-maintainer
Preserve exact candidate 2ffacbaf1a. Retained source-zy0ifepj covers six stale-preparation controls and the full 109-test triage suite; canonical script, tests and dependency graph have no intervening changes.
Change-source: pulse-maintainer
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.
Sixteen worker-browser proofs still opened the removed History tabs,
clicked the removed Refresh button or depended on UI that has since
moved. Each now passes on pulse-dev:
- Charts are read on Overview (guest, resource, PBS) or inline in disk
and pool details; table-row-touch toggles Manage/Overview as its
nested input instead of the old tab.
- Reads are driven through the 30-second poll with the page clock.
- Locators select series paths and hover markers, since bands and
observation dots also draw paths.
- Rows lifted into Worth checking or kept under the closed Details
disclosure are read from the whole Overview, with Details opened.
- With stored history shown, the legend reads the latest stored time,
so series without a point say "no reading" rather than a live value.
- Stubbed history replies echo the requested series and carry min/max,
as the client has validated since 866da85c26.
- Fixtures that mount the resource drawer supply activeAlerts.
- The guest-stopped-disk write check allows the content-free
workload-history usage milestone that opening details records.
- On emulated phones, headless Chromium reports a fine pointer, so the
proof touches the plot before tapping the inspection slider.
Require whole bounded, unambiguous enumerations on the efficient and node fallback routes. Preserve scoped empty inventories, LXC integer compatibility and ordinary counter/receipt semantics. Validate retained readings, History, breaches and template policy through actual fallback and recovery.
Change-source: pulse-maintainer
Sixteen worker-browser proofs still opened the removed History tabs,
clicked the removed Refresh button or depended on UI that has since
moved. Each now passes on pulse-dev:
- Charts are read on Overview (guest, resource, PBS) or inline in disk
and pool details; table-row-touch toggles Manage/Overview as its
nested input instead of the old tab.
- Reads are driven through the 30-second poll with the page clock.
- Locators select series paths and hover markers, since bands and
observation dots also draw paths.
- Rows lifted into Worth checking or kept under the closed Details
disclosure are read from the whole Overview, with Details opened.
- With stored history shown, the legend reads the latest stored time,
so series without a point say "no reading" rather than a live value.
- Stubbed history replies echo the requested series and carry min/max,
as the client has validated since 866da85c26.
- Fixtures that mount the resource drawer supply activeAlerts.
- The guest-stopped-disk write check allows the content-free
workload-history usage milestone that opening details records.
- On emulated phones, headless Chromium reports a fine pointer, so the
proof touches the plot before tapping the inspection slider.
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.
Label lookup and creation can outlive a report edit, closure or Community review. Abandon the prepared issue-label delta when a fresh pre-write read no longer matches its report and label snapshot; failed reads have no stale fallback. Keep no-op work to one read, preserve per-label mutations and make no public contact.
Contract-Neutral: Issue metadata synchronizer and its regression controls only; no product runtime, subsystem contract, rendered surface, grants, dependencies or public-contact behavior changes.
Change-source: pulse-maintainer
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.
Run the locked parser and silent triage policy on their complete input changes in a credential-free Build and Test job. Retain issue-event pre-token checks, existing runtime and strict dependency gates; exercise admission and original install/test failure exits.
Change-source: pulse-maintainer
Testing Library role-name strings already match exact accessible names; its typed ByRoleOptions does not admit Playwright-style exact options. Remove the three non-operative unsupported options and assert the names explicitly. Preserve every warning, description, state, unique-ID and saved-credential assertion. The existing production source and both source-bound browser receipts are unchanged.
Contract-Neutral: Test query typing and explicit existing name assertions only; no production source, rendered content, API, collection, permissions or saved data changes.
Change-source: pulse-maintainer
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.
I gave Sol (gpt-6.1-sol) a final review of the whole drawer series, with
11 full-resolution screenshots, and checked a real alert on the preview.
This fixes what that turned up and removes the history Refresh button.
**Alert matching**
- A Docker host drew its container's 85% memory trigger on the host's
own memory chart and turned the host reading red. Charts now take
triggers only from `getOwnAlertsForUnifiedResource` (the resource's
exact-key alerts). Needs attention still lists nested alerts.
- A container drawer listed none of its own alerts. The matcher now
answers to `docker:<host>/<container id>` (or `/name:<name>`), the key
`DockerContainerResourceID` writes.
- Docker and resource-detail drawers printed the breach-time alert
message ("memory at 99.5%") beside a chart reading 70%. They now use the
shared `getAlertAttentionCopy`, which reads "Memory 70% now, recovering
/ Clears after 5 minutes at 80% or lower".
- Disk temperature (`temperature`/`diskTemperature` to `smart_temp`) and
storage capacity (`usage`) alerts now reach their charts.
**Charts**
- No alert line is drawn before history exists, where it would sit at a
placeholder height.
- The legend names the trigger ("alert at 85.0%").
- On phones, a panel shown because of an alert stays shown after the
alert clears.
- Facts strips show only the size for retained memory readings.
- The "Refresh history" button is removed; the charts poll every 30s.
"Retry history" appears only for a failed read, and focus moves to the
history region when a successful retry removes it.
**Verification**
- Typecheck plus 826 test files (Workloads, Infrastructure, features,
utils, Storage) on pulse-dev; three docs-rendering tests timed out under
load there and pass on their own. Tests that used Refresh to trigger a
read now advance the poll on a fake interval clock.
- On the built preview, the real alert on container sftp-ingest-2 shows
in its drawer with the dashed line and legend label. The Docker host no
longer draws its container's trigger.
**Not in this PR**
- 23 manual browser proofs still click the removed History tab or
Refresh button; they are fixed in a follow-up.
- Review items deferred, listed for follow-up:
- nested disk charts in a guest drawer keep polling behind Manage;
- storage charts lack the band and the phone disclosure;
- axis-label crowding in four-column layouts;
- "Latest stored" ignores the response source;
- inventory cards on resource-detail drawers.
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
Consume the bounded response through EOF before admitting nodes or a cluster probe. Reject missing, ambiguous and incomplete inventories without leaking response details, retain scoped empty arrays and provider metadata, and cover trusted startup, recovery, cached reads and consuming endpoint projection.
Change-source: pulse-maintainer
Contract-Neutral: Tightens existing node-inventory and recovery-health admission without changing the public response schema, API surface, permissions, TLS or guest-command policy.