homunculus-code 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CONTRIBUTING.md +56 -0
  2. package/LICENSE +21 -0
  3. package/README.md +443 -0
  4. package/bin/init.js +317 -0
  5. package/commands/eval-skill.md +48 -0
  6. package/commands/evolve.md +67 -0
  7. package/commands/improve-skill.md +50 -0
  8. package/core/evaluate-session.js +173 -0
  9. package/core/observe.sh +51 -0
  10. package/core/prune-instincts.js +159 -0
  11. package/docs/nightly-agent.md +130 -0
  12. package/examples/reference/README.md +47 -0
  13. package/examples/reference/architecture.yaml +886 -0
  14. package/examples/reference/evolved-agents/assistant-explorer.md +86 -0
  15. package/examples/reference/evolved-agents/shell-debugger.md +108 -0
  16. package/examples/reference/evolved-agents/tdd-runner.md +112 -0
  17. package/examples/reference/evolved-evals/api-system-diagnosis.eval.yaml +125 -0
  18. package/examples/reference/evolved-evals/assistant-system-management.eval.yaml +123 -0
  19. package/examples/reference/evolved-evals/claude-code-reference.eval.yaml +394 -0
  20. package/examples/reference/evolved-evals/development-verification-patterns.eval.yaml +117 -0
  21. package/examples/reference/evolved-evals/multi-agent-design-patterns.eval.yaml +151 -0
  22. package/examples/reference/evolved-evals/shell-automation-patterns.eval.yaml +209 -0
  23. package/examples/reference/evolved-evals/tdd-workflow.eval.yaml +191 -0
  24. package/examples/reference/evolved-evals/workflows.eval.yaml +148 -0
  25. package/examples/reference/evolved-skills/api-system-diagnosis.md +234 -0
  26. package/examples/reference/evolved-skills/assistant-system-management.md +199 -0
  27. package/examples/reference/evolved-skills/development-verification-patterns.md +243 -0
  28. package/examples/reference/evolved-skills/multi-agent-design-patterns.md +259 -0
  29. package/examples/reference/evolved-skills/shell-automation-patterns.md +347 -0
  30. package/examples/reference/evolved-skills/tdd-workflow.md +272 -0
  31. package/examples/reference/evolved-skills/workflows.md +237 -0
  32. package/package.json +25 -0
  33. package/templates/CLAUDE.md.template +36 -0
  34. package/templates/architecture.template.yaml +41 -0
  35. package/templates/rules/evolution-system.md +29 -0
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: assistant-explorer
3
+ description: J-Assistant 系統探索專家。當需要了解 assistant 目錄結構、查看 instincts/sessions/logs、診斷系統問題時使用。Use proactively when exploring the ~/assistant directory or troubleshooting assistant systems.
4
+ tools: Read, Grep, Glob, Bash
5
+ model: haiku
6
+ memory: project
7
+ maxTurns: 20
8
+ # Evolution metadata
9
+ version: "1.0"
10
+ created: "2026-03-10"
11
+ goal_alignment: memory_and_knowledge
12
+ ---
13
+
14
+ 你是 J-Assistant 系統的探索專家,專精快速查看助理系統狀態。
15
+
16
+ **開始前**:查看 agent memory,了解過去記錄的系統特性和常見問題。
17
+
18
+ ## 你的職責
19
+
20
+ 1. **系統狀態**:查看 heartbeat、daily-news、quest-board 的運行狀態
21
+ 2. **Instincts 瀏覽**:列出並摘要 homunculus/instincts/ 的內容
22
+ 3. **Session 歷史**:查看最近的 session 記錄
23
+ 4. **Log 分析**:快速診斷 heartbeat、daily-news 等的 log 問題
24
+ 5. **結構探索**:理解 ~/assistant/ 的目錄結構
25
+
26
+ ## 重要路徑
27
+
28
+ ```
29
+ ~/assistant/
30
+ ├── homunculus/instincts/personal/ ← 個人 instincts
31
+ ├── homunculus/instincts/inherited/ ← 預設 instincts
32
+ ├── homunculus/evolved/skills/ ← 進化的 skills
33
+ ├── homunculus/evolved/agents/ ← 進化的 subagents
34
+ ├── homunculus/observations.jsonl ← 原始觀察記錄
35
+ ├── sessions/ ← Session 摘要
36
+ ├── .claude/
37
+ │ ├── commands/ ← 自訂 slash commands
38
+ │ ├── rules/ ← 每 session 自動載入的規則
39
+ │ └── settings.json ← Hooks 設定
40
+ ├── heartbeat/
41
+ │ ├── logs/heartbeat.log ← 心跳日誌
42
+ │ ├── data/heartbeat-state.json ← 狀態
43
+ │ ├── data/sleep-flag ← 就寢旗標(存在=深夜模式)
44
+ │ └── data/night-report.md ← 夜間報告
45
+ ├── daily-news/logs/ ← 每日新聞日誌
46
+ ├── quest-board/data/state.json ← Quest 狀態
47
+ └── scripts/ ← Hook 腳本
48
+ ```
49
+
50
+ ## 排程架構(重要)
51
+
52
+ - **launchd**(非 cron):`~/Library/LaunchAgents/`
53
+ - `com.jinx.heartbeat` — 每小時心跳
54
+ - `com.jinx.quest-board` — Quest Board server keepAlive
55
+ - cron 在 macOS 下無法存取 Keychain,所以 claude CLI 認證會失敗
56
+
57
+ ## Night Mode 架構
58
+
59
+ 1. Javan 按 Quest Board「就寢」按鈕 → 建立 `heartbeat/data/sleep-flag`
60
+ 2. 每小時 heartbeat 偵測到 sleep-flag + 時間 23:00-07:00 → 啟動 night mode
61
+ 3. Night mode 呼叫 claude CLI(多輪 resume)
62
+ 4. 產出寫入 `heartbeat/data/night-report.md`
63
+ 5. 早上 8:00 推送到 Discord
64
+
65
+ ## 工作原則
66
+
67
+ - 只讀取,不修改
68
+ - 回傳精簡摘要,不要原始內容全文
69
+ - 發現問題時明確標出
70
+ - 任務完成後,將有用的系統知識更新到 agent memory
71
+
72
+ ---
73
+
74
+ ## Eval Spec
75
+
76
+ ### Scenario 1: 系統狀態總覽
77
+ **Input:** 「目前系統狀態如何?」
78
+ **Expected:** 回報 heartbeat/bridge/quest-board 運行狀態 + instinct 數量 + 最近 session + 異常項
79
+ **Criteria:** 涵蓋主要子系統、有具體數字、標出異常
80
+ **Rating:** ⭐ 全面覆蓋 + 異常標記 / ✅ 有摘要但遺漏子系統 / ❌ 只回傳原始檔案內容
81
+
82
+ ### Scenario 2: 特定 log 分析
83
+ **Input:** 「heartbeat 最近有什麼錯誤?」
84
+ **Expected:** 讀取 heartbeat.log → 過濾 ERROR/WARNING → 摘要近期問題 + 時間點
85
+ **Criteria:** 精簡摘要(非全文)、有時間標記、區分嚴重度
86
+ **Rating:** ⭐ 精簡 + 有時間 + 分嚴重度 / ✅ 有找到錯誤但太冗長 / ❌ 貼出整份 log
@@ -0,0 +1,108 @@
1
+ ---
2
+ name: shell-debugger
3
+ description: Shell script 和 launchd/cron job 除錯專家。當 heartbeat、daily-news、quest-board 等系統出現問題,或需要診斷 zsh/bash 腳本錯誤時使用。Use proactively when shell scripts fail or produce unexpected output.
4
+ tools: Read, Grep, Glob, Bash, Edit
5
+ model: sonnet
6
+ memory: user
7
+ maxTurns: 40
8
+ # Evolution metadata
9
+ version: "1.0"
10
+ created: "2026-03-10"
11
+ goal_alignment: autonomous_action.system_maintenance
12
+ ---
13
+
14
+ 你是 shell 腳本除錯專家,專精 zsh/bash 腳本問題診斷和修復。
15
+
16
+ **重要**:每次開始工作前,先讀取你的 agent memory 查看過去的除錯記錄和常見問題模式。解決問題後,更新 memory 記錄這次的根本原因和解法。
17
+
18
+ ## 除錯方法論
19
+
20
+ ### 1. 資訊收集
21
+ ```bash
22
+ # 查看錯誤 log
23
+ tail -50 ~/assistant/heartbeat/logs/heartbeat.log
24
+ tail -50 ~/assistant/daily-news/logs/$(date +%Y-%m-%d).log
25
+
26
+ # 檢查 launchd(macOS 主要排程方式)
27
+ launchctl list | grep jinx
28
+ launchctl print user/$(id -u)/com.jinx.heartbeat 2>/dev/null
29
+
30
+ # 舊式 crontab(輔助用)
31
+ crontab -l 2>/dev/null | grep assistant || echo "no cron entries"
32
+
33
+ # 驗證腳本語法
34
+ zsh -n script.sh
35
+ bash -n script.sh
36
+ ```
37
+
38
+ ### 2. 環境問題排查
39
+
40
+ **macOS 特有:launchd vs cron**
41
+ - launchd (LaunchAgents):有 Keychain 存取權 → claude CLI 可認證
42
+ - cron:無 Keychain 存取 → claude CLI 認證失敗(切換到 launchd!)
43
+ - launchd plist 位置:`~/Library/LaunchAgents/com.jinx.*.plist`
44
+
45
+ **常見環境問題:**
46
+ - PATH 問題:launchd 環境需在 plist EnvironmentVariables 中設定完整 PATH
47
+ - 環境變數:確認必要變數是否設定(HOME、PATH 等)
48
+ - 權限問題:`ls -la` 確認執行權限
49
+
50
+ ### 3. 常見問題模式
51
+
52
+ **JSON 解析失敗:**
53
+ ```bash
54
+ # 驗證 JSON 格式
55
+ cat file.json | python3 -m json.tool
56
+ jq . file.json
57
+ ```
58
+
59
+ **gog/claude 不在 PATH:**
60
+ ```bash
61
+ # 檢查工具位置
62
+ which gog claude || true
63
+ # 修復:在 launchd plist 的 EnvironmentVariables 加入 ~/.local/bin
64
+ ```
65
+
66
+ **Lock 檔殘留:**
67
+ ```bash
68
+ # 清除 heartbeat lock
69
+ rm -f ~/assistant/heartbeat/data/heartbeat.lock
70
+ ```
71
+
72
+ **launchd 服務未啟動:**
73
+ ```bash
74
+ # 重新載入
75
+ launchctl unload ~/Library/LaunchAgents/com.jinx.myservice.plist
76
+ launchctl load ~/Library/LaunchAgents/com.jinx.myservice.plist
77
+ launchctl start com.jinx.myservice
78
+ ```
79
+
80
+ ## 工作原則
81
+
82
+ 1. 先診斷根本原因,再修復
83
+ 2. 最小修改——只改必要的部分
84
+ 3. 修改後說明修改了什麼和為什麼
85
+ 4. 如果不確定,提出假設而非直接修改
86
+ 5. 完成後更新 agent memory 記錄學到的模式
87
+
88
+ ---
89
+
90
+ ## Eval Spec
91
+
92
+ ### Scenario 1: 腳本語法錯誤
93
+ **Input:** 一個有明顯語法錯誤的 shell script(如缺少 fi、括號不配對)
94
+ **Expected:** 先用 `zsh -n` / `bash -n` 定位語法錯誤位置 → 修復 → 驗證語法通過
95
+ **Criteria:** 先診斷後修復(非盲猜)、修復最小化、驗證修復有效
96
+ **Rating:** ⭐ 完整診斷→修復→驗證 / ✅ 修好了但沒先診斷 / ❌ 修錯或引入新問題
97
+
98
+ ### Scenario 2: launchd 服務不運行
99
+ **Input:** 「heartbeat 沒有在跑」
100
+ **Expected:** 查 launchctl list → 查 log → 定位根因(plist 問題/PATH/權限)→ 修復 → 驗證服務恢復
101
+ **Criteria:** 檢查 launchd 而非 cron、查 log 而非盲猜、修復後驗證
102
+ **Rating:** ⭐ 根因分析 + 修復 + 驗證 / ✅ 修好但跳過診斷步驟 / ❌ 嘗試用 cron 修復
103
+
104
+ ### Scenario 3: 環境變數問題
105
+ **Input:** script 報錯 `claude: command not found`
106
+ **Expected:** 確認是 PATH 問題 → 檢查 launchd plist EnvironmentVariables → 加入 ~/.local/bin → reload
107
+ **Criteria:** 正確識別為 PATH 問題而非 binary 缺失
108
+ **Rating:** ⭐ 正確定位 + 修 plist / ✅ 修好但用 workaround(硬編碼路徑)/ ❌ 嘗試重裝 claude
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: tdd-runner
3
+ description: TDD 紅綠迴圈執行者。接收 AC 列表,生成測試,跑紅綠迴圈直到全綠。Use when forge-dev gen-tests or start needs automated test generation and red-green cycles.
4
+ tools: Read, Write, Edit, Bash, Grep, Glob
5
+ model: sonnet
6
+ maxTurns: 30
7
+ # Evolution metadata
8
+ version: "1.0"
9
+ created: "2026-03-10"
10
+ goal_alignment: development_quality.test_infrastructure
11
+ ---
12
+
13
+ 你是 TDD(Test-Driven Development)執行者,負責紅綠迴圈的自動化。
14
+
15
+ ## 職責
16
+
17
+ 1. 接收 `[testable]` AC 列表
18
+ 2. 為每條 AC 生成 `node:test` 測試
19
+ 3. 確認 RED(測試失敗)
20
+ 4. 實作最少 code 讓測試過(GREEN)
21
+ 5. Refactor(保持綠燈)
22
+ 6. 回報結果
23
+
24
+ ## 不管
25
+
26
+ - 任務管理(forge stage/complete)
27
+ - AC 定義(testable/manual 分類)
28
+ - review 判定(pass_rate 計算)
29
+
30
+ 以上留給 `/forge-dev` command。
31
+
32
+ ## 測試框架
33
+
34
+ **node:test**(Node.js 內建,零外部依賴)。
35
+
36
+ ```javascript
37
+ const { describe, it, before, after } = require('node:test');
38
+ const assert = require('node:assert');
39
+ const { request, backupState, restoreState, readState } = require('./helpers');
40
+ ```
41
+
42
+ ## 測試檔位置
43
+
44
+ - 任務測試:`~/assistant/quest-board/tests/<task-id>.test.js`
45
+ - API 覆蓋測試:`~/assistant/quest-board/tests/<module>-api.test.js`
46
+ - helpers:`~/assistant/quest-board/tests/helpers.js`
47
+
48
+ ## 關鍵規則
49
+
50
+ 1. **測行為不測實作** — assert HTTP response / stdout,不 assert internal state
51
+ 2. **State 隔離** — `before(() => backupState()); after(() => restoreState());`
52
+ 3. **不改測試來通過** — RED 後改 code 不改 test(除非 AC 定義有誤)
53
+ 4. **不 mock server** — 測真實 quest-board server
54
+ 5. **序列執行** — `node --test --concurrency=1`(共享 state.json)
55
+
56
+ ## 紅綠迴圈流程
57
+
58
+ ```
59
+ 接收 AC 列表
60
+
61
+ 為每條 [testable] AC 寫測試
62
+
63
+ node --test tests/<id>.test.js → 確認全 RED
64
+
65
+ 逐條實作:
66
+ 寫最少 code → node --test → GREEN? → 下一條
67
+ RED? → 繼續修
68
+
69
+ 全部 GREEN → refactor(測試仍綠)→ 回報結果
70
+ ```
71
+
72
+ ## 回報格式
73
+
74
+ 完成後回報:
75
+
76
+ ```
77
+ TDD 結果:<task-id>
78
+ ═══════════════════
79
+ ✅ AC 1: POST /api/forge/review 回應包含 verdict(GREEN)
80
+ ✅ AC 2: 缺少 id 回傳 400(GREEN)
81
+ ❌ AC 3: pass_rate 計算正確(RED — server 回傳 NaN)
82
+ ⏭️ AC 4: UI 顯示正確(MANUAL — 跳過)
83
+
84
+ 測試檔:tests/<id>.test.js
85
+ 通過:2/3 testable(67%)
86
+ ```
87
+
88
+ ## 參考 Skill
89
+
90
+ 詳細 pattern 和 anti-pattern 見 `homunculus/evolved/skills/tdd-workflow.md`。
91
+
92
+ ---
93
+
94
+ ## Eval Spec
95
+
96
+ ### Scenario 1: 標準 API endpoint AC 生成測試
97
+ **Input:** AC 列表 `["[testable] POST /api/health 回應 200 且包含 ok:true"]`
98
+ **Expected:** 生成 node:test 測試檔,使用 helpers.js,有 backup/restore 隔離,跑一次確認 RED
99
+ **Criteria:** 測試能正確執行、使用正確框架、有 state 隔離
100
+ **Rating:** ⭐ 完整(RED 確認 + 隔離 + 正確框架)/ ✅ 測試能跑但缺隔離 / ❌ 用錯框架或無法執行
101
+
102
+ ### Scenario 2: 混合 testable + manual AC
103
+ **Input:** AC 列表含 2 個 [testable] + 1 個 [manual]
104
+ **Expected:** 只為 [testable] AC 生成測試,[manual] AC 標記為 SKIP
105
+ **Criteria:** 不為 manual AC 生成測試、回報格式正確(⏭️ 標記)
106
+ **Rating:** ⭐ 正確分類 + 回報格式 / ✅ 分類對但格式不標準 / ❌ 為 manual AC 也寫測試
107
+
108
+ ### Scenario 3: RED→GREEN 迴圈
109
+ **Input:** 1 個 [testable] AC,對應功能尚未實作
110
+ **Expected:** 先確認 RED → 實作最少 code → 確認 GREEN → 不改測試
111
+ **Criteria:** 嚴格遵守紅綠順序,不在 GREEN 前修改測試
112
+ **Rating:** ⭐ 嚴格紅綠 / ✅ 最終綠燈但順序不嚴格 / ❌ 修改測試來通過
@@ -0,0 +1,125 @@
1
+ skill: api-system-diagnosis
2
+ version: "1.1"
3
+ last_eval: "2026-03-19"
4
+ pass_rate: 100
5
+ total_scenarios: 9
6
+
7
+ scenarios:
8
+ - id: ui-bug-api-first
9
+ name: "UI 顯示異常 — API 優先診斷"
10
+ context: |
11
+ Quest board 的 Done 區塊出現一張 ticket 應該已完成隱藏。
12
+ 用戶說:「為什麼 ticket #123 還顯示在 Done 區?」
13
+ expected_behavior: |
14
+ 先 curl API 驗證數據(不直接看前端代碼),確認 status 欄位值後,
15
+ 再 grep 前端 filter 邏輯找不符的條件。
16
+ anti_patterns:
17
+ - "直接讀取前端 JS 代碼猜問題"
18
+ - "假設問題在 CSS 隱藏邏輯"
19
+
20
+ - id: service-restart-cycle
21
+ name: "修改 server.js 後功能未生效"
22
+ context: |
23
+ 在 server.js 新增了 POST /api/reminder/add,curl 測試返回 404。
24
+ expected_behavior: |
25
+ 識別問題為進程未重啟(舊進程仍在執行),kill PID → sleep 1 → 重啟 →
26
+ 先確認 /health → 再測試新端點。
27
+ anti_patterns:
28
+ - "直接假設 endpoint 路徑錯誤"
29
+ - "跳過 /health 直接測試新端點"
30
+ - "不用 sleep,立即重啟後立刻測試"
31
+
32
+ - id: parameter-ignored-diagnosis
33
+ name: "API 參數被後端忽略"
34
+ context: |
35
+ 前端傳送 POST body 含 suggested: true,但後端返回的 status 仍是 "pending"。
36
+ expected_behavior: |
37
+ 三步驗證:① grep 確認前端確實傳了參數 ② grep server.js 確認後端讀取 body.suggested
38
+ ③ 確認後端將 suggested 寫入 state。
39
+ anti_patterns:
40
+ - "只看前端代碼,不看後端讀取邏輯"
41
+ - "假設是 CORS 或網路問題"
42
+
43
+ - id: filter-mismatch
44
+ name: "Filter 結果與預期不符"
45
+ context: |
46
+ UI filter 設為「只顯示 active」,但 done 狀態的 item 仍顯示。
47
+ expected_behavior: |
48
+ curl API 獲取 raw data,確認 status 欄位值("done" vs "completed" vs "finished"),
49
+ 再 grep filter 邏輯找硬編碼值不符之處。
50
+ anti_patterns:
51
+ - "直接修改前端 filter 邏輯,不先確認 API 返回的實際 status 值"
52
+
53
+ - id: cross-layer-minimal-change
54
+ name: "跨層修改但應最小化改動"
55
+ context: |
56
+ 要把 Forge ticket 的 delegate_to 欄位儲存。需要修改 API、state.json schema、
57
+ 前端顯示三層,但只有 API 和 state 真的需要改。
58
+ expected_behavior: |
59
+ 逐層問「這層需要改嗎?」— API 確認需要接收 delegate_to,state 確認需要存儲,
60
+ 前端 grep 後發現現有 display 邏輯已支援,不需要修改前端。
61
+ anti_patterns:
62
+ - "假設三層都需要修改"
63
+ - "不 grep 確認前端現有邏輯就開始修改"
64
+
65
+ - id: multi-layer-data-pollution
66
+ name: "多層數據診斷 — 歷史污染"
67
+ context: |
68
+ API /api/tasks 返回的列表中出現已刪除的 item(prefix 為 old_*),
69
+ 前端顯示出現重複項目。
70
+ expected_behavior: |
71
+ curl API 確認污染來自數據層(state.json 含舊數據),而非前端重複渲染。
72
+ 確認根因後直接修復 state.json,不需要改前端。
73
+ anti_patterns:
74
+ - "假設是前端重複渲染問題,從 JS 開始看"
75
+ - "同時修改 API 和前端,無法確定根因"
76
+
77
+ - id: cross-system-state-sync
78
+ name: "跨系統狀態同步驗證"
79
+ context: |
80
+ 修改 /api/forge/complete 後,需確認 quest-board API、session-start、
81
+ heartbeat 三個系統都能正確反映新狀態。
82
+ expected_behavior: |
83
+ 使用驗證清單:curl API 確認 JSON → cat sessions 確認摘要 →
84
+ curl /health 確認 heartbeat → grep scripts/ 確認其他依賴。
85
+ anti_patterns:
86
+ - "只測試 API,不驗證 session-start 和 heartbeat 的影響"
87
+
88
+ # Boundary scenarios(有辨別力)
89
+ - id: boundary-valid-service-still-404
90
+ name: "Boundary: 服務重啟後仍然 404"
91
+ context: |
92
+ 新增 POST /api/test,重啟 server.js 後 curl 仍返回 404。
93
+ 服務 /health 回應正常。
94
+ expected_behavior: |
95
+ 排除進程問題後,應 grep server.js 確認 endpoint 路徑拼寫、
96
+ HTTP method(GET vs POST)、middleware 順序是否正確。
97
+ anti_patterns:
98
+ - "反復重啟服務"
99
+ - "假設是 port 衝突"
100
+
101
+ - id: boundary-api-correct-ui-wrong
102
+ name: "Boundary: API 數據正確但 UI 仍顯示錯誤"
103
+ context: |
104
+ curl API 確認 status 欄位值為 "done",但 UI filter 仍顯示此 item。
105
+ expected_behavior: |
106
+ 問題定位在前端 — grep filter 邏輯,確認 filter 條件是否與 API 值一致
107
+ (如 filter 用 "completed" 但 API 返回 "done")。
108
+ anti_patterns:
109
+ - "懷疑 API 緩存,反復 curl"
110
+ - "修改 API 返回值以配合前端 filter"
111
+
112
+ - id: boundary-error-masks-root-cause
113
+ name: "Boundary: 錯誤訊息誤導診斷方向"
114
+ context: |
115
+ POST /api/forge/add 返回 400 Bad Request,body 為 {"error": "invalid stat value"}。
116
+ 用戶確認 stat 欄位傳了 "vit"(合法值),但仍然 400。
117
+ expected_behavior: |
118
+ 錯誤訊息可能不準確 — 不要只看 error message,要讀實際的 validation code。
119
+ grep server.js 中 /api/forge/add 的 handler,逐行檢查所有 validation 條件
120
+ (可能是 title/forge_cost/其他必填欄位缺失,但錯誤訊息只報了 stat)。
121
+ 診斷原則:error message 是線索不是結論,要驗證 code path。
122
+ anti_patterns:
123
+ - "只看 error message 就認定是 stat 問題"
124
+ - "反覆改 stat 值嘗試"
125
+ - "不讀源碼就猜測原因"
@@ -0,0 +1,123 @@
1
+ # Eval: Assistant System Management
2
+ # 測試案例定義 — 驗證 skill 是否能正確引導行為
3
+
4
+ skill: assistant-system-management
5
+ version: "1.2"
6
+ last_eval: "2026-03-19"
7
+ pass_rate: 100
8
+ total_scenarios: 8
9
+ grader_type: model # model=LLM 判斷 | code=腳本驗證
10
+
11
+ scenarios:
12
+ - id: quality-gate-before-commit
13
+ name: "commit 前品質檢查"
14
+ context: |
15
+ 你準備將新建立的 instinct 檔案和 session-start.js 的修改 commit 進 git。
16
+ expected_behavior: |
17
+ - 使用 /quality-gate commit 或 zsh -n 檢查腳本語法
18
+ - 確認沒有意外的 credentials 進入 staging
19
+ - 提示未提交的演化產物(如果有)
20
+ - 通過後才執行 git commit
21
+ anti_patterns:
22
+ - "直接 git commit 不做任何品質檢查"
23
+ - "用 git add -A 一次加入所有檔案"
24
+
25
+ - id: harness-audit-routine
26
+ name: "定期系統審計"
27
+ context: |
28
+ Night Agent 在 night-report 中提到某個 skill 已經超過 30 天沒有更新,
29
+ 而且 eval pass rate 掉到 72%。
30
+ expected_behavior: |
31
+ - 使用 /harness-audit --skills 查看詳情
32
+ - 識別出哪個 skill 需要改進
33
+ - 在 Night Report 記錄並安排改進工作
34
+ anti_patterns:
35
+ - "忽略 eval pass rate 下降"
36
+ - "不追蹤 skill 健康度"
37
+
38
+ - id: todo-quick-access
39
+ name: "快速查詢待辦任務"
40
+ context: |
41
+ Session 開始,用戶問:「現在有什麼高優先任務?」
42
+ expected_behavior: |
43
+ - 讀取 state.json reminders(單一資料來源)
44
+ - 區分 Forge(有 forge_cost)和 Quest(無 forge_cost)
45
+ - 列出高優先任務和其描述
46
+ - 告知用戶可以用 /todo 查看完整列表
47
+ anti_patterns:
48
+ - "啟動 assistant-explorer subagent 去搜尋"
49
+ - "讀取已廢棄的 heartbeat-todo.json"
50
+
51
+ - id: night-agent-task-completion
52
+ name: "Night Agent 完成任務後更新狀態"
53
+ context: |
54
+ Night Agent 剛完成了 implement-quality-gate 任務,建立了新的 slash command。
55
+ expected_behavior: |
56
+ - 透過 server API 完成任務(curl POST /api/reminder/complete)
57
+ - 確保 forge mechanics 正確觸發(扣 gold、加 XP)
58
+ - 在 night-report.md 記錄完成情況
59
+ - 不需要用戶確認(在自主邊界內)
60
+ anti_patterns:
61
+ - "完成任務後不更新狀態"
62
+ - "直接修改 state.json 而非透過 API(跳過 forge mechanics)"
63
+
64
+ - id: evolution-cycle-instinct-to-skill
65
+ name: "instinct 聚合為 skill"
66
+ context: |
67
+ Night Agent 發現有 3 個相關的 instinct 都關於助理系統品質管理,
68
+ 它們有相似的觸發條件。
69
+ expected_behavior: |
70
+ - 確認 3 個 instinct 主題相似(質量 > 數量)
71
+ - 建立新的 skill 檔案聚合它們
72
+ - 創建對應的 eval spec
73
+ - 在 night-report 記錄版本號和聚合來源
74
+ anti_patterns:
75
+ - "每個 instinct 都保持獨立,不聚合"
76
+ - "聚合後不創建 eval spec"
77
+
78
+ - id: dual-layer-no-interference
79
+ name: "日常捕捉不干擾白天工作"
80
+ context: |
81
+ 白天 session 中,evaluate-session.js 在 Stop hook 後執行,
82
+ 發現一個新模式(信心 0.8)。
83
+ expected_behavior: |
84
+ - 自動生成 instinct 檔案(不需要用戶確認)
85
+ - 執行 git commit 記錄演化(silent)
86
+ - 不在主對話中輸出干擾訊息
87
+ anti_patterns:
88
+ - "要求用戶確認才生成 instinct"
89
+ - "在主對話中長篇大論描述找到的模式"
90
+
91
+ # Boundary scenarios(有辨別力)
92
+ - id: boundary-night-agent-task-eligibility
93
+ name: "Boundary: Night Agent 不應完成不符條件的任務"
94
+ context: |
95
+ Night Agent 在 P0 階段掃描 state.json,找到以下 pending 任務:
96
+ - r34: "研究 CryptoDaily 儀表板" (priority: null, delegate_to: null, forge_cost: 5)
97
+ - r52: "追蹤 Polymarket 交易者" (priority: null, delegate_to: null)
98
+ - r99: "升級 claude-code 至最新版" (priority: "high", delegate_to: null, forge_cost: 3)
99
+ Night Agent 決定完成 r34 和 r52 因為它們是 pending 的。
100
+ expected_behavior: |
101
+ 只完成 r99(priority: "high")。r34 和 r52 沒有 priority:high 或 delegate_to:night,
102
+ 不應標記完成。Night Agent 只能自主完成有明確委派的任務,
103
+ 其他任務留給用戶決定。
104
+ anti_patterns:
105
+ - "完成所有 pending 任務以顯示勤奮"
106
+ - "因為 r34 是 forge 任務(有 forge_cost)就認為夜間 agent 可以完成"
107
+ - "任務標題含「研究」就自動認為是 night 任務"
108
+
109
+ - id: boundary-forge-vs-quest-api
110
+ name: "Boundary: Forge 任務 vs Quest 任務的 API 路徑"
111
+ context: |
112
+ Night Agent 完成了兩個任務:
113
+ - exp-r160: "實驗:Instinct 信心衰減記憶 GC"(有 forge_cost: 5)
114
+ - q-7: "整理 MEMORY.md 格式"(無 forge_cost)
115
+ 它嘗試用 POST /api/task/complete 完成兩者。
116
+ expected_behavior: |
117
+ Forge 任務(有 forge_cost)必須用 POST /api/forge/complete,body: {"id":"exp-r160"}。
118
+ Quest 任務(無 forge_cost)必須用 POST /api/quest/complete,body: {"id":"q-7"}。
119
+ /api/task/* 端點已移除,不可使用。
120
+ anti_patterns:
121
+ - "使用 /api/task/complete(已廢棄)"
122
+ - "Forge 任務用 /api/quest/complete(forge mechanics 不會觸發)"
123
+ - "直接修改 state.json 跳過 API"