> torch-lock@0.1.0 test > npm run validate:scheduler && npm run test:integration:e2e && node --test test/*.test.mjs tests/*.test.js > torch-lock@0.1.0 validate:scheduler > node scripts/validate-scheduler-roster.mjs && node scripts/validate-prompt-contract.mjs && node scripts/validate-scheduler-flow-parity.mjs && npm run validate:scheduler-failure-schema Scheduler tables, roster, and prompt filenames are in sync. Prompt contract validated for all daily/weekly prompts. Scheduler flow parity validated for prompts and scheduler implementation. > torch-lock@0.1.0 validate:scheduler-failure-schema > node --test test/scheduler-lock-failure-schema.contract.test.mjs TAP version 13 # Subtest: scheduler lock backend failure artifact matches required frontmatter schema ok 1 - scheduler lock backend failure artifact matches required frontmatter schema --- duration_ms: 161.154264 type: 'test' ... # Subtest: schema contract catches missing required lock-backend field ok 2 - schema contract catches missing required lock-backend field --- duration_ms: 2.871179 type: 'test' ... # Subtest: schema contract catches misnamed lock-backend key ok 3 - schema contract catches misnamed lock-backend key --- duration_ms: 0.834819 type: 'test' ... 1..3 # tests 3 # suites 0 # pass 3 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 318.644346 > torch-lock@0.1.0 test:integration:e2e > node --test test/scheduler-preflight-lock.e2e.test.mjs TAP version 13 # Subtest: lock preflight e2e: successful lock writes completed status snapshot ok 1 - lock preflight e2e: successful lock writes completed status snapshot --- duration_ms: 452.810254 type: 'test' ... # Subtest: lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker ok 2 - lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker --- duration_ms: 102.636238 type: 'test' ... # Subtest: lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification ok 3 - lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification --- duration_ms: 180.269665 type: 'test' ... 1..3 # tests 3 # suites 0 # pass 3 # fail 0 # cancelled 0 # skipped 0 # todo 0 # duration_ms 824.280539 TAP version 13 # Subtest: Build artifacts verification # Subtest: dist directory exists not ok 1 - dist directory exists --- duration_ms: 1.943115 type: 'test' location: '/app/test/build_verification.test.mjs:9:11' failureType: 'testCodeFailure' error: |- dist directory should exist false !== true code: 'ERR_ASSERTION' name: 'AssertionError' expected: true actual: false operator: 'strictEqual' stack: |- TestContext. (file:///app/test/build_verification.test.mjs:10:12) Test.runInAsyncScope (node:async_hooks:214:14) Test.run (node:internal/test_runner/test:1047:25) Test.start (node:internal/test_runner/test:944:17) TestContext.test (node:internal/test_runner/test:373:20) TestContext. (file:///app/test/build_verification.test.mjs:9:11) Test.runInAsyncScope (node:async_hooks:214:14) Test.run (node:internal/test_runner/test:1047:25) Test.start (node:internal/test_runner/test:944:17) startSubtestAfterBootstrap (node:internal/test_runner/harness:296:17) ... # Subtest: Critical files exist in dist not ok 2 - Critical files exist in dist --- duration_ms: 0.501843 type: 'test' location: '/app/test/build_verification.test.mjs:13:11' failureType: 'testCodeFailure' error: |- File index.html should exist in dist false !== true code: 'ERR_ASSERTION' name: 'AssertionError' expected: true actual: false operator: 'strictEqual' stack: |- file:///app/test/build_verification.test.mjs:25:14 Array.forEach () TestContext. (file:///app/test/build_verification.test.mjs:23:19) Test.runInAsyncScope (node:async_hooks:214:14) Test.run (node:internal/test_runner/test:1047:25) Test.start (node:internal/test_runner/test:944:17) TestContext.test (node:internal/test_runner/test:373:20) TestContext. (file:///app/test/build_verification.test.mjs:13:11) async Test.run (node:internal/test_runner/test:1054:7) async startSubtestAfterBootstrap (node:internal/test_runner/harness:296:3) ... # Subtest: TORCH.md content is not empty not ok 3 - TORCH.md content is not empty --- duration_ms: 0.240573 type: 'test' location: '/app/test/build_verification.test.mjs:29:11' failureType: 'testCodeFailure' error: "ENOENT: no such file or directory, open '/app/dist/src/docs/TORCH.md'" code: 'ENOENT' stack: |- Object.readFileSync (node:fs:440:20) TestContext. (file:///app/test/build_verification.test.mjs:31:24) Test.runInAsyncScope (node:async_hooks:214:14) Test.run (node:internal/test_runner/test:1047:25) Test.start (node:internal/test_runner/test:944:17) TestContext.test (node:internal/test_runner/test:373:20) TestContext. (file:///app/test/build_verification.test.mjs:29:11) async Test.run (node:internal/test_runner/test:1054:7) async startSubtestAfterBootstrap (node:internal/test_runner/harness:296:3) ... 1..3 not ok 1 - Build artifacts verification --- duration_ms: 4.188468 type: 'test' location: '/app/test/build_verification.test.mjs:8:1' failureType: 'subtestsFailed' error: '3 subtests failed' code: 'ERR_TEST_FAILURE' ... # Subtest: parseArgs should parse basic command ok 2 - parseArgs should parse basic command --- duration_ms: 1.628077 type: 'test' ... # Subtest: parseArgs should parse agent and cadence ok 3 - parseArgs should parse agent and cadence --- duration_ms: 0.273442 type: 'test' ... # Subtest: parseArgs should parse equals sign syntax ok 4 - parseArgs should parse equals sign syntax --- duration_ms: 3.043129 type: 'test' ... # Subtest: parseArgs should parse dry-run flag ok 5 - parseArgs should parse dry-run flag --- duration_ms: 0.396494 type: 'test' ... # Subtest: parseArgs should parse port with default ok 6 - parseArgs should parse port with default --- duration_ms: 0.220731 type: 'test' ... # Subtest: parseArgs should parse custom port ok 7 - parseArgs should parse custom port --- duration_ms: 0.175744 type: 'test' ... # Subtest: parseArgs should parse ignore-logs flag ok 8 - parseArgs should parse ignore-logs flag --- duration_ms: 0.527959 type: 'test' ... # Subtest: parseArgs should parse memory flags ok 9 - parseArgs should parse memory flags --- duration_ms: 1.240767 type: 'test' ... # Subtest: parseArgs should parse memory flags with equals ok 10 - parseArgs should parse memory flags with equals --- duration_ms: 0.722583 type: 'test' ... # Subtest: src/lib.mjs # Subtest: cmdCheck # Subtest: returns correct structure with empty locks ok 1 - returns correct structure with empty locks --- duration_ms: 2.660305 type: 'test' ... # Subtest: identifies locked agents ok 2 - identifies locked agents --- duration_ms: 0.566843 type: 'test' ... # Subtest: excludes paused agents ok 3 - excludes paused agents --- duration_ms: 0.667234 type: 'test' ... # Subtest: identifies unknown locked agents ok 4 - identifies unknown locked agents --- duration_ms: 0.719212 type: 'test' ... 1..4 ok 1 - cmdCheck --- duration_ms: 5.847049 type: 'suite' ... # Subtest: cmdLock # Subtest: successfully locks an available agent ok 1 - successfully locks an available agent --- duration_ms: 11.539654 type: 'test' ... # Subtest: fails if agent is not in roster ok 2 - fails if agent is not in roster --- duration_ms: 1.014006 type: 'test' ... # Subtest: fails if agent is already locked ok 3 - fails if agent is already locked --- duration_ms: 0.439892 type: 'test' ... # Subtest: fails if agent is already completed ok 4 - fails if agent is already completed --- duration_ms: 0.594932 type: 'test' ... # Subtest: fails if race check is lost ok 5 - fails if race check is lost --- duration_ms: 2.839858 type: 'test' ... # Subtest: handles race condition with identical timestamps using eventId tie-breaker (we win) ok 6 - handles race condition with identical timestamps using eventId tie-breaker (we win) --- duration_ms: 13.94634 type: 'test' ... # Subtest: handles race condition with identical timestamps using eventId tie-breaker (we lose) ok 7 - handles race condition with identical timestamps using eventId tie-breaker (we lose) --- duration_ms: 1.184325 type: 'test' ... # Subtest: dry run does not publish ok 8 - dry run does not publish --- duration_ms: 0.411616 type: 'test' ... 1..8 ok 2 - cmdLock --- duration_ms: 33.349845 type: 'suite' ... # Subtest: cmdList # Subtest: lists active locks ok 1 - lists active locks --- duration_ms: 0.770961 type: 'test' ... # Subtest: warns about unknown agents ok 2 - warns about unknown agents --- duration_ms: 0.399904 type: 'test' ... # Subtest: handles no locks ok 3 - handles no locks --- duration_ms: 0.367057 type: 'test' ... 1..3 ok 3 - cmdList --- duration_ms: 1.797004 type: 'suite' ... # Subtest: cmdComplete # Subtest: successfully completes an active lock ok 1 - successfully completes an active lock --- duration_ms: 1.126175 type: 'test' ... # Subtest: fails if no active lock found ok 2 - fails if no active lock found --- duration_ms: 0.374503 type: 'test' ... # Subtest: detects already completed task ok 3 - detects already completed task --- duration_ms: 0.251288 type: 'test' ... 1..3 ok 4 - cmdComplete --- duration_ms: 1.913573 type: 'suite' ... 1..4 ok 11 - src/lib.mjs --- duration_ms: 43.819865 type: 'suite' ... # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # Published to 1/3 relays (required=1, timeout=25ms) # [publish:primary] Publishing to 2 relays (wss://relay-a, wss://relay-b)... # [publish:primary] Publishing to 2 relays (wss://relay-a, wss://relay-b)... # Published to 2/2 relays (required=2, timeout=25ms) # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)... # Published to 2/3 relays (required=2, timeout=25ms) # (node:2900) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time # (Use `node --trace-warnings ...` to show where the warning was created) # Subtest: ci-resilience lock acquisition under unstable relays # Subtest: recovers after all relays are down for an initial outage window ok 1 - recovers after all relays are down for an initial outage window --- duration_ms: 23.840291 type: 'test' ... # Subtest: survives intermittent timeout spikes and reaches quorum with bounded retries ok 2 - survives intermittent timeout spikes and reaches quorum with bounded retries --- duration_ms: 7.936966 type: 'test' ... # Subtest: handles staggered relay recovery and never exceeds retry budget ok 3 - handles staggered relay recovery and never exceeds retry budget --- duration_ms: 4.671589 type: 'test' ... 1..3 ok 12 - ci-resilience lock acquisition under unstable relays --- duration_ms: 38.603362 type: 'suite' ... # [publish:primary] Publishing to 1 relays (wss://relay-a)... # Published to 1/1 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 1 relays (wss://relay-a)... # [publish:primary] Publishing to 1 relays (wss://relay-a)... # Published to 1/1 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 1 relays (wss://relay-a)... # [publish:primary] Publishing to 1 relays (wss://relay-a)... # [publish:primary] Publishing to 1 relays (wss://relay-a)... # [publish:primary] Publishing to 1 relays (wss://relay-a)... # (node:2906) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time # (Use `node --trace-warnings ...` to show where the warning was created) # Subtest: publishLock retry behavior # Subtest: succeeds immediately on first attempt without retries ok 1 - succeeds immediately on first attempt without retries --- duration_ms: 5.474069 type: 'test' ... # Subtest: retries a transient failure then succeeds within retry budget with bounded jitter ok 2 - retries a transient failure then succeeds within retry budget with bounded jitter --- duration_ms: 3.032713 type: 'test' ... # Subtest: returns terminal relay_publish_quorum_failure after exhausting retry budget ok 3 - returns terminal relay_publish_quorum_failure after exhausting retry budget --- duration_ms: 6.480207 type: 'test' ... # Subtest: short-circuits non-retryable failures without extra attempts ok 4 - short-circuits non-retryable failures without extra attempts --- duration_ms: 4.454286 type: 'test' ... 1..4 ok 13 - publishLock retry behavior --- duration_ms: 21.111696 type: 'suite' ... # [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)... # [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)... # Published to 2/2 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 1 relays (wss://primary-down)... # [publish:primary] Publishing to 1 relays (wss://primary-down)... # [publish:primary] Publishing to 1 relays (wss://primary-down)... # [publish:primary] Publishing to 1 relays (wss://primary-bad)... # [publish:primary] Publishing to 5 relays (relay-timeout, wss://dns, wss://tcp, wss://tls, wss://ws)... # [publish:primary] Publishing to 2 relays (wss://relay-bad, wss://relay-ok)... # {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":1}],"totalElapsedMs":1} # Published to 1/2 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 1 relays (wss://primary-bad)... # [publish:fallback] Publishing to 1 relays (wss://fallback-ok)... # {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0} # Published to 1/2 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 2 relays (wss://bad, wss://healthy)... # {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0} # Published to 1/2 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 2 relays (wss://healthy, wss://bad)... # {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0} # Published to 1/2 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 1 relays (wss://healthy)... # {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":0}],"totalElapsedMs":0} # Published to 1/1 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 1 relays (wss://healthy)... # {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":0}],"totalElapsedMs":0} # Published to 1/1 relays (required=1, timeout=200ms) # [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)... # [publish:fallback] Publishing to 1 relays (wss://fallback-healthy)... # {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"elapsedMs":0}],"totalElapsedMs":0} # Published to 1/3 relays (required=1, timeout=200ms) # Subtest: lock-ops # Subtest: parseLockEvent # Subtest: parses a valid lock event correctly ok 1 - parses a valid lock event correctly --- duration_ms: 1.716055 type: 'test' ... 1..1 ok 1 - parseLockEvent --- duration_ms: 3.018249 type: 'suite' ... # Subtest: queryLocks # Subtest: falls back to fallback relays when primary query fails ok 1 - falls back to fallback relays when primary query fails --- duration_ms: 16.736135 type: 'test' ... 1..1 ok 2 - queryLocks --- duration_ms: 17.017963 type: 'suite' ... # Subtest: publishLock # Subtest: retries transient failures and succeeds on a later attempt ok 1 - retries transient failures and succeeds on a later attempt --- duration_ms: 6.464641 type: 'test' ... # Subtest: fails after retry budget is exhausted for persistent transient failures ok 2 - fails after retry budget is exhausted for persistent transient failures --- duration_ms: 2.486588 type: 'test' ... # Subtest: fails without retry for persistent validation failures ok 3 - fails without retry for persistent validation failures --- duration_ms: 1.482804 type: 'test' ... # Subtest: includes per-relay reason categories and retry metadata in failure diagnostics ok 4 - includes per-relay reason categories and retry metadata in failure diagnostics --- duration_ms: 1.999629 type: 'test' ... # Subtest: returns success when mixed relay outcomes still satisfy quorum ok 5 - returns success when mixed relay outcomes still satisfy quorum --- duration_ms: 1.501278 type: 'test' ... # Subtest: uses fallback relays to satisfy min success quorum ok 6 - uses fallback relays to satisfy min success quorum --- duration_ms: 1.321733 type: 'test' ... # Subtest: quarantines repeatedly failing relays and still reaches quorum with one healthy relay ok 7 - quarantines repeatedly failing relays and still reaches quorum with one healthy relay --- duration_ms: 1.884675 type: 'test' ... # Subtest: uses fallback and min active pool to reintroduce quarantined relay when needed ok 8 - uses fallback and min active pool to reintroduce quarantined relay when needed --- duration_ms: 1.10908 type: 'test' ... 1..8 ok 3 - publishLock --- duration_ms: 19.320605 type: 'suite' ... 1..3 ok 14 - lock-ops --- duration_ms: 40.427275 type: 'suite' ... # memory_telemetry { # event: 'memory:ingested', # payload: { # memory_id: 'bfbb3c6e-095d-4ccd-ad5a-140b6927421c', # agent_id: 'agent-telemetry', # dedupe_key: '5054d3273b526ef45167a03a7543de870139af75b9b12cfd920ce80e715e7a88', # chunk_events: 1, # window_start: 0, # window_end: 1771301051599 # }, # ts: 1771301051603 # } # memory_metric { # metric: 'memory_ingested_total', # payload: { count: 1 }, # ts: 1771301051604 # } # memory_metric { # metric: 'memory_retrieved_total', # payload: { count: 2, cache_hit: false }, # ts: 1771301051607 # } # memory_telemetry { # event: 'memory:pruned', # payload: { pruned_count: 1, retention_ms: 1000, dry_run: true }, # ts: 1771301051608 # } # memory_metric { # metric: 'memory_pruned_total', # payload: { count: 0, retention_ms: 1000, dry_run: true }, # ts: 1771301051608 # } # memory_telemetry { # event: 'memory:prune_skipped', # payload: { reason: 'flag_disabled', retention_ms: 1000 }, # ts: 1771301051609 # } # Subtest: listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks ok 15 - listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks --- duration_ms: 2.688735 type: 'test' ... # Subtest: triggerPruneDryRun returns candidate metadata without deleting records ok 16 - triggerPruneDryRun returns candidate metadata without deleting records --- duration_ms: 0.525091 type: 'test' ... # Subtest: memoryStats reports counts/rates and retrieval telemetry remains redaction-safe ok 17 - memoryStats reports counts/rates and retrieval telemetry remains redaction-safe --- duration_ms: 9.591187 type: 'test' ... # Subtest: runPruneCycle respects prune feature-flag modes ok 18 - runPruneCycle respects prune feature-flag modes --- duration_ms: 1.379088 type: 'test' ... # Subtest: stores runtime events in signer/session namespace and clears scope ok 19 - stores runtime events in signer/session namespace and clears scope --- duration_ms: 2.59644 type: 'test' ... # Subtest: expires runtime events and records expiration metrics ok 20 - expires runtime events and records expiration metrics --- duration_ms: 10.478883 type: 'test' ... # Subtest: enforces LRU bounds and tracks eviction metrics ok 21 - enforces LRU bounds and tracks eviction metrics --- duration_ms: 0.718567 type: 'test' ... # Subtest: blocks decrypted/session-sensitive data from durable promotion without sanitizer pass ok 22 - blocks decrypted/session-sensitive data from durable promotion without sanitizer pass --- duration_ms: 0.37624 type: 'test' ... # Subtest: createEmbedderAdapter selects in-memory backend and supports vector CRUD ok 23 - createEmbedderAdapter selects in-memory backend and supports vector CRUD --- duration_ms: 1.638314 type: 'test' ... # Subtest: createEmbedderAdapter reads backend from environment ok 24 - createEmbedderAdapter reads backend from environment --- duration_ms: 2.709345 type: 'test' ... # Subtest: memory feature flags parse defaults and canary allow-lists ok 25 - memory feature flags parse defaults and canary allow-lists --- duration_ms: 1.303503 type: 'test' ... # Subtest: memory prune flag supports off, dry-run, and active modes ok 26 - memory prune flag supports off, dry-run, and active modes --- duration_ms: 0.302096 type: 'test' ... # Subtest: ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry ok 27 - ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry --- duration_ms: 6.119984 type: 'test' ... # Subtest: ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket ok 28 - ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket --- duration_ms: 0.828632 type: 'test' ... # Subtest: createLifecyclePlan respects delete safety constraints and logs reasons ok 29 - createLifecyclePlan respects delete safety constraints and logs reasons --- duration_ms: 2.398993 type: 'test' ... # Subtest: createLifecyclePlan condenses near-duplicates and archives merged source records ok 30 - createLifecyclePlan condenses near-duplicates and archives merged source records --- duration_ms: 0.943965 type: 'test' ... # Subtest: applyLifecycleActions executes keep/archive/delete and merge markers ok 31 - applyLifecycleActions executes keep/archive/delete and merge markers --- duration_ms: 1.383097 type: 'test' ... # Subtest: filterAndRankMemories applies metadata filters and composite score ok 32 - filterAndRankMemories applies metadata filters and composite score --- duration_ms: 2.851358 type: 'test' ... # Subtest: formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming ok 33 - formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming --- duration_ms: 2.468796 type: 'test' ... # Subtest: isMemoryRetrievalEnabled supports global toggle and agent canary list ok 34 - isMemoryRetrievalEnabled supports global toggle and agent canary list --- duration_ms: 0.407381 type: 'test' ... # Subtest: renderPromptWithMemoryContext injects bounded memory block before base prompt ok 35 - renderPromptWithMemoryContext injects bounded memory block before base prompt --- duration_ms: 0.818684 type: 'test' ... # Subtest: createDbAdvisoryLockProvider acquires and releases postgres advisory locks ok 36 - createDbAdvisoryLockProvider acquires and releases postgres advisory locks --- duration_ms: 2.092452 type: 'test' ... # Subtest: startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries ok 37 - startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries --- duration_ms: 26.35814 type: 'test' ... # Subtest: startMemoryMaintenanceScheduler skips jobs when feature flags disable memory ok 38 - startMemoryMaintenanceScheduler skips jobs when feature flags disable memory --- duration_ms: 11.279543 type: 'test' ... # Subtest: normalizeMemoryItem applies durable schema defaults and coercions ok 39 - normalizeMemoryItem applies durable schema defaults and coercions --- duration_ms: 2.535683 type: 'test' ... # Subtest: validateMemoryItem reports field-level errors ok 40 - validateMemoryItem reports field-level errors --- duration_ms: 0.538811 type: 'test' ... # Subtest: ingestEvents rejects invalid writes and logs structured validation details ok 41 - ingestEvents rejects invalid writes and logs structured validation details --- duration_ms: 5.412329 type: 'test' ... # Subtest: loadMemoryPromptTemplates loads all memory prompt templates from disk ok 42 - loadMemoryPromptTemplates loads all memory prompt templates from disk --- duration_ms: 1.458487 type: 'test' ... # Subtest: summarizeEvents retries with repair prompt when first response is malformed JSON ok 43 - summarizeEvents retries with repair prompt when first response is malformed JSON --- duration_ms: 2.152071 type: 'test' ... # Subtest: summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice ok 44 - summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice --- duration_ms: 1.661533 type: 'test' ... # Subtest: CLI Smoke Test # Subtest: should print usage when no args provided ok 1 - should print usage when no args provided --- duration_ms: 169.974982 type: 'test' ... # Subtest: should fail when checking without cadence ok 2 - should fail when checking without cadence --- duration_ms: 168.833829 type: 'test' ... # Subtest: should include paused agents in check output ok 3 - should include paused agents in check output --- duration_ms: 1032.406098 type: 'test' ... 1..3 ok 45 - CLI Smoke Test --- duration_ms: 1374.103911 type: 'suite' ...