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.
- package/CONTRIBUTING.md +56 -0
- package/LICENSE +21 -0
- package/README.md +443 -0
- package/bin/init.js +317 -0
- package/commands/eval-skill.md +48 -0
- package/commands/evolve.md +67 -0
- package/commands/improve-skill.md +50 -0
- package/core/evaluate-session.js +173 -0
- package/core/observe.sh +51 -0
- package/core/prune-instincts.js +159 -0
- package/docs/nightly-agent.md +130 -0
- package/examples/reference/README.md +47 -0
- package/examples/reference/architecture.yaml +886 -0
- package/examples/reference/evolved-agents/assistant-explorer.md +86 -0
- package/examples/reference/evolved-agents/shell-debugger.md +108 -0
- package/examples/reference/evolved-agents/tdd-runner.md +112 -0
- package/examples/reference/evolved-evals/api-system-diagnosis.eval.yaml +125 -0
- package/examples/reference/evolved-evals/assistant-system-management.eval.yaml +123 -0
- package/examples/reference/evolved-evals/claude-code-reference.eval.yaml +394 -0
- package/examples/reference/evolved-evals/development-verification-patterns.eval.yaml +117 -0
- package/examples/reference/evolved-evals/multi-agent-design-patterns.eval.yaml +151 -0
- package/examples/reference/evolved-evals/shell-automation-patterns.eval.yaml +209 -0
- package/examples/reference/evolved-evals/tdd-workflow.eval.yaml +191 -0
- package/examples/reference/evolved-evals/workflows.eval.yaml +148 -0
- package/examples/reference/evolved-skills/api-system-diagnosis.md +234 -0
- package/examples/reference/evolved-skills/assistant-system-management.md +199 -0
- package/examples/reference/evolved-skills/development-verification-patterns.md +243 -0
- package/examples/reference/evolved-skills/multi-agent-design-patterns.md +259 -0
- package/examples/reference/evolved-skills/shell-automation-patterns.md +347 -0
- package/examples/reference/evolved-skills/tdd-workflow.md +272 -0
- package/examples/reference/evolved-skills/workflows.md +237 -0
- package/package.json +25 -0
- package/templates/CLAUDE.md.template +36 -0
- package/templates/architecture.template.yaml +41 -0
- 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"
|