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
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
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
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
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
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
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
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.
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
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
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
The public pricing surface and in-app plan-selling copy now say
"Patrol investigates issues and explains the root cause" and
"Patrol applies safe fixes and verifies the result". Rename the
licensing catalog DisplayName/ComparisonName pairs to the title-cased
forms, align the ai_autofix UpgradeReason verbs (apply/verify the
result), regenerate the frontend catalog, and update the Go, vitest,
and Playwright pins plus README and PULSE_PRO docs.
Commit cc948b022 fixed the Patrol preflight strings that gated keyless
onboarding; this sweeps the rest. Error messages, readiness checks, and
guidance copy that still pointed at the retired Assistant & Patrol
settings page now name the real surfaces: Pulse Intelligence settings
for the area as a whole, and the Provider & Models settings page for
provider-credential guidance, matching the phrasing cc948b022
established. Pinning tests updated in step, including three
ai_handlers_test.go assertions cc948b022 had already left stale.
The finding-links spec asserted Open related links into the retired
standalone routes from the pre-workbench findings list; those cross-link
affordances were removed deliberately with platform-first navigation,
and the monitor-first workbench feeds findings through a different
pipeline its stubs never reach. The run-history breakdown spec pinned
per-run type counts that the workbench simplified to plain totals; the
underlying count-separation contract (truenas_checked distinct from
agent hosts) lives in the investigation context model and is unit
covered there.
The spec entered through a retired settings route with an inert REST
stub (mention candidates come from websocket state) and the old Expand
Pulse Assistant launcher name. Re-pointed at the TrueNAS platform page
and the Ask Pulse Assistant launcher, it exposes a real regression:
Docker app-containers appear in the @-mention autocomplete but TrueNAS
app-containers no longer do, despite identical resource typing in
websocket state. The spec keeps the contract and skips via fixme until
mention targeting is restored.
The alert-links spec pinned Open related links into the retired
standalone routes, which were removed together with those routes'
cross-link affordances; its stub timestamps had also aged out of the
history window. The stubbed TrueNAS alert now uses fresh timestamps, the
Resource action is scoped to its own row (live mock alerts share the
page), and the contract asserts the surviving canonical handoff: the
resource incidents panel scoped to the alerting resource.
The disk-history contract lived on the retired /storage route with REST
stubs the platform pages never read. It now drives the TrueNAS storage
section against the mock dataset: the SMART-failing sdc disk opens the
resource drawer, and the History tab must request the disk series from
the metrics store under a canonical key (serial when available, the
disk:<node>:<device> composite otherwise - the store serves both, which
is what protects serial-less disks).
The thresholds surface replaced the neutral infrastructure/systems/
containers groupings with per-platform scopes, so the TrueNAS routing
contract inverted by design: TrueNAS systems, pools, datasets, and disks
now live under their own scope button. The spec asserts that scope's
sections against the mock dataset instead of the retired neutral pages.
The TrueNAS storage-links spec asserted cross-links from the retired
/infrastructure card into the retired /workloads, /storage, and /recovery
routes, and the VMware source-filter spec asserted the retired
/infrastructure source dropdown; platform-first navigation replaced both
concepts with the per-platform pages and their section navigation, which
the platform-pages shell spec covers.
The PBS active-task and job-health evidence drawer content this spec
pins still exists in ResourceDetailDrawerOverviewTab, but the
platform-first rework left it unreachable: proxmoxPageModel routes PBS
resources only into the Backups summary servers table with no expansion,
no UnifiedResourceTable lists the resource, and neither the workloads
search nor the command palette can reach it. That is a dropped product
surface, not spec rot, so the spec stays as the contract and skips via
fixme until the drill-in returns.
Platform pages render websocket state, so the offline-node guard's REST
stubs never reached the surface it was checking; it also targeted the
retired /infrastructure route. The mock scenario already forces pve5
(Disaster Recovery B) offline deterministically, which is the exact
state the guard exists for: the spec now asserts on /proxmox that the
offline node stays listed with dashed live metrics while keeping its
web-interface link and detail expansion.