pi-claude-supervisor 0.2.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/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.cn.md +98 -0
- package/README.md +122 -0
- package/docs/architecture.md +122 -0
- package/docs/engineering-plan.md +918 -0
- package/docs/implementation-review.md +62 -0
- package/docs/independent-review.md +332 -0
- package/docs/releasing.md +112 -0
- package/docs/testing.md +109 -0
- package/docs/transport-spike-2026-09-12.md +94 -0
- package/package.json +72 -0
- package/src/config.ts +35 -0
- package/src/decision-session-store.ts +170 -0
- package/src/decision-worker.ts +245 -0
- package/src/events.ts +179 -0
- package/src/index.ts +500 -0
- package/src/notifications.ts +85 -0
- package/src/policy.ts +61 -0
- package/src/state.ts +44 -0
- package/src/supervisor.ts +626 -0
- package/src/types.ts +122 -0
- package/src/verifier.ts +40 -0
- package/src/worker/environment.ts +31 -0
- package/src/worker/process-adapter.ts +604 -0
|
@@ -0,0 +1,918 @@
|
|
|
1
|
+
# Pi Claude Supervisor 完整方案
|
|
2
|
+
|
|
3
|
+
> 文档状态:方案设计稿 / MVP 实施基线
|
|
4
|
+
> 目标项目目录:`pi-claude-supervisor`
|
|
5
|
+
> 适用对象:W、项目负责人、实现人员、评审人员
|
|
6
|
+
|
|
7
|
+
## 1. Executive Summary
|
|
8
|
+
|
|
9
|
+
本项目的目标不是替代 Claude Code,也不是简单地给 Claude 增加一个自动 `continue` 脚本,而是建立一个外部工程监督回路:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
用户
|
|
13
|
+
│
|
|
14
|
+
▼
|
|
15
|
+
Pi Supervisor
|
|
16
|
+
│ 观察、判断、纠偏、验收
|
|
17
|
+
▼
|
|
18
|
+
Claude Code Worker
|
|
19
|
+
│ 编码、测试、修改工作树
|
|
20
|
+
▼
|
|
21
|
+
代码、测试结果、git diff、运行证据
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
核心角色定义:
|
|
25
|
+
|
|
26
|
+
- **Pi Supervisor**:负责任务约束、生命周期控制、停顿判断、人工升级、证据收集和最终验收。
|
|
27
|
+
- **Claude Code Worker**:负责根据任务执行代码修改、运行测试和汇报当前状态。
|
|
28
|
+
- **Human**:处理产品决策、架构分歧、危险操作和 Supervisor 无法可靠判断的问题。
|
|
29
|
+
- **Independent Verifier**:在 Worker 声称完成后,以只读方式重新检查代码和验证结果。
|
|
30
|
+
|
|
31
|
+
最终目标是让 Claude Code 能够在较长任务中持续工作,同时避免以下问题:
|
|
32
|
+
|
|
33
|
+
1. Worker 因提问或短暂停顿导致任务中断。
|
|
34
|
+
2. Worker 在架构选择上偏离既定约束。
|
|
35
|
+
3. Worker 声称完成,但没有实际完成目标。
|
|
36
|
+
4. Supervisor 因误判导致无限循环、危险操作或不可审计的修改。
|
|
37
|
+
5. 人工无法随时接管或恢复任务。
|
|
38
|
+
|
|
39
|
+
**总体判断:架构方向可以 GO。先完成兼容性 Spike、生命周期和故障恢复验证;低权限用户、OS sandbox 与网络隔离不作为当前主线或硬性阻塞,按调用者明确授权和宿主机策略运行,后续再做安全加固。**
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2. 背景与问题定义
|
|
44
|
+
|
|
45
|
+
### 2.1 当前问题
|
|
46
|
+
|
|
47
|
+
Claude Code 适合作为实际开发 Worker,但在长时间任务中可能出现:
|
|
48
|
+
|
|
49
|
+
- 等待用户回答;
|
|
50
|
+
- 询问“是否继续”;
|
|
51
|
+
- 长时间无输出但进程仍存活;
|
|
52
|
+
- 运行测试或外部命令时卡住;
|
|
53
|
+
- 选择了不符合项目约束的实现方案;
|
|
54
|
+
- 在未完成全部目标时提前停止;
|
|
55
|
+
- 输出了“已完成”,但没有可复现的证据。
|
|
56
|
+
|
|
57
|
+
单纯使用正则匹配并自动发送 `continue` 存在明显风险:它只能识别表面语言,无法理解当前任务、代码差异、项目规范和风险等级。
|
|
58
|
+
|
|
59
|
+
### 2.2 目标问题
|
|
60
|
+
|
|
61
|
+
本项目需要解决的是一个**工程控制问题**:
|
|
62
|
+
|
|
63
|
+
> 在不剥夺人工控制权的前提下,让一个外部 Supervisor 观察和管理 Claude Code 的执行过程,并使用可靠证据判断任务是否真的完成。
|
|
64
|
+
|
|
65
|
+
### 2.3 需求边界
|
|
66
|
+
|
|
67
|
+
第一阶段明确只支持:
|
|
68
|
+
|
|
69
|
+
- 单仓库;
|
|
70
|
+
- 每个任务一个 Claude Worker;
|
|
71
|
+
- 每个并行任务使用独立 worktree/工作目录;
|
|
72
|
+
- Pi 负责监督和验收;
|
|
73
|
+
- 人工可以随时接管;
|
|
74
|
+
- 不自动 merge、deploy 或 release。
|
|
75
|
+
|
|
76
|
+
当前扩展已支持多个独立任务会话并行推进,但不允许活动会话共享同一
|
|
77
|
+
工作目录。事件日志由跨进程锁协调,状态和 watchdog 按会话隔离。
|
|
78
|
+
|
|
79
|
+
暂不支持:
|
|
80
|
+
|
|
81
|
+
- 多 Worker 在同一 worktree 的无协调协作;
|
|
82
|
+
- 自动生产发布;
|
|
83
|
+
- 自动处理所有架构和产品决策;
|
|
84
|
+
- 将网络一律封禁或声称有未经验证的域名 allowlist;
|
|
85
|
+
- 无人工审批的危险操作;
|
|
86
|
+
- 用 Worker 自己的报告代替独立验收。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 3. 设计原则
|
|
91
|
+
|
|
92
|
+
### 3.1 Worker 和 Supervisor 职责分离
|
|
93
|
+
|
|
94
|
+
Claude 负责执行,Pi 负责控制和判断。不能让 Worker 自己同时担任执行者、验收者和最终批准者。
|
|
95
|
+
|
|
96
|
+
### 3.2 确定性策略优先于 LLM 判断
|
|
97
|
+
|
|
98
|
+
LLM 可以帮助理解上下文,但不能绕过硬性安全策略。所有高风险动作必须先经过确定性 Policy Gate。
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
事件
|
|
102
|
+
│
|
|
103
|
+
▼
|
|
104
|
+
确定性 Policy Gate
|
|
105
|
+
│
|
|
106
|
+
├── 明确禁止:拒绝
|
|
107
|
+
├── 必须人工:升级
|
|
108
|
+
├── 低风险且白名单:允许
|
|
109
|
+
└── 需要语义理解:交给 Supervisor LLM
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 3.3 证据优先于声明
|
|
113
|
+
|
|
114
|
+
Worker 说“完成了”不是完成证据。最终状态必须由以下信息支持:
|
|
115
|
+
|
|
116
|
+
- 当前任务目标;
|
|
117
|
+
- 任务清单;
|
|
118
|
+
- 实际 git diff;
|
|
119
|
+
- 测试、lint、typecheck、build 结果;
|
|
120
|
+
- 约束检查结果;
|
|
121
|
+
- 独立 Reviewer 报告。
|
|
122
|
+
|
|
123
|
+
### 3.4 人工拥有最高控制权
|
|
124
|
+
|
|
125
|
+
人工可以:
|
|
126
|
+
|
|
127
|
+
- 暂停 Worker;
|
|
128
|
+
- 修改 Supervisor 指令;
|
|
129
|
+
- 直接回答问题;
|
|
130
|
+
- 接管终端;
|
|
131
|
+
- 强制终止任务;
|
|
132
|
+
- 否决 Supervisor 的继续决定。
|
|
133
|
+
|
|
134
|
+
Supervisor 任何时候都不能阻止人工接管。
|
|
135
|
+
|
|
136
|
+
### 3.5 默认保守,逐步自动化
|
|
137
|
+
|
|
138
|
+
MVP 只自动处理低风险、可逆、规则明确的情况。随着测试和审计证据增加,再逐步开放更多自动化能力。
|
|
139
|
+
|
|
140
|
+
### 3.6 所有重要动作可追溯
|
|
141
|
+
|
|
142
|
+
每次状态变更、发送给 Worker 的指令、人工操作、验证结果都必须写入事件日志。
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 4. 推荐总体架构
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
┌──────────────────────────────────────────────┐
|
|
150
|
+
│ User / Human │
|
|
151
|
+
│ 接管、审批、回答决策、终止任务 │
|
|
152
|
+
└─────────────────────┬────────────────────────┘
|
|
153
|
+
│
|
|
154
|
+
▼
|
|
155
|
+
┌──────────────────────────────────────────────┐
|
|
156
|
+
│ Pi Supervisor │
|
|
157
|
+
│ │
|
|
158
|
+
│ Task Context │
|
|
159
|
+
│ State Machine │
|
|
160
|
+
│ Policy Gate │
|
|
161
|
+
│ Supervisor Judgment │
|
|
162
|
+
│ Event Log │
|
|
163
|
+
│ Budget / Timeout Controller │
|
|
164
|
+
│ Verification Coordinator │
|
|
165
|
+
└─────────────────────┬────────────────────────┘
|
|
166
|
+
│ Worker Adapter
|
|
167
|
+
▼
|
|
168
|
+
┌──────────────────────────────────────────────┐
|
|
169
|
+
│ Claude Code Worker │
|
|
170
|
+
│ │
|
|
171
|
+
│ PTY 或 headless JSONL │
|
|
172
|
+
│ 实时输出 │
|
|
173
|
+
│ 输入 / 继续 / 纠偏 │
|
|
174
|
+
│ session resume │
|
|
175
|
+
└─────────────────────┬────────────────────────┘
|
|
176
|
+
│
|
|
177
|
+
▼
|
|
178
|
+
┌──────────────────────────────────────────────┐
|
|
179
|
+
│ Repository / Worktree │
|
|
180
|
+
│ source code / tests / git diff │
|
|
181
|
+
└─────────────────────┬────────────────────────┘
|
|
182
|
+
│
|
|
183
|
+
▼
|
|
184
|
+
┌──────────────────────────────────────────────┐
|
|
185
|
+
│ Independent Verifier │
|
|
186
|
+
│ 测试、静态检查、diff 审核、安全和证据检查 │
|
|
187
|
+
└──────────────────────────────────────────────┘
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 4.1 Worker Adapter
|
|
191
|
+
|
|
192
|
+
Supervisor 不应直接依赖某一个 package 的内部 API,而应定义自己的 Worker Adapter 接口:
|
|
193
|
+
|
|
194
|
+
```ts
|
|
195
|
+
interface WorkerAdapter {
|
|
196
|
+
start(input: WorkerStartInput): Promise<WorkerHandle>;
|
|
197
|
+
getStatus(handle: WorkerHandle): Promise<WorkerStatus>;
|
|
198
|
+
readOutput(handle: WorkerHandle): Promise<WorkerOutputChunk[]>;
|
|
199
|
+
send(handle: WorkerHandle, message: string): Promise<void>;
|
|
200
|
+
pause(handle: WorkerHandle): Promise<void>;
|
|
201
|
+
resume(handle: WorkerHandle): Promise<void>;
|
|
202
|
+
takeover(handle: WorkerHandle): Promise<void>;
|
|
203
|
+
stop(handle: WorkerHandle, reason: string): Promise<void>;
|
|
204
|
+
resumeSession(sessionId: string): Promise<WorkerHandle>;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Adapter 必须屏蔽以下实现差异:
|
|
209
|
+
|
|
210
|
+
- PTY 交互模式;
|
|
211
|
+
- headless JSONL 模式;
|
|
212
|
+
- 不同 package 的事件格式;
|
|
213
|
+
- session ID 和进程 ID 的差异;
|
|
214
|
+
- 退出码和异常退出语义。
|
|
215
|
+
|
|
216
|
+
### 4.2 初始组件策略
|
|
217
|
+
|
|
218
|
+
不要一开始同时引入所有候选项目。
|
|
219
|
+
|
|
220
|
+
建议顺序:
|
|
221
|
+
|
|
222
|
+
1. 优先验证 `pi-interactive-shell` 是否能稳定完成启动、观察、输入和人工接管。
|
|
223
|
+
2. 借鉴 `pi-goals` 的 Goal / Evidence / Sign-off 思路,而不是直接假设它可以作为 Claude Worker。
|
|
224
|
+
3. 如需 headless watchdog,再验证 `pi-claude-code` 类方案。
|
|
225
|
+
4. 将 `pi-harness-delegate` 作为 review、resume 或独立任务执行候选。
|
|
226
|
+
5. 所有组件通过 `WorkerAdapter` 接入,避免多个 package 重复管理生命周期。
|
|
227
|
+
|
|
228
|
+
候选项目的具体 API、版本、发布时间和 Claude 兼容性必须以实际安装和测试结果为准。当前调研文档中的“70%~85% 已完成”没有可审计计算依据,不能作为工程承诺。
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 5. 状态机设计
|
|
233
|
+
|
|
234
|
+
### 5.1 状态定义
|
|
235
|
+
|
|
236
|
+
```text
|
|
237
|
+
CREATED
|
|
238
|
+
↓
|
|
239
|
+
STARTING
|
|
240
|
+
↓
|
|
241
|
+
RUNNING
|
|
242
|
+
├── WAITING
|
|
243
|
+
├── BLOCKED
|
|
244
|
+
├── DECISION_REQUIRED
|
|
245
|
+
├── VERIFYING
|
|
246
|
+
├── FAILED
|
|
247
|
+
└── STOPPED
|
|
248
|
+
|
|
249
|
+
WAITING ────────────────┐
|
|
250
|
+
│ │
|
|
251
|
+
├── CONTINUE ─────────┘
|
|
252
|
+
├── ANSWER ────────────> RUNNING
|
|
253
|
+
├── REDIRECT ──────────> RUNNING
|
|
254
|
+
└── ESCALATE ──────────> HUMAN_REQUIRED
|
|
255
|
+
|
|
256
|
+
RUNNING ── Worker 报告完成 ──> VERIFYING
|
|
257
|
+
VERIFYING ── 通过 ──> COMPLETE
|
|
258
|
+
VERIFYING ── 失败 ──> REJECTED
|
|
259
|
+
REJECTED ── 修复 ──> RUNNING
|
|
260
|
+
HUMAN_REQUIRED ── 人工决定 ──> RUNNING / STOPPED
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 5.2 状态说明
|
|
264
|
+
|
|
265
|
+
| 状态 | 含义 | 自动动作 |
|
|
266
|
+
|---|---|---|
|
|
267
|
+
| `CREATED` | 任务已创建但尚未执行 | 校验任务配置 |
|
|
268
|
+
| `STARTING` | 正在启动 Worker | 等待启动事件 |
|
|
269
|
+
| `RUNNING` | Worker 正在工作 | 采集输出和指标 |
|
|
270
|
+
| `WAITING` | Worker 正常等待输入 | 判断是否可自动处理 |
|
|
271
|
+
| `BLOCKED` | Worker 被异常、环境或依赖阻塞 | 收集原因并升级 |
|
|
272
|
+
| `DECISION_REQUIRED` | 需要架构/产品/权限决策 | 默认人工审批 |
|
|
273
|
+
| `HUMAN_REQUIRED` | 已明确升级人工 | 暂停自动动作 |
|
|
274
|
+
| `VERIFYING` | 执行独立验收 | 只执行验证流程 |
|
|
275
|
+
| `REJECTED` | 验收失败,需要修复 | 生成修复任务 |
|
|
276
|
+
| `COMPLETE` | 所有目标和验收证据满足 | 允许 sign-off |
|
|
277
|
+
| `FAILED` | 系统或 Worker 不可恢复失败 | 保留现场并报告 |
|
|
278
|
+
| `STOPPED` | 用户或策略主动停止 | 不再自动恢复 |
|
|
279
|
+
|
|
280
|
+
### 5.3 状态转换要求
|
|
281
|
+
|
|
282
|
+
每次转换必须记录:
|
|
283
|
+
|
|
284
|
+
```json
|
|
285
|
+
{
|
|
286
|
+
"event": "STATE_CHANGED",
|
|
287
|
+
"from": "WAITING",
|
|
288
|
+
"to": "DECISION_REQUIRED",
|
|
289
|
+
"reason": "Worker 提出架构选择",
|
|
290
|
+
"actor": "supervisor",
|
|
291
|
+
"timestamp": "2026-01-01T00:00:00Z",
|
|
292
|
+
"evidenceRefs": ["event-123", "diff-456"]
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
禁止出现:
|
|
297
|
+
|
|
298
|
+
- 未记录原因的状态跳转;
|
|
299
|
+
- Worker 自己直接设置 `COMPLETE`;
|
|
300
|
+
- 未经过 `VERIFYING` 直接进入 `COMPLETE`;
|
|
301
|
+
- 人工已接管后 Supervisor 仍自动发送指令;
|
|
302
|
+
- 同一事件重复触发无限 continue。
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 6. Supervisor 决策协议
|
|
307
|
+
|
|
308
|
+
### 6.1 结构化决策类型
|
|
309
|
+
|
|
310
|
+
```text
|
|
311
|
+
CONTINUE
|
|
312
|
+
ANSWER
|
|
313
|
+
REDIRECT
|
|
314
|
+
REVIEW
|
|
315
|
+
ESCALATE_TO_HUMAN
|
|
316
|
+
COMPLETE_CANDIDATE
|
|
317
|
+
RETRY
|
|
318
|
+
STOP
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### 6.2 决策 JSON
|
|
322
|
+
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"decision": "REDIRECT",
|
|
326
|
+
"confidence": 0.92,
|
|
327
|
+
"reason": "Worker 当前方案违反冻结的核心数据模型约束",
|
|
328
|
+
"instruction": "保留现有 relation 模型,改为补充索引并添加迁移测试",
|
|
329
|
+
"risk": "medium",
|
|
330
|
+
"requiresHuman": false,
|
|
331
|
+
"evidenceRequired": [
|
|
332
|
+
"migration test",
|
|
333
|
+
"unit tests",
|
|
334
|
+
"git diff review"
|
|
335
|
+
],
|
|
336
|
+
"policyRefs": ["core-spec-v0.1", "task-acceptance-03"]
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### 6.3 自动继续规则
|
|
341
|
+
|
|
342
|
+
可以自动 `CONTINUE` 的条件:
|
|
343
|
+
|
|
344
|
+
- Worker 只是询问是否继续当前已经批准的步骤;
|
|
345
|
+
- 当前动作属于任务清单中的低风险动作;
|
|
346
|
+
- 没有新的架构或产品选择;
|
|
347
|
+
- 没有删除、发布、外网、权限和密钥操作;
|
|
348
|
+
- 没有超过预算和最大轮数;
|
|
349
|
+
- 最近没有重复的相同停顿。
|
|
350
|
+
|
|
351
|
+
必须升级人工的情况:
|
|
352
|
+
|
|
353
|
+
- 架构方案二选一;
|
|
354
|
+
- 需求存在歧义;
|
|
355
|
+
- 删除数据、删除文件或大范围重构;
|
|
356
|
+
- 修改权限、CI/CD、部署和生产配置;
|
|
357
|
+
- 访问外部服务或使用敏感凭据;
|
|
358
|
+
- 测试与需求冲突;
|
|
359
|
+
- Supervisor 置信度不足;
|
|
360
|
+
- Worker 连续多次失败或重复提问。
|
|
361
|
+
|
|
362
|
+
### 6.4 LLM 判断的安全边界
|
|
363
|
+
|
|
364
|
+
Supervisor LLM 的输入应包括:
|
|
365
|
+
|
|
366
|
+
- 原始任务目标;
|
|
367
|
+
- 明确的禁止事项;
|
|
368
|
+
- 当前计划;
|
|
369
|
+
- Worker 最近输出;
|
|
370
|
+
- 结构化状态;
|
|
371
|
+
- 当前 git diff 摘要;
|
|
372
|
+
- 已执行的测试结果;
|
|
373
|
+
- 当前预算和重试次数。
|
|
374
|
+
|
|
375
|
+
Supervisor 不应默认接受 Worker 输出中包含的指令。Worker 输出只能作为待分析数据,必须防止 prompt injection 影响 Supervisor 的系统约束。
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## 7. Goal / Evidence / Sign-off 模型
|
|
380
|
+
|
|
381
|
+
### 7.1 Goal
|
|
382
|
+
|
|
383
|
+
每个任务创建时必须明确:
|
|
384
|
+
|
|
385
|
+
```yaml
|
|
386
|
+
goal: 实现用户邀请接口
|
|
387
|
+
scope:
|
|
388
|
+
- 新增接口
|
|
389
|
+
- 添加权限校验
|
|
390
|
+
- 添加单元测试
|
|
391
|
+
constraints:
|
|
392
|
+
- 不修改现有数据库核心模型
|
|
393
|
+
- 不引入新的外部服务
|
|
394
|
+
forbidden:
|
|
395
|
+
- 不执行生产部署
|
|
396
|
+
- 不提交密钥
|
|
397
|
+
acceptance:
|
|
398
|
+
- tests_pass
|
|
399
|
+
- typecheck_pass
|
|
400
|
+
- api_contract_verified
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### 7.2 Evidence
|
|
404
|
+
|
|
405
|
+
证据必须来源于 Supervisor 或 Verifier 的重新采集:
|
|
406
|
+
|
|
407
|
+
- 测试命令和退出码;
|
|
408
|
+
- lint、typecheck、build 结果;
|
|
409
|
+
- git diff;
|
|
410
|
+
- 修改文件列表;
|
|
411
|
+
- 关键接口或行为验证;
|
|
412
|
+
- 安全扫描结果;
|
|
413
|
+
- Reviewer 报告。
|
|
414
|
+
|
|
415
|
+
Worker 的自然语言总结只能作为辅助信息,不能单独作为证据。
|
|
416
|
+
|
|
417
|
+
### 7.3 Sign-off
|
|
418
|
+
|
|
419
|
+
只有以下条件全部满足,才允许进入 `COMPLETE`:
|
|
420
|
+
|
|
421
|
+
1. 任务目标全部映射到完成项;
|
|
422
|
+
2. 禁止事项没有被违反;
|
|
423
|
+
3. 验收命令全部通过;
|
|
424
|
+
4. 当前 diff 在预期范围内;
|
|
425
|
+
5. 没有未解决的人工决策;
|
|
426
|
+
6. 独立 Reviewer 没有 P0/P1 阻塞项;
|
|
427
|
+
7. 未超出时间、轮数和费用预算。
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
## 8. 独立验收方案
|
|
432
|
+
|
|
433
|
+
### 8.1 验收原则
|
|
434
|
+
|
|
435
|
+
Reviewer 默认只读,不直接修改工作树。发现问题时输出结构化报告,再由 Worker 进入新的修复轮次。
|
|
436
|
+
|
|
437
|
+
这样可以避免:
|
|
438
|
+
|
|
439
|
+
- Reviewer 和 Worker 互相覆盖证据;
|
|
440
|
+
- Reviewer 修改后无法知道原始问题;
|
|
441
|
+
- 验收与实现职责混合;
|
|
442
|
+
- 审计时无法重现过程。
|
|
443
|
+
|
|
444
|
+
### 8.2 验收流程
|
|
445
|
+
|
|
446
|
+
```text
|
|
447
|
+
Worker 声称完成
|
|
448
|
+
↓
|
|
449
|
+
冻结当前快照和 git diff
|
|
450
|
+
↓
|
|
451
|
+
重新执行测试、lint、typecheck、build
|
|
452
|
+
↓
|
|
453
|
+
检查任务目标与禁止事项
|
|
454
|
+
↓
|
|
455
|
+
只读 Reviewer 审核 diff
|
|
456
|
+
↓
|
|
457
|
+
全部通过?
|
|
458
|
+
├── 是:COMPLETE / SIGN-OFF
|
|
459
|
+
└── 否:REJECTED / 生成修复任务
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### 8.3 验收报告格式
|
|
463
|
+
|
|
464
|
+
```json
|
|
465
|
+
{
|
|
466
|
+
"verdict": "REJECT",
|
|
467
|
+
"summary": "权限校验未覆盖管理员路径",
|
|
468
|
+
"findings": [
|
|
469
|
+
{
|
|
470
|
+
"severity": "P1",
|
|
471
|
+
"file": "src/api/invite.ts",
|
|
472
|
+
"line": 42,
|
|
473
|
+
"message": "缺少角色校验",
|
|
474
|
+
"requiredFix": "补充管理员和普通用户的权限测试"
|
|
475
|
+
}
|
|
476
|
+
],
|
|
477
|
+
"tests": {
|
|
478
|
+
"unit": "passed",
|
|
479
|
+
"typecheck": "passed",
|
|
480
|
+
"security": "failed"
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## 9. MVP 分阶段实施计划
|
|
488
|
+
|
|
489
|
+
### Phase 0:兼容性 Spike
|
|
490
|
+
|
|
491
|
+
目标:证明底层 Worker 控制链路可用。
|
|
492
|
+
|
|
493
|
+
工作内容:
|
|
494
|
+
|
|
495
|
+
- 固定 Pi、Claude Code 和候选 package 版本;
|
|
496
|
+
- 实现最小 Worker Adapter;
|
|
497
|
+
- 启动 Claude;
|
|
498
|
+
- 读取实时输出;
|
|
499
|
+
- 发送输入;
|
|
500
|
+
- 检测退出和异常;
|
|
501
|
+
- 实现人工接管;
|
|
502
|
+
- 验证 session resume;
|
|
503
|
+
- 保存最小事件日志。
|
|
504
|
+
|
|
505
|
+
通过标准:
|
|
506
|
+
|
|
507
|
+
- 4 个固定场景全部可重复;
|
|
508
|
+
- 不出现输入丢失;
|
|
509
|
+
- 不出现进程孤儿;
|
|
510
|
+
- 人工可随时接管;
|
|
511
|
+
- 异常退出可以被识别并报告。
|
|
512
|
+
|
|
513
|
+
### Phase 1:安全 MVP
|
|
514
|
+
|
|
515
|
+
范围:
|
|
516
|
+
|
|
517
|
+
- 单仓库;
|
|
518
|
+
- 单 Worker;
|
|
519
|
+
- 单 worktree;
|
|
520
|
+
- 单任务;
|
|
521
|
+
- 低风险自动 continue;
|
|
522
|
+
- 高风险人工升级;
|
|
523
|
+
- 最大执行时间和最大轮数;
|
|
524
|
+
- 基础 Goal / Evidence / Sign-off;
|
|
525
|
+
- 基础验证命令。
|
|
526
|
+
|
|
527
|
+
暂不做:
|
|
528
|
+
|
|
529
|
+
- 自由 LLM 决策;
|
|
530
|
+
- 自动修复;
|
|
531
|
+
- 多 Worker;
|
|
532
|
+
- 自动 merge/deploy。
|
|
533
|
+
|
|
534
|
+
### Phase 2:Supervisor 决策层
|
|
535
|
+
|
|
536
|
+
工作内容:
|
|
537
|
+
|
|
538
|
+
- 完整状态机;
|
|
539
|
+
- 结构化决策协议;
|
|
540
|
+
- Policy Gate;
|
|
541
|
+
- Supervisor LLM 判断;
|
|
542
|
+
- WAITING、BLOCKED、DECISION_REQUIRED 分类;
|
|
543
|
+
- 重复停顿检测;
|
|
544
|
+
- 任务持久化和恢复。
|
|
545
|
+
|
|
546
|
+
### Phase 3:独立验收
|
|
547
|
+
|
|
548
|
+
工作内容:
|
|
549
|
+
|
|
550
|
+
- 干净快照验证;
|
|
551
|
+
- 测试、lint、typecheck、build;
|
|
552
|
+
- 只读 Reviewer;
|
|
553
|
+
- 结构化 findings;
|
|
554
|
+
- 修复轮次和重新验证;
|
|
555
|
+
- 证据归档。
|
|
556
|
+
|
|
557
|
+
### Phase 4:生产化与安全加固(非当前主线)
|
|
558
|
+
|
|
559
|
+
生命周期正确性和可审计性完成后再推进:
|
|
560
|
+
|
|
561
|
+
- 可选 OS sandbox、低权限用户和网络白名单;
|
|
562
|
+
- 密钥隔离;
|
|
563
|
+
- 依赖和版本锁定;
|
|
564
|
+
- 审计日志;
|
|
565
|
+
- 监控和告警;
|
|
566
|
+
- 费用控制;
|
|
567
|
+
- 灰度运行;
|
|
568
|
+
- 故障恢复和人工值守。
|
|
569
|
+
|
|
570
|
+
本阶段不阻塞当前 Supervisor 功能、Worker 生命周期、进程组清理、resume
|
|
571
|
+
和独立验收工作。Worker 可在用户明确授权及宿主机策略允许的权限范围内运行,
|
|
572
|
+
但不自动 merge、deploy、release 或 publish。
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
## 10. Spike 测试矩阵
|
|
577
|
+
|
|
578
|
+
| 场景 | 预期行为 | 通过标准 |
|
|
579
|
+
|---|---|---|
|
|
580
|
+
| 正常完成 | Worker 完成任务并退出 | Supervisor 收集 diff 和测试证据 |
|
|
581
|
+
| 普通确认 | Worker 询问是否继续已批准步骤 | 自动发送一次 continue |
|
|
582
|
+
| 架构决策 | Worker 提出两种实现方案 | 升级人工,不自动选择 |
|
|
583
|
+
| 长时间无输出 | Worker 无输出但进程仍在 | 触发 watchdog,先检查再决定 |
|
|
584
|
+
| Worker 崩溃 | 进程异常退出 | 记录退出原因,可恢复或升级 |
|
|
585
|
+
| 测试失败 | Worker 声称完成但测试失败 | 进入 REJECTED 或修复轮次 |
|
|
586
|
+
| 重复提问 | Worker 多轮重复等待 | 触发人工升级,禁止无限 continue |
|
|
587
|
+
| 危险命令 | 删除、发布、使用密钥等 | 被 Policy Gate 拦截 |
|
|
588
|
+
| 人工接管 | 用户接管终端 | Supervisor 停止自动发送指令 |
|
|
589
|
+
| session 恢复 | Supervisor 重启 | 根据持久化状态恢复或安全暂停 |
|
|
590
|
+
|
|
591
|
+
---
|
|
592
|
+
|
|
593
|
+
## 11. 安全设计
|
|
594
|
+
|
|
595
|
+
### 11.1 权限控制
|
|
596
|
+
|
|
597
|
+
权限不是“一律拒绝”,而是分层处理:
|
|
598
|
+
|
|
599
|
+
- Claude Code 自身负责工具级权限请求和用户交互;
|
|
600
|
+
- Supervisor 对 Worker 启动命令做确定性分类;
|
|
601
|
+
- 明确破坏性或绕过权限的参数仍拒绝;
|
|
602
|
+
- `review` 命令通过 Pi UI 请求用户批准,批准结果写入事件日志;
|
|
603
|
+
- 普通联网命令默认不因“联网”本身拒绝,下载后直接交给 shell 的模式要求人工复核;
|
|
604
|
+
- 无交互 UI 时不能伪造批准,review 命令失败关闭。
|
|
605
|
+
|
|
606
|
+
### 11.1.1 多会话与活跃请求
|
|
607
|
+
|
|
608
|
+
每个任务会话拥有独立 Supervisor、Worker handle、turn budget、watchdog
|
|
609
|
+
和状态机。共享 EventLog 使用原子 lock directory、owner PID、超时和存活
|
|
610
|
+
检测;写入前刷新磁盘序号,避免多个 Pi 进程产生重复序号。
|
|
611
|
+
|
|
612
|
+
Claude JSONL adapter 追踪 `activeRequests`、`lastInputAt` 和
|
|
613
|
+
`lastOutputAt`,以 `result` 记录作为一轮完成信号。Supervisor/UI 可通过
|
|
614
|
+
`poll` 或 `sessions` 查看各会话进度;`poll all` 批量观察活动会话。当前不
|
|
615
|
+
自动调度任务依赖、不在同一工作树合并变更,也不把“有输出”当作已完成。
|
|
616
|
+
|
|
617
|
+
MVP 默认:
|
|
618
|
+
|
|
619
|
+
- 使用独立 worktree,活动会话之间不得共享或重叠工作目录;
|
|
620
|
+
- 权限和网络不作一律封禁,由调用者显式配置并承担宿主机权限责任;
|
|
621
|
+
- 凭据仍按最小必要继承,避免无意泄露;
|
|
622
|
+
- 明确危险命令、权限绕过参数和生产发布动作仍需 Policy Gate/人工批准;
|
|
623
|
+
- 不自动 merge、deploy、release 或 publish。
|
|
624
|
+
|
|
625
|
+
### 11.2 危险操作
|
|
626
|
+
|
|
627
|
+
以下操作必须人工确认:
|
|
628
|
+
|
|
629
|
+
- `rm`、批量删除、数据库迁移破坏性操作;
|
|
630
|
+
- `git reset --hard`、强制 push;
|
|
631
|
+
- 修改 CI/CD、部署和生产配置;
|
|
632
|
+
- 发送外部请求;
|
|
633
|
+
- 读取或写入密钥;
|
|
634
|
+
- 发布 npm/package/release;
|
|
635
|
+
- 自动 merge;
|
|
636
|
+
- 启动高权限命令。
|
|
637
|
+
|
|
638
|
+
### 11.3 Prompt Injection 防护
|
|
639
|
+
|
|
640
|
+
- Worker 输出视为不可信内容;
|
|
641
|
+
- Supervisor 的系统约束不能被 Worker 覆盖;
|
|
642
|
+
- 工具调用前必须经过 Policy Gate;
|
|
643
|
+
- 外部内容、README、issue 和日志不能直接改变安全策略;
|
|
644
|
+
- 重要决策需要结构化证据。
|
|
645
|
+
|
|
646
|
+
### 11.4 日志脱敏
|
|
647
|
+
|
|
648
|
+
日志中禁止保存:
|
|
649
|
+
|
|
650
|
+
- API key;
|
|
651
|
+
- token;
|
|
652
|
+
- cookie;
|
|
653
|
+
- 密码;
|
|
654
|
+
- 完整私钥;
|
|
655
|
+
- 未脱敏的用户隐私数据。
|
|
656
|
+
|
|
657
|
+
---
|
|
658
|
+
|
|
659
|
+
## 12. 成本、超时和失控控制
|
|
660
|
+
|
|
661
|
+
必须配置以下限制:
|
|
662
|
+
|
|
663
|
+
```yaml
|
|
664
|
+
limits:
|
|
665
|
+
# Long development-task defaults; each task may override them.
|
|
666
|
+
maxTaskDuration: 4h
|
|
667
|
+
maxSupervisorRounds: 100
|
|
668
|
+
maxWorkerRestarts: 3
|
|
669
|
+
maxRepeatedContinue: 3
|
|
670
|
+
maxNoOutputDuration: 20m
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
控制规则:
|
|
674
|
+
|
|
675
|
+
- 相同输出和相同停顿不得无限触发 continue;
|
|
676
|
+
- 超过最大轮数必须升级人工;
|
|
677
|
+
- Supervisor 自身异常时默认暂停 Worker,而不是继续放行;
|
|
678
|
+
- Worker 重启必须保存原始现场;
|
|
679
|
+
- 任务恢复时先进入 `HUMAN_REQUIRED` 或 `VERIFYING`,不能盲目继续;
|
|
680
|
+
- 时间、自动轮数和重试次数必须记录;模型供应商自身的上下文/token 限制不由本项目重复管理。
|
|
681
|
+
|
|
682
|
+
---
|
|
683
|
+
|
|
684
|
+
## 13. 可观测性和审计
|
|
685
|
+
|
|
686
|
+
### 13.1 事件类型
|
|
687
|
+
|
|
688
|
+
```text
|
|
689
|
+
TASK_CREATED
|
|
690
|
+
WORKER_STARTED
|
|
691
|
+
WORKER_OUTPUT
|
|
692
|
+
WORKER_WAITING
|
|
693
|
+
WORKER_INPUT_SENT
|
|
694
|
+
POLICY_BLOCKED
|
|
695
|
+
SUPERVISOR_DECISION
|
|
696
|
+
HUMAN_TAKEOVER
|
|
697
|
+
WORKER_EXITED
|
|
698
|
+
WORKER_FAILED
|
|
699
|
+
VERIFICATION_STARTED
|
|
700
|
+
VERIFICATION_RESULT
|
|
701
|
+
STATE_CHANGED
|
|
702
|
+
TASK_COMPLETED
|
|
703
|
+
TASK_REJECTED
|
|
704
|
+
TASK_STOPPED
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
### 13.2 最小事件字段
|
|
708
|
+
|
|
709
|
+
```json
|
|
710
|
+
{
|
|
711
|
+
"eventId": "evt-001",
|
|
712
|
+
"taskId": "task-001",
|
|
713
|
+
"timestamp": "2026-01-01T00:00:00Z",
|
|
714
|
+
"type": "SUPERVISOR_DECISION",
|
|
715
|
+
"actor": "supervisor",
|
|
716
|
+
"state": "WAITING",
|
|
717
|
+
"payload": {},
|
|
718
|
+
"evidenceRefs": [],
|
|
719
|
+
"parentEventId": null
|
|
720
|
+
}
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
### 13.3 必须可回答的问题
|
|
724
|
+
|
|
725
|
+
系统完成后,应能回答:
|
|
726
|
+
|
|
727
|
+
1. Worker 为什么停顿?
|
|
728
|
+
2. Supervisor 为什么选择继续或升级?
|
|
729
|
+
3. 发送了什么指令?
|
|
730
|
+
4. 哪些动作是人工批准的?
|
|
731
|
+
5. 最终 diff 是什么?
|
|
732
|
+
6. 哪些测试实际重新执行过?
|
|
733
|
+
7. 谁批准了最终完成?
|
|
734
|
+
8. 是否超出预算、权限或任务边界?
|
|
735
|
+
|
|
736
|
+
---
|
|
737
|
+
|
|
738
|
+
## 14. 关键风险和应对方案
|
|
739
|
+
|
|
740
|
+
| 风险 | 等级 | 应对方案 |
|
|
741
|
+
|---|---:|---|
|
|
742
|
+
| package API 与文档不一致 | P1 | 固定版本,先做 Spike,不直接承诺兼容 |
|
|
743
|
+
| PTY 输出解析不稳定 | P1 | Worker Adapter + 事件归一化 + 回放测试 |
|
|
744
|
+
| LLM 错误判断 | P1 | Policy Gate、人工升级、置信度阈值 |
|
|
745
|
+
| 无限 continue 循环 | P1 | 最大轮数、重复检测、冷却时间 |
|
|
746
|
+
| Worker 输出 prompt injection | P1 | 输出不可信化、工具调用前策略拦截 |
|
|
747
|
+
| Reviewer 不够独立 | P1 | 独立上下文、只读验收、证据重新采集 |
|
|
748
|
+
| 误操作生产环境 | P0 | 人工审批、独立验收、禁止自动 merge/deploy/release/publish;sandbox/白名单作为后续加固 |
|
|
749
|
+
| Worker 崩溃后状态丢失 | P2 | Decision Worker session/task mapping 持久化,异常重启后显式 recovery;Claude Worker 本身不静默 resume |
|
|
750
|
+
| 多会话互相覆盖 | P1 | 独立 cwd/worktree 检测、共享事件锁、会话级 watchdog |
|
|
751
|
+
| Decision Worker/API 不可用 | P1 | 直接记录事件并通过人工通知通道告警,不尝试第二个 LLM fallback |
|
|
752
|
+
| 审计无法复现 | P2 | 保存事件、输入、输出摘要、diff 和验证结果 |
|
|
753
|
+
|
|
754
|
+
---
|
|
755
|
+
|
|
756
|
+
## 15. MVP 验收标准
|
|
757
|
+
|
|
758
|
+
MVP 必须满足:
|
|
759
|
+
|
|
760
|
+
### 功能验收
|
|
761
|
+
|
|
762
|
+
- [ ] 可以创建带目标、约束和验收命令的任务。
|
|
763
|
+
- [ ] 可以启动 Claude Worker。
|
|
764
|
+
- [ ] 可以读取 Worker 输出。
|
|
765
|
+
- [ ] 可以向 Worker 发送低风险继续指令。
|
|
766
|
+
- [ ] 可以识别等待、异常退出和超时。
|
|
767
|
+
- [ ] 可以人工接管和停止任务。
|
|
768
|
+
- [ ] 可以记录状态变化和 Supervisor 决策。
|
|
769
|
+
- [ ] 可以重新执行验收命令。
|
|
770
|
+
- [ ] 可以输出最终 diff 和证据报告。
|
|
771
|
+
- [ ] 未通过验证时不能进入 `COMPLETE`。
|
|
772
|
+
|
|
773
|
+
### 安全验收
|
|
774
|
+
|
|
775
|
+
- [ ] 危险命令会被拦截或升级人工。
|
|
776
|
+
- [ ] 人工接管后不再自动发送指令。
|
|
777
|
+
- [ ] 有最大时间、轮数和重试限制。
|
|
778
|
+
- [ ] 日志不会泄露密钥和 token。
|
|
779
|
+
- [ ] Decision Worker API 失败会直接触发人工通知。
|
|
780
|
+
- [ ] Worker 输出不能覆盖 Supervisor 的安全策略。
|
|
781
|
+
- [ ] Supervisor 故障时默认采取 fail-closed 行为。
|
|
782
|
+
|
|
783
|
+
### 稳定性验收
|
|
784
|
+
|
|
785
|
+
- [ ] 四个基础场景可重复通过。
|
|
786
|
+
- [ ] 进程异常退出后不会留下失控 Worker。
|
|
787
|
+
- [x] Supervisor/Pi 非正常重启后可以发现 `recoverable` 任务,并通过显式 recovery 恢复 Decision Worker 上下文;不会静默重复启动。
|
|
788
|
+
- [ ] 相同事件不会被无限重复处理。
|
|
789
|
+
- [ ] 事件日志可以还原一次完整任务过程。
|
|
790
|
+
|
|
791
|
+
---
|
|
792
|
+
|
|
793
|
+
## 16. 建议的实现顺序
|
|
794
|
+
|
|
795
|
+
```text
|
|
796
|
+
1. 确定候选 package 和精确版本
|
|
797
|
+
2. 编写 WorkerAdapter 接口
|
|
798
|
+
3. 完成 Claude 启动 / 输出 / 输入 / 停止 Spike
|
|
799
|
+
4. 加入事件日志
|
|
800
|
+
5. 实现有限状态机
|
|
801
|
+
6. 加入 Policy Gate
|
|
802
|
+
7. 加入人工 takeover
|
|
803
|
+
8. 加入固定验收命令
|
|
804
|
+
9. 加入独立只读 Reviewer
|
|
805
|
+
10. 加入持久化和恢复
|
|
806
|
+
11. 完成安全和故障测试
|
|
807
|
+
12. 再考虑 LLM 自动判断和生产化
|
|
808
|
+
```
|
|
809
|
+
|
|
810
|
+
不建议的顺序:
|
|
811
|
+
|
|
812
|
+
```text
|
|
813
|
+
直接安装多个 package
|
|
814
|
+
↓
|
|
815
|
+
直接让 LLM 自动判断所有停顿
|
|
816
|
+
↓
|
|
817
|
+
直接自动修复、merge、deploy
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
---
|
|
821
|
+
|
|
822
|
+
## 17. 待确认问题
|
|
823
|
+
|
|
824
|
+
在进入正式开发前,需要 W 明确:
|
|
825
|
+
|
|
826
|
+
1. 第一阶段是否只支持 Claude Code CLI?
|
|
827
|
+
2. 是否必须支持人工实时接管?
|
|
828
|
+
3. Worker 是否允许联网?允许哪些域名?
|
|
829
|
+
4. 哪些命令被视为高风险?
|
|
830
|
+
5. Reviewer 是否必须使用不同模型或不同上下文?
|
|
831
|
+
6. 是否允许 Reviewer 生成修复建议但不直接改代码?
|
|
832
|
+
7. 任务最大运行时间和费用预算是多少?
|
|
833
|
+
8. 验收命令由谁提供?项目是否已有统一测试脚本?
|
|
834
|
+
9. 第一版是否需要 session resume?
|
|
835
|
+
10. 是否要求产出完整的审计日志和任务报告?
|
|
836
|
+
|
|
837
|
+
---
|
|
838
|
+
|
|
839
|
+
## 18. 给 W 的最终结论
|
|
840
|
+
|
|
841
|
+
> 这个方向可以做,但当前调研文档不能直接作为生产实施方案。建议先固定 Pi、Claude Code 和相关 package 的版本,完成一个真实任务的兼容性 Spike,证明系统能够稳定完成“启动—观察—提问—接管—恢复—独立验收”闭环。
|
|
842
|
+
>
|
|
843
|
+
> 第一版应采用“确定性策略 + LLM 辅助判断 + 人工升级 + 可复现验收”,而不是让 LLM 自由决定所有动作。`pi-goals` 的 Goal / Evidence / Sign-off 思想值得吸收,但 PTY、watchdog 和 delegate 能力必须通过统一 Worker Adapter 组合。
|
|
844
|
+
>
|
|
845
|
+
> 最终判断:**架构方向 GO;先完成生命周期和故障恢复主线。低权限用户、sandbox 与网络隔离属于后续安全加固,不作为当前主线阻塞;在明确授权下仍禁止自动发布类动作。**
|
|
846
|
+
|
|
847
|
+
---
|
|
848
|
+
|
|
849
|
+
## 19. 独立评审后的整合决策
|
|
850
|
+
|
|
851
|
+
本方案已经过独立子 Agent 评审,并结合候选扩展检索结果进行修订。核心原则从“组合多个 package”调整为“复用已验证的底层能力,自建最薄的控制边界”。
|
|
852
|
+
|
|
853
|
+
### 19.1 复用决策
|
|
854
|
+
|
|
855
|
+
| 类型 | 处理方式 |
|
|
856
|
+
|---|---|
|
|
857
|
+
| `pi-interactive-shell` | 优先作为 PTY transport 做 Spike;验证通过后复用其 PTY、实时输出和人工接管能力 |
|
|
858
|
+
| `pi-foreground-chains` | 只借鉴有限循环、等待检测和 reviewer 分阶段流程;不直接复制 regex 决策 |
|
|
859
|
+
| `pi-goals` / `pi-goals-extension` | 复用 Goal、Evidence、Discriminator、Sign-off 数据模型;不直接作为 Claude Worker runtime |
|
|
860
|
+
| `pi-claude-code` | 暂不作为 MVP 核心依赖;完成版本、API、许可证和故障审计后再评估 |
|
|
861
|
+
| `pi-harness-delegate` | 作为可选 review/resume adapter;不能和 Supervisor 重复管理生命周期 |
|
|
862
|
+
| Claude Code Stop Hook | 作为 Worker 内部早停护栏;不能替代外部 Supervisor 或独立验收 |
|
|
863
|
+
|
|
864
|
+
### 19.2 唯一控制权
|
|
865
|
+
|
|
866
|
+
MVP 中必须保证:
|
|
867
|
+
|
|
868
|
+
- `WorkerAdapter` 唯一负责 spawn、stop、kill process group 和 transport 细节;
|
|
869
|
+
- Supervisor 唯一负责 watchdog、状态机、Policy Gate 和自动指令;
|
|
870
|
+
- Human 始终拥有最高控制权;
|
|
871
|
+
- Independent Verifier 唯一负责最终验收证据;
|
|
872
|
+
- 任何扩展不能暗中重复执行 resume、retry 或 stop。
|
|
873
|
+
|
|
874
|
+
PTY 和 headless JSONL 只能选择一个作为 MVP 的主 transport,禁止两个组件同时管理同一个 Claude 进程。
|
|
875
|
+
|
|
876
|
+
### 19.3 生产准入
|
|
877
|
+
|
|
878
|
+
候选扩展必须在进入生产依赖前完成:
|
|
879
|
+
|
|
880
|
+
- 精确版本和 commit SHA 锁定;
|
|
881
|
+
- LICENSE/SPDX 和传递依赖审计;
|
|
882
|
+
- API 和退出码验证;
|
|
883
|
+
- 输入竞争、无输出、崩溃、孤儿进程、恢复测试;
|
|
884
|
+
- 安全、权限、密钥和 prompt injection 测试;
|
|
885
|
+
- 可卸载和可回退验证。
|
|
886
|
+
|
|
887
|
+
“70%~85% 已完成”、候选项目星级、未经核验的发布日期和版本信息不能作为生产决策依据。
|
|
888
|
+
|
|
889
|
+
### 19.4 失败回滚
|
|
890
|
+
|
|
891
|
+
出现状态不一致、重复发送、策略解析失败、验证器不可用、扩展加载失败或权限越界时:
|
|
892
|
+
|
|
893
|
+
1. 立即停止自动发送;
|
|
894
|
+
2. 保留 worktree、日志和原始输出;
|
|
895
|
+
3. 进入 `HUMAN_REQUIRED`;
|
|
896
|
+
4. 人工接管或使用基础 Claude CLI Adapter;
|
|
897
|
+
5. 完成根因分析前关闭自动化开关。
|
|
898
|
+
|
|
899
|
+
详细独立评审记录见:`docs/independent-review.md`。
|
|
900
|
+
|
|
901
|
+
## 附录 A:当前方案中的明确决策
|
|
902
|
+
|
|
903
|
+
| 决策 | 结论 |
|
|
904
|
+
|---|---|
|
|
905
|
+
| Pi 是否作为外部 Supervisor | 是 |
|
|
906
|
+
| Claude Code 是否继续作为 Worker | 是 |
|
|
907
|
+
| 是否默认自动选择架构方案 | 否,升级人工 |
|
|
908
|
+
| 是否只相信 Worker 的完成声明 | 否 |
|
|
909
|
+
| 是否必须独立验收 | 是 |
|
|
910
|
+
| Reviewer 是否默认直接改代码 | 否 |
|
|
911
|
+
| 是否自动 merge/deploy | MVP 阶段否 |
|
|
912
|
+
| 是否需要统一 Adapter | 是 |
|
|
913
|
+
| 是否允许人工接管 | 必须支持 |
|
|
914
|
+
| 是否先做 Spike | 必须 |
|
|
915
|
+
|
|
916
|
+
## 附录 B:一句话版本
|
|
917
|
+
|
|
918
|
+
> 先用最小、可审计、可接管的 Supervisor 闭环证明可靠性,再逐步开放 LLM 判断和自动化权限;不要从“自动化最多”开始,而要从“边界最清楚、证据最可靠”开始。
|