Bind the reconciled Guest and Node drawers, guest model and update evidence to current compiled source and desktop/phone light/dark consumers. Twenty final captures were opened natively. Retain the original mismatched History fixture failure and complete corrected range-aware cases without changing runtime behavior or weakening assertions.
Contract-Neutral: Source-bound browser receipt only; no runtime, regression, graph or guidance changes.
Change-source: pulse-maintainer
Final composed frontend source-bqtf8ld2 passed types, all lint and 23379 tests, but five fixture assertions still assumed denied updates stayed outside Details and the troubleshooting intake had no copied-command row. Require neutral denied status inside usable Details while guidance and dialog identity remain visible, and cover all ten workflow entries and seventeen real heading destinations. Runtime and safety assertions are unchanged.
Contract-Neutral: Integration fixture assertions only; no runtime, documentation, graph or policy changes.
Change-source: pulse-maintainer
All four combined runtime files are consumed through the actual drawers/History/Docs at desktop and phone widths in both themes. All24 final captures were inspected with the native image tool; prior failed driver runs and inconsistent synthetic extrema remain retained. No native recovery or availability is claimed.
Contract-Neutral: Own-parent browser evidence only; production and contracts are unchanged.
Change-source: pulse-maintainer
Preserve the complete accepted local tip and exact published 526fa790ae additively. Keep upstream chart attention, neutral denied-update status and wrapping together with the reviewed reading and accessible update guidance.
Change-source: pulse-maintainer
Pixel review found the mock readout was in MiB/s while its min/max stayed in the percentage fixture range. Use matching extrema and require magnitude-labelled I/O axes. Retain original captures and do not attribute this invalid fixture to production.
Contract-Neutral: Synthetic browser API data and its assertions only; production and contracts stay unchanged.
Change-source: pulse-maintainer
Retain the second browser result: both desktop themes finish, while phone tap supplies no hover selection. Exercise the shipped touch inspection slider and Home key rather than assuming mouse semantics on WebKit. Production and safety checks stay unchanged.
Contract-Neutral: Browser interaction correction only, with no production or contract delta.
Change-source: pulse-maintainer
Retain the failed visibility wait and two original captures. A zero-length round stroke has painted pixels but no group bounding box; require attached marker paths and non-scaling stroke, then inspect actual History pixels. No production change or weakened safety assertion.
Contract-Neutral: Consuming browser-driver correction only; production and contract bytes are unchanged.
Change-source: pulse-maintainer
Keep the same API-recovery assertion while normalising Markdown whitespace, as the other guide assertions already do. Preserve the initial failed proof and unchanged five-second deadlines.
Contract-Neutral: Documentation regression assertion only; no public behaviour or contract change.
Change-source: pulse-maintainer
Source inspection finds utilization is the chart group and disk labels belong to table rows, not their individual cells. Correct the consuming assertions before browser execution, preserve all safety checks and format only the new proof harness.
Contract-Neutral: Proof-harness corrections only; containing production bytes and contracts are unchanged.
Change-source: pulse-maintainer
Bind the actual guest and node drawers, combined UTC completion formatter, week History and 24-hour trends to an offline desktop/phone proof. Check neutral denied status separately from failed-check warnings, full wrapping, retained readings and persistent accessible help without guest or credential operations.
Contract-Neutral: Credential-free consuming proof harness only; no additional production or contract delta.
Change-source: pulse-maintainer
The production Markdown renderer wraps tables to contain narrow-screen overflow. Select its semantic link rather than assuming an unwrapped table sibling.
Contract-Neutral: Browser acceptance selector only; no rendered or runtime change.
Change-source: pulse-maintainer
Add a safe missing-PBS path to the existing guide and troubleshooting entry. Separate connection polling, the server row, direct inventory and History without requesting credential changes, an agent install or repeated diagnostics.
Contract-Neutral: Documentation and consuming proof only; no API, monitoring, permissions or runtime behaviour change.
Change-source: pulse-maintainer
Keep compact exceptions, chart axes and neutral denied status in Details. Preserve full facts, last-known disk evidence and the persistent accessible update-help control. Resolve both source and regression/contract semantics additively; final combined bytes still need their own consuming browser receipt.
Change-source: pulse-maintainer
Preserve the exact reviewed private-input candidate and its source-bound receipts. Qualify changed drawer composition separately; no native or release acceptance is claimed.
Change-source: pulse-maintainer
Record the actual privileged Bash reader from the selected tool and send HUP/TERM to it while retaining the controlling terminal. Whole-session termination cannot supply the same restoration observation. Keep the adverse whole-group result, full mode/privacy assertions and every caller control.
Change-source: pulse-maintainer
Non-interactive PTY sessions dispatch through sh while history sessions use bash. Supply both in the closed PATH so tool/mode controls exercise the producer rather than failing at child creation; retain all privacy and complete-terminal assertions. Preserve the observed failed suite.
Change-source: pulse-maintainer
Mirror the qualified Unix reader in setup, Proxmox and container producers: select one terminal tool, distinguish missing terminal/tool/mode failures, restore its complete state before installation and on cleanup, and retain silent overflow draining. Emit the isolated privileged body once without changing tokens, trust, scopes, profiles or state. Cover serialized contracts and actual consumer payloads.
Change-source: pulse-maintainer
Cover setup, Proxmox and container callers with a real PTY, isolated standalone and BusyBox tool selection, distinct fail-closed modes, private root/sudo history and one bounded command body. These controls expose the unchanged backend reader before its repair.
Change-source: pulse-maintainer
The first native pass verifies the complete canonical memory journey but exposes a faulty positive geometry control: collapsed borders alone did not reduce its target intersection. Make the synthetic table wider than its clipping container while keeping every text line safely inset. Preserve all negative clipping/hidden/empty controls and use no ratio tolerance; this diagnoses the control, not the product layout.
Contract-Neutral: Integration geometry control only; production frontend, memory semantics, safety behaviour and dependency graphs are unchanged.
Change-source: pulse-maintainer
Include nested value spans in the unclipped-text proof, not just their enclosing cells. Add controls for an internally clipped value and a hidden child whose line boxes still exist; retain the viewport and navigation requirements.
Contract-Neutral: Integration geometry proof only; production frontend, memory semantics, safety behaviour and dependency graphs are unchanged.
Change-source: pulse-maintainer
Actual Settings and Agent Doctor copy consumers retain separate credentials, private-file fallback, identity and trust. All sixteen final captures were opened with the native image tool; no native or release acceptance is claimed.
Contract-Neutral: Source-bound consuming browser evidence only; production bytes and contracts are unchanged.
Change-source: pulse-maintainer
The PR 2910 Chromium shard fails twice on a 0.991228 tbody intersection despite fully readable phone Memory, Total and Free evidence in the retained captures. Require every non-empty text line to fit the viewport, navigation clearance and clipping ancestors instead of a decorative table border. Keep all canonical-memory withdrawal, stale, zero and other-cluster assertions; add desktop/phone positive border and seven genuine unreadability controls without loosening a ratio or timeout.
Contract-Neutral: Integration geometry assertions and adverse controls only; production frontend, memory semantics, safety behaviour and dependency graphs are unchanged.
Change-source: pulse-maintainer
Stacked on #2909 (its commit is the parent here and lands with either
PR).
A full-resolution visual pass of the guest and node drawers, plus a Sol
review of the same screenshots, found the charts and attention hard to
read:
- **Numeric axes.** History I/O axes read "Max / Avg / 0" with no
magnitude, and "Avg" was the scale midpoint, not a measured average
(demand ledger "Numeric axis labels on history I/O charts", #1720).
Thermals read "Max / Mid / Min". Gridline labels now state the scale
value (e.g. `5.0M/s`, `60°C`) and sit centred on their gridlines.
- **Worth checking up front, one line each.** It was a full card per
section below the charts. It is now a compact list directly under the
alerts line, using the shared detail-row tone.
- **Now vs history.** Trend card headlines say "now", and the range
reads "24h low–high", so the live number is not read as the last point
of the stored line.
- **No text wall.** The two-sentence memory-cache caveat under the
charts (repeated in Details) becomes "may include cache" on the Memory
card; the full note stays once, in Details.
- The missing-readings note is one line, and the Details summary uses
readable text.
Tests: the full frontend suite passes (15,467). New proofs: Worth
checking renders above the trend cards with the shared tone, and the
guardrail pins that the list reuses `detailValueToneClass`. Browser
receipt: full-resolution screenshots of every drawer tab at 1440 and
390px, reviewed.
Follow-ups not in this PR (from the same review): threshold lines on
History charts, a crosshair shared across panels, taller History plots,
a Manage tab layout pass, and status text beside the drawer's status
dot.
Use a POSIX root/sudo prefix inside the isolated subshell rather than duplicating the long quoted reader. Synchronise PTY command entry and exit with the caller prompt, retain full terminal/privacy/overflow assertions, and follow current help rows by their labels. The browser driver now inspects the full Linux card.
Change-source: pulse-maintainer
Preserve exact specialist commits and retained consuming document proof. The Docs consumer and dependency bytes are unchanged; this help maintenance is not a baseline-memory repair.
Change-source: pulse-maintainer
- **Denied update check is a setting, not a fault.** The node drawer
listed "Updates: Unavailable · Update check access denied" in amber
under Worth checking. Proxmox gates the package list on `Sys.Modify`,
and `docs/TROUBLESHOOTING.md` calls keeping the narrower monitoring role
a valid choice, so `permission_denied` now reads neutral and stays in
Details. A source outage or failed check is still a warning and still
surfaces under Worth checking.
- **Node Details values wrap.** The update reason, linked agent ID and
CPU model were cut off behind an ellipsis that only a hover could
reveal. Details rows now wrap them.
Verified in headless Chromium against a mock-mode build, with
`/api/resources` rewritten to inject each update state, reviewing
full-resolution screenshots at 1440 and 390px. Tests: unit tone tests, a
drawer test that keeps the denied check in Details with a wrapped value,
and a failed-check test that keeps it under Worth checking. Putting the
tone back to warning fails two of them. 813 node, Proxmox and guardrail
tests pass.
Preserve the exact reviewed tip and incorporate current upstream History default, marker shape and readout behavior additively.
Change-source: pulse-maintainer
Mock chart history thinned each metric with LTTB on its own. LTTB keeps
value-dependent points, so the metrics of one resource ended up with
different timestamps. The public demo (6.5.0) showed this: a container's
24h history had eight ~48-point series spread over 162 distinct
timestamps, and a node's had 166. The drawer History panels break a line
wherever another series in the panel has a reading, so every mock chart
drew as dots with "Missing observations". Real poller history writes all
of a resource's metrics at the same times.
Mock series are now thinned onto an epoch-aligned grid. Each bucket
keeps its first reading, the newest reading is kept too, and every point
keeps its own timestamp. Point targets and values are unchanged.
Verification:
- `TestMockChartHistorySharesTimestampsAcrossMetrics`
(`monitor_metrics_slo_test.go`) checks a mock VM, container and node, on
synthetic and seeded history, at 1h, 4h, 24h and 7d. It fails on the
previous code (5 of 20 memory timestamps shared with cpu) and passes
now. `internal/monitoring` passes in full.
- On a mock-mode build of this branch, `/api/metrics-store/history`
returns a timestamp union equal to the per-series count for a VM, a
container, a node and an agent at 1h, 24h and 7d. The drawer History tab
draws one continuous path per series with no "Missing observations". The
unpatched build of the same estate showed 82 dots and the note on all
three panels.
A full-resolution visual pass of the guest and node drawers (and a Sol
review of the same screenshots) found the charts and attention hard to
read:
- History I/O axes read "Max / Avg / 0" with no magnitude, and "Avg"
was the scale midpoint, not a measured average; thermals read
"Max / Mid / Min". Gridline labels now state the scale value at each
line (e.g. 5.0M/s, 60°C) and sit centred on their gridlines.
- "Worth checking" was a full card per section below the charts, so a
21-day-old backup took three lines and read last. It is now a compact
label/value list directly under the alerts line.
- Trend card headlines could be read as the last point of their line.
Each now says "now", and the range reads "24h low–high".
- A two-sentence memory-cache caveat (with unrelated agent-setup advice)
sat under the charts and again in Details. The Memory card now says
"may include cache"; the full note stays once, in Details.
- The missing-readings note shrinks to one line, and the Details
summary uses readable text.
Correct the copy-audit finding without changing the reader, file handoff or platform choices.
Contract-Neutral: Copy-style correction only, with no behaviour or contract delta.
Change-source: pulse-maintainer
The PTY fixture compares the complete saved terminal state, not only echo and canonical flags.
Contract-Neutral: Existing terminal-restoration obligations are unchanged; this strengthens their executable verification.
Change-source: pulse-maintainer
The node drawer listed "Updates: Unavailable · Update check access
denied" in amber under Worth checking. Proxmox gates the package-update
list on Sys.Modify, which is broader than monitoring needs, and
docs/TROUBLESHOOTING.md calls keeping the narrower role a valid choice.
A deliberate setting is not a fault, so that reason now reads neutral
and stays in Details. A source outage or failed check is still a
warning and still surfaces under Worth checking.
Node Details rows also wrap their values instead of truncating them.
Details is where a reader goes for the full value, yet the update
reason, the linked agent ID and the CPU model were cut off behind an
ellipsis that only a hover could reveal.
Select the BusyBox stty applet only when standalone stty is absent, fail before unsafe entry on terminal-control errors, and restore modes with the selected tool. Expose the existing private-file installation alternative on Linux/NAS alongside FreeBSD without changing issuance, TLS, removal or privilege.
Change-source: pulse-maintainer
Two drawer History presentation fixes, both reported while previewing
the drawer redesign:
- **Oval dots.** The plot stretches its viewBox to the panel
(`preserveAspectRatio="none"`), so the `<circle>` markers for single
observations and the hover cursor rendered as wide ovals. They are now
zero-length, round-capped strokes with a non-scaling stroke, so they
stay round at any width. Series lines carry `data-history-series` so
tests can tell lines from dots.
- **Jumping note.** "A dash means no stored observation at this time"
appeared and vanished as the inspected time changed, pushing the chart
up and down while scrolling past it. A missing value now reads **no
reading** in the readout itself, and the line is gone. In a pointer
sweep the chart height stayed constant (202px at 1024, 327px at 390).
Tests: History tests select lines by `path[data-history-series]` and
hover markers by `[data-history-hover-marker]`. A new guard checks the
plot has no `<circle>` and that dots are round non-scaling strokes. The
readout assertions now expect "no reading". Workloads, Infrastructure
and Docker suites pass (3,692 tests). Contract notes in
`frontend-primitives` and `performance-and-scalability`.
Mock chart history thinned each metric with LTTB on its own. LTTB keeps
the points whose values stand out, so cpu, memory and disk of one guest
kept different timestamps: on the public demo a 24h container history
had eight ~48-point series spread over 162 distinct timestamps. The
drawer History panels break a line wherever another series in the panel
has a reading this one lacks, so every mock chart drew as dots with a
"Missing observations" note. Real history does not do this because the
poller writes all of a resource's metrics at the same times.
Thin mock series onto an epoch-aligned grid instead: keep the first
reading in each bucket plus the newest reading, at their own
timestamps. Which readings survive now depends only on when they were
taken, so series sampled together keep identical timestamps, values
stay real readings, and point targets are unchanged. The synthetic
generator no longer pre-thins to 500 points, since every caller thins
onto the grid.
The guest and node drawer Overview now leads with 24h trend cards
(#2900), so a History tab that also opened on 24 hours repeated them.
History now opens on **7 days** for those drawers: Overview answers
"what is it doing now", History "what is normal this week". Any range is
still selectable, and the free plan keeps 7 days, so the default is
never locked.
- Trend cards read their own `DRAWER_TREND_RANGE` (24h). A 24h History
selection still reuses their cached read.
- Drawers without trend cards (Docker host, resource detail) keep the
24h History default.
- Tests: the History-range assertions are moved to 7d, and a new
NodeDrawer test checks reads go 24h (cards) then 7d (History). Putting
the default back to 24h fails that test. Workloads, Infrastructure and
Docker suites pass (3,693 tests).
- Browser receipt from a mock-mode build at 1280 and 390px.
The History plot stretches its viewBox to the panel width
(preserveAspectRatio="none"), so the <circle> markers for single
observations and the hover cursor rendered as wide ovals. They are now
zero-length, round-capped strokes with a non-scaling stroke, drawn in
screen pixels, so they stay round at any width. Series lines carry
data-history-series so tests can tell lines from dots.
The readout explained a missing value with a separate line, "A dash
means no stored observation at this time", which appeared and vanished
as the inspected time changed and pushed the chart up and down, most
visibly while scrolling past it. A series without a reading at the
inspected time now says "no reading" in the readout itself, and the
extra line is gone.
Merge exact Web candidate f034be1854. Resolve drawer overlap to its browser-verified contents and System facts controls; retain canonical GuestDrawer assertions, newer agent help, updater repair and consolidated contracts. Retained source and browser proofs qualify presentation only, not native workload or QGA recovery.
Change-source: pulse-maintainer
The typed-reply fixture keeps the successful memory cache untouched, so the selector legitimately retains guest-agent-meminfo provenance rather than the expired-cache previous-snapshot label. Require that exact source while preserving strict last-known state, original observation time, unchanged cache and History checks.
Contract-Neutral: Fixture expectation and proof description only; runtime source selection, guest admission, observation ages, API and History semantics are unchanged.
Change-source: pulse-maintainer
The private NAS fixture copied /bin/sleep and relied on its renamed process identity. Build a bounded Go collector instead and require its fixed readiness marker through the generated wrapper's retained stderr, as well as exact kernel process ownership. Preserve actual wrappers, teardown/parser, all stop and cleanup assertions, and existing deadlines. This removes a platform-owned executable assumption; it does not diagnose or clear the preceding macOS failures or establish native appliance recovery.
Contract-Neutral: Private fixture executable and readiness proof only; production installer, process ownership, safety deadlines and wire contracts are unchanged.
Change-source: pulse-maintainer
Validate result/content/truncated types before shared guest-command admission is released. Scalar results must not become empty inventories, and wrongly typed file fields must not release admission before decoder failure. Preserve compatible empty/null rows and completed but unusable measurements. Add six-reader, alias/expiry and actual-state polling/broadcast/History controls with untouched healthy-read origins. Native thaw and restart recovery remain separately unverified.
Change-source: pulse-maintainer
The guest and node drawer Overview now shows 24h trend cards for CPU,
memory, disk and temperature, so a History tab that also opened on 24
hours repeated them. History now opens on 7 days for those drawers:
Overview answers "what is it doing now", History "what is normal this
week", with any range still selectable. The free plan keeps 7 days, so
the default is never locked.
The trend cards read their own 24h constant, and a 24h History
selection still reuses their cached read. Drawers without trend cards
(Docker host, resource detail) keep the 24h History default.
Bind desktop Chromium and narrow WebKit journeys, exact document and consumer bytes, safe diagnostic links and four natively inspected captures. This qualifies the changed guidance, not a memory repair or native deployment.
Contract-Neutral: Browser verification receipt only; production source, runtime behaviour and subsystem contracts are unchanged.
Change-source: pulse-maintainer
Verify the actual Workloads/Node drawers, History and shipped Docs at desktop and phone widths in both themes. All sixteen final captures are natively inspected; source/artifact hashes, 44px phone guidance and persistent denied-update HelpIcon state are bound to this commit's own parent.
Contract-Neutral: Source-bound browser receipt only; no runtime, regression, graph or advice changes.
Change-source: pulse-maintainer
The copyable healthcheck previously also imposed a 256 MB memory limit and half a CPU, without workload qualification. Preserve the check, separate sizing from health and repair, and retain existing deployment policies. Link the bounded read-only interpretation and cover the shipped document and actual Docs consumer.
Contract-Neutral: Existing documentation and offline consuming fixtures only. No runtime defaults, deployment policy, API, retention, polling, resource enforcement or subsystem contract changes.
Change-source: pulse-maintainer
Desktop journeys and phone drawer/help checks complete; the phone's entire troubleshooting document exceeds Chromium/WebKit's image dimension ceiling. Capture the actual linked section at the verified viewport instead of an unreadable whole-document image.
Contract-Neutral: Browser documentation capture size/position only; no product, assertion, source test or graph changes.
Change-source: pulse-maintainer
The completed async trend introduces a second truthful last-known explanation. Scope both checks to their real consuming surfaces and require both to disappear on the fresh synthetic read rather than relying on one unscoped match.
Contract-Neutral: Browser selectors/assertions cover both existing evidence consumers; no product, source tests or graph changes.
Change-source: pulse-maintainer