Replace order-dependent substring and display-name attribution with exact PVE connection/native-node ownership and unique PBS namespace matching. Preserve ambiguous artifacts in distinct source-scoped, IDREF-safe rows and explain unmatched evidence without claiming that the guest was deleted. Keep migrated backups, independent server posture and unique-VMID PBS compatibility. Include connected controls, dependent contracts and inspected desktop/phone browser proof.
Change-source: pulse-maintainer
Retain exact Core candidate 3fd44b8325 alongside published guest-memory repairs. Reviewed source-ifgmfzhw and exact built desktop/phone render proof cover the unchanged documentation and test content; no native thaw or installed recovery claim.
Change-source: pulse-maintainer
Explain the manual systemd precaution inside the Pulse server LXC, including update timer and in-flight installer checks, stopped-state readback, independent covered-filesystem write checks before restart, and restoration of prior service states. Keep native thaw, recovery and release availability explicitly unproved.
Contract-Neutral: Document existing service controls and safety limits; no runtime, route, API, persistence, permissions or release-gate changes.
Change-source: pulse-maintainer
Repeated backup locks could drop a VM’s memory reading after the first
deferred poll. Preserve the complete last-known value while the original
successful guest-agent cache still supports its identity, values and
age. Retained values stay labelled previous-snapshot and do not renew
the cache timestamp or memory History; fresh polling replaces them after
unlock.
Validation:
- Eight consecutive locked polls after ordinary cache expiry through the
unified resource read-view path, followed by fresh recovery.
- Original-evidence guards for age, source, identity, capacity and
measured zero usage.
- Full monitoring and Proxmox package tests, focused race tests, and
repository commit hooks passed.
This fixes memory retention during backup deferrals. The original native
HAOS freeze race still requires separate qualification.
Preserve the exact Web candidate and final-content browser receipts. Retain both Diagnostics and PBS contract sections in the documentation-only conflict resolution.
Change-source: pulse-maintainer
Retain the complete last-known memory value from the scoped guest snapshot only while the original successful QGA cache supports its values and age. Keep deferrals labelled previous-snapshot without renewing cache timestamps or memory History.
Exercise repeated locks after ordinary cache expiry through unified resource views, with provenance, identity, capacity and expiration controls plus fresh unlocked resumption. Native freeze-race qualification remains separate.
Preserve the reviewed HTTP completion guard alongside the published single-attempt transport and Diagnostics protections.
Change-source: pulse-maintainer
Bind the final production content to six completed Chromium/WebKit direct and canonical controls, with inspected 1365px, 390px and 320px screens, mounted replacements and safe error notices. Retain earlier failed executions separately.
Change-source: pulse-maintainer
Install the default monitor's snapshot callback after both platform pollers exist. Settings already observes their runtime owners; alert checks must not retain startup's nil pointers. Exercise actual saved connections, loopback failures, ledger, monitor confirmation ticks, disable and ordinary scheduled inventory recovery without changing policy or adding a surface.
Contract-Neutral: Restore existing connection-alert wiring; no route, payload, authentication, persistence or detector-policy changes.
Change-source: pulse-maintainer
Name the component-specific fault-admission accessor explicitly instead of shadowing the generic adapter capacity helper. The shared snapshot constructor does not decide this read-evidence policy. Keep the audit and all display semantics unchanged.
Change-source: pulse-maintainer
Contract-Neutral: Names a component-specific datastore read-evidence accessor distinctly from the shared capacity-snapshot adapter; no behaviour, input, wire or public-contract delta.
Report entry still treated sanitized exports as sufficient and named an obsolete Diagnostics action. Warn before live collection during backups or an unresponsive host, reuse displayed results, and require local privacy review of files, screenshots and echoed errors without adding intake requirements.
Contract-Neutral: Community intake guidance only; release, installation and diagnostic runtime contracts are unchanged.
Change-source: pulse-maintainer
Supply the existing required resource display names without changing rendered labels. Bind the six completed desktop and touch context controls to the exact production content, retaining the earlier adverse init and load observations.
Change-source: pulse-maintainer
## What changed and why
This maintenance batch makes existing Diagnostics collection and sharing
safer and prevents Proxmox guest-agent commands from being silently
repeated by HTTP transport recovery.
- Guest-agent commands use a separate, single-use HTTP/1 connection with
the configured TLS, proxy, dial and timeout policy. Lost replies are not
transparently replayed, redirects are not followed, and uncertain
results preserve the existing cooldown and last-known monitoring data.
Ordinary API connection pooling and recovery remain unchanged.
- Sanitised Diagnostics downloads redact current token-usage, snapshot,
nested guest and disk identities while retaining measurements and
diagnostic joins. The full download is unchanged. Accessible guidance
distinguishes live checks from local downloads, explains
backup/freeze/thaw risks, and requires manual privacy review before
sharing. The shipped Troubleshooting guide matches the controls.
- The measured Diagnostics lazy-chunk baseline increases from 6,009 to
7,245 gzip bytes for these privacy and safety controls; growth limits,
other baselines, total budgets and startup checks are unchanged.
Related to #2439. This transport correction and collection guidance do
not establish the reported freeze's cause, native thaw or installed
recovery. Sanitisation is not a guarantee that arbitrary text or future
fields are safe to publish.
## Included source
Complete unpublished range:
`1548050727d75814d398a956c2934303b94a0276..79d54eb96f8bde6ae2880b0ff706d6d52e9d0dc3`
(nine commits including additive integration merges).
Reviewed candidates:
- Core:
`8fd6d3c71f363495cb8644953fa4673e5c96e55a..076a4ff94fe447adea787a5d97698fa57bc1d735`,
integrated by `3e31f38f35e956307253b91511cc21cacab5cd56`.
- Diagnostics:
`1ff46c4261e11b4a8edcd573df415a217ecd34cd..ea490f6503d93d6f27440fd2d83b7c30b42da17d`,
integrated by `79d54eb96f8bde6ae2880b0ff706d6d52e9d0dc3`. Implementation
`5cd4b4439042ed9be54773d2bc6dd37c20d9e96c` includes connected fixture,
copy and measured-budget corrections.
All reviewed identities are preserved; published upstream is already an
ancestor.
## Validation
- Exact combined-head offline proof `source-zewnlr8w`: 348 tests across
12 connected Diagnostics/Docs and upstream backup-date suites,
type-check, production build and bundle checks passed. Raw output
collection and guest cleanup completed; marker line-bound limits and
readiness/package/Vite warnings remain recorded.
- Recorded Core proof `source-bej9pci0`: 67 focused leaves, full
Proxmox/TLS suites, connected monitoring controls, focused races, vet
and embedded builds passed. The corresponding tested Proxmox and
monitoring subtrees are byte-identical at this proposal head. Parent
wire proof retained 42 failures reproducing replay/redirect contact with
ordinary recovery controls passing.
- Recorded Diagnostics proof `source-3jjdrd_5`: 200 connected
Diagnostics/Docs tests, full type-check, lint, format, build and bundle
checks passed. Parent comparison retained five privacy failures and two
passing controls. Earlier fixture/type/copy and historical-budget
failures are retained, not counted as passes.
- Recorded production-component browser proof: Chromium desktop and
WebKit phone emulation, 14 behavioural groups, ten inspected screens,
real local JSON downloads, accessible warnings and actual Docs
navigation. Final content hashes and own-parent browser receipts match
this proposal. Emulation is not native iOS acceptance.
- Publication-head provenance, whitespace checks, own-parent canonical
guards using the existing punctuation-only neutral trailer, final
browser bindings, public registry/contracts, status and control-plane
audits passed.
Required exact-head CI and independent review still apply before
landing. This PR publishes source maintenance, not a release or native
recovery acceptance.
[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
Retain the exact reviewed Core candidate and its source-5_ta7via proof. Defer further guest reads after ambiguous HTTP failures without claiming native freeze or thaw acceptance.
Change-source: pulse-maintainer
Keep the 20-second deadline and all page-error, privacy, state, identity and geometry assertions. Await DOM readiness, the actual table and loaded fonts rather than treating the dev server's generic load event as the product acceptance condition. Retain the earlier load-event timeout.
Change-source: pulse-maintainer
Keep all browser error and geometry assertions; theme setup must tolerate the early WebKit init-script phase. The existing post-load dark-context assertion setup remains unchanged.
Change-source: pulse-maintainer
Bind the independent-inventory assertions only after the routed server table mounts. Preserve failure, protection, count and recovery assertions; no production or contract change.
Change-source: pulse-maintainer
Preserve the actual HTTP response status rather than trusting quoted API errors. Apply the VM-wide cooldown after request timeouts and unexplained server or gateway failures, while retaining exact command-bound terminal refusals as ordinary errors. Reject ambiguous error envelopes and preserve cached guest observations alongside fresh live counters.
Change-source: pulse-maintainer
Preserve named unavailable and unusable datastore evidence without reporting healthy empty capacity. Keep measured zero, warning thresholds, independent backup inventory and row identity, with readable phone notices and connected contracts and controls.
Change-source: pulse-maintainer
## Outcome
Saved TrueNAS and VMware connections continue ordinary monitoring when
optional organisation metadata is malformed. Storage-key discovery no
longer lets one tenant's damaged metadata suppress another tenant's
provider or prevent connection disable/removal. Strict
account/authentication metadata readers, encrypted configuration, tenant
isolation and read-failure handling remain intact.
Proxmox Backups now keeps unavailable, malformed and future dates
visibly unknown in Coverage, location filters and By date. An undated
completed point cannot silently make an older point look latest, or
count as observed activity. Updated inventory clears uncertainty without
remounting or extra reads; completion, verification and server
protection remain separate. Compact layouts retain readable uncertainty
labels.
## Why and included source
Related to #2382. Its interval-only response prompted saved-connection
discovery controls. Fixtures reproduce a failure family, not either
reporter's installed cause: the old discovery fragments also existed in
6.4.1. Backup chronology inspection separately found misleading
freshness/absence and shared latest-pointer reconciliation.
Publication range:
`ee63f32afc3b3d576eb5fc85ac9d24f6dd7ef3f3..02f67062c2be5b1b9d04a36a9fa9a24a18c20677`.
- Core candidate `453eccbba153431ddc6f560efd83e089e19c8947`.
- Web range
`1ff46c4261e11b4a8edcd573df415a217ecd34cd..dd6d0c6fcf245a554ff99baddbe5cfa90d9472ed`
(three commits).
- Additive upstream composition and integration commits preserve every
reviewed identity. Existing published PBS History fixture correction is
retained, not repeated.
## Validation and limits
- Core parent reproduction: twelve failing leaf controls, two normal
controls passing. Final `source-d118p80u`: 25 new controls, 116
connected API/tenant leaves, full configuration/TrueNAS/VMware suites,
selected platform pollers, focused races, vet and embedded
frontend/server builds passed.
- Web final `source-jtym7kql`: 670 connected tests, types, targeted
lint, seven audits, production build and unchanged budgets passed. Final
Chromium desktop and WebKit 390px/320px phone fixtures cover 21 groups
and nine inspected screenshot contents. Earlier failed
aggregates/preparation attempts remain adverse evidence.
- Publication inspection confirms all 25 candidate paths equal their
proven bytes; upstream added only a separate History E2E fixture
correction. Final browser receipt hashes, provenance, diff whitespace
checks and aggregate canonical/browser guards pass. Non-overlapping
sufficient proofs were not repeated.
Required exact-head CI and independent publication review still apply.
These are source/fixture results, not native appliance,
backup/restore/thaw, installed user acceptance or release qualification.
No issue closure or release availability is claimed.
[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
Exact-source source-4x1h3apo measures 7,245 gzip bytes versus the 6,009-byte Diagnostics baseline. Accept the intentional 1,236-byte privacy and safety cost in this existing lazy-loaded panel. Update only its measured baseline, preserving every growth limit, other chunk baseline, total budget and startup-loading check.
Change-source: pulse-maintainer
Preserve the three reviewed Web commits and their parent-bound browser receipts. Unknown or future dates remain visible without asserting freshness, absence or a latest backup; server protection and completion stay independent. Retained exact-source connected qualification and browser evidence are adequate for this non-overlapping integration.
Change-source: pulse-maintainer
Guest-agent GETs enqueue serial work: ordinary HTTP pooling, stream recovery and redirects can resend a command despite the application single-attempt guard. Use an isolated single-use HTTP/1 transport with the configured TLS, proxy, dial and timeout policy, and defer redirects without contacting their destination. Keep ordinary API recovery and current CPU/I/O counter presence/receipts unchanged. Pin wire-level lost replies, all read/redirect paths, TLS trust and connected deferred cache/History behaviour.
Change-source: pulse-maintainer
Use sentence boundaries without changing the collection, privacy or sharing instructions. Keep the existing copy-style audit, connected tests and final browser receipt in agreement.
Contract-Neutral: Sentence punctuation only in existing Diagnostics safety copy; collection and export contracts are unchanged.
Change-source: pulse-maintainer
Separate cautionary help into sentences and describe backup entries without implying incomplete artifacts are restorable. Refresh the browser proof for the exact final copy.
Contract-Neutral: Copy-only clarification and matching controls; date selection, completion, protection, API and subsystem contracts are unchanged.
Change-source: pulse-maintainer
Model the current server token usage and attention fields explicitly so the privacy regression fixture participates in the strict frontend type check rather than relying on the smaller presentation-only interface.
Change-source: pulse-maintainer
Scope the new warning assertion to its own status rather than unrelated status regions. Preserve exactly-now and window-start activity edges while explicitly rejecting the obsolete future same-day expectation.
Contract-Neutral: Test-only fixture and selector corrections; runtime, wire, presentation and subsystem contracts are unchanged.
Change-source: pulse-maintainer
Replace the obsolete help-label assertion and verify that the shipped collection guidance distinguishes live checks, private local downloads and manual sharing review.
Change-source: pulse-maintainer
Preserve unknown and future restore-point dates through Coverage, location selection and By date. Keep completion, verification and server protection independent, prevent shared latest-pointer reconciliation from overwriting newer PBS evidence, and make uncertainty readable on narrow phones. Exact-parent controls, connected recovery suites and inspected browser fixtures verify the existing surfaces.
Change-source: pulse-maintainer
Redact actual token usage, snapshot and nested guest/disk identities without losing measurements or real diagnostic joins. Distinguish private downloads from files that need manual review, explain live-check risks before either run action, and keep the existing shipped help in sync.
Change-source: pulse-maintainer
## What changed and why
Monitoring should not interpret unusable telemetry as healthy protection
or reliable alert evidence.
- Treat NaN, infinities, invalid authoritative History samples and
overflowing metric averages as unknown. Preserve the last trusted
incident and notification state, then resume normal evaluation when
finite observations return. Explicit rule disabling still works.
- Keep malformed, future or otherwise unusable backup completion
timestamps distinct from genuine absence. Existing workload rows,
tooltips and guest details show cautionary uncertainty rather than
healthy protection or an invented completion date. Running activity and
valid freshness thresholds remain distinct.
These are repairs to existing alert and backup-safety surfaces, not new
features or native backup/thaw acceptance.
## Included source
Complete range:
`0f58485b52a59a21b944e73ed45637a8914b8a88..a1cde2ffe0bf86ea76bbd678e4bb0eb72860e72f`.
- Alert candidate `1265ff10145c270f38666acfb68c13f2eb2399b6`, integrated
at `f80f4b75ff46acaf7dd324208983f52a3be7171c`.
- Backup timestamp candidate `a0b3c09e07bd700374a587db7908fa780d6d7631`,
integrated at `1ff46c4261e11b4a8edcd573df415a217ecd34cd`.
- Upstream reconciliation `01bf594d67c39ac4a63ab0b5611ee22eda790ea9`
retains published main and every reviewed commit unchanged.
- Additive test-fixture repair
`a1cde2ffe0bf86ea76bbd678e4bb0eb72860e72f` supplies the real History
response envelope to the PBS target E2E test. PR2457 run `37188438472`
failed both chart assertions in three browser projects; its mock omitted
range/start/end required by the reviewed response validator. Product
validation, target checks and both-chart assertions are unchanged.
## Validation
The combined product source passes the complete alerts package and
frontend type checking plus 220 focused backup/workload tests in offline
disposable source proofs. Retained backup-candidate evidence includes
548 connected tests, lint/audits, production build/budgets, 13 parent
regressions and ten legitimate controls, plus twelve Chromium/WebKit
production-component fixture paths. Browser receipt hashes match the
final product files.
The fixture correction is checked separately against the unchanged
production History validator, including rejection of the old envelope
and wrong-target/selection or missing-bound controls. This is a
response-contract check, not a full E2E or chart-render pass. Exact-head
hosted CI must verify the complete E2E journey. A cancelled earlier
benchmark is not a pass. Local browser preparation failures from
unavailable canonical dependencies remain explicit limitations.
Provenance, clean-source, additive ancestry and diff checks pass. No
accepted commit was rewritten; unchanged proofs were not repeated solely
to combine candidates.
## Remaining limits
No containing release, installed alert/notification relief, native
backup/restore or guest thaw is established. Existing backup safety
guidance and independent native acceptance remain necessary.
Related to #2439
[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
Retain the exact Core candidate identity and its parent/final polling, revocation and tenant-isolation proof. Optional organisation metadata no longer controls saved TrueNAS and VMware inventory discovery; strict account and authentication metadata loading is unchanged.
Change-source: pulse-maintainer
PR2457 Core E2E run 37188438472 fails both PBS chart assertions in three browser projects because its mock omits range and start/end fields required by the reviewed response admission contract. Supply the real response envelope and one consistent point interval; retain target identity checks and all chart assertions. No product validator or release gate changes.
Change-source: pulse-maintainer
Saved TrueNAS and VMware connections belong to validated tenant storage keys, not optional organisation metadata. A malformed org.json could prevent provider creation and block authoritative disable or removal in an unrelated tenant. Enumerate storage identities while retaining strict metadata/account readers, tenant isolation and config/credential failure handling.
Synthetic probe, polling and API controls reproduce the interval-only response family in #2382. They do not establish either reporter installation’s cause or native appliance acceptance.
Change-source: pulse-maintainer
## What changed and why
- Guest discovery stays bound to the selected target.
Replacement/loading/denied targets cannot display another guest's
service or suggested URL; same-target transient evidence is labelled,
and retry remains available. Saved operator URLs remain independent.
- History clients reject wrong-resource, wrong-range, wrong-metric and
malformed success bodies before charting or caching them, while
preserving measured zero, observed empty history and explicit Kubernetes
compatibility. In-memory History readers allocate detached, right-sized
snapshots without changing observations, ordering or cutoffs.
- External-probe help distinguishes missing observations from a target
outage, server-dependent notification delivery and the volatile
200-observation buffer. It matches the existing Observation locations
editor and shipped documentation mirrors.
- Webhook help no longer recommends permanently deduplicating on a
reused correlation header. Copyable templates preserve every member,
full-precision occurrence and severity changes, escape JSON correctly,
and explain conditional recovery. Runtime headers, signing and
notification behaviour are unchanged.
- Build-check fixtures accept a stable exact Node version only within
the governed major and isolate fake audit timing from caller budgets. A
formatting-only follow-up repairs PR2457's deterministic Frontend
failure.
These are existing-surface safety and efficiency improvements found by
source review, plus repairs to observed validation defects. They add no
feature. Related to #1723, #1803, #2199 and #2439; no native symptom
resolution is claimed.
## Included source
Published base `0a722be97c973bff9961e0fcd4063f6daa9fc5ac` → final head
`841b5d6644df8d7fc8d02ba427b9e4c988181983`.
Reviewed candidates and integration points:
- Delivery `9213a6d75a6ced2bd9c937101be5c0a422dc1cdd` →
`f312a70ae5e67f3f890b1214816193c4f7fb4a8c`.
- Probe guidance `ad4fbff6be447b9c7e93fa845c70c88dff7cc1dc` /
`b27387d8fc489a683d7fba591afb4bc1fc7bb4a5` →
`7ca8945f0da2036a779e7a9ea7e76643ce60f2e2`.
- Guest discovery `9230aca96dd8e756f1032aa4d300928ab6cfd588` →
`9d5fd627f01cb176e5f28b1923a3407fc0867c3a`.
- History allocation `fcd9b65b828f92219ffd2c6b1ef97cb7d40f298a` →
`3db021ba53ff416f2e3b7f95bea93ee57c62ccb5`.
- History response admission `866da85c26d96821c00917306b04098e1896f1c8`
→ `fe42207eb4bfb04461cc780f3f32d3d7bcbe4d4b`.
- Webhook guidance range
`94a14c78c7f80f5ba8b32af3d06ccb5f1390468b..c7bb48f0b4dc1790ba26d4f6138dba88ee1df3b8`,
including its first commit → `a93ab070f6008e8ca26f72e93ea5bded8362a623`.
- Additive published-main composition
`50b1ebbf1f8eac39f55de5f0bc6a69af6eec848b` /
`b47dc7a410357473f301032f3c07dd2a93795d07`; formatting correction
`841b5d6644df8d7fc8d02ba427b9e4c988181983`.
All original reviewed commit identities and ancestry remain intact. The
previous proposal head completed CI with a reproducible formatting
failure in run `37185009631`, not a retry-worthy environmental failure.
This update includes the newer independently reviewed range rather than
restarting a still-running workflow.
## Validation and limits
- Provenance, clean-source, retained-ancestry and whitespace checks
pass. Shipped guidance mirrors and parent-bound browser content hashes
remain consistent.
- Probe receipt `source-_7_dmsnc`: 64 Docs controls,
lint/types/build/budgets and six inspected desktop/phone-emulated
renders.
- Delivery final composition `source-2wejypna`: three actual Go
build-contract controls and 21 Python audit-fixture controls pass.
Earlier `source-4s7r3n08` remains aggregate exit 1 at unavailable
root-module Playwright, despite successful Go/script stages and a
separate synthetic browser proof.
- Web History receipt `source-pj25wjfz`: 379 connected tests, types,
targeted lint, frontend audits, build/budgets, plus twenty browser
checks and eight inspected screenshots. Final browser-bound
implementation files are byte-identical. The prior backup-date timeout
and `source-hy2sts4n` exit discrepancy remain adverse.
- Core History receipts `source-j3h0oilb`, `source-cha7xlv5`,
`source-rad3e2a3`: parent allocation witnesses, final
semantics/connected readers, focused races/full monitoring/vet and real
embedded builds. The missing-embed aggregate exit 1 remains recorded;
the separate build/comparison exits 0. Same-executable allocation
measurements are not native CPU/RSS relief.
- Webhook receipts `source-no6npmqe`, `source-xtglyv47`,
`source-782t58q4`, `source-w_lyklsq`, `source-ddchs9rd`: parent template
failures, full notification races, 14 safety controls, 71 Docs controls,
lint/types/real frontend and binary builds, and inspected
Chromium/WebKit renders. Earlier normalisation/missing-embed aggregates
remain exit 1. Proven implementation, guide and manifest content is
unchanged in this composition.
- The formatting correction passes targeted Prettier checks across the
changed frontend source/tests; TypeScript parsed syntax trees confirm
unchanged assertions and literals.
- Attempted exact-final frontend aggregate `source-7czju56e` is
**unavailable**, client exit 2: guest readiness timed out, zero command
output, no observed command exit, guest stop complete. It was not
replayed and is not a passing suite. Existing unchanged-content proofs
and the narrow formatting check support proposing this head; exact-head
CI remains mandatory.
Independent exact-head review and required GitHub checks must pass
before landing. Source/rendered evidence does not establish native
appliance identity/thaw, outage delivery, receiver ticket acceptance,
installed upgrade/recovery, native performance relief or release
readiness. Existing adverse benchmark observations remain separately
owned, not cleared by this batch. No release is published by this PR.
[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
Preserve the exact Web candidate and its connected source and production-component browser proof. Unusable completion times stay cautionary in existing rows and drawers; running activity and genuine absence remain distinct.
Change-source: pulse-maintainer
Preserve the exact Core candidate and its retained focused, lifecycle, race, full-alert, monitoring and embedded-build evidence. Non-finite readings remain unknown rather than changing trusted incident state.
Change-source: pulse-maintainer
Repair the deterministic Prettier failure reported by PR2457 run 37185009631 without changing assertions or reviewed source identities.
Contract-Neutral: Test formatting only; runtime and documentation behaviour are unchanged.
Change-source: pulse-maintainer
Preserve malformed timestamp evidence through resource projection and label future, invalid or unusable dates as unknown in existing row indicators, tooltips and drawer protection. Keep explicit absence, configured age thresholds and running activity distinct. Validate real API and canonical snapshot replacements with parent controls and production-component browser fixtures; no native backup or thaw claim.
Change-source: pulse-maintainer