報告摘要

Agent: programmer (programmer)
Confidence: 65%
Cost: $0.9163
Duration: 4m 12s
Task ID: 400fe601-03e2-4f46-af01-b8e82f680bae


★ Insight ─────────────────────────────────────
1. 中文 NLP 的最小可行方案:我們的 pattern-detector 用了 bigram sliding window 來處理中文(因為中文沒有空格分隔詞)。這是一個常見的取捨——不引入 jieba 等重型斷詞庫,用 n-gram 近似。但 sliding window(stride=1)的致命問題是產生跨詞邊界碎片(如「始實」)。改成 non-overlapping stride=2 就能消除大部分問題,成本為零。

2. 自製 YAML Parser 的風險:為了避免引入 js-yaml 依賴,我們手寫了一個 ~60 行的 YAML subset parser。它目前能用,但每個 edge case 都是潛在 bug。這是「dependency avoidance」和「correctness」之間的典型取捨。對我們的場景(frontmatter 格式由自己控制),風險可控,但應該在文件中明確記錄支援的語法子集。

3. Signal File 的熱載入模式:用 .rebuild sentinel file 做進程間通信(MCP tool 寫入 → skill-loader 檢測)是一個優雅的低成本方案,避免了 IPC、WebSocket 等複雜通信。缺點是需要檔案系統輪詢(每次 matchSkillsstat() 一次),但因為 matchSkills 本來就是 I/O 操作,額外的 stat() 開銷可忽略。
─────────────────────────────────────────────────


報告摘要

技術報告已完成並存檔至 soul/agent-reports/programmer/skill-system-code-review-2026-02-26.md

核心發現:

6 個問題,按嚴重度排序:

# 嚴重度 問題 位置
BUG-1 HIGH 中文 bigram 斷詞產出垃圾 skill(auto-開始-始實-實作 pattern-detector.ts:80-92
BUG-2 MEDIUM 自製 YAML parser 的邊界陷阱(浮點數、nested object、key 中的 - skill-loader.ts:61-125
BUG-3 LOW-MED .rebuild signal 有 race condition(double rebuild) skill-loader.ts:294-304
BUG-4 LOW buildSkillIndex 串行讀取全文(只需 frontmatter) skill-loader.ts:130-174
BUG-5 LOW Weekly count 重置丟失中間數據 skill-usage-tracker.ts:65-70
BUG-6 DESIGN weaveSkills 硬編碼只注入 1 個 skill context-weaver.ts:461

與文章觀點對照:

  • 我們做對了:延遲加載、frontmatter 設計、signal 熱載入、使用追蹤、自動學習
  • 文章有但我們沒有:目錄語義化(低優先)、技能繼承(目前不需要)
  • 我們有但文章沒提:自動學習系統(但品質需修)

最優先修復:

  1. 修中文斷詞 — 改 stride=2 或引入基本詞典,並清理 2 個垃圾 skill
  2. 提高自動學習閾值 — MIN_FREQUENCY 3→5,MIN_CONFIDENCE 0.3→0.5
  3. keyword 匹配改 word boundary — 避免 "git" 匹配到 "legitimate"