Updated 1 path from 5db26da

 RUN  v3.2.4 /lossless-claw

 ✓ test/engine.test.ts > LcmContextEngine metadata > reports the registered lossless-claw engine id 191ms
 ✓ test/engine.test.ts > LcmContextEngine metadata > advertises ownsCompaction capability 38ms
 ✓ test/engine.test.ts > LcmContextEngine metadata > requires the full native host lifecycle for agent runs 41ms
 ✓ test/engine.test.ts > LcmContextEngine metadata > requires host thread bootstrap projection for subagent forks 39ms
 ✓ test/engine.test.ts > LcmContextEngine metadata > configures file-backed sqlite connections with WAL and busy_timeout 7ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > skips bootstrap for ignored sessions while bootstrapping included sessions 166ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > skips ingest for ignored sessions while storing included sessions 47ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > skips ingestBatch for ignored sessions while storing included sessions 44ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > skips afterTurn for ignored sessions while persisting included sessions 85ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > passes through assemble for ignored sessions while assembling included sessions from LCM 76ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > skips compact for ignored sessions while compact still evaluates included sessions 56ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > skips prepareSubagentSpawn for ignored sessions while creating grants for included sessions 46ms
 ✓ test/engine.test.ts > LcmContextEngine ignored sessions > skips onSubagentEnded for ignored sessions while cleaning up included child grants 43ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > skips leaked assistant runtime context messages through direct ingest 34ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > skips leaked assistant runtime context messages without creating a conversation 36ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > keeps real assistant replies after skipping leaked runtime context 42ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > skips leaked runtime context content blocks during afterTurn 55ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > skips leaked runtime context imported from bootstrap transcripts 47ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > skips leaked runtime context in append-only bootstrap transcript recovery 80ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > keeps user-authored messages even when they quote the runtime context prefix 39ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > keeps system and tool messages even when they contain the runtime context sentinel 44ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > keeps ordinary assistant messages that mention the runtime context phrase later 40ms
 ✓ test/engine.test.ts > LcmContextEngine OpenClaw runtime context leak filter > keeps assistant messages that start with runtime context wording without the full sentinel 38ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > matches stateless patterns on sessionKey and can be disabled globally 64ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > skips bootstrap persistence for stateless session keys 85ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > skips ingest and ingestBatch writes for stateless session keys 40ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > skips ingest for assistant messages with error/aborted stop reasons and empty content 44ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > allows assemble reads for stateless session keys 42ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > skips afterTurn and compact writes for stateless session keys 39ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > skips delegated grant writes for stateless session keys 38ms
 ✓ test/engine.test.ts > LcmContextEngine stateless sessions > skips subagent cleanup for stateless child session keys 33ms
 ✓ test/engine.test.ts > ConversationStore session reuse > reuses conversation across session resets when sessionKey matches 35ms
 ✓ test/engine.test.ts > ConversationStore session reuse > does not resolve archived conversations through active session lookup 37ms
 ✓ test/engine.test.ts > LcmContextEngine before_reset lifecycle > prunes fresh-tail messages and low-depth summaries on /new 56ms
 ✓ test/engine.test.ts > LcmContextEngine before_reset lifecycle > keeps all context items on /new when retain depth is -1 45ms
 ✓ test/engine.test.ts > LcmContextEngine before_reset lifecycle > drops fresh-tail messages but keeps all summaries on /new when retain depth is 0 40ms
 ✓ test/engine.test.ts > LcmContextEngine before_reset lifecycle > archives the prior active conversation and creates a fresh active row on /reset 39ms
 ✓ test/engine.test.ts > LcmContextEngine before_reset lifecycle > creates a fresh active conversation on /reset when none exists yet 37ms
 ✓ test/engine.test.ts > LcmContextEngine before_reset lifecycle > treats repeated /reset on an already fresh conversation as a no-op 37ms
 ✓ test/engine.test.ts > LcmContextEngine session_end lifecycle > ignores session_end new so /new stays a prune-in-place flow 36ms
 ✓ test/engine.test.ts > LcmContextEngine session_end lifecycle > ignores session_end restart so gateway lifecycle does not orphan conversation history 37ms
 ✓ test/engine.test.ts > LcmContextEngine session_end lifecycle > ignores session_end shutdown so gateway lifecycle does not orphan conversation history 36ms
 ✓ test/engine.test.ts > LcmContextEngine session_end lifecycle > archives the prior active conversation and creates a fresh active row on idle rollover 37ms
 ✓ test/engine.test.ts > LcmContextEngine session_end lifecycle > archives the active conversation without replacement on deleted session_end 37ms
 ✓ test/engine.test.ts > LcmContextEngine session_end lifecycle > treats session_end reset after before_reset as a no-op on the fresh replacement row 37ms
 ✓ test/engine.test.ts > LcmContextEngine delegated session continuity > prepares subagent spawn from an existing conversation found by sessionKey 32ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > stores string content as-is 43ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > flattens text content block arrays to plain text 36ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > extracts only text blocks from mixed content arrays 38ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > stores empty string for empty content arrays 37ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > falls back to JSON.stringify for non-array, non-string content 41ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > roundtrip stores plain text, not JSON content blocks 40ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > intercepts oversized <file> blocks and persists large file metadata 151ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > keeps <file> blocks inline when below the large-file threshold 41ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes oversized plain user text as a raw payload 59ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > keeps plain user text inline when below the raw-payload threshold 77ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes oversized non-file non-tool raw payloads 99ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > does not externalize assistant tool or reasoning blocks generically 48ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > stores externalized inline images under largeFilesDir 75ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes native user image blocks before raw payload fallback 76ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes native assistant image blocks before raw payload fallback 44ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes native tool-result image blocks instead of persisting them inline 65ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes native system image blocks instead of falling through to raw-system-payload 43ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > still externalizes large mixed-content messages that embed an image reference alongside oversized text 60ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > infers extensions for heic, avif, and bmp native image blocks 57ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes oversized tool-result payloads into large_files 81ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes oversized plain-text tool-result blocks from live exec-style messages 65ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes structured tool-result image payloads before text externalization 55ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > externalizes string-content tool-result images without converting them to text files 50ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > lists summarized externalized tool results as transcript GC candidates 68ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > maintain() defers transcript GC until host-approved background maintenance 97ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > maintain() skips transcript GC when transcriptGcEnabled is false 43ms
 ✓ test/engine.test.ts > LcmContextEngine.ingest content extraction > serializes recycled session writes by stable sessionKey 82ms
 ✓ test/engine.test.ts > LcmContextEngine connection lifecycle > keeps shared sqlite handle open while another engine instance is active 57ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > imports only active leaf-path messages from SessionManager context 59ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > is idempotent and does not duplicate already bootstrapped sessions 58ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not rewrite prior assistant transcript rows when bootstrap re-instantiates a conversation 104ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > keeps fresh tool-only rows after dropping a replayed assistant prefix 92ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > keeps legitimate repeated assistant text when the ordering does not match a prior replay 110ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > keeps the replay flood guard active for user-leading append-only replay batches 104ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > skips reopening the transcript when checkpoint stats match 54ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > preserves ordinary bootstrap behavior when no checkpoint exists 59ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > preserves existing conversation data when the session file rotates 87ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > preserves conversation history when the session file rotates across a stable sessionKey 77ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > rotates to a fresh conversation when a stable sessionKey resumes on a new transcript after the old file disappears 73ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > rotates before assemble when a stable sessionKey points at a pruned transcript 74ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > preserves the active conversation when the tracked transcript stat fails for a non-missing reason 66ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not reapply bootstrapMaxTokens after session file rotation 74ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > rotates the current transcript in place without replacing the conversation 123ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > summarizes raw context outside the fresh tail before rotating the transcript 237ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > records rotate summary auth failures in the compaction circuit breaker 130ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > scopes rotate summarization spend guards per session 105ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > returns rotate unavailable when summarization spend backoff opens 76ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > reconciles unimported transcript messages before rotate summary coverage 130ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > imports checkpoint-missing transcript history before rotate summary coverage 128ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > refuses to rotate when transcript reconciliation has no safe overlap 43ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > takes the rotate backup after covering transcript-only rows and before rewrite 135ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > uses stored compaction telemetry to summarize raw context before automatic rotate 102ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > waits for an in-flight managed transaction before backing up and rotating 111ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > reports rotate as unavailable when the session transcript cannot be read 44ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > defers oversized session-file rewrites from afterTurn runtime hooks 77ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not directly auto-rotate session files during background maintenance 71ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not rewrite oversized session files from maintain runtime checks 71ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > leaves below-threshold session files alone while logging the decision 66ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > skips ignored, stateless, and untracked runtime sessions 46ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > startup scan rotates oversized active conversations with checkpointed files 115ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > startup scan ignores stale active LCM conversations outside indexed candidates 145ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > startup scan logs one compact summary for quiet skips 131ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > startup batch creates one pre-rotation backup for multiple rotations 216ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not repeatedly rewrite oversized transcripts during runtime deferral 75ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > reconciles missing tail messages when JSONL advanced past LCM 63ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > imports appended tail messages without replaying full reconciliation 59ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > falls back to full reconciliation when append-only suffix overlaps persisted history 74ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > blocks bounded no-anchor imports that are mostly already persisted history 84ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > imports the new tail when a same-path shrink keeps an already-persisted prefix 84ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > keeps the append-only fast path after heartbeat pruning changes the DB frontier 106ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > ignores non-message envelopes in appended transcript tails without forcing reconcile 89ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > tolerates custom bootstrap sidecar entries in append-only suffixes 61ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > refreshes the bootstrap checkpoint after afterTurn heartbeat pruning 90ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > refreshes the bootstrap checkpoint after a normal afterTurn before the next append-only bootstrap 69ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > reconciles foreground transcript messages before assistant-only afterTurn deltas 83ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > falls back to full reconciliation when append-only checkpoint validation mismatches 68ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > reconciles missing structured tool-call tail when prior empty tool content exists 68ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > bootstraps a bounded same-path transcript epoch after the file shrinks 65ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > blocks same-path shrink import when raw ids belong to another active conversation 85ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > imports the full bounded same-path shrink epoch instead of trusting a stale externalized frontier 65ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > imports a full same-path shrink epoch when new content repeats an old frontier message 69ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not append JSONL when no overlapping anchor exists in LCM 67ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not advance the bootstrap checkpoint when reconcile aborts at the import cap 110ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > uses the live ingest path for initial bootstrap 63ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > externalizes oversized file blocks during first-time bootstrap and still reconciles later tail messages 73ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > externalizes inline images during first-time bootstrap 55ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > externalizes oversized tool results during first-time bootstrap 62ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > limits first-time bootstrap imports to the newest messages within bootstrapMaxTokens 52ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > bounds forked child bootstrap and assembly even when the host transcript contains a raw parent branch 110ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > drops an oversized singleton bootstrap tail that exceeds bootstrapMaxTokens 45ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > does not return raw fork history when a forked oversized bootstrap tail imports no messages 52ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > streams JSONL replay and skips malformed lines while keeping later messages 109ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > prepareSubagentSpawn resolves parent conversation by sessionKey before UUID backfill 42ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > skips full read when file is unchanged and conversation is already bootstrapped 61ms
 ✓ test/engine.test.ts > LcmContextEngine.bootstrap > file-level cache guard allows full read when file changes 59ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > strips assistant prefill tails when no DB conversation exists 38ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > falls back when DB context clearly trails live context 40ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > assembles context from DB when coverage exists 51ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > adds raw prompt-recall matches when summary-covered history omits an exact memory key 73ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > adds prompt-recall sentence context before a requested key 60ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > skips prompt-recall matches when the cue would exceed the assembly budget 68ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > drops prompt-recall when volatile live input needs the remaining budget 103ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not add prompt-recall when volatile live input already mentions the requested key 57ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > drops prompt-recall before evicting assembled context for volatile live input 73ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not add prompt-recall when the active summary already carries the exact fact 61ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > uses summary-backed recall when the fact is outside a realistic fresh tail 100ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not add prompt-recall when an active summary already mentions the requested key 56ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not add prompt-recall when a newer raw tail already mentions the requested key 56ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not recall substring or secret-shaped identifiers 202ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not add prompt-recall snippets that include unrelated sensitive material 59ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not add prompt-recall snippets that include underscore provider tokens 60ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > continues prompt-recall search past filtered newer matches 78ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > recalls multiple requested identifiers from the same historical message 63ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > changes the projection fingerprint when prompt-recall cue content changes 65ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > bounds prompt-recall searches to four full-text identifier lookups 63ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > continues with assembled DB context when optional prompt recall lookup fails 71ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > logs the emitted context projection epoch 187ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > keeps projection epochs stable across raw tail growth and changes them for summaries 162ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > changes projection epochs when active focus state changes 259ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > respects token budget in assembled output 87ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > falls back to live messages if assembler throws 52ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > falls back to live context when assembled result has no user turns (cold-cache new session) 41ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not fall back when assembled result has user turns even if it ends with assistant 83ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > drops orphan tool results during assembled transcript repair 62ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > inserts synthetic tool results when fresh-tail tool calls have no result 46ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > drops older orphaned assistant tool calls instead of surfacing synthetic repair results 60ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > preserves non-tool content and matched tool calls when older assistant turns have stale orphaned calls 71ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > assemble forwards fresh-tail and prompt-aware options 48ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > bounds previous assembled prefix snapshots with LRU eviction 454ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > logs previous and current divergence message summaries when assembled prefixes change 44ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > adds compact overflow diagnostics to stressed assemble debug logs 52ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > repairs OpenAI function_call transcripts without dropping reasoning blocks 53ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > filters assistant messages with blank-text content during assembly 52ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > filters thinking-only assistant messages during assembly 49ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > rebuilds raw function_call blocks from stored columns when raw arguments are objects 46ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not emit assembly-specific system prompt guidance when no summaries exist 44ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > does not emit assembly-specific system prompt guidance when summaries are present 45ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble canonical path > escapes summary XML text so persisted content cannot break out of the untrusted wrapper 51ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > normalizes tool_result blocks without inflating stored token accounting 50ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > preserves structured toolResult content via message_parts and assembler 49ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > does not leak OpenAI function tool payloads into stored message content fallbacks 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > preserves toolName through ingest-assemble round-trip for Gemini compatibility 46ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > preserves toolResult error state through ingest-assemble round-trip 49ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > preserves top-level tool metadata for string-content tool results 46ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > preserves top-level reasoning_content for assistant tool-call replay 47ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > reconstructs OpenAI reasoning and function call blocks when raw metadata is missing 51ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > skips unknown roles instead of storing them as assistant messages 35ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > uses explicit compact tokenBudget over legacy tokenBudget 51ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > ingests completed turn batches with ingestBatch 45ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > skips heartbeat turn batches in ingestBatch 50ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn ingests auto-compaction summary and new turn messages 408ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn deduplicates replayed history before prepending auto-compaction summary 104ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn skips new-message content already covered by auto-compaction summary 51ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn does not drop short messages just because they appear in auto-compaction summary 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn keeps a 24+ char user message that only collides as a substring of the summary narrative (F6) 51ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn drops a user message when the summary ends with that exact content (F6 anchored) 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn runs inline threshold compaction only after context threshold is crossed 56ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn runs inline threshold compaction when projected raw backlog crosses threshold 55ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn records deferred threshold debt when projected raw backlog crosses threshold 56ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn ignores raw leaf pressure below the context threshold 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn resolves tokenBudget from runtimeContext and forwards it as legacyParams 62ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn keeps the bootstrap checkpoint stale and records retry debt when inline threshold compaction fails 57ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn waits for inline threshold compaction before completing 76ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn falls back to the default token budget when no budget is provided 46ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn falls back to legacyCompactionParams when runtimeContext is missing 44ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn prefers runtimeContext when both runtimeContext and legacyCompactionParams are set 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn prefers runtimeContext.currentTokenCount for compaction decisions 49ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn falls back to local message token estimates when runtimeContext.currentTokenCount is absent 45ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn records deferred threshold debt instead of compacting inline by default 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn evaluates threshold compaction when ingestBatch is empty 49ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn skips compaction work when ingestBatch is empty AND conversation is below threshold 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn schedules a deferred threshold drain even when compactionTelemetry has no provider/model 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn caps the transcript-reconcile slow path to one full re-read per session+file (F7) 76ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn treats missing tracked transcripts as a cheap degraded path without full reread 129ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > seeds placeholder bootstrap_state when afterTurn stat-fail fallback runs (#649 follow-up) 86ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > bootstrap imports a bounded path-mismatched transcript with no old anchor as a new epoch 72ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > bootstrap preserves a long-lived checkpoint when a rotated transcript is only delivery audit traffic 85ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > bootstrap imports real path-mismatched user turns that mention config audit 58ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > bootstrap fails closed on ambiguous runtime rollover while the old transcript still exists 62ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > isolates cron runs that reuse a stable sessionKey while preserving prior runs 74ms
 × test/engine.test.ts > LcmContextEngine fidelity and token budget > isolates cron sessionKey rollover during afterTurn transcript reconcile 394ms
   → expected [] to deeply equal [ Array(2) ]
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn fails closed on ambiguous runtime rollover while the old transcript still exists 214ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble falls back to live messages on ambiguous runtime rollover while the old transcript still exists 189ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn reconciles a path-mismatched no-anchor transcript before oversized delta dedup 211ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn preserves continuity when a path-mismatched transcript is only delivery audit traffic 195ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn archives a stale active conversation when the prior keyed transcript was pruned 219ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn skips assistant-only rollover when the replacement transcript is unreadable 59ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn bounds initial transcript imports to the bootstrap budget 61ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn skips persistence when full reread finds no anchor and imports nothing 75ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn imports a bounded same-path transcript epoch after the file shrinks 77ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn imports the full bounded same-path shrink epoch instead of trusting a stale externalized frontier 120ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn imports a full same-path shrink epoch when new content repeats an old frontier message 80ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn keeps the old checkpoint when a path-mismatched no-anchor import is capped 111ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn retries a capped reconcile when the transcript file changed with an append-only-ineligible suffix (F7) 77ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn drains deferred threshold debt in the background without cache telemetry 113ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > background deferred drain leaves threshold debt durable when the session is busy 41ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() leaves deferred threshold debt pending until the host opts in 40ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() consumes deferred threshold debt when the host opts in 44ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() clears stale legacy non-threshold debt when threshold no longer applies 44ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() revalidates legacy non-threshold debt as threshold work when still over threshold 42ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() keeps threshold debt pending when compaction fails 42ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() keeps threshold debt pending when the auth circuit breaker is open 44ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() backs off deferred threshold debt after non-auth compaction failures 68ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() keeps threshold debt pending when partial compaction remains over target 50ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() backs off after partial deferred compaction still exceeds target 50ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() stops model-backed deferred compaction at the summary call cap 56ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > compact() is not blocked by deferred-maintenance retry backoff 41ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > poor-reduction spend backoff blocks custom summarizers in the same compaction scope 51ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn refreshes threshold debt while retry backoff is active without compacting 95ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() leaves pending threshold debt for post-turn maintenance while under budget 45ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() uses bounded live context when pending maintenance is near budget 64ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() preserves leading system context when degraded live context is bounded 49ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() degrades to bounded live context if emergency compaction leaves debt pending 50ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() drains pending threshold debt as an emergency when already over budget 46ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() drains pending threshold debt when recorded runtime tokens are over budget 43ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() uses projected deferred pressure for emergency drain without passing it as observed tokens 46ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() does not wait for the session queue when deferred threshold debt is not urgent 43ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() waits for the session queue before emergency deferred threshold compaction 46ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > assemble() degrades instead of spending during active deferred retry backoff 43ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > maintain() uses the stricter current token budget for deferred threshold debt 43ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn persists prompt-cache telemetry for hot sessions 53ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn prefers runtime prompt tokens over transcript estimates for compaction decisions 48ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn skips compaction when ingest fails 42ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn prunes heartbeat-shaped ACK turns before compaction even without the heartbeat flag 67ms
 ✓ test/engine.test.ts > LcmContextEngine fidelity and token budget > afterTurn heartbeat flag skips non-empty transcript imports 43ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > ingests all messages when no prior conversation exists (new session) 51ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > does not persist custom transcript context as assistant messages 49ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > ingests all genuinely new messages (normal afterTurn, no restart) 58ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > skips all duplicates when gateway restart replays full history 53ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > deduplicates old messages but ingests new ones after restart 101ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > deduplicates replay when runtime sessionId changes but stable sessionKey continues 61ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > handles empty batch after slicing 44ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > handles repeated identical content (e.g. empty tool results) with occurrence counting 95ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > skips fully replayed suffix batches when the stored prefix is absent 56ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > uses the actual stored tail for oversized single-message replays 56ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > does not treat a one-message terminal match as a fully replayed batch 56ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > ingests single genuinely new message without dedup interference 55ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > fails closed for oversized no-overlap afterTurn batches 59ms
 ✓ test/engine.test.ts > LcmContextEngine afterTurn dedup guard > preserves a legitimate repeated first new message 61ms
 ✓ test/engine.test.ts > LcmContextEngine compaction telemetry > does not feed engine-ingested reasoning parts into compaction summarizer input 70ms
 ✓ test/engine.test.ts > LcmContextEngine compaction telemetry > does not feed top-level reasoning_content into compaction summarizer input 61ms
 ✓ test/engine.test.ts > LcmContextEngine compaction telemetry > does not feed redacted-thinking-only ingested parts into compaction summarizer input 62ms
 ✓ test/engine.test.ts > LcmContextEngine compaction telemetry > does not append synthetic system messages for compaction passes 74ms
 ✓ test/engine.test.ts > LcmContextEngine compaction telemetry > passes injected-context strip tags into production compaction 65ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > preserves explicit empty-string customInstructions overrides over config defaults 41ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > supports openai-codex large-file summarization through runtime-owned auth 46ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > caps model-backed large-file summarization calls per spend window 47ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > passes context-engine runtime llm and session identity to compaction summaries 52ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > forwards config customInstructions to large-file summarization 42ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > fails when compact token budget is missing 43ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > reads tokenBudget and currentTokenCount from runtimeContext 48ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > forces one compaction round for manual compaction requests in runtimeContext 48ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > prefers runtimeContext over legacyParams when both are provided 45ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > accepts explicit token budget without falling back to defaults 43ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > forces one compaction round for manual compaction requests 46ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > uses threshold target for proactive threshold compaction mode 44ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > passes currentTokenCount through to compaction evaluation and loop 48ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > forces threshold sweeps to account for runtime prompt overhead 46ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > forces threshold sweeps to account for projected raw backlog pressure 49ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > does not clear threshold pressure when persisted tokens are under target but runtime tokens remain over 46ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > reports already under target when compaction rounds are zero 44ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > treats full-sweep compaction as already under target when tokensAfter is below budget 45ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > reports threshold full-sweep compaction as incomplete when tokensAfter remains over target 45ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > routes forced budget recovery through compactUntilUnder for the issue #268 overflow shape 50ms
 ✓ test/engine.test.ts > LcmContextEngine.compact token budget plumbing > uses tokenBudget as currentTokens for forced recovery when observed tokens are unavailable 47ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > caps token budget when maxAssemblyTokenBudget is set and runtime budget exceeds it 100ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > uses full runtime budget when maxAssemblyTokenBudget is not set 72ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > caps the 128k fallback when maxAssemblyTokenBudget is set and no runtime budget provided 100ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > caps token budget in compact when maxAssemblyTokenBudget is set 49ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > does not consume summary substring as coverage for volatile live inputs 52ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > matches tool results without tool names against assembled unknown-name results 64ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > appends suppressed fallback retry prompts that lack internal context markers 54ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > evicts historical tool-call pairs together when volatile input forces trimming 94ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > keeps raw and summary context scoped across three isolated cron runtimes 94ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > does not import an archived cron run when assemble sees the runtime rollover first 57ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > recognizes only an isolated cron session-key shape: agent:main:cron:job 71ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > recognizes only an isolated cron session-key shape: agent:main:cron:job:run:123 93ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > recognizes only an isolated cron session-key shape: agent:main:cron 71ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > recognizes only an isolated cron session-key shape: agent:main:cronish:job 55ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > recognizes only an isolated cron session-key shape: agent:main:subagent:cron:job 57ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > recognizes only an isolated cron session-key shape: agent:main:main 54ms
 ✓ test/engine.test.ts > LcmContextEngine.assemble maxAssemblyTokenBudget cap > compacts each isolated cron run from only that run's transcript 135ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep metadata explains focused FTS5 query construction 57ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep rejects regex alternation in full-text mode before searching 12ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep still forwards regex alternation in regex mode 188ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_expand query mode infers conversationId from delegated grant 24ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep forwards since/before and uses the configured timezone in text output 29ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep forwards full-text sort mode and reports it in output 7ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep resolves conversation scope via sessionKey continuity before sessionId lookup 8ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep searches across a resolved session family 6ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > supports grep-to-describe recovery for compacted summary matches 28ms
 × test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep keeps isolated cron sessionKey scope on the active run 104ms
   → expected "spy" to be called with arguments: [ ObjectContaining{…} ][90m

Received: 

[1m  1st spy call:

[22m[2m  [[22m
[32m-   ObjectContaining {[90m
[31m+   {[90m
[31m+     "before": undefined,[90m
[2m      "conversationId": 42,[22m
[2m      "conversationIds": [[22m
[2m        42,[22m
[31m+       21,[90m
[31m+       7,[90m
[2m      ],[22m
[31m+     "limit": 50,[90m
[31m+     "mode": "regex",[90m
[31m+     "query": "deployment",[90m
[31m+     "scope": "both",[90m
[31m+     "since": undefined,[90m
[31m+     "sort": "recency",[90m
[2m    },[22m
[2m  ][22m
[39m[90m

Number of calls: [1m1[22m
[39m
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep rejects allConversations from a sub-agent without a delegated grant 7ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep rejects allConversations when a sub-agent key is passed as sessionId 3ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep scopes delegated allConversations to the granted conversation IDs 10ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep rejects explicit foreign conversationId outside a delegated grant 5ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_describe blocks cross-conversation lookup unless allConversations=true 54ms
 ✓ test/lcm-tools.test.ts > LCM tools session scoping > lcm_describe rejects allConversations results outside a delegated grant 4ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  test/engine.test.ts > LcmContextEngine fidelity and token budget > isolates cron sessionKey rollover during afterTurn transcript reconcile
AssertionError: expected [] to deeply equal [ Array(2) ]

[32m- Expected[39m
[31m+ Received[39m

[32m- [[39m
[32m-   "current afterTurn cron input",[39m
[32m-   "current afterTurn cron output",[39m
[32m- ][39m
[31m+ [][39m

 ❯ test/engine.test.ts:11498:62
    11496|       activeConversation!.conversationId,
    11497|     );
    11498|     expect(activeMessages.map((message) => message.content)).toEqual([
       |                                                              ^
    11499|       "current afterTurn cron input",
    11500|       "current afterTurn cron output",

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯

 FAIL  test/lcm-tools.test.ts > LCM tools session scoping > lcm_grep keeps isolated cron sessionKey scope on the active run
AssertionError: expected "spy" to be called with arguments: [ ObjectContaining{…} ][90m

Received: 

[1m  1st spy call:

[22m[2m  [[22m
[32m-   ObjectContaining {[90m
[31m+   {[90m
[31m+     "before": undefined,[90m
[2m      "conversationId": 42,[22m
[2m      "conversationIds": [[22m
[2m        42,[22m
[31m+       21,[90m
[31m+       7,[90m
[2m      ],[22m
[31m+     "limit": 50,[90m
[31m+     "mode": "regex",[90m
[31m+     "query": "deployment",[90m
[31m+     "scope": "both",[90m
[31m+     "since": undefined,[90m
[31m+     "sort": "recency",[90m
[2m    },[22m
[2m  ][22m
[39m[90m

Number of calls: [1m1[22m
[39m
 ❯ test/lcm-tools.test.ts:553:28
    551|     const result = await tool.execute("call-cron-family", { pattern: "…
    552| 
    553|     expect(retrieval.grep).toHaveBeenCalledWith(
       |                            ^
    554|       expect.objectContaining({
    555|         conversationId: 42,

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯


 Test Files  2 failed (2)
      Tests  2 failed | 342 passed (344)
   Start at  17:11:48
   Duration  43.27s (transform 8.08s, setup 0ms, collect 14.07s, tests 23.74s, environment 3ms, prepare 1.88s)

JUNIT report written to /tmp/rebench-test-results.xml
<?xml version="1.0" encoding="UTF-8" ?>
<testsuites name="vitest tests" tests="344" failures="2" errors="0" time="23.737300875">
    <testsuite name="test/engine.test.ts" timestamp="2026-09-03T17:12:33.870Z" hostname="c6810e9aaffe" tests="328" failures="1" errors="0" skipped="0" time="23.177309969">
        <testcase classname="test/engine.test.ts" name="LcmContextEngine metadata &gt; reports the registered lossless-claw engine id" time="0.191473696">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine metadata &gt; advertises ownsCompaction capability" time="0.037850381">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine metadata &gt; requires the full native host lifecycle for agent runs" time="0.04108129">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine metadata &gt; requires host thread bootstrap projection for subagent forks" time="0.038641002">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine metadata &gt; configures file-backed sqlite connections with WAL and busy_timeout" time="0.00711745">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; skips bootstrap for ignored sessions while bootstrapping included sessions" time="0.165525656">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; skips ingest for ignored sessions while storing included sessions" time="0.047407788">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; skips ingestBatch for ignored sessions while storing included sessions" time="0.044045686">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; skips afterTurn for ignored sessions while persisting included sessions" time="0.084905181">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; passes through assemble for ignored sessions while assembling included sessions from LCM" time="0.075780363">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; skips compact for ignored sessions while compact still evaluates included sessions" time="0.05639908">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; skips prepareSubagentSpawn for ignored sessions while creating grants for included sessions" time="0.045877518">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine ignored sessions &gt; skips onSubagentEnded for ignored sessions while cleaning up included child grants" time="0.042993096">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; skips leaked assistant runtime context messages through direct ingest" time="0.034138398">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; skips leaked assistant runtime context messages without creating a conversation" time="0.035830439">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; keeps real assistant replies after skipping leaked runtime context" time="0.041754642">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; skips leaked runtime context content blocks during afterTurn" time="0.054654635">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; skips leaked runtime context imported from bootstrap transcripts" time="0.046730652">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; skips leaked runtime context in append-only bootstrap transcript recovery" time="0.080359811">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; keeps user-authored messages even when they quote the runtime context prefix" time="0.039270179">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; keeps system and tool messages even when they contain the runtime context sentinel" time="0.04414196">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; keeps ordinary assistant messages that mention the runtime context phrase later" time="0.04014044">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine OpenClaw runtime context leak filter &gt; keeps assistant messages that start with runtime context wording without the full sentinel" time="0.03827131">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; matches stateless patterns on sessionKey and can be disabled globally" time="0.064196697">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; skips bootstrap persistence for stateless session keys" time="0.084783459">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; skips ingest and ingestBatch writes for stateless session keys" time="0.040456712">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; skips ingest for assistant messages with error/aborted stop reasons and empty content" time="0.04431287">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; allows assemble reads for stateless session keys" time="0.042253994">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; skips afterTurn and compact writes for stateless session keys" time="0.038972785">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; skips delegated grant writes for stateless session keys" time="0.038044222">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine stateless sessions &gt; skips subagent cleanup for stateless child session keys" time="0.033334933">
        </testcase>
        <testcase classname="test/engine.test.ts" name="ConversationStore session reuse &gt; reuses conversation across session resets when sessionKey matches" time="0.035141466">
        </testcase>
        <testcase classname="test/engine.test.ts" name="ConversationStore session reuse &gt; does not resolve archived conversations through active session lookup" time="0.037083111">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine before_reset lifecycle &gt; prunes fresh-tail messages and low-depth summaries on /new" time="0.056230038">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine before_reset lifecycle &gt; keeps all context items on /new when retain depth is -1" time="0.04504668">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine before_reset lifecycle &gt; drops fresh-tail messages but keeps all summaries on /new when retain depth is 0" time="0.039714528">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine before_reset lifecycle &gt; archives the prior active conversation and creates a fresh active row on /reset" time="0.038744957">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine before_reset lifecycle &gt; creates a fresh active conversation on /reset when none exists yet" time="0.036561725">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine before_reset lifecycle &gt; treats repeated /reset on an already fresh conversation as a no-op" time="0.03697785">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine session_end lifecycle &gt; ignores session_end new so /new stays a prune-in-place flow" time="0.036317966">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine session_end lifecycle &gt; ignores session_end restart so gateway lifecycle does not orphan conversation history" time="0.036622653">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine session_end lifecycle &gt; ignores session_end shutdown so gateway lifecycle does not orphan conversation history" time="0.03594114">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine session_end lifecycle &gt; archives the prior active conversation and creates a fresh active row on idle rollover" time="0.037051614">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine session_end lifecycle &gt; archives the active conversation without replacement on deleted session_end" time="0.036567725">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine session_end lifecycle &gt; treats session_end reset after before_reset as a no-op on the fresh replacement row" time="0.037433776">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine delegated session continuity &gt; prepares subagent spawn from an existing conversation found by sessionKey" time="0.032019097">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; stores string content as-is" time="0.043210818">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; flattens text content block arrays to plain text" time="0.036209444">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; extracts only text blocks from mixed content arrays" time="0.038426185">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; stores empty string for empty content arrays" time="0.03725974">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; falls back to JSON.stringify for non-array, non-string content" time="0.040912312">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; roundtrip stores plain text, not JSON content blocks" time="0.040334904">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; intercepts oversized &lt;file&gt; blocks and persists large file metadata" time="0.150891586">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; keeps &lt;file&gt; blocks inline when below the large-file threshold" time="0.040655385">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes oversized plain user text as a raw payload" time="0.059069024">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; keeps plain user text inline when below the raw-payload threshold" time="0.077050451">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes oversized non-file non-tool raw payloads" time="0.098850588">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; does not externalize assistant tool or reasoning blocks generically" time="0.047965616">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; stores externalized inline images under largeFilesDir" time="0.075010895">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes native user image blocks before raw payload fallback" time="0.076155667">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes native assistant image blocks before raw payload fallback" time="0.044128176">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes native tool-result image blocks instead of persisting them inline" time="0.064557999">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes native system image blocks instead of falling through to raw-system-payload" time="0.043039499">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; still externalizes large mixed-content messages that embed an image reference alongside oversized text" time="0.060357361">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; infers extensions for heic, avif, and bmp native image blocks" time="0.056972054">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes oversized tool-result payloads into large_files" time="0.080688371">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes oversized plain-text tool-result blocks from live exec-style messages" time="0.065346115">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes structured tool-result image payloads before text externalization" time="0.054777029">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; externalizes string-content tool-result images without converting them to text files" time="0.050384103">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; lists summarized externalized tool results as transcript GC candidates" time="0.067866832">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; maintain() defers transcript GC until host-approved background maintenance" time="0.097433534">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; maintain() skips transcript GC when transcriptGcEnabled is false" time="0.042818534">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.ingest content extraction &gt; serializes recycled session writes by stable sessionKey" time="0.081807783">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine connection lifecycle &gt; keeps shared sqlite handle open while another engine instance is active" time="0.057165841">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; imports only active leaf-path messages from SessionManager context" time="0.058673727">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; is idempotent and does not duplicate already bootstrapped sessions" time="0.058268729">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not rewrite prior assistant transcript rows when bootstrap re-instantiates a conversation" time="0.103621367">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; keeps fresh tool-only rows after dropping a replayed assistant prefix" time="0.092005245">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; keeps legitimate repeated assistant text when the ordering does not match a prior replay" time="0.109885331">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; keeps the replay flood guard active for user-leading append-only replay batches" time="0.103546477">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; skips reopening the transcript when checkpoint stats match" time="0.053809417">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; preserves ordinary bootstrap behavior when no checkpoint exists" time="0.059236881">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; preserves existing conversation data when the session file rotates" time="0.086807994">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; preserves conversation history when the session file rotates across a stable sessionKey" time="0.076944975">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; rotates to a fresh conversation when a stable sessionKey resumes on a new transcript after the old file disappears" time="0.072832883">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; rotates before assemble when a stable sessionKey points at a pruned transcript" time="0.074238209">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; preserves the active conversation when the tracked transcript stat fails for a non-missing reason" time="0.065696794">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not reapply bootstrapMaxTokens after session file rotation" time="0.073794245">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; rotates the current transcript in place without replacing the conversation" time="0.123158317">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; summarizes raw context outside the fresh tail before rotating the transcript" time="0.236837741">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; records rotate summary auth failures in the compaction circuit breaker" time="0.130245358">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; scopes rotate summarization spend guards per session" time="0.104891876">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; returns rotate unavailable when summarization spend backoff opens" time="0.075780017">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; reconciles unimported transcript messages before rotate summary coverage" time="0.129663007">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; imports checkpoint-missing transcript history before rotate summary coverage" time="0.127965393">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; refuses to rotate when transcript reconciliation has no safe overlap" time="0.042696208">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; takes the rotate backup after covering transcript-only rows and before rewrite" time="0.134552329">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; uses stored compaction telemetry to summarize raw context before automatic rotate" time="0.101702956">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; waits for an in-flight managed transaction before backing up and rotating" time="0.11138976">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; reports rotate as unavailable when the session transcript cannot be read" time="0.044077359">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; defers oversized session-file rewrites from afterTurn runtime hooks" time="0.077056174">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not directly auto-rotate session files during background maintenance" time="0.07095296">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not rewrite oversized session files from maintain runtime checks" time="0.070925787">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; leaves below-threshold session files alone while logging the decision" time="0.065862112">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; skips ignored, stateless, and untracked runtime sessions" time="0.046283006">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; startup scan rotates oversized active conversations with checkpointed files" time="0.115213863">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; startup scan ignores stale active LCM conversations outside indexed candidates" time="0.145146335">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; startup scan logs one compact summary for quiet skips" time="0.130680257">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; startup batch creates one pre-rotation backup for multiple rotations" time="0.215682203">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not repeatedly rewrite oversized transcripts during runtime deferral" time="0.075082311">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; reconciles missing tail messages when JSONL advanced past LCM" time="0.063437876">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; imports appended tail messages without replaying full reconciliation" time="0.059273634">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; falls back to full reconciliation when append-only suffix overlaps persisted history" time="0.074232893">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; blocks bounded no-anchor imports that are mostly already persisted history" time="0.083625173">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; imports the new tail when a same-path shrink keeps an already-persisted prefix" time="0.084068386">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; keeps the append-only fast path after heartbeat pruning changes the DB frontier" time="0.106441182">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; ignores non-message envelopes in appended transcript tails without forcing reconcile" time="0.088816517">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; tolerates custom bootstrap sidecar entries in append-only suffixes" time="0.060770556">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; refreshes the bootstrap checkpoint after afterTurn heartbeat pruning" time="0.090416124">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; refreshes the bootstrap checkpoint after a normal afterTurn before the next append-only bootstrap" time="0.068586351">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; reconciles foreground transcript messages before assistant-only afterTurn deltas" time="0.083405698">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; falls back to full reconciliation when append-only checkpoint validation mismatches" time="0.06750943">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; reconciles missing structured tool-call tail when prior empty tool content exists" time="0.067914551">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; bootstraps a bounded same-path transcript epoch after the file shrinks" time="0.065156756">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; blocks same-path shrink import when raw ids belong to another active conversation" time="0.085200969">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; imports the full bounded same-path shrink epoch instead of trusting a stale externalized frontier" time="0.064504293">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; imports a full same-path shrink epoch when new content repeats an old frontier message" time="0.069076364">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not append JSONL when no overlapping anchor exists in LCM" time="0.066852759">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not advance the bootstrap checkpoint when reconcile aborts at the import cap" time="0.110315093">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; uses the live ingest path for initial bootstrap" time="0.062658095">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; externalizes oversized file blocks during first-time bootstrap and still reconciles later tail messages" time="0.072806136">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; externalizes inline images during first-time bootstrap" time="0.054744537">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; externalizes oversized tool results during first-time bootstrap" time="0.062372665">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; limits first-time bootstrap imports to the newest messages within bootstrapMaxTokens" time="0.051605543">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; bounds forked child bootstrap and assembly even when the host transcript contains a raw parent branch" time="0.109557045">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; drops an oversized singleton bootstrap tail that exceeds bootstrapMaxTokens" time="0.044995657">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; does not return raw fork history when a forked oversized bootstrap tail imports no messages" time="0.052479465">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; streams JSONL replay and skips malformed lines while keeping later messages" time="0.109264237">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; prepareSubagentSpawn resolves parent conversation by sessionKey before UUID backfill" time="0.041824782">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; skips full read when file is unchanged and conversation is already bootstrapped" time="0.061143381">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.bootstrap &gt; file-level cache guard allows full read when file changes" time="0.058841552">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; strips assistant prefill tails when no DB conversation exists" time="0.037892216">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; falls back when DB context clearly trails live context" time="0.039631933">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; assembles context from DB when coverage exists" time="0.050693321">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; adds raw prompt-recall matches when summary-covered history omits an exact memory key" time="0.073117909">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; adds prompt-recall sentence context before a requested key" time="0.06001737">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; skips prompt-recall matches when the cue would exceed the assembly budget" time="0.068257947">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; drops prompt-recall when volatile live input needs the remaining budget" time="0.103088287">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not add prompt-recall when volatile live input already mentions the requested key" time="0.057043786">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; drops prompt-recall before evicting assembled context for volatile live input" time="0.073126111">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not add prompt-recall when the active summary already carries the exact fact" time="0.061050865">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; uses summary-backed recall when the fact is outside a realistic fresh tail" time="0.100379922">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not add prompt-recall when an active summary already mentions the requested key" time="0.056214415">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not add prompt-recall when a newer raw tail already mentions the requested key" time="0.056498763">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not recall substring or secret-shaped identifiers" time="0.201838556">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not add prompt-recall snippets that include unrelated sensitive material" time="0.059461636">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not add prompt-recall snippets that include underscore provider tokens" time="0.059727219">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; continues prompt-recall search past filtered newer matches" time="0.077990601">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; recalls multiple requested identifiers from the same historical message" time="0.062820465">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; changes the projection fingerprint when prompt-recall cue content changes" time="0.064702">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; bounds prompt-recall searches to four full-text identifier lookups" time="0.063058845">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; continues with assembled DB context when optional prompt recall lookup fails" time="0.07137739">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; logs the emitted context projection epoch" time="0.186948098">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; keeps projection epochs stable across raw tail growth and changes them for summaries" time="0.161739372">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; changes projection epochs when active focus state changes" time="0.258528403">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; respects token budget in assembled output" time="0.08655237">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; falls back to live messages if assembler throws" time="0.052098709">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; falls back to live context when assembled result has no user turns (cold-cache new session)" time="0.041287892">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not fall back when assembled result has user turns even if it ends with assistant" time="0.08333493">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; drops orphan tool results during assembled transcript repair" time="0.061862615">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; inserts synthetic tool results when fresh-tail tool calls have no result" time="0.045868369">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; drops older orphaned assistant tool calls instead of surfacing synthetic repair results" time="0.059675522">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; preserves non-tool content and matched tool calls when older assistant turns have stale orphaned calls" time="0.070871373">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; assemble forwards fresh-tail and prompt-aware options" time="0.048255251">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; bounds previous assembled prefix snapshots with LRU eviction" time="0.454421561">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; logs previous and current divergence message summaries when assembled prefixes change" time="0.044354813">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; adds compact overflow diagnostics to stressed assemble debug logs" time="0.051894097">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; repairs OpenAI function_call transcripts without dropping reasoning blocks" time="0.053384138">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; filters assistant messages with blank-text content during assembly" time="0.05184588">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; filters thinking-only assistant messages during assembly" time="0.048958401">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; rebuilds raw function_call blocks from stored columns when raw arguments are objects" time="0.046240331">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not emit assembly-specific system prompt guidance when no summaries exist" time="0.044355964">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; does not emit assembly-specific system prompt guidance when summaries are present" time="0.045026178">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble canonical path &gt; escapes summary XML text so persisted content cannot break out of the untrusted wrapper" time="0.05132557">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; normalizes tool_result blocks without inflating stored token accounting" time="0.04973401">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; preserves structured toolResult content via message_parts and assembler" time="0.048925895">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; does not leak OpenAI function tool payloads into stored message content fallbacks" time="0.047852645">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; preserves toolName through ingest-assemble round-trip for Gemini compatibility" time="0.045780366">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; preserves toolResult error state through ingest-assemble round-trip" time="0.048694809">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; preserves top-level tool metadata for string-content tool results" time="0.045607207">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; preserves top-level reasoning_content for assistant tool-call replay" time="0.047385429">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; reconstructs OpenAI reasoning and function call blocks when raw metadata is missing" time="0.050543251">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; skips unknown roles instead of storing them as assistant messages" time="0.034843863">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; uses explicit compact tokenBudget over legacy tokenBudget" time="0.051152912">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; ingests completed turn batches with ingestBatch" time="0.04510736">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; skips heartbeat turn batches in ingestBatch" time="0.049760891">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn ingests auto-compaction summary and new turn messages" time="0.408355614">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn deduplicates replayed history before prepending auto-compaction summary" time="0.104110782">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn skips new-message content already covered by auto-compaction summary" time="0.050645535">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn does not drop short messages just because they appear in auto-compaction summary" time="0.048199435">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn keeps a 24+ char user message that only collides as a substring of the summary narrative (F6)" time="0.05065166">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn drops a user message when the summary ends with that exact content (F6 anchored)" time="0.047561894">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn runs inline threshold compaction only after context threshold is crossed" time="0.055766444">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn runs inline threshold compaction when projected raw backlog crosses threshold" time="0.054973916">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn records deferred threshold debt when projected raw backlog crosses threshold" time="0.056391274">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn ignores raw leaf pressure below the context threshold" time="0.047775478">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn resolves tokenBudget from runtimeContext and forwards it as legacyParams" time="0.061999112">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn keeps the bootstrap checkpoint stale and records retry debt when inline threshold compaction fails" time="0.056843891">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn waits for inline threshold compaction before completing" time="0.076369358">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn falls back to the default token budget when no budget is provided" time="0.046307792">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn falls back to legacyCompactionParams when runtimeContext is missing" time="0.044052064">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn prefers runtimeContext when both runtimeContext and legacyCompactionParams are set" time="0.047550033">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn prefers runtimeContext.currentTokenCount for compaction decisions" time="0.049119878">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn falls back to local message token estimates when runtimeContext.currentTokenCount is absent" time="0.045303889">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn records deferred threshold debt instead of compacting inline by default" time="0.04830818">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn evaluates threshold compaction when ingestBatch is empty" time="0.048861786">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn skips compaction work when ingestBatch is empty AND conversation is below threshold" time="0.048154066">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn schedules a deferred threshold drain even when compactionTelemetry has no provider/model" time="0.047984742">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn caps the transcript-reconcile slow path to one full re-read per session+file (F7)" time="0.076362732">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn treats missing tracked transcripts as a cheap degraded path without full reread" time="0.129060552">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; seeds placeholder bootstrap_state when afterTurn stat-fail fallback runs (#649 follow-up)" time="0.085554385">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; bootstrap imports a bounded path-mismatched transcript with no old anchor as a new epoch" time="0.072464603">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; bootstrap preserves a long-lived checkpoint when a rotated transcript is only delivery audit traffic" time="0.084634916">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; bootstrap imports real path-mismatched user turns that mention config audit" time="0.058351563">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; bootstrap fails closed on ambiguous runtime rollover while the old transcript still exists" time="0.062385703">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; isolates cron runs that reuse a stable sessionKey while preserving prior runs" time="0.073678423">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; isolates cron sessionKey rollover during afterTurn transcript reconcile" time="0.393833234">
            <failure message="expected [] to deeply equal [ Array(2) ]" type="AssertionError">
AssertionError: expected [] to deeply equal [ Array(2) ]

- Expected
+ Received

- [
-   &quot;current afterTurn cron input&quot;,
-   &quot;current afterTurn cron output&quot;,
- ]
+ []

 ❯ test/engine.test.ts:11498:62
            </failure>
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn fails closed on ambiguous runtime rollover while the old transcript still exists" time="0.213773703">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble falls back to live messages on ambiguous runtime rollover while the old transcript still exists" time="0.188919199">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn reconciles a path-mismatched no-anchor transcript before oversized delta dedup" time="0.210905559">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn preserves continuity when a path-mismatched transcript is only delivery audit traffic" time="0.195113793">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn archives a stale active conversation when the prior keyed transcript was pruned" time="0.218854403">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn skips assistant-only rollover when the replacement transcript is unreadable" time="0.059359672">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn bounds initial transcript imports to the bootstrap budget" time="0.060995654">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn skips persistence when full reread finds no anchor and imports nothing" time="0.074504127">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn imports a bounded same-path transcript epoch after the file shrinks" time="0.077195854">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn imports the full bounded same-path shrink epoch instead of trusting a stale externalized frontier" time="0.120111653">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn imports a full same-path shrink epoch when new content repeats an old frontier message" time="0.080469993">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn keeps the old checkpoint when a path-mismatched no-anchor import is capped" time="0.111179213">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn retries a capped reconcile when the transcript file changed with an append-only-ineligible suffix (F7)" time="0.076540815">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn drains deferred threshold debt in the background without cache telemetry" time="0.113234482">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; background deferred drain leaves threshold debt durable when the session is busy" time="0.041006578">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() leaves deferred threshold debt pending until the host opts in" time="0.039979548">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() consumes deferred threshold debt when the host opts in" time="0.043842081">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() clears stale legacy non-threshold debt when threshold no longer applies" time="0.044009071">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() revalidates legacy non-threshold debt as threshold work when still over threshold" time="0.042315163">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() keeps threshold debt pending when compaction fails" time="0.041566603">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() keeps threshold debt pending when the auth circuit breaker is open" time="0.044024116">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() backs off deferred threshold debt after non-auth compaction failures" time="0.067968669">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() keeps threshold debt pending when partial compaction remains over target" time="0.049661823">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() backs off after partial deferred compaction still exceeds target" time="0.050007681">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() stops model-backed deferred compaction at the summary call cap" time="0.055848385">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; compact() is not blocked by deferred-maintenance retry backoff" time="0.041336474">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; poor-reduction spend backoff blocks custom summarizers in the same compaction scope" time="0.050986868">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn refreshes threshold debt while retry backoff is active without compacting" time="0.094941435">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() leaves pending threshold debt for post-turn maintenance while under budget" time="0.044714477">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() uses bounded live context when pending maintenance is near budget" time="0.063749746">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() preserves leading system context when degraded live context is bounded" time="0.04932886">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() degrades to bounded live context if emergency compaction leaves debt pending" time="0.050037079">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() drains pending threshold debt as an emergency when already over budget" time="0.046086573">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() drains pending threshold debt when recorded runtime tokens are over budget" time="0.042836326">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() uses projected deferred pressure for emergency drain without passing it as observed tokens" time="0.045527383">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() does not wait for the session queue when deferred threshold debt is not urgent" time="0.043163763">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() waits for the session queue before emergency deferred threshold compaction" time="0.045610648">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; assemble() degrades instead of spending during active deferred retry backoff" time="0.043284953">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; maintain() uses the stricter current token budget for deferred threshold debt" time="0.042721095">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn persists prompt-cache telemetry for hot sessions" time="0.053181848">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn prefers runtime prompt tokens over transcript estimates for compaction decisions" time="0.048055199">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn skips compaction when ingest fails" time="0.042260882">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn prunes heartbeat-shaped ACK turns before compaction even without the heartbeat flag" time="0.066524027">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine fidelity and token budget &gt; afterTurn heartbeat flag skips non-empty transcript imports" time="0.042576651">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; ingests all messages when no prior conversation exists (new session)" time="0.050837607">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; does not persist custom transcript context as assistant messages" time="0.049495726">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; ingests all genuinely new messages (normal afterTurn, no restart)" time="0.058435226">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; skips all duplicates when gateway restart replays full history" time="0.053222414">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; deduplicates old messages but ingests new ones after restart" time="0.101298512">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; deduplicates replay when runtime sessionId changes but stable sessionKey continues" time="0.061322002">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; handles empty batch after slicing" time="0.043546525">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; handles repeated identical content (e.g. empty tool results) with occurrence counting" time="0.0948239">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; skips fully replayed suffix batches when the stored prefix is absent" time="0.056494372">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; uses the actual stored tail for oversized single-message replays" time="0.055957603">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; does not treat a one-message terminal match as a fully replayed batch" time="0.056160183">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; ingests single genuinely new message without dedup interference" time="0.054577506">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; fails closed for oversized no-overlap afterTurn batches" time="0.058956634">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine afterTurn dedup guard &gt; preserves a legitimate repeated first new message" time="0.060852329">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine compaction telemetry &gt; does not feed engine-ingested reasoning parts into compaction summarizer input" time="0.070134477">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine compaction telemetry &gt; does not feed top-level reasoning_content into compaction summarizer input" time="0.060688173">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine compaction telemetry &gt; does not feed redacted-thinking-only ingested parts into compaction summarizer input" time="0.062474139">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine compaction telemetry &gt; does not append synthetic system messages for compaction passes" time="0.07440796">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine compaction telemetry &gt; passes injected-context strip tags into production compaction" time="0.064664458">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; preserves explicit empty-string customInstructions overrides over config defaults" time="0.040815151">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; supports openai-codex large-file summarization through runtime-owned auth" time="0.045707958">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; caps model-backed large-file summarization calls per spend window" time="0.046505651">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; passes context-engine runtime llm and session identity to compaction summaries" time="0.052282002">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; forwards config customInstructions to large-file summarization" time="0.041929488">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; fails when compact token budget is missing" time="0.042875752">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; reads tokenBudget and currentTokenCount from runtimeContext" time="0.048175345">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; forces one compaction round for manual compaction requests in runtimeContext" time="0.047542557">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; prefers runtimeContext over legacyParams when both are provided" time="0.044758736">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; accepts explicit token budget without falling back to defaults" time="0.042848164">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; forces one compaction round for manual compaction requests" time="0.046224306">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; uses threshold target for proactive threshold compaction mode" time="0.044426839">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; passes currentTokenCount through to compaction evaluation and loop" time="0.047938591">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; forces threshold sweeps to account for runtime prompt overhead" time="0.045526382">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; forces threshold sweeps to account for projected raw backlog pressure" time="0.049295225">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; does not clear threshold pressure when persisted tokens are under target but runtime tokens remain over" time="0.045515463">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; reports already under target when compaction rounds are zero" time="0.044325986">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; treats full-sweep compaction as already under target when tokensAfter is below budget" time="0.04511522">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; reports threshold full-sweep compaction as incomplete when tokensAfter remains over target" time="0.044691973">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; routes forced budget recovery through compactUntilUnder for the issue #268 overflow shape" time="0.05048316">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.compact token budget plumbing &gt; uses tokenBudget as currentTokens for forced recovery when observed tokens are unavailable" time="0.047332099">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; caps token budget when maxAssemblyTokenBudget is set and runtime budget exceeds it" time="0.099711203">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; uses full runtime budget when maxAssemblyTokenBudget is not set" time="0.071625532">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; caps the 128k fallback when maxAssemblyTokenBudget is set and no runtime budget provided" time="0.100044058">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; caps token budget in compact when maxAssemblyTokenBudget is set" time="0.048603446">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; does not consume summary substring as coverage for volatile live inputs" time="0.051867359">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; matches tool results without tool names against assembled unknown-name results" time="0.06373824">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; appends suppressed fallback retry prompts that lack internal context markers" time="0.053964882">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; evicts historical tool-call pairs together when volatile input forces trimming" time="0.093932813">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; keeps raw and summary context scoped across three isolated cron runtimes" time="0.094449369">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; does not import an archived cron run when assemble sees the runtime rollover first" time="0.057372363">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; recognizes only an isolated cron session-key shape: agent:main:cron:job" time="0.070947277">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; recognizes only an isolated cron session-key shape: agent:main:cron:job:run:123" time="0.092940207">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; recognizes only an isolated cron session-key shape: agent:main:cron" time="0.070759575">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; recognizes only an isolated cron session-key shape: agent:main:cronish:job" time="0.055162848">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; recognizes only an isolated cron session-key shape: agent:main:subagent:cron:job" time="0.056655494">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; recognizes only an isolated cron session-key shape: agent:main:main" time="0.053530736">
        </testcase>
        <testcase classname="test/engine.test.ts" name="LcmContextEngine.assemble maxAssemblyTokenBudget cap &gt; compacts each isolated cron run from only that run&apos;s transcript" time="0.134616656">
        </testcase>
    </testsuite>
    <testsuite name="test/lcm-tools.test.ts" timestamp="2026-09-03T17:12:34.970Z" hostname="c6810e9aaffe" tests="16" failures="1" errors="0" skipped="0" time="0.559990906">
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep metadata explains focused FTS5 query construction" time="0.0574193">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep rejects regex alternation in full-text mode before searching" time="0.011937829">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep still forwards regex alternation in regex mode" time="0.188407353">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_expand query mode infers conversationId from delegated grant" time="0.024061192">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep forwards since/before and uses the configured timezone in text output" time="0.028521822">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep forwards full-text sort mode and reports it in output" time="0.007025404">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep resolves conversation scope via sessionKey continuity before sessionId lookup" time="0.007782797">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep searches across a resolved session family" time="0.006102772">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; supports grep-to-describe recovery for compacted summary matches" time="0.028177383">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep keeps isolated cron sessionKey scope on the active run" time="0.104415597">
            <failure message="expected &quot;spy&quot; to be called with arguments: [ ObjectContaining{…} ][90m

Received: 

[1m  1st spy call:

[22m[2m  [[22m
[32m-   ObjectContaining {[90m
[31m+   {[90m
[31m+     &quot;before&quot;: undefined,[90m
[2m      &quot;conversationId&quot;: 42,[22m
[2m      &quot;conversationIds&quot;: [[22m
[2m        42,[22m
[31m+       21,[90m
[31m+       7,[90m
[2m      ],[22m
[31m+     &quot;limit&quot;: 50,[90m
[31m+     &quot;mode&quot;: &quot;regex&quot;,[90m
[31m+     &quot;query&quot;: &quot;deployment&quot;,[90m
[31m+     &quot;scope&quot;: &quot;both&quot;,[90m
[31m+     &quot;since&quot;: undefined,[90m
[31m+     &quot;sort&quot;: &quot;recency&quot;,[90m
[2m    },[22m
[2m  ][22m
[39m[90m

Number of calls: [1m1[22m
[39m" type="AssertionError">
AssertionError: expected &quot;spy&quot; to be called with arguments: [ ObjectContaining{…} ]

Received: 

  1st spy call:

  [
-   ObjectContaining {
+   {
+     &quot;before&quot;: undefined,
      &quot;conversationId&quot;: 42,
      &quot;conversationIds&quot;: [
        42,
+       21,
+       7,
      ],
+     &quot;limit&quot;: 50,
+     &quot;mode&quot;: &quot;regex&quot;,
+     &quot;query&quot;: &quot;deployment&quot;,
+     &quot;scope&quot;: &quot;both&quot;,
+     &quot;since&quot;: undefined,
+     &quot;sort&quot;: &quot;recency&quot;,
    },
  ]


Number of calls: 1

 ❯ test/lcm-tools.test.ts:553:28
            </failure>
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep rejects allConversations from a sub-agent without a delegated grant" time="0.007357259">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep rejects allConversations when a sub-agent key is passed as sessionId" time="0.003328168">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep scopes delegated allConversations to the granted conversation IDs" time="0.00994587">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_grep rejects explicit foreign conversationId outside a delegated grant" time="0.005403849">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_describe blocks cross-conversation lookup unless allConversations=true" time="0.053683388">
        </testcase>
        <testcase classname="test/lcm-tools.test.ts" name="LCM tools session scoping &gt; lcm_describe rejects allConversations results outside a delegated grant" time="0.003885439">
        </testcase>
    </testsuite>
</testsuites>
Updated 2 paths from 5db26da
SWE-rebench parser: parse_log_js_4
SWE-rebench results:
FAILED
