diff --git a/memory-updates/2026-02-23T21-25-49Z__perf-agent.md b/memory-updates/2026-02-23T21-25-49Z__perf-agent.md new file mode 100644 index 0000000..8398e0e --- /dev/null +++ b/memory-updates/2026-02-23T21-25-49Z__perf-agent.md @@ -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. diff --git a/reports/performance/daily-perf-report-2026-02-23.md b/reports/performance/daily-perf-report-2026-02-23.md index 795d24a..f7a20c0 100644 --- a/reports/performance/daily-perf-report-2026-02-23.md +++ b/reports/performance/daily-perf-report-2026-02-23.md @@ -1,73 +1,63 @@ # Daily Performance Report - 2026-02-23 -**Summary:** Found 63 potential performance hits. +## Summary +Perf scan run on 2026-02-23T21:25:49Z. Found 42 potential issues. -## P0 Findings (Worker/Critical) -- `src/prompts/daily/perf-agent.md`: `- `new Worker|Worker\(|postMessage\(|getDmDecryptWorkerQueueSize|decryptDmInWorker`` -- `src/prompts/daily/perf-agent.md`: `- Add `MAX_DM_WORKER_PENDING` to `dmDecryptWorkerClient.js`. Throttle/reject when exceeded; log `getDmDecryptWorkerQueueSize()`.` -- `src/prompts/daily/perf-agent.md`: `- Log `getDmDecryptWorkerQueueSize()` and warn > 20.` +## Findings -## P1 Findings (Loops/Async) -- `src/test_logs/TEST_LOG_2026-02-17T00-00-00Z.md`: `- Command: grep -rE "setInterval|setTimeout" src/` -- `src/test_logs/TEST_LOG_2026-02-17T19-43-26Z.md`: `async Promise.all (index 0)` -- `src/test_logs/TEST_LOG_2026-02-19T16-54-36Z.md`: `- **Static Analysis**: Identified 4 suspicious files (1 fixture, 3 tests with `setTimeout`).` -- `src/context/CONTEXT_2026-02-16.md`: `- `setInterval` in `dashboard/index.html` runs even when tab is hidden, wasting CPU.` -- `src/context/test-audit-context.md`: `- Check for "cheat vectors" like `setTimeout`.` -- `src/decisions/test-audit-decisions.md`: `- **Decision:** Flagged tests with `setTimeout` for future refactoring to improve determinism.` -- `src/decisions/DECISIONS_2026-02-16.md`: `- Use `requestAnimationFrame`: Still runs (sometimes throttled) and more complex to manage with 30s intervals.` -- `src/lock-publisher.mjs`: `const settled = await Promise.allSettled(` -- `src/lock-publisher.mjs`: `sleepFn = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),` -- `src/lock-publisher.mjs`: `const [publishTimeoutMs, minSuccesses, fallbackRelays, minActiveRelayPool] = await Promise.all([` -- `src/lib.mjs`: `await new Promise((resolve) => setTimeout(resolve, raceCheckDelayMs));` -- `src/todo/test-audit-todo.md`: `- [ ] Investigate `test/memory-cache.test.mjs` for `setTimeout` removal.` -- `src/todo/test-audit-todo.md`: `- [ ] Investigate `test/memory.test.js` for `setTimeout` removal.` -- `src/todo/test-audit-todo.md`: `- [ ] Investigate `test/relay-fanout-quorum.integration.test.mjs` for `setTimeout` removal.` -- `src/lock-utils.mjs`: `timer = setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);` -- `src/prompts/weekly/race-condition-agent.md`: `- Promise.all/race with insufficient error isolation` -- `src/prompts/daily/const-refactor-agent.md`: `- Timeout: look for `setTimeout`, `fetch(..., { timeout: ...})`, `pool.list` timeouts, `BACKGROUND_RELAY_TIMEOUT_MS`.` -- `src/prompts/daily/perf-agent.md`: `- `setInterval|setTimeout|requestAnimationFrame|requestIdleCallback`` -- `src/cmd-list.mjs`: `const results = await Promise.all(` -- `src/dashboard.mjs`: `setTimeout(() => {` -- `src/services/memory/index.js`: `await new Promise((resolve) => setTimeout(resolve, MIN_SAVE_INTERVAL_MS - timeSinceLast));` -- `src/services/memory/pruner.js`: `const condensedGroups = await Promise.all(` -- `src/services/memory/pruner.js`: `const results = await Promise.all(plan.actions.map(async (decision) => {` -- `src/services/memory/retriever.js`: `await Promise.all(ids.map((id) => repository.updateMemoryUsage(id, lastSeen)));` -- `src/services/memory/formatter.js`: `await Promise.all((memories ?? []).map((memory) => memoryService.updateMemoryUsage(memory.id, now)));` -- `src/services/memory/scheduler.js`: `const handle = setInterval(() => {` -- `src/services/memory/scheduler.js`: `setTimeout(resolve, options.retryDelayMs);` -- `src/services/memory/scheduler.js`: `const intervalHandle = setInterval(run, definition.intervalMs);` -- `src/services/memory/scheduler.js`: `const timeout = setTimeout(async () => {` +### P0 (Critical) +None identified automatically. -## P2 Findings (Torrent) -- `src/test_logs/TEST_LOG_2026-02-23T18-18-24Z.md`: `**Command:** `grep -rE "setInterval|setTimeout|requestAnimationFrame|requestIdleCallback|Promise\.allSettled|Promise\.all|Promise\.any|Promise\.race|new Worker|Worker\(|postMessage\(|getDmDecryptWorkerQueueSize|decryptDmInWorker|new WebTorrent|WebTorrent|torrent|magnet|torrentHash|magnetValidators|integrationClient\.pool|publishEventToRelays|pool\.list|queueSignEvent|relayManager|authService|hydrateFromStorage|document\.hidden|visibilitychange" src/`` -- `src/prompts/weekly/fuzz-agent.md`: `Mission: improve **input robustness** by fuzzing high-risk parsers/decoders (shared event schemas, DM unwrapping/decrypt paths, magnet normalization), capturing crashes/exceptions with minimized reproducers, and landing **small, safe** guard/validation fixes when appropriate. Every change must be traceable, reviewable, and compliant with repo security policy.` -- `src/prompts/weekly/fuzz-agent.md`: `- magnet normalization utilities` -- `src/prompts/weekly/fuzz-agent.md`: `- `magnet-utils`` -- `src/prompts/daily/known-issues-agent.md`: `magnets/webtorrent safety, logging/PII policy) without explicit human review.` -- `src/prompts/daily/known-issues-agent.md`: `(e.g., shared signing/publishing, key handling, moderation, magnets/torrents,` -- `src/prompts/daily/known-issues-agent.md`: `- magnets/webtorrent behavior` -- `src/prompts/daily/perf-agent.md`: `- **P2**: User-initiated heavy features (WebTorrent playback) — lazy-init/deprioritize until P0/P1 resolved.` -- `src/prompts/daily/perf-agent.md`: `- **Lazy init**: WebTorrent and socket-heavy clients created only on explicit user action.` -- `src/prompts/daily/perf-agent.md`: `- `new WebTorrent|WebTorrent|torrent|magnet|torrentHash|magnetValidators`` -- `src/prompts/daily/perf-agent.md`: `- Ripgrep: `rg -n --hidden --ignore-file .gitignore "requestAnimationFrame|new Worker|new WebTorrent|integrationClient.pool" js`` -- `src/prompts/daily/perf-agent.md`: `- Active WebTorrent client count at page load.` - -## Other Findings -- `src/test_logs/TEST_LOG_2026-02-16.md`: `2. **Static Analysis**: Verify `dashboard/index.html` contains `document.addEventListener('visibilitychange', ...)` handler.` -- `src/decisions/DECISIONS_2026-02-16.md`: `- UI might be slightly stale when tab becomes visible, so we add a `visibilitychange` listener to force an immediate update.` -- `src/decisions/DECISIONS_2026-02-16.md`: `- Monitor if users complain about stale data (should be mitigated by `visibilitychange`).` -- `src/lock-utils.mjs`: `return Promise.race([` -- `src/prompts/weekly/race-condition-agent.md`: `- Clients or torrents accessed after destroy` -- `src/prompts/daily/const-refactor-agent.md`: `{"file": "src/relayManager.js", "line": 24, "context":"FAST_RELAY_TIMEOUT_MS"},` -- `src/prompts/daily/const-refactor-agent.md`: `- Example: if `FAST_RELAY_TIMEOUT_MS` exists in `src/relayManager.js` or `relayConstants.js`, import it.` -- `src/prompts/daily/const-refactor-agent.md`: `- Reason: relayManager & integration-related code; existing relay constants live here.` -- `src/prompts/daily/const-refactor-agent.md`: `- Discover `5000` appears in `src/relayManager.js`, `js/integration/watchHistory.js`, `js/integration/relayClient.js`.` -- `src/prompts/daily/perf-agent.md`: `1. Finds expensive background patterns (main-thread loops, unbounded concurrency, eager socket/torrent creation).` -- `src/prompts/daily/perf-agent.md`: `- `reports/performance/INITIAL_BASELINE.md` — baseline metrics (login time, decrypt queue size, relay latencies, webtorrent count).` -- `src/prompts/daily/perf-agent.md`: `- `integrationClient\.pool|publishEventToRelays|pool\.list|queueSignEvent|relayManager|authService|hydrateFromStorage`` -- `src/prompts/daily/perf-agent.md`: `- Open suspicious files for review: `sed -n '1,240p' src/relayManager.js`` -- `src/prompts/daily/deps-security-agent.md`: `Also read `AGENTS.md` and `KNOWN_ISSUES.md` for project-specific caveats (e.g., the repo uses `integration-tools`, `webtorrent`, `Playwright`, `Tailwind`). Tag these libraries for special handling.` +### 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 -- Total Hits: 63 -- Workers/Critical: 3 +- Login Time: N/A (requires instrumentation) +- Decrypt Queue: N/A + +## Blockers +- No /content directory found for docs audit. + +## PRs +None. diff --git a/src/context/CONTEXT_2026-02-23T21-25-49Z.md b/src/context/CONTEXT_2026-02-23T21-25-49Z.md new file mode 100644 index 0000000..ed4b799 --- /dev/null +++ b/src/context/CONTEXT_2026-02-23T21-25-49Z.md @@ -0,0 +1,19 @@ +--- +agent: perf-agent +cadence: daily +run-start: 2026-02-23T21:25:49Z +--- + +# Context + +Executed prompt: src/prompts/daily/perf-agent.md + +## Goal +Daily scan for performance regressions. + +## Scope +- Scan src/ for CPU/Network intensive patterns. +- Generate report. + +## Constraints +- Non-invasive scan. diff --git a/src/decisions/DECISIONS_2026-02-23T21-25-49Z.md b/src/decisions/DECISIONS_2026-02-23T21-25-49Z.md new file mode 100644 index 0000000..99de3b7 --- /dev/null +++ b/src/decisions/DECISIONS_2026-02-23T21-25-49Z.md @@ -0,0 +1,15 @@ +--- +agent: perf-agent +cadence: daily +run-start: 2026-02-23T21:25:49Z +--- + +# Decisions + +Executed prompt: src/prompts/daily/perf-agent.md + +## Decision: Skip Docs Audit +Rationale: The /content directory does not exist, so the docs audit is not applicable. + +## Decision: No Fixes Applied +Rationale: The scan found hits, but no critical P0 issues were identified requiring immediate intervention without deeper analysis. diff --git a/src/test_logs/TEST_LOG_2026-02-23T21-25-49Z.md b/src/test_logs/TEST_LOG_2026-02-23T21-25-49Z.md new file mode 100644 index 0000000..be52ebd --- /dev/null +++ b/src/test_logs/TEST_LOG_2026-02-23T21-25-49Z.md @@ -0,0 +1,13 @@ +--- +agent: perf-agent +cadence: daily +run-start: 2026-02-23T21:25:49Z +platform: linux +--- + +# Test Log - 2026-02-23T21:25:49Z + +Executed prompt: src/prompts/daily/perf-agent.md + +**Command:** grep -n -r -E "setInterval|setTimeout|requestAnimationFrame|requestIdleCallback|Promise.all|Promise.allSettled|Promise.any|Promise.race|new Worker|postMessage|new WebTorrent|document.hidden|visibilitychange" src/ || true +**Result:** Found 42 hits. See reports/performance/hits-2026-02-23.json for details. diff --git a/src/todo/TODO_2026-02-23T21-25-49Z.md b/src/todo/TODO_2026-02-23T21-25-49Z.md new file mode 100644 index 0000000..8faf793 --- /dev/null +++ b/src/todo/TODO_2026-02-23T21-25-49Z.md @@ -0,0 +1,13 @@ +--- +agent: perf-agent +cadence: daily +run-start: 2026-02-23T21:25:49Z +--- + +# TODO + +Executed prompt: src/prompts/daily/perf-agent.md + +## Completed Tasks +- [x] Run scan +- [x] Generate report diff --git a/task-logs/daily/2026-02-23T21-25-49Z__perf-agent__completed.md b/task-logs/daily/2026-02-23T21-25-49Z__perf-agent__completed.md new file mode 100644 index 0000000..11bc276 --- /dev/null +++ b/task-logs/daily/2026-02-23T21-25-49Z__perf-agent__completed.md @@ -0,0 +1,30 @@ +--- +agent: perf-agent +cadence: daily +run-start: 2026-02-23T21:25:49Z +platform: linux +--- + +# Task Log - 2026-02-23T21:25:49Z + +## Status +Completed + +## Agent +perf-agent + +## Prompt +src/prompts/daily/perf-agent.md + +## Learnings +# 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.