pulserelay.pro sends curious visitors to the public demo, and the demo
was a dead end: once inside, the only way back to installing Pulse was
the browser's history. The demo-mode banner now ends with "Run Pulse on
your own hardware", opening the site's setup steps in a new tab. It is
install guidance rather than an upsell, so it belongs in demo mode where
commercial surfaces are otherwise hidden.
The read-only notice keeps its own element so the existing text lookup
and dismiss behaviour are unchanged. Verified on a DEMO_MODE=true mock
backend behind Vite at 1280x800 and 390x844: the link renders after the
notice, wraps cleanly on a phone, and carries target _blank with rel
noopener noreferrer.
Contract-Neutral: demo banner copy and link only; no public API, config, or contract surface changes
Concurrent timer and queue callbacks could apply an older health snapshot after a newer one, hiding a new delivery failure or resurrecting a dismissed warning. Serialize the complete read/apply operation without holding the monitor or queue mutex across alert updates.
Add isolated channel-controlled stale-clear and stale-raise regression cases. Removing the lock fails both final-state assertions; restored code passes 100 race-enabled focused repetitions. This does not qualify the integrated release candidate or clear unrelated adverse evidence.
Change-source: pulse-maintainer
Contract-Neutral: Restores monitoring contract extension point 21 immediate canonical delivery-warning reconciliation by serializing existing read/apply operations; no public API, verdict, throttle, alert identity, or agent-lifecycle contract changes. Existing isolated ordering regression tests cover both stale-clear and stale-raise outcomes.
GetMonitor starts polling concurrently, so monitor.mu does not protect the fixture host slice from State.GetSnapshot. Use the state-owned UpsertHost setter to match the reader lock while retaining all canonical-token diagnostics assertions. Addresses the fixture race reported in PR1943 rest-1; no production behaviour changes.
Change-source: pulse-maintainer
Integrate the exact web-product candidate on top of the current canonical alert ordering repair without re-parenting its reviewed commit.
Change-source: pulse-maintainer
Protect the existing stale-response repair when a newer periodic read fails and when the overview is disposed. Both added tests fail with the response guards removed; 49 focused tests and TypeScript pass with runtime unchanged. This is regression coverage, not recipient-delivery or combined-candidate qualification.
Change-source: pulse-maintainer
"Try the live demo" on pulserelay.pro landed on a login form with the
demo credentials printed above it. The demo runtime is read-only and its
credentials are public, so making a first-time visitor type them was pure
friction at the moment of curiosity.
When the security status reports demo mode, the login page now submits
demo/demo itself, once per browser tab, showing "Signing you in to the
demo…" in the demo banner while the request is in flight. The marker
lives in sessionStorage under SESSION_STORAGE_KEYS.DEMO_AUTO_LOGIN. The
logout handler sets the same marker to "suppressed" right after it clears
session storage, so a visitor who signs out lands on the form (and stays
there across a reload) rather than being signed straight back in; a new
tab signs in again. SSO callbacks (?oidc / ?saml), first-run setup and a
non-demo runtime never trigger it, and a rejected sign-in falls back to
the normal form with the server's error.
The credential request moves out of the submit handler into
submitCredentials so the form and the automatic path share one code path
and one set of error messages.
Verified on a demo-mode backend (DEMO_MODE=true, mock data, demo/demo)
behind Vite at 1280x800 and 390x844: automatic sign-in from a fresh
context, Logout to the form with the marker suppressed, reload keeps the
form, manual sign-in from the form, second fresh context signs in again,
and a stubbed 401 shows the form with the error. Login and
useAppRuntimeState test files pass (41 tests).
Contract-Neutral: demo-mode login convenience on the existing /api/login flow; no public API, config, or contract surface changes
Overlapping bulk diagnosis refreshes could resolve out of order and replace a current notifications-disabled warning with older dispatch evidence. Version each request, including empty alert sets, so only the newest response updates card diagnoses.
Pin overlap and empty-set invalidation with component and registered hook regressions. All 47 focused tests and TypeScript pass. Isolated Chromium verifies rendered ordering at three widths; update both subsystem contracts and bind browser proof to the runtime bytes. No backend delivery or recipient receipt is claimed.
Change-source: pulse-maintainer
The held regression candidate needs an honest forward beta above published 6.4.3-rc.1. Bind only 6.4.4 to release/v6.4 without capturing patch 40 or weakening candidate checks. Exercise the actual release and rehearsal branch-policy shell and retain historical rollback mapping.
Change-source: pulse-maintainer
Release qualification crashed in historical baseline SQLite ingestion during the workloads-summary seed. Preserve a metrics-only diagnostic for the same 84,000-row batch shape, with row-count and integrity checks before and after reopen, without the HTTP or reflection fixtures. This does not reproduce or fix the unexplained crash.
Validation: ten focused runs on Go 1.26.7 and one on Go 1.26.8 passed; a one-repeat race run passed. The three-repeat race run timed out at 180 seconds during its final integrity check and remains retained evidence. Omitting the final seed batch makes the row-count assertion fail.
Change-source: pulse-maintainer
LastNotified is recorded before delivery callbacks, so the active card cannot use it as evidence of destination success. Name dispatch and cooldown eligibility explicitly while preserving policy and timestamp fallbacks.
Pin the evidence boundary in presentation and Overview regressions, subsystem contracts and an isolated real-browser qualification. Scripted diagnoses verify labels and wrapping, not installed delivery or recipient receipt.
Change-source: pulse-maintainer
Hold the replay serialization lock while attaching the resource store to prove history catch-up stays off the router construction path. Retain the imported-history and idempotence assertions after releasing replay so availability cannot be achieved by dropping repair.
Change-source: pulse-maintainer
Callback and queue restart tests cover separate boundaries. Exercise the monitor handlers and ordinary dispatcher together so missing capacity cannot silently produce a recovery, restart cannot replace incident identity, and recurrence still reaches a local HTTP receiver.
Change-source: pulse-maintainer
The advanced proposal's complete backend shard exposed a shared PBS fixture that returned an array from the datastore-status endpoint. Supply the healthy datastore observation those node-metric lifecycle tests intend, preventing the live datastore evaluator from fabricating an unrelated connectivity incident.
Change-source: pulse-maintainer
Cover disabled alerting, storage suppression and canonical datastore overrides before the polled capacity lifecycle. Removing the conversion alias makes the disabled-override regression case fail.
Change-source: pulse-maintainer
A pre-action health read can finish after retry or dismissal succeeds but its follow-up read fails. Exercise this combined race for both actions so old healthy evidence cannot erase delivery uncertainty.
Change-source: pulse-maintainer
Preserve the exact reviewed candidate and bind future CI samples to executed binary hashes.\n\nChange-source: pulse-maintainer
Change-source: pulse-maintainer
Preserve the exact reviewed candidate while combining it with existing mainline PBS coverage.\n\nChange-source: pulse-maintainer
Change-source: pulse-maintainer
Record executable SHA-256 before measured Go test invocations without logging paths or arguments. Preserve sample ordering and failure status; document instrumentation limits rather than dismissing historical regressions.
Change-source: pulse-maintainer
A successful retry or dismissal does not establish that the queue is healthy when the follow-up read fails. Cover both actions so connection loss cannot silently clear the attention state, and verify the independent evidence refresh still runs and busy flags settle.
Change-source: pulse-maintainer
The combined Frontend formatting gate also found the newest reactive warning
and busy-control tests outside the repository's Prettier form. Apply only the
formatter output so those accepted assertions can run under the normal gate.
Change-source: pulse-maintainer
The existing proposal's Frontend job rejected the retained queue-action test
because its nested parameterized callback did not match the repository's
Prettier output. Apply formatting only so the reviewed behavioural assertions
can pass the unchanged frontend gate.
Change-source: pulse-maintainer
Keep unavailable status from presenting stale failure advice and prevent conflicting retry/dismiss controls while queue actions are pending. Existing hook tests cover request ordering, but rendered transition and busy-state behaviour lacked direct regression assertions. Focused tests pass; removing status precedence or mutual disabling makes the new cases fail.
Change-source: pulse-maintainer
Release-line could reproduce tool identity and shared evidence regressions but could not replay browser evidence tied to private capture paths. Supply a synthetic standalone real reducer/transcript journey with blocked backend and external requests, desktop and narrow assertions, and content-hashed receipts. This verifies renderer behaviour without claiming provider, production or release admission qualification.
Change-source: pulse-maintainer
Exercise mirror and SQLite restoration through missing connectivity, independent healthy capacity, confirmed recovery and a second restart. Negative control fails in both modes with the old missing-status recovery behaviour.
Change-source: pulse-maintainer
The storage persistence regression stopped after recovery, leaving a later occurrence untested. Extend both recovery-mirror and SQLite paths through renewed pressure, restart, missing capacity and measured recovery to protect occurrence identity without claiming notification receipt.
Change-source: pulse-maintainer
Cancelled or rejected retained-delivery actions must keep readable degraded health and must not trigger success-path refresh callbacks. Cover both retry and dismissal, including busy-state reset; a negative control refreshing after rejection fails both new rejection cases.
Change-source: pulse-maintainer