@jun133/athlete 0.0.4 → 0.0.6
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/README.md +149 -91
- package/dist/cli.js +26562 -19473
- package/dist/cli.js.map +1 -1
- package/package.json +6 -1
- package/scripts/postinstall-playwright.mjs +1 -1
- package/spec/README.md +49 -41
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260/README.md +29 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/270/273/345/276/252/347/216/257/344/270/216/350/260/203/345/272/246.md +60 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//345/274/200/345/217/221/350/247/204/345/210/231.md +14 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//346/234/254/345/234/260/345/221/275/344/273/244/344/270/216/346/265/201/347/250/213.md +20 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//346/265/213/350/257/225/347/255/226/347/225/245.md +48 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/243/347/240/201/345/234/260/345/233/276//347/233/256/345/275/225/345/210/260/344/273/243/347/240/201/346/230/240/345/260/204.md +51 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227/Telegram/347/247/201/350/201/212.md +31 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//344/272/244/344/272/222/347/273/210/347/253/257.md +26 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/221/275/344/273/244/350/241/214/344/272/247/345/223/201/351/235/242.md +27 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/244/232/346/231/272/350/203/275/344/275/223/350/260/203/345/272/246.md +79 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/256/277/344/270/273/350/277/220/350/241/214/350/276/271/347/225/214.md +74 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/267/245/344/275/234/345/214/272/344/270/216/345/271/266/350/241/214/351/232/224/347/246/273.md +55 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/276/256/344/277/241/347/247/201/350/201/212.md +33 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//346/211/251/345/261/225/346/234/272/345/210/266.md +179 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//346/216/247/345/210/266/351/235/242/350/264/246/346/234/254.md +32 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//351/205/215/347/275/256/347/263/273/347/273/237.md +31 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//346/200/273/344/275/223/346/236/266/346/236/204.md +115 -0
- package/spec//346/212/200/346/234/257/345/256/236/347/216/260//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +129 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205/README.md +27 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//344/272/247/345/223/201/345/256/232/344/275/215.md +78 -0
- package/spec/{principles/P06- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/06-}/344/270/212/344/270/213/346/226/207/350/246/201/350/203/275/345/216/213/347/274/251.md +2 -2
- package/spec/{principles/P08- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/08-}/346/205/242/346/223/215/344/275/234/346/224/276/345/220/216/345/217/260.md +1 -1
- package/spec/{principles/P13-session → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/13-session}/346/230/257/344/273/273/345/212/241/347/216/260/345/234/272.md +3 -3
- package/spec/{principles/P15-provider → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/15-provider}/345/277/205/351/241/273/345/217/257/346/233/277/346/215/242.md +3 -1
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/17-/346/211/251/345/261/225/351/235/240/344/272/213/344/273/266/347/224/237/351/225/277.md +71 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/18-/344/270/273/345/276/252/347/216/257/345/222/214/346/226/207/344/273/266/351/203/275/344/270/215/350/203/275/351/225/277/350/203/226.md +37 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/20-/345/244/226/351/203/250/344/272/213/345/256/236/345/277/205/351/241/273/347/273/221/345/256/232/350/257/201/346/215/256.md +48 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/21-/346/262/241/351/252/214/350/277/207/345/260/261/344/270/215/350/203/275/346/224/266/345/217/243.md +46 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/22-/351/230/266/346/256/265/346/216/250/350/277/233/345/277/205/351/241/273/346/234/211/346/234/272/345/231/250/347/212/266/346/200/201.md +40 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/23-/346/226/207/346/234/254/351/223/276/350/267/257/345/277/205/351/241/273/347/250/263/345/256/232/345/217/257/350/257/273.md +38 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/24-/351/224/231/350/257/257/345/205/274/345/256/271/344/270/215/350/203/275/351/253/230/344/272/216/346/255/243/347/241/256/346/200/247.md +38 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/25-/346/226/260/351/241/271/347/233/256/344/270/215/344/270/272/346/227/247/346/256/213/344/275/231/344/277/235/346/264/273.md +66 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/README.md +37 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//347/263/273/347/273/237/345/205/250/346/231/257.md +57 -0
- package/spec//347/224/250/346/210/267/345/256/241/351/230/205//351/241/271/347/233/256/350/214/203/345/233/264.md +59 -0
- package/spec/adr/ADR-0001-/345/215/225/346/250/241/345/274/217/345/205/250/346/235/203/351/231/220.md +0 -16
- package/spec/adr/ADR-0002-/345/215/225agent/350/265/267/346/255/245/345/271/266/351/242/204/347/225/231/345/244/232agent/350/276/271/347/225/214.md +0 -19
- package/spec/adr/ADR-0003-openai-compatible/344/274/230/345/205/210.md +0 -16
- package/spec/architecture//346/200/273/344/275/223/346/236/266/346/236/204.md +0 -111
- package/spec/architecture//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +0 -117
- package/spec/architecture//350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +0 -82
- package/spec/implementation/README.md +0 -17
- package/spec/implementation//346/250/241/345/235/227/347/272/247/345/274/200/345/217/221/344/273/273/345/212/241/345/215/225.md +0 -55
- package/spec/implementation//347/233/256/345/275/225/347/273/223/346/236/204/345/210/260/344/273/243/347/240/201/346/226/207/344/273/266/346/230/240/345/260/204/350/241/250.md +0 -101
- package/spec/interfaces/InteractionShell.md +0 -85
- package/spec/interfaces/ProviderAdapter.md +0 -23
- package/spec/interfaces/README.md +0 -17
- package/spec/interfaces/RuntimeLoop.md +0 -28
- package/spec/interfaces/SessionStore.md +0 -22
- package/spec/interfaces/ToolRegistry.md +0 -21
- package/spec/modules/config-system.md +0 -51
- package/spec/modules/interactive-terminal.md +0 -112
- package/spec/modules/lightweight-context-runtime.md +0 -63
- package/spec/modules/provider-adapter.md +0 -20
- package/spec/modules/runtime-metrics.md +0 -132
- package/spec/modules/runtime-rules.md +0 -33
- package/spec/modules/session-resume-compact.md +0 -49
- package/spec/modules/task-state.md +0 -34
- package/spec/modules/telegram-private-chat.md +0 -291
- package/spec/modules/tool-registry.md +0 -79
- package/spec/modules/weixin-private-chat.md +0 -291
- package/spec/modules/workspace-isolation.md +0 -24
- package/spec/modules//346/211/251/345/261/225/346/234/272/345/210/266.md +0 -105
- package/spec/overview/v0/350/214/203/345/233/264.md +0 -54
- package/spec/overview//344/272/247/345/223/201/345/256/232/344/271/211.md +0 -59
- package/spec/principles/P17-/346/211/251/345/261/225/351/235/240/344/272/213/344/273/266/347/224/237/351/225/277.md +0 -32
- package/spec/principles/P18-/344/270/273/345/276/252/347/216/257/345/222/214/346/226/207/344/273/266/351/203/275/344/270/215/350/203/275/351/225/277/350/203/226.md +0 -36
- package/spec/principles/README.md +0 -39
- package/spec/repo//345/274/200/345/217/221/350/247/204/345/210/231.md +0 -39
- package/spec/repo//346/234/254/345/234/260/345/221/275/344/273/244/344/270/216/346/265/201/347/250/213.md +0 -32
- package/spec/testing/fail-first-/347/254/254/344/270/200/346/211/271/346/265/213/350/257/225/345/210/227/350/241/250.md +0 -11
- package/spec/testing/fixtures-/350/247/204/350/214/203.md +0 -20
- package/spec/testing//346/265/213/350/257/225/347/255/226/347/225/245.md +0 -97
- /package/spec/{principles/P01- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/01-}/344/270/200/344/270/252/345/276/252/347/216/257/344/270/200/344/270/252/346/231/272/350/203/275/344/275/223.md" +0 -0
- /package/spec/{principles/P02- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/02-}/345/212/240/344/270/200/344/270/252/345/267/245/345/205/267/345/217/252/345/212/240/344/270/200/344/270/252/345/244/204/347/220/206/345/231/250.md" +0 -0
- /package/spec/{principles/P03- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/03-}/345/205/210/350/256/241/345/210/222/345/206/215/345/212/250/346/211/213.md" +0 -0
- /package/spec/{principles/P04- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/04-}/345/244/247/344/273/273/345/212/241/346/213/206/347/273/231/345/255/220/346/231/272/350/203/275/344/275/223.md" +0 -0
- /package/spec/{principles/P05- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/05-}/347/237/245/350/257/206/346/214/211/351/234/200/345/212/240/350/275/275.md" +0 -0
- /package/spec/{principles/P07- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/07-}/344/273/273/345/212/241/345/233/276/350/246/201/350/220/275/347/233/230.md" +0 -0
- /package/spec/{principles/P09- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/09-}/344/273/273/345/212/241/345/244/252/345/244/247/345/260/261/345/210/206/347/273/231/351/230/237/345/217/213.md" +0 -0
- /package/spec/{principles/P10- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/10-}/351/230/237/345/217/213/344/271/213/351/227/264/350/246/201/346/234/211/347/273/237/344/270/200/345/215/217/350/256/256.md" +0 -0
- /package/spec/{principles/P11- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/11-}/351/230/237/345/217/213/350/207/252/345/267/261/350/256/244/351/242/206/344/273/273/345/212/241.md" +0 -0
- /package/spec/{principles/P12- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/12-}/345/267/245/344/275/234/345/214/272/345/222/214/344/273/273/345/212/241/350/246/201/351/232/224/347/246/273.md" +0 -0
- /package/spec/{principles/P14- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/14-}/346/211/247/350/241/214/347/272/246/346/235/237/344/270/215/346/230/257/345/256/211/345/205/250/347/255/226/347/225/245.md" +0 -0
- /package/spec/{principles/P16- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/16-}/351/205/215/347/275/256/345/217/252/350/203/275/346/234/211/344/270/200/344/270/252/345/205/245/345/217/243.md" +0 -0
- /package/spec/{principles/P19- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/19-}/345/205/210/345/206/231/345/244/261/350/264/245/346/265/213/350/257/225/345/206/215/345/206/231/345/256/236/347/216/260.md" +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# 17-扩展靠事件生长
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
扩展不能只靠往 system prompt 里继续堆规则。
|
|
6
|
+
|
|
7
|
+
系统要通过清晰的扩展口、运行时事件点和生命周期边界来生长。
|
|
8
|
+
|
|
9
|
+
## 为什么
|
|
10
|
+
|
|
11
|
+
Athlete 现在已经不是一个单兵型 Agent。
|
|
12
|
+
|
|
13
|
+
它后面还会继续长出:
|
|
14
|
+
|
|
15
|
+
- 更多技能
|
|
16
|
+
- 更多工具
|
|
17
|
+
- 更多角色
|
|
18
|
+
- 更多宿主
|
|
19
|
+
- 更多运行时通知和可见事件
|
|
20
|
+
|
|
21
|
+
如果没有正式扩展点,最后会出现三种坏事:
|
|
22
|
+
|
|
23
|
+
1. 主循环越来越胖
|
|
24
|
+
2. 宿主越来越会偷偷拼 runtime
|
|
25
|
+
3. 新能力只能靠 prompt 和胶水代码硬塞进去
|
|
26
|
+
|
|
27
|
+
## 在 Athlete 里的含义
|
|
28
|
+
|
|
29
|
+
Athlete 当前正式扩展口至少有四类:
|
|
30
|
+
|
|
31
|
+
1. 工具扩展
|
|
32
|
+
- tool registry
|
|
33
|
+
- governed tool metadata
|
|
34
|
+
2. 技能扩展
|
|
35
|
+
- skill catalog
|
|
36
|
+
- skill matching / loading
|
|
37
|
+
3. 外部能力扩展
|
|
38
|
+
- MCP
|
|
39
|
+
4. 运行时与宿主扩展
|
|
40
|
+
- runtime callbacks
|
|
41
|
+
- turn visible events
|
|
42
|
+
- lifecycle closeout
|
|
43
|
+
- host extra tools
|
|
44
|
+
- host identity
|
|
45
|
+
|
|
46
|
+
也就是说,Athlete 现在已经不只需要“tool / skill / MCP”三个扩展口。
|
|
47
|
+
|
|
48
|
+
它还必须明确:
|
|
49
|
+
|
|
50
|
+
- turn 开始点
|
|
51
|
+
- turn 执行点
|
|
52
|
+
- pause / abort / error / finalize 收口点
|
|
53
|
+
- visible event 输出点
|
|
54
|
+
- 宿主注入 extra tool 的边界
|
|
55
|
+
|
|
56
|
+
这些 runtime / lifecycle 点,必须是正式边界,不是散装胶水。
|
|
57
|
+
|
|
58
|
+
## 当前对应
|
|
59
|
+
|
|
60
|
+
- `src/tools/runtimeRegistry.ts`
|
|
61
|
+
- `src/skills/`
|
|
62
|
+
- `src/mcp/`
|
|
63
|
+
- `src/host/`
|
|
64
|
+
- `src/chat/`
|
|
65
|
+
- `src/ui/`
|
|
66
|
+
|
|
67
|
+
## 当前要求
|
|
68
|
+
|
|
69
|
+
1. 新扩展优先长在正式扩展口,不优先长在 prompt 里。
|
|
70
|
+
2. 宿主扩展必须走 `src/host/`,不能绕进核心内部模块。
|
|
71
|
+
3. runtime 事件和生命周期收口要作为正式设计对象,而不是“以后再补”。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# P18 主循环和文件都不能长胖
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
主循环必须保持调度中心地位;单个文件必须保持单一职责;系统靠解耦和模块组合生长,而不是靠把越来越多逻辑塞进一个文件。
|
|
6
|
+
|
|
7
|
+
## 为什么
|
|
8
|
+
|
|
9
|
+
如果一个文件什么都做:
|
|
10
|
+
|
|
11
|
+
- AI 很容易改坏别的部分
|
|
12
|
+
- 人很难知道该去哪里改
|
|
13
|
+
- 小改动会牵动全身
|
|
14
|
+
- 后续维护成本会迅速失控
|
|
15
|
+
|
|
16
|
+
Athlete 要的是可持续迭代,不是短期堆代码。
|
|
17
|
+
|
|
18
|
+
## 铁律
|
|
19
|
+
|
|
20
|
+
1. 单文件单职责优先,解耦优先,模块化优先。
|
|
21
|
+
2. “先能跑再塞进一个文件”不是长期方案,发现职责混杂就要拆。
|
|
22
|
+
3. 行数阈值只是预警,不是宗教;真正要盯的是职责是否混杂、边界是否清楚、后续是否好维护。
|
|
23
|
+
4. 主循环只保留全局调度规则,不吞模块细节。
|
|
24
|
+
5. 新功能优先长在新模块、新目录或明确扩展点上,不优先堆进已有大文件。
|
|
25
|
+
|
|
26
|
+
## 在 Athlete 当前阶段的含义
|
|
27
|
+
|
|
28
|
+
- 一个文件如果已经承担两件以上主要事情,就优先拆。
|
|
29
|
+
- 能拆成状态层、执行层、验证层、展示层,就不要继续糊在一起。
|
|
30
|
+
- 能删掉错误旧层,就不要为了兼容继续保留。
|
|
31
|
+
|
|
32
|
+
## 当前对应
|
|
33
|
+
|
|
34
|
+
- `src/agent/runTurn.ts`
|
|
35
|
+
- `src/tools/`
|
|
36
|
+
- `src/team/`
|
|
37
|
+
- `src/tasks/`
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# P20 外部事实必须绑定证据
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
任何来自网页、文档、邮件、截图、检索结果或外部文件的事实,只要要进入结构化产物、摘要、报告或最终结论,就必须绑定证据。
|
|
6
|
+
|
|
7
|
+
## 为什么
|
|
8
|
+
|
|
9
|
+
如果系统允许“查到一点点,再补写一整段”:
|
|
10
|
+
|
|
11
|
+
- 结果会看起来很完整,但并不可靠
|
|
12
|
+
- 模型会把猜测混进事实
|
|
13
|
+
- 人很难区分“真实抓到的”与“模型补出来的”
|
|
14
|
+
|
|
15
|
+
Athlete 要做的是可执行系统,不是会写漂亮答案的壳。
|
|
16
|
+
|
|
17
|
+
## 在 Athlete 里的含义
|
|
18
|
+
|
|
19
|
+
进入最终产物的每条外部事实,至少应能追到:
|
|
20
|
+
|
|
21
|
+
- 来源名
|
|
22
|
+
- 来源链接或来源文件
|
|
23
|
+
- 抓取时间
|
|
24
|
+
- 证据摘录或定位信息
|
|
25
|
+
|
|
26
|
+
如果没有这些,系统应优先:
|
|
27
|
+
|
|
28
|
+
- 继续抓取
|
|
29
|
+
- 标成未证实
|
|
30
|
+
- 或直接拒绝写入最终结果
|
|
31
|
+
|
|
32
|
+
而不是让模型自行补齐。
|
|
33
|
+
|
|
34
|
+
如果任务本身还声明了结构化证据字段,例如:
|
|
35
|
+
|
|
36
|
+
- `source_name`
|
|
37
|
+
- `link`
|
|
38
|
+
- `fetched_at`
|
|
39
|
+
- `evidence_excerpt`
|
|
40
|
+
|
|
41
|
+
那这些字段也属于硬门禁。缺任一项,都不能算“证据已绑定”。
|
|
42
|
+
|
|
43
|
+
## 当前对应
|
|
44
|
+
|
|
45
|
+
- `src/agent/prompt/`
|
|
46
|
+
- `src/tools/files/toolResultArtifact.ts`
|
|
47
|
+
- `src/agent/verification.ts`
|
|
48
|
+
- `spec/技术实现/主循环与调度.md`
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# P21 没验过就不能收口
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
没有真实验证通过,就不能把任务判定为完成。
|
|
6
|
+
|
|
7
|
+
## 为什么
|
|
8
|
+
|
|
9
|
+
“写了文件”不等于“做成了”。
|
|
10
|
+
|
|
11
|
+
如果系统允许下面这些情况直接收口:
|
|
12
|
+
|
|
13
|
+
- 服务没启动
|
|
14
|
+
- 页面没打开
|
|
15
|
+
- JSON 不可解析
|
|
16
|
+
- 关键文件缺失
|
|
17
|
+
- 结果文件内容不可读
|
|
18
|
+
|
|
19
|
+
那最后交付出来的就只是看起来像完成。
|
|
20
|
+
|
|
21
|
+
## 在 Athlete 里的含义
|
|
22
|
+
|
|
23
|
+
closeout 必须依赖真实验收条件,而不是模型自述。
|
|
24
|
+
|
|
25
|
+
至少要检查:
|
|
26
|
+
|
|
27
|
+
- 任务要求的关键文件是否存在
|
|
28
|
+
- 关键命令是否实际跑通
|
|
29
|
+
- 关键接口或页面是否真实可用
|
|
30
|
+
- verification state 是否与真实产物一致
|
|
31
|
+
|
|
32
|
+
如果任务已经显式给出了 acceptance / closeout 契约,还必须继续检查:
|
|
33
|
+
|
|
34
|
+
- 必需文件是否齐全
|
|
35
|
+
- JSON 是否可解析
|
|
36
|
+
- 研究 / 文档结果里的证据字段是否齐全
|
|
37
|
+
- API / 页面探活结果是否真的通过
|
|
38
|
+
|
|
39
|
+
只要关键验证没过,就继续工作,不允许 finalize。
|
|
40
|
+
|
|
41
|
+
## 当前对应
|
|
42
|
+
|
|
43
|
+
- `src/agent/turn/finalize.ts`
|
|
44
|
+
- `src/agent/turn/closeout.ts`
|
|
45
|
+
- `src/agent/verification.ts`
|
|
46
|
+
- `spec/技术实现/主循环与调度.md`
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# P22 阶段推进必须有机器状态
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
任务处于哪个阶段,不应只靠模型口头描述,必须有机器可读的阶段状态。
|
|
6
|
+
|
|
7
|
+
## 为什么
|
|
8
|
+
|
|
9
|
+
长任务最容易出现两种漂移:
|
|
10
|
+
|
|
11
|
+
- 还没完成当前阶段,就提前说“下一步”
|
|
12
|
+
- 已经卡住了,但还在原地重复动作
|
|
13
|
+
|
|
14
|
+
如果没有显式阶段,系统就无法判断自己是在推进、卡住,还是绕圈。
|
|
15
|
+
|
|
16
|
+
## 在 Athlete 里的含义
|
|
17
|
+
|
|
18
|
+
像下面这类任务,都应有清楚 phase:
|
|
19
|
+
|
|
20
|
+
- 研究任务:发现来源 -> 抓取 -> 归一化 -> 落地 -> 验证
|
|
21
|
+
- 文档任务:找文档 -> 获取文档 -> 读取 -> 抽取结构 -> 证据映射 -> 验证
|
|
22
|
+
- 编码任务:搭结构 -> 实现 -> 安装依赖 -> 运行 -> 验证 -> 收口
|
|
23
|
+
|
|
24
|
+
阶段切换应尽量由真实事件触发:
|
|
25
|
+
|
|
26
|
+
- 找到文档
|
|
27
|
+
- 读到文档
|
|
28
|
+
- 生成了结构化结果
|
|
29
|
+
- 验证通过
|
|
30
|
+
|
|
31
|
+
而不是只因为模型说“现在进入下一步”。
|
|
32
|
+
|
|
33
|
+
如果同一 phase 连续多轮没有新增成果,机器状态还必须明确记住“正在停滞”,并推动系统换路、恢复或进入更明确的补救分支。
|
|
34
|
+
|
|
35
|
+
## 当前对应
|
|
36
|
+
|
|
37
|
+
- `src/agent/checkpoint/`
|
|
38
|
+
- `src/agent/runtimeTransition/`
|
|
39
|
+
- `src/agent/session/taskState.ts`
|
|
40
|
+
- `spec/技术实现/状态与真相源.md`
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# P23 文本链路必须稳定可读
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
输入、日志、可见预览、持久化内容和生成文件,必须保持稳定、可读、可逆的文本链路。
|
|
6
|
+
|
|
7
|
+
## 为什么
|
|
8
|
+
|
|
9
|
+
一旦文本链路坏掉:
|
|
10
|
+
|
|
11
|
+
- prompt 会被污染
|
|
12
|
+
- 模型会误解任务
|
|
13
|
+
- 日志会失去诊断价值
|
|
14
|
+
- 生成文件会直接变坏
|
|
15
|
+
|
|
16
|
+
这不是界面小问题,而是正确性问题。
|
|
17
|
+
|
|
18
|
+
## 在 Athlete 里的含义
|
|
19
|
+
|
|
20
|
+
系统必须把编码和文本完整性当作主链路要求,而不是显示细节。
|
|
21
|
+
|
|
22
|
+
至少应保证:
|
|
23
|
+
|
|
24
|
+
- 中文和英文输入不被破坏
|
|
25
|
+
- 可见日志和 tool preview 可读
|
|
26
|
+
- session / checkpoint / artifacts 落盘后可再次读取
|
|
27
|
+
- 写出的文本文件不出现乱码污染
|
|
28
|
+
- shell / 子进程输出不能依赖平台默认编码碰运气
|
|
29
|
+
- UTF-8 / UTF-16 等常见文本格式要能稳定识别,不误判成 binary
|
|
30
|
+
|
|
31
|
+
如果出现乱码,优先级应高于继续堆功能。
|
|
32
|
+
|
|
33
|
+
## 当前对应
|
|
34
|
+
|
|
35
|
+
- `src/utils/stdio.ts`
|
|
36
|
+
- `src/ui/streamRenderer.ts`
|
|
37
|
+
- `src/agent/session/`
|
|
38
|
+
- `src/tools/files/`
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# P24 错误兼容不能高于正确性
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
错误旧逻辑、错误旧测试、错误旧兼容,不能为了“少改一点”而继续保留。
|
|
6
|
+
|
|
7
|
+
## 为什么
|
|
8
|
+
|
|
9
|
+
Athlete 还在高频演进阶段。
|
|
10
|
+
|
|
11
|
+
如果系统已经确认某条旧行为是错的,却还继续兼容它:
|
|
12
|
+
|
|
13
|
+
- 主链会越来越脏
|
|
14
|
+
- 新规则会一直被旧规则拖住
|
|
15
|
+
- 模型和运行时会同时背两套相互冲突的东西
|
|
16
|
+
|
|
17
|
+
这会让系统越来越难修,而不是更稳定。
|
|
18
|
+
|
|
19
|
+
## 在 Athlete 里的含义
|
|
20
|
+
|
|
21
|
+
当旧逻辑与正确主干冲突时,优先顺序应是:
|
|
22
|
+
|
|
23
|
+
1. 保正确
|
|
24
|
+
2. 保简单
|
|
25
|
+
3. 保唯一真相源
|
|
26
|
+
4. 最后才考虑兼容
|
|
27
|
+
|
|
28
|
+
如果旧测试在保护错误行为,就删除或重写。
|
|
29
|
+
如果旧兼容层在阻碍主链修复,就删掉。
|
|
30
|
+
不为错误行为保活。
|
|
31
|
+
Athlete 还是新项目,不要求为错误历史写长期兼容分支。
|
|
32
|
+
|
|
33
|
+
## 当前对应
|
|
34
|
+
|
|
35
|
+
- `spec/`
|
|
36
|
+
- `tests/`
|
|
37
|
+
- `src/agent/`
|
|
38
|
+
- `src/tools/`
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# P25 新项目不为旧残余保活
|
|
2
|
+
|
|
3
|
+
## 原则
|
|
4
|
+
|
|
5
|
+
Athlete 仍处于新项目高频演进阶段。
|
|
6
|
+
|
|
7
|
+
对已经确认错误、过时、残余、阻碍主干的旧结构,不做长期兼容,不做保活,不做双轨并存。
|
|
8
|
+
|
|
9
|
+
需要删就删,需要清就清。
|
|
10
|
+
|
|
11
|
+
## 为什么
|
|
12
|
+
|
|
13
|
+
新项目最怕的,不是改动大,而是:
|
|
14
|
+
|
|
15
|
+
- 明知旧结构错了还继续背着走
|
|
16
|
+
- 为了少改一点,把错误历史变成永久负担
|
|
17
|
+
- 让主干长期同时维护“旧方式”和“新方式”
|
|
18
|
+
|
|
19
|
+
这样做的结果通常不是更稳定,而是:
|
|
20
|
+
|
|
21
|
+
- 主链变脏
|
|
22
|
+
- 边界变糊
|
|
23
|
+
- AI 和人都更难判断真实结构
|
|
24
|
+
- 每一轮重构都要先向后看,无法以当前最优架构推进
|
|
25
|
+
|
|
26
|
+
## 铁律
|
|
27
|
+
|
|
28
|
+
1. 新项目优先当前正确主干,不优先旧兼容。
|
|
29
|
+
2. 对错误旧逻辑、错误旧测试、错误旧文件、错误旧状态,不保活。
|
|
30
|
+
3. 对阻碍主干的残余层、过渡层、平行层、双写层,优先删除。
|
|
31
|
+
4. 除非有非常明确且必要的用户数据保留价值,否则不为了旧状态写长期兼容逻辑。
|
|
32
|
+
5. 可以做一次性清理、一次性重建、一次性迁移;不要做永久兼容。
|
|
33
|
+
6. “用户也许还会用到”不是保留错误残余的充分理由。
|
|
34
|
+
7. 文档必须明确告诉维护者:哪些旧东西已经废弃,哪些要删,哪些不能再依赖。
|
|
35
|
+
|
|
36
|
+
## 在 Athlete 当前阶段的含义
|
|
37
|
+
|
|
38
|
+
- 如果旧 JSON 真相源已经阻碍 SQLite 账本,就下线旧真相源,不为它保留长期双写。
|
|
39
|
+
- 如果旧调度路径已经与新调度模型冲突,就删掉旧路径,不让两套规则长期并存。
|
|
40
|
+
- 如果旧测试保护的是错误结构,就删除或重写,不让错误测试绑架主干。
|
|
41
|
+
- 如果旧宿主接线方式已经妨碍 host/core 分层,就重接或删除,不做历史包袱保留。
|
|
42
|
+
|
|
43
|
+
## 允许做的事
|
|
44
|
+
|
|
45
|
+
- 明确清理旧状态目录
|
|
46
|
+
- 明确重建本地开发状态
|
|
47
|
+
- 明确替换旧结构
|
|
48
|
+
- 明确写废弃说明
|
|
49
|
+
- 明确删除错误残余文件或路径
|
|
50
|
+
|
|
51
|
+
## 不允许做的事
|
|
52
|
+
|
|
53
|
+
- 为错误旧结构新增长期兼容层
|
|
54
|
+
- 为了“看起来平滑”而保留平行真相源
|
|
55
|
+
- 为了少改测试而继续保留错误行为
|
|
56
|
+
- 为了照顾旧实现而放弃当前更优架构
|
|
57
|
+
|
|
58
|
+
## 当前对应
|
|
59
|
+
|
|
60
|
+
- `spec/`
|
|
61
|
+
- `tests/`
|
|
62
|
+
- `src/tasks/`
|
|
63
|
+
- `src/team/`
|
|
64
|
+
- `src/background/`
|
|
65
|
+
- `src/worktrees/`
|
|
66
|
+
- `src/orchestrator/`
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 宪法原则
|
|
2
|
+
|
|
3
|
+
这一组文档是给人类审阅项目方向用的根本原则。
|
|
4
|
+
|
|
5
|
+
它们回答的不是“某个模块怎么写”,而是:
|
|
6
|
+
|
|
7
|
+
- 这个项目为什么要这样长
|
|
8
|
+
- 哪些边界不能被实现细节反推翻
|
|
9
|
+
- 当代码、测试和文档冲突时,应该先保护什么
|
|
10
|
+
|
|
11
|
+
## 现在怎么读
|
|
12
|
+
|
|
13
|
+
### 01 到 16
|
|
14
|
+
|
|
15
|
+
这部分是当前已经稳定成立的底层原则:
|
|
16
|
+
|
|
17
|
+
- 单智能体主循环
|
|
18
|
+
- 工具处理器边界
|
|
19
|
+
- 计划、知识、上下文、任务图
|
|
20
|
+
- 后台、队友、协议、工作区
|
|
21
|
+
- session、provider、配置
|
|
22
|
+
|
|
23
|
+
### 17 到 25
|
|
24
|
+
|
|
25
|
+
这部分是当前工程已经必须正面处理的系统原则:
|
|
26
|
+
|
|
27
|
+
- 扩展口怎么长
|
|
28
|
+
- 主循环和文件怎么保持清醒
|
|
29
|
+
- 失败测试、验证、证据、机器状态
|
|
30
|
+
- 文本链路、错误兼容、旧残余清理
|
|
31
|
+
|
|
32
|
+
## 使用规则
|
|
33
|
+
|
|
34
|
+
1. 宪法原则只写长期有效、能跨多个模块成立的规则。
|
|
35
|
+
2. 一次性实现技巧不要升格成宪法。
|
|
36
|
+
3. 模块细节、接口细节和仓库流程写去 `技术实现/`。
|
|
37
|
+
4. 当产品定位发生变化时,要先检查这里是否需要更新。
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# 系统全景
|
|
2
|
+
|
|
3
|
+
## 用一句人话说
|
|
4
|
+
|
|
5
|
+
Athlete 是一个会自己持续推进任务、会拆解复杂工作、会把任务分给不同执行通道、并且能把整个过程记下来的智能体系统。
|
|
6
|
+
|
|
7
|
+
## 它怎么工作
|
|
8
|
+
|
|
9
|
+
你可以把它想成三层:
|
|
10
|
+
|
|
11
|
+
### 1. 主 Agent
|
|
12
|
+
|
|
13
|
+
这是总指挥。
|
|
14
|
+
|
|
15
|
+
它负责:
|
|
16
|
+
|
|
17
|
+
- 理解目标
|
|
18
|
+
- 判断任务复杂度
|
|
19
|
+
- 决定是自己做,还是拆给别的执行者
|
|
20
|
+
- 跟踪当前进度、阻塞和合流点
|
|
21
|
+
|
|
22
|
+
### 2. 控制面
|
|
23
|
+
|
|
24
|
+
这是账本和现场。
|
|
25
|
+
|
|
26
|
+
它负责记住:
|
|
27
|
+
|
|
28
|
+
- 现在有哪些任务
|
|
29
|
+
- 谁在做
|
|
30
|
+
- 哪个任务被什么阻塞
|
|
31
|
+
- 哪些后台任务仍在跑
|
|
32
|
+
- 哪些 worktree 仍有效
|
|
33
|
+
- 当前 session、checkpoint、runtime 状态到了哪一步
|
|
34
|
+
|
|
35
|
+
### 3. 执行与通道
|
|
36
|
+
|
|
37
|
+
这是手脚和外壳。
|
|
38
|
+
|
|
39
|
+
它负责:
|
|
40
|
+
|
|
41
|
+
- 读写文件
|
|
42
|
+
- 跑命令
|
|
43
|
+
- 下载文件
|
|
44
|
+
- 调用外部能力
|
|
45
|
+
- 通过 CLI、Telegram、Weixin 和未来其他宿主接收输入、回传结果
|
|
46
|
+
|
|
47
|
+
## 为什么它不是单兵系统
|
|
48
|
+
|
|
49
|
+
因为它已经在做这些事:
|
|
50
|
+
|
|
51
|
+
- 让 lead 提前组织任务
|
|
52
|
+
- 让 teammate 和 background 各自承担不同执行方式
|
|
53
|
+
- 让 worktree 隔离并行改动
|
|
54
|
+
- 让宿主共用同一条核心运行主路径
|
|
55
|
+
- 让 skill 和外部能力通过统一扩展口进入系统
|
|
56
|
+
|
|
57
|
+
这说明 Athlete 的主心骨已经不是“一个人自己拼命干”,而是“一个主 Agent 组织整个工作系统往前跑”。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 项目范围
|
|
2
|
+
|
|
3
|
+
## 当前已经在范围内
|
|
4
|
+
|
|
5
|
+
### 耐跑底盘
|
|
6
|
+
|
|
7
|
+
- session 作为任务现场
|
|
8
|
+
- checkpoint 与 continuation
|
|
9
|
+
- 上下文压缩
|
|
10
|
+
- verification / acceptance / closeout
|
|
11
|
+
- runtime stats 和可见 summary
|
|
12
|
+
|
|
13
|
+
### 总指挥能力
|
|
14
|
+
|
|
15
|
+
- 主 Agent 的任务预处理
|
|
16
|
+
- 任务拆分与最小任务图
|
|
17
|
+
- lead / teammate / background / subagent 路由
|
|
18
|
+
- wait / merge / blocked / ready 的机器语义
|
|
19
|
+
|
|
20
|
+
### 控制面
|
|
21
|
+
|
|
22
|
+
- SQLite 控制面账本
|
|
23
|
+
- 任务、队友、协议、后台、worktree 的正式真相源
|
|
24
|
+
|
|
25
|
+
### 扩展与通道
|
|
26
|
+
|
|
27
|
+
- tools
|
|
28
|
+
- skills
|
|
29
|
+
- MCP
|
|
30
|
+
- CLI
|
|
31
|
+
- Telegram 私聊
|
|
32
|
+
- 微信私聊
|
|
33
|
+
|
|
34
|
+
## 当前明确不在范围内
|
|
35
|
+
|
|
36
|
+
- 面向大众的图形化编排平台
|
|
37
|
+
- 复杂商业化 swarm 市场
|
|
38
|
+
- 跨项目长期人格记忆
|
|
39
|
+
- 为了热闹而默认开一堆 agent 并发
|
|
40
|
+
- 没有控制面约束的自治军团
|
|
41
|
+
|
|
42
|
+
## 下一阶段优先级
|
|
43
|
+
|
|
44
|
+
当前阶段优先继续强化这些能力:
|
|
45
|
+
|
|
46
|
+
1. 主 Agent 的总指挥层
|
|
47
|
+
2. 复杂任务拆分、派工、等待与合流
|
|
48
|
+
3. 更清晰的技能扩展口和宿主扩展口
|
|
49
|
+
4. reviewer / verifier / planner 这类专门角色的演进边界
|
|
50
|
+
5. 面向更多宿主的统一接入主路径
|
|
51
|
+
|
|
52
|
+
## 范围判断规则
|
|
53
|
+
|
|
54
|
+
如果一个新需求同时满足下面两条,就应该往后放:
|
|
55
|
+
|
|
56
|
+
- 会削弱耐跑底盘
|
|
57
|
+
- 不能明显增强总指挥能力、控制面能力或标准扩展口
|
|
58
|
+
|
|
59
|
+
Athlete 当前优先做“更会组织、更会持续推进”,不是“看起来更像万能 AI”。
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# ADR-0001:默认 Agent 模式优先,保留 Read-Only 辅助模式
|
|
2
|
-
|
|
3
|
-
## 背景
|
|
4
|
-
|
|
5
|
-
Athlete 起家的核心能力是“在终端里持续把任务做完”,而不是只做分析。
|
|
6
|
-
|
|
7
|
-
## 决策
|
|
8
|
-
|
|
9
|
-
1. 默认心智模型以 `agent` 模式为主。
|
|
10
|
-
2. `read-only` 保留,用于分析、审阅、低风险探索。
|
|
11
|
-
3. 核心规格和扩展方向优先围绕 `agent` 模式设计。
|
|
12
|
-
|
|
13
|
-
## 后果
|
|
14
|
-
|
|
15
|
-
- Athlete 保持“能干活”的产品性格
|
|
16
|
-
- 同时仍保留安全一些的分析入口
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# ADR-0002:强主 Agent 起步,预留多 Agent 边界
|
|
2
|
-
|
|
3
|
-
## 背景
|
|
4
|
-
|
|
5
|
-
Athlete 当前最强的价值来自耐跑主 Agent。
|
|
6
|
-
|
|
7
|
-
同时,复杂任务又确实需要 subagent、teammate、background、worktree。
|
|
8
|
-
|
|
9
|
-
## 决策
|
|
10
|
-
|
|
11
|
-
1. 主 Agent 仍是系统核心。
|
|
12
|
-
2. 多 Agent 是按需能力,不是默认军团模式。
|
|
13
|
-
3. 下一阶段优先补“总指挥层”,不是先做大规模 swarm。
|
|
14
|
-
|
|
15
|
-
## 后果
|
|
16
|
-
|
|
17
|
-
- 能保住当前耐跑底盘
|
|
18
|
-
- 以后还能继续扩到多 Agent
|
|
19
|
-
- 不会过早进入复杂协作失控状态
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# ADR-0003:OpenAI-Compatible 优先
|
|
2
|
-
|
|
3
|
-
## 背景
|
|
4
|
-
|
|
5
|
-
Athlete 要做 harness,而不是绑死在某一家 provider 上。
|
|
6
|
-
|
|
7
|
-
## 决策
|
|
8
|
-
|
|
9
|
-
1. 当前 provider 接口优先兼容 OpenAI-compatible。
|
|
10
|
-
2. provider 选择属于配置问题,不属于业务设计问题。
|
|
11
|
-
3. 上层 runtime、tools、orchestrator 不依赖某一家的专属行为。
|
|
12
|
-
|
|
13
|
-
## 后果
|
|
14
|
-
|
|
15
|
-
- Athlete 更容易切换模型与服务商
|
|
16
|
-
- 后续扩展更稳定
|