@jun133/athlete 0.0.4 → 0.0.5

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 (34) hide show
  1. package/README.md +18 -13
  2. package/dist/cli.js +7474 -4084
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +4 -1
  5. package/scripts/postinstall-playwright.mjs +10 -10
  6. package/spec/architecture//346/200/273/344/275/223/346/236/266/346/236/204.md +25 -21
  7. package/spec/architecture//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +20 -17
  8. package/spec/architecture//350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +105 -48
  9. 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 +141 -66
  10. package/spec/interfaces/InteractionShell.md +15 -7
  11. package/spec/modules/config-system.md +45 -19
  12. package/spec/modules/interactive-terminal.md +49 -22
  13. package/spec/modules/lightweight-context-runtime.md +34 -17
  14. package/spec/modules/provider-adapter.md +45 -20
  15. package/spec/modules/runtime-metrics.md +54 -24
  16. package/spec/modules/runtime-rules.md +52 -20
  17. package/spec/modules/session-resume-compact.md +20 -14
  18. package/spec/modules/task-state.md +25 -18
  19. package/spec/modules/telegram-private-chat.md +3 -3
  20. package/spec/modules/tool-registry.md +93 -35
  21. package/spec/modules//346/211/251/345/261/225/346/234/272/345/210/266.md +65 -29
  22. package/spec/overview/v0/350/214/203/345/233/264.md +7 -6
  23. package/spec/overview//344/272/247/345/223/201/345/256/232/344/271/211.md +14 -12
  24. package/spec/principles/P06-/344/270/212/344/270/213/346/226/207/350/246/201/350/203/275/345/216/213/347/274/251.md +5 -5
  25. package/spec/principles/P13-session/346/230/257/344/273/273/345/212/241/347/216/260/345/234/272.md +5 -5
  26. package/spec/principles/P15-provider/345/277/205/351/241/273/345/217/257/346/233/277/346/215/242.md +12 -10
  27. 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 +37 -36
  28. package/spec/principles/P20-/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
  29. package/spec/principles/P21-/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
  30. package/spec/principles/P22-/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
  31. package/spec/principles/P23-/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
  32. package/spec/principles/P24-/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 +37 -0
  33. package/spec/principles/README.md +47 -39
  34. package/spec/testing//346/265/213/350/257/225/347/255/226/347/225/245.md +27 -16
@@ -4,18 +4,23 @@
4
4
 
5
5
  Tool registry 负责向模型公开动作集合,并统一管理本地工具与 MCP 动态工具。
6
6
 
7
- ## 当前组成
8
-
9
- - 本地内建工具
10
- - mode 过滤后的工具集
11
- - MCP 动态收集到的工具
7
+ ## 当前组成
8
+
9
+ - 本地内建工具
10
+ - mode 过滤后的工具集
11
+ - MCP 动态收集到的工具
12
+ - 统一治理后的 `entries / blocked` 结果
12
13
 
13
14
  ## 当前规则
14
15
 
15
16
  1. 新工具先注册,再暴露给模型。
16
17
  2. tool handler 只做动作,不做控制面真相发明。
17
- 3. skill 不是工具替代品;skill 提供 workflow,tool 提供动作。
18
- 4. MCP 工具也必须经过统一 registry,不走旁路。
18
+ 3. skill 不是工具替代品;skill 提供 workflow,tool 提供动作。
19
+ 4. MCP 工具也必须经过统一 registry,不走旁路。
20
+ 5. 工具暴露顺序、workflow fallback、change / verification signal 约束都由机器治理 metadata 决定,而不是靠 prompt 复述。
21
+ 6. metadata 缺失或不兼容时默认 fail-closed:
22
+ - 内建 / 本地 includeTools 直接报错
23
+ - MCP 工具进入 `blocked`,不暴露给模型
19
24
 
20
25
  ## 工具层职责
21
26
 
@@ -43,37 +48,90 @@ Tool registry 负责向模型公开动作集合,并统一管理本地工具与
43
48
  - `src/tools/shell/`
44
49
  - `src/tools/skills/`
45
50
 
46
- 共享层仍在 `src/tools/` 根目录:
47
-
48
- - `registry.ts`
49
- - `runtimeRegistry.ts`
50
- - `shared.ts`
51
- - `types.ts`
52
- - `changeTracking.ts`
53
-
54
- ## Playwright MCP 当前事实
55
-
56
- 当前 Playwright 浏览器工具通过 runtime registry 暴露为:
57
-
58
- - `mcp_playwright_browser_navigate`
59
- - `mcp_playwright_browser_snapshot`
60
- - `mcp_playwright_browser_click`
51
+ 共享层仍在 `src/tools/` 根目录:
52
+
53
+ - `registry.ts`
54
+ - `runtimeRegistry.ts`
55
+ - `governance.ts`
56
+ - `routing.ts`
57
+ - `shared.ts`
58
+ - `types.ts`
59
+ - `changeTracking.ts`
60
+
61
+ ## Playwright MCP 当前事实
62
+
63
+ 当前 Playwright adapter 通过 runtime registry 暴露一组 `mcp_playwright_browser_*` 工具;这是 adapter surface,不是上层 machine rule。
64
+
65
+ 当前 adapter 层常见名字包括:
66
+
67
+ - `mcp_playwright_browser_navigate`
68
+ - `mcp_playwright_browser_snapshot`
69
+ - `mcp_playwright_browser_click`
61
70
  - `mcp_playwright_browser_type`
62
71
  - `mcp_playwright_browser_take_screenshot`
63
72
  - 以及其他 `mcp_playwright_browser_*`
64
-
65
- 当前优先级策略:
66
-
67
- - runtime registry 会把 Playwright 浏览器工具排到本地文件工具和 shell 工具前面
68
- - request tool priority 会在 web research / browser automation 场景继续把浏览器工具前置
69
- - `run_shell` 的网页抓取只应作为 fallback
73
+
74
+ 当前优先级策略:
75
+
76
+ - runtime registry 先用治理 metadata fail-closed 过滤,再按机器排序暴露工具
77
+ - 浏览器工具会通过治理 metadata 稳定排到本地文件工具和 shell 工具前面
78
+ - request tool priority 会消费同一套 metadata,在 web research / browser automation 场景继续把浏览器 capability 工具前置
79
+ - `run_shell` 与本地文件 detour 在 browser workflow 下只作为 fallback
80
+
81
+ ## 当前治理模型
82
+
83
+ 当前 registry 暴露给机器的不只是 tool schema,还包括:
84
+
85
+ - `entries`: 每个已暴露工具的统一 governance metadata
86
+ - `blocked`: 因 metadata 缺失、MCP 缺少可信只读提示、或治理不兼容而被 fail-closed 的工具
87
+
88
+ 当前 governance metadata 至少回答:
89
+
90
+ - 是否只读 / 会不会修改状态
91
+ - 是否高风险 / destructive
92
+ - 是否要求 change signal / verification signal
93
+ - 是否属于 browser capability
94
+ - browser step 是 `navigate / snapshot / take_screenshot / click / type / other`
95
+ - 是否属于 document-reading capability
96
+ - document kind 是 `doc / image / pdf / ppt / spreadsheet`
97
+ - 是否在特定 workflow 下只能 fallback
98
+ - 是否并发安全
99
+
100
+ ## 当前上层约束
101
+
102
+ 上层 machine rule 当前必须遵守:
103
+
104
+ 1. workflow guard 只认 browser capability / browser step,不认具体 Playwright 工具名。
105
+ 2. tool priority 只认治理 metadata,不认具体 Playwright 工具名。
106
+ 3. document routing hint 只认 `document.read` / `spreadsheet.read` capability,不把 `mineru_*` 名字继续上推。
107
+ 4. acceptance / phase / verification 只认统一 signal,不认 adapter 工具名。
108
+
109
+ ## 当前代码落点
110
+
111
+ - `src/tools/governance.ts`
112
+ - browser capability、browser step、document kind、fail-closed metadata
113
+ - `src/tools/order.ts`
114
+ - 暴露排序
115
+ - `src/agent/toolPriority.ts`
116
+ - request 级 tool priority,消费统一 metadata
117
+ - `src/skills/workflowGuards.ts`
118
+ - 只输出 `suggestedCapability`
119
+ - `src/tools/routing.ts`
120
+ - `document.read` / `spreadsheet.read` capability hint
121
+ - `src/mcp/toolAdapter.ts`
122
+ - adapter 层把 MCP 工具接入 registry,保留 origin 信息
123
+
124
+ ## 对齐说明
125
+
126
+ - adapter 层仍可以保留 `mcp_playwright_browser_*`、`mineru_*` 这类生态名词
127
+ - 但 registry 暴露给上层的真相必须是 capability metadata,而不是生态字符串
70
128
 
71
129
  ## 当前约束
72
130
 
73
- 如果某个动作:
74
-
75
- - 需要明确输入输出
76
- - 不适合塞进 prompt
77
- - 不该让模型自己拼 shell
78
-
79
- 就应该做成工具,而不是继续加提示词。
131
+ 如果某个动作:
132
+
133
+ - 需要明确输入输出
134
+ - 不适合塞进 prompt
135
+ - 不该让模型自己拼 shell
136
+
137
+ 就应该做成工具,而不是继续加提示词。
@@ -36,10 +36,10 @@ skills 已经是标准化 V1,而不是散装 prompt 片段。
36
36
  - `web-research`
37
37
  - `browser-automation`
38
38
 
39
- MinerU 文档 workflow 现在按类别拆成独立工具:
40
-
41
- - `mineru_pdf_read`
42
- - `mineru_image_read`
39
+ MinerU 文档 workflow 现在按类别拆成独立工具:
40
+
41
+ - `mineru_pdf_read`
42
+ - `mineru_image_read`
43
43
  - `mineru_doc_read`
44
44
  - `mineru_ppt_read`
45
45
 
@@ -78,28 +78,64 @@ MinerU 文档 workflow 现在按类别拆成独立工具:
78
78
  - 提供使用策略
79
79
  - 当前是 `web-research` 与 `browser-automation`
80
80
 
81
- 设计原则:
82
-
83
- - 联网能力先做成 `tool` 或 `MCP`
84
- - `skill` 只做 workflow
85
- - 不把底层联网继续堆进 `systemPrompt`
86
-
87
- ## 当前接线点
88
-
89
- 当前 skill / MCP / runtime 的接线点:
90
-
91
- - `src/context/projectContext.ts`
92
- - `src/tools/skills/loadSkillTool.ts`
93
- - `src/agent/systemPrompt.ts`
94
- - `src/agent/runTurn.ts`
95
- - `src/tools/runtimeRegistry.ts`
96
- - `src/mcp/registryIntegration.ts`
97
-
98
- ## 当前约束
99
-
100
- 当前扩展仍必须满足:
101
-
102
- - 不破坏 continuation / compact / recovery
103
- - 不让主循环继续长胖
104
- - 不新造平行技能体系
105
- - 不让 MCP 绕开统一 registry
81
+ 设计原则:
82
+
83
+ - 联网能力先做成 `tool` 或 `MCP`
84
+ - `skill` 只做 workflow
85
+ - 不把底层联网继续堆进 `systemPrompt`
86
+
87
+ ## 当前 capability 边界
88
+
89
+ 当前扩展层已经明确区分:
90
+
91
+ 1. adapter / tool surface
92
+ - 可以保留 `@playwright/mcp`、`mineru_*` 这类生态名词
93
+ 2. runtime governance / workflow / acceptance
94
+ - 只认 capability / signal
95
+ - 不认具体生态字符串
96
+
97
+ 当前上层抽象:
98
+
99
+ - browser capability
100
+ - `browser.navigate`
101
+ - `browser.snapshot`
102
+ - `browser.take_screenshot`
103
+ - `browser.click`
104
+ - `browser.type`
105
+ - document capability
106
+ - `document.read`
107
+ - `spreadsheet.read`
108
+ - acceptance signals
109
+ - `http_endpoint_verified`
110
+ - `web_page_verified`
111
+ - `document_read_completed`
112
+ - `structured_artifact_valid`
113
+
114
+ ## 当前接线点
115
+
116
+ 当前 skill / MCP / runtime 的接线点:
117
+
118
+ - `src/context/projectContext.ts`
119
+ - `src/tools/skills/loadSkillTool.ts`
120
+ - `src/agent/systemPrompt.ts`
121
+ - `src/skills/prompt.ts`
122
+ - `src/agent/runTurn.ts`
123
+ - `src/tools/governance.ts`
124
+ - `src/tools/runtimeRegistry.ts`
125
+ - `src/tools/routing.ts`
126
+ - `src/mcp/registryIntegration.ts`
127
+ - `src/mcp/toolAdapter.ts`
128
+ - `src/agent/acceptance/signals.ts`
129
+
130
+ ## 当前约束
131
+
132
+ 当前扩展仍必须满足:
133
+
134
+ - 不破坏 continuation / compact / recovery
135
+ - 不让主循环继续长胖
136
+ - 不新造平行技能体系
137
+ - 不让 MCP 绕开统一 registry
138
+ - skill prompt 只输出本轮决策相关的 runtime hint(loaded / selected / missing required),不回退成 catalog dump
139
+ - MCP 工具进入 runtime registry 前必须先经过治理 metadata 归一化;安全信息不够时默认 fail-closed
140
+ - browser-first / document routing / workflow fallback 由机器治理逻辑优先决定,prompt 只保留原则级说明
141
+ - adapter 名词允许存在于工具实现、技能名、README、配置与测试中,但不允许继续进入上层 machine rule
@@ -16,12 +16,13 @@
16
16
  - docx / spreadsheet 基础能力
17
17
  - background job
18
18
 
19
- ### 控制面
20
-
21
- - 任务板持久化
22
- - teammate 名册与 inbox
23
- - 协议请求与审批状态
24
- - worktree 绑定与隔离
19
+ ### 控制面
20
+
21
+ - 任务板持久化
22
+ - machine-enforced orchestration lifecycle
23
+ - teammate 名册与 inbox
24
+ - 协议请求与审批状态
25
+ - worktree 绑定与隔离
25
26
 
26
27
  ### 扩展
27
28
 
@@ -18,12 +18,13 @@ Athlete 是一个终端优先的 AI harness。
18
18
 
19
19
  **一个耐跑、可续跑、面向复杂任务的终端智能体框架。**
20
20
 
21
- 它现在最强的价值不是“最会聊天”,而是:
22
-
23
- - 不容易中途断掉
24
- - 出错后会继续排查
25
- - 长任务能自动续跑
26
- - 多步任务有状态落盘
21
+ 它现在最强的价值不是“最会聊天”,而是:
22
+
23
+ - 不容易中途断掉
24
+ - 出错后会继续排查
25
+ - 长任务能自动续跑
26
+ - 多步任务有状态落盘
27
+ - 任务派工和恢复不靠 prompt 记忆
27
28
 
28
29
  ## 下一阶段定位
29
30
 
@@ -31,12 +32,13 @@ Athlete 是一个终端优先的 AI harness。
31
32
 
32
33
  **一个以耐跑主 Agent 为核心、能够统筹任务与技能扩展的总指挥型智能体平台。**
33
34
 
34
- 关键词:
35
-
36
- - 主 Agent 很强
37
- - 复杂任务时会拆分与调度
38
- - skills 是标准扩展口
39
- - 多 Agent 是按需能力,不是默认军团
35
+ 关键词:
36
+
37
+ - 主 Agent 很强
38
+ - 复杂任务时会拆分与调度
39
+ - skills 是标准扩展口
40
+ - 多 Agent 是按需能力,不是默认军团
41
+ - 控制面知道任务为什么 ready / blocked / active / completed
40
42
 
41
43
  ## 目标用户
42
44
 
@@ -16,8 +16,8 @@
16
16
 
17
17
  这条原则直接保护 Athlete 当前最强的“耐跑能力”。
18
18
 
19
- ## 当前对应
20
-
21
- - `src/agent/contextBuilder.ts`
22
- - `src/agent/managedTurn.ts`
23
- - `src/agent/retryPolicy.ts`
19
+ ## 当前对应
20
+
21
+ - `src/agent/context.ts`
22
+ - `src/agent/turn/managed.ts`
23
+ - `src/agent/retryPolicy.ts`
@@ -23,8 +23,8 @@ session 里应该能承接:
23
23
  - verification 状态
24
24
  - task state
25
25
 
26
- ## 当前对应
27
-
28
- - `src/agent/sessionStore.ts`
29
- - `src/agent/taskState.ts`
30
- - `src/agent/verificationState.ts`
26
+ ## 当前对应
27
+
28
+ - `src/agent/session.ts`
29
+ - `src/agent/session/taskState.ts`
30
+ - `src/agent/verification.ts`
@@ -10,13 +10,15 @@
10
10
 
11
11
  Athlete 要做 harness,不做某一家的皮肤。
12
12
 
13
- ## 在 Athlete 里的含义
14
-
15
- - 当前优先支持 OpenAI-compatible 接口
16
- - provider 选择属于配置层,不属于业务层
17
-
18
- ## 当前对应
19
-
20
- - `src/agent/api.ts`
21
- - `src/config/env.ts`
22
- - `src/types.ts`
13
+ ## 在 Athlete 里的含义
14
+
15
+ - 当前优先支持 OpenAI-compatible 接口
16
+ - provider 选择属于配置层,不属于业务层
17
+ - provider-specific fallback、reasoning、tool 兼容性都属于 adapter / capability 层,不属于 kernel 主循环
18
+
19
+ ## 当前对应
20
+
21
+ - `src/agent/provider.ts`
22
+ - `src/agent/api.ts`
23
+ - `src/config/store.ts`
24
+ - `src/types.ts`
@@ -1,36 +1,37 @@
1
- # P18 主循环和文件都不能长胖
2
-
3
- ## 原则
4
-
5
- 主循环不能无限长,文件也不能无限长。
6
-
7
- ## 为什么
8
-
9
- Athlete 以后会继续长总指挥层、skills、角色和协议。
10
-
11
- 如果不控制体积:
12
-
13
- - AI 更容易改坏系统
14
- - 人更难定位职责
15
- - 小改动会牵动全身
16
-
17
- ## 铁律
18
-
19
- 1. 单文件默认不超过 300 行。
20
- 2. 文件超过 300 行时,必须先检查是不是职责耦合。
21
- 3. 只要出现“一个文件里有两件以上主要事情”,优先拆目录或拆文件。
22
- 4. 主循环只保留全局调度规则,不塞模块细节。
23
-
24
- ## Athlete 当前阶段的执行方式
25
-
26
- - 优先新增目录,不优先堆到已有大文件
27
- - 一类状态一个 store
28
- - 一类工具一个子目录
29
- - 一类角色一个清晰边界
30
-
31
- ## 当前对应
32
-
33
- - `src/agent/runTurn.ts`
34
- - `src/tools/`
35
- - `src/team/`
36
- - `src/tasks/`
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/modules/lightweight-context-runtime.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/architecture/运行时循环.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/modules/session-resume-compact.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,37 @@
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
+
32
+ ## 当前对应
33
+
34
+ - `spec/`
35
+ - `tests/`
36
+ - `src/agent/`
37
+ - `src/tools/`