Agent: programmer (
programmer)
Confidence: 65%
Cost: $1.1236
Duration: 4m 13s
Task ID:471ff220-b437-4450-9491-bc5648a02241
★ Insight ─────────────────────────────────────
分析中的三個關鍵發現:
- CTO 遺漏了已有 mitigation:
audit-chain.ts的initAuditChain()happy path 其實只讀最後一行就夠了,問題在於它仍然全量讀檔案來做 split;claude-code.ts有 streaming mode 分支,stdout +=幾乎不是主要路徑 - 真正的高 ROI 改動是建
tailReadutility:10 個呼叫點都在做同樣的「全量讀 JSONL → split → 取最後 N 行」模式,一個共用 utility 就能一次解決 - chat-memory cache “無 TTL” 的描述不精確:它有 TTL 機制(5 分鐘
isCacheFresh()),只是過期條目不會被主動淘汰——但在典型部署中只有幾十個 chatId,記憶體影響可忽略─────────────────────────────────────────────────
分析報告已完成
報告已寫入 soul/agent-reports/programmer/2026-02-28-perf-bottleneck-analysis.md
核心發現摘要:
| 瓶頸 | 判定 | 難度 | 建議 |
|---|---|---|---|
| P0-1 explorer.ts readFileSync | ✅ 真實 | 1/5 | 立即修,sync→async 改 ~10 行 |
| P0-2 search-index 全量重索引 | ⚠️ 高估 | 2/5 | 真正 hotspot 是 recalcAvg() O(totalDocs) 被呼叫 N 次 |
| P1-3 agent-tuner 全量讀 history | ✅ 真實 | 2/5 | 6 個檔案同樣模式,建 tailRead utility 一次解決 |
| P1-4 audit-chain 啟動全掃 | ⚠️ happy path 只需最後 1 行 | 2/5 | tailRead 1 行即可 |
| P1-5 chat-memory cache 無淘汰 | ⚠️ 有 TTL,只是不主動刪 | 1/5 | 建議不修(幾十 entry,幾 KB) |
| P1-6 search-index Map 只增 | ⚠️ 有 remove 機制 | 2/5 | 加 narrative cap 即可 |
| P2-7 verifyChain 全量 SHA | ✅ 真實 | 3/5 | 暫不修(60 分鐘一次,20-50ms) |
| P2-8 narrative 全量讀再 slice | ✅ 真實 | 1/5 | tailRead 附帶解決 |
| P2-9 stdout += 拼接 | ⚠️ 非主要路徑 | 1/5 | 建議不修(streaming mode 不走這路) |
最大發現:tailReadLines() utility
10 個呼叫點(跨 6 個模組)都在做相同的「全量讀 JSONL → split → 取尾部」模式。建立 src/core/tail-read.ts 是最高 ROI 的單一改動。