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
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
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.
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 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
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
Final-source proof source-gvq604pb passed types and 492 tests but exposed nine obsolete fixture assumptions after additive upstream composition. Scope upstream OS facts assertions to the visible facts strip and open native Details before checking the retained full System row. Preserve all value, wrapping, freshness and mounted-identity assertions; no runtime source changes.
Contract-Neutral: Integration test selectors and native disclosure setup only; production drawer bytes and behavior are unchanged.
Change-source: pulse-maintainer
The consuming pass now confirms actual captured focus and reading guidance, then exposes the fixture's button-role selector for the semantic History tab. Use its shipped tab role for both transitions; keep the on-demand History check.
Contract-Neutral: Browser control selector correction only; product, source tests and graph are unchanged.
Change-source: pulse-maintainer
Preserve exact reviewed d636bfdaea and published 0a44d276db ancestry. Retain both contract additions, readable System evidence and stable accessible update help alongside upstream alert-first trends, facts and Details.
Change-source: pulse-maintainer
Retain the pre-capture CSS measurement and exact element classes alongside the captured frame, then apply unchanged strict criteria to the rendered observation. This preserves failing pixels rather than ending with a DOM-only claim.
Contract-Neutral: Browser observation/capture ordering only; no product, threshold, regression or graph changes.
Change-source: pulse-maintainer
The combined full suite passed 23,370 tests but six inherited System tests still queried the removed table row. Keep every OS/name/version/update/liveness case, asserting the actual visible wrapping facts outside closed Details instead of reintroducing a duplicate row.
Contract-Neutral: Test consumer selectors follow the composed facts strip; all existing evidence and visibility obligations remain.
Change-source: pulse-maintainer
A horizontal SVG line has a zero-height box even when its enclosing chart is visible. Require the threshold node and the visible chart without treating Playwright's line-box visibility test as a product failure; pixel inspection remains required.
Contract-Neutral: Browser SVG observation correction only; no source behaviour, chart assertion, regression or graph is changed.
Change-source: pulse-maintainer
Shared rules were repeated across subsystem contracts, and some still
required the deleted Discovery scanner or superseded proofs. Keep each
shared rule at its canonical owner with scoped consumer links, retain
local differences, and remove obligations whose runtime or verification
path no longer exists.
Correct the stale temperature-padding expectation, trusted-command
producer description, telemetry adoption fields and proof names against
current source. Qualification stays with the existing customer-journey
document. Assistant, all four Patrol modes, paid entitlements, VM backup
precautions and installer/native qualification limits are preserved.
Runtime code, registry ownership and proof routing are unchanged.
Validation: focused monitoring, API, identity, telemetry and server
tests, contract/registry/status audits, scoped-link and ownership
checks, and normal commit hooks. The two slices remove 466 net lines
across 13 contracts and consolidate 16 shared rule families without
moving the bulk into another catalog.
Paired native-tab controls with and without the clock show the expected outline on unchanged source. Resolve the actual loaded trend and focused pseudo-state before sampling CSS; retain the same focus assertions and both adverse passes, without inventing a product colour or clock fault.
Contract-Neutral: Browser observation protocol only; production, acceptance criteria, regressions and graph remain unchanged.
Change-source: pulse-maintainer
The new source-bound static fixture exercises the actual Docs fetch, renderer, keyboard and touch links with eight natively inspected captures. All producer, consumer and served bytes match; this completes help qualification, not native QNAP recovery or release availability.
Contract-Neutral: Browser receipt only; production source and subsystem contracts are unchanged.
Change-source: pulse-maintainer
Retain the initial zero-width outline observed immediately after native tab input. Wait for fonts and two rendered frames before applying the unchanged focus criterion, as the established consuming guidance harness does.
Contract-Neutral: Browser observation timing only; no production, criterion, regression or dependency change.
Change-source: pulse-maintainer
Keep shared tenant-store, backup association, source identity, grouping,
installer qualification and alert evidence rules at their canonical owners.
Consumer contracts retain scoped references and their distinct local rules.
Remove obligations for the deleted Discovery scanner and backfill. Replace
superseded chart-padding expectations, telemetry schema history and test
names with the current source contracts while retaining VM backup precautions,
privacy limits, paid behavior and native qualification boundaries.
The second pass reached real guest guidance and retained disks but supplied a reply to the wrong history endpoint. Match the actual metrics-store request, use native tab traversal for the guidance, and consume the node help link through its shipped Docs renderer.
Contract-Neutral: Browser fixture response and interaction correction only; production, source regressions and dependency graph remain unchanged.
Change-source: pulse-maintainer
The same removal and settings-preservation rules were maintained in
several subsystem contracts. Keep removal safety in agent lifecycle and
settings compatibility in the API contract, with scoped links from
consumers.
Preserves legacy Assistant preferences, paid entitlement checks,
installer recovery rules and native qualification limits. Runtime code
and ownership/proof routing are unchanged.
Validation: contract, registry and status audits, normal commit-hook
governance tests, four installer removal controls, Assistant mode-echo
and Patrol default handler tests, and settings initialization tests.
The first consuming pass timed out before opening the desktop drawer: the fixture driver focused a name span instead of the row action. Use the shipped disclosure control and retain that failed pass; no runtime or assertion is weakened.
Contract-Neutral: Browser fixture input correction only; production and regression bytes are unchanged.
Change-source: pulse-maintainer
The original prepared fixture failed esbuild lowering before producing an artifact. Keep that complete adverse receipt. Use the same current-engine target as the existing consuming previews; this does not change the production target or claim legacy-browser qualification.
Contract-Neutral: Correct test-only preview compilation for the installed current browser; production source, tool limits and runtime contracts are unchanged.
Change-source: pulse-maintainer
Cover closed-Details OS and filesystem guidance plus stable update help across readings, relative ages and evidence changes. Add a compiled safe-observation browser fixture for the combined drawers and shipped Docs.
Contract-Neutral: Connected composition regression and browser fixtures retain existing source behaviour and document the merge outcomes.
Change-source: pulse-maintainer
Keep the original output-bound attempt stopped. Compile the existing Docs fetch, renderer, router and shipped help in the offline source VM, then exercise exact static bytes at desktop and phone with a small bounded browser process and native captures. No runtime or tool-boundary change.
Contract-Neutral: Test-only consuming Docs fixture and source-bound preview preparation; production code, routes, installer/runtime contracts and enforced browser limits are unchanged.
Change-source: pulse-maintainer
Keep removal safety requirements in agent lifecycle and replace deployment
copies with scoped references. Keep legacy Assistant mode-echo compatibility
and security setup settings preservation in the API owner, so their consumers
do not maintain separate copies of the same obligations.
Runtime behavior, paid entitlement checks and native qualification limits
remain unchanged.
Preserve the original guidance candidate and existing source history; this isolated composition is not canonical integration or publication.
Change-source: pulse-maintainer
Keep published alert-first 24-hour trends and closed Details. Preserve phone filesystem guidance, full OS facts, and a drawer-owned update-access help dialog outside the demoted inventory. Retain both independent subsystem contract additions.
Change-source: pulse-maintainer
The chosen source proof runs with umask 077. Explicitly chmod the inert pre-update binaries so failure controls can require exact preservation of a 0755 executable rather than assuming WriteFile overrides the caller's mask. This changes only fixture setup; production permission, trust and recovery assertions are retained.
Change-source: pulse-maintainer
Avoid rewriting an already-replaced QNAP executable through an aliased persistent path. Stage split QNAP and Unraid copies in owned same-directory temporaries, set execute permissions before atomic replacement, and clean every failed stage without changing saved state or update trust. Add authenticated HTTPS and real child-exec regressions plus persistence failure and recovery controls. Native appliance and old-installed-updater recovery remain separate.
Change-source: pulse-maintainer
Patrol's operator-state projection dereferenced the one-shot
MaintenanceStartAt/EndAt whenever IsInMaintenanceAt was true. A
recurring window also reports active but leaves those fields nil, so
the first finding Patrol evaluated during a recurring occurrence
panicked the provider. The projection now takes its bounds from the
active occurrence.
Alerts already silence guests under a host window scoped to
resource_and_descendants, but Patrol read only the exact resource, so
the same planned work dismissed a guest's alerts and still raised its
Patrol findings. Both now resolve maintenance through one rule,
unifiedresources.ActiveMaintenanceCoverageAt: own window plus
descendant-scoped ancestor windows, latest active end wins. Only
maintenance is inherited; monitoring mode, lifecycle and remediation
locks stay exact-resource state. An inherited dismissal says the window
is on a parent resource and names it on the lifecycle event, and the
Manage help now says descendants' new Patrol findings are dismissed
too.
Patrol's operator-state projection dereferenced the one-shot
MaintenanceStartAt/EndAt whenever IsInMaintenanceAt was true. A
recurring window also reports active but leaves those fields nil, so
the first finding Patrol evaluated during a recurring occurrence
panicked the provider. The projection now takes its bounds from the
active occurrence.
Alerts already silence guests under a host window scoped to
resource_and_descendants, but Patrol read only the exact resource, so
the same planned work dismissed a guest's alerts and still raised its
Patrol findings. Both now resolve maintenance through one rule,
unifiedresources.ActiveMaintenanceCoverageAt: own window plus
descendant-scoped ancestor windows, latest active end wins. Only
maintenance is inherited; monitoring mode, lifecycle and remediation
locks stay exact-resource state. An inherited dismissal says the window
is on a parent resource and names it on the lifecycle event, and the
Manage help now says descendants' new Patrol findings are dismissed
too.
Retain the exact Delivery commit and its complete source-el4dto5p proof. The CI-only partition preserves all checks and deadlines; native recovery and upstream drawer reconciliation remain separate owning-lane work.
Change-source: pulse-maintainer
Distinguish private prompt preparation, preflight and read-only profile inspection from installation and destructive removal. Keep existing unavailable-agent and automatic-update investigations separate, and route FAQ and troubleshooting readers to the existing private-file and recovery guides.
Contract-Neutral: Help copy and rendered-document regression checks only; installer, credential, lifecycle and monitoring contracts are unchanged.
Change-source: pulse-maintainer
Retain the shared resolver and request authority while retrying only failed socket establishment. Usable addresses share one bounded dial budget; cancellation prevents further attempts and TLS still authenticates the original hostname and pin. Connected controls reproduce the first-address defect and cover cache reuse, families, deadlines and cancellation.
Change-source: pulse-maintainer
Bind actual canonical guest, both drawer warnings, shipped Docs and RBAC recovery consumers to the containing source. Parent controls and final passes cover both themes and desktop/phone input. All 24 captures were natively inspected; native recovery and full source suites remain separate.
Contract-Neutral: Own-parent browser receipt only; no runtime or contract change.
Change-source: pulse-maintainer
The canonical drawer requires an explicit metricsTarget to offer History; the connected fixture now supplies that real producer field rather than assuming the workload drawer fallback. This was found by source inspection before browser execution. Production and regression bytes remain unchanged.
Contract-Neutral: Synthetic browser fixture metadata only; no product or wire-contract change.
Change-source: pulse-maintainer