diff --git a/src/context/CONTEXT_2026-02-16T00-33-39Z.md b/src/context/CONTEXT_2026-02-16T00-33-39Z.md new file mode 100644 index 0000000..d52f87e --- /dev/null +++ b/src/context/CONTEXT_2026-02-16T00-33-39Z.md @@ -0,0 +1,18 @@ +# Context for docs-agent run 2026-02-16 + +## Goal +Execute `docs-agent` to audit documentation accuracy and ensure alignment with the codebase. + +## Findings +- `docs/event-schemas.md` and `docs/runtime-fallback.md` are missing (referenced in `docs-agent` prompt). +- `README.md` instructs users to create `torch-config.json` in the project root. +- `cmdInit` (in `src/ops.mjs`) was creating `torch-config.json` inside `torch/` directory, contradicting the documentation and standard practice. +- `test/ops.test.mjs` (test 51) was failing because it expected `torch-config.json` in the project root, but `cmdInit` placed it in `torch/`. + +## Actions +- Modified `src/ops.mjs` to place `torch-config.json` in `paths.root` (project root) instead of `paths.torchDir`. +- Verified the fix by running `npm test`. + +## Decisions +- Did not create missing docs files (`docs/event-schemas.md`, `docs/runtime-fallback.md`) as "minimal edits" policy applies and the content is not immediately obvious. +- Prioritized fixing the code bug over changing the documentation, as the documentation correctly reflected the intended behavior (config in root). diff --git a/src/ops.mjs b/src/ops.mjs index 36f0dfb..e432658 100644 --- a/src/ops.mjs +++ b/src/ops.mjs @@ -134,42 +134,35 @@ export function cmdInit(force = false, cwd = process.cwd()) { } // 6. Create torch-config.json logic - const configPath = path.join(paths.torchDir, 'torch-config.json'); - const rootConfigPath = path.join(cwd, 'torch-config.json'); + const configPath = path.join(paths.root, 'torch-config.json'); if (!fs.existsSync(configPath)) { - // Check root config first - if (fs.existsSync(rootConfigPath)) { - fs.copyFileSync(rootConfigPath, configPath); - console.log(`Copied existing configuration from root to ${path.relative(cwd, configPath)}`); + // Generate new + try { + const exampleConfigPath = path.join(PKG_ROOT, 'torch-config.example.json'); + if (fs.existsSync(exampleConfigPath)) { + const exampleConfig = JSON.parse(fs.readFileSync(exampleConfigPath, 'utf8')); + + // Generate random namespace + const randomSuffix = crypto.randomBytes(4).toString('hex'); + const newNamespace = `torch-${randomSuffix}`; + + if (exampleConfig.nostrLock) { + exampleConfig.nostrLock.namespace = newNamespace; + } else { + exampleConfig.nostrLock = { namespace: newNamespace }; + } + + fs.writeFileSync(configPath, JSON.stringify(exampleConfig, null, 2), 'utf8'); + console.log(`Created ${path.relative(cwd, configPath)} with namespace "${newNamespace}"`); } else { - // Generate new - try { - const exampleConfigPath = path.join(PKG_ROOT, 'torch-config.example.json'); - if (fs.existsSync(exampleConfigPath)) { - const exampleConfig = JSON.parse(fs.readFileSync(exampleConfigPath, 'utf8')); - - // Generate random namespace - const randomSuffix = crypto.randomBytes(4).toString('hex'); - const newNamespace = `torch-${randomSuffix}`; - - if (exampleConfig.nostrLock) { - exampleConfig.nostrLock.namespace = newNamespace; - } else { - exampleConfig.nostrLock = { namespace: newNamespace }; - } - - fs.writeFileSync(configPath, JSON.stringify(exampleConfig, null, 2), 'utf8'); - console.log(`Created ${path.relative(cwd, configPath)} with namespace "${newNamespace}"`); - } else { - console.warn(`Warning: Could not find ${exampleConfigPath} to generate torch-config.json`); - } - } catch (err) { - console.error(`Failed to create torch-config.json: ${err.message}`); - } + console.warn(`Warning: Could not find ${exampleConfigPath} to generate torch-config.json`); } + } catch (err) { + console.error(`Failed to create torch-config.json: ${err.message}`); + } } else { - console.log(`Skipped ${path.relative(cwd, configPath)} (exists)`); + console.log(`Skipped ${path.relative(cwd, configPath)} (exists)`); } console.log('\nInitialization complete.'); diff --git a/task-logs/daily/2026-02-16T00-35-14Z__docs-agent__completed.md b/task-logs/daily/2026-02-16T00-35-14Z__docs-agent__completed.md new file mode 100644 index 0000000..2178cef --- /dev/null +++ b/task-logs/daily/2026-02-16T00-35-14Z__docs-agent__completed.md @@ -0,0 +1,11 @@ +--- +agent: docs-agent +cadence: daily +platform: jules +--- + +# docs-agent completed + +Docs agent executed successfully. +Fixed bug in `cmdInit` (src/ops.mjs) where `torch-config.json` was being created in `torch/` instead of project root. +Verified with tests. diff --git a/test_output.log b/test_output.log index 34a113b..d6d613f 100644 --- a/test_output.log +++ b/test_output.log @@ -7,127 +7,1405 @@ > 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 drift detected: -- [prompt-contract] src/prompts/daily/audit-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/audit-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/audit-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/ci-health-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/ci-health-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/ci-health-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/const-refactor-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/const-refactor-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/const-refactor-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/content-audit-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/content-audit-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/content-audit-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/decompose-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/decompose-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/decompose-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/deps-security-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/deps-security-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/deps-security-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/design-system-audit-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/design-system-audit-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/design-system-audit-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/docs-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/docs-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/docs-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/docs-alignment-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/docs-alignment-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/docs-alignment-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/docs-code-investigator.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/docs-code-investigator.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/docs-code-investigator.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/innerhtml-migration-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/innerhtml-migration-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/innerhtml-migration-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/known-issues-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/known-issues-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/known-issues-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/load-test-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/load-test-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/load-test-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/log-fixer-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/log-fixer-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/log-fixer-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/onboarding-audit-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/onboarding-audit-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/onboarding-audit-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/perf-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/perf-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/perf-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/protocol-research-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/protocol-research-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/protocol-research-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/scheduler-update-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/scheduler-update-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/scheduler-update-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/style-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/style-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/style-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/test-audit-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/test-audit-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/test-audit-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/todo-triage-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/todo-triage-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/todo-triage-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/daily/torch-garbage-collection-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/daily/torch-garbage-collection-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/daily/torch-garbage-collection-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/bug-reproducer-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/bug-reproducer-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/bug-reproducer-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/changelog-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/changelog-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/changelog-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/dead-code-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/dead-code-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/dead-code-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/feature-proposer-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/feature-proposer-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/feature-proposer-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/frontend-console-debug-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/frontend-console-debug-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/frontend-console-debug-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/fuzz-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/fuzz-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/fuzz-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/perf-deepdive-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/perf-deepdive-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/perf-deepdive-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/perf-optimization-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/perf-optimization-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/perf-optimization-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/pr-review-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/pr-review-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/pr-review-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/prompt-maintenance-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/prompt-maintenance-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/prompt-maintenance-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/prompt-safety-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/prompt-safety-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/prompt-safety-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/race-condition-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/race-condition-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/race-condition-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/refactor-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/refactor-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/refactor-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/repo-fit-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/repo-fit-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/repo-fit-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/smoke-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/smoke-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/smoke-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/telemetry-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/telemetry-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/telemetry-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/test-coverage-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/test-coverage-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/test-coverage-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/ui-ux-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/ui-ux-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/ui-ux-agent.md: missing contract token in required section: `*_failed.md` -- [prompt-contract] src/prompts/weekly/weekly-synthesis-agent.md: missing contract token in required section: `npm run lock:complete -- --agent --cadence ` -- [prompt-contract] src/prompts/weekly/weekly-synthesis-agent.md: missing contract token in required section: `*_completed.md` -- [prompt-contract] src/prompts/weekly/weekly-synthesis-agent.md: missing contract token in required section: `*_failed.md` +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: 173.91508 + type: 'test' + ... +# Subtest: schema contract catches missing required lock-backend field +ok 2 - schema contract catches missing required lock-backend field + --- + duration_ms: 2.655671 + type: 'test' + ... +# Subtest: schema contract catches misnamed lock-backend key +ok 3 - schema contract catches misnamed lock-backend key + --- + duration_ms: 0.661326 + type: 'test' + ... +1..3 +# tests 3 +# suites 0 +# pass 3 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 303.051564 + +> 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: 681.264593 + 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: 127.967485 + 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: 139.912461 + type: 'test' + ... +1..3 +# tests 3 +# suites 0 +# pass 3 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 1087.838225 +TAP version 13 +# Subtest: parseArgs should parse basic command +ok 1 - parseArgs should parse basic command + --- + duration_ms: 3.109932 + type: 'test' + ... +# Subtest: parseArgs should parse agent and cadence +ok 2 - parseArgs should parse agent and cadence + --- + duration_ms: 0.569612 + type: 'test' + ... +# Subtest: parseArgs should parse equals sign syntax +ok 3 - parseArgs should parse equals sign syntax + --- + duration_ms: 2.584574 + type: 'test' + ... +# Subtest: parseArgs should parse dry-run flag +ok 4 - parseArgs should parse dry-run flag + --- + duration_ms: 0.604272 + type: 'test' + ... +# Subtest: parseArgs should parse port with default +ok 5 - parseArgs should parse port with default + --- + duration_ms: 0.276695 + type: 'test' + ... +# Subtest: parseArgs should parse custom port +ok 6 - parseArgs should parse custom port + --- + duration_ms: 0.305981 + type: 'test' + ... +# Subtest: parseArgs should parse ignore-logs flag +ok 7 - parseArgs should parse ignore-logs flag + --- + duration_ms: 0.676697 + type: 'test' + ... +# Subtest: parseArgs should parse memory flags +ok 8 - parseArgs should parse memory flags + --- + duration_ms: 2.077006 + type: 'test' + ... +# Subtest: parseArgs should parse memory flags with equals +ok 9 - parseArgs should parse memory flags with equals + --- + duration_ms: 0.812369 + 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: 5.394071 + type: 'test' + ... + # Subtest: identifies locked agents + ok 2 - identifies locked agents + --- + duration_ms: 0.953434 + type: 'test' + ... + # Subtest: excludes paused agents + ok 3 - excludes paused agents + --- + duration_ms: 0.840966 + type: 'test' + ... + # Subtest: identifies unknown locked agents + ok 4 - identifies unknown locked agents + --- + duration_ms: 1.513014 + type: 'test' + ... + 1..4 + ok 1 - cmdCheck + --- + duration_ms: 10.622484 + type: 'suite' + ... + # Subtest: cmdLock + # Subtest: successfully locks an available agent + ok 1 - successfully locks an available agent + --- + duration_ms: 17.624564 + type: 'test' + ... + # Subtest: fails if agent is not in roster + ok 2 - fails if agent is not in roster + --- + duration_ms: 1.541594 + type: 'test' + ... + # Subtest: fails if agent is already locked + ok 3 - fails if agent is already locked + --- + duration_ms: 1.912634 + type: 'test' + ... + # Subtest: fails if agent is already completed + ok 4 - fails if agent is already completed + --- + duration_ms: 0.794578 + type: 'test' + ... + # Subtest: fails if race check is lost + ok 5 - fails if race check is lost + --- + duration_ms: 5.59365 + 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: 22.206309 + 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.76807 + type: 'test' + ... + # Subtest: dry run does not publish + ok 8 - dry run does not publish + --- + duration_ms: 0.921098 + type: 'test' + ... + 1..8 + ok 2 - cmdLock + --- + duration_ms: 56.691102 + type: 'suite' + ... + # Subtest: cmdList + # Subtest: lists active locks + ok 1 - lists active locks + --- + duration_ms: 1.042723 + type: 'test' + ... + # Subtest: warns about unknown agents + ok 2 - warns about unknown agents + --- + duration_ms: 0.332011 + type: 'test' + ... + # Subtest: handles no locks + ok 3 - handles no locks + --- + duration_ms: 0.379359 + type: 'test' + ... + 1..3 + ok 3 - cmdList + --- + duration_ms: 2.03161 + type: 'suite' + ... + # Subtest: cmdComplete + # Subtest: successfully completes an active lock + ok 1 - successfully completes an active lock + --- + duration_ms: 1.040732 + type: 'test' + ... + # Subtest: fails if no active lock found + ok 2 - fails if no active lock found + --- + duration_ms: 0.857671 + type: 'test' + ... + # Subtest: detects already completed task + ok 3 - detects already completed task + --- + duration_ms: 0.502097 + type: 'test' + ... + 1..3 + ok 4 - cmdComplete + --- + duration_ms: 3.559052 + type: 'suite' + ... + 1..4 +ok 10 - src/lib.mjs + --- + duration_ms: 74.290803 + type: 'suite' + ... +# Published to 1/3 relays (required=1, timeout=25ms) +# Published to 2/2 relays (required=2, timeout=25ms) +# Published to 2/3 relays (required=2, timeout=25ms) +# (node:7978) 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: 46.717814 + 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: 5.692027 + 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.107827 + type: 'test' + ... + 1..3 +ok 11 - ci-resilience lock acquisition under unstable relays + --- + duration_ms: 59.644 + type: 'suite' + ... +# Published to 1/1 relays (required=1, timeout=200ms) +# Published to 1/1 relays (required=1, timeout=200ms) +# (node:7992) 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: 10.658087 + 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.14105 + 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.64104 + type: 'test' + ... + # Subtest: short-circuits non-retryable failures without extra attempts + ok 4 - short-circuits non-retryable failures without extra attempts + --- + duration_ms: 2.102652 + type: 'test' + ... + 1..4 +ok 12 - publishLock retry behavior + --- + duration_ms: 24.953206 + type: 'suite' + ... +# Published to 2/2 relays (required=1, timeout=200ms) +# {"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) +# {"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) +# {"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) +# {"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) +# {"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) +# {"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) +# {"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":1}],"totalElapsedMs":1} +# 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: 3.419041 + type: 'test' + ... + 1..1 + ok 1 - parseLockEvent + --- + duration_ms: 5.117934 + 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: 35.631622 + type: 'test' + ... + 1..1 + ok 2 - queryLocks + --- + duration_ms: 35.891938 + 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: 9.197412 + 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: 4.434686 + type: 'test' + ... + # Subtest: fails without retry for persistent validation failures + ok 3 - fails without retry for persistent validation failures + --- + duration_ms: 1.715021 + 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: 3.375249 + 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: 2.515328 + type: 'test' + ... + # Subtest: uses fallback relays to satisfy min success quorum + ok 6 - uses fallback relays to satisfy min success quorum + --- + duration_ms: 3.455619 + 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: 4.937704 + 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: 2.794866 + type: 'test' + ... + 1..8 + ok 3 - publishLock + --- + duration_ms: 33.641889 + type: 'suite' + ... + 1..3 +ok 13 - lock-ops + --- + duration_ms: 76.08316 + type: 'suite' + ... +# memory_telemetry { +# event: 'memory:ingested', +# payload: { +# memory_id: '1f0e34ac-9a1f-4c98-a01e-c3cdb90cd382', +# agent_id: 'agent-telemetry', +# dedupe_key: 'e296237253126e793e191f043ef4b23171637aabe7fec3a1b21f6386d5d82ec7', +# chunk_events: 1, +# window_start: 0, +# window_end: 1771201852349 +# }, +# ts: 1771201852357 +# } +# memory_metric { +# metric: 'memory_ingested_total', +# payload: { count: 1 }, +# ts: 1771201852359 +# } +# memory_metric { +# metric: 'memory_retrieved_total', +# payload: { count: 3, cache_hit: false }, +# ts: 1771201852363 +# } +# memory_telemetry { +# event: 'memory:pruned', +# payload: { pruned_count: 1, retention_ms: 1000, dry_run: true }, +# ts: 1771201852365 +# } +# memory_metric { +# metric: 'memory_pruned_total', +# payload: { count: 0, retention_ms: 1000, dry_run: true }, +# ts: 1771201852366 +# } +# memory_telemetry { +# event: 'memory:prune_skipped', +# payload: { reason: 'flag_disabled', retention_ms: 1000 }, +# ts: 1771201852366 +# } +# Subtest: listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks +ok 14 - listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks + --- + duration_ms: 4.035814 + type: 'test' + ... +# Subtest: triggerPruneDryRun returns candidate metadata without deleting records +ok 15 - triggerPruneDryRun returns candidate metadata without deleting records + --- + duration_ms: 1.399948 + type: 'test' + ... +# Subtest: memoryStats reports counts/rates and retrieval telemetry remains redaction-safe +ok 16 - memoryStats reports counts/rates and retrieval telemetry remains redaction-safe + --- + duration_ms: 19.317912 + type: 'test' + ... +# Subtest: runPruneCycle respects prune feature-flag modes +ok 17 - runPruneCycle respects prune feature-flag modes + --- + duration_ms: 2.026059 + type: 'test' + ... +# Subtest: stores runtime events in signer/session namespace and clears scope +ok 18 - stores runtime events in signer/session namespace and clears scope + --- + duration_ms: 4.628884 + type: 'test' + ... +# Subtest: expires runtime events and records expiration metrics +ok 19 - expires runtime events and records expiration metrics + --- + duration_ms: 11.428945 + type: 'test' + ... +# Subtest: enforces LRU bounds and tracks eviction metrics +ok 20 - enforces LRU bounds and tracks eviction metrics + --- + duration_ms: 0.902602 + type: 'test' + ... +# Subtest: blocks decrypted/session-sensitive data from durable promotion without sanitizer pass +ok 21 - blocks decrypted/session-sensitive data from durable promotion without sanitizer pass + --- + duration_ms: 0.507301 + type: 'test' + ... +# Subtest: createEmbedderAdapter selects in-memory backend and supports vector CRUD +ok 22 - createEmbedderAdapter selects in-memory backend and supports vector CRUD + --- + duration_ms: 2.566549 + type: 'test' + ... +# Subtest: createEmbedderAdapter reads backend from environment +ok 23 - createEmbedderAdapter reads backend from environment + --- + duration_ms: 0.70104 + type: 'test' + ... +# Subtest: memory feature flags parse defaults and canary allow-lists +ok 24 - memory feature flags parse defaults and canary allow-lists + --- + duration_ms: 1.93296 + type: 'test' + ... +# Subtest: memory prune flag supports off, dry-run, and active modes +ok 25 - memory prune flag supports off, dry-run, and active modes + --- + duration_ms: 0.806638 + type: 'test' + ... +# Subtest: ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry +ok 26 - ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry + --- + duration_ms: 9.359092 + type: 'test' + ... +# Subtest: ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket +ok 27 - ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket + --- + duration_ms: 1.218449 + type: 'test' + ... +# Subtest: createLifecyclePlan respects delete safety constraints and logs reasons +ok 28 - createLifecyclePlan respects delete safety constraints and logs reasons + --- + duration_ms: 2.635797 + type: 'test' + ... +# Subtest: createLifecyclePlan condenses near-duplicates and archives merged source records +ok 29 - createLifecyclePlan condenses near-duplicates and archives merged source records + --- + duration_ms: 0.991207 + type: 'test' + ... +# Subtest: applyLifecycleActions executes keep/archive/delete and merge markers +ok 30 - applyLifecycleActions executes keep/archive/delete and merge markers + --- + duration_ms: 1.605314 + type: 'test' + ... +# Subtest: filterAndRankMemories applies metadata filters and composite score +ok 31 - filterAndRankMemories applies metadata filters and composite score + --- + duration_ms: 4.528994 + type: 'test' + ... +# Subtest: formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming +ok 32 - formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming + --- + duration_ms: 4.21999 + type: 'test' + ... +# Subtest: isMemoryRetrievalEnabled supports global toggle and agent canary list +ok 33 - isMemoryRetrievalEnabled supports global toggle and agent canary list + --- + duration_ms: 0.607103 + type: 'test' + ... +# Subtest: renderPromptWithMemoryContext injects bounded memory block before base prompt +ok 34 - renderPromptWithMemoryContext injects bounded memory block before base prompt + --- + duration_ms: 1.301011 + type: 'test' + ... +# Subtest: createDbAdvisoryLockProvider acquires and releases postgres advisory locks +ok 35 - createDbAdvisoryLockProvider acquires and releases postgres advisory locks + --- + duration_ms: 3.530168 + type: 'test' + ... +# Subtest: startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries +ok 36 - startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries + --- + duration_ms: 28.83871 + type: 'test' + ... +# Subtest: startMemoryMaintenanceScheduler skips jobs when feature flags disable memory +ok 37 - startMemoryMaintenanceScheduler skips jobs when feature flags disable memory + --- + duration_ms: 11.334734 + type: 'test' + ... +# Subtest: normalizeMemoryItem applies durable schema defaults and coercions +ok 38 - normalizeMemoryItem applies durable schema defaults and coercions + --- + duration_ms: 2.938967 + type: 'test' + ... +# Subtest: validateMemoryItem reports field-level errors +ok 39 - validateMemoryItem reports field-level errors + --- + duration_ms: 0.696844 + type: 'test' + ... +# Subtest: ingestEvents rejects invalid writes and logs structured validation details +ok 40 - ingestEvents rejects invalid writes and logs structured validation details + --- + duration_ms: 7.191377 + type: 'test' + ... +# Subtest: loadMemoryPromptTemplates loads all memory prompt templates from disk +ok 41 - loadMemoryPromptTemplates loads all memory prompt templates from disk + --- + duration_ms: 2.282962 + type: 'test' + ... +# Subtest: summarizeEvents retries with repair prompt when first response is malformed JSON +ok 42 - summarizeEvents retries with repair prompt when first response is malformed JSON + --- + duration_ms: 3.901718 + type: 'test' + ... +# Subtest: summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice +ok 43 - summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice + --- + duration_ms: 3.01171 + 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: 321.131201 + type: 'test' + ... + # Subtest: should fail when checking without cadence + ok 2 - should fail when checking without cadence + --- + duration_ms: 257.929321 + type: 'test' + ... + # Subtest: should include paused agents in check output + ok 3 - should include paused agents in check output + --- + duration_ms: 1056.854616 + type: 'test' + ... + 1..3 +ok 44 - CLI Smoke Test + --- + duration_ms: 1637.83201 + type: 'suite' + ... +# Initializing torch configuration in /app/test-ops-aVnFfO/project1/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch/torch-config.json with namespace "torch-4dc73b19" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Initializing torch configuration in /app/test-ops-aVnFfO/project2/torch... +# Initializing torch configuration in /app/test-ops-aVnFfO/project3/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch/torch-config.json with namespace "torch-d3f9e026" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Updating torch configuration in /app/test-ops-aVnFfO/project3/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-30-52-941Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json +# Updating static files... +# Updated META_PROMPTS.md +# Updated scheduler-flow.md +# Updated daily-scheduler.md +# Updated weekly-scheduler.md +# Skipped roster.json (preserved) +# Updating prompts... +# daily/: 0 added, 0 updated, 22 preserved +# weekly/: 0 added, 0 updated, 21 preserved +# Update complete. +# Initializing torch configuration in /app/test-ops-aVnFfO/project4/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch/torch-config.json with namespace "torch-08be36be" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Updating torch configuration in /app/test-ops-aVnFfO/project4/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-30-53-043Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json +# Updating static files... +# Updated META_PROMPTS.md +# Updated scheduler-flow.md +# Updated daily-scheduler.md +# Updated weekly-scheduler.md +# Overwrote roster.json (forced) +# Updating prompts... +# daily/: 0 added, 22 updated, 0 preserved +# weekly/: 0 added, 21 updated, 0 preserved +# Update complete. +# Initializing torch configuration in /app/test-ops-aVnFfO/project5/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch/torch-config.json with namespace "torch-68195510" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Updating torch configuration in /app/test-ops-aVnFfO/project5/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-30-53-165Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json +# Updating static files... +# Updated META_PROMPTS.md +# Updated scheduler-flow.md +# Updated daily-scheduler.md +# Updated weekly-scheduler.md +# Skipped roster.json (preserved) +# Updating prompts... +# daily/: 0 added, 0 updated, 22 preserved +# weekly/: 0 added, 0 updated, 21 preserved +# Update complete. +# Initializing torch configuration in /app/test-ops-aVnFfO/project_roster/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch/torch-config.json with namespace "torch-62e63a2a" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Checking locks: namespace=torch, cadence=daily, date=2026-02-16 +# Relays: wss://relay.damus.io, wss://nos.lol, wss://relay.primal.net +# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]} +# Initializing torch configuration in /app/test-ops-aVnFfO/project_config_init/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch/torch-config.json with namespace "torch-8770abbc" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Subtest: cmdInit creates directory structure and files +ok 45 - cmdInit creates directory structure and files + --- + duration_ms: 47.776512 + type: 'test' + ... +# Subtest: cmdInit fails if directory exists without force +ok 46 - cmdInit fails if directory exists without force + --- + duration_ms: 1.790323 + type: 'test' + ... +# Subtest: cmdUpdate preserves modified prompt +ok 47 - cmdUpdate preserves modified prompt + --- + duration_ms: 93.392409 + type: 'test' + ... +# Subtest: cmdUpdate overwrites prompt with force +ok 48 - cmdUpdate overwrites prompt with force + --- + duration_ms: 126.41031 + type: 'test' + ... +# Subtest: cmdUpdate creates backup +ok 49 - cmdUpdate creates backup + --- + duration_ms: 89.997898 + type: 'test' + ... +# Subtest: torch-lock check respects local roster +ok 50 - torch-lock check respects local roster + --- + duration_ms: 1097.864944 + type: 'test' + ... +# Subtest: cmdInit creates torch-config.json with random namespace +not ok 51 - cmdInit creates torch-config.json with random namespace + --- + duration_ms: 33.822657 + type: 'test' + location: '/app/test/ops.test.mjs:125:1' + failureType: 'testCodeFailure' + error: 'torch-config.json created' + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: true + actual: false + operator: '==' + stack: |- + TestContext. (file:///app/test/ops.test.mjs:132:10) + async Test.run (node:internal/test_runner/test:1054:7) + async Test.processPendingSubtests (node:internal/test_runner/test:744:7) + ... +# Published to 1/3 relays (required=1, timeout=80ms) +# Subtest: relay fanout quorum integration + # Subtest: passes with required=1 when one relay succeeds and two fail + ok 1 - passes with required=1 when one relay succeeds and two fail + --- + duration_ms: 173.925241 + type: 'test' + ... + # Subtest: fails with quorum error for required=1 when all relays fail + ok 2 - fails with quorum error for required=1 when all relays fail + --- + duration_ms: 100.059737 + type: 'test' + ... + # Subtest: fails with required=2 when only one relay succeeds + ok 3 - fails with required=2 when only one relay succeeds + --- + duration_ms: 97.698306 + type: 'test' + ... +# Published to 2/3 relays (required=2, timeout=80ms) + # Subtest: passes when delayed successes reach quorum before timeout + ok 4 - passes when delayed successes reach quorum before timeout + --- + duration_ms: 92.001904 + type: 'test' + ... + 1..4 +ok 52 - relay fanout quorum integration + --- + duration_ms: 470.893564 + type: 'suite' + ... +# Subtest: raises all-relays-down duration alert after threshold +ok 53 - raises all-relays-down duration alert after threshold + --- + duration_ms: 2.023484 + type: 'test' + ... +# Subtest: raises success-rate alert when rolling health falls below threshold +ok 54 - raises success-rate alert when rolling health falls below threshold + --- + duration_ms: 0.389051 + type: 'test' + ... +# Subtest: fails required memory policy when retrieval/storage evidence is missing +ok 55 - fails required memory policy when retrieval/storage evidence is missing + --- + duration_ms: 1220.750123 + type: 'test' + ... +# Subtest: accepts required memory policy when markers or artifacts are produced +ok 56 - accepts required memory policy when markers or artifacts are produced + --- + duration_ms: 1183.532398 + type: 'test' + ... +# Subtest: records backend failure metadata when lock command exits with code 2 +ok 57 - records backend failure metadata when lock command exits with code 2 + --- + duration_ms: 999.978463 + type: 'test' + ... +# Subtest: defers backend failures in non-strict mode and reuses idempotency key on successful retry +ok 58 - defers backend failures in non-strict mode and reuses idempotency key on successful retry + --- + duration_ms: 654.340525 + type: 'test' + ... +# Subtest: fails after exceeding non-strict deferral budget +ok 59 - fails after exceeding non-strict deferral budget + --- + duration_ms: 194.450653 + type: 'test' + ... +# Subtest: strict lock mode fails immediately without deferral +ok 60 - strict lock mode fails immediately without deferral + --- + duration_ms: 101.085877 + type: 'test' + ... +# Subtest: skips lock health preflight by default when not enabled +ok 61 - skips lock health preflight by default when not enabled + --- + duration_ms: 415.242174 + type: 'test' + ... +# Subtest: fails scheduler with preflight metadata when lock health preflight is enabled +ok 62 - fails scheduler with preflight metadata when lock health preflight is enabled + --- + duration_ms: 135.210193 + type: 'test' + ... +# Subtest: categorizes unreadable prompt files as prompt_parse_error +ok 63 - categorizes unreadable prompt files as prompt_parse_error + --- + duration_ms: 100.122063 + type: 'test' + ... +# Subtest: categorizes invalid prompt schema as prompt_schema_error +ok 64 - categorizes invalid prompt schema as prompt_schema_error + --- + duration_ms: 93.053842 + type: 'test' + ... +# Subtest: categorizes handoff runtime failures as execution_error +ok 65 - categorizes handoff runtime failures as execution_error + --- + duration_ms: 357.688071 + type: 'test' + ... +# Subtest: retries lock acquisition for backend error and succeeds on a later attempt +ok 66 - retries lock acquisition for backend error and succeeds on a later attempt + --- + duration_ms: 421.136622 + type: 'test' + ... +# Subtest: stops retrying after configured lock backend retries are exhausted +ok 67 - stops retrying after configured lock backend retries are exhausted + --- + duration_ms: 104.569613 + type: 'test' + ... +# Subtest: does not use backend retry flow for exit code 3 lock conflicts +ok 68 - does not use backend retry flow for exit code 3 lock conflicts + --- + duration_ms: 424.980927 + type: 'test' + ... +# Subtest: runs selected scheduler prompt through configured runner command +ok 69 - runs selected scheduler prompt through configured runner command + --- + duration_ms: 510.100629 + type: 'test' + ... +# Subtest: propagates non-zero runner exit code +ok 70 - propagates non-zero runner exit code + --- + duration_ms: 480.166197 + type: 'test' + ... +# Subtest: scheduler lock backend failure artifact matches required frontmatter schema +ok 71 - scheduler lock backend failure artifact matches required frontmatter schema + --- + duration_ms: 172.163283 + type: 'test' + ... +# Subtest: schema contract catches missing required lock-backend field +ok 72 - schema contract catches missing required lock-backend field + --- + duration_ms: 3.09229 + type: 'test' + ... +# Subtest: schema contract catches misnamed lock-backend key +ok 73 - schema contract catches misnamed lock-backend key + --- + duration_ms: 0.819141 + type: 'test' + ... +# Subtest: lock preflight e2e: successful lock writes completed status snapshot +ok 74 - lock preflight e2e: successful lock writes completed status snapshot + --- + duration_ms: 582.82363 + type: 'test' + ... +# Subtest: lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker +ok 75 - lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker + --- + duration_ms: 144.296314 + type: 'test' + ... +# Subtest: lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification +ok 76 - lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification + --- + duration_ms: 107.592925 + type: 'test' + ... +# Subtest: Scheduler Ratchet Logic (Log Checking) + # Subtest: excludes agents completed today (daily) + ok 1 - excludes agents completed today (daily) + --- + duration_ms: 3.107227 + type: 'test' + ... + # Subtest: excludes agents completed this week (weekly) + ok 2 - excludes agents completed this week (weekly) + --- + duration_ms: 0.480117 + type: 'test' + ... + # Subtest: combines locked and completed agents in exclusion list + ok 3 - combines locked and completed agents in exclusion list + --- + duration_ms: 0.697311 + type: 'test' + ... + # Subtest: ignores logs when --ignore-logs is set + ok 4 - ignores logs when --ignore-logs is set + --- + duration_ms: 0.372914 + type: 'test' + ... + # Subtest: handles missing log directory gracefully + ok 5 - handles missing log directory gracefully + --- + duration_ms: 0.413321 + type: 'test' + ... + 1..5 +ok 77 - Scheduler Ratchet Logic (Log Checking) + --- + duration_ms: 6.747592 + type: 'suite' + ... +# Subtest: Scheduler cycle ordering guarantees + # Subtest: keeps optional preflight before lock-acquire and preserves handoff/artifact/validation/complete ordering + ok 1 - keeps optional preflight before lock-acquire and preserves handoff/artifact/validation/complete ordering + --- + duration_ms: 13.40241 + type: 'test' + ... + # Subtest: includes lock backend failure metadata and classifier checkpoints + ok 2 - includes lock backend failure metadata and classifier checkpoints + --- + duration_ms: 2.247956 + type: 'test' + ... + 1..2 +ok 78 - Scheduler cycle ordering guarantees + --- + duration_ms: 16.209926 + type: 'suite' + ... +# Subtest: summarizes recent lock reliability by platform/cadence/backend/relay +ok 79 - summarizes recent lock reliability by platform/cadence/backend/relay + --- + duration_ms: 109.166646 + type: 'test' + ... +# Subtest: loadTorchConfig (Unit Tests with Mocked FS) + # Subtest: loads valid config correctly + ok 1 - loads valid config correctly + --- + duration_ms: 4.028814 + type: 'test' + ... + # Subtest: returns default config when file is missing + ok 2 - returns default config when file is missing + --- + duration_ms: 0.439029 + type: 'test' + ... + # Subtest: throws error on malformed JSON + ok 3 - throws error on malformed JSON + --- + duration_ms: 0.914997 + type: 'test' + ... + # Subtest: caches the config and ignores subsequent fs calls + ok 4 - caches the config and ignores subsequent fs calls + --- + duration_ms: 0.806137 + type: 'test' + ... + 1..4 +ok 80 - loadTorchConfig (Unit Tests with Mocked FS) + --- + duration_ms: 7.949153 + type: 'suite' + ... +# Subtest: torch-config + # Subtest: getTorchConfigPath + # Subtest: returns default path when env var is not set + ok 1 - returns default path when env var is not set + --- + duration_ms: 1.008551 + type: 'test' + ... + # Subtest: returns custom path when env var is set + ok 2 - returns custom path when env var is set + --- + duration_ms: 0.393877 + type: 'test' + ... + 1..2 + ok 1 - getTorchConfigPath + --- + duration_ms: 3.011779 + type: 'suite' + ... + # Subtest: parseTorchConfig + # Subtest: parses new lock backend knobs + ok 1 - parses new lock backend knobs + --- + duration_ms: 1.628688 + type: 'test' + ... + 1..1 + ok 2 - parseTorchConfig + --- + duration_ms: 1.807937 + type: 'suite' + ... + # Subtest: loadTorchConfig + # Subtest: throws fatal error for invalid relay URL + ok 1 - throws fatal error for invalid relay URL + --- + duration_ms: 2.108443 + type: 'test' + ... + # Subtest: throws fatal error for invalid timeout range + ok 2 - throws fatal error for invalid timeout range + --- + duration_ms: 1.309529 + type: 'test' + ... + # Subtest: throws error for malformed JSON + ok 3 - throws error for malformed JSON + --- + duration_ms: 0.782161 + type: 'test' + ... + 1..3 + ok 3 - loadTorchConfig + --- + duration_ms: 5.010431 + type: 'suite' + ... + # Subtest: backend getters + # Subtest: returns default relays + ok 1 - returns default relays + --- + duration_ms: 0.959893 + type: 'test' + ... + # Subtest: validates env knob values + ok 2 - validates env knob values + --- + duration_ms: 0.99326 + type: 'test' + ... + 1..2 + ok 4 - backend getters + --- + duration_ms: 4.225613 + type: 'suite' + ... + 1..4 +ok 81 - torch-config + --- + duration_ms: 15.414386 + type: 'suite' + ... +# Subtest: Date Utilities + # Subtest: getIsoWeekStr + # Subtest: returns correct ISO week for simple cases + ok 1 - returns correct ISO week for simple cases + --- + duration_ms: 1.646163 + type: 'test' + ... + # Subtest: handles year boundaries correctly + ok 2 - handles year boundaries correctly + --- + duration_ms: 0.468622 + type: 'test' + ... + # Subtest: handles leap years + ok 3 - handles leap years + --- + duration_ms: 2.394581 + type: 'test' + ... + # Subtest: handles empty input (defaults to today) + ok 4 - handles empty input (defaults to today) + --- + duration_ms: 0.469912 + type: 'test' + ... + # Subtest: handles invalid input gracefully + ok 5 - handles invalid input gracefully + --- + duration_ms: 0.508305 + type: 'test' + ... + 1..5 + ok 1 - getIsoWeekStr + --- + duration_ms: 7.158361 + type: 'suite' + ... + 1..1 +ok 82 - Date Utilities + --- + duration_ms: 7.884209 + type: 'suite' + ... +# Subtest: passes when artifacts include metadata and failure IDs map to unresolved known issue entries +ok 83 - passes when artifacts include metadata and failure IDs map to unresolved known issue entries + --- + duration_ms: 113.480675 + type: 'test' + ... +# Subtest: fails when required metadata is missing from artifacts +ok 84 - fails when required metadata is missing from artifacts + --- + duration_ms: 82.537586 + type: 'test' + ... +# Subtest: fails when failure identifiers are not cross-linked to known issues or incidents +ok 85 - fails when failure identifiers are not cross-linked to known issues or incidents + --- + duration_ms: 92.094837 + type: 'test' + ... +# Subtest: schema validation covers required fields, coercion, and rejection paths +ok 86 - schema validation covers required fields, coercion, and rejection paths + --- + duration_ms: 3.664967 + type: 'test' + ... +# Subtest: summarizer parser accepts valid json and recovers after malformed json response +ok 87 - summarizer parser accepts valid json and recovers after malformed json response + --- + duration_ms: 2.73789 + type: 'test' + ... +# Subtest: ingest integration persists memory records and links embeddings from event batches +ok 88 - ingest integration persists memory records and links embeddings from event batches + --- + duration_ms: 4.941745 + type: 'test' + ... +# Subtest: retrieval ranking blends semantic, importance, and recency signals +ok 89 - retrieval ranking blends semantic, importance, and recency signals + --- + duration_ms: 0.968013 + type: 'test' + ... +# Subtest: pruner policy protects pins, merges duplicates, and picks archive/delete outcomes +ok 90 - pruner policy protects pins, merges duplicates, and picks archive/delete outcomes + --- + duration_ms: 1.99021 + type: 'test' + ... +# Subtest: scheduler smoke test handles mocked clock and lock contention +ok 91 - scheduler smoke test handles mocked clock and lock contention + --- + duration_ms: 32.335004 + type: 'test' + ... +1..91 +# tests 146 +# suites 23 +# pass 145 +# fail 1 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 9158.321137 diff --git a/test_output_full.txt b/test_output_full.txt index 4ce136d..5aaf59d 100644 --- a/test_output_full.txt +++ b/test_output_full.txt @@ -1,6 +1,6 @@ > torch-lock@0.1.0 test -> npm run validate:scheduler && npm run test:integration:e2e && node --test test/*.test.mjs tests/*.test.js test/cli-parser.test.mjs test/lib.test.mjs +> npm run validate:scheduler && npm run test:integration:e2e && node --test test/*.test.mjs tests/*.test.js > torch-lock@0.1.0 validate:scheduler @@ -17,19 +17,19 @@ 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: 113.187003 + duration_ms: 121.770879 type: 'test' ... # Subtest: schema contract catches missing required lock-backend field ok 2 - schema contract catches missing required lock-backend field --- - duration_ms: 2.04682 + duration_ms: 1.83837 type: 'test' ... # Subtest: schema contract catches misnamed lock-backend key ok 3 - schema contract catches misnamed lock-backend key --- - duration_ms: 0.530155 + duration_ms: 0.471656 type: 'test' ... 1..3 @@ -40,7 +40,7 @@ ok 3 - schema contract catches misnamed lock-backend key # cancelled 0 # skipped 0 # todo 0 -# duration_ms 208.177362 +# duration_ms 211.659533 > torch-lock@0.1.0 test:integration:e2e > node --test test/scheduler-preflight-lock.e2e.test.mjs @@ -49,19 +49,19 @@ 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: 431.690059 + duration_ms: 415.430165 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: 131.767309 + duration_ms: 102.84011 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: 114.287449 + duration_ms: 98.428885 type: 'test' ... 1..3 @@ -72,60 +72,60 @@ ok 3 - lock preflight e2e: non-lock failure exits failed without prompt parse/sc # cancelled 0 # skipped 0 # todo 0 -# duration_ms 764.828908 +# duration_ms 708.324143 TAP version 13 # Subtest: parseArgs should parse basic command ok 1 - parseArgs should parse basic command --- - duration_ms: 1.620443 + duration_ms: 1.685455 type: 'test' ... # Subtest: parseArgs should parse agent and cadence ok 2 - parseArgs should parse agent and cadence --- - duration_ms: 0.277377 + duration_ms: 0.323604 type: 'test' ... # Subtest: parseArgs should parse equals sign syntax ok 3 - parseArgs should parse equals sign syntax --- - duration_ms: 2.057448 + duration_ms: 1.790786 type: 'test' ... # Subtest: parseArgs should parse dry-run flag ok 4 - parseArgs should parse dry-run flag --- - duration_ms: 0.418567 + duration_ms: 0.527205 type: 'test' ... # Subtest: parseArgs should parse port with default ok 5 - parseArgs should parse port with default --- - duration_ms: 0.205075 + duration_ms: 0.201425 type: 'test' ... # Subtest: parseArgs should parse custom port ok 6 - parseArgs should parse custom port --- - duration_ms: 0.184827 + duration_ms: 0.221183 type: 'test' ... # Subtest: parseArgs should parse ignore-logs flag ok 7 - parseArgs should parse ignore-logs flag --- - duration_ms: 0.328366 + duration_ms: 0.273635 type: 'test' ... # Subtest: parseArgs should parse memory flags ok 8 - parseArgs should parse memory flags --- - duration_ms: 1.159906 + duration_ms: 1.104 type: 'test' ... # Subtest: parseArgs should parse memory flags with equals ok 9 - parseArgs should parse memory flags with equals --- - duration_ms: 0.688999 + duration_ms: 0.574803 type: 'test' ... # Subtest: src/lib.mjs @@ -133,1090 +133,1090 @@ ok 9 - parseArgs should parse memory flags with equals # Subtest: returns correct structure with empty locks ok 1 - returns correct structure with empty locks --- - duration_ms: 2.919645 + duration_ms: 2.816145 type: 'test' ... # Subtest: identifies locked agents ok 2 - identifies locked agents --- - duration_ms: 0.969385 + duration_ms: 0.590764 type: 'test' ... # Subtest: excludes paused agents ok 3 - excludes paused agents --- - duration_ms: 0.808782 + duration_ms: 0.558185 type: 'test' ... # Subtest: identifies unknown locked agents ok 4 - identifies unknown locked agents --- - duration_ms: 0.965329 + duration_ms: 0.813845 type: 'test' ... 1..4 ok 1 - cmdCheck --- - duration_ms: 7.092631 + duration_ms: 6.089494 type: 'suite' ... # Subtest: cmdLock # Subtest: successfully locks an available agent ok 1 - successfully locks an available agent --- - duration_ms: 15.796158 + duration_ms: 13.841776 type: 'test' ... # Subtest: fails if agent is not in roster ok 2 - fails if agent is not in roster --- - duration_ms: 1.289443 + duration_ms: 1.214024 type: 'test' ... # Subtest: fails if agent is already locked ok 3 - fails if agent is already locked --- - duration_ms: 0.520591 + duration_ms: 0.541782 type: 'test' ... # Subtest: fails if agent is already completed ok 4 - fails if agent is already completed --- - duration_ms: 0.579941 + duration_ms: 0.55403 type: 'test' ... # Subtest: fails if race check is lost ok 5 - fails if race check is lost --- - duration_ms: 7.619904 + duration_ms: 4.85296 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: 14.865596 + duration_ms: 14.596956 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: 2.930522 + duration_ms: 2.739246 type: 'test' ... # Subtest: dry run does not publish ok 8 - dry run does not publish --- - duration_ms: 0.728273 + duration_ms: 0.465051 type: 'test' ... 1..8 ok 2 - cmdLock --- - duration_ms: 45.622223 + duration_ms: 39.936481 type: 'suite' ... # Subtest: cmdList # Subtest: lists active locks ok 1 - lists active locks --- - duration_ms: 0.843279 + duration_ms: 0.854846 type: 'test' ... # Subtest: warns about unknown agents ok 2 - warns about unknown agents --- - duration_ms: 0.342592 + duration_ms: 0.403812 type: 'test' ... # Subtest: handles no locks ok 3 - handles no locks --- - duration_ms: 0.40154 + duration_ms: 0.384594 type: 'test' ... 1..3 ok 3 - cmdList --- - duration_ms: 1.802133 + duration_ms: 1.836981 type: 'suite' ... # Subtest: cmdComplete # Subtest: successfully completes an active lock ok 1 - successfully completes an active lock --- - duration_ms: 1.018085 + duration_ms: 1.016898 type: 'test' ... # Subtest: fails if no active lock found ok 2 - fails if no active lock found --- - duration_ms: 0.359386 + duration_ms: 1.525048 type: 'test' ... # Subtest: detects already completed task ok 3 - detects already completed task --- - duration_ms: 0.433073 + duration_ms: 0.323407 type: 'test' ... 1..3 ok 4 - cmdComplete --- - duration_ms: 1.989418 + duration_ms: 3.040866 type: 'suite' ... 1..4 ok 10 - src/lib.mjs --- - duration_ms: 57.546812 + duration_ms: 51.803231 type: 'suite' ... # Published to 1/3 relays (required=1, timeout=25ms) # Published to 2/2 relays (required=2, timeout=25ms) # Published to 2/3 relays (required=2, timeout=25ms) -# (node:10747) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time +# (node:5073) 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: 21.97099 + duration_ms: 22.867919 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: 3.762778 + duration_ms: 3.463595 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: 2.945008 + duration_ms: 2.837146 type: 'test' ... 1..3 ok 11 - ci-resilience lock acquisition under unstable relays --- - duration_ms: 30.460506 + duration_ms: 30.970043 type: 'suite' ... # Published to 1/1 relays (required=1, timeout=200ms) # Published to 1/1 relays (required=1, timeout=200ms) -# (node:10764) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time +# (node:5087) 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.49731 + duration_ms: 5.337903 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: 2.514908 + duration_ms: 2.636833 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: 4.142038 + duration_ms: 4.013577 type: 'test' ... # Subtest: short-circuits non-retryable failures without extra attempts ok 4 - short-circuits non-retryable failures without extra attempts --- - duration_ms: 1.895161 + duration_ms: 1.542848 type: 'test' ... 1..4 ok 12 - publishLock retry behavior --- - duration_ms: 15.809506 + duration_ms: 15.12443 type: 'suite' ... # Published to 2/2 relays (required=1, timeout=200ms) # {"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) -# {"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) # {"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) # {"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) +# {"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) # {"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) # {"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) -# {"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} +# {"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":1}],"totalElapsedMs":1} # 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.724025 + duration_ms: 1.750661 type: 'test' ... 1..1 ok 1 - parseLockEvent --- - duration_ms: 2.821259 + duration_ms: 2.788494 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.303634 + duration_ms: 16.444853 type: 'test' ... 1..1 ok 2 - queryLocks --- - duration_ms: 16.570043 + duration_ms: 16.697436 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: 7.211161 + duration_ms: 6.647837 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.64143 + duration_ms: 2.27873 type: 'test' ... # Subtest: fails without retry for persistent validation failures ok 3 - fails without retry for persistent validation failures --- - duration_ms: 1.182058 + duration_ms: 1.235408 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: 2.589672 + duration_ms: 1.770122 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.498691 + duration_ms: 1.149744 type: 'test' ... # Subtest: uses fallback relays to satisfy min success quorum ok 6 - uses fallback relays to satisfy min success quorum --- - duration_ms: 1.41078 + duration_ms: 1.2818 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: 2.300327 + duration_ms: 2.47081 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.210666 + duration_ms: 1.943155 type: 'test' ... 1..8 ok 3 - publishLock --- - duration_ms: 20.954015 + duration_ms: 19.743081 type: 'suite' ... 1..3 ok 13 - lock-ops --- - duration_ms: 41.436378 + duration_ms: 40.425701 type: 'suite' ... # memory_telemetry { # event: 'memory:ingested', # payload: { -# memory_id: '2117ead5-3b9d-4844-b481-1ef5f24b4751', +# memory_id: 'e599d68c-bbd6-4264-a15d-5b1f25561181', # agent_id: 'agent-telemetry', -# dedupe_key: 'e7ded6e3f76233804d735eaa761caac09e07587175c70721167158477ef2428e', +# dedupe_key: 'c84091fd99eb8999572ca8dbaba22415c9aac8f6364590c53814c2e67dbfb494', # chunk_events: 1, # window_start: 0, -# window_end: 1771186401441 +# window_end: 1771201834981 # }, -# ts: 1771186401448 +# ts: 1771201834985 # } # memory_metric { # metric: 'memory_ingested_total', # payload: { count: 1 }, -# ts: 1771186401449 +# ts: 1771201834987 # } # memory_metric { # metric: 'memory_retrieved_total', -# payload: { count: 1, cache_hit: false }, -# ts: 1771186401450 +# payload: { count: 2, cache_hit: false }, +# ts: 1771201834989 # } # memory_telemetry { # event: 'memory:pruned', # payload: { pruned_count: 1, retention_ms: 1000, dry_run: true }, -# ts: 1771186401452 +# ts: 1771201834991 # } # memory_metric { # metric: 'memory_pruned_total', # payload: { count: 0, retention_ms: 1000, dry_run: true }, -# ts: 1771186401452 +# ts: 1771201834991 # } # memory_telemetry { # event: 'memory:prune_skipped', # payload: { reason: 'flag_disabled', retention_ms: 1000 }, -# ts: 1771186401452 +# ts: 1771201834992 # } # Subtest: listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks ok 14 - listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks --- - duration_ms: 3.004044 + duration_ms: 2.607692 type: 'test' ... # Subtest: triggerPruneDryRun returns candidate metadata without deleting records ok 15 - triggerPruneDryRun returns candidate metadata without deleting records --- - duration_ms: 0.499711 + duration_ms: 2.488593 type: 'test' ... # Subtest: memoryStats reports counts/rates and retrieval telemetry remains redaction-safe ok 16 - memoryStats reports counts/rates and retrieval telemetry remains redaction-safe --- - duration_ms: 10.910469 + duration_ms: 11.239041 type: 'test' ... # Subtest: runPruneCycle respects prune feature-flag modes ok 17 - runPruneCycle respects prune feature-flag modes --- - duration_ms: 1.466885 + duration_ms: 1.413913 type: 'test' ... # Subtest: stores runtime events in signer/session namespace and clears scope ok 18 - stores runtime events in signer/session namespace and clears scope --- - duration_ms: 2.84762 + duration_ms: 2.816524 type: 'test' ... # Subtest: expires runtime events and records expiration metrics ok 19 - expires runtime events and records expiration metrics --- - duration_ms: 10.99748 + duration_ms: 10.773565 type: 'test' ... # Subtest: enforces LRU bounds and tracks eviction metrics ok 20 - enforces LRU bounds and tracks eviction metrics --- - duration_ms: 0.733276 + duration_ms: 0.554707 type: 'test' ... # Subtest: blocks decrypted/session-sensitive data from durable promotion without sanitizer pass ok 21 - blocks decrypted/session-sensitive data from durable promotion without sanitizer pass --- - duration_ms: 0.393937 + duration_ms: 0.441412 type: 'test' ... # Subtest: createEmbedderAdapter selects in-memory backend and supports vector CRUD ok 22 - createEmbedderAdapter selects in-memory backend and supports vector CRUD --- - duration_ms: 2.86485 + duration_ms: 1.736512 type: 'test' ... # Subtest: createEmbedderAdapter reads backend from environment ok 23 - createEmbedderAdapter reads backend from environment --- - duration_ms: 0.489315 + duration_ms: 0.578018 type: 'test' ... # Subtest: memory feature flags parse defaults and canary allow-lists ok 24 - memory feature flags parse defaults and canary allow-lists --- - duration_ms: 1.434389 + duration_ms: 2.16106 type: 'test' ... # Subtest: memory prune flag supports off, dry-run, and active modes ok 25 - memory prune flag supports off, dry-run, and active modes --- - duration_ms: 0.33523 + duration_ms: 0.463804 type: 'test' ... # Subtest: ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry ok 26 - ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry --- - duration_ms: 6.394873 + duration_ms: 6.484281 type: 'test' ... # Subtest: ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket ok 27 - ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket --- - duration_ms: 1.126878 + duration_ms: 1.013251 type: 'test' ... # Subtest: createLifecyclePlan respects delete safety constraints and logs reasons ok 28 - createLifecyclePlan respects delete safety constraints and logs reasons --- - duration_ms: 2.742536 + duration_ms: 2.596023 type: 'test' ... # Subtest: createLifecyclePlan condenses near-duplicates and archives merged source records ok 29 - createLifecyclePlan condenses near-duplicates and archives merged source records --- - duration_ms: 1.079231 + duration_ms: 1.077903 type: 'test' ... # Subtest: applyLifecycleActions executes keep/archive/delete and merge markers ok 30 - applyLifecycleActions executes keep/archive/delete and merge markers --- - duration_ms: 1.36098 + duration_ms: 1.390778 type: 'test' ... # Subtest: filterAndRankMemories applies metadata filters and composite score ok 31 - filterAndRankMemories applies metadata filters and composite score --- - duration_ms: 2.950958 + duration_ms: 2.982409 type: 'test' ... # Subtest: formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming ok 32 - formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming --- - duration_ms: 2.739927 + duration_ms: 2.767759 type: 'test' ... # Subtest: isMemoryRetrievalEnabled supports global toggle and agent canary list ok 33 - isMemoryRetrievalEnabled supports global toggle and agent canary list --- - duration_ms: 0.448947 + duration_ms: 0.428266 type: 'test' ... # Subtest: renderPromptWithMemoryContext injects bounded memory block before base prompt ok 34 - renderPromptWithMemoryContext injects bounded memory block before base prompt --- - duration_ms: 0.829988 + duration_ms: 0.838442 type: 'test' ... # Subtest: createDbAdvisoryLockProvider acquires and releases postgres advisory locks ok 35 - createDbAdvisoryLockProvider acquires and releases postgres advisory locks --- - duration_ms: 2.589181 + duration_ms: 2.456004 type: 'test' ... # Subtest: startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries ok 36 - startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries --- - duration_ms: 26.977701 + duration_ms: 27.869404 type: 'test' ... # Subtest: startMemoryMaintenanceScheduler skips jobs when feature flags disable memory ok 37 - startMemoryMaintenanceScheduler skips jobs when feature flags disable memory --- - duration_ms: 11.361744 + duration_ms: 12.078956 type: 'test' ... # Subtest: normalizeMemoryItem applies durable schema defaults and coercions ok 38 - normalizeMemoryItem applies durable schema defaults and coercions --- - duration_ms: 2.791732 + duration_ms: 2.592074 type: 'test' ... # Subtest: validateMemoryItem reports field-level errors ok 39 - validateMemoryItem reports field-level errors --- - duration_ms: 0.562119 + duration_ms: 0.518268 type: 'test' ... # Subtest: ingestEvents rejects invalid writes and logs structured validation details ok 40 - ingestEvents rejects invalid writes and logs structured validation details --- - duration_ms: 6.509995 + duration_ms: 5.908416 type: 'test' ... # Subtest: loadMemoryPromptTemplates loads all memory prompt templates from disk ok 41 - loadMemoryPromptTemplates loads all memory prompt templates from disk --- - duration_ms: 2.92964 + duration_ms: 1.708296 type: 'test' ... # Subtest: summarizeEvents retries with repair prompt when first response is malformed JSON ok 42 - summarizeEvents retries with repair prompt when first response is malformed JSON --- - duration_ms: 2.465327 + duration_ms: 2.179823 type: 'test' ... # Subtest: summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice ok 43 - summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice --- - duration_ms: 1.808332 + duration_ms: 1.827436 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: 182.814575 + duration_ms: 208.310325 type: 'test' ... # Subtest: should fail when checking without cadence ok 2 - should fail when checking without cadence --- - duration_ms: 166.438326 + duration_ms: 227.897533 type: 'test' ... # Subtest: should include paused agents in check output ok 3 - should include paused agents in check output --- - duration_ms: 1195.679046 + duration_ms: 1059.231628 type: 'test' ... 1..3 ok 44 - CLI Smoke Test --- - duration_ms: 1546.840524 + duration_ms: 1497.363256 type: 'suite' ... -# Initializing torch configuration in /app/test-ops-MYawHJ/project1/torch... +# Initializing torch configuration in /app/test-ops-p7xZ5R/project1/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json # Created torch/roster.json # Created torch/META_PROMPTS.md # Created torch/scheduler-flow.md # Created torch/daily-scheduler.md # Created torch/weekly-scheduler.md -# Created torch/scripts/check-file-size.mjs -# Created torch/scripts/check-innerhtml.mjs # Created 22 files in torch/prompts/daily/ # Created 21 files in torch/prompts/weekly/ -# Created torch-config.json with namespace "torch-908041f9" +# Created torch/torch-config.json with namespace "torch-582c5f93" # Initialization complete. # You can now customize the files in torch/ and torch/prompts/. -# Initializing torch configuration in /app/test-ops-MYawHJ/project2/torch... -# Initializing torch configuration in /app/test-ops-MYawHJ/project3/torch... +# Initializing torch configuration in /app/test-ops-p7xZ5R/project2/torch... +# Initializing torch configuration in /app/test-ops-p7xZ5R/project3/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json # Created torch/roster.json # Created torch/META_PROMPTS.md # Created torch/scheduler-flow.md # Created torch/daily-scheduler.md # Created torch/weekly-scheduler.md -# Created torch/scripts/check-file-size.mjs -# Created torch/scripts/check-innerhtml.mjs # Created 22 files in torch/prompts/daily/ # Created 21 files in torch/prompts/weekly/ -# Created torch-config.json with namespace "torch-4743a45e" +# Created torch/torch-config.json with namespace "torch-61d955a8" # Initialization complete. # You can now customize the files in torch/ and torch/prompts/. -# Updating torch configuration in /app/test-ops-MYawHJ/project3/torch... -# Creating backup at torch/_backups/backup_2026-02-15T20-13-21-831Z... +# Updating torch configuration in /app/test-ops-p7xZ5R/project3/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-30-35-430Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json # Updating static files... # Updated META_PROMPTS.md # Updated scheduler-flow.md # Updated daily-scheduler.md # Updated weekly-scheduler.md # Skipped roster.json (preserved) -# Updating scripts... -# Skipped check-file-size.mjs (preserved) -# Skipped check-innerhtml.mjs (preserved) # Updating prompts... # daily/: 0 added, 0 updated, 22 preserved # weekly/: 0 added, 0 updated, 21 preserved # Update complete. -# Initializing torch configuration in /app/test-ops-MYawHJ/project4/torch... +# Initializing torch configuration in /app/test-ops-p7xZ5R/project4/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json # Created torch/roster.json # Created torch/META_PROMPTS.md # Created torch/scheduler-flow.md # Created torch/daily-scheduler.md # Created torch/weekly-scheduler.md -# Created torch/scripts/check-file-size.mjs -# Created torch/scripts/check-innerhtml.mjs # Created 22 files in torch/prompts/daily/ # Created 21 files in torch/prompts/weekly/ -# Created torch-config.json with namespace "torch-e3cdf2f1" +# Created torch/torch-config.json with namespace "torch-1ffe9107" # Initialization complete. # You can now customize the files in torch/ and torch/prompts/. -# Updating torch configuration in /app/test-ops-MYawHJ/project4/torch... -# Creating backup at torch/_backups/backup_2026-02-15T20-13-21-853Z... +# Updating torch configuration in /app/test-ops-p7xZ5R/project4/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-30-35-501Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json # Updating static files... # Updated META_PROMPTS.md # Updated scheduler-flow.md # Updated daily-scheduler.md # Updated weekly-scheduler.md # Overwrote roster.json (forced) -# Updating scripts... -# Updated check-file-size.mjs (forced) -# Updated check-innerhtml.mjs (forced) # Updating prompts... # daily/: 0 added, 22 updated, 0 preserved # weekly/: 0 added, 21 updated, 0 preserved # Update complete. -# Initializing torch configuration in /app/test-ops-MYawHJ/project5/torch... +# Initializing torch configuration in /app/test-ops-p7xZ5R/project5/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json # Created torch/roster.json # Created torch/META_PROMPTS.md # Created torch/scheduler-flow.md # Created torch/daily-scheduler.md # Created torch/weekly-scheduler.md -# Created torch/scripts/check-file-size.mjs -# Created torch/scripts/check-innerhtml.mjs # Created 22 files in torch/prompts/daily/ # Created 21 files in torch/prompts/weekly/ -# Created torch-config.json with namespace "torch-2384b7ee" +# Created torch/torch-config.json with namespace "torch-60f0a30f" # Initialization complete. # You can now customize the files in torch/ and torch/prompts/. -# Updating torch configuration in /app/test-ops-MYawHJ/project5/torch... -# Creating backup at torch/_backups/backup_2026-02-15T20-13-21-882Z... +# Updating torch configuration in /app/test-ops-p7xZ5R/project5/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-30-35-599Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json # Updating static files... # Updated META_PROMPTS.md # Updated scheduler-flow.md # Updated daily-scheduler.md # Updated weekly-scheduler.md # Skipped roster.json (preserved) -# Updating scripts... -# Skipped check-file-size.mjs (preserved) -# Skipped check-innerhtml.mjs (preserved) # Updating prompts... # daily/: 0 added, 0 updated, 22 preserved # weekly/: 0 added, 0 updated, 21 preserved # Update complete. -# Initializing torch configuration in /app/test-ops-MYawHJ/project_roster/torch... +# Initializing torch configuration in /app/test-ops-p7xZ5R/project_roster/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json # Created torch/roster.json # Created torch/META_PROMPTS.md # Created torch/scheduler-flow.md # Created torch/daily-scheduler.md # Created torch/weekly-scheduler.md -# Created torch/scripts/check-file-size.mjs -# Created torch/scripts/check-innerhtml.mjs # Created 22 files in torch/prompts/daily/ # Created 21 files in torch/prompts/weekly/ -# Created torch-config.json with namespace "torch-54b8ac08" +# Created torch/torch-config.json with namespace "torch-1c746ee2" # Initialization complete. # You can now customize the files in torch/ and torch/prompts/. -# Checking locks: namespace=torch-54b8ac08, cadence=daily, date=2026-02-15 +# Checking locks: namespace=torch, cadence=daily, date=2026-02-16 # Relays: wss://relay.damus.io, wss://nos.lol, wss://relay.primal.net -# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]} -# Initializing torch configuration in /app/test-ops-MYawHJ/project_config_init/torch... +# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]} +# Initializing torch configuration in /app/test-ops-p7xZ5R/project_config_init/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json # Created torch/roster.json # Created torch/META_PROMPTS.md # Created torch/scheduler-flow.md # Created torch/daily-scheduler.md # Created torch/weekly-scheduler.md -# Created torch/scripts/check-file-size.mjs -# Created torch/scripts/check-innerhtml.mjs # Created 22 files in torch/prompts/daily/ # Created 21 files in torch/prompts/weekly/ -# Created torch-config.json with namespace "torch-efa899f0" +# Created torch/torch-config.json with namespace "torch-201f70dc" # Initialization complete. # You can now customize the files in torch/ and torch/prompts/. # Subtest: cmdInit creates directory structure and files ok 45 - cmdInit creates directory structure and files --- - duration_ms: 17.36701 + duration_ms: 50.873486 type: 'test' ... # Subtest: cmdInit fails if directory exists without force ok 46 - cmdInit fails if directory exists without force --- - duration_ms: 2.237348 + duration_ms: 1.507633 type: 'test' ... # Subtest: cmdUpdate preserves modified prompt ok 47 - cmdUpdate preserves modified prompt --- - duration_ms: 21.311809 + duration_ms: 72.4736 type: 'test' ... # Subtest: cmdUpdate overwrites prompt with force ok 48 - cmdUpdate overwrites prompt with force --- - duration_ms: 29.879284 + duration_ms: 87.143705 type: 'test' ... # Subtest: cmdUpdate creates backup ok 49 - cmdUpdate creates backup --- - duration_ms: 20.097993 + duration_ms: 120.160014 type: 'test' ... # Subtest: torch-lock check respects local roster ok 50 - torch-lock check respects local roster --- - duration_ms: 1015.011829 + duration_ms: 1036.324924 type: 'test' ... # Subtest: cmdInit creates torch-config.json with random namespace -ok 51 - cmdInit creates torch-config.json with random namespace +not ok 51 - cmdInit creates torch-config.json with random namespace --- - duration_ms: 10.937543 + duration_ms: 28.109293 type: 'test' + location: '/app/test/ops.test.mjs:125:1' + failureType: 'testCodeFailure' + error: 'torch-config.json created' + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: true + actual: false + operator: '==' + stack: |- + TestContext. (file:///app/test/ops.test.mjs:132:10) + async Test.run (node:internal/test_runner/test:1054:7) + async Test.processPendingSubtests (node:internal/test_runner/test:744:7) ... # Published to 1/3 relays (required=1, timeout=80ms) # Subtest: relay fanout quorum integration # Subtest: passes with required=1 when one relay succeeds and two fail ok 1 - passes with required=1 when one relay succeeds and two fail --- - duration_ms: 133.403363 + duration_ms: 149.768855 type: 'test' ... # Subtest: fails with quorum error for required=1 when all relays fail ok 2 - fails with quorum error for required=1 when all relays fail --- - duration_ms: 93.429309 + duration_ms: 96.489797 type: 'test' ... # Subtest: fails with required=2 when only one relay succeeds ok 3 - fails with required=2 when only one relay succeeds --- - duration_ms: 90.435224 + duration_ms: 92.13168 type: 'test' ... # Published to 2/3 relays (required=2, timeout=80ms) # Subtest: passes when delayed successes reach quorum before timeout ok 4 - passes when delayed successes reach quorum before timeout --- - duration_ms: 89.852649 + duration_ms: 89.770379 type: 'test' ... 1..4 ok 52 - relay fanout quorum integration --- - duration_ms: 408.877143 + duration_ms: 429.907769 type: 'suite' ... # Subtest: raises all-relays-down duration alert after threshold ok 53 - raises all-relays-down duration alert after threshold --- - duration_ms: 1.714447 + duration_ms: 1.653583 type: 'test' ... # Subtest: raises success-rate alert when rolling health falls below threshold ok 54 - raises success-rate alert when rolling health falls below threshold --- - duration_ms: 0.525892 + duration_ms: 0.31271 type: 'test' ... # Subtest: fails required memory policy when retrieval/storage evidence is missing ok 55 - fails required memory policy when retrieval/storage evidence is missing --- - duration_ms: 937.45108 + duration_ms: 897.322777 type: 'test' ... # Subtest: accepts required memory policy when markers or artifacts are produced ok 56 - accepts required memory policy when markers or artifacts are produced --- - duration_ms: 984.200775 + duration_ms: 917.605662 type: 'test' ... # Subtest: records backend failure metadata when lock command exits with code 2 -not ok 57 - records backend failure metadata when lock command exits with code 2 +ok 57 - records backend failure metadata when lock command exits with code 2 --- - duration_ms: 1007.754548 + duration_ms: 939.429822 type: 'test' - location: '/app/test/run-scheduler-cycle-memory-policy.test.mjs:198:1' - failureType: 'testCodeFailure' - error: |- - The input did not match the regular expression /lock_command: 'AGENT_PLATFORM=codex npm run lock:lock -- --agent agent-a --cadence daily'/. Input: - - '---\n' + - 'cadence: daily\n' + - 'agent: agent-a\n' + - 'status: failed\n' + - "reason: 'Lock backend error'\n" + - "detail: 'Lock backend error (relay_publish_quorum_failure) after 3 attempt(s). Prompt not executed. Recommended auto-remediation: Likely backend/relay connectivity issue during lock acquisition. Retry window: 60 minute(s) (max deferrals: 3). Retry command: npm run scheduler:daily Run health check: npm run lock:health -- --cadence daily Review incident runbook: docs/agent-handoffs/learnings/2026-02-15-relay-health-preflight-job.md'\n" + - 'created_at: 2026-02-15T20:13:26.081Z\n' + - 'timestamp: 2026-02-15T20:13:26.081Z\n' + - "platform: 'codex'\n" + - "failure_category: 'lock_backend_error'\n" + - "failure_class: 'backend_unavailable'\n" + - "lock_attempts_total: '3'\n" + - "lock_backoff_schedule_ms: '303, 565'\n" + - "lock_correlation_id: 'daily:agent-a:2026-02-15'\n" + - "lock_attempt_id: '3'\n" + - "lock_failure_reason_distribution: '{}'\n" + - "backend_category: 'relay_publish_quorum_failure'\n" + - "deferral_attempt_count: '1'\n" + - "deferral_first_failure_timestamp: '2026-02-15T20:13:26.076Z'\n" + - "lock_command: 'AGENT_PLATFORM=codex npm run lock:lock -- --agent agent-a --cadence daily '\n" + - "lock_idempotency_key: 'daily:agent-a:2026-02-15:fabb960c-72be-4427-85fa-a9df9051fbce'\n" + - "lock_stderr_excerpt: 'publish failed to all relays token=[REDACTED] SECRET_KEY=[REDACTED]'\n" + - "lock_stdout_excerpt: 'websocket: connection refused'\n" + - '---\n' + - '# Scheduler failed\n' + - '- reason: Lock backend error\n' + - '- detail: Lock backend error (relay_publish_quorum_failure) after 3 attempt(s). Prompt not executed. Recommended auto-remediation: Likely backend/relay connectivity issue during lock acquisition. Retry window: 60 minute(s) (max deferrals: 3). Retry command: npm run scheduler:daily Run health check: npm run lock:health -- --cadence daily Review incident runbook: docs/agent-handoffs/learnings/2026-02-15-relay-health-preflight-job.md\n' + - '- platform: codex\n' + - '- failure_category: lock_backend_error\n' + - '- failure_class: backend_unavailable\n' + - '- lock_attempts_total: 3\n' + - '- lock_backoff_schedule_ms: 303, 565\n' + - '- lock_correlation_id: daily:agent-a:2026-02-15\n' + - '- lock_attempt_id: 3\n' + - '- lock_failure_reason_distribution: {}\n' + - '- backend_category: relay_publish_quorum_failure\n' + - '- deferral_attempt_count: 1\n' + - '- deferral_first_failure_timestamp: 2026-02-15T20:13:26.076Z\n' + - '- lock_command: AGENT_PLATFORM=codex npm run lock:lock -- --agent agent-a --cadence daily \n' + - '- lock_idempotency_key: daily:agent-a:2026-02-15:fabb960c-72be-4427-85fa-a9df9051fbce\n' + - '- lock_stderr_excerpt: publish failed to all relays token=[REDACTED] SECRET_KEY=[REDACTED]\n' + - '- lock_stdout_excerpt: websocket: connection refused' - - code: 'ERR_ASSERTION' - name: 'AssertionError' - expected: - actual: |- - --- - cadence: daily - agent: agent-a - status: failed - reason: 'Lock backend error' - detail: 'Lock backend error (relay_publish_quorum_failure) after 3 attempt(s). Prompt not executed. Recommended auto-remediation: Likely backend/relay connectivity issue during lock acquisition. Retry window: 60 minute(s) (max deferrals: 3). Retry command: npm run scheduler:daily Run health check: npm run lock:health -- --cadence daily Review incident runbook: docs/agent-handoffs/learnings/2026-02-15-relay-health-preflight-job.md' - created_at: 2026-02-15T20:13:26.081Z - timestamp: 2026-02-15T20:13:26.081Z - platform: 'codex' - failure_category: 'lock_backend_error' - failure_class: 'backend_unavailable' - lock_attempts_total: '3' - lock_backoff_schedule_ms: '303, 565' - lock_correlation_id: 'daily:agent-a:2026-02-15' - lock_attempt_id: '3' - lock_failure_reason_distribution: '{}' - backend_category: 'relay_publish_quorum_failure' - deferral_attempt_count: '1' - deferral_first_failure_timestamp: '2026-02-15T20:13:26.076Z' - lock_command: 'AGENT_PLATFORM=codex npm run lock:lock -- --agent agent-a --cadence daily ' - lock_idempotency_key: 'daily:agent-a:2026-02-15:fabb960c-72be-4427-85fa-a9df9051fbce' - lock_stderr_excerpt: 'publish failed to all relays token=[REDACTED] SECRET_KEY=[REDACTED]' - lock_stdout_excerpt: 'websocket: connection refused' - --- - # Scheduler failed - - reason: Lock backend error - - detail: Lock backend error (relay_publish_quorum_failure) after 3 attempt(s). Prompt not executed. Recommended auto-remediation: Likely backend/relay connectivity issue during lock acquisition. Retry window: 60 minute(s) (max deferrals: 3). Retry command: npm run scheduler:daily Run health check: npm run lock:health -- --cadence daily Review incident runbook: docs/agent-handoffs/learnings/2026-02-15-relay-health-preflight-job.md - - platform: codex - - failure_category: lock_backend_error - - failure_class: backend_unavailable - - lock_attempts_total: 3 - - lock_backoff_schedule_ms: 303, 565 - - lock_correlation_id: daily:agent-a:2026-02-15 - - lock_attempt_id: 3 - - lock_failure_reason_distribution: {} - - backend_category: relay_publish_quorum_failure - - deferral_attempt_count: 1 - - deferral_first_failure_timestamp: 2026-02-15T20:13:26.076Z - - lock_command: AGENT_PLATFORM=codex npm run lock:lock -- --agent agent-a --cadence daily - - lock_idempotency_key: daily:agent-a:2026-02-15:fabb960c-72be-4427-85fa-a9df9051fbce - - lock_stderr_excerpt: publish failed to all relays token=[REDACTED] SECRET_KEY=[REDACTED] - - lock_stdout_excerpt: websocket: connection refused - operator: 'match' - stack: |- - TestContext. (file:///app/test/run-scheduler-cycle-memory-policy.test.mjs:222:10) - async Test.run (node:internal/test_runner/test:1054:7) - async Test.processPendingSubtests (node:internal/test_runner/test:744:7) ... # Subtest: defers backend failures in non-strict mode and reuses idempotency key on successful retry ok 58 - defers backend failures in non-strict mode and reuses idempotency key on successful retry --- - duration_ms: 912.672612 + duration_ms: 587.676896 type: 'test' ... # Subtest: fails after exceeding non-strict deferral budget ok 59 - fails after exceeding non-strict deferral budget --- - duration_ms: 248.626971 + duration_ms: 183.995273 type: 'test' ... # Subtest: strict lock mode fails immediately without deferral ok 60 - strict lock mode fails immediately without deferral --- - duration_ms: 106.189072 + duration_ms: 94.392762 type: 'test' ... # Subtest: skips lock health preflight by default when not enabled ok 61 - skips lock health preflight by default when not enabled --- - duration_ms: 406.810088 + duration_ms: 408.356406 type: 'test' ... # Subtest: fails scheduler with preflight metadata when lock health preflight is enabled ok 62 - fails scheduler with preflight metadata when lock health preflight is enabled --- - duration_ms: 134.668686 + duration_ms: 130.306827 type: 'test' ... # Subtest: categorizes unreadable prompt files as prompt_parse_error ok 63 - categorizes unreadable prompt files as prompt_parse_error --- - duration_ms: 95.881715 + duration_ms: 95.159697 type: 'test' ... # Subtest: categorizes invalid prompt schema as prompt_schema_error ok 64 - categorizes invalid prompt schema as prompt_schema_error --- - duration_ms: 96.324439 + duration_ms: 96.231108 type: 'test' ... # Subtest: categorizes handoff runtime failures as execution_error ok 65 - categorizes handoff runtime failures as execution_error --- - duration_ms: 367.972373 + duration_ms: 350.600801 type: 'test' ... # Subtest: retries lock acquisition for backend error and succeeds on a later attempt ok 66 - retries lock acquisition for backend error and succeeds on a later attempt --- - duration_ms: 429.659053 + duration_ms: 421.077291 type: 'test' ... # Subtest: stops retrying after configured lock backend retries are exhausted ok 67 - stops retrying after configured lock backend retries are exhausted --- - duration_ms: 107.180645 + duration_ms: 99.539023 type: 'test' ... # Subtest: does not use backend retry flow for exit code 3 lock conflicts ok 68 - does not use backend retry flow for exit code 3 lock conflicts --- - duration_ms: 452.544617 + duration_ms: 413.750758 type: 'test' ... # Subtest: runs selected scheduler prompt through configured runner command ok 69 - runs selected scheduler prompt through configured runner command --- - duration_ms: 363.385434 + duration_ms: 367.112982 type: 'test' ... # Subtest: propagates non-zero runner exit code ok 70 - propagates non-zero runner exit code --- - duration_ms: 381.323533 + duration_ms: 350.668272 type: 'test' ... # Subtest: scheduler lock backend failure artifact matches required frontmatter schema ok 71 - scheduler lock backend failure artifact matches required frontmatter schema --- - duration_ms: 118.780177 + duration_ms: 104.021961 type: 'test' ... # Subtest: schema contract catches missing required lock-backend field ok 72 - schema contract catches missing required lock-backend field --- - duration_ms: 2.472888 + duration_ms: 2.036584 type: 'test' ... # Subtest: schema contract catches misnamed lock-backend key ok 73 - schema contract catches misnamed lock-backend key --- - duration_ms: 0.61455 + duration_ms: 0.492985 type: 'test' ... # Subtest: lock preflight e2e: successful lock writes completed status snapshot ok 74 - lock preflight e2e: successful lock writes completed status snapshot --- - duration_ms: 423.832617 + duration_ms: 409.920243 type: 'test' ... # Subtest: lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker ok 75 - lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker --- - duration_ms: 102.67988 + duration_ms: 93.747354 type: 'test' ... # Subtest: lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification ok 76 - lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification --- - duration_ms: 93.074425 + duration_ms: 90.958934 type: 'test' ... # Subtest: Scheduler Ratchet Logic (Log Checking) # Subtest: excludes agents completed today (daily) ok 1 - excludes agents completed today (daily) --- - duration_ms: 2.682381 + duration_ms: 2.670962 type: 'test' ... # Subtest: excludes agents completed this week (weekly) ok 2 - excludes agents completed this week (weekly) --- - duration_ms: 0.583067 + duration_ms: 0.522943 type: 'test' ... # Subtest: combines locked and completed agents in exclusion list ok 3 - combines locked and completed agents in exclusion list --- - duration_ms: 0.625284 + duration_ms: 0.59901 type: 'test' ... # Subtest: ignores logs when --ignore-logs is set ok 4 - ignores logs when --ignore-logs is set --- - duration_ms: 0.360757 + duration_ms: 0.433757 type: 'test' ... # Subtest: handles missing log directory gracefully ok 5 - handles missing log directory gracefully --- - duration_ms: 0.41839 + duration_ms: 0.449843 type: 'test' ... 1..5 ok 77 - Scheduler Ratchet Logic (Log Checking) --- - duration_ms: 6.213062 + duration_ms: 6.257406 type: 'suite' ... # Subtest: Scheduler cycle ordering guarantees # Subtest: keeps optional preflight before lock-acquire and preserves handoff/artifact/validation/complete ordering ok 1 - keeps optional preflight before lock-acquire and preserves handoff/artifact/validation/complete ordering --- - duration_ms: 13.095275 + duration_ms: 13.555912 type: 'test' ... # Subtest: includes lock backend failure metadata and classifier checkpoints ok 2 - includes lock backend failure metadata and classifier checkpoints --- - duration_ms: 2.476803 + duration_ms: 2.607975 type: 'test' ... 1..2 ok 78 - Scheduler cycle ordering guarantees --- - duration_ms: 16.171833 + duration_ms: 16.763668 type: 'suite' ... # Subtest: summarizes recent lock reliability by platform/cadence/backend/relay ok 79 - summarizes recent lock reliability by platform/cadence/backend/relay --- - duration_ms: 90.135355 + duration_ms: 86.694647 type: 'test' ... # Subtest: loadTorchConfig (Unit Tests with Mocked FS) # Subtest: loads valid config correctly ok 1 - loads valid config correctly --- - duration_ms: 3.698182 + duration_ms: 3.904939 type: 'test' ... # Subtest: returns default config when file is missing ok 2 - returns default config when file is missing --- - duration_ms: 0.560655 + duration_ms: 0.509701 type: 'test' ... # Subtest: throws error on malformed JSON ok 3 - throws error on malformed JSON --- - duration_ms: 0.904083 + duration_ms: 1.46635 type: 'test' ... # Subtest: caches the config and ignores subsequent fs calls ok 4 - caches the config and ignores subsequent fs calls --- - duration_ms: 0.735535 + duration_ms: 0.79604 type: 'test' ... 1..4 ok 80 - loadTorchConfig (Unit Tests with Mocked FS) --- - duration_ms: 7.728387 + duration_ms: 8.659898 type: 'suite' ... # Subtest: torch-config @@ -1224,82 +1224,82 @@ ok 80 - loadTorchConfig (Unit Tests with Mocked FS) # Subtest: returns default path when env var is not set ok 1 - returns default path when env var is not set --- - duration_ms: 1.038823 + duration_ms: 0.973078 type: 'test' ... # Subtest: returns custom path when env var is set ok 2 - returns custom path when env var is set --- - duration_ms: 0.373229 + duration_ms: 0.406511 type: 'test' ... 1..2 ok 1 - getTorchConfigPath --- - duration_ms: 2.906623 + duration_ms: 2.869615 type: 'suite' ... # Subtest: parseTorchConfig # Subtest: parses new lock backend knobs ok 1 - parses new lock backend knobs --- - duration_ms: 1.386898 + duration_ms: 1.287776 type: 'test' ... 1..1 ok 2 - parseTorchConfig --- - duration_ms: 1.560858 + duration_ms: 1.47017 type: 'suite' ... # Subtest: loadTorchConfig # Subtest: throws fatal error for invalid relay URL ok 1 - throws fatal error for invalid relay URL --- - duration_ms: 1.653095 + duration_ms: 1.711044 type: 'test' ... # Subtest: throws fatal error for invalid timeout range ok 2 - throws fatal error for invalid timeout range --- - duration_ms: 0.918183 + duration_ms: 1.260944 type: 'test' ... # Subtest: throws error for malformed JSON ok 3 - throws error for malformed JSON --- - duration_ms: 0.676975 + duration_ms: 0.711087 type: 'test' ... 1..3 ok 3 - loadTorchConfig --- - duration_ms: 4.025461 + duration_ms: 4.547121 type: 'suite' ... # Subtest: backend getters # Subtest: returns default relays ok 1 - returns default relays --- - duration_ms: 0.716481 + duration_ms: 0.766261 type: 'test' ... # Subtest: validates env knob values ok 2 - validates env knob values --- - duration_ms: 0.906231 + duration_ms: 0.944226 type: 'test' ... 1..2 ok 4 - backend getters --- - duration_ms: 3.323674 + duration_ms: 3.422258 type: 'suite' ... 1..4 ok 81 - torch-config --- - duration_ms: 13.000003 + duration_ms: 13.542641 type: 'suite' ... # Subtest: Date Utilities @@ -1307,97 +1307,97 @@ ok 81 - torch-config # Subtest: returns correct ISO week for simple cases ok 1 - returns correct ISO week for simple cases --- - duration_ms: 1.40434 + duration_ms: 1.266249 type: 'test' ... # Subtest: handles year boundaries correctly ok 2 - handles year boundaries correctly --- - duration_ms: 0.231904 + duration_ms: 0.244726 type: 'test' ... # Subtest: handles leap years ok 3 - handles leap years --- - duration_ms: 1.523179 + duration_ms: 1.568398 type: 'test' ... # Subtest: handles empty input (defaults to today) ok 4 - handles empty input (defaults to today) --- - duration_ms: 0.382726 + duration_ms: 0.471351 type: 'test' ... # Subtest: handles invalid input gracefully ok 5 - handles invalid input gracefully --- - duration_ms: 0.409621 + duration_ms: 0.326023 type: 'test' ... 1..5 ok 1 - getIsoWeekStr --- - duration_ms: 5.224416 + duration_ms: 5.216783 type: 'suite' ... 1..1 ok 82 - Date Utilities --- - duration_ms: 5.840199 + duration_ms: 5.82092 type: 'suite' ... # Subtest: passes when artifacts include metadata and failure IDs map to unresolved known issue entries ok 83 - passes when artifacts include metadata and failure IDs map to unresolved known issue entries --- - duration_ms: 85.064858 + duration_ms: 83.793511 type: 'test' ... # Subtest: fails when required metadata is missing from artifacts ok 84 - fails when required metadata is missing from artifacts --- - duration_ms: 74.757197 + duration_ms: 71.837542 type: 'test' ... # Subtest: fails when failure identifiers are not cross-linked to known issues or incidents ok 85 - fails when failure identifiers are not cross-linked to known issues or incidents --- - duration_ms: 75.580496 + duration_ms: 76.066396 type: 'test' ... # Subtest: schema validation covers required fields, coercion, and rejection paths ok 86 - schema validation covers required fields, coercion, and rejection paths --- - duration_ms: 3.908932 + duration_ms: 3.098146 type: 'test' ... # Subtest: summarizer parser accepts valid json and recovers after malformed json response ok 87 - summarizer parser accepts valid json and recovers after malformed json response --- - duration_ms: 5.087917 + duration_ms: 2.457879 type: 'test' ... # Subtest: ingest integration persists memory records and links embeddings from event batches ok 88 - ingest integration persists memory records and links embeddings from event batches --- - duration_ms: 2.860986 + duration_ms: 4.136679 type: 'test' ... # Subtest: retrieval ranking blends semantic, importance, and recency signals ok 89 - retrieval ranking blends semantic, importance, and recency signals --- - duration_ms: 1.096624 + duration_ms: 0.962995 type: 'test' ... # Subtest: pruner policy protects pins, merges duplicates, and picks archive/delete outcomes ok 90 - pruner policy protects pins, merges duplicates, and picks archive/delete outcomes --- - duration_ms: 1.781503 + duration_ms: 1.60471 type: 'test' ... # Subtest: scheduler smoke test handles mocked clock and lock contention ok 91 - scheduler smoke test handles mocked clock and lock contention --- - duration_ms: 32.326914 + duration_ms: 31.797351 type: 'test' ... 1..91 @@ -1408,4 +1408,4 @@ ok 91 - scheduler smoke test handles mocked clock and lock contention # cancelled 0 # skipped 0 # todo 0 -# duration_ms 8379.403849 +# duration_ms 7956.630002 diff --git a/test_output_verify.log b/test_output_verify.log new file mode 100644 index 0000000..4f90dc0 --- /dev/null +++ b/test_output_verify.log @@ -0,0 +1,1399 @@ + +> 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: 240.151274 + type: 'test' + ... +# Subtest: schema contract catches missing required lock-backend field +ok 2 - schema contract catches missing required lock-backend field + --- + duration_ms: 2.010764 + type: 'test' + ... +# Subtest: schema contract catches misnamed lock-backend key +ok 3 - schema contract catches misnamed lock-backend key + --- + duration_ms: 0.823847 + type: 'test' + ... +1..3 +# tests 3 +# suites 0 +# pass 3 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 437.513779 + +> 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: 446.709108 + 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: 101.712441 + 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: 112.476161 + type: 'test' + ... +1..3 +# tests 3 +# suites 0 +# pass 3 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 747.186893 +TAP version 13 +# Subtest: parseArgs should parse basic command +ok 1 - parseArgs should parse basic command + --- + duration_ms: 1.62826 + type: 'test' + ... +# Subtest: parseArgs should parse agent and cadence +ok 2 - parseArgs should parse agent and cadence + --- + duration_ms: 0.300791 + type: 'test' + ... +# Subtest: parseArgs should parse equals sign syntax +ok 3 - parseArgs should parse equals sign syntax + --- + duration_ms: 2.038441 + type: 'test' + ... +# Subtest: parseArgs should parse dry-run flag +ok 4 - parseArgs should parse dry-run flag + --- + duration_ms: 0.357196 + type: 'test' + ... +# Subtest: parseArgs should parse port with default +ok 5 - parseArgs should parse port with default + --- + duration_ms: 0.200408 + type: 'test' + ... +# Subtest: parseArgs should parse custom port +ok 6 - parseArgs should parse custom port + --- + duration_ms: 0.238208 + type: 'test' + ... +# Subtest: parseArgs should parse ignore-logs flag +ok 7 - parseArgs should parse ignore-logs flag + --- + duration_ms: 0.282932 + type: 'test' + ... +# Subtest: parseArgs should parse memory flags +ok 8 - parseArgs should parse memory flags + --- + duration_ms: 1.109769 + type: 'test' + ... +# Subtest: parseArgs should parse memory flags with equals +ok 9 - parseArgs should parse memory flags with equals + --- + duration_ms: 0.691829 + 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: 3.991071 + type: 'test' + ... + # Subtest: identifies locked agents + ok 2 - identifies locked agents + --- + duration_ms: 0.734622 + type: 'test' + ... + # Subtest: excludes paused agents + ok 3 - excludes paused agents + --- + duration_ms: 0.989105 + type: 'test' + ... + # Subtest: identifies unknown locked agents + ok 4 - identifies unknown locked agents + --- + duration_ms: 1.393716 + type: 'test' + ... + 1..4 + ok 1 - cmdCheck + --- + duration_ms: 9.243112 + type: 'suite' + ... + # Subtest: cmdLock + # Subtest: successfully locks an available agent + ok 1 - successfully locks an available agent + --- + duration_ms: 17.055303 + type: 'test' + ... + # Subtest: fails if agent is not in roster + ok 2 - fails if agent is not in roster + --- + duration_ms: 1.596473 + type: 'test' + ... + # Subtest: fails if agent is already locked + ok 3 - fails if agent is already locked + --- + duration_ms: 0.657366 + type: 'test' + ... + # Subtest: fails if agent is already completed + ok 4 - fails if agent is already completed + --- + duration_ms: 0.858999 + type: 'test' + ... + # Subtest: fails if race check is lost + ok 5 - fails if race check is lost + --- + duration_ms: 11.086878 + 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: 20.417519 + 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: 2.852204 + type: 'test' + ... + # Subtest: dry run does not publish + ok 8 - dry run does not publish + --- + duration_ms: 0.842969 + type: 'test' + ... + 1..8 + ok 2 - cmdLock + --- + duration_ms: 57.040769 + type: 'suite' + ... + # Subtest: cmdList + # Subtest: lists active locks + ok 1 - lists active locks + --- + duration_ms: 1.344673 + type: 'test' + ... + # Subtest: warns about unknown agents + ok 2 - warns about unknown agents + --- + duration_ms: 0.449696 + type: 'test' + ... + # Subtest: handles no locks + ok 3 - handles no locks + --- + duration_ms: 0.294865 + type: 'test' + ... + 1..3 + ok 3 - cmdList + --- + duration_ms: 2.298278 + type: 'suite' + ... + # Subtest: cmdComplete + # Subtest: successfully completes an active lock + ok 1 - successfully completes an active lock + --- + duration_ms: 1.953578 + type: 'test' + ... + # Subtest: fails if no active lock found + ok 2 - fails if no active lock found + --- + duration_ms: 0.491134 + type: 'test' + ... + # Subtest: detects already completed task + ok 3 - detects already completed task + --- + duration_ms: 0.331869 + type: 'test' + ... + 1..3 + ok 4 - cmdComplete + --- + duration_ms: 2.939241 + type: 'suite' + ... + 1..4 +ok 10 - src/lib.mjs + --- + duration_ms: 72.858459 + type: 'suite' + ... +# Published to 1/3 relays (required=1, timeout=25ms) +# Published to 2/2 relays (required=2, timeout=25ms) +# Published to 2/3 relays (required=2, timeout=25ms) +# (node:11408) 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: 29.835505 + 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: 6.771204 + 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: 3.339809 + type: 'test' + ... + 1..3 +ok 11 - ci-resilience lock acquisition under unstable relays + --- + duration_ms: 42.319195 + type: 'suite' + ... +# Published to 1/1 relays (required=1, timeout=200ms) +# Published to 1/1 relays (required=1, timeout=200ms) +# (node:11427) 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.542474 + 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: 2.517607 + 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: 4.304852 + type: 'test' + ... + # Subtest: short-circuits non-retryable failures without extra attempts + ok 4 - short-circuits non-retryable failures without extra attempts + --- + duration_ms: 1.598146 + type: 'test' + ... + 1..4 +ok 12 - publishLock retry behavior + --- + duration_ms: 15.452743 + type: 'suite' + ... +# Published to 2/2 relays (required=1, timeout=200ms) +# {"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) +# {"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) +# {"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) +# {"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) +# {"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) +# {"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) +# {"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.501063 + type: 'test' + ... + 1..1 + ok 1 - parseLockEvent + --- + duration_ms: 2.551245 + 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.143847 + type: 'test' + ... + 1..1 + ok 2 - queryLocks + --- + duration_ms: 16.470971 + 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: 7.321713 + 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.316131 + type: 'test' + ... + # Subtest: fails without retry for persistent validation failures + ok 3 - fails without retry for persistent validation failures + --- + duration_ms: 1.137998 + 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.87285 + 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.191763 + type: 'test' + ... + # Subtest: uses fallback relays to satisfy min success quorum + ok 6 - uses fallback relays to satisfy min success quorum + --- + duration_ms: 1.198319 + 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: 2.410316 + 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: 0.989401 + type: 'test' + ... + 1..8 + ok 3 - publishLock + --- + duration_ms: 19.335294 + type: 'suite' + ... + 1..3 +ok 13 - lock-ops + --- + duration_ms: 39.426323 + type: 'suite' + ... +# memory_telemetry { +# event: 'memory:ingested', +# payload: { +# memory_id: 'cb3ab94f-63e2-43e4-a994-01a3b23ab509', +# agent_id: 'agent-telemetry', +# dedupe_key: '4b1ed30fca4d37f2ab4b64612772244982594e9bc5dc6a86f122edec877cd483', +# chunk_events: 1, +# window_start: 0, +# window_end: 1771202046330 +# }, +# ts: 1771202046335 +# } +# memory_metric { +# metric: 'memory_ingested_total', +# payload: { count: 1 }, +# ts: 1771202046336 +# } +# memory_metric { +# metric: 'memory_retrieved_total', +# payload: { count: 4, cache_hit: false }, +# ts: 1771202046339 +# } +# memory_telemetry { +# event: 'memory:pruned', +# payload: { pruned_count: 1, retention_ms: 1000, dry_run: true }, +# ts: 1771202046340 +# } +# memory_metric { +# metric: 'memory_pruned_total', +# payload: { count: 0, retention_ms: 1000, dry_run: true }, +# ts: 1771202046341 +# } +# memory_telemetry { +# event: 'memory:prune_skipped', +# payload: { reason: 'flag_disabled', retention_ms: 1000 }, +# ts: 1771202046341 +# } +# Subtest: listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks +ok 14 - listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks + --- + duration_ms: 2.5615 + type: 'test' + ... +# Subtest: triggerPruneDryRun returns candidate metadata without deleting records +ok 15 - triggerPruneDryRun returns candidate metadata without deleting records + --- + duration_ms: 0.471388 + type: 'test' + ... +# Subtest: memoryStats reports counts/rates and retrieval telemetry remains redaction-safe +ok 16 - memoryStats reports counts/rates and retrieval telemetry remains redaction-safe + --- + duration_ms: 10.727121 + type: 'test' + ... +# Subtest: runPruneCycle respects prune feature-flag modes +ok 17 - runPruneCycle respects prune feature-flag modes + --- + duration_ms: 1.313773 + type: 'test' + ... +# Subtest: stores runtime events in signer/session namespace and clears scope +ok 18 - stores runtime events in signer/session namespace and clears scope + --- + duration_ms: 2.743132 + type: 'test' + ... +# Subtest: expires runtime events and records expiration metrics +ok 19 - expires runtime events and records expiration metrics + --- + duration_ms: 10.584138 + type: 'test' + ... +# Subtest: enforces LRU bounds and tracks eviction metrics +ok 20 - enforces LRU bounds and tracks eviction metrics + --- + duration_ms: 0.627116 + type: 'test' + ... +# Subtest: blocks decrypted/session-sensitive data from durable promotion without sanitizer pass +ok 21 - blocks decrypted/session-sensitive data from durable promotion without sanitizer pass + --- + duration_ms: 0.355843 + type: 'test' + ... +# Subtest: createEmbedderAdapter selects in-memory backend and supports vector CRUD +ok 22 - createEmbedderAdapter selects in-memory backend and supports vector CRUD + --- + duration_ms: 1.655848 + type: 'test' + ... +# Subtest: createEmbedderAdapter reads backend from environment +ok 23 - createEmbedderAdapter reads backend from environment + --- + duration_ms: 0.52594 + type: 'test' + ... +# Subtest: memory feature flags parse defaults and canary allow-lists +ok 24 - memory feature flags parse defaults and canary allow-lists + --- + duration_ms: 1.295328 + type: 'test' + ... +# Subtest: memory prune flag supports off, dry-run, and active modes +ok 25 - memory prune flag supports off, dry-run, and active modes + --- + duration_ms: 0.293935 + type: 'test' + ... +# Subtest: ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry +ok 26 - ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry + --- + duration_ms: 5.972327 + type: 'test' + ... +# Subtest: ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket +ok 27 - ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket + --- + duration_ms: 1.084625 + type: 'test' + ... +# Subtest: createLifecyclePlan respects delete safety constraints and logs reasons +ok 28 - createLifecyclePlan respects delete safety constraints and logs reasons + --- + duration_ms: 2.538435 + type: 'test' + ... +# Subtest: createLifecyclePlan condenses near-duplicates and archives merged source records +ok 29 - createLifecyclePlan condenses near-duplicates and archives merged source records + --- + duration_ms: 1.064069 + type: 'test' + ... +# Subtest: applyLifecycleActions executes keep/archive/delete and merge markers +ok 30 - applyLifecycleActions executes keep/archive/delete and merge markers + --- + duration_ms: 1.380832 + type: 'test' + ... +# Subtest: filterAndRankMemories applies metadata filters and composite score +ok 31 - filterAndRankMemories applies metadata filters and composite score + --- + duration_ms: 3.045455 + type: 'test' + ... +# Subtest: formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming +ok 32 - formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming + --- + duration_ms: 2.755406 + type: 'test' + ... +# Subtest: isMemoryRetrievalEnabled supports global toggle and agent canary list +ok 33 - isMemoryRetrievalEnabled supports global toggle and agent canary list + --- + duration_ms: 0.515142 + type: 'test' + ... +# Subtest: renderPromptWithMemoryContext injects bounded memory block before base prompt +ok 34 - renderPromptWithMemoryContext injects bounded memory block before base prompt + --- + duration_ms: 0.848686 + type: 'test' + ... +# Subtest: createDbAdvisoryLockProvider acquires and releases postgres advisory locks +ok 35 - createDbAdvisoryLockProvider acquires and releases postgres advisory locks + --- + duration_ms: 2.468697 + type: 'test' + ... +# Subtest: startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries +ok 36 - startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries + --- + duration_ms: 26.999776 + type: 'test' + ... +# Subtest: startMemoryMaintenanceScheduler skips jobs when feature flags disable memory +ok 37 - startMemoryMaintenanceScheduler skips jobs when feature flags disable memory + --- + duration_ms: 11.083524 + type: 'test' + ... +# Subtest: normalizeMemoryItem applies durable schema defaults and coercions +ok 38 - normalizeMemoryItem applies durable schema defaults and coercions + --- + duration_ms: 4.280892 + type: 'test' + ... +# Subtest: validateMemoryItem reports field-level errors +ok 39 - validateMemoryItem reports field-level errors + --- + duration_ms: 0.524269 + type: 'test' + ... +# Subtest: ingestEvents rejects invalid writes and logs structured validation details +ok 40 - ingestEvents rejects invalid writes and logs structured validation details + --- + duration_ms: 4.703274 + type: 'test' + ... +# Subtest: loadMemoryPromptTemplates loads all memory prompt templates from disk +ok 41 - loadMemoryPromptTemplates loads all memory prompt templates from disk + --- + duration_ms: 1.48071 + type: 'test' + ... +# Subtest: summarizeEvents retries with repair prompt when first response is malformed JSON +ok 42 - summarizeEvents retries with repair prompt when first response is malformed JSON + --- + duration_ms: 2.203644 + type: 'test' + ... +# Subtest: summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice +ok 43 - summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice + --- + duration_ms: 2.635429 + 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: 291.301346 + type: 'test' + ... + # Subtest: should fail when checking without cadence + ok 2 - should fail when checking without cadence + --- + duration_ms: 349.552153 + type: 'test' + ... + # Subtest: should include paused agents in check output + ok 3 - should include paused agents in check output + --- + duration_ms: 1111.685006 + type: 'test' + ... + 1..3 +ok 44 - CLI Smoke Test + --- + duration_ms: 1756.372585 + type: 'suite' + ... +# Initializing torch configuration in /app/test-ops-vSSqGn/project1/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch-config.json with namespace "torch-f7eb217c" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Initializing torch configuration in /app/test-ops-vSSqGn/project2/torch... +# Initializing torch configuration in /app/test-ops-vSSqGn/project3/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch-config.json with namespace "torch-d0803fd4" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Updating torch configuration in /app/test-ops-vSSqGn/project3/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-34-06-883Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json +# Updating static files... +# Updated META_PROMPTS.md +# Updated scheduler-flow.md +# Updated daily-scheduler.md +# Updated weekly-scheduler.md +# Skipped roster.json (preserved) +# Updating prompts... +# daily/: 0 added, 0 updated, 22 preserved +# weekly/: 0 added, 0 updated, 21 preserved +# Update complete. +# Initializing torch configuration in /app/test-ops-vSSqGn/project4/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch-config.json with namespace "torch-bf757dfd" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Updating torch configuration in /app/test-ops-vSSqGn/project4/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-34-07-078Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json +# Updating static files... +# Updated META_PROMPTS.md +# Updated scheduler-flow.md +# Updated daily-scheduler.md +# Updated weekly-scheduler.md +# Overwrote roster.json (forced) +# Updating prompts... +# daily/: 0 added, 22 updated, 0 preserved +# weekly/: 0 added, 21 updated, 0 preserved +# Update complete. +# Initializing torch configuration in /app/test-ops-vSSqGn/project5/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch-config.json with namespace "torch-d9f56ede" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Updating torch configuration in /app/test-ops-vSSqGn/project5/torch... +# Creating backup at torch/_backups/backup_2026-02-16T00-34-07-295Z... +# Updating application directories... +# Updated src/ +# Updated bin/ +# Updated dashboard/ +# Updated landing/ +# Updated assets/ +# Updated scripts/ +# Updating application files... +# Updated package.json +# Updated build.mjs +# Updated README.md +# Updated torch-config.example.json +# Updating static files... +# Updated META_PROMPTS.md +# Updated scheduler-flow.md +# Updated daily-scheduler.md +# Updated weekly-scheduler.md +# Skipped roster.json (preserved) +# Updating prompts... +# daily/: 0 added, 0 updated, 22 preserved +# weekly/: 0 added, 0 updated, 21 preserved +# Update complete. +# Initializing torch configuration in /app/test-ops-vSSqGn/project_roster/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch-config.json with namespace "torch-5167c881" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Checking locks: namespace=torch-5167c881, cadence=daily, date=2026-02-16 +# Relays: wss://relay.damus.io, wss://nos.lol, wss://relay.primal.net +# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]} +# Initializing torch configuration in /app/test-ops-vSSqGn/project_config_init/torch... +# Copying application directories... +# Copied src/ +# Copied bin/ +# Copied dashboard/ +# Copied landing/ +# Copied assets/ +# Copied scripts/ +# Copying application files... +# Copied package.json +# Copied build.mjs +# Copied README.md +# Copied torch-config.example.json +# Created torch/roster.json +# Created torch/META_PROMPTS.md +# Created torch/scheduler-flow.md +# Created torch/daily-scheduler.md +# Created torch/weekly-scheduler.md +# Created 22 files in torch/prompts/daily/ +# Created 21 files in torch/prompts/weekly/ +# Created torch-config.json with namespace "torch-0d7d4500" +# Initialization complete. +# You can now customize the files in torch/ and torch/prompts/. +# Subtest: cmdInit creates directory structure and files +ok 45 - cmdInit creates directory structure and files + --- + duration_ms: 116.425575 + type: 'test' + ... +# Subtest: cmdInit fails if directory exists without force +ok 46 - cmdInit fails if directory exists without force + --- + duration_ms: 1.918692 + type: 'test' + ... +# Subtest: cmdUpdate preserves modified prompt +ok 47 - cmdUpdate preserves modified prompt + --- + duration_ms: 229.559826 + type: 'test' + ... +# Subtest: cmdUpdate overwrites prompt with force +ok 48 - cmdUpdate overwrites prompt with force + --- + duration_ms: 184.60354 + type: 'test' + ... +# Subtest: cmdUpdate creates backup +ok 49 - cmdUpdate creates backup + --- + duration_ms: 183.381503 + type: 'test' + ... +# Subtest: torch-lock check respects local roster +ok 50 - torch-lock check respects local roster + --- + duration_ms: 1146.057253 + type: 'test' + ... +# Subtest: cmdInit creates torch-config.json with random namespace +ok 51 - cmdInit creates torch-config.json with random namespace + --- + duration_ms: 56.595345 + type: 'test' + ... +# Published to 1/3 relays (required=1, timeout=80ms) +# Subtest: relay fanout quorum integration + # Subtest: passes with required=1 when one relay succeeds and two fail + ok 1 - passes with required=1 when one relay succeeds and two fail + --- + duration_ms: 171.873039 + type: 'test' + ... + # Subtest: fails with quorum error for required=1 when all relays fail + ok 2 - fails with quorum error for required=1 when all relays fail + --- + duration_ms: 103.155412 + type: 'test' + ... + # Subtest: fails with required=2 when only one relay succeeds + ok 3 - fails with required=2 when only one relay succeeds + --- + duration_ms: 108.682399 + type: 'test' + ... +# Published to 2/3 relays (required=2, timeout=80ms) + # Subtest: passes when delayed successes reach quorum before timeout + ok 4 - passes when delayed successes reach quorum before timeout + --- + duration_ms: 97.633222 + type: 'test' + ... + 1..4 +ok 52 - relay fanout quorum integration + --- + duration_ms: 484.115912 + type: 'suite' + ... +# Subtest: raises all-relays-down duration alert after threshold +ok 53 - raises all-relays-down duration alert after threshold + --- + duration_ms: 2.80821 + type: 'test' + ... +# Subtest: raises success-rate alert when rolling health falls below threshold +ok 54 - raises success-rate alert when rolling health falls below threshold + --- + duration_ms: 0.354661 + type: 'test' + ... +# Subtest: fails required memory policy when retrieval/storage evidence is missing +ok 55 - fails required memory policy when retrieval/storage evidence is missing + --- + duration_ms: 867.491516 + type: 'test' + ... +# Subtest: accepts required memory policy when markers or artifacts are produced +ok 56 - accepts required memory policy when markers or artifacts are produced + --- + duration_ms: 917.292328 + type: 'test' + ... +# Subtest: records backend failure metadata when lock command exits with code 2 +ok 57 - records backend failure metadata when lock command exits with code 2 + --- + duration_ms: 983.414552 + type: 'test' + ... +# Subtest: defers backend failures in non-strict mode and reuses idempotency key on successful retry +ok 58 - defers backend failures in non-strict mode and reuses idempotency key on successful retry + --- + duration_ms: 586.454659 + type: 'test' + ... +# Subtest: fails after exceeding non-strict deferral budget +ok 59 - fails after exceeding non-strict deferral budget + --- + duration_ms: 176.281973 + type: 'test' + ... +# Subtest: strict lock mode fails immediately without deferral +ok 60 - strict lock mode fails immediately without deferral + --- + duration_ms: 92.092641 + type: 'test' + ... +# Subtest: skips lock health preflight by default when not enabled +ok 61 - skips lock health preflight by default when not enabled + --- + duration_ms: 393.710507 + type: 'test' + ... +# Subtest: fails scheduler with preflight metadata when lock health preflight is enabled +ok 62 - fails scheduler with preflight metadata when lock health preflight is enabled + --- + duration_ms: 127.561572 + type: 'test' + ... +# Subtest: categorizes unreadable prompt files as prompt_parse_error +ok 63 - categorizes unreadable prompt files as prompt_parse_error + --- + duration_ms: 94.516802 + type: 'test' + ... +# Subtest: categorizes invalid prompt schema as prompt_schema_error +ok 64 - categorizes invalid prompt schema as prompt_schema_error + --- + duration_ms: 93.728806 + type: 'test' + ... +# Subtest: categorizes handoff runtime failures as execution_error +ok 65 - categorizes handoff runtime failures as execution_error + --- + duration_ms: 344.985215 + type: 'test' + ... +# Subtest: retries lock acquisition for backend error and succeeds on a later attempt +ok 66 - retries lock acquisition for backend error and succeeds on a later attempt + --- + duration_ms: 399.66793 + type: 'test' + ... +# Subtest: stops retrying after configured lock backend retries are exhausted +ok 67 - stops retrying after configured lock backend retries are exhausted + --- + duration_ms: 101.436698 + type: 'test' + ... +# Subtest: does not use backend retry flow for exit code 3 lock conflicts +ok 68 - does not use backend retry flow for exit code 3 lock conflicts + --- + duration_ms: 416.871688 + type: 'test' + ... +# Subtest: runs selected scheduler prompt through configured runner command +ok 69 - runs selected scheduler prompt through configured runner command + --- + duration_ms: 349.859998 + type: 'test' + ... +# Subtest: propagates non-zero runner exit code +ok 70 - propagates non-zero runner exit code + --- + duration_ms: 341.39237 + type: 'test' + ... +# Subtest: scheduler lock backend failure artifact matches required frontmatter schema +ok 71 - scheduler lock backend failure artifact matches required frontmatter schema + --- + duration_ms: 102.976554 + type: 'test' + ... +# Subtest: schema contract catches missing required lock-backend field +ok 72 - schema contract catches missing required lock-backend field + --- + duration_ms: 1.969747 + type: 'test' + ... +# Subtest: schema contract catches misnamed lock-backend key +ok 73 - schema contract catches misnamed lock-backend key + --- + duration_ms: 0.537546 + type: 'test' + ... +# Subtest: lock preflight e2e: successful lock writes completed status snapshot +ok 74 - lock preflight e2e: successful lock writes completed status snapshot + --- + duration_ms: 404.396931 + type: 'test' + ... +# Subtest: lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker +ok 75 - lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker + --- + duration_ms: 95.373976 + type: 'test' + ... +# Subtest: lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification +ok 76 - lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification + --- + duration_ms: 90.269496 + type: 'test' + ... +# Subtest: Scheduler Ratchet Logic (Log Checking) + # Subtest: excludes agents completed today (daily) + ok 1 - excludes agents completed today (daily) + --- + duration_ms: 2.645779 + type: 'test' + ... + # Subtest: excludes agents completed this week (weekly) + ok 2 - excludes agents completed this week (weekly) + --- + duration_ms: 0.452564 + type: 'test' + ... + # Subtest: combines locked and completed agents in exclusion list + ok 3 - combines locked and completed agents in exclusion list + --- + duration_ms: 0.540265 + type: 'test' + ... + # Subtest: ignores logs when --ignore-logs is set + ok 4 - ignores logs when --ignore-logs is set + --- + duration_ms: 0.413416 + type: 'test' + ... + # Subtest: handles missing log directory gracefully + ok 5 - handles missing log directory gracefully + --- + duration_ms: 0.351015 + type: 'test' + ... + 1..5 +ok 77 - Scheduler Ratchet Logic (Log Checking) + --- + duration_ms: 5.962229 + type: 'suite' + ... +# Subtest: Scheduler cycle ordering guarantees + # Subtest: keeps optional preflight before lock-acquire and preserves handoff/artifact/validation/complete ordering + ok 1 - keeps optional preflight before lock-acquire and preserves handoff/artifact/validation/complete ordering + --- + duration_ms: 12.773423 + type: 'test' + ... + # Subtest: includes lock backend failure metadata and classifier checkpoints + ok 2 - includes lock backend failure metadata and classifier checkpoints + --- + duration_ms: 2.042276 + type: 'test' + ... + 1..2 +ok 78 - Scheduler cycle ordering guarantees + --- + duration_ms: 15.405925 + type: 'suite' + ... +# Subtest: summarizes recent lock reliability by platform/cadence/backend/relay +ok 79 - summarizes recent lock reliability by platform/cadence/backend/relay + --- + duration_ms: 88.457505 + type: 'test' + ... +# Subtest: loadTorchConfig (Unit Tests with Mocked FS) + # Subtest: loads valid config correctly + ok 1 - loads valid config correctly + --- + duration_ms: 3.803768 + type: 'test' + ... + # Subtest: returns default config when file is missing + ok 2 - returns default config when file is missing + --- + duration_ms: 0.508882 + type: 'test' + ... + # Subtest: throws error on malformed JSON + ok 3 - throws error on malformed JSON + --- + duration_ms: 0.895634 + type: 'test' + ... + # Subtest: caches the config and ignores subsequent fs calls + ok 4 - caches the config and ignores subsequent fs calls + --- + duration_ms: 0.673118 + type: 'test' + ... + 1..4 +ok 80 - loadTorchConfig (Unit Tests with Mocked FS) + --- + duration_ms: 7.594028 + type: 'suite' + ... +# Subtest: torch-config + # Subtest: getTorchConfigPath + # Subtest: returns default path when env var is not set + ok 1 - returns default path when env var is not set + --- + duration_ms: 1.050242 + type: 'test' + ... + # Subtest: returns custom path when env var is set + ok 2 - returns custom path when env var is set + --- + duration_ms: 0.38111 + type: 'test' + ... + 1..2 + ok 1 - getTorchConfigPath + --- + duration_ms: 2.752161 + type: 'suite' + ... + # Subtest: parseTorchConfig + # Subtest: parses new lock backend knobs + ok 1 - parses new lock backend knobs + --- + duration_ms: 1.346933 + type: 'test' + ... + 1..1 + ok 2 - parseTorchConfig + --- + duration_ms: 1.529808 + type: 'suite' + ... + # Subtest: loadTorchConfig + # Subtest: throws fatal error for invalid relay URL + ok 1 - throws fatal error for invalid relay URL + --- + duration_ms: 1.814454 + type: 'test' + ... + # Subtest: throws fatal error for invalid timeout range + ok 2 - throws fatal error for invalid timeout range + --- + duration_ms: 2.078621 + type: 'test' + ... + # Subtest: throws error for malformed JSON + ok 3 - throws error for malformed JSON + --- + duration_ms: 0.811601 + type: 'test' + ... + 1..3 + ok 3 - loadTorchConfig + --- + duration_ms: 5.900837 + type: 'suite' + ... + # Subtest: backend getters + # Subtest: returns default relays + ok 1 - returns default relays + --- + duration_ms: 0.718044 + type: 'test' + ... + # Subtest: validates env knob values + ok 2 - validates env knob values + --- + duration_ms: 1.010661 + type: 'test' + ... + 1..2 + ok 4 - backend getters + --- + duration_ms: 4.092197 + type: 'suite' + ... + 1..4 +ok 81 - torch-config + --- + duration_ms: 15.385685 + type: 'suite' + ... +# Subtest: Date Utilities + # Subtest: getIsoWeekStr + # Subtest: returns correct ISO week for simple cases + ok 1 - returns correct ISO week for simple cases + --- + duration_ms: 1.370898 + type: 'test' + ... + # Subtest: handles year boundaries correctly + ok 2 - handles year boundaries correctly + --- + duration_ms: 0.217656 + type: 'test' + ... + # Subtest: handles leap years + ok 3 - handles leap years + --- + duration_ms: 1.721102 + type: 'test' + ... + # Subtest: handles empty input (defaults to today) + ok 4 - handles empty input (defaults to today) + --- + duration_ms: 0.435451 + type: 'test' + ... + # Subtest: handles invalid input gracefully + ok 5 - handles invalid input gracefully + --- + duration_ms: 0.345039 + type: 'test' + ... + 1..5 + ok 1 - getIsoWeekStr + --- + duration_ms: 5.265987 + type: 'suite' + ... + 1..1 +ok 82 - Date Utilities + --- + duration_ms: 5.795432 + type: 'suite' + ... +# Subtest: passes when artifacts include metadata and failure IDs map to unresolved known issue entries +ok 83 - passes when artifacts include metadata and failure IDs map to unresolved known issue entries + --- + duration_ms: 81.375319 + type: 'test' + ... +# Subtest: fails when required metadata is missing from artifacts +ok 84 - fails when required metadata is missing from artifacts + --- + duration_ms: 69.70169 + type: 'test' + ... +# Subtest: fails when failure identifiers are not cross-linked to known issues or incidents +ok 85 - fails when failure identifiers are not cross-linked to known issues or incidents + --- + duration_ms: 69.918486 + type: 'test' + ... +# Subtest: schema validation covers required fields, coercion, and rejection paths +ok 86 - schema validation covers required fields, coercion, and rejection paths + --- + duration_ms: 2.951137 + type: 'test' + ... +# Subtest: summarizer parser accepts valid json and recovers after malformed json response +ok 87 - summarizer parser accepts valid json and recovers after malformed json response + --- + duration_ms: 2.456 + type: 'test' + ... +# Subtest: ingest integration persists memory records and links embeddings from event batches +ok 88 - ingest integration persists memory records and links embeddings from event batches + --- + duration_ms: 3.999804 + type: 'test' + ... +# Subtest: retrieval ranking blends semantic, importance, and recency signals +ok 89 - retrieval ranking blends semantic, importance, and recency signals + --- + duration_ms: 0.831681 + type: 'test' + ... +# Subtest: pruner policy protects pins, merges duplicates, and picks archive/delete outcomes +ok 90 - pruner policy protects pins, merges duplicates, and picks archive/delete outcomes + --- + duration_ms: 1.472562 + type: 'test' + ... +# Subtest: scheduler smoke test handles mocked clock and lock contention +ok 91 - scheduler smoke test handles mocked clock and lock contention + --- + duration_ms: 32.214841 + type: 'test' + ... +1..91 +# tests 146 +# suites 23 +# pass 146 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 8318.171145