Commit Graph

5108 Commits

Author SHA1 Message Date
pulse-triage[bot] 958eae0744 fix(workloads): widen filesystem panel in guest drawer
The shared DetailSectionTable span algorithm gives the earlier of the last two compact sections the wider column. GuestDrawerOverview declared Tags before Filesystems, so a guest with tags and disks but no network section rendered Tags two tiles wide and the mount-point list one tile wide, which the reporter found hard to read (#2121). Declaring Filesystems first gives the longer list the readable panel and keeps the short tag list narrow.

Recomposes the reviewed #2121 fix and its Playwright browser receipt into a single commit on the current maintenance base (22fd851e72), because the per-commit browser guard requires the receipt in the same commit as the user-visible frontend source. The GuestDrawerOverview.tsx blob is byte-identical to the previously browser-verified content (sha256 bcfebc20), so the receipt is content-addressed to the same source; the added contract assertion and performance-and-scalability ordering note are unchanged.

Refs: https://github.com/rcourtman/Pulse/issues/2121
Change-source: pulse-maintainer
2026-09-19 22:21:58 +01:00
pulse-triage[bot] 22fd851e72 Merge reviewed candidate 20260919T204043Z-web-product (pulse 698d08d2e9)
Change-source: pulse-maintainer
2026-09-19 22:09:10 +01:00
pulse-triage[bot] 698d08d2e9 build(frontend): align @types/node 26 with the ES2022 lib declaration
Dependabot #2099 bumps @types/node 20.19.43 to 26.5.1 in frontend-modern, but the PR is blocked twice: Frontend tsc fails with TS2550 on .at() (26 removed the compatibility polyfill), and Canonical Governance blocks the package.json/lock change for a missing deployment-installability contract update and frontend dependency security proof.

Carry the bump with its required governance artifacts in one commit. tsconfig already declares the ES2022 lib (95db35b6c3), which the source's .at() usage needs; this adds the manifest and lock bump (matching tests/integration, which already pins @types/node ^26.5.1), a Completion Obligations entry, and a dependencySecurity proof that keeps the manifest range, the locked @types/node/undici-types versions and the declared lib in step. Verified offline: the guard passes and the proof test passes.

Change-source: pulse-maintainer
2026-09-19 21:49:17 +01:00
pulse-triage[bot] 0f9f33777c fix(release): document rehearsal backend timeout in deployment contract
Record the deployment-installability contract section for the rehearsal backend package timeout and its proof surface. This is the contract follow-up for the runtime change in d0f138cf26. Change-source: pulse-maintainer

Change-source: pulse-maintainer
2026-09-19 21:38:19 +01:00
pulse-triage[bot] fb6896e3a2 Merge origin/main into the reviewed maintenance line
Change-source: pulse-maintainer
2026-09-19 20:49:20 +01:00
pulse-triage[bot] e2635c3810 fix(metrics): survive startup write lock and bound allocations
Address the remaining verified findings from the pkg/metrics/store.go review
(#2079 finding 5 and the lower-impact nits):

- writeBatch now retries the whole transaction on a retryable lock error.
  BEGIN is deferred, so contention is hit at the first INSERT or COMMIT; the
  old loop retried only Begin() and skipped rows. While the one-time startup
  maintenance (deferred identity-index rebuild and auto-vacuum VACUUM) is
  active, an extended retry budget keeps upgrade-time history instead of
  dropping it after the steady-state budget.
- migrateLegacyHostResourceType probes with an indexed EXISTS before opening a
  write transaction, so an already-migrated store does not dirty the WAL on
  every boot.
- QueryAll caps the per-series MetricPoint preallocation so a fine requested
  step over a long range cannot reserve hundreds of thousands of slots.

Regressions: TestStoreStartupMaintenanceSignalsWriteRetryBudget,
TestStoreWriteBatchExtendsRetryDuringStartupMaintenance,
TestEstimateQueryAllBatchSeriesCapacityCapsPreallocation. The
performance-and-scalability contract records the invariants.

Change-source: pulse-maintainer
2026-09-19 20:18:01 +01:00
rcourtman eac340191b Clarify contractor administration of customer-owned licences
Distinguish independent customer-owned Community, Relay and Pro installations
from provider-owned MSP entitlements so outside IT support alone does not
trigger an MSP requirement. Preserve per-customer subscriptions and the
prohibition on pooling licences across unrelated customers.
2026-09-19 20:00:36 +01:00
pulse-triage[bot] 087bbf8c20 chore(metrics): move store regression proof into accepted proof file
The canonical completion guard requires the metrics-store hot-path proof in
pkg/metrics/store_additional_test.go. Move the rollup-gap, upsert-spread,
busy-retry and auto-vacuum regressions there and point the
performance-and-scalability contract at that file. The runtime change and
contract section are in the preceding fix(metrics) commit.

Change-source: pulse-maintainer
2026-09-19 19:20:30 +01:00
pulse-triage[bot] e1d97b361e fix(metrics): harden store rollups, retries and auto-vacuum
Address the remaining verified findings from the pkg/metrics/store.go review
(#2079 findings 2-4 and 6):

- rollupTier no longer leaps its checkpoint over a source gap. Previously a
  trailing or interspersed gap advanced the checkpoint to the rollup cutoff, so
  a lower tier that backfilled the gap later had those rows stranded below the
  upper checkpoint and purged by retention.
- Retry conditions now classify SQLITE_BUSY/LOCKED by driver result code. The
  modernc driver reports "database is locked (5) (SQLITE_BUSY)", which the
  previous exact-string comparison never matched, so a busy writer dropped its
  batch without retrying.
- The metrics upsert preserves an existing rollup row's min/max spread with
  COALESCE instead of overwriting it with NULL.
- migrateAutoVacuum pins the pragma and VACUUM to one connection and verifies
  the persisted mode, so the one-time conversion cannot silently repeat a
  full-file VACUUM on every restart.

Regressions: TestStoreRollupTierBackfillsInterspersedGap,
TestStoreWriteBatchPreservesRollupSpread, TestIsRetryableWriteError,
TestIsRetryableWriteErrorMatchesDriverBusyCode,
TestStoreAutoVacuumPersistsAcrossRestart. The performance-and-scalability
contract records the invariants.

Change-source: pulse-maintainer
2026-09-19 19:19:13 +01:00
pulse-triage[bot] 8bc6aa3c86 chore(monitoring): record agent-lifecycle contract and disk-life proof
Follow-up to the physical-disk endurance precedence fix. Records the
dependent agent-lifecycle contract section and moves the regression into the
accepted physical-disk proof file so later per-commit canonical guards find
both the contract and the verification artifact.

Change-source: pulse-maintainer
2026-09-19 17:27:25 +01:00
pulse-triage[bot] 0910542f0a fix(monitoring): stop host-agent endurance raising disk life
The physical-disk SMART merge let a linked host agent raise a disk's
remaining life above the Proxmox inventory value. An intermittent NVMe
PercentageUsed 0 reading therefore resolved a genuine low-life disk-wearout
alert, which re-fired on the next physical-disk poll and emitted a fresh
resolved notification every poll interval (#2112).

The merge now takes the agent value only when the Proxmox value is unreported
or more pessimistic, never raising a reported remaining-life value, while
still recording the agent SMART attributes. This does not change agent
admission, token binding or removal-block behaviour.

Regression: TestMergeHostAgentSMARTIntoDisks_AgentWearoutDoesNotHideLowPVELife
and TestMergeHostAgentSMARTIntoDisks_AgentWearoutFillsUnreportedPVELife in
internal/monitoring/monitor_integration_test.go. The monitoring contract is
updated in this commit.

Change-source: pulse-maintainer
Contract-Neutral: Behavioral bug fix in the physical-disk SMART merge; no public API or external contract delta. The monitoring contract is updated in this commit and the dependent agent-lifecycle contract and accepted proof file follow in the next commit.
2026-09-19 17:27:01 +01:00
pulse-triage[bot] 5bc6f919bb fix(metrics): stop closing writeCh on shutdown
The ingestion worker closed writeCh when it observed stopCh. A concurrent WriteWithTier that passed its stopping check, or a WriteBatchSync/WriteBatchBounded caller (which never checks stopping), could then send on the closed channel and panic the process during shutdown. Reproduced deterministically: enqueueWrite after Close panics with send on closed channel, and 8 concurrent monitoring writers racing Close panic in boundedEnqueueAndWait (store.go:1034).

Never close writeCh. Drain already-queued requests non-blockingly, then process them. Late writes land in the buffered channel and are discarded with the store rather than crashing it. Record the invariant in the performance-and-scalability contract and pin it in the accepted store proof file.

Change-source: pulse-maintainer
2026-09-19 15:16:35 +01:00
pulse-triage[bot] 54f0619e57 fix(monitoring): honour removal block on forked re-enroll
A removed host agent could re-enroll under a derived base-hex identity because identity resolution forked the machine before the removal block was consulted. The block is keyed on the base machine identity, so the forked ID bypassed it and the machine was silently re-admitted (#2113). ApplyHostReport now consults the base-identity removal block when the presenting token had no prior binding, so a fresh install token clears the block and heals to the base identity while an established distinct forked host (#1753) is left alone.

Record the behaviour in the monitoring and agent-lifecycle contracts and add the focused regression to the accepted monitor.go proof file. Change-source: pulse-maintainer

Change-source: pulse-maintainer
2026-09-19 15:16:18 +01:00
pulse-triage[bot] 40fff0636d fix(docker): treat all local RepoDigests as the current image
Docker update check compared a single RepoDigest against the registry tag digest, so a current image that carries two RepoDigests (postgres:16.15-alpine3.24) reported update-available. Compare the whole local RepoDigest set in CheckImageUpdate and in the typed update preflight; the primary digest is still reported for display.

Record the behaviour in the monitoring and agent-lifecycle contracts and add focused regression tests in the accepted docker proof files. Proof: go test ./internal/dockeragent/ passes including TestRegistryChecker_MultipleLocalRepoDigestsSuppressFalseUpdate and TestAgent_getImageRepoDigests_MultipleDigestsForOneImage.

Change-source: pulse-maintainer
2026-09-19 15:16:03 +01:00
pulse-triage[bot] df44238797 fix(monitoring): drop replayed unified metric samples
Read-side registry rebuilds re-run the unified metric sync as often as every two seconds, so one poll observation was re-written many times between polls. The metrics store upserts on (resource, metric, tier, timestamp), so each replay UPDATEs the same row and commits a fresh transaction for no new data, churning the SQLite WAL and driving the disk-write amplification reported in #1966.

Track the last sample handed to the store per series and skip exact timestamp+value repeats before the batch is enqueued. A corrected value at the same observation time is still written, so the guard cannot mask a real change. Record the behaviour in the monitoring and agent-lifecycle contracts and move the focused regression into the accepted monitor.go proof file.

Change-source: pulse-maintainer
2026-09-19 15:15:31 +01:00
rcourtman 8fad031d95 Keep agent credentials consistent across monitor reloads
Reloading configuration replaced the monitor's config pointer while API and
authentication handlers retained the original object. Tokens created afterwards
could authenticate successfully while Agent Doctor reported an unlisted token.

Refresh the canonical runtime configuration in place before constructing the
replacement manager. Cover repeated reloads, live token creation and revocation.
2026-09-15 09:37:01 +01:00
pulse-triage[bot] 6a611905be Scope the dedicated proof to quick security setup
Use an exact runtime-file policy before the general API fallback, so setup preservation evidence cannot substitute for unrelated API changes. Assert both setup routing and unchanged organization/RBAC verification requirements. Retain the original failed broader-registry test evidence.

Change-source: pulse-maintainer
2026-09-15 02:28:17 +01:00
pulse-triage[bot] 6b3780c8a6 Keep API proof registrations in canonical order
Sort the dedicated regression path into the existing exact-file list as required by the registry audit. Accepted proofs and enforcement remain identical.

Change-source: pulse-maintainer
2026-09-15 02:27:13 +01:00
pulse-triage[bot] 5f33ea3a3c Register the dedicated security setup contract regression
The per-commit API guard needs the actual dedicated preservation test declared in its verification registry. Restore that tested artifact and add its exact path to the existing backend API proof list. Retain all existing requirements and reviewed commit identities; no history rewrite, contract-neutral override, or unrelated proof substitution is used.

Change-source: pulse-maintainer
2026-09-15 02:22:04 +01:00
pulse-triage[bot] b5cf4d5cc7 Use the governed follow-up reference shape
Represent the retained L1 maintenance residual with the required kind and id fields so the status audit resolves its owned follow-up.

Change-source: pulse-maintainer
2026-09-15 02:16:52 +01:00
pulse-triage[bot] 8e85d69638 Retain the unresolved maintenance release follow-through
Link the L1 residual to an explicit owned follow-up when claiming the independent settings repair. Source admission, failed checks, installed recovery and exact-candidate observation remain unfinished rather than disappearing with the claim change.

Change-source: pulse-maintainer
2026-09-15 02:16:33 +01:00
pulse-triage[bot] f0f7e51d15 Preserve system preferences when rotating local authentication
Quick security setup previously replaced system.json with defaults even for authenticated force reconfiguration. Initialize only absent settings under the persistence save mutex, preserving existing bytes and read failures. Cover credential rotation, custom and malformed settings, missing settings, and read errors without changing authorization or token scopes.

Change-source: pulse-maintainer
2026-09-15 02:11:52 +01:00
pulse-triage[bot] f04c230afb Bind maintenance stable releases to their soaked source
Apply existing candidate content-drift validation to every future stable promotion, including v6.4 patches. Preserve patch and minor soak durations and the explicit hotfix reason path. Extend regression cases to maintenance releases and give historical unit fixtures explicit source paths rather than reading the live checkout.

Change-source: pulse-maintainer
2026-09-15 00:36:23 +01:00
rcourtman e7f36efceb Merge pull request #2089 from rcourtman/fix/pr-validation-refresh
Cancel superseded pull request validation
2026-09-14 23:44:50 +01:00
rcourtman 092e988239 Cancel superseded pull request validation
Replacement PR checks were queued behind obsolete runs even after the
previous revision failed. Cancel prior validation only for pull_request
events, preserving completed verdicts for branch pushes and manual runs.

Contract-Neutral: Only PR concurrency changes. Semantic YAML comparison confirms all jobs and triggers, including frontend dependency security checks, are unchanged. No security verification change is warranted. The scheduling contract is updated.
2026-09-14 23:07:22 +01:00
pulse-triage[bot] 10d466e1a3 style(alerts): format warning preference repair
Resolve the PR2087 frontend formatting gate without changing severity behavior or rewriting the reviewed source. Re-run the production-component browser matrix and refresh its content hashes; whole-tree formatting and local TypeScript checking pass.

Change-source: pulse-maintainer
2026-09-14 22:46:12 +01:00
pulse-triage[bot] e8bbda6f71 fix(alerts): preserve warning-level notification preferences
Retain warning severity through email API save/reload and webhook editing instead of coercing it to all. Add adapter round-trip and webhook edit/save regressions for issue #2069 with alerts, API and notifications contracts. Browser verification covers production components at desktop and narrow widths using synthetic settings; backend filtering is unchanged.

Change-source: pulse-maintainer
2026-09-14 22:36:28 +01:00
pulse-triage[bot] 646bba571b fix(truenas): accept non-object REST alert arguments
Preserve snapshot refresh and formatted alerts when legacy args are scalar, array or null. Restrict SMART metadata to typed object fields and cover repeated snapshot collection plus error boundaries for #2077.

Change-source: pulse-maintainer
2026-09-13 18:42:50 +01:00
pulse-triage[bot] c9e71eac86 test(monitoring): register physical disk round-trip runtime proof
Register the focused skipped-poll regression under monitoring runtime verification as well as the shared lifecycle and read-state edges.

Change-source: pulse-maintainer
2026-09-13 18:26:15 +01:00
pulse-triage[bot] 01742e2279 fix(monitoring): preserve physical disk source identity on refresh
Skipped disk polls must write the Proxmox source key back into inventory rather than hashing the canonical resource ID again. Add repeated-cycle runtime and JSON projection coverage for serial-less disks, distinct node/controller scopes and removal.

Change-source: pulse-maintainer
2026-09-13 18:25:42 +01:00
pulse-triage[bot] ae38b93c0c fix(release): stop public writer chain on workflow cancellation
Preserve successful qualification and optional skipped ancestors while rejecting workflow cancellation independently of completed needs. Cover tag, Docker, Helm, readiness, convergence dispatch and activation; retain evidence and cleanup joins.

Change-source: pulse-maintainer
2026-09-13 14:21:55 +01:00
pulse-triage[bot] f9569426f5 fix(release): publish qualified tags after optional skipped checks
Use an explicit status guard while requiring successful preparation and qualification. Model the beta skipped-ancestor path and adverse direct prerequisites; retain immutable identity and all release gates.

Change-source: pulse-maintainer
2026-09-13 13:03:02 +01:00
pulse-triage[bot] 6f301ee8fb fix(vmware): probe canonical vSphere 8.0.3 JSON release
Probe 8.0.3.0 before the legacy spelling and older API schemas. Issue #2070 demonstrates method routing on the canonical version while Pulse reports 8.0.2.0. Retain legacy fallback and hard authentication/permission failures.

Add canonical negotiation, legacy/older fallback and auth/permission regression controls; update the runtime contract. Five reduced-function race probes fail before and pass after. Full package validation is unavailable with the installed offline dependency cache. This repairs negotiation, not the unresolved metrics/events/folder enrichment report.

Change-source: pulse-maintainer
2026-09-13 09:25:10 +01:00
pulse-triage[bot] 343f15eec5 Merge pull request #2065 from rcourtman/fix/proxmox-node-guest-navigation
Show a node's guests from the Proxmox overview row
2026-09-12 22:55:38 +01:00
rcourtman c7c503994b Merge pull request #2063 from rcourtman/fix/disposable-release-qualification
Isolate release preparation and qualification on hosted VMs
2026-09-12 18:33:17 +01:00
rcourtman 982465e63c Show a node's guests from the Proxmox overview row
Selecting a node filters its guests and reveals an off-screen guest
heading without moving results that are already visible. Repeating the selection
clears only the node filter. Keep node details on the
chevron and preserve other guest filters when changing or clearing nodes.

Build node filter options from inventory as well as guests so empty nodes
retain their names and selection after reload. Do not present unrelated
inventory failures as the cause of an empty filtered result.

Refs lane L8. Update the owning interaction and identity contracts.
2026-09-12 17:24:46 +01:00
rcourtman 051ce81a72 Isolate release preparation and qualification on hosted VMs
Persistent prerelease runners can retain state from earlier source execution
and influence later admission, build output or qualification. Use the
existing hosted stable-release path for every channel while preserving
exact-source checks, resource planning, watchdogs and release gates.
2026-09-12 15:44:11 +01:00
pulse-triage[bot] 34ba9a5ed9 Merge candidate 20260911T204017Z-core-runtime
Change-source: pulse-maintainer
2026-09-11 21:47:11 +01:00
pulse-triage[bot] 097422837b fix(release): preserve quarantined version identity
Reject historical draft reuse before PATCH when its retained target is not the exact checkout SHA, including missing targets and moving refs. Preserve same-source recovery and activation guards.

Depends on PR2056 qualification-first workflow and immutable tag checks. Executable absent-tag fixtures fail before repair and pass on PR head 9e5e18f0 plus this patch; 53 policy, 6 immutability and 42 trust tests pass. Update the deployment contract in the same commit.

Change-source: pulse-maintainer
2026-09-11 21:43:11 +01:00
rcourtman 9e5e18f008 fix(release): qualify candidates before public version writes
A draft GitHub release does not hide its public Git tag or registry
images. Publishing those before qualification consumed a beta identity
when the candidate later failed.

Stage drafts without Git refs, join exact-source checks before public
tag, Docker and Helm publication, and preserve exposed tag identities.
Keep final digest verification before release activation.
2026-09-11 21:04:46 +01:00
rcourtman 02d8165b8b fix(metrics): isolate statistics reads from history load
History requests can occupy every database connection and make cheap
statistics reads wait for seconds. Reserve one read-only connection for
current committed counts, owned and closed by the metrics store.

Keep the SQL, data model, load workload and latency budgets unchanged.
Add deterministic pool-saturation, committed-data and shutdown coverage.
2026-09-11 18:19:51 +01:00
pulse-triage[bot] bfae4ce0c8 fix(ui): keep disk mounts in the parent scrolling flow
The nested 140px mount list relies on a thin scrollbar to reveal additional disks, which #2051 reports as invisible in Firefox. Remove that nested scroll boundary so all mounts participate in the existing outer scroll flow without changing data or global scrollbar styling.

Validate short and long lists in light/dark Firefox and Chromium fixtures, including keyboard reachability, and retain aggregate/empty-state component coverage. This is synthetic browser proof, not reporter installation acceptance.

Change-source: pulse-maintainer
2026-09-11 11:26:20 +01:00
pulse-triage[bot] 3e920df03d fix(alerts): skip unchanged pending-intent checkpoints
Complete the JSON-only checkpoint fast path: compare sorted, bounded actual pending-state bytes before replacement. Preserve changes, clearing, failed-write retry and unsafe-destination repair. Focused before regression fails; repeated race proof passes. Sixty unchanged synthetic checkpoints fall from 245760 process write bytes to zero; changing alert freshness remains a separate contributor, not aggregate issue #1966 acceptance.

Change-source: pulse-maintainer
2026-09-11 07:05:34 +01:00
pulse-triage[bot] 45f76ed7a9 fix(release): map 6.4.5 reliability checkpoints to release line
The following notification reliability patch needs an explicit branch binding before selection. Keep 6.4.4 frozen and preserve historical and unlisted patch mappings while testing beta, RC and stable workflow resolution.

Change-source: pulse-maintainer
2026-09-11 00:23:11 +01:00
rcourtman 3c723569e3 Merge main into source-build update safeguards
Reconcile parallel release-version test fixtures while preserving the
current provider settings changes. Refresh browser verification against
the combined source before landing the diagnostic update safeguards.

Refs #1913
2026-09-10 21:31:38 +01:00
pulse-triage[bot] 3da2356dda fix(ci): archive durable root-pair candidate
The reviewed diagnostic named an ephemeral proposal commit that is no longer fetchable after its branch was retired, so a hosted checkout could not archive the fixed candidate. Use the merged main commit with the identical reviewed tree, retain the original evidence identity in metadata, and require an exactly balanced AB/BA contract.

Change-source: pulse-maintainer
2026-09-10 19:13:29 +01:00
pulse-triage[bot] 9902c204d0 ci: collect fixed hosted root-route pair evidence
The completed local study did not explain the adverse hosted root comparison. Add an exact-source root-only collector with matched builds, ten alternating samples and retained layout and host evidence, rather than repeat full qualification or relax its threshold. Eight focused mocked collector tests pass; hosted execution remains after independent review and protected landing.

Change-source: pulse-maintainer
2026-09-10 19:03:01 +01:00
pulse-triage[bot] b5a9b7aac2 Merge commit 'e8449477ff1098be8975cccee42952e45c73aa74'
Change-source: pulse-maintainer
2026-09-10 18:41:40 +01:00
pulse-triage[bot] e8449477ff fix(settings): restore Ollama Basic Auth configuration
The backend supports authenticated Ollama servers but the provider editor omitted its credential fields. Expose write-only password editing with explicit clearing and preserve unchanged credentials. Verify Settings persistence, authenticated connection tests and the Patrol streaming factory using synthetic endpoints.

Change-source: pulse-maintainer
2026-09-10 18:21:29 +01:00
pulse-triage[bot] c0967d02db test(ai): wire typed planners in control projection fixtures
Repair stale transport-only availability fixtures without weakening runtime planner or policy checks. Exercise planner removal with execute authority, transport-only provider projections, and read-only policy with an installed planner.

Change-source: pulse-maintainer
2026-09-10 18:17:48 +01:00