Skip to content

Protect v6.4 alert credentials and prevent stale discovery rollback - #1964

Merged
rcourtman merged 11 commits into
release/v6.4from
maintainer/20260907T181011Z-release-v6.4
Sep 7, 2026
Merged

Protect v6.4 alert credentials and prevent stale discovery rollback#1964
rcourtman merged 11 commits into
release/v6.4from
maintainer/20260907T181011Z-release-v6.4

Conversation

@pulse-triage

@pulse-triage pulse-triage Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

What changed

The v6.4 line masks Discord and Telegram credentials, encoded query names, resolved ntfy transport details, and other supported webhook secrets in delivery diagnostics while retaining useful destinations and error context. It also publishes reviewed release snapshots independently of moving branch tips and now prevents availability-suggestion backfill from overwriting a concurrent manual discovery repair.

The discovery backport is an additive correction for the required source-check failure on this proposal. It updates only the current stored record under the store lock, preserving newer service identity, URL, engine version, notes, dismissals, and deletion.

Why

Synthetic release-line evidence reproduced credential disclosure paths in failed alert delivery, making these narrow security backports necessary for dependable alerting. Snapshot dispatch needed exact source identity after branch advancement. The previous PR head cda22c5738afead4aa79ae0c0e1d0ec0d00f09b9 then failed required Backend tests (rest-1) because asynchronous backfill restored a stale unknown discovery after manual ESPHome repair. Full logs showed the repaired save followed by the stale save; deterministic local overlap evidence reproduced it. The stale backfill was introduced after the manual-repair behavior and is present in v6.4.1, so this is a named regression rather than new product scope.

Included candidates and range

Range: fade3116735e3173d0019d294260de5a73882c17..d2f7bd0f2522f3466e4003ab12a75612dd279937.

Candidates: 20260907T170524Z-release-line (f3366a34ab9861768cdafa122f3c4b2ef62489ad), 20260907T173010Z-release-line (71c721ccee8bea8a64a130fdbc0ea78292ff748b), 20260907T181017Z-release-line (e7a5b2c9072dd8bc498c44aa38dc7d294db1edbc), and 20260907T201516Z-release-line (bad8c4fc6bdc10e3399cc14534fc2981547a8a51..49a005005409389294a0c93721a9d7379cbd5421), plus publication correction d2f7bd0f2522f3466e4003ab12a75612dd279937. Reconciliation commits preserve all reviewed tips and ancestry.

Validation

  • Shared provenance, git diff --check, and the canonical completion guard passed across the exact release range.
  • At old proposal head cda22c5738, frontend, backend API and REST-0, build/smoke, all eight E2E shards and verdict, audit, public docs, secret scan, agent lifecycle, and advisory Benchmarks passed. Required REST-1 failed TestService_RunManualDiscoveryRefreshRepairsFreshUnknownKnownService; that failure is preserved and was not dismissed as flaky.
  • Before correction, a deterministic SetReadState/backfill/manual-refresh interleaving restored stale identity in cache and encrypted restart. On exact release head d2f7bd0f25, go test -race ./internal/servicediscovery -count=20 passed in 9.283s. Its four implementation/test blobs exactly match reviewed main repair 653a28192a.
  • Retained focused notification confidentiality/API checks passed, including 10 race-enabled repetitions for the encoded-query and resolved-ntfy matrix. Five release-snapshot tests and 48 promotion-policy tests passed for the snapshot protocol.

Protected checks must evaluate exact head d2f7bd0f2522f3466e4003ab12a75612dd279937. Historical release-candidate latency failures remain adverse and are not cleared here. This is source integration only, not release approval, exact-candidate qualification, or installed recipient proof.

How Pulse handles triage

How Pulse handles triage

Backport-of: 3c77ecb (code and tests only)

Change-source: pulse-maintainer
Change-source: pulse-maintainer
Backport reviewed Core 192a72e05c06b2a2ff3a04bb2ef53ded78950e47 with candidate-specific before/after evidence. Change-source: pulse-maintainer

Change-source: pulse-maintainer
Literal-only query matching and the separate resolved ntfy transport caller leaked recognised URL credentials. Decode each query name once and project ntfy transport errors before logging or returning them, without changing destinations or error causes. Add synthetic sink-matrix and HTTP projection regressions plus the bounded notification contract in this commit.

Change-source: pulse-maintainer
(cherry picked from commit 21ed7a8)
…rporate the protected landing of the preceding release-line batch while preserving the exact reviewed Discord and Telegram backport tips and their ancestry.\n\nChange-source: pulse-maintainer

Change-source: pulse-maintainer
Incorporate the protected landing of the preceding release-line batch while preserving the exact reviewed Discord and Telegram backport tips and their ancestry.

Change-source: pulse-maintainer
Retain the exact gate-captured reconciliation commit in history while keeping its reviewed tree unchanged.

Change-source: pulse-maintainer
Change-source: pulse-maintainer
@pulse-triage pulse-triage Bot changed the title Protect Discord and Telegram credentials on release/v6.4 Protect notification credentials across v6.4 delivery failures Sep 7, 2026
Continuous development must not change the source of an admitted release.
Allow the workflow to run at the qualified preparation PR head after its
normal merge, verifying exact source and workflow identity, canonical PR
provenance, and ancestry in the governed release line. Later branch commits
remain outside that release. Document the immutable-candidate contract and
verify source workflow compatibility before qualification.

Validation: snapshot identity and workflow contract tests passed, including
wrong-head, wrong-base, fork, unmerged and unbound dispatch rejection. The
existing release workflow promotion policy test also passed.

(cherry picked from commit b64709e)
Change-source: pulse-maintainer
The branch is validated by the snapshot guard, but its transfer between
workflow steps must also use the canonical GitHub command-file encoder.
Keep the source binding unchanged and satisfy the workflow trust audit.

Validation: all 41 workflow trust tests and five snapshot tests pass.
Contract-Neutral: Encode the already-validated release branch with the shared GitHub command-file helper without changing source identity or release authority
(cherry picked from commit ab562c8)
Change-source: pulse-maintainer
@rcourtman
rcourtman enabled auto-merge September 7, 2026 20:29
Backfill could save a stale List snapshot after manual discovery repaired a service, restoring unknown identity and dropping its URL and engine version. Derive and persist missing suggestions from the current record under the store lock instead, without holding it across monitor reads.

Add a deterministic SetReadState/manual-refresh interleaving and encrypted restart assertions, plus coverage for current identity, dismissed proposals, deletion and persistence failure. The discovery package passes twenty race-enabled repetitions.

Change-source: pulse-maintainer
@pulse-triage pulse-triage Bot changed the title Protect notification credentials across v6.4 delivery failures Protect v6.4 alert credentials and prevent stale discovery rollback Sep 7, 2026
@rcourtman
rcourtman merged commit b060b70 into release/v6.4 Sep 7, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant