Commit Graph

474 Commits

Author SHA1 Message Date
rcourtman afc419ddab Add durable Proxmox node display names 2026-07-24 15:46:56 +01:00
rcourtman 478a9e933d Complete canonical web interface links
Preserve tenant-scoped metadata through partial URL updates and project stable URLs across runtime identities. Use a safe adjacent launch control across overview tables with desktop and mobile regression coverage.
2026-07-24 12:42:16 +01:00
rcourtman 4a2335ce7f fix(ai): harden local compatible providers 2026-07-24 12:35:31 +01:00
rcourtman 9da4d4e966 Add powered-off alert tolerance 2026-07-24 12:23:29 +01:00
rcourtman f744e0700e Fix availability summaries and webhook secret handling 2026-07-24 11:56:30 +01:00
rcourtman 3a913752de Fix Proxmox cluster membership reconciliation 2026-07-24 11:21:27 +01:00
rcourtman 2ac70dab70 Fix audit storage migration and viewer races
Refs #1464
2026-07-24 10:33:57 +01:00
rcourtman ac0fb263c2 Fix Proxmox workload refresh coherence 2026-07-24 10:11:56 +01:00
rcourtman 8d23529c02 Fix availability check identity projection 2026-07-23 23:46:34 +01:00
rcourtman 639e88104c Demote operational-trust protection posture spec to probation
tests/90-operational-trust-protection-posture.spec.ts failed the
stable tier on main in run 29731882505 — the first tiered run. One
incident on main demotes: it rejoins the gate after 10 consecutive
green runs, per the rule above PROBATION_SPECS.

Contract-Neutral: probation demotion per documented tier rule: spec 90 failed on main run 29731882505; CI gating list only, no dev-runtime delta
2026-07-20 10:55:07 +01:00
rcourtman f2fa92f576 Split Core E2E into gating stable and non-gating probation tiers
Mined per-spec failure data from the 32 completed Core E2E main runs
since the 2026-07-18 quarantine delist (failed-shard logs; a green
shard means every spec in it passed). 26 specs failed or retry-flaked
within the 10 most recent completed runs; they seed PROBATION_SPECS in
tests/integration/playwright.config.ts. The remaining 62 files form the
stable tier and are the only specs that can fail the e2e-verdict job.

Mechanism extends the existing quarantine list rather than adding a
parallel one: PULSE_E2E_TIER=stable ignores probation specs,
PULSE_E2E_TIER=probation runs only them, unset runs the full suite
(local behavior unchanged). CI runs both tiers per shard against the
same containers; the probation pass sits behind continue-on-error with
its own report/results dirs and artifacts, so a probation flake is
reported in the shard summary without painting main red.

Promotion rule, documented next to the list: a probation spec promotes
to stable after 10 consecutive green main runs with no failure and no
retry-flake; one incident on main demotes a stable spec back. In the
newest completed run (29729544151) every failure was in a probation
spec — under this split that run's verdict is green.

Contract-Neutral: CI-only E2E tier split: gating semantics of push-CI verdict; local npm test behavior and dev-runtime orchestration unchanged, no public contract delta
2026-07-20 10:32:26 +01:00
rcourtman 05c44f199f Stabilize populated browser fixtures
Contract-Neutral: Browser-only qualification fixture synchronization; no deployment or public runtime contract changes.
2026-07-20 09:47:03 +01:00
rcourtman b858e7fd2d Stabilize shared browser qualification
Contract-Neutral: Browser qualification keeps the existing deployment, authentication, and mobile layout contracts while reusing the accepted test credential and avoiding a WebKit synchronous-layout probe.
2026-07-20 09:12:01 +01:00
rcourtman a65194de3a Stabilize mobile workload geometry probe 2026-07-20 08:42:01 +01:00
rcourtman c73e78aeea Stabilize RC runtime ownership
Contract-Neutral: RC qualification fixes preserve existing public API, tenant, monitoring, and organization contracts while correcting canonical runtime ownership and test fixtures.
2026-07-20 07:50:22 +01:00
rcourtman 86bf879b7b Satisfy update readiness in signature E2E 2026-07-20 06:13:28 +01:00
rcourtman 96fce4cbcb Use mobile assistant submit control 2026-07-20 05:19:15 +01:00
rcourtman 99af2a0bf2 Accelerate mock history readiness 2026-07-20 04:21:26 +01:00
rcourtman 9ea7689373 Preserve VMware exclusion test boundaries 2026-07-20 03:51:05 +01:00
rcourtman 0b6d1cdc18 Stabilize mobile browser interactions 2026-07-20 03:33:46 +01:00
rcourtman eeab775445 Harden browser release qualification
Contract-Neutral: Release qualification reliability fixes preserve existing runtime, route, and deployment contracts
2026-07-20 03:15:13 +01:00
rcourtman 12eef62f76 Stabilize cross-platform release gates 2026-07-20 02:32:29 +01:00
rcourtman e9dddf86b8 Harden RC qualification coverage
Contract-Neutral: RC qualification and contract-preserving reliability fixes; no canonical product contract changes
2026-07-20 01:13:26 +01:00
rcourtman dbd4b14b73 Isolate Core E2E runtime state
Contract-Neutral: Core E2E scheduling and mock-readiness harness change; no deployment, installability, or runtime contract delta
2026-07-20 00:14:37 +01:00
rcourtman d7eb4457c4 Stabilize shared E2E runtime state
Contract-Neutral: E2E harness reliability fix; no deployment or installability runtime contract changes
2026-07-19 23:24:21 +01:00
rcourtman 4fcca0993b Isolate vSphere workload fixture routing
Match only the canonical workloads request so unrelated resource traffic does not contend through the Playwright route handler.

Contract-Neutral: Test fixture routing only; no public subsystem contract change
2026-07-19 22:27:08 +01:00
rcourtman 19ec17372e Stabilize vSphere drawer verification
Contract-Neutral: Test fixture normalization without a public subsystem contract change
2026-07-19 21:58:50 +01:00
rcourtman 2f1ffa94ef Stabilize page header alignment verification
Contract-Neutral: Test-only coordinate normalization without a public subsystem contract change
2026-07-19 21:24:36 +01:00
rcourtman 5d01c5e469 Stabilize Core E2E release paths
Contract-Neutral: Canonical route normalization and test stabilization without a public subsystem contract change
2026-07-19 21:03:58 +01:00
rcourtman 7ce7bbf323 Finish Core E2E release gate alignment
Contract-Neutral: Core E2E authentication and release-gate test alignment does not change the deployment-installability public contract
2026-07-19 19:33:19 +01:00
rcourtman 6343b1f5cd Complete Core E2E release gate repair
Contract-Neutral: Mobile Assistant viewport containment and release-gate test repairs do not change the ai-runtime public contract
2026-07-19 18:30:27 +01:00
rcourtman f6a59eb1c6 Repair Core E2E release gate
Contract-Neutral: RC4 gate repair only: responsive layout correction, internal test hook, and E2E-only runtime target; no public subsystem contract changes
2026-07-19 17:29:51 +01:00
rcourtman 83672a00a8 Harden Operational Trust rollout contracts 2026-07-19 15:11:02 +01:00
rcourtman cd75722da3 Build canonical Operational Trust action loop
Refs #1034
2026-07-19 15:11:01 +01:00
rcourtman 69533c7afb Build canonical availability resource facets 2026-07-19 15:11:01 +01:00
rcourtman 07a4d05ca3 Build canonical Patrol attention workbench 2026-07-19 15:11:01 +01:00
rcourtman 93dbdd91cf Build canonical protection posture 2026-07-19 15:10:38 +01:00
rcourtman 816d55e03d Recover spec 68 infrastructure onboarding against evolved discovery UI
The discovery-config surface changed: with discovery disabled by default the
empty state offers a 'Configure discovery' button (which opens the Discovery
settings dialog), and the 'Run discovery' scan button only renders once
discovery is enabled.

- Landing test: assert 'Configure discovery' and that 'Run discovery' is absent,
  instead of the stale 'Run discovery' / 'Discovery settings' button names.
- Discovery settings dialog test: open it via 'Configure discovery' (the dialog
  title/copy/close-button assertions were already current).
- Explicit discovery scan test: enable discovery for that test by passing the
  real /api/system/settings response through with discoveryEnabled flipped on,
  so the 'Run discovery' scan button appears and the candidate->review flow runs.

Verified: all 5 desktop tests pass against the managed local backend.
Contract-Neutral: E2E quarantine recovery
2026-07-19 09:51:23 +01:00
rcourtman eddcbd5aa0 Recover spec 76 assistant tool-output-preview against current UI
Re-pin the assistant-drawer flow to the current surfaces: open via the
page-contextual 'Ask Pulse Assistant about TrueNAS' launcher on a live
/truenas page (not the retired /settings/infrastructure/platforms/truenas), and
resume the stubbed session through the 'Pulse Assistant sessions' menu -> the
'Resume Tool output preview proof' option (the session-picker list, not a bare
resume button).

Broaden the /api/ai/sessions stub glob to '**/api/ai/sessions*' so it matches
the picker's ?limit= query (the trailing * excludes the /messages subpath). The
tool row now renders the human summary with the target ('Run read-only command
on current resource') and the raw command preview ('$ printf preview-proof-0606')
as two separate lines, and the details control is the tool-row toggle
(title 'Show tool details'), not a standalone 'Details' button.

Verified: passes against the managed local backend.
Contract-Neutral: E2E quarantine recovery
2026-07-19 09:45:49 +01:00
rcourtman 448046b1e2 Recover journeys 01/06/07 as CI-safe cookie-session tests
Retrofit a worker-scoped cookie-session fixture (journeyAuth.ts) onto journey
smoke specs 01/06/07 so each worker logs in once and every test inherits the
cookie via storageState, instead of ensureAuthenticated's token path (which
leaves page.request cookie-less -> 401 on apiRequest/agent-report/audit
endpoints).

ensureJourneyReady verifies the cookie against the API directly and lands the
page on a non-bootstrap route (never '/' or '/login', which force the login
form even with a valid session -- #1574), so per-test auth issues zero login
POSTs and the suite stays under the backend's 10-logins/min/IP limit. The two
login-flow tests (health check, bootstrap-and-login) plus the logout/re-login
cycle keep their own explicit login on an isolated session -- logout() destroys
the current session, so it must never run against the shared worker cookie.

Re-pin 01 to the current platform-first IA: primary-nav tabs
['Proxmox','Alerts','Settings'] (no single 'Infrastructure' tab; Proxmox is
resource-admitted, so beforeAll enables mock mode first), settings sidebar
categories ['Infrastructure','System','Security']. Re-pin 06's reporting route
to /settings/support/reporting (heading 'Data & Reports') and guarantee mock
mode on before the two report-generation polls. Accept 503 in 07's
investigation-endpoint status set.

Verified: each spec passes on its own and a combined 01+06+07 run stays green
with zero login-rate-limit failures against the managed local backend.

Contract-Neutral: E2E quarantine recovery
2026-07-19 09:38:24 +01:00
rcourtman aa4de54d42 Re-pin three live-gate straggler specs against current surfaces
These never-quarantined specs had rotted red on CI against v6 IA changes.

- 67: the add-infrastructure dialog replaced per-platform buttons with a
  detect-or-agent chooser; the TLS-warning tests deep-link straight to
  the platform credential slot via ?add=vmware / ?add=truenas
  (ADD_STEP_TO_TYPE), and the notifications page heading is now
  'Notifications'.
- 68-platform-pages-shell: platform sub-tabs are inventory-gated
  (64cbdd6e4), so a platform with no connected instance shows the
  empty-state card instead of sub-tab chrome; the no-data test accepts
  either. The Docker containers tab was collapsed into Overview
  (1f66a2f93), so it drops from the expected tab list.
- 69: the Commercial Funnel and Infrastructure Onboarding analytics were
  removed from the diagnostics page and both exports (c6bcad255); the
  spec now pins that boundary (analytics never render and are stripped
  from full and sanitized exports) instead of asserting they appear.

Contract-Neutral: E2E straggler re-pins verified green on a fresh managed backend
2026-07-19 00:11:57 +01:00
rcourtman f8fba328dd Recover the long-tail E2E quarantine batch against current surfaces
Delist nineteen quarantined specs (69 green, 13 env-gated skips in one
full-batch run); 05/19/20/30/52/60/63/77/79 passed unchanged. 03 stays
quarantined with its reason recorded inline: multi-tenant scenarios 6/7
carry an unresolved org-resolution bug that CI's multi-tenant
environment would exercise, and 47/48 still await their concept rework.

- 15: organization panels only exist in multi-tenant installs, so those
  routes now skip when the feature is off, and the Remote Access shell
  description follows the refreshed Relay copy.
- 17: the backups page defaults to the guest-centric Coverage view when
  anything needs attention; the day-activity assertions enter the By
  date view first.
- 18/51: the Patrol page crashed to its error boundary under stale
  autonomy stubs; the stubs now carry the requested/effective levels and
  autopilot acknowledgement the page reads, and the paused copy is
  sentence-case.
- 43: rewritten as a platform-pages tour (TrueNAS, vSphere, Proxmox,
  Docker, PBS, PMG) since the settings platform views it pinned were
  retired to a 404 with the legacy aliases.
- 49: the demo-estate proof follows the per-platform IA and drops a
  self-contradictory storage exclusion that could never pass alongside
  the west-a-service-pool assertion.
- 57: the RC Preview badge only renders in the authenticated shell, so
  the spec signs in instead of stubbing the session.
- 62: the retired platform-management aliases deliberately 404 now
  (cfb16e6da); the spec pins the graceful not-found page instead of the
  removed redirect.
- 75: switches to cookie-session auth (the token path leaves
  page.request unauthenticated), anchors on the Connection posture
  region, and drops the retired operations sub-route.
- 84: a missing lab artifact is now a skip rather than a hard failure.

Contract-Neutral: E2E quarantine recovery, spec re-pins verified green on a fresh managed backend
2026-07-18 23:15:25 +01:00
rcourtman a40886ff3a Recover the commercial-funnel E2E batch against current surfaces
Re-pin five quarantined commercial-funnel specs and delist all eight
from the quarantine (54/55/56 already passed unchanged; the two managed
demo runtime tests stay env-gated).

- The old stubbed auth shell renders the login page now that the app
  shell makes auth-gated calls beyond the stub set; 59/61/70 sign in for
  real and stub only the license or diagnostics surface under test.
- 53: hidden demo billing routes redirect to the settings infrastructure
  root (the /install sub-route was retired), and the browser probe list
  gains the trial/activate endpoint its hidden-keys contract already
  named but never probed.
- 58: Remote Access stays in the free-tier nav on purpose (the panel
  renders its own upgrade gate; hiding it made Relay undiscoverable), so
  the spec pins its presence instead of its absence.
- 59/70: billing moved to the Pulse Intelligence settings group with a
  Plans & Billing heading; plan-card assertions re-anchor at page scope
  on the current copy (capability sentences, Apply key, Manual key
  recovery disclosure, Patrol-flavoured activation summary).
- 61: the Commercial Funnel diagnostics card was deliberately removed
  (c6bcad255); the spec now pins the inverse boundary, asserting the
  internal funnel analytics never render even when the API payload
  carries them.

Contract-Neutral: E2E quarantine recovery, spec re-pins verified green on a fresh managed backend
2026-07-18 22:32:31 +01:00
rcourtman 81c93835b3 Recover the workloads and storage E2E batch against current surfaces
Re-pin seven quarantined specs to the surfaces that replaced the retired
/workloads and /storage pages and delist them from the quarantine.

- 44/45: the summary chart strip and its range buttons are gone; the
  sparkline path maps x by timestamp, so the payload proofs assert
  window coverage and tail stability directly against
  /api/charts/workloads.
- 46: multi-range storage history proofs move onto /proxmox/storage
  with point-count floors a fresh seeded backend guarantees.
- 50: physical disks live under the Physical Disks tab on
  /proxmox/storage; rows are pinned by identity because live refreshes
  re-sort the table, and late in-flight poll responses no longer fail
  teardown.
- 59: the wide-set assertions run at 1600px (wide engages at 1536 after
  the layout fix) plus a no-horizontal-scroll proof for the 1440px
  compact default.
- 62: the Growth column is fixed to a 24h window; the rendered label is
  proven against the same used-capacity history the endpoint serves.
- 64: the workloads surface lives on /proxmox, drawer tabs expose tab
  roles, and row selection no longer writes a resource deep link.

Contract-Neutral: E2E quarantine recovery, spec re-pins verified green on a fresh managed backend
2026-07-18 22:08:14 +01:00
rcourtman 2190cf8171 Scope the recovered truenas and vmware specs to desktop presentation
Both specs came back from quarantine on 2026-07-17 proven against
chromium, but Core E2E also runs them on mobile-safari, where they have
failed on every run since. The mobile layout collapses the thresholds
platform-scope filter into the FilterBar sheet, so the TrueNAS scope
button the first spec clicks does not exist and the click falls through
to the platform nav tab, and platform tables render as cards, so the
tr-row locators the second spec asserts on match nothing. Skip both on
mobile projects the same way 06-theme-visual does; mobile presentation
coverage lives in 04-mobile.spec.ts.
2026-07-18 14:19:43 +01:00
rcourtman 3f18d78ea0 test(e2e): recover the eight vmware specs from quarantine
Re-pin the six /infrastructure-era specs to the vSphere platform page:
37 keeps its full facets/audit re-pin but is fixme'd because table-row
drawers disable remote history, leaving VMware hosts no reachable
change/action history surface (tracked); 38 and 42 move mention and
chat-turn coverage onto live mock state and the session transport (the
retired /api/ai/chat SSE stub is gone, so 42 proves the rendered
exchange instead of the wire payload); 39 and 41 pin the guest drawer's
read-only vCenter context and admin-action exclusions; 40 pins the
Datastores tab without backup semantics. 22 and 36 pass unchanged.
Verified via the managed local backend with PULSE_MOCK_MODE=true (8
passed, 1 tracked fixme).

Contract-Neutral: E2E quarantine-list shrink is test selection only; no deployment contract delta, mirrors bypass on 725837dc3
2026-07-17 15:37:30 +01:00
rcourtman 8ab5b0b3b4 test(e2e): recover the five truenas specs from quarantine
Re-pin 21 to the consolidated Connected-systems table (the address
column is gone; rows carry source, surfaces, state, and freshness) and
rewrite 26 against live mock websocket state with the stubable
alerts-config activation bypass, since REST resource stubs get
overwritten by state frames. 27, 28, and 31 were environmental-only
failures and pass unchanged against a mock-mode backend. Verified via
the managed local backend with PULSE_MOCK_MODE=true.

Contract-Neutral: E2E quarantine-list shrink is test selection only; no deployment contract delta, mirrors bypass on 725837dc3
2026-07-17 15:02:31 +01:00
rcourtman 725837dc39 test(e2e): quarantine the 50 spec files rotted against the platform-first UI
Core E2E has failed on every push since 2026-06-29. Fifty of the 81 spec
files still assert the pre-platform-first IA (locators, URLs, subheader
copy the June rebuild replaced), and with maxFailures aborting shards at
20 the healthy specs produced no verdict at all. The quarantine list in
playwright.config.ts excludes the rotted files from all three projects so
the remaining 38 files (323 tests, including the smoke and journey
coverage) return to being a live per-push gate.

This is a stopgap, named as such in the config comment. Each quarantined
spec leaves the list by being re-pinned to the current UI, never by
deletion; the recovery effort is tracked separately.

Contract-Neutral: E2E spec quarantine is test selection only; no deployment contract delta, and the contract file is another agent's in-progress work
2026-07-17 14:43:22 +01:00
rcourtman bb369235d1 Stabilize v5 license migration fixtures 2026-07-17 01:02:05 +01:00
rcourtman 4d80e53588 Align restart-loop qualification with Patrol threshold 2026-07-16 20:53:02 +01:00