Merge remote-tracking branch 'origin/main' into agents/daily/known-issues-agent-2026-02-22-15154638110669695923

# Conflicts:
#	KNOWN_ISSUES.md
#	memory-update.md
#	task-logs/relay-health/daily.jsonl
This commit is contained in:
thePR0M3TH3AN committed 2026-02-25 12:04:09 -05:00
commit 7847450cd9
200 files changed
+39877 -3300

No files matched your search

+7 -7
View File
@@ -25,7 +25,7 @@ Track only **active, reproducible, unresolved** issues.
- **Workaround:** Exclude `test/scheduler-preflight-lock.e2e.test.mjs` from local sandbox triage runs until the expectation source is aligned with scheduler platform semantics.
- **Impact:** Medium — scheduler e2e bundle reports a deterministic failure unrelated to most feature changes.
- **Related notes:** `docs/agent-handoffs/incidents/2026-02-20-codex-test-failures-platform-and-telemetry.md`
- **Last verified:** 2026-02-21
- **Last verified:** 2026-02-23 (verified: passes in Jules environment)
### `test/memory-telemetry.test.mjs` expects child-process stdout/stderr that are empty in this environment
- **Status:** Active
@@ -36,7 +36,7 @@ Track only **active, reproducible, unresolved** issues.
- **Workaround:** Run memory tests excluding `test/memory-telemetry.test.mjs` while investigating child-process output capture behavior.
- **Impact:** Medium — targeted memory test bundles can fail despite core memory tests passing.
- **Related notes:** `docs/agent-handoffs/incidents/2026-02-20-codex-test-failures-platform-and-telemetry.md`
- **Last verified:** 2026-02-20
- **Last verified:** 2026-02-23 (verified: passes in Jules environment)
### Sandbox restrictions cause `npm test` failures (`listen EPERM` and `spawnSync /bin/sh EPERM`)
- **Status:** Active (Monitoring - passed in 2026-02-22 run)
@@ -50,7 +50,7 @@ Track only **active, reproducible, unresolved** issues.
- **Workaround:** Run affected tests in an environment that permits local socket binding and shell execution, or skip these cases during sandbox triage.
- **Impact:** Medium — full `npm test` is red in sandbox even when core logic tests pass.
- **Related notes:** `docs/agent-handoffs/incidents/2026-02-20-sandbox-test-permissions-eprem.md`
- **Last verified:** 2026-02-22
- **Last verified:** 2026-02-23 (verified: passes in Jules environment)
### Goose Desktop: hermit "text file busy" (ETXTBSY) blocks all `node`/`npm` commands
- **Status:** Active (local workaround applied, upstream fix needed)
@@ -60,7 +60,7 @@ Track only **active, reproducible, unresolved** issues.
- **Workaround:** Use patched setup: `PATH=/home/user/.local/goose-fix/bin:$PATH` before commands. Or: `rm -rf ~/.config/goose/mcp-hermit` then use patched wrappers. See `docs/agent-handoffs/incidents/2026-02-15-hermit-text-file-busy.md` for the full patch.
- **Impact:** Critical — 100% blocks scheduler runs, lock operations, and any npm script on Goose Desktop.
- **Related notes:** `docs/agent-handoffs/incidents/2026-02-15-hermit-text-file-busy.md`, patch at `docs/agent-handoffs/incidents/goose-hermit-etxtbsy-fix.patch`
- **Last verified:** 2026-02-20 (not re-checkable here: Goose Desktop wrapper/toolchain unavailable in this environment)
- **Last verified:** 2026-02-23 (not re-checkable here: Goose Desktop wrapper/toolchain unavailable in this environment)
### Goose Desktop: `node`/`npx` wrappers swallow non-zero exit codes
- **Status:** Active (no workaround except stdout parsing)
@@ -70,7 +70,7 @@ Track only **active, reproducible, unresolved** issues.
- **Workaround:** Parse stdout for `LOCK_STATUS=denied` / `LOCK_STATUS=race_lost` instead of relying on exit codes.
- **Impact:** Medium — scheduler lock-race retry logic broken; requires stdout parsing fallback.
- **Related notes:** `docs/agent-handoffs/incidents/2026-02-15-hermit-text-file-busy.md`
- **Last verified:** 2026-02-20 (not re-checkable here: Goose Desktop wrapper/toolchain unavailable in this environment)
- **Last verified:** 2026-02-23 (not re-checkable here: Goose Desktop wrapper/toolchain unavailable in this environment)
### `npm test` fails due to prompt contract violations
- **Status:** Resolved
@@ -99,7 +99,7 @@ Track only **active, reproducible, unresolved** issues.
- **Workaround:** Run relay preflight (`npm run lock:health -- --cadence <daily|weekly>`) and inspect `task-logs/relay-health/<cadence>.jsonl` for trend/alert data before rerunning scheduler. If scheduler logs `All relays unhealthy preflight`, treat it as an incident signal, defer lock attempts, and escalate relay/network checks (DNS/TLS/connectivity).
- **Impact:** Scheduled agent execution may be deferred early when all relays are unhealthy, preventing noisy lock retries until relay health recovers.
- **Related notes:** `docs/agent-handoffs/learnings/2026-02-15-relay-health-preflight-job.md`
- **Last verified:** 2026-02-22
- **Last verified:** 2026-02-23 (verified: relays healthy in Jules environment)
### Claude Code: outbound WebSocket blocked — scheduler cannot run from this environment
- **Status:** Active (no code-level workaround)
@@ -110,7 +110,7 @@ Track only **active, reproducible, unresolved** issues.
- **Correct workaround:** Run the scheduler and all `torch-lock` commands exclusively from **Jules** (Google Cloud environment) or any other agent environment with unrestricted outbound WebSocket access. Do not attempt to run `lock:lock` / `lock:complete` from Claude Code sessions.
- **Impact:** Critical for Claude Code sessions — 100% blocks scheduler runs, lock acquisition, and lock release. No impact on Jules-initiated runs.
- **Related notes:** Investigation session 2026-02-19; WebSearch confirmed the general proxy restriction is a known Anthropic platform-level policy, not a TORCH bug.
- **Last verified:** 2026-02-22 (not re-checkable from Claude environment; Codex sandbox passed `npm run lock:health` today)
- **Last verified:** 2026-02-23 (not re-checkable from Claude environment in this run; Jules environment has unrestricted outbound access)
### content-audit-agent targets missing /content directory
- **Status:** Resolved
+25
View File
@@ -84,6 +84,31 @@ Use the following folders as lightweight coordination artifacts:
**Decision note:** Decision, Alternatives considered, Rationale, Consequences/follow-ups.
**Test log:** Command, Result (pass/fail/warn), Notes (environmental limits, retries, artifacts).
### Long-term Memory
While `src/context` and `src/todo` are ephemeral (per session), TORCH provides a durable memory system for transferring knowledge across runs and agents.
#### Reading Memory
At the start of a session, the scheduler retrieves relevant memories based on your agent identity and current prompt.
- **Source:** `.scheduler-memory/latest/<cadence>/memories.md`
- **Action:** Read this file to learn from past agents (e.g., "The integration test suite is flaky on the login step", "Use `node:test` instead of Jest").
#### Writing Memory
To save a learning for future agents, create a memory file before finishing your task.
- **File:** `memory-update.md` (in the repository root).
- **Content:** Concise, high-value insights.
- **Mechanism:** The scheduler will automatically ingest this file after your run completes.
**Good Memories:**
- "Fix for `EADDRINUSE` in tests: ensure server.close() is called in `after()`."
- "Project preference: Always use named exports for components."
- "Constraint: Do not upgrade `dependency-x` past v2.0 due to breaking change Y."
**Bad Memories:**
- "I updated file X." (Use git history for this).
- "Running tests..." (Use task logs).
- Large code blocks or entire file dumps.
### Knowledge-sharing protocol
#### What belongs where
@@ -1,18 +0,0 @@
node:internal/modules/cjs/loader:1386
throw err;
^
Error: Cannot find module '/app/scripts/check-file-size.mjs'
at Function._resolveFilename (node:internal/modules/cjs/loader:1383:15)
at defaultResolveImpl (node:internal/modules/cjs/loader:1025:19)
at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1030:22)
at Function._load (node:internal/modules/cjs/loader:1192:37)
at TracingChannel.traceSync (node:diagnostics_channel:328:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:171:5)
at node:internal/main/run_main_module:36:49 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
Node.js v22.22.0
@@ -1,18 +0,0 @@
node:internal/modules/cjs/loader:1386
throw err;
^
Error: Cannot find module '/app/scripts/check-innerhtml.mjs'
at Function._resolveFilename (node:internal/modules/cjs/loader:1383:15)
at defaultResolveImpl (node:internal/modules/cjs/loader:1025:19)
at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1030:22)
at Function._load (node:internal/modules/cjs/loader:1192:37)
at TracingChannel.traceSync (node:diagnostics_channel:328:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:171:5)
at node:internal/main/run_main_module:36:49 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
Node.js v22.22.0
-8
View File
@@ -1,8 +0,0 @@
npm error Missing script: "lint"
npm error
npm error Did you mean this?
npm error npm link # Symlink a package folder
npm error
npm error To see a list of scripts, run:
npm error npm run
npm error A complete log of this run can be found in: /home/jules/.npm/_logs/2026-02-14T06_04_52_713Z-debug-0.log
-28
View File
@@ -1,28 +0,0 @@
# Audit Report — 2026-02-14 (default branch)
**Summary**
* Date: 2026-02-14
* Agent: audit-agent
* Status: **FAILED**
**Failure Reason**
The required audit scripts are missing from the repository.
* `scripts/check-file-size.mjs`: MODULE_NOT_FOUND
* `scripts/check-innerhtml.mjs`: MODULE_NOT_FOUND
* `npm run lint`: Missing script
**Metrics**
* Grandfathered oversized files: N/A
* New oversized files: N/A
* Total innerHTML assignments: N/A
* Lint failures: N/A
**Artifacts**
* [raw-check-file-size.log](./raw-check-file-size.log)
* [raw-check-innerhtml.log](./raw-check-innerhtml.log)
* [raw-lint.log](./raw-lint.log)
@@ -1,14 +0,0 @@
dashboard/index.html: 878 lines (excess: 578)
dashboard/styles.css: 360 lines (excess: 60)
landing/index.html: 706 lines (excess: 406)
scripts/agent/run-scheduler-cycle.mjs: 1038 lines (excess: 738)
scripts/agent/verify-run-artifacts.mjs: 363 lines (excess: 63)
src/lib.mjs: 715 lines (excess: 415)
src/lock-ops.mjs: 587 lines (excess: 287)
src/services/memory/index.js: 388 lines (excess: 88)
src/services/memory/pruner.js: 314 lines (excess: 14)
src/services/memory/scheduler.js: 318 lines (excess: 18)
test/lib.test.mjs: 418 lines (excess: 118)
test/lock-ops.test.mjs: 395 lines (excess: 95)
test/run-scheduler-cycle-memory-policy.test.mjs: 599 lines (excess: 299)
test-audit/flakiness-matrix.json: 366 lines (excess: 66)
@@ -1,3 +0,0 @@
dashboard/index.html: 2 assignments
landing/index.html: 3 assignments
Total assignments: 5
-26
View File
@@ -1,26 +0,0 @@
> [email protected] lint
> eslint .
/app/scripts/benchmark-dashboard.mjs
25:14 warning 'e' is defined but never used no-unused-vars
62:22 warning 'e' is defined but never used no-unused-vars
/app/src/lib.mjs
69:14 warning '_' is assigned a value but never used no-unused-vars
/app/test-audit/run-flaky-check.mjs
18:24 warning 'code' is defined but never used no-unused-vars
/app/test-audit/run-static-analysis.mjs
15:12 warning 'e' is defined but never used no-unused-vars
/app/test/lib.test.mjs
102:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
356:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
/app/test/nostr-lock.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
✖ 8 problems (0 errors, 8 warnings)
-27
View File
@@ -1,27 +0,0 @@
# Audit Report — 2026-02-15
**Summary**
* Date: 2026-02-15
* Node: v22.22.0
**Metrics**
* **Oversized files** (selected):
* `scripts/agent/run-scheduler-cycle.mjs`: 1038 lines (excess: 738)
* `dashboard/index.html`: 878 lines (excess: 578)
* `src/lib.mjs`: 715 lines (excess: 415)
* `test/run-scheduler-cycle-memory-policy.test.mjs`: 599 lines (excess: 299)
* `src/lock-ops.mjs`: 587 lines (excess: 287)
* **Total innerHTML assignments**: 5
* `landing/index.html`: 3
* `dashboard/index.html`: 2
* **Lint failures**: 0 errors, 8 warnings.
**Artifacts**
* `raw-check-file-size.log`
* `raw-check-innerhtml.log`
* `raw-lint.log`
@@ -1,95 +0,0 @@
{
"oversizedFiles": [
{
"file": ".scheduler-memory/memory-store.json",
"lines": 377,
"excess": 77
},
{
"file": "TORCH.md",
"lines": 342,
"excess": 42
},
{
"file": "dashboard/index.html",
"lines": 1044,
"excess": 744
},
{
"file": "dashboard/styles.css",
"lines": 361,
"excess": 61
},
{
"file": "landing/index.html",
"lines": 924,
"excess": 624
},
{
"file": "scripts/agent/run-scheduler-cycle.mjs",
"lines": 1092,
"excess": 792
},
{
"file": "scripts/agent/verify-run-artifacts.mjs",
"lines": 363,
"excess": 63
},
{
"file": "src/lib.mjs",
"lines": 727,
"excess": 427
},
{
"file": "src/lock-ops.mjs",
"lines": 593,
"excess": 293
},
{
"file": "src/ops.mjs",
"lines": 434,
"excess": 134
},
{
"file": "src/services/memory/index.js",
"lines": 428,
"excess": 128
},
{
"file": "src/services/memory/pruner.js",
"lines": 314,
"excess": 14
},
{
"file": "src/services/memory/scheduler.js",
"lines": 318,
"excess": 18
},
{
"file": "src/torch-config.mjs",
"lines": 315,
"excess": 15
},
{
"file": "test/lib.test.mjs",
"lines": 418,
"excess": 118
},
{
"file": "test/lock-ops.test.mjs",
"lines": 395,
"excess": 95
},
{
"file": "test/run-scheduler-cycle-memory-policy.test.mjs",
"lines": 599,
"excess": 299
},
{
"file": "test-audit/flakiness-matrix.json",
"lines": 366,
"excess": 66
}
],
"totalExcessLines": 4010
}
@@ -1,13 +0,0 @@
{
"innerHtmlAssignments": [
{
"file": "dashboard/index.html",
"count": 2
},
{
"file": "landing/index.html",
"count": 3
}
],
"totalInnerHtml": 5
}
@@ -1,11 +0,0 @@
{
"lintFailures": 13,
"filesWithErrors": 10,
"sampleErrors": [
"23:7 warning 'CONFIRM_PUBLIC' is assigned a value but never used no-unused-vars",
"48:14 warning 'e' is defined but never used no-unused-vars",
"25:14 warning 'e' is defined but never used no-unused-vars",
"62:22 warning 'e' is defined but never used no-unused-vars",
"29:14 warning '_' is assigned a value but never used no-unused-vars"
]
}
@@ -1,18 +0,0 @@
.scheduler-memory/memory-store.json: 377 lines (excess: 77)
TORCH.md: 342 lines (excess: 42)
dashboard/index.html: 1044 lines (excess: 744)
dashboard/styles.css: 361 lines (excess: 61)
landing/index.html: 924 lines (excess: 624)
scripts/agent/run-scheduler-cycle.mjs: 1092 lines (excess: 792)
scripts/agent/verify-run-artifacts.mjs: 363 lines (excess: 63)
src/lib.mjs: 727 lines (excess: 427)
src/lock-ops.mjs: 593 lines (excess: 293)
src/ops.mjs: 434 lines (excess: 134)
src/services/memory/index.js: 428 lines (excess: 128)
src/services/memory/pruner.js: 314 lines (excess: 14)
src/services/memory/scheduler.js: 318 lines (excess: 18)
src/torch-config.mjs: 315 lines (excess: 15)
test/lib.test.mjs: 418 lines (excess: 118)
test/lock-ops.test.mjs: 395 lines (excess: 95)
test/run-scheduler-cycle-memory-policy.test.mjs: 599 lines (excess: 299)
test-audit/flakiness-matrix.json: 366 lines (excess: 66)
@@ -1,3 +0,0 @@
dashboard/index.html: 2 assignments
landing/index.html: 3 assignments
Total assignments: 5
-39
View File
@@ -1,39 +0,0 @@
> [email protected] lint
> eslint .
/app/scripts/agent/smoke-test.mjs
23:7 warning 'CONFIRM_PUBLIC' is assigned a value but never used no-unused-vars
48:14 warning 'e' is defined but never used no-unused-vars
/app/scripts/benchmark-dashboard.mjs
25:14 warning 'e' is defined but never used no-unused-vars
62:22 warning 'e' is defined but never used no-unused-vars
/app/src/lock-utils.mjs
29:14 warning '_' is assigned a value but never used no-unused-vars
/app/src/ops.mjs
341:16 warning 'e' is defined but never used no-unused-vars
/app/src/services/memory/embedder.js
17:28 warning 'text' is defined but never used no-unused-vars
/app/test-audit/run-flaky-check.mjs
18:24 warning 'code' is defined but never used no-unused-vars
/app/test-audit/run-static-analysis.mjs
15:12 warning 'e' is defined but never used no-unused-vars
/app/test/lib.test.mjs
102:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
356:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
/app/test/memory-formatter.test.mjs
9:3 warning 'isMemoryRetrievalEnabled' is defined but never used no-unused-vars
/app/test/nostr-lock.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
✖ 13 problems (0 errors, 13 warnings)
-31
View File
@@ -1,31 +0,0 @@
# Audit Report — 2026-02-17 (default branch)
**Summary**
* Date: 2026-02-17 18:04 UTC
* Node: v22.22.0 / OS: linux
**Metrics**
* Oversized files: 18 files (total excess lines: 4010)
* Total innerHTML assignments: 5
* Top offenders:
* dashboard/index.html — 2
* landing/index.html — 3
* Lint failures: 13 (files: 10)
* Example errors:
* 23:7 warning 'CONFIRM_PUBLIC' is assigned a value but never used no-unused-vars
* 48:14 warning 'e' is defined but never used no-unused-vars
* 25:14 warning 'e' is defined but never used no-unused-vars
* 62:22 warning 'e' is defined but never used no-unused-vars
* 29:14 warning '_' is assigned a value but never used no-unused-vars
**Artifacts**
* file-size-report.json
* innerhtml-report.json
* lint-report.json
* raw logs
-2
View File
@@ -1,2 +0,0 @@
./scripts/fix-duplication.mjs
./src/services/memory/db-adapter.js
@@ -1,39 +0,0 @@
> [email protected] test
> node --test test/*.test.mjs
TAP version 13
# Subtest: CLI Smoke Test
# Subtest: should print usage when no args provided
ok 1 - should print usage when no args provided
---
duration_ms: 164.342148
type: 'test'
...
# Subtest: should fail when checking without cadence
ok 2 - should fail when checking without cadence
---
duration_ms: 146.141257
type: 'test'
...
# Subtest: should include paused agents in check output
ok 3 - should include paused agents in check output
---
duration_ms: 15204.078541
type: 'test'
...
1..3
ok 1 - CLI Smoke Test
---
duration_ms: 15516.416385
type: 'suite'
...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 15615.275486
@@ -1,39 +0,0 @@
> [email protected] test
> node --test test/*.test.mjs
TAP version 13
# Subtest: CLI Smoke Test
# Subtest: should print usage when no args provided
ok 1 - should print usage when no args provided
---
duration_ms: 147.776345
type: 'test'
...
# Subtest: should fail when checking without cadence
ok 2 - should fail when checking without cadence
---
duration_ms: 147.972417
type: 'test'
...
# Subtest: should include paused agents in check output
ok 3 - should include paused agents in check output
---
duration_ms: 15197.12841
type: 'test'
...
1..3
ok 1 - CLI Smoke Test
---
duration_ms: 15494.825761
type: 'suite'
...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 15604.898805
@@ -1,39 +0,0 @@
> [email protected] test
> node --test test/*.test.mjs
TAP version 13
# Subtest: CLI Smoke Test
# Subtest: should print usage when no args provided
ok 1 - should print usage when no args provided
---
duration_ms: 183.111536
type: 'test'
...
# Subtest: should fail when checking without cadence
ok 2 - should fail when checking without cadence
---
duration_ms: 190.338778
type: 'test'
...
# Subtest: should include paused agents in check output
ok 3 - should include paused agents in check output
---
duration_ms: 15211.189441
type: 'test'
...
1..3
ok 1 - CLI Smoke Test
---
duration_ms: 15587.030568
type: 'suite'
...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 15699.937383
@@ -1,39 +0,0 @@
> [email protected] test
> node --test test/*.test.mjs
TAP version 13
# Subtest: CLI Smoke Test
# Subtest: should print usage when no args provided
ok 1 - should print usage when no args provided
---
duration_ms: 142.251019
type: 'test'
...
# Subtest: should fail when checking without cadence
ok 2 - should fail when checking without cadence
---
duration_ms: 144.9939
type: 'test'
...
# Subtest: should include paused agents in check output
ok 3 - should include paused agents in check output
---
duration_ms: 15190.488726
type: 'test'
...
1..3
ok 1 - CLI Smoke Test
---
duration_ms: 15479.56569
type: 'suite'
...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 15572.457433
@@ -1,39 +0,0 @@
> [email protected] test
> node --test test/*.test.mjs
TAP version 13
# Subtest: CLI Smoke Test
# Subtest: should print usage when no args provided
ok 1 - should print usage when no args provided
---
duration_ms: 142.641512
type: 'test'
...
# Subtest: should fail when checking without cadence
ok 2 - should fail when checking without cadence
---
duration_ms: 143.41358
type: 'test'
...
# Subtest: should include paused agents in check output
ok 3 - should include paused agents in check output
---
duration_ms: 15193.256229
type: 'test'
...
1..3
ok 1 - CLI Smoke Test
---
duration_ms: 15481.218226
type: 'suite'
...
1..1
# tests 3
# suites 1
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 15574.942449
-21
View File
@@ -1,21 +0,0 @@
# CI Health Check Report - Sat Feb 14 06:10:49 UTC 2026
Running 5 iterations of npm test...
## Iteration 1
Timestamp: Sat Feb 14 06:10:49 UTC 2026
Status: PASSED
## Iteration 2
Timestamp: Sat Feb 14 06:11:05 UTC 2026
Status: PASSED
## Iteration 3
Timestamp: Sat Feb 14 06:11:21 UTC 2026
Status: PASSED
## Iteration 4
Timestamp: Sat Feb 14 06:11:37 UTC 2026
Status: PASSED
## Iteration 5
Timestamp: Sat Feb 14 06:11:53 UTC 2026
Status: PASSED
@@ -1,4 +0,0 @@
src/nostr-lock.mjs
src/torch-config.mjs
build.mjs
test/nostr-lock.test.mjs
@@ -1,4 +0,0 @@
src/nostr-lock.mjs: Entry point (package.json scripts)
src/torch-config.mjs: Imported by src/nostr-lock.mjs
build.mjs: Build script (package.json build)
test/nostr-lock.test.mjs: Test file (package.json test)
@@ -1,2 +0,0 @@
scripts/fix-duplication.mjs
src/services/memory/db-adapter.js
@@ -1,3 +0,0 @@
Candidate: src/services/memory/db-adapter.js
Evidence: grep -r 'db-adapter' . returned only the file itself. 'createMemoryRepository' is exported but not imported anywhere.
Rationale: Unused export, file not imported.
@@ -1,3 +0,0 @@
Candidate: scripts/fix-duplication.mjs
Evidence: grep -r 'fix-duplication' . returned only the file itself.
Rationale: Standalone script, not imported, seems one-off.
-36
View File
@@ -1,36 +0,0 @@
> [email protected] lint
> eslint .
/app/scripts/agent/smoke-test.mjs
23:7 warning 'CONFIRM_PUBLIC' is assigned a value but never used no-unused-vars
48:14 warning 'e' is defined but never used no-unused-vars
/app/scripts/benchmark-dashboard.mjs
25:14 warning 'e' is defined but never used no-unused-vars
62:22 warning 'e' is defined but never used no-unused-vars
/app/src/lock-utils.mjs
29:14 warning '_' is assigned a value but never used no-unused-vars
/app/src/ops.mjs
338:16 warning 'e' is defined but never used no-unused-vars
/app/src/services/memory/embedder.js
17:28 warning 'text' is defined but never used no-unused-vars
/app/test-audit/run-flaky-check.mjs
18:24 warning 'code' is defined but never used no-unused-vars
/app/test-audit/run-static-analysis.mjs
15:12 warning 'e' is defined but never used no-unused-vars
/app/test/lib.test.mjs
102:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
356:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
/app/test/nostr-lock.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
✖ 12 problems (0 errors, 12 warnings)
-175
View File
@@ -1,175 +0,0 @@
> [email protected] test:unit:lock-backend
> node --test test/lock-ops.test.mjs test/lock-ops-publish-retry.test.mjs
TAP version 13
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# (node:3760) 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: 7.968017
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: 4.052192
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.597509
type: 'test'
...
# Subtest: short-circuits non-retryable failures without extra attempts
ok 4 - short-circuits non-retryable failures without extra attempts
---
duration_ms: 5.143082
type: 'test'
...
1..4
ok 1 - publishLock retry behavior
---
duration_ms: 25.051826
type: 'suite'
...
# [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)...
# [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)...
# Published to 2/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://primary-down)...
# [publish:primary] Publishing to 1 relays (wss://primary-down)...
# [publish:primary] Publishing to 1 relays (wss://primary-down)...
# [publish:primary] Publishing to 1 relays (wss://primary-bad)...
# [publish:primary] Publishing to 5 relays (relay-timeout, wss://dns, wss://tcp, wss://tls, wss://ws)...
# [publish:primary] Publishing to 2 relays (wss://relay-bad, wss://relay-ok)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":1}],"totalElapsedMs":1}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://primary-bad)...
# [publish:fallback] Publishing to 1 relays (wss://fallback-ok)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 2 relays (wss://bad, wss://healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":1}],"totalElapsedMs":1}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 2 relays (wss://healthy, wss://bad)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":1}],"totalElapsedMs":1}
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)...
# [publish:fallback] Publishing to 1 relays (wss://fallback-healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"elapsedMs":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: 4.396514
type: 'test'
...
1..1
ok 1 - parseLockEvent
---
duration_ms: 6.9509
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: 19.306079
type: 'test'
...
1..1
ok 2 - queryLocks
---
duration_ms: 19.534904
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: 11.113808
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: 5.744097
type: 'test'
...
# Subtest: fails without retry for persistent validation failures
ok 3 - fails without retry for persistent validation failures
---
duration_ms: 3.423183
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.009087
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.594997
type: 'test'
...
# Subtest: uses fallback relays to satisfy min success quorum
ok 6 - uses fallback relays to satisfy min success quorum
---
duration_ms: 1.382646
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: 3.866976
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.56156
type: 'test'
...
1..8
ok 3 - publishLock
---
duration_ms: 34.278329
type: 'suite'
...
1..3
ok 2 - lock-ops
---
duration_ms: 62.352434
type: 'suite'
...
1..2
# tests 14
# suites 5
# pass 14
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 245.037609
-17
View File
@@ -1,17 +0,0 @@
# Dependency Security Report
**Date:** 2026-02-17
## Vulnerabilities
Found 4 moderate vulnerabilities in `eslint` stack.
- `eslint`, `@eslint/js`, `ajv`, `@eslint-community/eslint-utils`.
- **Note**: Current installed version is `^10.0.0`, which exceeds normal registry versions. Investigation needed.
## Outdated Packages
- **nostr-tools**:
- Current: 2.19.4
- Latest: 2.23.1
- **Action**: Skipped auto-upgrade (Protocol Library). Please review manually.
## Actions Taken
- No automatic upgrades performed due to safety constraints.
-29
View File
@@ -1,29 +0,0 @@
# Design System Audit Report - 2026-02-16
Headline: ✓ No critical violations (Found usages are foundational or dynamic)
## 1. Inline Styles / `.style` Usage
Found usage of `.style` property for dynamic updates in:
- `dashboard/index.html`: `bar.style.width` (Dynamic progress bar)
- `landing/index.html`: `btn.style.borderColor`, `btn.style.color` (Copy button feedback)
These appear to be sanctioned runtime helpers or necessary dynamic DOM manipulations. No static `style="..."` attributes found in source code.
## 2. Hex Colors
Found hex color definitions in `dashboard/styles.css`.
These define the CSS variables (tokens) used throughout the application, so they are the source of truth, not violations.
## 3. Linting Status
`npm run lint` completed with warnings but no errors.
Warnings related to unused variables in `scripts/agent/smoke-test.mjs`.
## Next Steps
- Continue monitoring for new inline styles.
- Consider moving hex definitions to a dedicated `tokens.css` if `styles.css` grows too large.
- Add specific design system lint rules if stricter enforcement is needed.
## Commands Run
- `npm run lint`
- `grep -r "style=" ...`
- `grep -r "\.style" ...`
- `grep -rP "#[0-9a-fA-F]{3,6}" ...`
-33
View File
@@ -1,33 +0,0 @@
# Documentation Alignment Report
**Agent:** docs-alignment-agent
**Date:** 2026-02-14
## Audit Summary
A comprehensive audit of the repository documentation (`README.md`, `src/docs/TORCH.md`) was performed against the codebase (`bin/torch-lock.mjs`, `src/lib.mjs`, `src/ops.mjs`, `src/torch-config.mjs`).
The audit revealed that while the core locking commands were documented, several administrative and new commands (init, update, complete, memory operations) were missing from the primary documentation.
## Claims Map
| Claim / Feature | Source Doc | Code Implementation | Status | Notes |
| :--- | :--- | :--- | :--- | :--- |
| `check` command | `README.md` | `bin/torch-lock.mjs` | ✅ Matches | Correctly documented. |
| `lock` command | `README.md` | `bin/torch-lock.mjs` | ✅ Matches | Correctly documented. |
| `list` command | `README.md` | `bin/torch-lock.mjs` | ✅ Matches | Correctly documented. |
| `dashboard` command | `README.md` | `bin/torch-lock.mjs` | ✅ Matches | Correctly documented. |
| `complete` command | `README.md` | `src/lib.mjs` (cmdComplete) | ⚠️ Missing | **Fixed:** Added usage example. |
| `init` command | `README.md` | `src/ops.mjs` (cmdInit) | ⚠️ Missing | **Fixed:** Added usage example. |
| `update` command | `README.md` | `src/ops.mjs` (cmdUpdate) | ⚠️ Missing | **Fixed:** Added usage example. |
| Memory CLI | `README.md` | `bin/torch-lock.mjs` | ⚠️ Missing | **Fixed:** Added `list-memories`, `inspect-memory`, etc. |
| Quick Start | `src/docs/TORCH.md` | `bin/torch-lock.mjs` | ⚠️ Outdated | **Fixed:** Updated `node src/nostr-lock.mjs` to `npx torch-lock`. |
| Configuration | `README.md` | `src/torch-config.mjs` | ✅ Matches | Config keys align with implementation. |
## Validation Notes
- **Verification Method:** Static code analysis of `bin/torch-lock.mjs` arg parsing and `src/lib.mjs` / `src/ops.mjs` function signatures compared against documentation text.
- **Updates Applied:**
- `README.md`: Added `complete`, `init`, `update` commands and Memory CLI section.
- `src/docs/TORCH.md`: Updated outdated command examples to use the `npx torch-lock` convention.
## Recommendations
- Future updates to the CLI should include a documentation update step in the PR checklist.
- Consider auto-generating the CLI usage section from the `bin/torch-lock.mjs` help text (output of `usage()`) to ensure perfect synchronization.
@@ -1,3 +0,0 @@
# Inventory 2026-02-14
No /content directory found. Audit skipped.
@@ -1,13 +0,0 @@
# Inventory - 2026-02-17
## Scope
Audit of `/content` directory for upload/contribution docs.
## Findings
- **Missing Directory**: The `/content` directory does not exist in the repository root.
- **Impact**: Unable to verify claims about upload functionality or contribution guidelines in `/content`.
- **Status**: Failed to inventory due to missing target.
## Recommendations
- Verify if `/content` is the intended target or if documentation resides elsewhere (e.g., `src/docs`).
- Update `content-audit-agent` prompt to reflect the correct directory structure.
-5
View File
@@ -1,5 +0,0 @@
{
"generated_at": "2026-02-15T23:19:39.826Z",
"total_errors": 0,
"groups": []
}
@@ -1,16 +0,0 @@
{
"target": "parseLockEvent (src/lib.mjs)",
"date": "2026-02-14",
"seed": 1739523214000,
"iterations": 10000,
"failures": [
{
"id": "repro-1270",
"error": "TypeError: Cannot read properties of null (reading 'agent')",
"classification": "crash",
"description": "JSON.parse('null') returns null, causing property access on null."
}
],
"fix": "Added validation to ensure parsed content is a non-array object.",
"status": "fixed"
}
@@ -1,6 +0,0 @@
{
"target": "parseLockEvent",
"seed": 12345,
"iterations": 10000,
"failures": []
}
@@ -1,15 +0,0 @@
# Daily Remediation Report - 2026-02-14
## Summary
- **Status:** ⚠️ Active issues remain
- **Verified:** 0 existing issues (KNOWN_ISSUES.md was empty).
- **New Issues:** 1 found.
## Issues Found
1. **`npm test` fails due to prompt contract violations**:
- `npm test` runs `npm run validate:scheduler`, which flags multiple agents for missing `lock:complete` tokens.
- `known-issues-agent` also failed validation.
- Added to `KNOWN_ISSUES.md`.
## Actions
- Updated `KNOWN_ISSUES.md` with the new issue.
-23
View File
@@ -1,23 +0,0 @@
{
"timestamp": "2026-02-14T23:55:50.974Z",
"config": {
"relayUrl": "N/A (Dry Run)",
"clients": 1000,
"durationSec": 5,
"rateEps": 10,
"mix": 0.9
},
"summary": {
"totalEventsAttempted": 50,
"totalEventsSuccess": 50,
"totalEventsFailed": 0,
"throughputEps": 10,
"latencies": {
"p50": 36,
"p90": 54,
"p95": 56,
"p99": 59
}
},
"errors": {}
}
-118
View File
@@ -1,118 +0,0 @@
{
"auditReportVersion": 2,
"vulnerabilities": {
"@eslint-community/eslint-utils": {
"name": "@eslint-community/eslint-utils",
"severity": "moderate",
"isDirect": false,
"via": [
"eslint"
],
"effects": [
"eslint"
],
"range": "*",
"nodes": [
"node_modules/@eslint-community/eslint-utils"
],
"fixAvailable": {
"name": "eslint",
"version": "4.1.1",
"isSemVerMajor": true
}
},
"@eslint/js": {
"name": "@eslint/js",
"severity": "moderate",
"isDirect": true,
"via": [
"eslint"
],
"effects": [],
"range": ">=10.0.1",
"nodes": [
"node_modules/@eslint/js"
],
"fixAvailable": {
"name": "@eslint/js",
"version": "9.39.2",
"isSemVerMajor": true
}
},
"ajv": {
"name": "ajv",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1113214,
"name": "ajv",
"dependency": "ajv",
"title": "ajv has ReDoS when using `$data` option",
"url": "https://github.com/advisories/GHSA-2g4f-4pwh-qvx6",
"severity": "moderate",
"cwe": [
"CWE-400"
],
"cvss": {
"score": 0,
"vectorString": null
},
"range": "<8.18.0"
}
],
"effects": [
"eslint"
],
"range": "<8.18.0",
"nodes": [
"node_modules/ajv"
],
"fixAvailable": {
"name": "eslint",
"version": "4.1.1",
"isSemVerMajor": true
}
},
"eslint": {
"name": "eslint",
"severity": "moderate",
"isDirect": true,
"via": [
"@eslint-community/eslint-utils",
"ajv"
],
"effects": [
"@eslint-community/eslint-utils",
"@eslint/js"
],
"range": ">=4.2.0",
"nodes": [
"node_modules/eslint"
],
"fixAvailable": {
"name": "eslint",
"version": "4.1.1",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 4,
"high": 0,
"critical": 0,
"total": 4
},
"dependencies": {
"prod": 12,
"dev": 76,
"optional": 1,
"peer": 0,
"peerOptional": 0,
"total": 87
}
}
}
-9
View File
@@ -1,9 +0,0 @@
{
"nostr-tools": {
"current": "2.19.4",
"wanted": "2.19.4",
"latest": "2.23.1",
"dependent": "app",
"location": "/app/node_modules/nostr-tools"
}
}
@@ -1,51 +0,0 @@
# Onboarding Audit Report
**Date:** 2026-02-16
**Agent:** onboarding-audit-agent
## Headline
⚠️ Onboarding failures found
## Environment
- **Platform:** Jules Sandbox (Linux)
- **Node Version:** v22.22.0
- **npm Version:** 11.10.0
## Steps Executed
1. `npm ci`
2. `npm run build`
3. `npm test`
4. `npm run lint`
## Results
| Command | Result | Exit Code | Notes |
|---------|--------|-----------|-------|
| `npm ci` | Pass | 0 | Installed dependencies cleanly. |
| `npm run build` | Pass | 0 | Build output to `dist/`. |
| `npm test` | **Fail** | Timeout | Command timed out after 400s. |
| `npm run lint` | Pass | 0 | 12 warnings found (no errors). |
## Failures
### `npm test` Timeout
The command `npm test` (which runs `npm run validate:scheduler && npm run test:integration:e2e && node --test test/*.test.mjs tests/*.test.js`) timed out after 401 seconds.
**Investigation:**
- `npm run validate:scheduler` passed (200ms).
- `npm run test:integration:e2e` passed (692ms).
- `node --test test/*.test.mjs tests/*.test.js` is the likely cause of the timeout.
- Individual runs of `test/lock-ops.test.mjs`, `test/lock-ops-publish-retry.test.mjs`, `test/relay-fanout-quorum.integration.test.mjs`, `test/lock-acquisition-resilience.integration.test.mjs`, and `tests/memory.test.js` all passed quickly.
- The timeout suggests either a deadlock or extreme slowness when running the full suite in this environment.
### Lint Warnings
`npm run lint` passed but emitted 12 warnings (mostly `no-unused-vars`). These should be addressed but did not break the build.
## Recommendations
1. **Investigate Test Suite Performance:** The test suite takes too long or hangs in the sandbox environment. Investigate `test/*.test.mjs` for potential deadlocks or resource contention.
2. **Address Lint Warnings:** Clean up unused variables to keep the codebase clean.
3. **Docs Update:** No documentation changes required as the commands are correct, but the execution reliability needs improvement.
## Actions Taken
- Verified individual test files passed.
- Recorded full timeout failure.
-26
View File
@@ -1,26 +0,0 @@
> [email protected] lint
> eslint .
/app/scripts/benchmark-dashboard.mjs
25:14 warning 'e' is defined but never used no-unused-vars
62:22 warning 'e' is defined but never used no-unused-vars
/app/src/lib.mjs
50:14 warning '_' is assigned a value but never used no-unused-vars
/app/test/lib.test.mjs
102:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
268:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
/app/test/lock-ops.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
/app/test/nostr-lock.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
/app/test/torch-config.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
✖ 8 problems (0 errors, 8 warnings)
-6
View File
@@ -1,6 +0,0 @@
{
"message": "Not Found",
"documentation_url": "https://docs.github.com/rest/pulls/pulls#list-pull-requests",
"status": "404"
}
PR check completed (likely failed/empty due to no auth/repo info).
-55
View File
@@ -1,55 +0,0 @@
# PR Review Audit Log - 2026-02-14
## PR Enumeration
{
"message": "Not Found",
"documentation_url": "https://docs.github.com/rest/pulls/pulls#list-pull-requests",
"status": "404"
}
PR check completed (likely failed/empty due to no auth/repo info).
## Baseline Verification
### Lint Status
> [email protected] lint
> eslint .
/app/scripts/benchmark-dashboard.mjs
25:14 warning 'e' is defined but never used no-unused-vars
62:22 warning 'e' is defined but never used no-unused-vars
/app/src/lib.mjs
50:14 warning '_' is assigned a value but never used no-unused-vars
/app/test/lib.test.mjs
102:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
268:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
/app/test/lock-ops.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
/app/test/nostr-lock.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
/app/test/torch-config.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
✖ 8 problems (0 errors, 8 warnings)
### Test Status
...
1..13
# tests 61
# suites 16
# pass 61
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 1721.810365
## Summary
- **PRs Reviewed:** 0 (Enumeration failed or no PRs accessible)
- **Lint Check:** ✅ Passed
- **Test Suite:** ✅ Passed
-600
View File
@@ -1,600 +0,0 @@
> [email protected] test
> node --test test/*.test.mjs
TAP version 13
# Subtest: src/lib.mjs
# Subtest: cmdCheck
# Subtest: returns correct structure with empty locks
ok 1 - returns correct structure with empty locks
---
duration_ms: 11.041212
type: 'test'
...
# Subtest: identifies locked agents
ok 2 - identifies locked agents
---
duration_ms: 0.760284
type: 'test'
...
# Subtest: excludes paused agents
ok 3 - excludes paused agents
---
duration_ms: 0.822208
type: 'test'
...
# Subtest: identifies unknown locked agents
ok 4 - identifies unknown locked agents
---
duration_ms: 0.85916
type: 'test'
...
1..4
ok 1 - cmdCheck
---
duration_ms: 15.580149
type: 'suite'
...
# Subtest: cmdLock
# Subtest: successfully locks an available agent
ok 1 - successfully locks an available agent
---
duration_ms: 11.410628
type: 'test'
...
# Subtest: fails if agent is not in roster
ok 2 - fails if agent is not in roster
---
duration_ms: 1.39463
type: 'test'
...
# Subtest: fails if agent is already locked
ok 3 - fails if agent is already locked
---
duration_ms: 1.114336
type: 'test'
...
# Subtest: fails if agent is already completed
ok 4 - fails if agent is already completed
---
duration_ms: 0.724132
type: 'test'
...
# Subtest: fails if race check is lost
ok 5 - fails if race check is lost
---
duration_ms: 7.492092
type: 'test'
...
# Subtest: dry run does not publish
ok 6 - dry run does not publish
---
duration_ms: 0.706617
type: 'test'
...
1..6
ok 2 - cmdLock
---
duration_ms: 24.08577
type: 'suite'
...
# Subtest: cmdList
# Subtest: lists active locks
ok 1 - lists active locks
---
duration_ms: 0.83374
type: 'test'
...
# Subtest: warns about unknown agents
ok 2 - warns about unknown agents
---
duration_ms: 0.496584
type: 'test'
...
# Subtest: handles no locks
ok 3 - handles no locks
---
duration_ms: 0.326104
type: 'test'
...
1..3
ok 3 - cmdList
---
duration_ms: 1.892244
type: 'suite'
...
# Subtest: cmdComplete
# Subtest: successfully completes an active lock
ok 1 - successfully completes an active lock
---
duration_ms: 1.080992
type: 'test'
...
# Subtest: fails if no active lock found
ok 2 - fails if no active lock found
---
duration_ms: 0.500767
type: 'test'
...
# Subtest: detects already completed task
ok 3 - detects already completed task
---
duration_ms: 0.32976
type: 'test'
...
1..3
ok 4 - cmdComplete
---
duration_ms: 2.110436
type: 'suite'
...
1..4
ok 1 - src/lib.mjs
---
duration_ms: 45.03511
type: 'suite'
...
# Subtest: parseLockEvent
# Subtest: should parse a valid lock event correctly
ok 1 - should parse a valid lock event correctly
---
duration_ms: 3.976866
type: 'test'
...
# Subtest: should handle missing d tag
ok 2 - should handle missing d tag
---
duration_ms: 0.478869
type: 'test'
...
# Subtest: should handle missing expiration tag
ok 3 - should handle missing expiration tag
---
duration_ms: 0.270815
type: 'test'
...
# Subtest: should handle malformed JSON content
ok 4 - should handle malformed JSON content
---
duration_ms: 0.436994
type: 'test'
...
# Subtest: should handle non-object JSON content (string)
ok 5 - should handle non-object JSON content (string)
---
duration_ms: 0.226085
type: 'test'
...
# Subtest: should handle non-object JSON content (array)
ok 6 - should handle non-object JSON content (array)
---
duration_ms: 0.207773
type: 'test'
...
# Subtest: should handle partial JSON content
ok 7 - should handle partial JSON content
---
duration_ms: 0.260396
type: 'test'
...
1..7
ok 2 - parseLockEvent
---
duration_ms: 7.871324
type: 'suite'
...
# Subtest: CLI Smoke Test
# Subtest: should print usage when no args provided
ok 1 - should print usage when no args provided
---
duration_ms: 214.629961
type: 'test'
...
# Subtest: should fail when checking without cadence
ok 2 - should fail when checking without cadence
---
duration_ms: 210.477652
type: 'test'
...
# Subtest: should include paused agents in check output
ok 3 - should include paused agents in check output
---
duration_ms: 1002.85269
type: 'test'
...
1..3
ok 3 - CLI Smoke Test
---
duration_ms: 1429.608541
type: 'suite'
...
# Initializing torch configuration in /app/test-ops-TxOxDw/project1/torch...
# 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 19 files in torch/prompts/weekly/
# Initialization complete.
# You can now customize the files in torch/ and torch/prompts/.
# Initializing torch configuration in /app/test-ops-TxOxDw/project2/torch...
# Initializing torch configuration in /app/test-ops-TxOxDw/project3/torch...
# 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 19 files in torch/prompts/weekly/
# Initialization complete.
# You can now customize the files in torch/ and torch/prompts/.
# Updating torch configuration in /app/test-ops-TxOxDw/project3/torch...
# Creating backup at torch/_backups/backup_2026-02-14T19-23-09-502Z...
# 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, 19 preserved
# Update complete.
# Initializing torch configuration in /app/test-ops-TxOxDw/project4/torch...
# 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 19 files in torch/prompts/weekly/
# Initialization complete.
# You can now customize the files in torch/ and torch/prompts/.
# Updating torch configuration in /app/test-ops-TxOxDw/project4/torch...
# Creating backup at torch/_backups/backup_2026-02-14T19-23-09-555Z...
# 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, 19 updated, 0 preserved
# Update complete.
# Initializing torch configuration in /app/test-ops-TxOxDw/project5/torch...
# 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 19 files in torch/prompts/weekly/
# Initialization complete.
# You can now customize the files in torch/ and torch/prompts/.
# Updating torch configuration in /app/test-ops-TxOxDw/project5/torch...
# Creating backup at torch/_backups/backup_2026-02-14T19-23-09-617Z...
# 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, 19 preserved
# Update complete.
# Initializing torch configuration in /app/test-ops-TxOxDw/project_roster/torch...
# 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 19 files in torch/prompts/weekly/
# Initialization complete.
# You can now customize the files in torch/ and torch/prompts/.
# Checking locks: namespace=torch, cadence=daily, date=2026-02-14
# Relays: wss://relay.damus.io, wss://nos.lol, wss://relay.primal.net
# Subtest: cmdInit creates directory structure and files
ok 4 - cmdInit creates directory structure and files
---
duration_ms: 38.939852
type: 'test'
...
# Subtest: cmdInit fails if directory exists without force
ok 5 - cmdInit fails if directory exists without force
---
duration_ms: 1.385876
type: 'test'
...
# Subtest: cmdUpdate preserves modified prompt
ok 6 - cmdUpdate preserves modified prompt
---
duration_ms: 50.406001
type: 'test'
...
# Subtest: cmdUpdate overwrites prompt with force
ok 7 - cmdUpdate overwrites prompt with force
---
duration_ms: 59.092881
type: 'test'
...
# Subtest: cmdUpdate creates backup
ok 8 - cmdUpdate creates backup
---
duration_ms: 59.382969
type: 'test'
...
# Subtest: torch-lock check respects local roster
ok 9 - torch-lock check respects local roster
---
duration_ms: 1074.410444
type: 'test'
...
# Subtest: Scheduler Ratchet Logic (Log Checking)
# Subtest: excludes agents completed today (daily)
ok 1 - excludes agents completed today (daily)
---
duration_ms: 3.8002
type: 'test'
...
# Subtest: excludes agents completed this week (weekly)
ok 2 - excludes agents completed this week (weekly)
---
duration_ms: 0.632534
type: 'test'
...
# Subtest: combines locked and completed agents in exclusion list
ok 3 - combines locked and completed agents in exclusion list
---
duration_ms: 0.722645
type: 'test'
...
# Subtest: ignores logs when --ignore-logs is set
ok 4 - ignores logs when --ignore-logs is set
---
duration_ms: 0.418629
type: 'test'
...
# Subtest: handles missing log directory gracefully
ok 5 - handles missing log directory gracefully
---
duration_ms: 0.463313
type: 'test'
...
1..5
ok 10 - Scheduler Ratchet Logic (Log Checking)
---
duration_ms: 8.325635
type: 'suite'
...
# Subtest: loadTorchConfig (Unit Tests with Mocked FS)
# Subtest: loads valid config correctly
ok 1 - loads valid config correctly
---
duration_ms: 4.439239
type: 'test'
...
# Subtest: returns default config when file is missing
ok 2 - returns default config when file is missing
---
duration_ms: 0.43711
type: 'test'
...
# Subtest: throws error on malformed JSON
ok 3 - throws error on malformed JSON
---
duration_ms: 1.046315
type: 'test'
...
# Subtest: caches the config and ignores subsequent fs calls
ok 4 - caches the config and ignores subsequent fs calls
---
duration_ms: 0.765738
type: 'test'
...
1..4
ok 11 - loadTorchConfig (Unit Tests with Mocked FS)
---
duration_ms: 8.445371
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.605283
type: 'test'
...
# Subtest: returns custom path when env var is set
ok 2 - returns custom path when env var is set
---
duration_ms: 0.753996
type: 'test'
...
# Subtest: trims env var value
ok 3 - trims env var value
---
duration_ms: 0.402756
type: 'test'
...
1..3
ok 1 - getTorchConfigPath
---
duration_ms: 5.989088
type: 'suite'
...
# Subtest: parseTorchConfig
# Subtest: returns default values for empty raw config
ok 1 - returns default values for empty raw config
---
duration_ms: 2.801311
type: 'test'
...
# Subtest: correctly parses and normalizes nostrLock config
ok 2 - correctly parses and normalizes nostrLock config
---
duration_ms: 1.217618
type: 'test'
...
# Subtest: normalizes cadence and status in dashboard config
ok 3 - normalizes cadence and status in dashboard config
---
duration_ms: 0.448055
type: 'test'
...
# Subtest: falls back to defaults for invalid cadence/status
ok 4 - falls back to defaults for invalid cadence/status
---
duration_ms: 0.688954
type: 'test'
...
# Subtest: correctly parses scheduler config
ok 5 - correctly parses scheduler config
---
duration_ms: 0.714744
type: 'test'
...
# Subtest: handles non-array roster values by returning null or empty array
ok 6 - handles non-array roster values by returning null or empty array
---
duration_ms: 1.026327
type: 'test'
...
1..6
ok 2 - parseTorchConfig
---
duration_ms: 9.912879
type: 'suite'
...
# Subtest: loadTorchConfig
# Subtest: loads config from disk
ok 1 - loads config from disk
---
duration_ms: 3.702332
type: 'test'
...
# Subtest: returns defaults if file does not exist
ok 2 - returns defaults if file does not exist
---
duration_ms: 7.053093
type: 'test'
...
# Subtest: throws error for malformed JSON
ok 3 - throws error for malformed JSON
---
duration_ms: 1.732978
type: 'test'
...
# Subtest: caches the config
ok 4 - caches the config
---
duration_ms: 1.19094
type: 'test'
...
1..4
ok 3 - loadTorchConfig
---
duration_ms: 14.502
type: 'suite'
...
# Subtest: getRelays
# Subtest: returns default relays when no config or env var is set
ok 1 - returns default relays when no config or env var is set
---
duration_ms: 0.652639
type: 'test'
...
# Subtest: returns relays from env var if set
ok 2 - returns relays from env var if set
---
duration_ms: 0.49769
type: 'test'
...
1..2
ok 4 - getRelays
---
duration_ms: 1.417182
type: 'suite'
...
1..4
ok 12 - torch-config
---
duration_ms: 34.842305
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.352074
type: 'test'
...
# Subtest: handles year boundaries correctly
ok 2 - handles year boundaries correctly
---
duration_ms: 0.236274
type: 'test'
...
# Subtest: handles leap years
ok 3 - handles leap years
---
duration_ms: 1.711613
type: 'test'
...
# Subtest: handles empty input (defaults to today)
ok 4 - handles empty input (defaults to today)
---
duration_ms: 0.4444
type: 'test'
...
# Subtest: handles invalid input gracefully
ok 5 - handles invalid input gracefully
---
duration_ms: 0.259293
type: 'test'
...
1..5
ok 1 - getIsoWeekStr
---
duration_ms: 5.292184
type: 'suite'
...
1..1
ok 13 - Date Utilities
---
duration_ms: 5.978593
type: 'suite'
...
1..13
# tests 61
# suites 16
# pass 61
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 1721.810365
-247
View File
@@ -1,247 +0,0 @@
# Prompt Safety Audit Report - 2026-02-15
## Summary
- Total Prompts: 41
- Safe Prompts: 17
- Prompts Needing Improvement: 24
## Prompts Needing Improvement
### audit-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
**Existing Safety Features:**
- Has conditional stop logic
- Allows no-op/stopping
---
### const-refactor-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
**Existing Safety Features:**
- Allows no-op/stopping
---
### content-audit-agent
**Issues:**
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- Has FAILURE MODES section
---
### decompose-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
**Existing Safety Features:**
- Has conditional stop logic
- Allows no-op/stopping
---
### deps-security-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
**Existing Safety Features:**
- Allows no-op/stopping
---
### design-system-audit-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
**Existing Safety Features:**
- Has conditional stop logic
- Allows no-op/stopping
---
### docs-code-investigator
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
**Existing Safety Features:**
- Has conditional stop logic
- Allows no-op/stopping
---
### innerhtml-migration-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
**Existing Safety Features:**
- Has conditional stop logic
- Allows no-op/stopping
---
### log-fixer-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### perf-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
**Existing Safety Features:**
- Allows no-op/stopping
---
### protocol-research-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### test-audit-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### todo-triage-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### torch-garbage-collection-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
**Existing Safety Features:**
- Has conditional stop logic
- Allows no-op/stopping
---
### bug-reproducer-agent
**Issues:**
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- Has FAILURE MODES section
---
### feature-proposer-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### perf-deepdive-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### pr-review-agent
**Issues:**
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- Has FAILURE MODES section
---
### prompt-maintenance-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### race-condition-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
**Existing Safety Features:**
- Allows no-op/stopping
---
### repo-fit-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- None detected
---
### test-coverage-agent
**Issues:**
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- Has FAILURE MODES section
---
### ui-ux-agent
**Issues:**
- Missing explicit FAILURE MODES or EXIT CRITERIA section
- No clear conditional stop/exit logic found
**Existing Safety Features:**
- Allows no-op/stopping
---
### weekly-synthesis-agent
**Issues:**
- Does not clearly explicitly allow for no-op/stopping
**Existing Safety Features:**
- Has FAILURE MODES section
---
## Safe Prompts
- ci-health-agent
- docs-agent
- docs-alignment-agent
- known-issues-agent
- load-test-agent
- onboarding-audit-agent
- scheduler-update-agent
- style-agent
- changelog-agent
- dead-code-agent
- frontend-console-debug-agent
- fuzz-agent
- perf-optimization-agent
- prompt-safety-agent
- refactor-agent
- smoke-agent
- telemetry-agent
@@ -1,15 +0,0 @@
# npm test timeout reproduction
## Issue
`npm test` hangs/times out in full suite run. It takes over 400s and times out in sandbox environment.
## Reproduction
This directory contains a script `repro.sh` that attempts to run `npm test` and times out after 30s to demonstrate the issue without waiting the full duration.
## Run
```bash
bash artifacts/reproducers/npm-test-timeout/repro.sh
```
## Logs
Output is captured in `npm_test_output.log`.
@@ -1,805 +0,0 @@
> [email protected] test
> npm run validate:scheduler && npm run test:integration:e2e && node --test test/*.test.mjs tests/*.test.js
> [email protected] validate:scheduler
> node scripts/validate-scheduler-roster.mjs && node scripts/validate-prompt-contract.mjs && node scripts/validate-scheduler-flow-parity.mjs && npm run validate:scheduler-failure-schema
Scheduler tables, roster, and prompt filenames are in sync.
Prompt contract validated for all daily/weekly prompts.
Scheduler flow parity validated for prompts and scheduler implementation.
> [email protected] validate:scheduler-failure-schema
> node --test test/scheduler-lock-failure-schema.contract.test.mjs
TAP version 13
# Subtest: scheduler lock backend failure artifact matches required frontmatter schema
ok 1 - scheduler lock backend failure artifact matches required frontmatter schema
---
duration_ms: 161.154264
type: 'test'
...
# Subtest: schema contract catches missing required lock-backend field
ok 2 - schema contract catches missing required lock-backend field
---
duration_ms: 2.871179
type: 'test'
...
# Subtest: schema contract catches misnamed lock-backend key
ok 3 - schema contract catches misnamed lock-backend key
---
duration_ms: 0.834819
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 318.644346
> [email protected] test:integration:e2e
> node --test test/scheduler-preflight-lock.e2e.test.mjs
TAP version 13
# Subtest: lock preflight e2e: successful lock writes completed status snapshot
ok 1 - lock preflight e2e: successful lock writes completed status snapshot
---
duration_ms: 452.810254
type: 'test'
...
# Subtest: lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker
ok 2 - lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker
---
duration_ms: 102.636238
type: 'test'
...
# Subtest: lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification
ok 3 - lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification
---
duration_ms: 180.269665
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 824.280539
TAP version 13
# Subtest: Build artifacts verification
# Subtest: dist directory exists
not ok 1 - dist directory exists
---
duration_ms: 1.943115
type: 'test'
location: '/app/test/build_verification.test.mjs:9:11'
failureType: 'testCodeFailure'
error: |-
dist directory should exist
false !== true
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: true
actual: false
operator: 'strictEqual'
stack: |-
TestContext.<anonymous> (file:///app/test/build_verification.test.mjs:10:12)
Test.runInAsyncScope (node:async_hooks:214:14)
Test.run (node:internal/test_runner/test:1047:25)
Test.start (node:internal/test_runner/test:944:17)
TestContext.test (node:internal/test_runner/test:373:20)
TestContext.<anonymous> (file:///app/test/build_verification.test.mjs:9:11)
Test.runInAsyncScope (node:async_hooks:214:14)
Test.run (node:internal/test_runner/test:1047:25)
Test.start (node:internal/test_runner/test:944:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:296:17)
...
# Subtest: Critical files exist in dist
not ok 2 - Critical files exist in dist
---
duration_ms: 0.501843
type: 'test'
location: '/app/test/build_verification.test.mjs:13:11'
failureType: 'testCodeFailure'
error: |-
File index.html should exist in dist
false !== true
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: true
actual: false
operator: 'strictEqual'
stack: |-
file:///app/test/build_verification.test.mjs:25:14
Array.forEach (<anonymous>)
TestContext.<anonymous> (file:///app/test/build_verification.test.mjs:23:19)
Test.runInAsyncScope (node:async_hooks:214:14)
Test.run (node:internal/test_runner/test:1047:25)
Test.start (node:internal/test_runner/test:944:17)
TestContext.test (node:internal/test_runner/test:373:20)
TestContext.<anonymous> (file:///app/test/build_verification.test.mjs:13:11)
async Test.run (node:internal/test_runner/test:1054:7)
async startSubtestAfterBootstrap (node:internal/test_runner/harness:296:3)
...
# Subtest: TORCH.md content is not empty
not ok 3 - TORCH.md content is not empty
---
duration_ms: 0.240573
type: 'test'
location: '/app/test/build_verification.test.mjs:29:11'
failureType: 'testCodeFailure'
error: "ENOENT: no such file or directory, open '/app/dist/src/docs/TORCH.md'"
code: 'ENOENT'
stack: |-
Object.readFileSync (node:fs:440:20)
TestContext.<anonymous> (file:///app/test/build_verification.test.mjs:31:24)
Test.runInAsyncScope (node:async_hooks:214:14)
Test.run (node:internal/test_runner/test:1047:25)
Test.start (node:internal/test_runner/test:944:17)
TestContext.test (node:internal/test_runner/test:373:20)
TestContext.<anonymous> (file:///app/test/build_verification.test.mjs:29:11)
async Test.run (node:internal/test_runner/test:1054:7)
async startSubtestAfterBootstrap (node:internal/test_runner/harness:296:3)
...
1..3
not ok 1 - Build artifacts verification
---
duration_ms: 4.188468
type: 'test'
location: '/app/test/build_verification.test.mjs:8:1'
failureType: 'subtestsFailed'
error: '3 subtests failed'
code: 'ERR_TEST_FAILURE'
...
# Subtest: parseArgs should parse basic command
ok 2 - parseArgs should parse basic command
---
duration_ms: 1.628077
type: 'test'
...
# Subtest: parseArgs should parse agent and cadence
ok 3 - parseArgs should parse agent and cadence
---
duration_ms: 0.273442
type: 'test'
...
# Subtest: parseArgs should parse equals sign syntax
ok 4 - parseArgs should parse equals sign syntax
---
duration_ms: 3.043129
type: 'test'
...
# Subtest: parseArgs should parse dry-run flag
ok 5 - parseArgs should parse dry-run flag
---
duration_ms: 0.396494
type: 'test'
...
# Subtest: parseArgs should parse port with default
ok 6 - parseArgs should parse port with default
---
duration_ms: 0.220731
type: 'test'
...
# Subtest: parseArgs should parse custom port
ok 7 - parseArgs should parse custom port
---
duration_ms: 0.175744
type: 'test'
...
# Subtest: parseArgs should parse ignore-logs flag
ok 8 - parseArgs should parse ignore-logs flag
---
duration_ms: 0.527959
type: 'test'
...
# Subtest: parseArgs should parse memory flags
ok 9 - parseArgs should parse memory flags
---
duration_ms: 1.240767
type: 'test'
...
# Subtest: parseArgs should parse memory flags with equals
ok 10 - parseArgs should parse memory flags with equals
---
duration_ms: 0.722583
type: 'test'
...
# Subtest: src/lib.mjs
# Subtest: cmdCheck
# Subtest: returns correct structure with empty locks
ok 1 - returns correct structure with empty locks
---
duration_ms: 2.660305
type: 'test'
...
# Subtest: identifies locked agents
ok 2 - identifies locked agents
---
duration_ms: 0.566843
type: 'test'
...
# Subtest: excludes paused agents
ok 3 - excludes paused agents
---
duration_ms: 0.667234
type: 'test'
...
# Subtest: identifies unknown locked agents
ok 4 - identifies unknown locked agents
---
duration_ms: 0.719212
type: 'test'
...
1..4
ok 1 - cmdCheck
---
duration_ms: 5.847049
type: 'suite'
...
# Subtest: cmdLock
# Subtest: successfully locks an available agent
ok 1 - successfully locks an available agent
---
duration_ms: 11.539654
type: 'test'
...
# Subtest: fails if agent is not in roster
ok 2 - fails if agent is not in roster
---
duration_ms: 1.014006
type: 'test'
...
# Subtest: fails if agent is already locked
ok 3 - fails if agent is already locked
---
duration_ms: 0.439892
type: 'test'
...
# Subtest: fails if agent is already completed
ok 4 - fails if agent is already completed
---
duration_ms: 0.594932
type: 'test'
...
# Subtest: fails if race check is lost
ok 5 - fails if race check is lost
---
duration_ms: 2.839858
type: 'test'
...
# Subtest: handles race condition with identical timestamps using eventId tie-breaker (we win)
ok 6 - handles race condition with identical timestamps using eventId tie-breaker (we win)
---
duration_ms: 13.94634
type: 'test'
...
# Subtest: handles race condition with identical timestamps using eventId tie-breaker (we lose)
ok 7 - handles race condition with identical timestamps using eventId tie-breaker (we lose)
---
duration_ms: 1.184325
type: 'test'
...
# Subtest: dry run does not publish
ok 8 - dry run does not publish
---
duration_ms: 0.411616
type: 'test'
...
1..8
ok 2 - cmdLock
---
duration_ms: 33.349845
type: 'suite'
...
# Subtest: cmdList
# Subtest: lists active locks
ok 1 - lists active locks
---
duration_ms: 0.770961
type: 'test'
...
# Subtest: warns about unknown agents
ok 2 - warns about unknown agents
---
duration_ms: 0.399904
type: 'test'
...
# Subtest: handles no locks
ok 3 - handles no locks
---
duration_ms: 0.367057
type: 'test'
...
1..3
ok 3 - cmdList
---
duration_ms: 1.797004
type: 'suite'
...
# Subtest: cmdComplete
# Subtest: successfully completes an active lock
ok 1 - successfully completes an active lock
---
duration_ms: 1.126175
type: 'test'
...
# Subtest: fails if no active lock found
ok 2 - fails if no active lock found
---
duration_ms: 0.374503
type: 'test'
...
# Subtest: detects already completed task
ok 3 - detects already completed task
---
duration_ms: 0.251288
type: 'test'
...
1..3
ok 4 - cmdComplete
---
duration_ms: 1.913573
type: 'suite'
...
1..4
ok 11 - src/lib.mjs
---
duration_ms: 43.819865
type: 'suite'
...
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# Published to 1/3 relays (required=1, timeout=25ms)
# [publish:primary] Publishing to 2 relays (wss://relay-a, wss://relay-b)...
# [publish:primary] Publishing to 2 relays (wss://relay-a, wss://relay-b)...
# Published to 2/2 relays (required=2, timeout=25ms)
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# [publish:primary] Publishing to 3 relays (wss://relay-a, wss://relay-b, wss://relay-c)...
# Published to 2/3 relays (required=2, timeout=25ms)
# (node:2900) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
# (Use `node --trace-warnings ...` to show where the warning was created)
# Subtest: ci-resilience lock acquisition under unstable relays
# Subtest: recovers after all relays are down for an initial outage window
ok 1 - recovers after all relays are down for an initial outage window
---
duration_ms: 23.840291
type: 'test'
...
# Subtest: survives intermittent timeout spikes and reaches quorum with bounded retries
ok 2 - survives intermittent timeout spikes and reaches quorum with bounded retries
---
duration_ms: 7.936966
type: 'test'
...
# Subtest: handles staggered relay recovery and never exceeds retry budget
ok 3 - handles staggered relay recovery and never exceeds retry budget
---
duration_ms: 4.671589
type: 'test'
...
1..3
ok 12 - ci-resilience lock acquisition under unstable relays
---
duration_ms: 38.603362
type: 'suite'
...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# [publish:primary] Publishing to 1 relays (wss://relay-a)...
# (node:2906) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
# (Use `node --trace-warnings ...` to show where the warning was created)
# Subtest: publishLock retry behavior
# Subtest: succeeds immediately on first attempt without retries
ok 1 - succeeds immediately on first attempt without retries
---
duration_ms: 5.474069
type: 'test'
...
# Subtest: retries a transient failure then succeeds within retry budget with bounded jitter
ok 2 - retries a transient failure then succeeds within retry budget with bounded jitter
---
duration_ms: 3.032713
type: 'test'
...
# Subtest: returns terminal relay_publish_quorum_failure after exhausting retry budget
ok 3 - returns terminal relay_publish_quorum_failure after exhausting retry budget
---
duration_ms: 6.480207
type: 'test'
...
# Subtest: short-circuits non-retryable failures without extra attempts
ok 4 - short-circuits non-retryable failures without extra attempts
---
duration_ms: 4.454286
type: 'test'
...
1..4
ok 13 - publishLock retry behavior
---
duration_ms: 21.111696
type: 'suite'
...
# [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)...
# [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)...
# Published to 2/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://primary-down)...
# [publish:primary] Publishing to 1 relays (wss://primary-down)...
# [publish:primary] Publishing to 1 relays (wss://primary-down)...
# [publish:primary] Publishing to 1 relays (wss://primary-bad)...
# [publish:primary] Publishing to 5 relays (relay-timeout, wss://dns, wss://tcp, wss://tls, wss://ws)...
# [publish:primary] Publishing to 2 relays (wss://relay-bad, wss://relay-ok)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":1}],"totalElapsedMs":1}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://primary-bad)...
# [publish:fallback] Publishing to 1 relays (wss://fallback-ok)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 2 relays (wss://bad, wss://healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 2 relays (wss://healthy, wss://bad)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/2 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 1 relays (wss://healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/1 relays (required=1, timeout=200ms)
# [publish:primary] Publishing to 2 relays (wss://primary-a, wss://primary-b)...
# [publish:fallback] Publishing to 1 relays (wss://fallback-healthy)...
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/3 relays (required=1, timeout=200ms)
# Subtest: lock-ops
# Subtest: parseLockEvent
# Subtest: parses a valid lock event correctly
ok 1 - parses a valid lock event correctly
---
duration_ms: 1.716055
type: 'test'
...
1..1
ok 1 - parseLockEvent
---
duration_ms: 3.018249
type: 'suite'
...
# Subtest: queryLocks
# Subtest: falls back to fallback relays when primary query fails
ok 1 - falls back to fallback relays when primary query fails
---
duration_ms: 16.736135
type: 'test'
...
1..1
ok 2 - queryLocks
---
duration_ms: 17.017963
type: 'suite'
...
# Subtest: publishLock
# Subtest: retries transient failures and succeeds on a later attempt
ok 1 - retries transient failures and succeeds on a later attempt
---
duration_ms: 6.464641
type: 'test'
...
# Subtest: fails after retry budget is exhausted for persistent transient failures
ok 2 - fails after retry budget is exhausted for persistent transient failures
---
duration_ms: 2.486588
type: 'test'
...
# Subtest: fails without retry for persistent validation failures
ok 3 - fails without retry for persistent validation failures
---
duration_ms: 1.482804
type: 'test'
...
# Subtest: includes per-relay reason categories and retry metadata in failure diagnostics
ok 4 - includes per-relay reason categories and retry metadata in failure diagnostics
---
duration_ms: 1.999629
type: 'test'
...
# Subtest: returns success when mixed relay outcomes still satisfy quorum
ok 5 - returns success when mixed relay outcomes still satisfy quorum
---
duration_ms: 1.501278
type: 'test'
...
# Subtest: uses fallback relays to satisfy min success quorum
ok 6 - uses fallback relays to satisfy min success quorum
---
duration_ms: 1.321733
type: 'test'
...
# Subtest: quarantines repeatedly failing relays and still reaches quorum with one healthy relay
ok 7 - quarantines repeatedly failing relays and still reaches quorum with one healthy relay
---
duration_ms: 1.884675
type: 'test'
...
# Subtest: uses fallback and min active pool to reintroduce quarantined relay when needed
ok 8 - uses fallback and min active pool to reintroduce quarantined relay when needed
---
duration_ms: 1.10908
type: 'test'
...
1..8
ok 3 - publishLock
---
duration_ms: 19.320605
type: 'suite'
...
1..3
ok 14 - lock-ops
---
duration_ms: 40.427275
type: 'suite'
...
# memory_telemetry {
# event: 'memory:ingested',
# payload: {
# memory_id: 'bfbb3c6e-095d-4ccd-ad5a-140b6927421c',
# agent_id: 'agent-telemetry',
# dedupe_key: '5054d3273b526ef45167a03a7543de870139af75b9b12cfd920ce80e715e7a88',
# chunk_events: 1,
# window_start: 0,
# window_end: 1771301051599
# },
# ts: 1771301051603
# }
# memory_metric {
# metric: 'memory_ingested_total',
# payload: { count: 1 },
# ts: 1771301051604
# }
# memory_metric {
# metric: 'memory_retrieved_total',
# payload: { count: 2, cache_hit: false },
# ts: 1771301051607
# }
# memory_telemetry {
# event: 'memory:pruned',
# payload: { pruned_count: 1, retention_ms: 1000, dry_run: true },
# ts: 1771301051608
# }
# memory_metric {
# metric: 'memory_pruned_total',
# payload: { count: 0, retention_ms: 1000, dry_run: true },
# ts: 1771301051608
# }
# memory_telemetry {
# event: 'memory:prune_skipped',
# payload: { reason: 'flag_disabled', retention_ms: 1000 },
# ts: 1771301051609
# }
# Subtest: listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks
ok 15 - listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks
---
duration_ms: 2.688735
type: 'test'
...
# Subtest: triggerPruneDryRun returns candidate metadata without deleting records
ok 16 - triggerPruneDryRun returns candidate metadata without deleting records
---
duration_ms: 0.525091
type: 'test'
...
# Subtest: memoryStats reports counts/rates and retrieval telemetry remains redaction-safe
ok 17 - memoryStats reports counts/rates and retrieval telemetry remains redaction-safe
---
duration_ms: 9.591187
type: 'test'
...
# Subtest: runPruneCycle respects prune feature-flag modes
ok 18 - runPruneCycle respects prune feature-flag modes
---
duration_ms: 1.379088
type: 'test'
...
# Subtest: stores runtime events in signer/session namespace and clears scope
ok 19 - stores runtime events in signer/session namespace and clears scope
---
duration_ms: 2.59644
type: 'test'
...
# Subtest: expires runtime events and records expiration metrics
ok 20 - expires runtime events and records expiration metrics
---
duration_ms: 10.478883
type: 'test'
...
# Subtest: enforces LRU bounds and tracks eviction metrics
ok 21 - enforces LRU bounds and tracks eviction metrics
---
duration_ms: 0.718567
type: 'test'
...
# Subtest: blocks decrypted/session-sensitive data from durable promotion without sanitizer pass
ok 22 - blocks decrypted/session-sensitive data from durable promotion without sanitizer pass
---
duration_ms: 0.37624
type: 'test'
...
# Subtest: createEmbedderAdapter selects in-memory backend and supports vector CRUD
ok 23 - createEmbedderAdapter selects in-memory backend and supports vector CRUD
---
duration_ms: 1.638314
type: 'test'
...
# Subtest: createEmbedderAdapter reads backend from environment
ok 24 - createEmbedderAdapter reads backend from environment
---
duration_ms: 2.709345
type: 'test'
...
# Subtest: memory feature flags parse defaults and canary allow-lists
ok 25 - memory feature flags parse defaults and canary allow-lists
---
duration_ms: 1.303503
type: 'test'
...
# Subtest: memory prune flag supports off, dry-run, and active modes
ok 26 - memory prune flag supports off, dry-run, and active modes
---
duration_ms: 0.302096
type: 'test'
...
# Subtest: ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry
ok 27 - ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry
---
duration_ms: 6.119984
type: 'test'
...
# Subtest: ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket
ok 28 - ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket
---
duration_ms: 0.828632
type: 'test'
...
# Subtest: createLifecyclePlan respects delete safety constraints and logs reasons
ok 29 - createLifecyclePlan respects delete safety constraints and logs reasons
---
duration_ms: 2.398993
type: 'test'
...
# Subtest: createLifecyclePlan condenses near-duplicates and archives merged source records
ok 30 - createLifecyclePlan condenses near-duplicates and archives merged source records
---
duration_ms: 0.943965
type: 'test'
...
# Subtest: applyLifecycleActions executes keep/archive/delete and merge markers
ok 31 - applyLifecycleActions executes keep/archive/delete and merge markers
---
duration_ms: 1.383097
type: 'test'
...
# Subtest: filterAndRankMemories applies metadata filters and composite score
ok 32 - filterAndRankMemories applies metadata filters and composite score
---
duration_ms: 2.851358
type: 'test'
...
# Subtest: formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming
ok 33 - formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming
---
duration_ms: 2.468796
type: 'test'
...
# Subtest: isMemoryRetrievalEnabled supports global toggle and agent canary list
ok 34 - isMemoryRetrievalEnabled supports global toggle and agent canary list
---
duration_ms: 0.407381
type: 'test'
...
# Subtest: renderPromptWithMemoryContext injects bounded memory block before base prompt
ok 35 - renderPromptWithMemoryContext injects bounded memory block before base prompt
---
duration_ms: 0.818684
type: 'test'
...
# Subtest: createDbAdvisoryLockProvider acquires and releases postgres advisory locks
ok 36 - createDbAdvisoryLockProvider acquires and releases postgres advisory locks
---
duration_ms: 2.092452
type: 'test'
...
# Subtest: startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries
ok 37 - startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries
---
duration_ms: 26.35814
type: 'test'
...
# Subtest: startMemoryMaintenanceScheduler skips jobs when feature flags disable memory
ok 38 - startMemoryMaintenanceScheduler skips jobs when feature flags disable memory
---
duration_ms: 11.279543
type: 'test'
...
# Subtest: normalizeMemoryItem applies durable schema defaults and coercions
ok 39 - normalizeMemoryItem applies durable schema defaults and coercions
---
duration_ms: 2.535683
type: 'test'
...
# Subtest: validateMemoryItem reports field-level errors
ok 40 - validateMemoryItem reports field-level errors
---
duration_ms: 0.538811
type: 'test'
...
# Subtest: ingestEvents rejects invalid writes and logs structured validation details
ok 41 - ingestEvents rejects invalid writes and logs structured validation details
---
duration_ms: 5.412329
type: 'test'
...
# Subtest: loadMemoryPromptTemplates loads all memory prompt templates from disk
ok 42 - loadMemoryPromptTemplates loads all memory prompt templates from disk
---
duration_ms: 1.458487
type: 'test'
...
# Subtest: summarizeEvents retries with repair prompt when first response is malformed JSON
ok 43 - summarizeEvents retries with repair prompt when first response is malformed JSON
---
duration_ms: 2.152071
type: 'test'
...
# Subtest: summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice
ok 44 - summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice
---
duration_ms: 1.661533
type: 'test'
...
# Subtest: CLI Smoke Test
# Subtest: should print usage when no args provided
ok 1 - should print usage when no args provided
---
duration_ms: 169.974982
type: 'test'
...
# Subtest: should fail when checking without cadence
ok 2 - should fail when checking without cadence
---
duration_ms: 168.833829
type: 'test'
...
# Subtest: should include paused agents in check output
ok 3 - should include paused agents in check output
---
duration_ms: 1032.406098
type: 'test'
...
1..3
ok 45 - CLI Smoke Test
---
duration_ms: 1374.103911
type: 'suite'
...
@@ -1,17 +0,0 @@
#!/bin/bash
echo "Starting reproduction of npm test timeout..."
# Run npm test with a timeout to simulate the hang/slow behavior.
# The actual issue is a 400s timeout, but we demonstrate it by showing it doesn't complete quickly.
timeout 30s npm test > npm_test_output.log 2>&1
EXIT_CODE=$?
if [ $EXIT_CODE -eq 124 ]; then
echo "Reproduced: npm test timed out after 30s (demonstration)."
echo "See npm_test_output.log for partial output."
elif [ $EXIT_CODE -ne 0 ]; then
echo "npm test failed with exit code $EXIT_CODE"
echo "See npm_test_output.log for output."
else
echo "npm test passed (unexpected for reproduction, or it was very fast)"
fi
-4
View File
@@ -1,4 +0,0 @@
# TODO Issues Report - 2026-02-17T16-36-25Z
No actionable TODOs found in the codebase (src/, docs/, bin/, scripts/) as of 2026-02-17T16-36-25Z.
Matches found were false positives (mktemp XXXXXX templates or documentation).
-109
View File
@@ -1,109 +0,0 @@
./memory-updates/2026-02-17T16-36-25Z__todo-triage-agent.md:Run at 2026-02-17T16-36-25Z. Scanned codebase for TODO/FIXME/XXX. Found 0 actionable items. False positives in mktemp usage and documentation.
./docs/agent-handoffs/incidents/goose-hermit-etxtbsy-fix.patch:+ HERMIT_TMP=$(mktemp ~/.config/goose/mcp-hermit/bin/.hermit-download.XXXXXX)
./docs/agent-handoffs/incidents/goose-hermit-etxtbsy-fix.patch:+ HERMIT_INIT_COPY=$(mktemp /tmp/.hermit-init-copy.XXXXXX)
./docs/agent-handoffs/incidents/2026-02-15-hermit-text-file-busy.md:HERMIT_TMP=$(mktemp ~/.config/goose/mcp-hermit/bin/.hermit-download.XXXXXX)
./docs/agent-handoffs/incidents/2026-02-15-hermit-text-file-busy.md:HERMIT_INIT_COPY=$(mktemp /tmp/.hermit-init-copy.XXXXXX)
./docs/proposals/prompt-packages.md: * `todo-triage-agent`: Manage TODOs.
./docs/proposals/plan-agent-architecture.md:| 77 scattered TODO files | Organizational debt | Created daily, never consolidated or triaged |
./docs/proposals/plan-agent-architecture.md:| `src/todo/` | Scattered TODO files needing consolidation |
./docs/proposals/plan-agent-architecture.md:| 77 scattered TODOs | triage | Consolidated into backlog; triage replaces scattered TODO creation |
./test/verify-run-artifacts.test.mjs: await fs.writeFile(path.join(root, 'src', 'todo', 'TODO_1.md'), `${metadata}\n\nPending tasks:\n- finish checks\n`, 'utf8');
./scripts/agent/verify-run-artifacts.mjs: expectedPrefix: 'TODO_',
./perf/constants-refactor/raw-numeric-hits.txt:src/todo/TODO_2026-02-15T20-00-00Z.md:- [ ] Replace 30078 with KIND_APP_DATA in src/cmd-lock.mjs
./src/test_logs/TEST_LOG_2026-02-15T23-20-19Z.md:- Result: Created CONTEXT, TODO, DECISIONS, TEST_LOG files.
./src/test_logs/TEST_LOG_2026-02-20T07-00-00Z.md:### No TODO/FIXME/XXX found
./src/test_logs/TEST_LOG_2026-02-19T18-06-26Z.md:Command: grep -r -E "TODO|FIXME|XXX" src scripts landing docs
./src/test_logs/TEST_LOG_2026-02-15T18-00-00Z.md:- Command: Scan for TODOs
./src/test_logs/TEST_LOG_2026-02-15T18-00-00Z.md: `git grep -n -E "TODO|FIXME|XXX" -- '*.js' '*.mjs' 'docs/*' | sed -n '1,200p' > artifacts/todos.txt`
./src/test_logs/TEST_LOG_2026-02-17T16-36-25Z.md:- Command: Scan for TODOs
./src/context/CONTEXT_2026-02-17T16-36-25Z.md:Scan the repository for TODO/FIXME/XXX markers and triage them.
./src/context/CONTEXT_2026-02-15T18-00-00Z.md:Scan the repository for TODO/FIXME/XXX markers and triage them.
./src/context/CONTEXT_2026-02-20T07-00-00Z.md: - No `TODO/FIXME/XXX` but function-level complexity warrants JSDoc and a flow overview.
./src/context/CONTEXT_2026-02-19T18-06-26Z.md:Goal: Scan codebase for TODOs and create inventory.
./src/context/CONTEXT_2026-02-19T18-06-26Z.md:Scanned for TODOs using grep -r "TODO|FIXME|XXX".
./src/decisions/DECISIONS_2026-02-17T16-36-25Z.md:No actionable TODOs were found in the codebase. The scan returned only documentation references and test data (mktemp usage).
./src/decisions/DECISIONS_2026-02-15T18-00-00Z.md:No actionable TODOs were found in the codebase. The scan returned only documentation references and test data.
./src/decisions/DECISIONS_2026-02-15T18-00-00Z.md:The goal is to triage *actionable* TODOs. Since none exist, no changes or issues are required.
./src/todo/TODO_20260220T041302Z.md:# TODO (20260220T041302Z)
./src/todo/TODO_manual-jules-1771293773.md:# TODO for Scheduler Update Agent
./src/todo/TODO_2026-02-20T19-31-14Z.md:# TODO - perf-agent - 2026-02-20
./src/todo/TODO_2026-02-19T20-00-00Z.md:# TODO — audit-agent run 2026-02-19T20:00:00Z
./src/todo/TODO_2026-02-14T13-30-00Z.md:# Decomposition TODO
./src/todo/TODO_2026-02-14T06-04-19Z.md:# Audit Run TODO
./src/todo/2026-02-13-dom-migration-todo.md:# TODO — Rendering Migration (Example)
./src/todo/TODO_2026-02-17T02-04-31Z.md:# TODO for Scheduler Update Agent
./src/todo/TODO_2026-02-17T02-04-05Z.md:# TODO for Scheduler Update Agent
./src/todo/TODO_2026-02-15T01-22-33Z.md:# TODO for Perf Agent Run 2026-02-15T01-22-33Z
./src/todo/TODO_2026-02-15T18-00-00Z.md:- Scan repository for TODOs.
./src/todo/TODO_2026-02-21T20-22-32Z.md:# TODO — proposal-triage-agent — 2026-02-21T20:22:32Z
./src/todo/TODO_2026-02-21T20-22-32Z.md:- [x] Reviewed proposals, coverage gaps, known issues, incidents, task-log failures, artifacts, TODO debt, and existing backlog.
./src/todo/TODO_2026-02-16.md:# TODO: perf-agent (2026-02-16)
./src/todo/TODO_2026-02-14.md:# TODO Checklist
./src/todo/TODO_2026-02-20T07-00-00Z.md:- [x] Ran file discovery: git ls-files | xargs wc -l | sort -rn; git grep TODO/FIXME/XXX
./src/todo/TODO_2026-02-20T07-00-00Z.md:- [x] Wrote TODO, DECISIONS, TEST_LOG artifacts
./src/todo/TODO_2026-02-20T02-01-57Z.md:# TODO
./src/todo/TODO_2026-02-17T16-37-11Z.md:# TODO for torch-garbage-collection-agent
./src/todo/TODO_2026-02-20T02-05-36Z.md:# TODO
./src/todo/TODO_2026-02-17T16-36-25Z.md:- [x] Scan codebase for TODOs (todo-triage-agent)
./src/todo/TODO_2026-02-19T18-06-26Z.md:# TODOs
./src/todo/TODO_2026-02-19T18-06-26Z.md:- [ ] Maintain zero-TODO baseline.
./src/todo/TODO_2026-02-19T18-06-26Z.md:- [x] Scanned repository for TODO/FIXME/XXX markers.
./src/todo/TODO_2026-02-19T18-06-26Z.md:No actionable TODOs found in src, scripts, landing, or docs.
./src/todo/TODO_2026-02-15T01:03:31Z.md:# TODO Update - 2026-02-15T01:03:31Z
./src/todo/TODO_2026-02-20T04-30-16Z.md:# TODO
./src/todo/TODO_20260220T023152Z.md:# TODO - docs-code-investigator (20260220T023152Z)
./src/todo/TODO_2026-02-18T22-35-00Z.md:# TODO - Log Fixer Agent
./src/todo/TODO_2026-02-18T19-10-00Z.md:# TODO: InnerHTML Migration for `landing/index.html`
./src/todo/TODO_2026-02-20T02-28-25Z.md:# TODO: Decompose src/lock-ops.mjs
./src/todo/TODO_2026-02-14T23-00-00Z.md:# TODO: dashboard/index.html innerHTML Migration
./src/prompts/scheduler-flow.md:- `src/todo/TODO_<timestamp>.md`
./src/prompts/daily/decompose-agent.md:- `src/todo/TODO_<timestamp>.md` — checklist of extraction items (2–3 blocks) and status.
./src/prompts/daily/decompose-agent.md:Add these items to `src/todo/TODO_<timestamp>.md`.
./src/prompts/daily/decompose-agent.md:4. Read file, identify 2–3 cohesive blocks, document in `src/context/CONTEXT_<timestamp>.md` and `src/todo/TODO_<timestamp>.md`.
./src/prompts/daily/const-refactor-agent.md:- `src/todo/TODO_<timestamp>.md` — List of duplicated constants to canonicalize and status for each.
./src/prompts/daily/audit-agent.md:- `src/todo/TODO_<timestamp>.md` — checklist for the audit run and follow-ups.
./src/prompts/daily/audit-agent.md: - If automated, add a follow-up task in `src/todo/TODO_<timestamp>.md` or open issues for high-priority items with labels `perf`, `lint`, or `security` as appropriate.
./src/prompts/daily/scheduler-update-agent.md: - `src/todo/TODO_<timestamp>.md`
./src/prompts/daily/perf-agent.md:- `src/todo/TODO_<timestamp>.md` — tasks (Done / Blocked).
./src/prompts/daily/innerhtml-migration-agent.md:- `src/todo/TODO_<timestamp>.md` — checklist of assignments in the file and status.
./src/prompts/daily/innerhtml-migration-agent.md: Add this list to `src/todo/TODO_<timestamp>.md` as items to migrate.
./src/prompts/daily/docs-code-investigator.md: - Focus on files > ~200 LOC, or files that contain `TODO|FIXME|XXX`.
./src/prompts/daily/docs-code-investigator.md:- Priority: files containing `TODO|FIXME|XXX` or >200 lines. shared helpers and core modules are high-value places to document.
./src/prompts/daily/docs-code-investigator.md:git grep -n -E "TODO|FIXME|XXX" -- . | sed -n '1,200p'
./src/prompts/daily/docs-code-investigator.md:- Is large (> 200 LOC) or contains `TODO` / `FIXME` / `XXX`.
./src/prompts/daily/docs-code-investigator.md:- Note unreachable code, TODOs, or suspicious `try/catch` with swallowing errors.
./src/prompts/daily/docs-code-investigator.md:git grep -n -E "TODO|FIXME|XXX" -- . | sed -n '1,200p'
./src/prompts/daily/todo-triage-agent.md:Mission: keep the codebase’s TODO/FIXME backlog actionable by scanning for TODO-style comments, classifying them by effort/risk, and either (a) fixing **trivial, safe** items via small PRs or (b) converting non-trivial or sensitive items into well-formed GitHub issues. Every change must be small, safe, traceable, and reviewable.
./src/prompts/daily/todo-triage-agent.md: - Scanning the repo for TODO/FIXME/XXX markers in source/docs.
./src/prompts/daily/todo-triage-agent.md: - Refactors or feature work disguised as “TODO fixes”.
./src/prompts/daily/todo-triage-agent.md: - Deleting TODOs without resolving the underlying need.
./src/prompts/daily/todo-triage-agent.md:1. Visibility — Produce a current TODO inventory file each run.
./src/prompts/daily/todo-triage-agent.md:2. Safety — No risky areas are modified; sensitive TODOs become issues.
./src/prompts/daily/todo-triage-agent.md:5. Minimal disruption — Avoid churn; don’t reformat files just to touch TODOs.
./src/prompts/daily/todo-triage-agent.md:- No security-sensitive fixes. If the TODO mentions (or touches) cryptography,
./src/prompts/daily/todo-triage-agent.md:- No mission drift. Do not expand TODO triage into general cleanup/refactors.
./src/prompts/daily/todo-triage-agent.md:- One logical change per commit; don’t bundle unrelated TODOs in one PR unless
./src/prompts/daily/todo-triage-agent.md:P0 Security/safety TODOs → issue only, label clearly.
./src/prompts/daily/todo-triage-agent.md:P1 Trivial correctness/docs TODOs → small PR if safe and < 1 hour.
./src/prompts/daily/todo-triage-agent.md:P2 Medium/large engineering TODOs → issue with next-step recommendation.
./src/prompts/daily/todo-triage-agent.md:P3 Cosmetic/low-value TODOs → issue or leave (don’t churn) unless policy
./src/prompts/daily/todo-triage-agent.md: `git grep -n -E "TODO|FIXME|XXX" -- '*.js' '*.html' 'docs/*' \
./src/prompts/daily/todo-triage-agent.md: For each TODO/FIXME/XXX entry:
./src/prompts/daily/todo-triage-agent.md: - file, line number, exact TODO first line
./src/prompts/daily/todo-triage-agent.md:2) Implement the smallest change that resolves the TODO.
./src/prompts/daily/todo-triage-agent.md: - `fix(ai): <short description> (TODO)`
./src/prompts/daily/todo-triage-agent.md: - `chore(ai): <short description> (TODO)` for docs-only changes
./src/prompts/daily/todo-triage-agent.md: - Summary of the TODO and what changed
./src/prompts/daily/todo-triage-agent.md:- `fix(ai): <short description> (TODO)`
./src/prompts/daily/todo-triage-agent.md:- any sensitive/security-related TODOs
./src/prompts/daily/todo-triage-agent.md:- `todo: <first line of the TODO>`
./src/prompts/daily/todo-triage-agent.md:- What you believe the TODO intends
./src/prompts/daily/todo-triage-agent.md:DE-DUPING & STALE TODOs
./src/prompts/daily/todo-triage-agent.md:- If multiple TODOs refer to the same underlying problem, consolidate into one
./src/prompts/daily/todo-triage-agent.md:- Do not delete TODOs as “stale” unless you can prove the need is resolved.
./src/prompts/daily/todo-triage-agent.md:- 0–N small PRs for trivial, safe TODOs
./src/prompts/daily/todo-triage-agent.md:- 0–N GitHub issues for medium/large/sensitive TODOs
./src/prompts/daily/deps-security-agent.md:- `src/todo/TODO_<timestamp>.md` — upgrade tasks and statuses.
./src/backlog/BACKLOG.md:- **Source:** `KNOWN_ISSUES.md`, `src/todo/TODO_2026-02-18.md`
./src/backlog/BACKLOG.md:### BACKLOG-015: Consolidate persistent TODO debt into actionable tracked items
./src/backlog/BACKLOG.md:- **Scope:** Define archival policy for stale TODO artifacts and create a maintained actionable TODO registry.
@@ -1,23 +0,0 @@
# Weekly Race Condition Report: 2026-02-15
## Focus Areas Audited
- Shared Client and Relay Pool (`src/lib.mjs`, `src/lock-ops.mjs`)
## Findings
### 1. Non-deterministic Lock Sorting in `cmdLock` (High Severity)
- **Description**: The `cmdLock` function in `src/lib.mjs` sorts contending lock events by `createdAt` timestamp only. Since Nostr `created_at` has 1-second resolution, two agents creating lock events in the same second could be sorted differently by different clients depending on the order in which relays return them (or local array sort stability if not handled).
- **Interleaving**:
1. Agent A creates lock event E1 at T=100.
2. Agent B creates lock event E2 at T=100.
3. Agent A queries relays, receives [E1, E2]. Sorts by time (equal). If stable sort or random order puts E1 first, A thinks it won.
4. Agent B queries relays, receives [E2, E1]. Sorts by time (equal). If stable sort or random order puts E2 first, B thinks it won.
5. Both agents proceed to execute the task, violating the mutual exclusion property.
- **Fix**: Implemented a deterministic tie-breaker using `eventId` (lexicographical comparison).
```javascript
.sort((a, b) => (a.createdAt - b.createdAt) || String(a.eventId).localeCompare(String(b.eventId)));
```
- **Risk**: Low (behavior preserving, standard distributed system practice).
## Next Week Focus
- App initialization and login flow.
+14 -2
View File
@@ -559,6 +559,18 @@ function createLockCard(lock, now) {
return card;
}
let renderPending = false;
function scheduleRender() {
if (renderPending) return;
renderPending = true;
requestAnimationFrame(() => {
renderPending = false;
if (isAlive() && !document.hidden) {
renderLocks();
}
});
}
function renderLocks() {
if (!isAlive()) return;
@@ -709,12 +721,12 @@ function connectToRelay(url) {
}
appendRawLog(event);
renderLocks();
scheduleRender();
}
// NIP-01: ["EOSE", subId] — end of stored events
if (data[0] === 'EOSE') {
renderLocks();
scheduleRender();
}
});
+95
View File
@@ -0,0 +1,95 @@
# TORCH Style Guide
This document outlines the design system, color palette, and typography used in the TORCH project (`dashboard/` and `landing/`).
## Color Palette
The project uses a dark theme with high-contrast text and vibrant accents.
### Core Colors
| Name | CSS Variable | Hex | Usage |
|:---------------|:-------------------|:----------|:-------------------------------------------|
| **Surface** | `--surface` | `#0b1020` | Main background color. |
| **Surface Alt**| `--surface-alt` | `#151b2f` | Card backgrounds, headers, secondary areas.|
| **Text** | `--text` | `#dbe4ff` | Primary body text (slightly blue-tinted). |
| **Text Strong**| `--text-strong` | `#ffffff` | Headings, emphasized text. |
| **Muted** | `--muted` | `#9aa6c6` | Secondary text, metadata, descriptions. |
| **Border** | `--border` | `#2a3456` | Borders for cards, inputs, dividers. |
### Brand & Functional Colors
| Name | CSS Variable | Hex | Usage |
|:---------------|:-------------------|:----------|:-------------------------------------------|
| **Accent** | `--accent` | `#4f8cff` | Primary buttons, active states, links. |
| **Accent Strong**| `--accent-strong`| `#2f6be5` | Hover states for accent elements. |
| **Info** | `--info` | `#46b7ff` | Informational messages, icons. |
| **Info Strong**| `--info-strong` | `#8ad4ff` | Stronger info emphasis. |
| **Success** | `--success` | `#35c47c` | Success messages, "Active" statuses. |
| **Warning** | `--warning` | `#f5b84b` | Warning alerts. |
| **Danger** | `--danger` | `#ff6b6b` | Error messages, destructive actions. |
### Auxiliary Colors
| Name | CSS Variable | Hex |
|:---------------|:-------------------|:----------|
| **Purple** | `--purple` | `#a855f7` |
| **Pink** | `--pink` | `#ec4899` |
| **Teal** | `--teal` | `#2dd4bf` |
## Typography
### Font Families
* **Primary**: `Inter`, `system-ui`, `-apple-system`, `Segoe UI`, `Roboto`, `sans-serif`
* **Monospace**: `ui-monospace`, `SFMono-Regular`, `Menlo`, `Monaco`, `Consolas`, `monospace`
### Hierarchy
* **Headings**: Bold (`700`), `Text Strong`.
* **Body**: Regular (`400`), `Text`.
* **Small/Meta**: Small size, `Muted`.
## Components
### Buttons
* **Primary CTA**:
* Background: `var(--accent)`
* Text: `white`
* Border Radius: `9999px` (Pill shape)
* Hover: `var(--accent-strong)`, slight transform up.
* **Secondary CTA**:
* Background: Transparent or low opacity white.
* Border: `var(--border)`
* Text: `var(--text)`
* Hover: Lighter background, `Text Strong`.
### Cards
* Background: `var(--surface-alt)`
* Border: `1px solid var(--border)`
* Radius: `12px` or `1rem`
* Hover: Border color changes to `var(--accent)`, slight lift (`transform: translateY(-5px)`).
### Status Badges
* Small, pill-shaped (`border-radius: 99px`).
* Uppercase, bold, small font size.
* Active: Background `var(--accent)`, Text `var(--surface)`.
* Disabled/Inactive: Background `rgba(255,255,255,0.1)`, Text `var(--muted)`.
## Layout
* **Container**: Max-width `1200px` centered.
* **Grid**: Responsive grids using `grid-template-columns: repeat(auto-fit, minmax(..., 1fr))`.
* **Spacing**: Uses `rem` units (e.g., `1rem`, `2rem`, `4rem`).
## Accessibility Guidelines
* **Contrast**: Ensure text passes WCAG AA standards against the dark background.
* **Interactive Elements**:
* Must have `role="button"` or be `<button>`/`<a>`.
* Must be keyboard accessible (`tabindex="0"`).
* Must have visible focus states (`focus:ring`).
* **Images**: All images must have `alt` text. Decorative images should use `aria-hidden="true"`.
+47 -12
View File
@@ -164,7 +164,7 @@
}
@media (max-width: 640px) {
.meta-prompts {
.meta-prompts, .agent-showcase {
padding: 0 1rem;
}
}
@@ -667,7 +667,7 @@
.functional-agent-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
@@ -809,7 +809,7 @@
</head>
<body>
<div class="background-decoration">
<div class="background-decoration" aria-hidden="true">
<svg viewBox="0 0 1440 1024" fill="none" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice">
<defs>
<linearGradient id="warmGradient" x1="0%" y1="0%" x2="100%" y2="0%">
@@ -874,8 +874,8 @@
<div class="install-container scroll-reveal">
<h2 class="mb-8 text-text-strong" style="font-size: 2rem;">Choose Your Agent</h2>
<div class="agent-selector">
<div id="card-jules" onclick="selectAgent('jules')" class="agent-card active" style="cursor: pointer;">
<div class="agent-selector" role="radiogroup" aria-label="Select an Agent">
<div id="card-jules" onclick="selectAgent('jules')" class="agent-card active" style="cursor: pointer;" role="radio" aria-checked="true" tabindex="0">
<div class="agent-header">
<span class="agent-name">Jules</span>
<span class="agent-status">Active</span>
@@ -883,7 +883,7 @@
<p class="agent-desc">Web-based tool with Auto-Scheduler. Optimized for Google's latest coding agent. <a href="https://jules.google/" target="_blank" onclick="event.stopPropagation()">Learn more</a>.</p>
</div>
<div id="card-codex" onclick="selectAgent('codex')" class="agent-card" style="cursor: pointer;">
<div id="card-codex" onclick="selectAgent('codex')" class="agent-card" style="cursor: pointer;" role="radio" aria-checked="false" tabindex="0">
<div class="agent-header">
<span class="agent-name">Codex CLI</span>
<span class="agent-status">Active</span>
@@ -891,7 +891,7 @@
<p class="agent-desc">Advanced reasoning for complex tasks. (Requires full access permissions) <a href="https://openai.com/blog/openai-codex" target="_blank" onclick="event.stopPropagation()">Learn more</a>.</p>
</div>
<div id="card-opencode" onclick="selectAgent('opencode')" class="agent-card" style="cursor: pointer;">
<div id="card-opencode" onclick="selectAgent('opencode')" class="agent-card" style="cursor: pointer;" role="radio" aria-checked="false" tabindex="0">
<div class="agent-header">
<span class="agent-name">OpenCode CLI</span>
<span class="agent-status">Active</span>
@@ -899,7 +899,7 @@
<p class="agent-desc">Open source models running locally. <a href="https://opencode.ai/" target="_blank" onclick="event.stopPropagation()">Learn more</a>.</p>
</div>
<div id="card-claude" onclick="selectAgent('claude')" class="agent-card" style="cursor: pointer;">
<div id="card-claude" onclick="selectAgent('claude')" class="agent-card" style="cursor: pointer;" role="radio" aria-checked="false" tabindex="0">
<div class="agent-header">
<span class="agent-name">Claude Code CLI</span>
<span class="agent-status">Active</span>
@@ -907,7 +907,7 @@
<p class="agent-desc">Long-context understanding and safety. (CLI Required, needs cronjob) <a href="https://claude.ai/" target="_blank" onclick="event.stopPropagation()">Learn more</a>.</p>
</div>
<div id="card-gemini" onclick="selectAgent('gemini')" class="agent-card" style="cursor: pointer;">
<div id="card-gemini" onclick="selectAgent('gemini')" class="agent-card" style="cursor: pointer;" role="radio" aria-checked="false" tabindex="0">
<div class="agent-header">
<span class="agent-name">Gemini CLI</span>
<span class="agent-status">Active</span>
@@ -915,7 +915,7 @@
<p class="agent-desc">Google's multimodal AI model. (CLI Required, needs cronjob) <a href="https://deepmind.google/technologies/gemini/" target="_blank" onclick="event.stopPropagation()">Learn more</a>.</p>
</div>
<div id="card-qwen" onclick="selectAgent('qwen')" class="agent-card" style="cursor: pointer;">
<div id="card-qwen" onclick="selectAgent('qwen')" class="agent-card" style="cursor: pointer;" role="radio" aria-checked="false" tabindex="0">
<div class="agent-header">
<span class="agent-name">Qwen Coder CLI</span>
<span class="agent-status">Active</span>
@@ -923,7 +923,7 @@
<p class="agent-desc">Alibaba's open weights coding model. (CLI Required, needs cronjob) <a href="https://qwenlm.github.io/" target="_blank" onclick="event.stopPropagation()">Learn more</a>.</p>
</div>
<div id="card-antigravity" onclick="selectAgent('antigravity')" class="agent-card" style="cursor: pointer;">
<div id="card-antigravity" onclick="selectAgent('antigravity')" class="agent-card" style="cursor: pointer;" role="radio" aria-checked="false" tabindex="0">
<div class="agent-header">
<span class="agent-name">Antigravity IDE</span>
<span class="agent-status">Active</span>
@@ -1016,6 +1016,27 @@ npm install https://github.com/PR0M3TH3AN/TORCH/archive/refs/heads/main.tar.gz &
</div>
</section>
<section class="hook-memory scroll-reveal" style="max-width: 800px; margin: 4rem auto; padding: 0 2rem; text-align: center;">
<h2 style="font-size: 2rem; margin-bottom: 1.5rem; color: var(--text-strong);">Hook memory into your existing agents</h2>
<p style="font-size: 1.1rem; color: var(--muted); margin-bottom: 2rem; line-height: 1.6;">
Add these instructions to your agent's system prompt (e.g. in <code>AGENTS.md</code> or <code>CLAUDE.md</code>) to enable the TORCH memory system.
</p>
<div class="install-code-wrapper multiline" style="margin: 0 auto; text-align: left;">
<code id="memory-hook-code">## TORCH Memory Integration
You have access to the TORCH memory system.
1. READ: Check `.scheduler-memory/latest/${cadence}/memories.md` for past learnings.
2. WRITE: Before exiting, save new insights to `memory-update.md` so future runs can learn from this session.</code>
<button class="copy-install-btn" onclick="copyToClipboard('memory-hook-code', this)">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
</svg>
Copy
</button>
</div>
</section>
<section class="meta-prompts scroll-reveal">
<h2>Scheduler Meta Prompts</h2>
<div class="prompts-grid">
@@ -1527,14 +1548,28 @@ npm install https://github.com/PR0M3TH3AN/TORCH/archive/refs/heads/main.tar.gz &
.replace(/'/g, "&#039;");
}
// Handle keyboard navigation for agent cards
document.querySelectorAll('.agent-card').forEach(card => {
card.addEventListener('keydown', (e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
card.click();
}
});
});
function selectAgent(agent) {
// Remove active class from all cards
document.querySelectorAll('.agent-card').forEach(card => card.classList.remove('active'));
document.querySelectorAll('.agent-card').forEach(card => {
card.classList.remove('active');
card.setAttribute('aria-checked', 'false');
});
// Add active class to selected card
const selectedCard = document.getElementById('card-' + agent);
if (selectedCard) {
selectedCard.classList.add('active');
selectedCard.setAttribute('aria-checked', 'true');
}
// Update prompt text
-10
View File
@@ -1,10 +0,0 @@
# Learnings from known-issues-agent run (2026-02-22)
- **Sandbox Environment Improvements**:
- `test/dashboard-auth.test.mjs` and `test/ops.test.mjs` passed successfully in the current Codex/Linux environment, contrary to the active known issue `KNOWN-ISSUE-sandbox-eprem-tests`. Marked as "Monitoring".
- `npm run lock:health` passed with 3/3 relays healthy, contrary to `KNOWN-ISSUE-relay-connectivity-sandbox`. Marked as "Monitoring".
- Codex environment shows functional WebSocket connectivity to Nostr relays (`wss://relay.damus.io`, `wss://nos.lol`, `wss://relay.primal.net`), unlike the reported Claude Code environment restrictions.
- **Action Items**:
- Continue monitoring sandbox tests in future runs to confirm stability.
- Consider closing `KNOWN-ISSUE-sandbox-eprem-tests` if it consistently passes.
@@ -0,0 +1,12 @@
# Memory Update — load-test-agent — 2026-02-22
## Key findings
- Verified `load-test.mjs` harness works correctly against a local ephemeral relay (`scripts/agent/simple-relay.mjs`).
- Dry-run mode defaults to true; explicit `--dry-run 0` is required for live tests.
## Patterns / reusable knowledge
- Use `scripts/agent/simple-relay.mjs` for safe local load testing without external dependencies.
- `load-test.mjs` generates reports in `reports/load-test/`.
## Warnings / gotchas
- Ensure local relay port binding works in the environment (`127.0.0.1`).
@@ -0,0 +1,10 @@
# Memory Update — load-test-agent — 2026-02-23
## Key findings
- Load test harness verified in dry-run mode (v0.1.0).
## Patterns / reusable knowledge
- Use `--dry-run` to verify script integrity without network access.
## Warnings / gotchas
- Always set `RELAY_URL` even for dry-run.
@@ -0,0 +1,11 @@
# Memory Update — perf-agent — 2026-02-23
## Key findings
- /content directory is missing; docs audit cannot proceed as described.
- Found 42 performance-sensitive patterns in codebase.
## Patterns / reusable knowledge
- grep scan is effective for finding keywords.
## Warnings / gotchas
- Ensure output formats match scheduler expectations.
@@ -0,0 +1,10 @@
# Memory Update — telemetry-agent — 2026-02-23
## Key findings
- No opt-in telemetry sources found (`TELEMETRY=1` or `artifacts/telemetry-optin/`).
## Patterns / reusable knowledge
- Verify opt-in status before attempting processing to avoid empty runs.
## Warnings / gotchas
- Ensure CI/Agent workflows explicitly set `TELEMETRY=1` to be included.
@@ -0,0 +1,8 @@
# Memory Update — onboarding-audit-agent — 2026-02-24
## Key findings
- `npm test` fails if `AGENT_PLATFORM` is set to something other than what `detectPlatform()` returns, due to `test/scheduler-preflight-lock.e2e.test.mjs`.
- `test/scheduler-preflight-lock.e2e.test.mjs` should probably be updated to respect `AGENT_PLATFORM` if set in the environment.
## Warnings / gotchas
- When running audits in Jules/Codex/etc, be aware of `detectPlatform()` behavior vs `AGENT_PLATFORM` overrides.
@@ -0,0 +1,12 @@
# Memory Update — todo-triage-agent — 2026-02-24
## Key findings
- Codebase is remarkably clean of `TODO`, `FIXME`, or `XXX` comments in source files.
- grep results are dominated by documentation and previous logs, suggesting scanning logic should exclude `task-logs/` and `src/todo/` directories to reduce noise.
## Patterns / reusable knowledge
- Current grep pattern: `git grep -n -E "TODO|FIXME|XXX" -- ...` finds many false positives in docs.
- Future scans should focus on `src/**/*.mjs` and exclude `*.md` files if looking for code comments.
## Warnings / gotchas
- `artifacts/todos.txt` can become large due to documentation hits.
@@ -0,0 +1,10 @@
# Memory Update - torch-garbage-collection-agent
**Date:** 2026-02-24T22:17:46Z
**Run ID:** 2026-02-24T22-17-46Z
## Summary
- Run completed successfully.
- No stale files found (0 candidates).
- No files deleted.
- Environment verified.
@@ -0,0 +1,12 @@
# Memory Update — todo-triage-agent — 2026-02-25
## Key findings
- No actionable `TODO/FIXME/XXX` markers were found in `src/` or `dashboard/` source files.
- Documentation files like `src/backlog/BACKLOG.md` contain references to backlog items which are not code TODOs.
## Patterns / reusable knowledge
- Grep scans should continue to exclude `node_modules`, `task-logs`, and `artifacts` to avoid noise.
- Future runs can focus on maintaining this zero-TODO baseline.
## Warnings / gotchas
- None.
+2
View File
@@ -57,7 +57,9 @@
"lock:health": "node bin/torch-lock.mjs health",
"dashboard:serve": "node bin/torch-lock.mjs dashboard",
"build": "node build.mjs",
"format": "eslint . --fix",
"lint": "eslint .",
"lint:inline-styles": "! grep -r \"style=\" src/ dashboard/ --exclude-dir=test_logs --exclude-dir=task-logs",
"lock:complete": "node bin/torch-lock.mjs complete",
"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:daily": "node scripts/agent/run-scheduler-cycle.mjs daily",
+47
View File
@@ -0,0 +1,47 @@
# Audit Report — 2026-02-24
**Summary**
* Commit: 11b3d191172c62bee3080149ffcf663fa1cf76db
* Date: 2026-02-24T23:22:51Z
* Node: v22.22.0 / OS: Linux
**Metrics**
* **Oversized files:** 27 files (total excess lines: 7737)
* Top offenders:
1. `perf/constants-refactor/candidates.json` (1668 lines, excess: 1368)
2. `landing/index.html` (1567 lines, excess: 1267)
3. `scripts/agent/run-scheduler-cycle.mjs` (1355 lines, excess: 1055)
4. `dashboard/app.js` (835 lines, excess: 535)
5. `reports/test-audit/flakiness-matrix.json` (766 lines, excess: 466)
6. `test/run-scheduler-cycle-memory-policy.test.mjs` (724 lines, excess: 424)
7. `src/ops.mjs` (717 lines, excess: 417)
8. `scripts/agent/load-test.mjs` (641 lines, excess: 341)
9. `TORCH.md` (593 lines, excess: 293)
10. `src/services/memory/index.js` (566 lines, excess: 266)
* **Total innerHTML assignments:** 2
* Offenders:
1. `dashboard/app.js` — 1
2. `landing/index.html` — 1
* **Lint failures:** 0
**Delta vs previous**
* *No previous report found for comparison.*
**High-priority items**
* Review `perf/constants-refactor/candidates.json` and `landing/index.html` for size reduction.
* Review `dashboard/app.js` and `landing/index.html` for `innerHTML` usage — consider sanitized templates or `textContent`.
**Artifacts**
* `reports/audit/file-size-report-2026-02-24.json`
* `reports/audit/innerhtml-report-2026-02-24.json`
* `reports/audit/lint-report-2026-02-24.json`
* `reports/audit/raw-check-file-size-2026-02-24.log`
* `reports/audit/raw-check-innerhtml-2026-02-24.log`
* `reports/audit/raw-lint-2026-02-24.log`
+1
View File
@@ -0,0 +1 @@
# Audit Report - 2026-02-25
@@ -0,0 +1,32 @@
{
"oversized_files": [
{"file": "README.md", "lines": 302, "excess": 2},
{"file": "TORCH.md", "lines": 593, "excess": 293},
{"file": "dashboard/app.js", "lines": 835, "excess": 535},
{"file": "dashboard/styles.css", "lines": 372, "excess": 72},
{"file": "docs/proposals/node-based-prompt-editor.md", "lines": 307, "excess": 7},
{"file": "docs/proposals/plan-agent-architecture.md", "lines": 543, "excess": 243},
{"file": "landing/index.html", "lines": 1567, "excess": 1267},
{"file": "perf/constants-refactor/candidates.json", "lines": 1668, "excess": 1368},
{"file": "reports/test-audit/flakiness-matrix.json", "lines": 766, "excess": 466},
{"file": "scripts/agent/load-test.mjs", "lines": 641, "excess": 341},
{"file": "scripts/agent/run-scheduler-cycle.mjs", "lines": 1355, "excess": 1055},
{"file": "scripts/agent/scheduler-utils.mjs", "lines": 322, "excess": 22},
{"file": "scripts/agent/verify-run-artifacts.mjs", "lines": 375, "excess": 75},
{"file": "src/lib.mjs", "lines": 436, "excess": 136},
{"file": "src/lock-publisher.mjs", "lines": 440, "excess": 140},
{"file": "src/ops.mjs", "lines": 717, "excess": 417},
{"file": "src/services/governance/index.js", "lines": 364, "excess": 64},
{"file": "src/services/memory/index.js", "lines": 566, "excess": 266},
{"file": "src/services/memory/pruner.js", "lines": 320, "excess": 20},
{"file": "src/services/memory/scheduler.js", "lines": 318, "excess": 18},
{"file": "src/torch-config.mjs", "lines": 312, "excess": 12},
{"file": "test/governance.test.mjs", "lines": 375, "excess": 75},
{"file": "test/lib.test.mjs", "lines": 434, "excess": 134},
{"file": "test/lock-ops.test.mjs", "lines": 433, "excess": 133},
{"file": "test/memory-formatter.test.mjs", "lines": 441, "excess": 141},
{"file": "test/run-scheduler-cycle-memory-policy.test.mjs", "lines": 724, "excess": 424},
{"file": "test/scheduler-time-window.test.mjs", "lines": 311, "excess": 11}
],
"total_excess_lines": 7737
}
@@ -0,0 +1,7 @@
{
"assignments": [
{"file": "dashboard/app.js", "count": 1},
{"file": "landing/index.html", "count": 1}
],
"total_assignments": 2
}
@@ -0,0 +1,4 @@
{
"failures": [],
"total_failures": 0
}
@@ -0,0 +1,44 @@
# Onboarding Audit Report - 2026-02-24
## Headline
⚠️ Onboarding failures found
## Environment
- OS: Linux (Jules)
- Node: v22.22.0
- npm: 11.7.0
## Steps Executed
1. `npm install`
2. `npm run build`
3. `npm test`
4. `npm run lint`
## Results
- `npm install`: PASS
- `npm run build`: PASS
- `npm test`: FAIL (Exit Code 1)
- `npm run lint`: PASS
## Failures
### `npm test`
The test `test/scheduler-preflight-lock.e2e.test.mjs` failed due to a platform mismatch.
The test expects the platform in the log to match `detectPlatform()` (which is `jules` in this environment), but the scheduler used `linux` (explicitly set via `AGENT_PLATFORM` for this audit run).
This is a known issue (`KNOWN-ISSUE-scheduler-preflight-platform`).
**Log Excerpt:**
```
not ok 1 - lock preflight e2e: successful lock writes completed status snapshot
---
actual:
platform: 'linux'
expected:
platform: 'jules'
```
**Root Cause:**
The test `test/scheduler-preflight-lock.e2e.test.mjs` asserts that the logged platform matches `detectPlatform()`, ignoring any `AGENT_PLATFORM` environment variable that might have been passed to the scheduler. When `AGENT_PLATFORM` is set manually, the scheduler uses it, causing a mismatch with the test's hardcoded expectation.
## Docs Changes
- None made. The instructions in `README.md` are correct for a default run.
@@ -0,0 +1,26 @@
# Known Issues Report - 2026-02-23
## Status: ⚠️ Active issues remain
Most active issues are specific to restricted environments (Codex/Claude/Goose) and do not reproduce in the Jules environment.
### Verification Summary
| Issue ID | Status | Last Verified | Jules Result |
|----------|--------|---------------|--------------|
| `KNOWN-ISSUE-scheduler-preflight-platform` | Active | 2026-02-23 | ✅ Passed |
| `KNOWN-ISSUE-memory-telemetry-stdout-stderr` | Active | 2026-02-23 | ✅ Passed |
| `KNOWN-ISSUE-sandbox-eprem-tests` | Active | 2026-02-23 | ✅ Passed |
| `Goose Desktop: hermit ETXTBSY` | Active | 2026-02-23 | ❓ N/A (Linux/Jules) |
| `Goose Desktop: wrapper exit codes` | Active | 2026-02-23 | ❓ N/A (Linux/Jules) |
| `KNOWN-ISSUE-relay-connectivity-sandbox` | Monitoring | 2026-02-23 | ✅ Healthy |
| `Claude Code: outbound WebSocket` | Active | 2026-02-23 | ✅ Connected |
### Actions Taken
- Verified tests pass in Jules environment.
- Updated `KNOWN_ISSUES.md` to reflect verification status.
- Confirmed relay health and lock acquisition.
### Next Steps
- Continue monitoring relay health.
- Investigate Goose Desktop issues if environment becomes available.
@@ -0,0 +1,150 @@
{
"generatedAt": "2026-02-22T23:05:00.396Z",
"config": {
"relay": {
"protocol": "ws:",
"hostname": "127.0.0.1",
"port": "42049"
},
"relaySummary": "ws://127.0.0.1:42049",
"dryRun": false,
"clients": 10,
"durationSec": 10,
"rateEps": 20,
"mixMetadata": 0.2,
"seed": null,
"connectConcurrency": 25,
"maxConnections": 10,
"maxInflight": 300,
"publishTimeoutMs": 15000,
"metadataParts": 4
},
"results": {
"attempted": 200,
"succeeded": 200,
"failed": 0,
"successRate": 1,
"throughputEps": 19.93,
"backpressureDrops": 0,
"inFlightPeak": 2,
"latency": {
"count": 200,
"minMs": 0.655,
"avgMs": 0.9502750000000002,
"p50Ms": 0.806,
"p90Ms": 1.073,
"p95Ms": 1.252,
"p99Ms": 3.879,
"maxMs": 11.851
},
"eventLoopLag": {
"avgMs": 0.388,
"p95Ms": 1
},
"errorBreakdown": {},
"topStackTraces": {},
"resource": {
"samples": [
{
"tSec": 5,
"rssMb": 78.54,
"heapUsedMb": 12.14,
"heapTotalMb": 19.35,
"cpuPercent": 17.63
},
{
"tSec": 10,
"rssMb": 79.04,
"heapUsedMb": 12.29,
"heapTotalMb": 19.85,
"cpuPercent": 13.45
}
],
"sampleCount": 2,
"maxRssMb": 79.04,
"maxHeapUsedMb": 12.29,
"avgCpuPercent": 15.54,
"cpuUserMs": 1514.738,
"cpuSystemMs": 41.191
},
"throughputSeries": [
{
"second": 0,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 1,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 2,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 3,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 4,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 5,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 6,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 7,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 8,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 9,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
}
],
"hotFunctions": "not measured",
"startedAtIso": "2026-02-22T23:04:50.361Z",
"completedAtIso": "2026-02-22T23:05:00.396Z",
"runDurationSec": 10.035
},
"remediation": [
"No significant bottlenecks observed in this run; increase load gradually and repeat to find saturation point."
]
}
@@ -0,0 +1,150 @@
{
"generatedAt": "2026-02-23T01:06:03.112Z",
"config": {
"relay": {
"protocol": "ws:",
"hostname": "localhost",
"port": "9999"
},
"relaySummary": "ws://localhost:9999",
"dryRun": true,
"clients": 1000,
"durationSec": 10,
"rateEps": 20,
"mixMetadata": 0.2,
"seed": null,
"connectConcurrency": 25,
"maxConnections": 250,
"maxInflight": 300,
"publishTimeoutMs": 15000,
"metadataParts": 4
},
"results": {
"attempted": 200,
"succeeded": 200,
"failed": 0,
"successRate": 1,
"throughputEps": 19.998,
"backpressureDrops": 0,
"inFlightPeak": 2,
"latency": {
"count": 200,
"minMs": 5.203,
"avgMs": 14.467850000000004,
"p50Ms": 14.242,
"p90Ms": 22.238,
"p95Ms": 23.286,
"p99Ms": 24.489,
"maxMs": 24.688
},
"eventLoopLag": {
"avgMs": 0.396,
"p95Ms": 2
},
"errorBreakdown": {},
"topStackTraces": {},
"resource": {
"samples": [
{
"tSec": 5,
"rssMb": 78.06,
"heapUsedMb": 10.09,
"heapTotalMb": 19.35,
"cpuPercent": 17.4
},
{
"tSec": 10,
"rssMb": 78.21,
"heapUsedMb": 10.27,
"heapTotalMb": 19.35,
"cpuPercent": 13.72
}
],
"sampleCount": 2,
"maxRssMb": 78.21,
"maxHeapUsedMb": 10.27,
"avgCpuPercent": 15.56,
"cpuUserMs": 1492.56,
"cpuSystemMs": 63.908
},
"throughputSeries": [
{
"second": 0,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 1,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 2,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 3,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 4,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 5,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 6,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 7,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 8,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
},
{
"second": 9,
"attempted": 20,
"succeeded": 20,
"failed": 0,
"backpressureDrops": 0
}
],
"hotFunctions": "not measured",
"startedAtIso": "2026-02-23T01:05:53.110Z",
"completedAtIso": "2026-02-23T01:06:03.112Z",
"runDurationSec": 10.001
},
"remediation": [
"No significant bottlenecks observed in this run; increase load gradually and repeat to find saturation point."
]
}
@@ -0,0 +1,42 @@
# Load Test Report - 2026-02-22
## Safety
- Does not target public relays.
- Requires explicit `RELAY_URL`.
- Relay target: ws://127.0.0.1:42049
- Mode: live publish test
## Configuration
- Clients: 10
- Duration: 10s
- Rate: 20 events/sec
- Metadata mix: 0.2
- Max connections: 10
- Max in-flight publishes: 300
- Seed: (random)
## Summary
- Attempted: 200
- Succeeded: 200
- Failed: 0
- Throughput: 19.93 events/sec
- Success rate: 100.00%
## Latency
- p50: 0.806 ms
- p90: 1.073 ms
- p95: 1.252 ms
- p99: 3.879 ms
## Event Loop Lag
- Avg: 0.388 ms
- p95: 1 ms
## Error Taxonomy
- none
## Hot Functions
- not measured
## Prioritized Remediation
1. No significant bottlenecks observed in this run; increase load gradually and repeat to find saturation point.
@@ -0,0 +1,42 @@
# Load Test Report - 2026-02-23
## Safety
- Does not target public relays.
- Requires explicit `RELAY_URL`.
- Relay target: ws://localhost:9999
- Mode: dry-run (no network sends)
## Configuration
- Clients: 1000
- Duration: 10s
- Rate: 20 events/sec
- Metadata mix: 0.2
- Max connections: 250
- Max in-flight publishes: 300
- Seed: (random)
## Summary
- Attempted: 200
- Succeeded: 200
- Failed: 0
- Throughput: 19.998 events/sec
- Success rate: 100.00%
## Latency
- p50: 14.242 ms
- p90: 22.238 ms
- p95: 23.286 ms
- p99: 24.489 ms
## Event Loop Lag
- Avg: 0.396 ms
- p95: 2 ms
## Error Taxonomy
- none
## Hot Functions
- not measured
## Prioritized Remediation
1. No significant bottlenecks observed in this run; increase load gradually and repeat to find saturation point.
@@ -0,0 +1,63 @@
# Daily Performance Report - 2026-02-23
## Summary
Perf scan run on 2026-02-23T21:25:49Z. Found 42 potential issues.
## Findings
### P0 (Critical)
None identified automatically.
### Scan Hits
- src/test_logs/TEST_LOG_2026-02-17T00-00-00Z.md:9 (setInterval)
- src/test_logs/TEST_LOG_2026-02-17T19-43-26Z.md:153 (Promise.all)
- src/test_logs/TEST_LOG_2026-02-19T16-54-36Z.md:15 (setTimeout)
- src/test_logs/TEST_LOG_2026-02-16.md:5 (setInterval)
- src/test_logs/TEST_LOG_2026-02-16.md:6 (visibilitychange)
- src/context/CONTEXT_2026-02-16.md:19 (setInterval)
- src/context/test-audit-context.md:8 (setTimeout)
- src/decisions/test-audit-decisions.md:4 (setTimeout)
- src/decisions/DECISIONS_2026-02-16.md:5 (setInterval)
- src/decisions/DECISIONS_2026-02-16.md:9 (visibilitychange)
- src/decisions/DECISIONS_2026-02-16.md:13 (requestAnimationFrame)
- src/decisions/DECISIONS_2026-02-16.md:16 (visibilitychange)
- src/lock-publisher.mjs:116 (Promise.all)
- src/lock-publisher.mjs:196 (setTimeout)
- src/lock-publisher.mjs:423 (Promise.all)
- src/lib.mjs:204 (setTimeout)
- src/todo/test-audit-todo.md:3 (setTimeout)
- src/todo/test-audit-todo.md:4 (setTimeout)
- src/todo/test-audit-todo.md:5 (setTimeout)
- src/lock-utils.mjs:57 (setTimeout)
- src/lock-utils.mjs:59 (Promise.race)
- src/prompts/weekly/race-condition-agent.md:46 (postMessage)
- src/prompts/weekly/race-condition-agent.md:116 (Promise.all)
- src/prompts/daily/const-refactor-agent.md:84 (setTimeout)
- src/prompts/daily/perf-agent.md:91 (document.hidden)
- src/prompts/daily/perf-agent.md:100 (setInterval)
- src/prompts/daily/perf-agent.md:102 (new Worker)
- src/prompts/daily/perf-agent.md:103 (new WebTorrent)
- src/prompts/daily/perf-agent.md:105 (document.hidden)
- src/prompts/daily/perf-agent.md:110 (requestAnimationFrame)
- src/prompts/daily/perf-agent.md:121 (document.hidden)
- src/cmd-list.mjs:38 (Promise.all)
- src/dashboard.mjs:254 (setTimeout)
- src/services/memory/index.js:52 (setTimeout)
- src/services/memory/pruner.js:199 (Promise.all)
- src/services/memory/pruner.js:276 (Promise.all)
- src/services/memory/retriever.js:256 (Promise.all)
- src/services/memory/formatter.js:181 (Promise.all)
- src/services/memory/scheduler.js:33 (setInterval)
- src/services/memory/scheduler.js:167 (setTimeout)
- src/services/memory/scheduler.js:252 (setInterval)
- src/services/memory/scheduler.js:260 (setTimeout)
## Metrics
- Login Time: N/A (requires instrumentation)
- Decrypt Queue: N/A
## Blockers
- No /content directory found for docs audit.
## PRs
None.
@@ -0,0 +1,19 @@
# Daily Performance Report - 2026-02-24
## Summary
Perf-agent executed. Identified a performance bottleneck in `dashboard/app.js` where the UI was re-rendering synchronously on every incoming WebSocket event. This could lead to UI freezes during high event volume. A fix was applied to debounce rendering and gate it behind visibility checks.
## P0/P1 Findings
- **High Priority**: `dashboard/app.js` `renderLocks()` called synchronously in `ws.onmessage`.
- **Impact**: Potential main-thread blocking and wasted CPU when tab is hidden.
- **Action**: Implemented `scheduleRender` using `requestAnimationFrame` and `!document.hidden`. Replaced direct calls with this debounced version.
- **Status**: Fixed.
## Metrics
- **Search Hits**: See `reports/performance/hits-2026-02-24.json` for full inventory of performance-sensitive patterns (`setInterval`, `Promise.all`, etc.).
## Docs Audit
- **Status**: Skipped. The `/content` directory was not found in the repository.
## PRs / Issues
- Applied fix directly to `dashboard/app.js`.
@@ -0,0 +1,5 @@
{
"generated_at": "2026-02-23T06:55:00Z",
"total_errors": 0,
"groups": []
}
@@ -0,0 +1,29 @@
# Telemetry Report — 2026-02-23
**Headline**: Total sanitized errors: 0 — Groups: 0 — Top severity: 0
## Top 10 crashes (table)
| Rank | Fingerprint | Severity | Count | Owner | Sample trace |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
## Top 5 recommended human actions
1. **Enable Opt-In**: No telemetry sources found. To collect telemetry, set `TELEMETRY=1` in CI or agent runs, or place artifacts in `artifacts/telemetry-optin/`.
## Method & Sources
- **Sources Checked**: `artifacts/telemetry-optin/`, CI runs with `TELEMETRY=1` (none found).
- **Opt-in Rules**: Strict opt-in required.
- **Sanitization**: N/A (no logs processed).
## Privacy audit
- **Redacted**: 0 emails, 0 IPs, 0 keys.
- **Confirmation**: No raw logs committed.
## Limitations & next steps
- **Coverage**: 0% (no opt-in sources).
- **Next Steps**: Encourage adoption of `TELEMETRY=1` for critical workflows.
+757 -5
View File
@@ -1,14 +1,766 @@
{
"test/lock-ops-publish-retry.test.mjs": {
"Build artifacts verification # SKIP dist/ not found — run npm run build first": {
"pass": 5,
"fail": 0
},
"test/scheduler-lock-failure-schema.contract.test.mjs": {
"parseArgs should parse basic command": {
"pass": 5,
"fail": 0
},
"test/scheduler-preflight-lock.e2e.test.mjs": {
"pass": 0,
"fail": 5
"parseArgs should parse agent and cadence": {
"pass": 5,
"fail": 0
},
"parseArgs should parse equals sign syntax": {
"pass": 5,
"fail": 0
},
"parseArgs should parse dry-run flag": {
"pass": 5,
"fail": 0
},
"parseArgs should parse port with default": {
"pass": 5,
"fail": 0
},
"parseArgs should parse custom port": {
"pass": 5,
"fail": 0
},
"parseArgs should parse ignore-logs flag": {
"pass": 5,
"fail": 0
},
"parseArgs should parse memory flags": {
"pass": 5,
"fail": 0
},
"parseArgs should parse memory flags with equals": {
"pass": 5,
"fail": 0
},
"cmdList": {
"pass": 5,
"fail": 0
},
"cmdRemove reports nothing when no TORCH installation exists": {
"pass": 5,
"fail": 0
},
"cmdRemove with --force removes torch/ directory": {
"pass": 5,
"fail": 0
},
"cmdRemove removes runtime artifacts (task-logs, .scheduler-memory)": {
"pass": 5,
"fail": 0
},
"cmdRemove removes src/proposals/ and cleans empty src/": {
"pass": 5,
"fail": 0
},
"cmdRemove cleans torch:* scripts from host package.json": {
"pass": 5,
"fail": 0
},
"cmdRemove cancels when user declines confirmation": {
"pass": 5,
"fail": 0
},
"cmdRemove confirmed via mockAnswers removes artifacts": {
"pass": 5,
"fail": 0
},
"Dashboard Authentication": {
"pass": 5,
"fail": 0
},
"Dashboard Configuration Exposure Security": {
"pass": 5,
"fail": 0
},
"Dashboard Configuration Security": {
"pass": 5,
"fail": 0
},
"Dashboard Path Traversal Security Fix": {
"pass": 5,
"fail": 0
},
"Dashboard File Access Security": {
"pass": 5,
"fail": 0
},
"ExitError": {
"pass": 5,
"fail": 0
},
"createProposal should throw error for disallowed target": {
"pass": 5,
"fail": 0
},
"validateProposal should return invalid for disallowed target": {
"pass": 5,
"fail": 0
},
"validateProposal should return valid for allowed target": {
"pass": 5,
"fail": 0
},
"Governance Service Security: Command Injection Prevention": {
"pass": 5,
"fail": 0
},
"SCN-proposal-create: createProposal writes meta.json, new.md, change.diff": {
"pass": 5,
"fail": 0
},
"SCN-proposal-list: listProposals returns created proposal; status filter works": {
"pass": 5,
"fail": 0
},
"SCN-proposal-reject: rejectProposal marks proposal with rejected status and reason": {
"pass": 5,
"fail": 0
},
"SCN-archive-naming: applyProposal archives with timestamp_hash filename and sidecar": {
"pass": 5,
"fail": 0
},
"SCN-version-list: listPromptVersions returns versions newest-first with metadata": {
"pass": 5,
"fail": 0
},
"SCN-rollback-latest: rollbackPrompt restores the most recently archived content": {
"pass": 5,
"fail": 0
},
"SCN-rollback-hash: rollbackPrompt --strategy <fragment> restores matching archive": {
"pass": 5,
"fail": 0
},
"cmdInit should validate install directory name": {
"pass": 5,
"fail": 0
},
"src/lib.mjs": {
"pass": 5,
"fail": 0
},
"ci-resilience lock acquisition under unstable relays": {
"pass": 5,
"fail": 0
},
"publishLock retry behavior": {
"pass": 5,
"fail": 0
},
"lock-ops": {
"pass": 5,
"fail": 0
},
"getCompletedAgents": {
"pass": 5,
"fail": 0
},
"main dispatch": {
"pass": 5,
"fail": 0
},
"listMemories, inspectMemory, pinMemory, and unpinMemory support admin hooks": {
"pass": 5,
"fail": 0
},
"triggerPruneDryRun returns candidate metadata without deleting records": {
"pass": 5,
"fail": 0
},
"memoryStats reports counts/rates and retrieval telemetry remains redaction-safe": {
"pass": 5,
"fail": 0
},
"runPruneCycle respects prune feature-flag modes": {
"pass": 5,
"fail": 0
},
"markMemoryMerged delegates to repository and clears cache": {
"pass": 5,
"fail": 0
},
"stores runtime events in signer/session namespace and clears scope": {
"pass": 5,
"fail": 0
},
"expires runtime events and records expiration metrics": {
"pass": 5,
"fail": 0
},
"enforces LRU bounds and tracks eviction metrics": {
"pass": 5,
"fail": 0
},
"blocks decrypted/session-sensitive data from durable promotion without sanitizer pass": {
"pass": 5,
"fail": 0
},
"createEmbedderAdapter selects in-memory backend and supports vector CRUD": {
"pass": 5,
"fail": 0
},
"createEmbedderAdapter reads backend from environment": {
"pass": 5,
"fail": 0
},
"memory feature flags parse defaults and canary allow-lists": {
"pass": 5,
"fail": 0
},
"memory prune flag supports off, dry-run, and active modes": {
"pass": 5,
"fail": 0
},
"estimateTokenCount returns heuristic count": {
"pass": 5,
"fail": 0
},
"formatMemoryBlock converts memory record to display block": {
"pass": 5,
"fail": 0
},
"formatMemoryBlock handles missing optional fields and default clamping": {
"pass": 5,
"fail": 0
},
"formatMemoryBlock respects custom clamping options": {
"pass": 5,
"fail": 0
},
"formatMemoryBlock handles edge cases for clamping": {
"pass": 5,
"fail": 0
},
"formatMemoriesForPrompt enforces token budget and k limit": {
"pass": 5,
"fail": 0
},
"formatMemoriesForPrompt handles aggressive budget fitting": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext injects context when enabled": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext returns base prompt when disabled": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext handles missing query or service": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext handles circular agentContext gracefully": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext handles agentContext as array of strings": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext handles agentContext as plain object": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext handles agentContext as primitives": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext calls updateMemoryUsage for retrieved memories": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext handles empty memories gracefully": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext handles null/undefined memories gracefully": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext respects TORCH_MEMORY_ENABLED=false": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext respects retrieval allowlist": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext passes k and tokenBudget": {
"pass": 5,
"fail": 0
},
"getRelevantMemories uses cached results when available": {
"pass": 5,
"fail": 0
},
"getRelevantMemories calls ranker and updates cache on miss": {
"pass": 5,
"fail": 0
},
"getRelevantMemories passes correct parameters to ranker": {
"pass": 5,
"fail": 0
},
"getRelevantMemories triggers updateMemoryUsage on repository": {
"pass": 5,
"fail": 0
},
"ingestEvents": {
"pass": 5,
"fail": 0
},
"ingestMemoryWindow gathers sources, redacts pii, chunks, embeds, links, and emits telemetry": {
"pass": 5,
"fail": 0
},
"ingestMemoryWindow dedupes overlapping windows by hashed content + agent + timestamp bucket": {
"pass": 5,
"fail": 0
},
"pinMemory pins the memory and clears the cache": {
"pass": 5,
"fail": 0
},
"pinMemory returns null for non-existent ID but still clears cache": {
"pass": 5,
"fail": 0
},
"unpinMemory unpins the memory and clears the cache": {
"pass": 5,
"fail": 0
},
"unpinMemory returns null for non-existent ID but still clears cache": {
"pass": 5,
"fail": 0
},
"createLifecyclePlan respects delete safety constraints and logs reasons": {
"pass": 5,
"fail": 0
},
"createLifecyclePlan condenses near-duplicates and archives merged source records": {
"pass": 5,
"fail": 0
},
"applyLifecycleActions executes keep/archive/delete and merge markers": {
"pass": 5,
"fail": 0
},
"filterAndRankMemories applies metadata filters and composite score": {
"pass": 5,
"fail": 0
},
"formatMemoriesForPrompt returns prompt blocks and enforces token budget trimming": {
"pass": 5,
"fail": 0
},
"isMemoryRetrievalEnabled supports global toggle and agent canary list": {
"pass": 5,
"fail": 0
},
"renderPromptWithMemoryContext injects bounded memory block before base prompt": {
"pass": 5,
"fail": 0
},
"runPruneCycle respects off mode": {
"pass": 5,
"fail": 0
},
"runPruneCycle respects dry-run mode": {
"pass": 5,
"fail": 0
},
"runPruneCycle removes stale unpinned memories in active mode": {
"pass": 5,
"fail": 0
},
"runPruneCycle starts scheduler if requested": {
"pass": 5,
"fail": 0
},
"createDbAdvisoryLockProvider acquires and releases postgres advisory locks": {
"pass": 5,
"fail": 0
},
"startMemoryMaintenanceScheduler runs all jobs and emits metrics including retries": {
"pass": 5,
"fail": 0
},
"startMemoryMaintenanceScheduler skips jobs when feature flags disable memory": {
"pass": 5,
"fail": 0
},
"normalizeMemoryItem applies durable schema defaults and coercions": {
"pass": 5,
"fail": 0
},
"validateMemoryItem reports field-level errors": {
"pass": 5,
"fail": 0
},
"ingestEvents rejects invalid writes and logs structured validation details": {
"pass": 5,
"fail": 0
},
"memoryStats with empty repository returns zero counts and rates": {
"pass": 5,
"fail": 0
},
"memoryStats with populated repository returns correct counts and totals": {
"pass": 5,
"fail": 0
},
"memoryStats calculates ingest throughput based on window": {
"pass": 5,
"fail": 0
},
"memoryStats reflects deleted count from prune cycle": {
"pass": 5,
"fail": 0
},
"memoryStats handles windowMs parameter correctly": {
"pass": 5,
"fail": 0
},
"loadMemoryPromptTemplates loads all memory prompt templates from disk": {
"pass": 5,
"fail": 0
},
"summarizeEvents retries with repair prompt when first response is malformed JSON": {
"pass": 5,
"fail": 0
},
"summarizeEvents falls back to deterministic minimal summary with conservative importance when parsing fails twice": {
"pass": 5,
"fail": 0
},
"telemetry should not log to stdout or stderr by default": {
"pass": 5,
"fail": 0
},
"telemetry should log to stderr when NODE_DEBUG=torch-memory is set": {
"pass": 5,
"fail": 0
},
"schema validation covers required fields, coercion, and rejection paths": {
"pass": 5,
"fail": 0
},
"summarizer parser accepts valid json and recovers after malformed json response": {
"pass": 5,
"fail": 0
},
"ingest integration persists memory records and links embeddings from event batches": {
"pass": 5,
"fail": 0
},
"retrieval ranking blends semantic, importance, and recency signals": {
"pass": 5,
"fail": 0
},
"pruner policy protects pins, merges duplicates, and picks archive/delete outcomes": {
"pass": 5,
"fail": 0
},
"scheduler smoke test handles mocked clock and lock contention": {
"pass": 5,
"fail": 0
},
"CLI Smoke Test": {
"pass": 5,
"fail": 0
},
"ops.mjs: cmdInit creates .gitignore with node_modules": {
"pass": 5,
"fail": 0
},
"ops.mjs: cmdInit appends to existing .gitignore": {
"pass": 5,
"fail": 0
},
"cmdInit creates directory structure and files": {
"pass": 5,
"fail": 0
},
"cmdInit fails if directory exists without force": {
"pass": 5,
"fail": 0
},
"cmdUpdate preserves modified prompt": {
"pass": 5,
"fail": 0
},
"cmdUpdate overwrites prompt with force": {
"pass": 5,
"fail": 0
},
"cmdUpdate creates backup": {
"pass": 5,
"fail": 0
},
"torch-lock check respects local roster": {
"pass": 5,
"fail": 0
},
"cmdInit creates torch-config.json with random namespace": {
"pass": 5,
"fail": 0
},
"relay fanout quorum integration": {
"pass": 5,
"fail": 0
},
"RelayHealthManager": {
"pass": 5,
"fail": 0
},
"evaluateAlertThresholds": {
"pass": 5,
"fail": 0
},
"summarizeHistory - basic statistics calculation": {
"pass": 5,
"fail": 0
},
"summarizeHistory - handles empty history": {
"pass": 5,
"fail": 0
},
"summarizeHistory - respects time window for stats": {
"pass": 5,
"fail": 0
},
"summarizeHistory - allDownDurationMinutes considers outside window entries": {
"pass": 5,
"fail": 0
},
"summarizeHistory - allDownDurationMinutes is null if never healthy": {
"pass": 5,
"fail": 0
},
"summarizeHistory - allDownDurationMinutes is 0 if currently healthy": {
"pass": 5,
"fail": 0
},
"summarizeHistory - handles malformed entries gracefully": {
"pass": 5,
"fail": 0
},
"summarizeHistory - handles valid timestamp but missing summary": {
"pass": 5,
"fail": 0
},
"summarizeHistory - healthy entry with invalid timestamp results in NaN duration": {
"pass": 5,
"fail": 0
},
"Roster (Unit Tests with Dependency Injection)": {
"pass": 5,
"fail": 0
},
"fails required memory policy when retrieval/storage evidence is missing": {
"pass": 5,
"fail": 0
},
"accepts required memory policy when markers or artifacts are produced": {
"pass": 5,
"fail": 0
},
"records backend failure metadata when lock command exits with code 2": {
"pass": 5,
"fail": 0
},
"defers backend failures in non-strict mode and reuses idempotency key on successful retry": {
"pass": 5,
"fail": 0
},
"fails after exceeding non-strict deferral budget": {
"pass": 5,
"fail": 0
},
"strict lock mode fails immediately without deferral": {
"pass": 5,
"fail": 0
},
"skips lock health preflight by default when not enabled": {
"pass": 5,
"fail": 0
},
"fails scheduler with preflight metadata when lock health preflight is enabled": {
"pass": 5,
"fail": 0
},
"categorizes unreadable prompt files as prompt_parse_error": {
"pass": 5,
"fail": 0
},
"categorizes invalid prompt schema as prompt_schema_error": {
"pass": 5,
"fail": 0
},
"categorizes handoff runtime failures as execution_error": {
"pass": 5,
"fail": 0
},
"retries lock acquisition for backend error and succeeds on a later attempt": {
"pass": 5,
"fail": 0
},
"stops retrying after configured lock backend retries are exhausted": {
"pass": 5,
"fail": 0
},
"does not use backend retry flow for exit code 3 lock conflicts": {
"pass": 5,
"fail": 0
},
"retries handoff command for retryable network failures and succeeds": {
"pass": 5,
"fail": 0
},
"uses fallback platform for handoff when primary platform fails": {
"pass": 5,
"fail": 0
},
"fails before lock acquisition when runner health preflight command fails": {
"pass": 5,
"fail": 0
},
"uses exclusion payload from mixed JSON lock:check output": {
"pass": 5,
"fail": 0
},
"runs selected scheduler prompt through configured runner command": {
"pass": 5,
"fail": 0
},
"propagates non-zero runner exit code": {
"pass": 5,
"fail": 0
},
"scheduler lock backend failure artifact matches required frontmatter schema": {
"pass": 5,
"fail": 0
},
"schema contract catches missing required lock-backend field": {
"pass": 5,
"fail": 0
},
"schema contract catches misnamed lock-backend key": {
"pass": 5,
"fail": 0
},
"lock preflight e2e: successful lock writes completed status snapshot": {
"pass": 5,
"fail": 0
},
"lock preflight e2e: exit code 2 quorum failure persists failed backend status and prompt-not-started marker": {
"pass": 5,
"fail": 0
},
"lock preflight e2e: non-lock failure exits failed without prompt parse/schema classification": {
"pass": 5,
"fail": 0
},
"Scheduler Ratchet Logic (Log Checking)": {
"pass": 5,
"fail": 0
},
"Scheduler cycle ordering guarantees": {
"pass": 5,
"fail": 0
},
"parseDateValue": {
"pass": 5,
"fail": 0
},
"isStrictSchedulerLogFilename": {
"pass": 5,
"fail": 0
},
"parseAgentFromFilename": {
"pass": 5,
"fail": 0
},
"parseTimestampFromFilename": {
"pass": 5,
"fail": 0
},
"parseFrontmatterCreatedAt / parseFrontmatterAgent": {
"pass": 5,
"fail": 0
},
"buildRecentlyRunExclusionSet — scenarios": {
"pass": 5,
"fail": 0
},
"CADENCE_WINDOW_MS constants": {
"pass": 5,
"fail": 0
},
"secureRandom": {
"pass": 5,
"fail": 0
},
"summarizes recent lock reliability by platform/cadence/backend/relay": {
"pass": 5,
"fail": 0
},
"run-flaky-check reports pass/fail counts from TAP output files": {
"pass": 5,
"fail": 0
},
"loadTorchConfig (Unit Tests with Mocked FS)": {
"pass": 5,
"fail": 0
},
"torch-config": {
"pass": 5,
"fail": 0
},
"Async Utilities": {
"pass": 5,
"fail": 0
},
"Date Utilities": {
"pass": 5,
"fail": 0
},
"Relay Utilities": {
"pass": 5,
"fail": 0
},
"Platform Utilities": {
"pass": 5,
"fail": 0
},
"File Utilities": {
"pass": 5,
"fail": 0
},
"String Utilities": {
"pass": 5,
"fail": 0
},
"passes when artifacts include metadata and failure IDs map to unresolved known issue entries": {
"pass": 5,
"fail": 0
},
"fails when required metadata is missing from artifacts": {
"pass": 5,
"fail": 0
},
"fails when failure identifiers are not cross-linked to known issues or incidents": {
"pass": 5,
"fail": 0
}
}
+10 -10
View File
@@ -1,32 +1,32 @@
[
{
"run": 1,
"code": 1,
"code": 0,
"tapOutputPath": "reports/test-audit/flaky-run-01.tap",
"observed": 3
"observed": 191
},
{
"run": 2,
"code": 1,
"code": 0,
"tapOutputPath": "reports/test-audit/flaky-run-02.tap",
"observed": 3
"observed": 191
},
{
"run": 3,
"code": 1,
"code": 0,
"tapOutputPath": "reports/test-audit/flaky-run-03.tap",
"observed": 3
"observed": 191
},
{
"run": 4,
"code": 1,
"code": 0,
"tapOutputPath": "reports/test-audit/flaky-run-04.tap",
"observed": 3
"observed": 191
},
{
"run": 5,
"code": 1,
"code": 0,
"tapOutputPath": "reports/test-audit/flaky-run-05.tap",
"observed": 3
"observed": 191
}
]
@@ -0,0 +1,6 @@
Run 1/5...
Run 2/5...
Run 3/5...
Run 4/5...
Run 5/5...
Flakiness matrix written to reports/test-audit/flakiness-matrix.json.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,2 @@
Found 4 suspicious files.
Report written to reports/test-audit/suspicious-tests.json.
+6
View File
@@ -5,6 +5,12 @@
"No obvious assertions"
]
},
{
"file": "test/playwright/dashboard.spec.js",
"issues": [
"Found setTimeout()"
]
},
{
"file": "test/relay-fanout-quorum.integration.test.mjs",
"issues": [
@@ -0,0 +1,36 @@
# Test Audit Report: 2026-02-24
## Executive Summary
Executed test audit using `run-flaky-check.mjs` and `run-static-analysis.mjs`. The audit focused on unit and integration tests run by the Node.js test runner. Playwright tests were excluded from the flaky check to prevent false positives caused by runner incompatibility.
**Result:** No flakiness observed in the audited suite.
## Methodology
- **Flaky Check**: Executed `run-flaky-check.mjs` with 5 iterations.
- Command: `node scripts/test-audit/run-flaky-check.mjs test/*.test.mjs test/*.test.js`
- Reason for custom arguments: The default behavior of `run-flaky-check.mjs` recursively discovers all files in `test/`, inadvertently attempting to run Playwright specs (`test/playwright/*.spec.js`) with the Node.js test runner, causing immediate failure.
- **Static Analysis**: Executed `run-static-analysis.mjs` to identify anti-patterns (e.g., `setTimeout`).
## Findings
### 1. Flakiness
- **Pass Rate**: 100% (5/5 runs passed for all 381 tests).
- **Matrix**: `reports/test-audit/flakiness-matrix.json` confirms stable execution.
### 2. Static Analysis (Suspicious Patterns)
The analysis flagged usage of `setTimeout`, which can lead to non-deterministic behavior (flakiness) or slow tests.
| File | Issue | Assessment |
| :--- | :--- | :--- |
| `test/playwright/dashboard.spec.js` | Found `setTimeout()` | **Actionable**. Uses `setTimeout(2000)` to wait for a file write after server shutdown. This is a potential source of flakiness if disk I/O is slow. Recommendation: Replace with a polling mechanism checking for file existence or size change. |
| `test/relay-fanout-quorum.integration.test.mjs` | Found `setTimeout()` | **Valid**. Used within `createRelaySimulatorFixture` to simulate network latency (`delayMs`) for mock relays. This is a controlled usage for testing timeout logic. |
| `test/utils-async.test.mjs` | Found `setTimeout()` | **Valid**. This file tests async utilities (including `withTimeout`), so explicit timer usage is required. |
| `test/fixtures/memory-fixtures.js` | No obvious assertions | **Valid**. This is a fixture file, not a test file. |
## Recommendations
1. **Tooling**: Update `scripts/test-audit/run-flaky-check.mjs` to align its default test discovery with `npm test` (i.e., `test/*.test.mjs test/*.test.js`) or explicitly exclude `test/playwright/`.
2. **Refactoring**: Refactor `test/playwright/dashboard.spec.js` to remove the hardcoded 2-second sleep.
## Next Steps
- No immediate critical flakiness to fix.
- Future work should address the tooling alignment and the specific Playwright sleep.
@@ -0,0 +1,16 @@
test_integrity_note:
change_type: "refactor_tests"
scenarios:
- id: SCN-AUDIT-TOOLING
given: "A developer runs the flaky check tool without arguments"
when: "The tool executes"
then: "It defaults to the standard test suite (test/*.test.mjs, test/*.test.js) and excludes incompatible runners (Playwright)"
observable_outcomes:
- "scripts/test-audit/run-flaky-check.mjs runs successfully without arguments"
determinism_controls:
- "Explicit file selection for node test runner"
anti_cheat_rationale:
prevents:
- "Running incompatible tests leads to false positives in audit reports"
relaxation:
did_relax_any_assertion: false
+28
View File
@@ -0,0 +1,28 @@
import { WebSocketServer } from 'ws';
import http from 'http';
const server = http.createServer();
const wss = new WebSocketServer({ server });
wss.on('connection', (ws) => {
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
const type = data[0];
if (type === 'REQ') {
const subId = data[1];
ws.send(JSON.stringify(['EOSE', subId]));
} else if (type === 'EVENT') {
const event = data[1];
ws.send(JSON.stringify(['OK', event.id, true, '']));
}
} catch (_err) {
// ignore
}
});
});
server.listen(0, '127.0.0.1', () => {
const address = server.address();
console.log(`ws://127.0.0.1:${address.port}`);
});
+5
View File
@@ -20,6 +20,11 @@ for (let i = 0; i < args.length; i++) {
}
}
// Default to npm test patterns if no args provided
if (testArgs.length === 0) {
testArgs.push('test/*.test.mjs', 'test/*.test.js');
}
async function runTests(i) {
console.log(`Run ${i + 1}/${RUNS}...`);
return new Promise((resolve) => {
@@ -0,0 +1,22 @@
---
agent: torch-garbage-collection-agent
cadence: daily
run-start: 2026-02-25T01:09:35Z
---
# Context
Prompt: src/prompts/daily/torch-garbage-collection-agent.md
## Goal
Clean up stale log files and ephemeral memory updates from the repository root to maintain hygiene.
## Scope
- Files in the repository root matching `*.log`, `*.log.*`, `*.out.log`.
- Files in `memory-updates/` matching `*.md`.
- Only files older than 14 days.
## Constraints
- Must not delete files outside the repository root.
- Must not delete files that do not match the specified patterns.
- Must not delete files younger than 14 days.
- Must verify candidates before deletion.
@@ -0,0 +1,22 @@
---
agent: load-test-agent
cadence: daily
run-start: 2026-02-22T23:03:37Z
---
# Context
Executed prompt: src/prompts/daily/load-test-agent.md
## Goal
Execute a safe, reproducible load test against a local relay to measure baseline performance.
## Scope
- Create a local ephemeral relay for testing.
- Run the load test harness (`scripts/agent/load-test.mjs`) against the local relay.
- Generate a performance report.
## Constraints
- Must not target public relays.
- Must use `load-test-agent` prompt instructions.
- Must not introduce new dependencies if possible.
@@ -0,0 +1,21 @@
---
agent: known-issues-agent
cadence: daily
run-start: 2026-02-23T00-16-03Z
---
# Goal
Triage known issues and verify their status.
# Scope
Validate KNOWN_ISSUES.md against the current environment (Jules).
Focus on Active issues:
- scheduler-preflight-lock.e2e.test.mjs
- memory-telemetry.test.mjs
- Sandbox restrictions (dashboard-auth, nostr-lock, ops)
- Relay health
# Constraints
- Dark factory validation rules apply.
- Do not modify tests unless correcting spec.
- Only fix trivial/safe issues.
Loaded 100 of 200 files, more files were not shown because too many files have changed in this diff. Show more