Skip to content

fix(server-presence): clear session active on explicit stop disconnect #1445

fix(server-presence): clear session active on explicit stop disconnect

fix(server-presence): clear session active on explicit stop disconnect #1445

Triggered via pull request August 2, 2026 22:45
Status Failure
Total duration 45m 47s
Artifacts 1

tests.yml

on: pull_request
Release actor guard
Release actor guard
UI E2E (WSREPL Lima matrix)
UI E2E (WSREPL Lima matrix)
Mobile E2E (Maestro) (android) (opt-in)
0s
Mobile E2E (Maestro) (android) (opt-in)
Mobile E2E (Maestro) (ios) (opt-in)
0s
Mobile E2E (Maestro) (ios) (opt-in)
UI Tests (unit + integration)
29m 38s
UI Tests (unit + integration)
Shared Package Unit Tests
11m 35s
Shared Package Unit Tests
Server Tests (unit + integration)
20m 15s
Server Tests (unit + integration)
Server DB Contract (Postgres)
10m 40s
Server DB Contract (Postgres)
CLI Tests (unit + integration)
12m 0s
CLI Tests (unit + integration)
Stack Tests (unit + integration)
20m 16s
Stack Tests (unit + integration)
Release Contracts
11m 53s
Release Contracts
Installer Smoke (Linux)
15m 5s
Installer Smoke (Linux)
Installer Smoke (macOS)
6m 51s
Installer Smoke (macOS)
Installer Smoke (Windows)
15m 2s
Installer Smoke (Windows)
Binary Smoke (isolated cwd)
20m 40s
Binary Smoke (isolated cwd)
Release Validation — CLI Update Continuity (Linux)
Release Validation — CLI Update Continuity (Linux)
Release Validation — Daemon Continuity (Linux)
Release Validation — Daemon Continuity (Linux)
Release Validation — Session Continuity (Linux)
Release Validation — Session Continuity (Linux)
Release Assets Docker (Linux)
Release Assets Docker (Linux)
Self-Host E2E (Linux systemd)
Self-Host E2E (Linux systemd)
Self-Host E2E (macOS launchd)
0s
Self-Host E2E (macOS launchd)
Self-Host E2E (Windows schtasks)
Self-Host E2E (Windows schtasks)
Typecheck
9m 56s
Typecheck
CLI + Server (light/sqlite) E2E
14m 23s
CLI + Server (light/sqlite) E2E
Core E2E (fast, packages/tests, server-light, sqlite)
26m 8s
Core E2E (fast, packages/tests, server-light, sqlite)
Core E2E (slow, packages/tests, server-light, sqlite)
0s
Core E2E (slow, packages/tests, server-light, sqlite)
Stress (repeat/chaos)
Stress (repeat/chaos)
Matrix: Self-Host + Daemon E2E
Matrix: ui-e2e
Providers (contract matrix)
Providers (contract matrix)
Fit to window
Zoom out
Zoom in

Annotations

37 errors and 17 warnings
Installer Smoke (macOS)
Process completed with exit code 1.
Typecheck
Process completed with exit code 1.
CLI Tests (unit + integration)
Process completed with exit code 1.
CLI + Server (light/sqlite) E2E
Process completed with exit code 1.
src/daemon/daemon.integration.test.ts > Daemon Integration Tests > should handle concurrent session operations: apps/cli/src/daemon/daemon.integration.test.ts#L656
AssertionError: expected undefined to be defined ❯ src/daemon/daemon.integration.test.ts:656:29 ❯ src/daemon/daemon.integration.test.ts:654:13
src/daemon/daemon.integration.test.ts > Daemon Integration Tests > should update session metadata when webhook is called: apps/cli/src/testkit/async/waitFor.ts#L23
Error: Timed out waiting for session metadata webhook propagation after 30000ms ❯ waitForCondition src/testkit/async/waitFor.ts:23:11 ❯ waitForSessionById src/daemon/daemon.integration.test.ts:297:3 ❯ src/daemon/daemon.integration.test.ts:609:5
src/daemon/daemon.integration.test.ts > Daemon Integration Tests > should track both daemon-spawned and terminal sessions: apps/cli/src/daemon/daemon.integration.test.ts#L585
AssertionError: expected undefined to be defined ❯ src/daemon/daemon.integration.test.ts:585:27
src/daemon/daemon.integration.test.ts > Daemon Integration Tests > should spawn & stop a session via HTTP (not testing RPC route, but similar enough): apps/cli/src/daemon/daemon.integration.test.ts#L510
AssertionError: expected { success: true, …(4) } to have property "sessionId" ❯ src/daemon/daemon.integration.test.ts:510:22
Installer Smoke (Windows)
Process completed with exit code 1.
Server Tests (unit + integration)
The job has exceeded the maximum execution time of 20m0s
Server Tests (unit + integration)
The operation was canceled.
Stack Tests (unit + integration)
The job has exceeded the maximum execution time of 20m0s
Stack Tests (unit + integration)
The operation was canceled.
Core E2E (fast, packages/tests, server-light, sqlite)
Process completed with exit code 1.
suites/core-e2e/sessionAgent.spawnActions.test.ts > core e2e: session-agent spawn actions > exposes session.spawn_new to session agents, honors Off settings, and forwards rich inherited spawn options: packages/tests/suites/core-e2e/sessionAgent.spawnActions.test.ts#L249
AssertionError: expected last "spy" call to have been called with [ ObjectContaining{…} ] - Expected + Received @@ -1,7 +1,7 @@ [ - ObjectContaining { + { "backendTarget": { "agentId": "claude", "kind": "builtInAgent", }, "connectedServices": { @@ -14,11 +14,10 @@ }, "v": 1, }, "connectedServicesUpdatedAt": 1700000000003, "directory": "/home/runner/work/happier/happier/.project/logs/e2e/2026-08-02T23-01-01-023Z-core-529442b5/session-agent-spawn-actions-91e1142c-9c99-4074-b833-2e6e28613cf3/workspace", - "initialPrompt": "Use inherited parent context.", "machineId": "machine-local", "mcpSelection": { "forceExcludeServerIds": [ "secret-env-server", ], @@ -27,10 +26,15 @@ ], "managedServersEnabled": false, "v": 1, }, "modelId": "claude-opus-parent", + "modelUpdatedAt": 1700000000002, + "pendingFirstInput": { + "localId": "spawn-first:48e8131792de3c55ea6a0c12cf81e4c59c47dd804819051131c54104fe0214c9", + "text": "Use inherited parent context.", + }, "permissionMode": "safe-yolo", "permissionModeUpdatedAt": 1700000000001, "profileId": "parent-profile", "sessionConfigOptionOverrides": { "overrides": { @@ -44,7 +48,8 @@ }, }, "updatedAt": 1700000000100, "v": 1, }, + "spawnNonce": "session.spawn_new:sess_parent_1d6ba028-ce9d-4d80-8ce9-809dd1fddd63:3", }, ] ❯ suites/core-e2e/sessionAgent.spawnActions.test.ts:249:34
suites/core-e2e/pendingQueue.socket.pendingChanged.test.ts > core e2e: pending queue v2 emits pending-changed socket updates > broadcasts pending-changed on materialize-next via socket RPC: packages/tests/suites/core-e2e/pendingQueue.socket.pendingChanged.test.ts#L165
AssertionError: expected false to be true // Object.is equality - Expected + Received - true + false ❯ suites/core-e2e/pendingQueue.socket.pendingChanged.test.ts:165:23
suites/core-e2e/executionRuns.review.triage.feat.execution.runs.e2e.test.ts > core e2e: execution runs (review) supports triage updates > emits review_findings.v2 meta and allows review.triage action overlay: packages/tests/src/testkit/timing.ts#L48
Error: Timed out waiting for condition ❯ waitFor src/testkit/timing.ts:48:9 ❯ waitForFakeClaudeObservedPrompt suites/core-e2e/executionRuns.review.triage.feat.execution.runs.e2e.test.ts:42:3 ❯ suites/core-e2e/executionRuns.review.triage.feat.execution.runs.e2e.test.ts:269:33
suites/core-e2e/directSessions.claude.browseTail.feat.sessions.direct.e2e.test.ts > core e2e: direct Claude sessions browse/link/tail > converts a linked direct Claude session to persisted mode and resumes it through the persisted runner: packages/tests/src/testkit/fakeClaude.ts#L147
Error: Timed out waiting for fake Claude invocation | logPath=/home/runner/work/happier/happier/.project/logs/e2e/2026-08-02T22-58-39-523Z-core-c0c941e1/direct-sessions-claude-takeover-persist/fake-claude.jsonl | exists=true | invocations=3 | matchesNow=false | last={"invocationId":"fake-claude-9f4d9d27-fc7c-426d-b4ae-96fa50662e10","mode":"local","argvHead":["--output-format","stream-json","--verbose","--max-turns","1","--print","hello"],"argvHasSettings":false} ❯ waitForFakeClaudeInvocation src/testkit/fakeClaude.ts:147:9 ❯ suites/core-e2e/directSessions.claude.browseTail.feat.sessions.direct.e2e.test.ts:443:35
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > keeps retrying web prepend index recovery until the original anchor remounts: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L7770
AssertionError: expected "spy" to be called 2 times, but got 0 times ❯ __vi_import_1__.withRenderedFlashListChatListWebScroller.initialFill sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7770:58 ❯ withFlashListChatListWebScrollerDom sources/dev/testkit/harness/chatListHarness.ts:922:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7752:13 ❯ withWebFlashListFakeTimers sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:239:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7705:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > recovers the captured web prepend item when scrollHeight growth overshoots the original viewport anchor: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L7668
AssertionError: expected "spy" to be called with arguments: [ +0 ] Number of calls: 0 ❯ __vi_import_1__.withRenderedFlashListChatListWebScroller.initialFill sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7668:54 ❯ withFlashListChatListWebScrollerDom sources/dev/testkit/harness/chatListHarness.ts:922:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7650:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > materializes the exact keyed web prepend row after grow-collapse commits without applying gross height growth: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L7547
AssertionError: expected "spy" to be called with arguments: [ { index: +0, animated: false } ] Received: 1st spy call: [ { "animated": false, "index": 0, + "viewOffset": 40, + "viewPosition": 0, }, ] Number of calls: 1 ❯ __vi_import_1__.withRenderedFlashListChatListWebScroller.initialFill sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7547:62 ❯ withFlashListChatListWebScrollerDom sources/dev/testkit/harness/chatListHarness.ts:922:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7527:13 ❯ withWebFlashListFakeTimers sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:239:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:7488:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > preserves the web viewport when older messages prepend above the current scroll position: apps/ui/sources/dev/testkit/transcript/viewportTelemetryAssertions.ts#L174
Error: WREG telemetry diagnostics missing required web pagination/restore fields: - missing firstVisibleAnchorTestId :: t=1785711639466 restore-decision mode=follow-bottom reason=restored offset=0 session=session:1 - missing firstVisibleAnchorTestId :: t=1785711639469 restore-decision mode=restore-anchor reason=pending session=session:1 - missing firstVisibleAnchorTestId :: t=1785711639470 restore-decision mode=restore-distance reason=restored session=session:1 ❯ Module.assertWebWregDiagnostics sources/dev/testkit/transcript/viewportTelemetryAssertions.ts:174:11 ❯ __vi_import_1__.withFlashListChatListWebScrollerDom.document.getElementById sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6653:17 ❯ Module.withFlashListChatListWebScrollerDom sources/dev/testkit/harness/chatListHarness.ts:922:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6611:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > shows the older-load spinner after the spinner delay while a user-triggered older load is in flight: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L6248
AssertionError: expected 2 to be +0 // Object.is equality - Expected + Received - 0 + 2 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6248:59 ❯ withWebFlashListFakeTimers sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:239:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6209:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > keeps older-load progress out of scrollable header geometry during prepend loading: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L6202
AssertionError: expected 2 to be +0 // Object.is equality - Expected + Received - 0 + 2 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6202:59 ❯ withWebFlashListFakeTimers sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:239:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6158:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > shows the older-load spinner when proactive prefetch is slow: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L6153
AssertionError: expected 2 to be +0 // Object.is equality - Expected + Received - 0 + 2 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6153:59 ❯ withWebFlashListFakeTimers sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:239:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:6109:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > keeps web first-visible diagnostics when viewport telemetry is enabled: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L5505
AssertionError: expected "spy" to be called with arguments: [ ObjectContaining{…} ] Received: 1st spy call: [ - ObjectContaining { - "firstVisibleAnchorTestId": "none", + { + "anchorCorrectionAttempt": undefined, + "anchorCorrectionTargetOffsetY": undefined, + "anchorDeltaPx": undefined, + "anchorIndex": undefined, + "anchorItemOffsetPx": undefined, + "anchorObservedItemOffsetPx": undefined, + "anchorRestoreViewOffset": undefined, + "coldCount": 1, + "contentHeight": 1200, + "distanceFromBottom": 0, + "domClientHeight": 600, + "domScrollHeight": 1200, + "domScrollTop": 600, + "flashListContentHeight": 1200, + "flashListLayoutHeight": 600, + "hotCount": 0, + "layoutHeight": 600, + "listImplementation": "flash_v2", + "mode": "follow-bottom", + "offsetY": 600, + "paginationPhase": "idle", + "paginationSuspendedReasons": [], + "pendingWebPrependAnchorKind": "none", + "platform": "web", + "programmaticWebWrite": false, + "reason": "observed", + "scrollable": false, + "sessionId": "session:1", + "timestampMs": 1785711603420, + "trigger": "scroll", "type": "scroll-observed", }, ] Number of calls: 1 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:5505:31
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx > ChatList (FlashList v2) > restores a native unpinned session after many intervening session opens without leaking another viewport: apps/ui/sources/components/sessions/transcript/ChatList.flashListV2.test.tsx#L3296
AssertionError: expected last "spy" call to have been called with [ { offset: 500, animated: false } ] - Expected: [ { "animated": false, "offset": 500, }, ] + Received: undefined ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:3296:36 ❯ withWebFlashListFakeTimers sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:239:16 ❯ sources/components/sessions/transcript/ChatList.flashListV2.test.tsx:3226:9
sources/components/sessions/transcript/ChatList.flashListV2.test.tsx: apps/ui/sources/dev/vitestSetup.ts#L214
Error: [vitest] timed out after 30000ms: closeUndiciGlobalDispatcherForTests ❯ Timeout.<anonymous> sources/dev/vitestSetup.ts:214:24
UI E2E (Playwright) / shard 1/3
The job has exceeded the maximum execution time of 45m0s
UI E2E (Playwright) / shard 1/3
The operation was canceled.
UI E2E (Playwright) / shard 3/3
The job has exceeded the maximum execution time of 45m0s
UI E2E (Playwright) / shard 3/3
The operation was canceled.
UI E2E (Playwright) / shard 2/3
The job has exceeded the maximum execution time of 45m0s
UI E2E (Playwright) / shard 2/3
The operation was canceled.
Installer Smoke (macOS)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Typecheck
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Server DB Contract (Postgres)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Shared Package Unit Tests
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Release Contracts
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
CLI Tests (unit + integration)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
CLI + Server (light/sqlite) E2E
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Installer Smoke (Windows)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Installer Smoke (Linux)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Server Tests (unit + integration)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Stack Tests (unit + integration)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Binary Smoke (isolated cwd)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Core E2E (fast, packages/tests, server-light, sqlite)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4, actions/upload-artifact@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
UI Tests (unit + integration)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
UI E2E (Playwright) / shard 1/3
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4, dorny/paths-filter@v3. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
UI E2E (Playwright) / shard 3/3
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4, dorny/paths-filter@v3. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
UI E2E (Playwright) / shard 2/3
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4, dorny/paths-filter@v3. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

Artifacts

Produced during runtime
Name Size Digest
core-e2e-artifacts-fast-sqlite
212 MB
sha256:6460aa1436de925bdadfcd4015afb99c10859a19d513bb0c99840939e9903b25