LearnNewsExamplesServices
Frontmatter
id15439
titleCard-path lifecycle NL e2e: the B4 controls against a live authenticated bridge
stateClosed
labels
enhancementaitesting
assigneesneo-opus-vega
createdAtJul 18, 2026, 8:47 AM
updatedAtJul 18, 2026, 12:13 PM
githubUrlhttps://github.com/neomjs/neo/issues/15439
authorneo-opus-vega
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 18, 2026, 12:13 PM

Card-path lifecycle NL e2e: the B4 controls against a live authenticated bridge

Closed Backlog/active-chunk-7 enhancementaitesting
neo-opus-vega
neo-opus-vega commented on Jul 18, 2026, 8:47 AM

Context

The FleetSettingsPanel retirement (#15242 completion) removed the two panel-path lifecycle NL tests with their subject — they drove the retired panel's Start/Stop/Restart against the AgentDefinitions store, a path that no longer exists. The REMAINING lifecycle UI — the card controls (B4: control-toggle/control-restartlifecycleIntent → the C2 fleetLifecycleIntentAdapter → the bridge — onto the FLEET ROSTER records) has unit coverage from its own lanes but no e2e witness against a live authenticated bridge. That is new work this ticket owns, not lost coverage: the card path was never e2e-witnessed.

The Fix

One NL e2e spec (test/playwright/e2e/agentos/ — the AddAgentJourneyNL harness pattern):

  • Recording loopback bridge via authenticatedFleetHarness whose roster verb (fleetRoster) returns ONE row with lifecycle.state: 'off' and wired runtime sources (the card gates its controls on sources.runtime.state === 'wired' — an unwired row renders disabled controls and the test dies honestly).
  • Boot with fleetUrlwireAuthenticatedFleetBridge → the cockpit renders the card → click the card's control-toggle (play) → assert: exactly one minimal startAgent wire call (agent-id string, no credential bytes — the retired tests' expectMinimalLifecyclePayload contract carries over), the roster record's pendingAction/state transition, and the honest outcome render.
  • The rejected path: rejectStart → the card's control-status renders ⚠ rejected: <reason> with retry open, record untouched (the applyRecord matrix's terminal-kind contract).

Acceptance Criteria

  • Happy path: card toggle → one minimal startAgent on the wire → roster state lands from the response.
  • Rejected path: reason rendered on the card, no fake success, retry affordance open.
  • Credential hygiene: no lifecycle request carries credential-shaped bytes (the retired contract, re-homed).

Related

#15242 (the retirement that re-homed this) · the C2 adapter lane (fleetLifecycleIntentAdapter) · AddAgentJourneyNL.spec.mjs (the harness pattern) · CARD-CONTRACT.md §controls.

Live latest-open sweep: checked latest open at 2026-07-18T06:47Z; no equivalent (the retired spec was the only lifecycle NL surface). A2A in-flight: no claim; #15242 is my lane and this is its named follow-up.

Decision Record impact: none.

Origin Session ID: 2dcbf336-4338-4009-82f3-79f1b1d151f1

Retrieval Hint: "card lifecycle NL e2e control-toggle minimal startAgent wire fleetRoster wired sources"