Compaction finalization proof — head df5f1cf284c6b0355b3699fc0a568c4389d8f924 Original PR focused suites: 384 passed across 3 files. Trimmed tests: 375 passed across 3 files; 4 PR-added behavior cases in 2 changed test files. Main production with trimmed tests: 5 failed, 370 passed. Restored production: 375 passed. 17265-tests-red.log note: You are running `vp test` as a Vite+ built-in command. If you meant to run the test npm script, use `vpr test` instead. RUN v5.0.1 /home/ubuntu/wt/codex-05 ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > Codex context usage compatibility > retains measured usage for reasoning-only changes in either direction 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > Codex context usage compatibility > invalidates usage for model, instance, context-window and unknown option changes 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 file change approvals > uses nonblank reasons before sorted file operations and renamed paths 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 file change approvals > falls back to a nonblank grant root and omits empty details 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 file change approvals > bounds large patch descriptions without losing the remaining count 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 context usage > uses the current context rather than cumulative processed tokens 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 assistant message streaming > makes accumulated assistant text visible after the bounded flush interval 11ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 assistant message streaming > coalesces multiple token deltas into one assistant update per interval 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 assistant message streaming > flushes buffered text synchronously before item and turn completion 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 assistant message streaming > retains buffered text until completion updates are emitted 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 assistant message streaming > can discard an empty completion without emitting an assistant update 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 assistant message streaming > treats explicit empty final text as authoritative over buffered deltas 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > derives concrete Codex turn policies from every T3 runtime mode 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > preserves explicit Codex turn policy overrides 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > sends MCP app model context as untrusted Codex context 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > adds default-mode developer instructions when the T3 MCP server is attached 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > omits default-mode collaboration settings without the T3 MCP server 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > adds T3 plan-mode developer instructions when the T3 MCP server is attached 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > keeps Codex in plan mode without referencing unavailable T3 MCP tools 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 runtime policy > compiles per-turn Codex model options and cwd from their owning inputs 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 process spawning > injects cwd, model, and MCP authorization into thread-scoped params 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 process spawning > resolves Windows command shims through the shared spawn policy 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 process spawning > uses direct execution for native executables 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 process spawning > launches the app-server with the configured launch arguments 3ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 process spawning > expands ~ in the configured binary path before spawning 20ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > keeps a failed Sky MCP call in Computer Use when its error has no metadata 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > preserves a bare js action's title and computer surface when inProgress without result metadata 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > preserves a bare js action's title and computer surface when completed without result metadata 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > preserves a bare js action's title and computer surface when failed without result metadata 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > uses the cua_repl call title while leaving other MCP titles as tool arguments 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > uses the node_repl call title while leaving other MCP titles as tool arguments 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > presents ordinary MCP calls when inProgress 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > presents ordinary MCP calls when completed 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > presents ordinary MCP calls when failed 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > uses Codex connector names without reading a display title from arguments 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > preserves native browser and app icons alongside MCP tool output 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > preserves MCP arguments and prefers structured output 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 dynamic tool projection > preserves namespaced dynamic tool output 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 native protocol logging > logs decoded app-server frames once with credentials redacted 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 native protocol logging > filters streaming frames before redaction without losing decode failures 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 native protocol logging > retains redacted failures when large payloads are summarized 2ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 rollback mapping > derives native rollback count from durable provider turns 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 fork boundary > resolves the selected provider turn to an inclusive native fork boundary 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 fork boundary > resolves the latest source turn to a native fork boundary without rollback 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 fork boundary > keeps the rollback-count fallback when the boundary turn lacks a native id 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 fork boundary > keeps the rollback-count fallback when the boundary turn has no native ref 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 fork boundary > forks at head without a boundary when no provider turn is selected 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 fork boundary > fails with a typed error when the selected source turn is missing 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 skill mentions > sends currency-sigil skill mentions as the $ mention Codex parses 1ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 background command detail > summarizes command, exit code, and output tail 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 background command detail > omits the output section and exit code when absent 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 background command detail > truncates long commands and keeps only the output tail 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 session initialize > sends one initialize when two threads start on a fresh session at once 23ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 session initialize > retries initialize after a failed handshake 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 session initialize > completes the handshake after a caller is interrupted mid-initialize 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > delivers native history with supported app-server protocol 13ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > delivers native history with unsupported app-server protocol 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > delivers native history with invalid app-server protocol 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > identifies sessions to Codex with the same client info as main 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > unsubscribes from the native thread when it is unloaded 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > keeps the app-server failure as the cause when an unload is rejected 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > waits for native start before interrupting an acknowledged queued turn 15ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles Stop when a queued native turn fails before starting 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > bounds Stop when a queued native turn never starts 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > sends currency-sigil skill mentions to Codex as $ mentions 7ms stdout | apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on failed without changing completed compaction [10:07:51.434] ERROR (#835): Error [AssertionError]: expected [ 'running' ] to deeply equal [ 'running', 'failed' ] at /home/ubuntu/wt/codex-05/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts:3273:18 { actual: [ 'running' ], expected: [ 'running', 'failed' ], showDiff: true, operator: 'deepStrictEqual', [cause]: undefined } ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > keeps an asynchronous Codex question actionable after the turn completes 35ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > stops asking for commands the user allowed for the session 17ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves T3 context on the wire and restores it after compaction 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > compacts Codex with the native RPC and completes the compaction turn 7ms stdout | apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on interrupted without changing completed compaction [10:07:51.452] ERROR (#864): Error [AssertionError]: expected [ 'running' ] to deeply equal [ 'running', 'interrupted' ] at /home/ubuntu/wt/codex-05/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts:3273:18 { actual: [ 'running' ], expected: [ 'running', 'interrupted' ], showDiff: true, operator: 'deepStrictEqual', [cause]: undefined } stdout | apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on Stop without changing completed compaction [10:07:51.466] ERROR (#893): Error [AssertionError]: expected [ 'running' ] to deeply equal [ 'running', 'interrupted' ] at /home/ubuntu/wt/codex-05/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts:3273:18 { actual: [ 'running' ], expected: [ 'running', 'interrupted' ], showDiff: true, operator: 'deepStrictEqual', [cause]: undefined } × apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on failed without changing completed compaction 34ms → expected [ 'running' ] to deeply equal [ 'running', 'failed' ] × apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on interrupted without changing completed compaction 9ms → expected [ 'running' ] to deeply equal [ 'running', 'interrupted' ] × apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on Stop without changing completed compaction 14ms → expected [ 'running' ] to deeply equal [ 'running', 'interrupted' ] ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > resumes a provider thread without requesting or decoding its history 10ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > recovers archived-session errors 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > recovers unarchive hints 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves missing-thread errors 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves missing-rollout errors 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves authentication errors 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves archived-workspace errors 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves unrelated archive-path errors 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > propagates unarchive missing-thread err… 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > propagates unarchive archived errors 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > propagates retry missing-thread errors 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > does not retry archived errors twice 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > continues an interrupted native thread with empty input and reasoning summaries 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > resolves retryable app-server errors on resumed provider activity 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > stamps Codex items with their own start time, not the turn's 10ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > retains Codex reasoning parts when the turn is completed 11ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > retains Codex reasoning parts when the turn is interrupted 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > streams a proposed plan a few times a second instead of once per delta 47ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > suppresses a trailing empty final answer after a non-empty final answer 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > streams text on the turn item and sends the message once, when it completes 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > suppresses a later streamed duplicate final answer 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > buffers an overlapping later final stream until duplicate detection 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves a sole empty final answer 32ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > suppresses a second empty final answer 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves an empty final answer when only commentary preceded it 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > suppresses an empty final answer after a non-empty unknown-phase answer 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > suppresses a trailing empty answer with an omitted phase 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > keeps a later non-empty final answer after an initial empty final answer 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > projects a post-settle background command completion and requests a continuation 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > stops a command after root completion when termination returns true 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > stops a command after root completion when termination returns false 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > stops a command after root completion when termination returns still_running 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > stops a command after root completion when termination returns thread_unloaded 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > interrupts a completed run's background command through orchestration 638ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > Stop ends a background command no Codex process tracks any more 509ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > does not request a continuation for a command that completes before settle 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > contains commands that start before and after the interrupt response 19ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > contains descendant commands and keeps Stop authoritative 13ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > terminalizes descendants before the root when an interrupt request fails 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles a failed root without waiting for subagents that keep running 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > terminalizes timed-out descendants before the root 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > interrupts descendants that start after the initial Stop snapshot 10ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > interrupts descendants discovered only by the final interrupt rescan 10ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > bounds interrupt settlement and drops late completion events 26ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > attempts every terminal and cleans up tracking when termination fails 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from usage evidence 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from rate evidence 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from ordinary evidence 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from notification evidence 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from replacement evidence 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from known-reset evidence 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from late-reset evidence 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from matching-details evidence 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from deferred-reset evidence 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > classifies Codex terminal failures from retry evidence 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > terminalizes running command items before turn.terminal on failed turns 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > captures an MCP app's resource and holds the turn open until it lands 12ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles a pending MCP app capture before a failed turn's terminal event 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > terminalizes leftover nonpersistent dynamic tools when a completed turn never closes them 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads current Codex Sol child metadata without using the parent model 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads current Codex wrong child child metadata without using the parent model 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads Sol child metadata without using the parent model 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads Fable child metadata without using the parent model 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads Astra child metadata without using the parent model 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads missing child metadata without using the parent model 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads invalid child metadata without using the parent model 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > reads wrong child child metadata without using the parent model 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > resumes child metadata after a failed read 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > resumes child metadata after a malformed read 18ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > resumes child metadata after a wrong child read 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > resumes child metadata after a blank model read 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > keeps thread/settings/updated child metadata when an older lookup finishes later 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > keeps model/rerouted child metadata when an older lookup finishes later 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > preserves a subagent result across a trailing empty final and resume 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > rejects duplicate child starts across parent runs 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent pendingInit without losing its lifecycle 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent running without losing its lifecycle 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent interrupted without losing its lifecycle 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent shutdown without losing its lifecycle 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent notFound without losing its lifecycle 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent errored without losing its lifecycle 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent completed without losing its lifecycle 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent activity-completed without losing its lifecycle 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent late-activity-completed without losing its lifecycle 4ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent stale-running without losing its lifecycle 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > normalizes subagent duplicate-completed without losing its lifecycle 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > fails honestly when rolling back a legacy Codex thread 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > falls back to fork-local thread/revert on paginated history when the source turn lacks a native reference 8ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > fails honestly when a legacy fork cannot honor a source turn without a native reference 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > propagates native thread/fork failures as typed fork errors 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > parses /goal like the Codex TUI 0ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > keeps a /goal run open across the turns Codex continues on its own 9ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > settles /goal pause with a reply instead of a native turn 5ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > settles a run held for the next goal turn when Stop arrives in between 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > moves a Stop that names an earlier goal turn to the turn Codex continued with 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > stops a held goal run's background command when Stop arrives between turns 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > moves Stop to a continuation Codex starts while the goal pause is in flight 6ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > stops a subagent an earlier goal turn left running when Stop settles the run 7ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > stops an earlier goal turn's subagent when the run settles during the pause 12ms ✓ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > native goals > pauses an active goal before Stop interrupts its turn 7ms ✓ apps/mobile/src/lib/threadActivity.test.ts > keeps historical plan detail accessible from its paged turn item 4ms ✓ apps/mobile/src/lib/threadActivity.test.ts > shows only the structured path in expanded mobile read details 3ms ✓ apps/mobile/src/lib/threadActivity.test.ts > expands a T3 Code notice to the prompt the agent got 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > labels file searches with the adapter title and its search target 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > keeps approval prompts rather than presenting them as tool work 2ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps async answers in question history instead of user bubbles 3ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > does not create a work group for a message and checkpoint 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > omits cached tool output and patch bodies from expanded and copied activity 2ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > expands tool rows only when they have detail or withheld output 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > recognizes automation attribution after projecting a user message 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps the sender of an agent message distinct from its timeline source 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > anchors feedback before later committed turns 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps prominent activity visible while it is running 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps provider notices visible outside completed work folds without failure styling 2ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > presents a usage-limit stop as a warning while preserving its explanation 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > presents transport_error retries and clears warning markers on recovery 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > presents usage_limit retries and clears warning markers on recovery 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > omits pending task progress without hiding adjacent conversation items 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > omits running task progress without hiding adjacent conversation items 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > omits completed task progress without hiding adjacent conversation items 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > hides synthetic workspace preparation activity 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > does not treat a queued-only run as live feed activity 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > adds queued input only after dispatch creates its turn item 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > hides the interruption request and keeps the terminal result 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > preserves authoritative V2 order instead of sorting reconstructed collections 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps adjacent work from different V2 attempts in separate groups 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > retains inherited and synthetic rows with their original projected identity 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps orchestration relationship cards visible when a completed run is folded 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps opening and final assistant messages around the first hidden work 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > does not fold a response that only has opening and final messages 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > folds subagents while keeping created-thread and fork cards visible 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps a settled run's still-running subagents visible while its other work folds 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > folds settled V2 run work while keeping the terminal assistant message visible 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps an active run expanded and detects failures from completed command output 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > folds each run of a provider-native subagent thread like a normal turn 4ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps imported V1 turns folded once the thread's first V2 run starts 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps a provider-native subagent's runless tool call live while it works 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps a runless tail folded while a normal thread waits for its sent run 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > waits for workspace preparation before showing provider activity 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > does not show Thinking once the open run's provider turn has ended 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > uses a stable Thinking row while work has started without a projected item 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > keeps expanded work in one group with stable row identities 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > a lone call > is its own row, with no group header to open first 3ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > a lone call > offers no disclosure when it has nothing to show 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > a lone call > holds the live slot until a second call makes it a group 2ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > retains Claude Read image previews without tool output 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > pretty prints T3 MCP dynamic tool activities and attaches the product logo 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > uses the cua_repl.js action title in the mobile feed 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > uses the node_repl.js action title in the mobile feed 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > uses the js action title in the mobile feed 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > recovers the retained js title and failed call icon 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > recovers the retained js title and completed call icon 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > uses canonical T3 orchestration summaries in compact work groups 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > buildThreadFeed > presents project calls and summarizes successful clones through the mobile feed 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > retains unchanged rows while the assistant streams 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > uses the compaction row as the live activity only while running 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > uses the compaction row as the live activity only while completed 0ms × apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > uses the compaction row as the live activity only while failed 23ms → expected { type: 'activity-group', …(4) } to match object { Object (activities) } (34 matching properties omitted from actual) × apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > uses the compaction row as the live activity only while interrupted 1ms → expected { type: 'activity-group', …(4) } to match object { Object (activities) } (34 matching properties omitted from actual) ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps a running handoff separate from commands and visible through folds 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps a completed handoff separate from commands and visible through folds 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps a failed handoff separate from commands and visible through folds 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps a standalone compaction visible and folds it with other completed work 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > retains assistant image attachments from the wire 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps native application icons and source identity in collapsed and expanded work 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps failed calls terminal while the parent run remains live 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps cancelled calls terminal while the parent run remains live 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > folds matched direct delegations without hiding pending, failed or unmatched calls 2ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > folds matched structured delegations without hiding pending, failed or unmatched calls 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > folds matched text delegations without hiding pending, failed or unmatched calls 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > keeps subagents from different provider turns in separate cards 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > groups only adjacent subagents in the same run, keeping their child links 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > shows an idle native subagent without claiming completion 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > subagent continued by a later turn > keeps each turn's fold between its own prompt and answer 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > subagent continued by a later turn > keeps a wake run's work open when the user steers it 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > pending user input answers > preserves exact editor text, including a deliberately cleared answer 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > pending user input answers > replaces single-select options and toggles multi-select options 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > pending user input answers > builds array answers for multi-select questions 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > pending user input answers > clears selected options while a custom answer is active 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > pending user input answers > matches selected chips against normalized option labels 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > provider question values > submits raw option values and distinguishes duplicate labels 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > provider question values > rejects arbitrary text when the provider only accepts offered options 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > accepts ready attachment-only answers while preserving selected options 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > makes attachment-only question answers expandable in the mobile feed 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > renders automatic completion as a neutral activity while retaining its details 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > uses a compact reasoning preview and a short expanded heading 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > caps one-line work-log labels for multi-kilobyte commands 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > keeps search output in expanded details rather than the compact label 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > previews live reasoning text "First paragraph.\n\nSecond paragraph." 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > previews live reasoning text "" 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > keeps the latest thought under the live tool status 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > stops stranded thinking after a steer and follows the next thought or tool 2ms ✓ apps/mobile/src/lib/threadActivity.test.ts > previews a settled thought in its collapsed header and labels its expanded header 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > keeps a historical provider_error failure and preceding work visible without disclosures 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > keeps a historical usage_limit failure and preceding work visible without disclosures 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > html renders > shows a completed render in place, outside the work log 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > html renders > keeps a render visible and in order when its run folds 0ms ✓ apps/mobile/src/lib/threadActivity.test.ts > html renders > leaves running, failed and errored renders in the work log 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > MCP apps > hosts a completed app in place of its tool row, owned by its source item 1ms ✓ apps/mobile/src/lib/threadActivity.test.ts > MCP apps > keeps a running app call an ordinary work row 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > preserves command failure state after removing displayed output: {"outputIndicatesFailure":true} 4ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > preserves command failure state after removing displayed output: {"exitCode":2} 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > preserves command failure state after removing displayed output: {"output":"sh: missing-command: command not found"} 1ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > preserves command failure state after removing displayed output: {"output":"Found 3 matches"} 1ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > preserves command failure state after removing displayed output: {"output":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx command not found"} 1ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > preserves command failure state after removing displayed output: {} 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > ignores failure phrases in reasoning text 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > is true for error tone 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > is true when lifecycle says failed even if detail is empty 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > detects file-not-found style tool output with completed lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > detects glob no files and PowerShell command errors 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > is false for successful completed tools 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > does not treat error text in a command as rendered failure 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > treats successful tool rows as success candidates 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryIndicatesToolFailure > does not run heuristics on non-tool info rows 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > summarizeToolGroup > excludes reasoning from mixed tool counts and icons 2ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > summarizeToolGroup > counts created threads alongside adjacent commands 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > summarizeToolGroup > deduplicates named sources ahead of ordinary actions 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > summarizeToolGroup > uses the displayed source names for integration plurality: ["Foo","Foo"] 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > summarizeToolGroup > uses the displayed source names for integration plurality: ["Foo","Bar","Foo"] 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > summarizeToolGroup > omits the integration suffix for special browser and computer sources 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > summarizeToolGroup > names Computer Use once when native-app and fallback sources share its label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > presents and summarizes every T3 tool using the same structured identity 17ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_project_list through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_project_clone through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_project_create through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_thread_launch through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_queue_edit through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_pending_request_respond through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_thread_configure through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_thread_fork through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_thread_send_attachments through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels run_scheduled_task_now through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels t3_workflow_stop through its lifecycle 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > summarizes workflow stop targets separately from their parent thread 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > summarizes project tools from MCP arguments and results without claiming failed effects 1ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > does not summarize a foreign structured identity as T3 work 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > shows returned MCP errors as failures even in the live activity row 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > recognizes browser tool names across providers: mcp__t3-code__preview_click 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > recognizes browser tool names across providers: mcp__t3_code__preview_click 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > recognizes browser tool names across providers: mcp__t3code__preview_click 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > recognizes browser tool names across providers: T3-code.preview_click 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > recognizes browser tool names across providers: t3-code · preview_click completed 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > recognizes browser tool names across providers: t3_code/preview_click 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > recognizes browser tool names across providers: preview_click 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > labels device tools with the device icon 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > uses structured MCP identity when the provider supplies a custom title 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > describes the tool's own inProgress state 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > describes the tool's own completed state 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > describes the tool's own failed state 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > describes the tool's own declined state 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > describes the tool's own stopped state 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > describes the tool's own unknown state 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > uses the summary's state only when the provider omitted a lifecycle status 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > preserves verb forms and the rest of preview_type's label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > preserves verb forms and the rest of preview_set_appearance's label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > preserves verb forms and the rest of preview_snapshot's label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > preserves verb forms and the rest of preview_recording_stop's label 2ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > preserves verb forms and the rest of t3_thread_read's label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > preserves verb forms and the rest of t3_thread_send's label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > preserves verb forms and the rest of t3_worktree_handoff's label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > keeps T3 branding for non-browser tools and falls back to the original tool label 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveWorkEntryToolPresentation > does not brand unknown tools or another server's matching tool name 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > browser group summaries > counts 1 browser calls separately from generic tools 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > browser group summaries > counts 18 browser calls separately from generic tools 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > browser group summaries > combines command and browser counts in a single sentence 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > browser group summaries > preserves first-seen action ordering alongside non-browser tools 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > browser group summaries > recognizes Claude browser identity without treating script metadata as a shell command 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > browser group summaries > keeps foreign tools and web searches out of the browser count 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > browser group summaries > keeps browser screenshots in the browser count while preserving their image path 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > command work-log details > extracts Claude result blocks and projected output 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > command work-log details > only removes a detail with the matching tool-name prefix 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > command work-log details > treats an ingestion-truncated echo of a long command as a repeat 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > command work-log details > treats ACP command echoes as synthetic even without a tool kind 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryViewedImagePath > returns a single image path from supported read entries 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > workEntryViewedImagePath > rejects non-image, multi-line, and non-read details 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > toolGroupAction > groups legacy Claude image reads with other reads 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > toolGroupAction > groups Claude Read and Grep from toolName, not file contents 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveViewedImageAsset > serves t3 attachment paths in place like any other host path 1ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > resolveViewedImageAsset > normalizes workspace image sources 1ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > recognizes the native linking tool: mcp__t3-code__link_pull_request 1ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > recognizes the native linking tool: mcp__t3_code__link_pull_request 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > recognizes the native linking tool: T3-code · link_pull_request 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > recognizes the native linking tool: t3code/link_pull_request 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > recognizes the native linking tool: link_pull_request 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > describes the target and inProgress status 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > describes the target and completed status 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > describes the target and failed status 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > describes the target and declined status 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > describes the target and stopped status 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > recognizes unlink targets supplied as repository and number 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > pull request tool presentation > summarizes native PR work separately from ordinary tools and integration metadata 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > device group summaries > recognizes device_list as device controls 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > device group summaries > recognizes device_open as device controls 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > device group summaries > recognizes device_screenshot as device controls 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > device group summaries > recognizes device_close as device controls 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > device group summaries > summarizes device calls alongside shell commands 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > device group summaries > recognizes Claude tool names and preserves screenshot previews 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > device group summaries > does not classify another server's tools as T3 device controls 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > liveThoughtLine > keeps the first sentence, including a closing quote 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > liveThoughtLine > does not cut at dots inside file names or long dashes 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > liveThoughtLine > uses a bold-only opening line as the whole line 0ms ✓ packages/client-runtime/src/work-log/presentation.test.ts > liveThoughtLine > returns unpunctuated text whole and flattens markdown 0ms ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 5 ⎯⎯⎯⎯⎯⎯⎯ FAIL apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > uses the compaction row as the live activity only while failed AssertionError: expected { type: 'activity-group', …(4) } to match object { Object (activities) } (34 matching properties omitted from actual) - Expected + Received { "activities": [ { - "summary": "Context compaction failed", + "summary": "Context compacted 899K → 19K tokens", }, ], } ❯ apps/mobile/src/lib/threadActivity.test.ts:1771:65 1769| ); 1770| expect(rows.some((row) => row.type === "thinking")).toBe(status … 1771| expect(rows.find((row) => row.type === "activity-group")).toMatc… | ^ 1772| activities: [ 1773| { ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/5]⎯ FAIL apps/mobile/src/lib/threadActivity.test.ts > retained v2 feed presentation > uses the compaction row as the live activity only while interrupted AssertionError: expected { type: 'activity-group', …(4) } to match object { Object (activities) } (34 matching properties omitted from actual) - Expected + Received { "activities": [ { - "summary": "Context compaction stopped", + "summary": "Context compacted 899K → 19K tokens", }, ], } ❯ apps/mobile/src/lib/threadActivity.test.ts:1771:65 1769| ); 1770| expect(rows.some((row) => row.type === "thinking")).toBe(status … 1771| expect(rows.find((row) => row.type === "activity-group")).toMatc… | ^ 1772| activities: [ 1773| { ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/5]⎯ FAIL apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on failed without changing completed compaction AssertionError: expected [ 'running' ] to deeply equal [ 'running', 'failed' ] - Expected + Received [ "running", - "failed", ] ❯ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts:3273:18 3271| ); 3272| const status = outcome === "failed" ? "failed" : "interrupte… 3273| assert.deepEqual( | ^ 3274| unfinished.map((item) => item.status), 3275| ["running", status], ❯ IteratorImpl.~effect/Effect/successCont node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1422:28 ❯ ExitPrimitive.~effect/Effect/evaluate node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/core.ts:585:30 ❯ FiberImpl.runLoop node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:654:41 ❯ FiberImpl.evaluate node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:595:23 ❯ FiberImpl.evaluate node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:589:27 ❯ Array. node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1159:17 ❯ doneUnsafe node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/Deferred.ts:1707:17 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/5]⎯ FAIL apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on interrupted without changing completed compaction FAIL apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts > CodexAdapterV2 post-settle continuation > settles unfinished compaction on Stop without changing completed compaction AssertionError: expected [ 'running' ] to deeply equal [ 'running', 'interrupted' ] - Expected + Received [ "running", - "interrupted", ] ❯ apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts:3273:18 3271| ); 3272| const status = outcome === "failed" ? "failed" : "interrupte… 3273| assert.deepEqual( | ^ 3274| unfinished.map((item) => item.status), 3275| ["running", status], ❯ IteratorImpl.~effect/Effect/successCont node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1422:28 ❯ ExitPrimitive.~effect/Effect/evaluate node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/core.ts:585:30 ❯ FiberImpl.runLoop node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:654:41 ❯ FiberImpl.evaluate node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:595:23 ❯ FiberImpl.evaluate node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:589:27 ❯ Array. node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1159:17 ❯ doneUnsafe node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/Deferred.ts:1707:17 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/5]⎯ Test Files 2 failed | 1 passed (3) Tests 5 failed | 370 passed (375) Start at 10:07:40 Duration 15.37s (transform 55%, import 27%, tests 16%, setup 2%) Transform transforming modules took 8.13s · 55% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns 17265-implementation-tests.log note: You are running `vp test` as a Vite+ built-in command. If you meant to run the test npm script, use `vpr test` instead. RUN v5.0.1 /home/ubuntu/wt/codex-05 Test Files 3 passed (3) Tests 375 passed (375) Start at 10:11:23 Duration 14.98s (transform 54%, import 28%, tests 16%, setup 2%) Transform transforming modules took 7.85s · 54% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns 17265-implementation-lint.log note: You are running `vp lint` as a Vite+ built-in command. If you meant to run the lint npm script, use `vpr lint` instead. apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1383:7: warning eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. help: Consider removing this declaration. apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1622:7: warning eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. help: Consider removing this declaration. Independent Opus/Sol full-diff review: one round, no blocking findings. Scoped server/client-runtime typechecks passed. No live authenticated Codex compaction or native mobile/desktop proof. Browser fixture attempt did not yield usable visual evidence.