mirror of
https://github.com/PR0M3TH3AN/TORCH.git
synced 2026-10-27 07:51:52 +00:00
806 lines
29 KiB
Plaintext
806 lines
29 KiB
Plaintext
|
|
> [email protected] test
|
|
> npm run validate:scheduler && npm run test:integration:e2e && node --test test/*.test.mjs tests/*.test.js
|
|
|
|
|
|
> [email protected] 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.
|
|
|
|
> [email protected] 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
|
|
|
|
> [email protected] 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.<anonymous> (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.<anonymous> (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 (<anonymous>)
|
|
TestContext.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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'
|
|
...
|