Commit Graph

10427 Commits

Author SHA1 Message Date
pulse-triage[bot] ddea7cd0bf Guard expanded backup evidence across workload polling
Issue #1869 reports views resetting during refresh. Exercise the mounted backup coverage view through three replacement workload snapshots so losing expanded restore evidence is caught before release. Confirm each refreshed workload name renders to exclude stale-state false positives.

Contract-Neutral: regression coverage only; no runtime or API changes.

Change-source: pulse-maintainer
2026-09-05 01:06:14 +01:00
pulse-triage[bot] e2e2990550 Guard authentication strategy selection across polling
Exercise the mounted credential slot through repeated snapshots and a different edit target. A mutation that stops marking strategy selections dirty fails the new regression test.

Contract-Neutral: regression coverage only; no runtime or API changes

Change-source: pulse-maintainer
2026-09-04 23:58:11 +01:00
pulse-triage[bot] bebe9b5df5 Merge core runtime Unraid pool-only alert fix
Change-source: pulse-maintainer
2026-09-04 23:50:24 +01:00
pulse-triage[bot] 3334cccfd9 fix(unraid): suppress parity warning for explicit pool-only arrays
Issue #1895 reports parity alerts when mdNumDisks=0 on a pool-only Unraid system. Array service state alone does not establish that a parity array exists.

Preserve the optional disk count from collection through canonical runtime conversion and suppress only the no-parity warning for an explicit zero. Missing or malformed counts retain legacy behaviour, and disk failure reasons remain active.

Validated focused Unraid tests in hostagent, storagehealth, monitoring, unifiedresources and alerts, including JSON zero preservation and canonical round trip. The new pool-only regression fails against the previous warning condition. Both agent and server need this change; no release or reporter retest is claimed.

Change-source: pulse-maintainer
2026-09-04 23:41:22 +01:00
pulse-triage[bot] d0df71fc4a Guard unsaved connection edits against polling regressions
Exercise the NodeCredentialSlot dirty-edit path across repeated server snapshots and verify Save retains operator values and the current edit target. Removing the dirty guard reproduces the failure.

Contract-Neutral: regression coverage only; no runtime or API changes

Change-source: pulse-maintainer
2026-09-04 23:18:48 +01:00
pulse-triage[bot] 3461c6cbd8 Deduplicate concurrent host mount usage probes
Host and Docker collectors can enter the same mount probe before either timeout expires. Register the in-flight call atomically and share its result and deadline so a blocked syscall cannot accumulate duplicate workers. Preserve the guard until the syscall returns even when a waiter is cancelled.

Change-source: pulse-maintainer
2026-09-04 22:58:19 +01:00
pulse-triage[bot] e7077fb06a Merge delivery trust installer ownership fix
Change-source: pulse-maintainer
2026-09-04 22:35:35 +01:00
pulse-triage[bot] 19c2b6a925 Fix portable root ownership for installer lifecycle state
Issue #1890 reports macOS agent updates stopping because the root group does not exist. Use numeric superuser ownership in the two shared lifecycle writes without relaxing failure handling or the least-privilege group boundary. Add a regression fixture that rejects named root ownership and checks that chown failures still prevent replacement.

Change-source: pulse-maintainer
2026-09-04 22:33:08 +01:00
pulse-triage[bot] 0f972f42f2 Isolate host and Docker CPU sampling baselines (#1894)
Near-synchronous host and Docker reports consumed a shared CPU baseline, measuring collection bursts rather than each module's reporting interval. Retain a collector per host collector and a separate Docker module collector while preserving the package-level convenience API and disk filters.

Add an interleaved-counter regression covering both collection entry points. It fails when routed through the shared baseline and passes with isolated state. All hostmetrics, hostagent and dockeragent tests pass, as do the focused CPU regression tests under the race detector.

Change-source: pulse-maintainer
2026-09-04 22:29:32 +01:00
pulse-triage[bot] 106e115e44 Restore paired benchmark workflow after merges
Reapply the reviewed same-runner base/candidate benchmark job after later integration merges retained its runner and contract tests but reverted the workflow block itself.

Contract-Neutral: restores already-reviewed CI behavior without changing product interfaces
Refs: 9720f672c8e050a822773104885431583e4f661e
Change-source: pulse-maintainer
2026-09-04 21:40:51 +01:00
pulse-triage[bot] 26309d71a0 Restore release contract assertions after merges
Reapply the reviewed Go 1.26.8, OCI Helm recovery, and non-login-shell test expectations that later upstream merges accidentally replaced while retaining the corresponding implementations.

Contract-Neutral: test-only reconciliation; no product or runtime behavior changed

Change-source: pulse-maintainer
2026-09-04 20:39:02 +01:00
pulse-triage[bot] 2f37fad095 Merge commit '8fe9f3a80865a3c2716c0d02477453cd6c5bcaaf'
Change-source: pulse-maintainer
2026-09-04 17:57:17 +01:00
pulse-triage[bot] 8fe9f3a808 Keep mounted infrastructure state current
Credential slots froze the configured-node snapshot when the editor mounted, so a later server refresh could leave an untouched form stale even after the poll-clobber remount was removed. Keep node and security inputs reactive while the existing dirty guard protects operator edits, and cover both component refresh and browser polling paths.

Contract-Neutral: frontend polling-state bugfix; no API or persisted-data change

Change-source: pulse-maintainer
2026-09-04 15:45:38 +01:00
pulse-triage[bot] 09da37881f Check release inventory independently of Git refs
A published release packet is a customer-visible surface in its own right. Deriving newer published versions only from matching Git refs lets that surface escape continuity validation when the corresponding ref is absent. Evaluate every stable-shaped release record independently and pin the detached-ref case with a regression test.

Change-source: pulse-maintainer
2026-09-04 15:01:51 +01:00
pulse-triage[bot] 485e19600f Align npm audit contracts after upstream merge
Update the retained canonical Python contract for the upstream wall-clock timeout mechanism and the single complete per-PR audit, while preserving the two-view scheduled audit expectations.\n\nChange-source: pulse-maintainer

Change-source: pulse-maintainer
2026-09-04 14:31:31 +01:00
pulse-triage[bot] d170a23d22 Merge commit 'd7356ef76e26cd461278de18cd471d7cb2682043'
Change-source: pulse-maintainer
2026-09-04 14:29:39 +01:00
pulse-triage[bot] e46e897702 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	.github/workflows/build-and-test.yml
#	docs/release-control/v6/internal/subsystems/deployment-installability.md
#	scripts/installtests/build_release_assets_test.go
#	scripts/npm-audit-retry.sh

Change-source: pulse-maintainer
2026-09-04 14:29:31 +01:00
rcourtman b3bbf23f08 Merge pull request #1879 from rcourtman/claude/notification-retry-class-gate
Stop retrying notification failures that cannot succeed
2026-09-04 14:14:01 +01:00
rcourtman eb386feca0 Merge pull request #1886 from rcourtman/claude/patrol-http-observer-lease-flake
Order the Patrol HTTP observer test against its health-lease write
2026-09-04 14:13:39 +01:00
pulse-triage[bot] d7356ef76e Detect orphaned stable delivery versions
A failed v6.4.2 release left newer stable-shaped source and public container tags behind after its GitHub Release packet was removed. Extend the scheduled continuity audit across the stable tag and public registry frontier so this partial publication cannot remain hidden behind an older latest release.

Change-source: pulse-maintainer
2026-09-04 13:58:07 +01:00
rcourtman b064adcb7b Merge pull request #1889 from rcourtman/claude/npm-audit-budget
Bound the npm audit retry budget by wall clock
2026-09-04 13:50:00 +01:00
pulse-triage[bot] c375a44e3b Merge branch 'main' into claude/patrol-http-observer-lease-flake 2026-09-04 13:37:20 +01:00
pulse-triage[bot] 6a083ca693 Merge branch 'main' into claude/notification-retry-class-gate 2026-09-04 13:37:18 +01:00
pulse-triage[bot] eb0a02fb07 Merge update feed asset verification candidate for coordination
Change-source: pulse-maintainer
2026-09-04 13:24:09 +01:00
pulse-triage[bot] 79e0f9a673 Merge current Pulse upstream for publication
Change-source: pulse-maintainer
2026-09-04 13:19:05 +01:00
pulse-triage[bot] b60dfd5041 Merge remote-tracking branch 'origin/main' into maintainer-async/20260904T112618Z-core-runtime/pulse
Change-source: pulse-maintainer
2026-09-04 13:18:54 +01:00
pulse-triage[bot] 3193db66b0 Verify feed fallback release assets
GitHub's Atom feed can retain entries for deleted releases. Probe the deterministic runtime archive without following redirects before exposing a feed candidate, and continue to the next published version when the candidate is stale. Keep custom update servers from falling through to the public feed on a 403.

Contract-Neutral: Update discovery validation only; no wire, persisted-data, or subsystem contract change
Refs: #1881
Change-source: pulse-maintainer
2026-09-04 13:18:54 +01:00
pulse-triage[bot] 4b7faa5a97 Align the scheduled audit contract test
The security workflow moved to the scoped npm audit retry runner, but its
dependency-policy test still asserted the retired direct invocation. Assert the
checked-in all and production modes so the script suite tests the active
scheduled scan.

Contract-Neutral: test expectation only; scheduled audit behaviour is unchanged

Change-source: pulse-maintainer
2026-09-04 13:13:04 +01:00
pulse-triage[bot] 9720f6726b Pair benchmark evidence on one runner
The benchmark gate compared five-sample PR results with a cache produced on
another hosted VM. Two unrelated changes failed today while the same main code
passed, and benchstat reports infinite 95% confidence intervals for that sample
size.

Collect ten base and candidate samples on the PR runner in alternating order,
retain both inputs and the comparison, and reject under-sampled verdicts. Keep
non-PR benchmark evidence without the cross-run baseline cache.

Contract-Neutral: CI performance evidence collection only; no product or release contract changes
Change-source: pulse-maintainer
2026-09-04 13:13:04 +01:00
rcourtman 06477a59f5 Merge remote-tracking branch 'origin/main' into claude/npm-audit-budget
# Conflicts:
#	docs/release-control/v6/internal/status.json
2026-09-04 13:10:27 +01:00
rcourtman 62c3315d17 Merge pull request #1884 from rcourtman/claude/telemetry-dev-channel-classifier
Classify every 0.0.0 sentinel build as a development build
2026-09-04 12:38:38 +01:00
rcourtman 5434868bd0 Bound the npm audit retry budget by wall clock
The retry hardening added in #1885 bounded attempts but not time. npm's own
fetch-timeout defaults to five minutes and it retries internally, so three
"attempts" against a hanging advisory endpoint ran for 10m56s on job
100986651307, and a second audit step added 3m36s. The Frontend job was
cancelled 31s into type-check with all 1183 test files already passing, and a
cancelled job reports as a failed required check, so a green run blocked every
pull request. #1888 raised the job timeout to 40 minutes to unblock delivery;
this decides the policy instead.

Each attempt now runs under a hard wall-clock bound and the sequence stops at
a total deadline (60s and 240s by default). npm's internal retry loop is
disabled in favour of this one, since it was the hidden multiplier. The bound
is enforced by a watchdog subshell rather than timeout(1), which is not
present on every developer machine.

What happens when the endpoint stays unreachable is unchanged, because that
split was already right: the run fails when the change touches the dependency
graph and the answer is genuinely unknown, and warns without failing when it
does not, because the graph is then identical to a base commit that already
produced a passing answer. Any advisory at any severity still fails.

Also drops the production-only audit from the per-pull-request path. It audits
a subset of the same packages, so it reports a subset of the same advisories,
and because the complete audit fails the job on any finding, the production
step could only ever execute in the cases where it was already guaranteed
clean. The dev-versus-production split still runs for every npm workspace in
the scheduled security-scan job, where it informs rather than blocks delivery,
and Dependabot security updates remain the route for advisories published
against unchanged dependencies.

With the audit bounded to 4 minutes against an ~11 minute baseline, the job
timeout returns to 30: a stalled endpoint should surface as a warning, not be
absorbed by a budget large enough to hide it.
2026-09-04 12:13:31 +01:00
rcourtman 6a2efd8170 Sort status.json coverage gaps by recorded_at then id
The status audit requires coverage_gaps to be sorted by recorded_at then id,
and main currently fails it: patrol-investigation-rate-metric-invalid (#1883)
was appended after telemetry-test-binary-production-pings (#1878), which share
a recorded_at of 2026-09-03 and are the wrong way round on id.

The pre-commit hook runs that audit, so every commit from a local checkout is
blocked until this is corrected, whatever it touches.

This swaps the two adjacent entries and nothing else; no gap content changes.
2026-09-04 12:12:04 +01:00
pulse-triage[bot] 383f1d7293 Merge current Pulse upstream for publication
Change-source: pulse-maintainer
2026-09-04 12:03:53 +01:00
Richard Courtman 5c88ae3c44 Merge remote-tracking branch 'origin/main' into claude/telemetry-dev-channel-classifier 2026-09-04 12:02:05 +01:00
rcourtman 6e2335216d Merge pull request #1888 from rcourtman/claude/frontend-job-timeout-for-audit-retries
Give the Frontend job room for the npm audit retries
2026-09-04 12:01:05 +01:00
pulse-triage[bot] 0d9f25eed9 Merge OIDC mixed-key interoperability candidate for coordination
Change-source: pulse-maintainer
2026-09-04 11:58:37 +01:00
pulse-triage[bot] d9f75a8eff Keep mixed OIDC key sets usable
Some identity providers publish unsupported Ed448 or X448 keys alongside supported signing keys. go-oidc v3.20 rejects the whole set, blocking otherwise valid logins; v3.21 skips only those unsupported keys while retaining normal token verification, and the Pulse service regression test pins that behaviour.

Contract-Neutral: dependency-only OIDC interoperability fix; no product or runtime contract changed
Change-source: pulse-maintainer
2026-09-04 11:40:20 +01:00
Richard Courtman be179befb7 Give the Frontend job room for the npm audit retries
The npm audit hardening added on 2026-09-04 retries through registry
outages instead of failing on the first 503. That is the right behaviour,
but the two audit steps then took 10m56s and 3m36s, and with roughly 11
minutes of install, lint, 1183 test files and type-check behind them the
job no longer fits timeout-minutes 25. It was cancelled 31 seconds into
type-check with every test already passing, which reads as a failed
required check and blocks every pull request.

Raising the budget to 40 leaves headroom for a slow audit without
weakening any gate. Bounding the retry itself is the better long-term
answer, but that trades delivery availability against audit coverage
during an outage and is a security-posture decision rather than a CI
tuning one.

Contract-Neutral: CI job time budget only; no dependency-security or contract behaviour changes
2026-09-04 11:32:49 +01:00
pulse-triage[bot] 06a6d1f7a9 Merge web poll-clobber regression coverage for coordination
Change-source: pulse-maintainer
2026-09-04 11:26:55 +01:00
pulse-triage[bot] abc33fc6f0 Cover infrastructure setup edits across polls
Extend the existing poll-clobber regression with the exact setup strategy, SSL verification and cleared fingerprint controls reported in #1869. This pins the user-owned form state while refreshed server snapshots arrive.

Contract-Neutral: regression coverage only; no runtime or API change.

Change-source: pulse-maintainer
2026-09-04 11:22:47 +01:00
pulse-triage[bot] 6d8546b756 Keep Actions workflows on Node 24
Replace the remaining Node 20 action pins before GitHub removes that runtime, and make the reviewed Node 24 pins a workflow trust invariant.

Change-source: pulse-maintainer
2026-09-04 11:08:34 +01:00
pulse-triage[bot] ca24404566 Merge update metadata fallback candidate for coordination
Change-source: pulse-maintainer
2026-09-04 10:33:38 +01:00
pulse-triage[bot] b7e6a1e4e7 Merge privileged runner trust candidate for coordination
Change-source: pulse-maintainer
2026-09-04 09:39:27 +01:00
pulse-triage[bot] a186bd205e Fall back when release metadata exceeds bounds
GitHub's release list now exceeds the update check's 1 MiB safety limit,
causing valid installations to report that updates are unavailable. Keep the
bound and use the existing bounded Atom feed only for the typed over-limit
condition so malformed metadata remains a hard error.

Accept both release-name and bare-tag feed entries, and do not substitute the
public GitHub feed for a configured custom update server.

Contract-Neutral: Update discovery error handling only; no wire, persisted-data, or subsystem contract change
Refs: #1881
Change-source: pulse-maintainer
2026-09-04 09:34:59 +01:00
pulse-triage[bot] 0b72eca737 Keep privileged jobs on ephemeral hosted runners
Retire the unused self-hosted live qualification workflow and reject future secret- or write-capable jobs on persistent or dynamically selected runners. Keep live Patrol qualification as a disposable lab operation.

Change-source: pulse-maintainer
2026-09-04 09:30:11 +01:00
Richard Courtman 197d289415 Correct the development-flag note on the telemetry pollution gap
The gap recorded that the receiver could not filter these installs on
version_is_development, which was true when it was written and is no
longer. The emitter now classifies every 0.0.0 sentinel build as
development, so pings sent after 2026-09-04 carry the flag.

Stored rows keep the values they were sent with and are not backfilled,
so the note now states the boundary rather than the old blanket warning,
and still points reads whose window reaches earlier at
version_is_published_release. Merging main also interleaved this gap with
a peer's, so the list is re-sorted by recorded_at then id.
2026-09-04 09:22:57 +01:00
Richard Courtman 7feba70e45 Merge remote-tracking branch 'origin/main' into claude/telemetry-dev-channel-classifier 2026-09-04 09:22:22 +01:00
pulse-triage[bot] af0fb57ae8 Merge commit 'a91b6da37d6308f3c6f8fddda83978b8fa183e0b'
Change-source: pulse-maintainer
2026-09-04 09:20:37 +01:00
rcourtman 24dbf3a362 Order the Patrol HTTP observer test against its health-lease write
The HTTP JSON observer samples on its own goroutine, and that goroutine
queues the wake before it persists the health lease. The test gated on
the wake (pending trigger count) and then read coverage immediately, so
a runner that descheduled the goroutine in that window saw a half-applied
sample: an installed observer with a nil ValidUntil, which coverage
reports as degraded/observer_health_unknown. That is what blocked the
required backend check on an unrelated PR, not a regression.

Gate on the lease instead. It is the sample's last state-visible action
and it goes through the store mutex, so observing it orders every earlier
side effect of the sample -- the queued trigger included -- against the
assertions that follow. Coverage is also evaluated at a fixed instant
derived from the sample time rather than time.Now(), so the verdict no
longer depends on how long the goroutine took to get there.

Verified by inserting a 150ms delay between the wake and the lease write
via a build overlay: the old test fails 5/5 with exactly the CI symptom,
the new one passes 20/20, and 50/50 under GOMAXPROCS=1 with -race. The
unmodified test is 300/300 under -race.
2026-09-04 09:11:02 +01:00