patchwarden 1.1.0 → 1.5.1
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.en.md +83 -8
- package/README.md +78 -10
- package/dist/assessments/agentAssessor.d.ts +1 -1
- package/dist/assessments/agentAssessor.js +3 -3
- package/dist/assessments/assessmentStore.d.ts +1 -1
- package/dist/assessments/assessmentStore.js +2 -2
- package/dist/assessments/confirmCli.js +5 -4
- package/dist/config.d.ts +7 -0
- package/dist/config.js +34 -0
- package/dist/control/middleware/auth.d.ts +10 -0
- package/dist/control/middleware/auth.js +8 -0
- package/dist/control/middleware/static.d.ts +3 -0
- package/dist/control/middleware/static.js +65 -0
- package/dist/control/routes/audit.d.ts +15 -0
- package/dist/control/routes/audit.js +277 -0
- package/dist/control/routes/evidence.d.ts +4 -0
- package/dist/control/routes/evidence.js +96 -0
- package/dist/control/routes/lineage.d.ts +3 -0
- package/dist/control/routes/lineage.js +71 -0
- package/dist/control/routes/policy.d.ts +3 -0
- package/dist/control/routes/policy.js +81 -0
- package/dist/control/routes/process.d.ts +5 -0
- package/dist/control/routes/process.js +200 -0
- package/dist/control/routes/sessions.d.ts +22 -0
- package/dist/control/routes/sessions.js +224 -0
- package/dist/control/routes/status.d.ts +6 -0
- package/dist/control/routes/status.js +250 -0
- package/dist/control/routes/taskActions.d.ts +21 -0
- package/dist/control/routes/taskActions.js +233 -0
- package/dist/control/routes/tasks.d.ts +20 -0
- package/dist/control/routes/tasks.js +310 -0
- package/dist/control/routes/workspace.d.ts +15 -0
- package/dist/control/routes/workspace.js +193 -0
- package/dist/control/runtime.d.ts +91 -0
- package/dist/control/runtime.js +392 -0
- package/dist/control/server.d.ts +13 -0
- package/dist/control/server.js +479 -0
- package/dist/control/shared.d.ts +35 -0
- package/dist/control/shared.js +288 -0
- package/dist/controlCenter.d.ts +6 -0
- package/dist/controlCenter.js +7 -2001
- package/dist/direct/directGuards.js +30 -8
- package/dist/direct/directSessionStore.d.ts +2 -0
- package/dist/direct/directVerification.js +7 -0
- package/dist/doctor.d.ts +18 -1
- package/dist/doctor.js +579 -348
- package/dist/goal/goalReport.d.ts +54 -0
- package/dist/goal/goalReport.js +204 -0
- package/dist/goal/goalStatus.d.ts +6 -0
- package/dist/goal/specKitImport.d.ts +63 -0
- package/dist/goal/specKitImport.js +220 -0
- package/dist/goal/subgoalSync.js +2 -1
- package/dist/httpServer.js +15 -12
- package/dist/index.js +7 -4
- package/dist/logging.d.ts +7 -1
- package/dist/logging.js +8 -0
- package/dist/policy/projectPolicy.d.ts +55 -0
- package/dist/policy/projectPolicy.js +286 -0
- package/dist/runner/changeCapture.d.ts +3 -3
- package/dist/runner/changeCapture.js +63 -39
- package/dist/runner/cli.js +7 -6
- package/dist/runner/postTaskCleanup.js +26 -2
- package/dist/runner/runTask.js +245 -221
- package/dist/runner/simpleProcess.js +4 -4
- package/dist/runner/watch.js +17 -14
- package/dist/security/contentRedaction.d.ts +6 -0
- package/dist/security/contentRedaction.js +22 -0
- package/dist/smoke-test.js +261 -255
- package/dist/test/unit/apply-patch.test.d.ts +1 -0
- package/dist/test/unit/apply-patch.test.js +225 -0
- package/dist/test/unit/create-task.test.d.ts +1 -0
- package/dist/test/unit/create-task.test.js +197 -0
- package/dist/test/unit/direct-guards.test.js +124 -9
- package/dist/test/unit/evidence-pack.test.d.ts +1 -0
- package/dist/test/unit/evidence-pack.test.js +224 -0
- package/dist/test/unit/get-task-status.test.d.ts +1 -0
- package/dist/test/unit/get-task-status.test.js +174 -0
- package/dist/test/unit/get-task-summary.test.d.ts +1 -0
- package/dist/test/unit/get-task-summary.test.js +146 -0
- package/dist/test/unit/goal-report.test.d.ts +1 -0
- package/dist/test/unit/goal-report.test.js +159 -0
- package/dist/test/unit/goal-subgoal-task.test.js +6 -6
- package/dist/test/unit/goal-tools-registry.test.js +6 -4
- package/dist/test/unit/path-guard.test.js +24 -0
- package/dist/test/unit/project-policy-release-mode.test.d.ts +1 -0
- package/dist/test/unit/project-policy-release-mode.test.js +125 -0
- package/dist/test/unit/run-task-loop.test.d.ts +1 -0
- package/dist/test/unit/run-task-loop.test.js +380 -0
- package/dist/test/unit/schema-drift-check.test.js +10 -9
- package/dist/test/unit/spec-kit-import.test.d.ts +1 -0
- package/dist/test/unit/spec-kit-import.test.js +341 -0
- package/dist/test/unit/wait-for-task.test.d.ts +1 -0
- package/dist/test/unit/wait-for-task.test.js +144 -0
- package/dist/tools/auditTask.d.ts +8 -63
- package/dist/tools/auditTask.js +12 -8
- package/dist/tools/createDirectSession.d.ts +1 -1
- package/dist/tools/createDirectSession.js +2 -2
- package/dist/tools/createTask.d.ts +2 -2
- package/dist/tools/createTask.js +4 -4
- package/dist/tools/dispatch/coreDispatch.d.ts +9 -0
- package/dist/tools/dispatch/coreDispatch.js +282 -0
- package/dist/tools/dispatch/diagnosticDispatch.d.ts +14 -0
- package/dist/tools/dispatch/diagnosticDispatch.js +78 -0
- package/dist/tools/dispatch/directDispatch.d.ts +8 -0
- package/dist/tools/dispatch/directDispatch.js +115 -0
- package/dist/tools/dispatch/goalDispatch.d.ts +8 -0
- package/dist/tools/dispatch/goalDispatch.js +91 -0
- package/dist/tools/dispatch/releaseDispatch.d.ts +8 -0
- package/dist/tools/dispatch/releaseDispatch.js +45 -0
- package/dist/tools/dispatch/types.d.ts +23 -0
- package/dist/tools/dispatch/types.js +15 -0
- package/dist/tools/evidencePack.d.ts +45 -0
- package/dist/tools/evidencePack.js +375 -0
- package/dist/tools/finalizeDirectSession.d.ts +1 -1
- package/dist/tools/finalizeDirectSession.js +3 -3
- package/dist/tools/goalSubgoalTask.d.ts +1 -1
- package/dist/tools/goalSubgoalTask.js +2 -2
- package/dist/tools/healthCheck.js +3 -3
- package/dist/tools/recommendAgentForTask.d.ts +19 -0
- package/dist/tools/recommendAgentForTask.js +56 -0
- package/dist/tools/registry.d.ts +3 -3
- package/dist/tools/registry.js +333 -402
- package/dist/tools/releaseMode.d.ts +50 -0
- package/dist/tools/releaseMode.js +370 -0
- package/dist/tools/retryTask.d.ts +2 -2
- package/dist/tools/retryTask.js +2 -2
- package/dist/tools/runDirectVerificationBundle.d.ts +26 -0
- package/dist/tools/runDirectVerificationBundle.js +64 -0
- package/dist/tools/runTaskLoop.d.ts +57 -0
- package/dist/tools/runTaskLoop.js +417 -0
- package/dist/tools/runVerification.d.ts +4 -0
- package/dist/tools/runVerification.js +4 -0
- package/dist/tools/safeViews.d.ts +8 -2
- package/dist/tools/safeViews.js +4 -2
- package/dist/tools/taskLineage.d.ts +91 -0
- package/dist/tools/taskLineage.js +175 -0
- package/dist/tools/toolCatalog.d.ts +2 -2
- package/dist/tools/toolCatalog.js +6 -0
- package/dist/tools/toolRegistry.js +132 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/docs/CODE_WIKI.md +983 -0
- package/docs/agentseal-integration.md +150 -0
- package/docs/architecture.md +63 -0
- package/docs/assets/patchwarden-oss-demo.gif +0 -0
- package/docs/chatgpt-usage.md +31 -0
- package/docs/control-center/README.md +9 -0
- package/docs/dashboard-overview.md +86 -0
- package/docs/demo.md +8 -0
- package/docs/direct-session-workflow.md +98 -0
- package/docs/evidence-pack-schema.md +215 -0
- package/docs/execution-plan-2026-07-09.md +315 -0
- package/docs/lineage-evidence-pack-workflow.md +127 -0
- package/docs/mcp-inspector-testing.md +200 -0
- package/docs/open-source-application.md +162 -0
- package/docs/opencode-worker.md +151 -0
- package/docs/openhands-worker.md +181 -0
- package/docs/release-evidence.md +72 -0
- package/docs/roadmap-execution-and-acceptance.md +365 -0
- package/docs/spec-kit-integration.md +131 -0
- package/docs/task-safe-review-workflow.md +98 -0
- package/docs/threat-model.md +79 -0
- package/docs/user-feedback.md +40 -0
- package/docs/why-patchwarden.md +110 -0
- package/package.json +3 -3
- package/scripts/checks/control-center-smoke.js +443 -0
- package/scripts/checks/control-smoke.js +2 -2
- package/scripts/checks/lifecycle-smoke.js +29 -23
- package/scripts/checks/mcp-manifest-check.js +12 -0
- package/scripts/checks/mcp-smoke.js +33 -7
- package/scripts/checks/watcher-supervisor-smoke.js +1 -1
- package/scripts/generate-demo-gif.py +320 -0
- package/src/assessments/agentAssessor.ts +3 -3
- package/src/assessments/assessmentStore.ts +2 -2
- package/src/assessments/confirmCli.ts +5 -4
- package/src/config.ts +37 -0
- package/src/control/middleware/auth.ts +17 -0
- package/src/control/middleware/static.ts +71 -0
- package/src/control/routes/audit.ts +321 -0
- package/src/control/routes/evidence.ts +107 -0
- package/src/control/routes/lineage.ts +92 -0
- package/src/control/routes/policy.ts +81 -0
- package/src/control/routes/process.ts +204 -0
- package/src/control/routes/sessions.ts +251 -0
- package/src/control/routes/status.ts +325 -0
- package/src/control/routes/taskActions.ts +248 -0
- package/src/control/routes/tasks.ts +323 -0
- package/src/control/routes/workspace.ts +203 -0
- package/src/control/runtime.ts +472 -0
- package/src/control/server.ts +471 -0
- package/src/control/shared.ts +294 -0
- package/src/controlCenter.ts +7 -2150
- package/src/direct/directGuards.ts +28 -7
- package/src/direct/directSessionStore.ts +2 -0
- package/src/direct/directVerification.ts +7 -0
- package/src/doctor.ts +741 -481
- package/src/goal/goalReport.ts +271 -0
- package/src/goal/goalStatus.ts +6 -0
- package/src/goal/specKitImport.ts +355 -0
- package/src/goal/subgoalSync.ts +4 -2
- package/src/httpServer.ts +17 -14
- package/src/index.ts +7 -4
- package/src/logging.ts +10 -1
- package/src/policy/projectPolicy.ts +344 -0
- package/src/runner/changeCapture.ts +70 -42
- package/src/runner/cli.ts +7 -6
- package/src/runner/postTaskCleanup.ts +26 -2
- package/src/runner/runTask.ts +325 -223
- package/src/runner/simpleProcess.ts +4 -4
- package/src/runner/watch.ts +17 -14
- package/src/security/contentRedaction.ts +29 -0
- package/src/smoke-test.ts +254 -252
- package/src/test/unit/apply-patch.test.ts +293 -0
- package/src/test/unit/create-task.test.ts +255 -0
- package/src/test/unit/direct-guards.test.ts +178 -8
- package/src/test/unit/evidence-pack.test.ts +251 -0
- package/src/test/unit/get-task-status.test.ts +203 -0
- package/src/test/unit/get-task-summary.test.ts +173 -0
- package/src/test/unit/goal-report.test.ts +189 -0
- package/src/test/unit/goal-subgoal-task.test.ts +6 -6
- package/src/test/unit/goal-tools-registry.test.ts +7 -5
- package/src/test/unit/path-guard.test.ts +30 -0
- package/src/test/unit/project-policy-release-mode.test.ts +156 -0
- package/src/test/unit/run-task-loop.test.ts +425 -0
- package/src/test/unit/schema-drift-check.test.ts +11 -9
- package/src/test/unit/spec-kit-import.test.ts +429 -0
- package/src/test/unit/wait-for-task.test.ts +176 -0
- package/src/tools/auditTask.ts +99 -59
- package/src/tools/createDirectSession.ts +3 -3
- package/src/tools/createTask.ts +7 -7
- package/src/tools/dispatch/coreDispatch.ts +374 -0
- package/src/tools/dispatch/diagnosticDispatch.ts +101 -0
- package/src/tools/dispatch/directDispatch.ts +167 -0
- package/src/tools/dispatch/goalDispatch.ts +127 -0
- package/src/tools/dispatch/releaseDispatch.ts +65 -0
- package/src/tools/dispatch/types.ts +24 -0
- package/src/tools/evidencePack.ts +490 -0
- package/src/tools/finalizeDirectSession.ts +4 -4
- package/src/tools/goalSubgoalTask.ts +2 -2
- package/src/tools/healthCheck.ts +3 -3
- package/src/tools/listWorkspace.ts +71 -71
- package/src/tools/recommendAgentForTask.ts +79 -0
- package/src/tools/registry.ts +352 -509
- package/src/tools/releaseMode.ts +450 -0
- package/src/tools/retryTask.ts +2 -2
- package/src/tools/runDirectVerificationBundle.ts +98 -0
- package/src/tools/runTaskLoop.ts +526 -0
- package/src/tools/runVerification.ts +8 -0
- package/src/tools/safeViews.ts +4 -2
- package/src/tools/taskLineage.ts +300 -0
- package/src/tools/toolCatalog.ts +6 -0
- package/src/tools/toolRegistry.ts +132 -0
- package/src/version.ts +2 -2
- package/ui/pages/audit.html +192 -3
- package/ui/pages/dashboard.html +1070 -14
- package/ui/pages/direct-sessions.html +505 -53
- package/ui/pages/task-detail.html +456 -438
- package/ui/pages/tasks.html +598 -61
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# AgentSeal 集成模式
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 说明:本文描述的是 PatchWarden 与 AgentSeal 的集成模式建议,**不是** AgentSeal 的官方功能。
|
|
5
|
+
> AgentSeal 是独立的 agent 安全检测项目,本文不声称任何官方集成关系。
|
|
6
|
+
|
|
7
|
+
## AgentSeal 是什么
|
|
8
|
+
|
|
9
|
+
AgentSeal 是面向 AI 编程 Agent 的安全检测工具,主要职能包括:
|
|
10
|
+
|
|
11
|
+
- 识别项目级安全策略(哪些文件可改、哪些命令可执行、哪些路径禁止访问)。
|
|
12
|
+
- 对 Agent 的执行行为进行策略比对与违规告警。
|
|
13
|
+
- 为 Agent 工作流提供可配置的策略层。
|
|
14
|
+
|
|
15
|
+
AgentSeal 侧重于“策略声明与检测”,本身不强制执行;
|
|
16
|
+
PatchWarden 侧重于“强制执行与证据收集”。两者互补。
|
|
17
|
+
|
|
18
|
+
## 集成定位
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
AgentSeal: 声明策略 → 检测违规 → 告警
|
|
22
|
+
↓ 策略对齐
|
|
23
|
+
PatchWarden: 接收任务 → 强制执行 → 证据收集
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- AgentSeal 负责**策略侧**:识别并校验项目安全策略。
|
|
27
|
+
- PatchWarden 负责**执行侧**:在执行任务时强制遵守策略,并产出可审计证据。
|
|
28
|
+
|
|
29
|
+
## 配置文件关系
|
|
30
|
+
|
|
31
|
+
PatchWarden 与 AgentSeal 共享两个关键配置文件,但职责不同:
|
|
32
|
+
|
|
33
|
+
| 文件 | AgentSeal 角色 | PatchWarden 角色 |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| `.patchwarden/config.json` | 读取并识别 PatchWarden 运行配置 | 运行时核心配置入口 |
|
|
36
|
+
| `project-policy.json` | 校验项目策略合规性 | 执行时强制遵守的 allowed paths / commands |
|
|
37
|
+
|
|
38
|
+
### `.patchwarden/config.json`
|
|
39
|
+
|
|
40
|
+
PatchWarden 的运行配置,典型字段包括:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"workspaceRoot": "D:\\repos\\my-project",
|
|
45
|
+
"agents": ["opencode", "codex"],
|
|
46
|
+
"evidencePackVersion": 2,
|
|
47
|
+
"safeResult": { "maxBytes": 4096 }
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
AgentSeal 可读取此文件以了解 PatchWarden 的 workspace 边界与 agent 注册情况,
|
|
52
|
+
用于检测配置是否与项目策略一致。
|
|
53
|
+
|
|
54
|
+
### `project-policy.json`
|
|
55
|
+
|
|
56
|
+
项目级安全策略,声明允许的路径与命令:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"allowedPaths": ["src/**", "test/**"],
|
|
61
|
+
"allowedCommands": ["npm.cmd test", "npm.cmd run build", "git status"],
|
|
62
|
+
"blockedFiles": [".env", ".env.*", "id_rsa", "cookies.db"],
|
|
63
|
+
"scopeRules": { "enforceDeclaredFiles": true }
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- AgentSeal 将此文件作为策略基准进行检测。
|
|
68
|
+
- PatchWarden 将此文件作为执行时的强制约束。
|
|
69
|
+
- 两者读取同一份文件,保证“检测基准”与“执行约束”一致。
|
|
70
|
+
|
|
71
|
+
## 集成流程示例
|
|
72
|
+
|
|
73
|
+
### 1. 编写项目安全策略
|
|
74
|
+
|
|
75
|
+
在仓库根目录放置 `project-policy.json`(与 `.patchwarden/config.json` 配合):
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"allowedPaths": ["src/**", "docs/**"],
|
|
80
|
+
"allowedCommands": ["npm.cmd run build", "npm.cmd test"],
|
|
81
|
+
"blockedFiles": [".env", "*.key", "*.pem"],
|
|
82
|
+
"scopeRules": { "enforceDeclaredFiles": true }
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. AgentSeal 识别并校验策略
|
|
87
|
+
|
|
88
|
+
```powershell
|
|
89
|
+
# AgentSeal 扫描项目,识别 .patchwarden/config.json 与 project-policy.json
|
|
90
|
+
# 输出策略合规报告
|
|
91
|
+
agentseal scan --project D:\repos\my-project
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
AgentSeal 输出策略快照,作为后续违规比对的基准。
|
|
95
|
+
|
|
96
|
+
### 3. PatchWarden 执行任务时强制遵守
|
|
97
|
+
|
|
98
|
+
当 MCP 客户端通过 PatchWarden 执行任务时:
|
|
99
|
+
|
|
100
|
+
```powershell
|
|
101
|
+
# PatchWarden 启动时加载 project-policy.json
|
|
102
|
+
# 执行任务时对每条命令与文件改动进行策略校验
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
PatchWarden 的强制行为:
|
|
106
|
+
|
|
107
|
+
- 命令必须在 `allowedCommands` 列表中(精确匹配)。
|
|
108
|
+
- 文件改动必须在 `allowedPaths` 范围内。
|
|
109
|
+
- 命中 `blockedFiles` 的访问被立即阻断。
|
|
110
|
+
- `enforceDeclaredFiles` 为 true 时,未声明文件的改动触发范围违规检测。
|
|
111
|
+
|
|
112
|
+
### 4. 证据对齐与回溯
|
|
113
|
+
|
|
114
|
+
任务完成后,PatchWarden 导出 Evidence Pack v2:
|
|
115
|
+
|
|
116
|
+
```powershell
|
|
117
|
+
# 产物位于 .patchwarden/evidence-packs/<lineage_id>/
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
其中:
|
|
121
|
+
|
|
122
|
+
- `verify.json` 记录每轮迭代的策略校验结果,可与 AgentSeal 的策略快照对齐。
|
|
123
|
+
- `risk.json` 聚合执行中识别的风险项。
|
|
124
|
+
- `redactions.json` 记录已脱敏内容,证明未泄露敏感信息。
|
|
125
|
+
|
|
126
|
+
AgentSeal 可读取这些文件,作为策略执行情况的回溯证据。
|
|
127
|
+
|
|
128
|
+
## 安全边界
|
|
129
|
+
|
|
130
|
+
- PatchWarden 不依赖 AgentSeal 运行。即使 AgentSeal 未启动,
|
|
131
|
+
PatchWarden 仍会按 `project-policy.json` 强制执行策略。
|
|
132
|
+
- AgentSeal 不修改 PatchWarden 的运行时行为,仅提供策略检测与告警。
|
|
133
|
+
- 两者共享 `project-policy.json` 作为单一策略真源,避免策略漂移。
|
|
134
|
+
- 若 AgentSeal 检测到策略与 PatchWarden 配置不一致,
|
|
135
|
+
应由人工修正配置,不应自动放宽 PatchWarden 的约束。
|
|
136
|
+
|
|
137
|
+
## 注意事项
|
|
138
|
+
|
|
139
|
+
- 本集成模式不修改 AgentSeal 的任何行为,仅在配置与流程上配合。
|
|
140
|
+
- `project-policy.json` 的字段定义以 PatchWarden 实际加载逻辑为准,
|
|
141
|
+
AgentSeal 侧应按相同 schema 解析。
|
|
142
|
+
- 如策略允许读取 `.env` 等敏感文件,PatchWarden 仍会按安全契约阻断,
|
|
143
|
+
此时需要重新设计策略以避免触碰敏感资源。
|
|
144
|
+
|
|
145
|
+
## 相关文档
|
|
146
|
+
|
|
147
|
+
- `docs/threat-model.md`:PatchWarden 安全契约与敏感文件清单。
|
|
148
|
+
- `docs/evidence-pack-schema.md`:Evidence Pack v2 文件结构。
|
|
149
|
+
- `docs/why-patchwarden.md`:PatchWarden 定位与动机。
|
|
150
|
+
- 上游草稿 PR:https://github.com/getagentseal/agentseal/pull/35
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# PatchWarden Architecture
|
|
2
|
+
|
|
3
|
+
PatchWarden is designed as a narrow control layer between an MCP client and
|
|
4
|
+
local coding agents.
|
|
5
|
+
|
|
6
|
+
## Roles
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
ChatGPT / Codex / OpenCode / another MCP client
|
|
10
|
+
|
|
|
11
|
+
v
|
|
12
|
+
PatchWarden MCP Server
|
|
13
|
+
|
|
|
14
|
+
save_plan / create_task
|
|
15
|
+
|
|
|
16
|
+
v
|
|
17
|
+
.patchwarden/tasks/<task_id>/
|
|
18
|
+
|
|
|
19
|
+
Watcher finds task
|
|
20
|
+
|
|
|
21
|
+
v
|
|
22
|
+
Local agent (OpenCode / Codex)
|
|
23
|
+
|
|
|
24
|
+
v
|
|
25
|
+
result.json / diff.patch / verify.json / status.json
|
|
26
|
+
|
|
|
27
|
+
v
|
|
28
|
+
MCP client reads safe summaries and audit evidence
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Core Components
|
|
32
|
+
|
|
33
|
+
| Component | Responsibility |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| MCP server | Exposes constrained planning, task, summary, audit, and status tools. |
|
|
36
|
+
| Watcher | Polls queued tasks and starts preconfigured local agents. |
|
|
37
|
+
| Agent registry | Defines trusted agent commands and argument templates. |
|
|
38
|
+
| Command guard | Allows only exact verification commands from trusted configuration. |
|
|
39
|
+
| Path guard | Keeps task paths under `workspaceRoot` and reports out-of-scope changes. |
|
|
40
|
+
| Sensitive path guard | Blocks known credential and private-data file names. |
|
|
41
|
+
| Evidence writer | Records status, result, verification, changed files, and audit artifacts. |
|
|
42
|
+
| Control Center | Provides safe-first local review pages for tasks, direct sessions, lineage, warnings, and evidence packs. |
|
|
43
|
+
|
|
44
|
+
## Data Flow
|
|
45
|
+
|
|
46
|
+
1. A client saves a plan or creates a task with an explicit `repo_path`.
|
|
47
|
+
2. PatchWarden validates the repository path and requested verification
|
|
48
|
+
commands.
|
|
49
|
+
3. The task is written under `.patchwarden/tasks/<task_id>/`.
|
|
50
|
+
4. The Watcher starts the selected registered agent.
|
|
51
|
+
5. PatchWarden captures task status, changed files, Git diff evidence where
|
|
52
|
+
available, verification output, and audit summaries.
|
|
53
|
+
6. The client reviews safe summaries first and asks for deeper artifacts only
|
|
54
|
+
when needed.
|
|
55
|
+
|
|
56
|
+
## Safety Design
|
|
57
|
+
|
|
58
|
+
PatchWarden treats model instructions as untrusted input. The local maintainer
|
|
59
|
+
controls the workspace root, allowed commands, registered agents, and release
|
|
60
|
+
process. The project intentionally keeps push, publish, tag, GitHub Release,
|
|
61
|
+
and live service changes outside ordinary task execution.
|
|
62
|
+
|
|
63
|
+
For the security model, see `docs/threat-model.md`.
|
|
Binary file
|
package/docs/chatgpt-usage.md
CHANGED
|
@@ -92,6 +92,37 @@ safety boundaries and complete evidence.
|
|
|
92
92
|
7. Changes remain uncommitted for review; commit, push, and publish are outside
|
|
93
93
|
the ordinary task scope.
|
|
94
94
|
|
|
95
|
+
For routine guarded work, `run_task_loop` can perform the assess-only preflight,
|
|
96
|
+
task creation, waiting, safe summary review, audit, and bounded `fix_tests`
|
|
97
|
+
follow-up cycle in one tool call. It still uses the existing Watcher and
|
|
98
|
+
allow-listed verification commands, stops at local confirmation boundaries, and
|
|
99
|
+
returns a `lineage_id` for `get_task_lineage` instead of full logs or diffs.
|
|
100
|
+
|
|
101
|
+
For v1.4 Direct-assisted verification, set `direct_verify=true` only when the
|
|
102
|
+
local Direct profile is enabled and the desired Direct verification commands are
|
|
103
|
+
already allow-listed. The loop creates a Direct session after the normal task
|
|
104
|
+
and audit have succeeded, runs verification, safe-finalizes, safe-audits, and
|
|
105
|
+
stores bounded Direct evidence in lineage. It does not call Direct patching
|
|
106
|
+
tools, publish, push, tag, create releases, or restart live services.
|
|
107
|
+
|
|
108
|
+
For v1.5 isolated loop work, set `agent="auto"` when you want PatchWarden to
|
|
109
|
+
pick from configured local agents using bounded routing, and set
|
|
110
|
+
`isolation_mode="worktree"` only when the target repo is a git repository and
|
|
111
|
+
you want the task to run in an isolated worktree. Worktree mode records evidence
|
|
112
|
+
in lineage but never auto-merges or auto-deletes the worktree. After a loop
|
|
113
|
+
finishes, call `export_task_evidence_pack(lineage_id)` to write bounded
|
|
114
|
+
`evidence.json` and `EVIDENCE.md` files without stdout/stderr tails, full diffs,
|
|
115
|
+
verification logs, or sensitive file content.
|
|
116
|
+
|
|
117
|
+
For v1.3 policy-aware work, call `get_project_policy` before release-oriented
|
|
118
|
+
changes. It reads the bounded effective `.patchwarden/project-policy.json`
|
|
119
|
+
summary and release readiness without granting new command permissions. Release
|
|
120
|
+
mode tools are full-profile only: `release_check` wraps the existing release
|
|
121
|
+
gate, `release_prepare` runs only already allow-listed local commands,
|
|
122
|
+
`release_verify` performs read-only npm/GitHub/CI checks, and `release_cleanup`
|
|
123
|
+
defaults to dry run. None of these tools publish, push, tag, create GitHub
|
|
124
|
+
Releases, restart live tunnels/watchers, or return full logs/diffs.
|
|
125
|
+
|
|
95
126
|
`needs_confirm` assessments must be confirmed locally with
|
|
96
127
|
`patchwarden-confirm <full_assessment_id>`. The confirmation command is not an
|
|
97
128
|
MCP tool. A `blocked` assessment cannot be confirmed.
|
|
@@ -27,6 +27,15 @@ automation-friendly commands.
|
|
|
27
27
|
|
|
28
28
|
## Design Notes
|
|
29
29
|
|
|
30
|
+
- v1.3 Dashboard panels show bounded task lineage, project policy, and release
|
|
31
|
+
readiness summaries. The backing APIs are read-only and do not expose full
|
|
32
|
+
stdout/stderr, full diffs, long logs, or secret-bearing files.
|
|
33
|
+
- v1.4 extends the lineage panel with Direct-assisted verification status and
|
|
34
|
+
exposes a safe Direct session summary API without stdout/stderr tails or diffs.
|
|
35
|
+
- v1.5 adds an Evidence Pack dashboard card plus read-only
|
|
36
|
+
`/api/evidence-packs` and `/api/evidence-packs/:lineage_id` routes. These
|
|
37
|
+
APIs return bounded lineage/policy/catalog evidence and omit stdout/stderr,
|
|
38
|
+
full diffs, verification logs, and sensitive file content.
|
|
30
39
|
- `control-center-mvp.md`: first Web dashboard scope.
|
|
31
40
|
- `control-center-phase2.md`: follow-up management and diagnostics scope.
|
|
32
41
|
- `control-center-daily-driver.md`: current daily-use contract.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Dashboard 概览
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 入口:`PatchWarden-Control.cmd` 或托盘菜单中的 "Open Control Center"。
|
|
5
|
+
|
|
6
|
+
## 目的
|
|
7
|
+
|
|
8
|
+
PatchWarden Dashboard(Control Center)把本地 Agent 工作流从“只能看的状态面板”
|
|
9
|
+
升级为“可操作的工作流控制中心”。所有操作默认走 safe 摘要接口,完整日志、diff、
|
|
10
|
+
test log 仅在折叠的“高级区”按需加载,不改变 PatchWarden 的安全边界。
|
|
11
|
+
|
|
12
|
+
## 核心概念
|
|
13
|
+
|
|
14
|
+
- **Safe-first**:默认展示 `safe_result` / `safe_audit` / `safe_test_summary` /
|
|
15
|
+
`safe_diff_summary` / `safe_direct_summary` 等有界摘要,避免直接渲染完整产物。
|
|
16
|
+
- **Repo selector**:顶部下拉列出 workspace 根目录及其一级项目目录(带 package.json
|
|
17
|
+
版本标记)。切换 repo 会刷新 Project Policy、Release、Recent Tasks、Lineage、
|
|
18
|
+
Evidence Pack、Direct Sessions。
|
|
19
|
+
- **Health Score**:综合 watcher / tunnel / agents / stale 任务 / 失败任务 /
|
|
20
|
+
policy 有效性 / release readiness / direct profile 状态计算出的健康分,
|
|
21
|
+
状态为 `healthy` / `warning` / `degraded` / `blocked`。
|
|
22
|
+
- **Bound to lineage**:Evidence Pack 与 Lineage 绑定,只有 `run_task_loop` 产生
|
|
23
|
+
lineage 后才能导出证据包。
|
|
24
|
+
|
|
25
|
+
## 主要页面
|
|
26
|
+
|
|
27
|
+
| 页面 | 主要内容 |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| Dashboard | Repo selector、Health Score、服务状态、Release 卡片、Project Policy、Lineage、Evidence Pack、Stale 任务提示、最近任务列表、系统状态(含 Copy diagnostics) |
|
|
30
|
+
| Tasks | 任务列表,支持按 repo_path / status / acceptance_status / warning_type / agent / date range 过滤 |
|
|
31
|
+
| Task Detail | safe 摘要默认视图 + 折叠的高级区(完整 result / diff / test_log) |
|
|
32
|
+
| Direct Sessions | 按 active / finalized / audited / expired 分组的 Direct 会话 |
|
|
33
|
+
| Audit / Warnings | 按 warning 类型聚合的诊断页 |
|
|
34
|
+
| Workspace | workspace 一级目录与项目列表 |
|
|
35
|
+
| Logs | Core / Direct / Watcher / Control Center 日志尾部 |
|
|
36
|
+
|
|
37
|
+
## 推荐工作流
|
|
38
|
+
|
|
39
|
+
1. 在 Dashboard 顶部选择目标 repo。
|
|
40
|
+
2. 查看 Health Score,确认系统健康(`healthy` 或 `warning`)。
|
|
41
|
+
3. 在 Release 卡片确认发布就绪状态;若 `blocked`,按 `blocked_reason` 修复。
|
|
42
|
+
4. 在最近任务列表点击 `safe_result` 快捷查看任务摘要。
|
|
43
|
+
5. 打开 Task Detail 进行 safe-first 验收(详见
|
|
44
|
+
[task-safe-review-workflow.md](task-safe-review-workflow.md))。
|
|
45
|
+
6. 使用 Lineage Detail 查看 `run_task_loop` 成功/失败原因(详见
|
|
46
|
+
[lineage-evidence-pack-workflow.md](lineage-evidence-pack-workflow.md))。
|
|
47
|
+
7. 验收完成后导出 Evidence Pack。
|
|
48
|
+
8. Direct 会话用于独立验证,完成后 finalize + audit(详见
|
|
49
|
+
[direct-session-workflow.md](direct-session-workflow.md))。
|
|
50
|
+
9. 遇到问题时点击 **Copy diagnostics** 复制诊断信息,发给 ChatGPT / Codex / opencode 排查。
|
|
51
|
+
|
|
52
|
+
## 卡片速查
|
|
53
|
+
|
|
54
|
+
### Release 卡片
|
|
55
|
+
|
|
56
|
+
显示 package name、version_source、version、version_consistent、required_commands
|
|
57
|
+
(每条命令的 allowed + blocked_reason)、commands_blocked_count、
|
|
58
|
+
ready/unknown/blocked 状态及 blocked 原因。`next_action` 会引导使用
|
|
59
|
+
`release_check` 模板。
|
|
60
|
+
|
|
61
|
+
### Stale 任务卡片
|
|
62
|
+
|
|
63
|
+
不再是简单的“过期任务列表”,而是可解释、可操作的健康建议卡片,包含 task_id、
|
|
64
|
+
repo_path、status、error、人类可读的 explanation、next_action,以及快捷操作
|
|
65
|
+
(查看详情、复制 task_id、隐藏、重建任务)。
|
|
66
|
+
|
|
67
|
+
### Project Policy 卡片
|
|
68
|
+
|
|
69
|
+
只读展示 auto_cleanup、protected_paths 数量、high_risk_commands 数量、
|
|
70
|
+
release_mode 摘要。
|
|
71
|
+
|
|
72
|
+
## 安全边界
|
|
73
|
+
|
|
74
|
+
- 所有 safe 接口返回有界摘要,不包含完整日志、stdout/stderr tail、diff、密钥内容。
|
|
75
|
+
- 完整 result / diff / test_log 只在折叠的高级区按需加载,永不自动加载。
|
|
76
|
+
- Project Policy 卡片只读,不能从 UI 修改策略。
|
|
77
|
+
- 不执行远程写操作(npm publish / git push / git tag / gh release)。
|
|
78
|
+
- Diagnostics 输出经过 `redactSensitiveContent` 脱敏。
|
|
79
|
+
|
|
80
|
+
## 相关 API 端点
|
|
81
|
+
|
|
82
|
+
- `GET /api/workspace/repos` — Repo selector 数据源
|
|
83
|
+
- `GET /api/diagnostics` — Copy diagnostics 数据源
|
|
84
|
+
- `GET /api/warnings` — Warnings 页数据源
|
|
85
|
+
- `GET /api/release/status` — Release 卡片数据源
|
|
86
|
+
- `GET /api/tasks/stale` — Stale 任务卡片数据源(含 explanation / next_action)
|
package/docs/demo.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
This is a privacy-safe demo flow for GitHub. It uses placeholder workspace
|
|
4
4
|
names and avoids real tunnel IDs, account names, API keys, or local user paths.
|
|
5
5
|
|
|
6
|
+
## Animated OSS Demo
|
|
7
|
+
|
|
8
|
+
This scripted GIF summarizes the public maintainer workflow without showing
|
|
9
|
+
private accounts, real API keys, real task history, or local user paths. It is a
|
|
10
|
+
demo asset, not third-party adoption evidence.
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
6
14
|
## Demo: ChatGPT Lists A Workspace
|
|
7
15
|
|
|
8
16
|
Prompt in ChatGPT with the PatchWarden connector selected:
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Direct 会话工作流
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。
|
|
4
|
+
> 相关页面:Direct Sessions
|
|
5
|
+
|
|
6
|
+
## 目的
|
|
7
|
+
|
|
8
|
+
Direct 会话(Direct Session)是 PatchWarden 提供给 ChatGPT 等 Direct agent 的
|
|
9
|
+
独立验证通道:在 watcher 守护的任务流程之外,对一个 repo 做独立的文件查看、
|
|
10
|
+
命令执行和验证。Direct 不会自动 patch 文件、不会绕过命令守卫,所有操作仍受
|
|
11
|
+
workspace 隔离、敏感路径拦截和审计约束。
|
|
12
|
+
|
|
13
|
+
## 核心概念
|
|
14
|
+
|
|
15
|
+
- **Direct session**:绑定到某个 repo_path 的一次独立会话,有 session_id、
|
|
16
|
+
title、created_at、expires_at。
|
|
17
|
+
- **会话状态分组**:`active` / `finalized` / `audited` / `expired`。
|
|
18
|
+
expired 默认折叠。
|
|
19
|
+
- **safe_direct_summary**:Direct 会话的有界摘要,包含 changed_files_total、
|
|
20
|
+
verification status,不含完整 diff 或 stdout。
|
|
21
|
+
- **finalize**:把 active 会话标记为已完成(finalized),冻结变更记录。
|
|
22
|
+
- **audit**:对 finalized 会话做审计,生成审计摘要(audited 状态)。
|
|
23
|
+
- **verification bundle**:`run_direct_verification_bundle` 一次性跑测试 + diff +
|
|
24
|
+
验收检查的成组操作。
|
|
25
|
+
|
|
26
|
+
## 生命周期
|
|
27
|
+
|
|
28
|
+
### 1. 创建 Direct 会话
|
|
29
|
+
|
|
30
|
+
通过 Direct profile 的 MCP 工具创建会话(如 `start_direct_session`),指定
|
|
31
|
+
repo_path 和 title。会话会进入 `active` 状态,并记录 created_at 与 expires_at。
|
|
32
|
+
|
|
33
|
+
### 2. 在 Direct Sessions 页查看
|
|
34
|
+
|
|
35
|
+
Direct Sessions 页按状态分组展示所有会话:
|
|
36
|
+
|
|
37
|
+
- **active** — 进行中
|
|
38
|
+
- **finalized** — 已 finalize,待 audit
|
|
39
|
+
- **audited** — 已完成审计
|
|
40
|
+
- **expired** — 已过期(默认折叠)
|
|
41
|
+
|
|
42
|
+
每个会话显示 session_id、repo_path、title、created_at、expires_at、finalized、
|
|
43
|
+
audited、changed_files_total、verification status。
|
|
44
|
+
|
|
45
|
+
### 3. 执行独立验证
|
|
46
|
+
|
|
47
|
+
在 active 会话中,使用 Direct 工具进行独立验证:
|
|
48
|
+
|
|
49
|
+
- 查看文件(受敏感路径拦截)
|
|
50
|
+
- 执行允许的命令(受白名单约束)
|
|
51
|
+
- 调用 `run_direct_verification_bundle` 一次跑完测试 + diff + 验收检查
|
|
52
|
+
|
|
53
|
+
或直接在 Direct Sessions 页点击 **run_direct_verification_bundle** 快捷操作。
|
|
54
|
+
|
|
55
|
+
### 4. 查看 safe 摘要
|
|
56
|
+
|
|
57
|
+
点击 **safe_direct_summary** 查看会话的有界摘要:
|
|
58
|
+
|
|
59
|
+
- changed_files_total
|
|
60
|
+
- verification status
|
|
61
|
+
- 是否命中受保护路径
|
|
62
|
+
|
|
63
|
+
> 完整 diff 与 stdout 不会自动加载,仅在高级区按需查看。
|
|
64
|
+
|
|
65
|
+
### 5. Finalize 会话
|
|
66
|
+
|
|
67
|
+
验证完成后点击 **safe_finalize_direct_session**(或调用
|
|
68
|
+
`POST /api/direct-sessions/:sessionId/finalize`),把会话标记为 `finalized`,
|
|
69
|
+
冻结变更记录,准备进入审计。
|
|
70
|
+
|
|
71
|
+
### 6. Audit 会话
|
|
72
|
+
|
|
73
|
+
对 finalized 会话点击 **safe_audit_direct_session**(或调用
|
|
74
|
+
`POST /api/direct-sessions/:sessionId/audit`),生成审计摘要,会话进入
|
|
75
|
+
`audited` 状态。审计摘要可用于归档或与 lineage 的 direct_verification 对照。
|
|
76
|
+
|
|
77
|
+
### 7. 处理过期会话
|
|
78
|
+
|
|
79
|
+
超过 expires_at 的会话进入 `expired` 状态,默认折叠。可执行:
|
|
80
|
+
|
|
81
|
+
- **copy session_id** — 复制 id 用于追溯
|
|
82
|
+
- **hide expired** — 调用 `POST /api/direct-sessions/:sessionId/hide` 隐藏
|
|
83
|
+
|
|
84
|
+
## 安全边界
|
|
85
|
+
|
|
86
|
+
- Direct 会话仍受 workspace 隔离、命令白名单、敏感路径拦截约束。
|
|
87
|
+
- Direct 不会自动 patch 文件,所有写操作都需要显式确认。
|
|
88
|
+
- safe 摘要不含完整 diff / stdout / 密钥内容。
|
|
89
|
+
- finalize 与 audit 只修改本地会话状态,不触发远程写。
|
|
90
|
+
- Direct 不执行 `npm publish` / `git push` / `git tag` / `gh release`。
|
|
91
|
+
|
|
92
|
+
## 相关 API 端点
|
|
93
|
+
|
|
94
|
+
- `GET /api/direct-sessions` — 会话列表(按状态分组)
|
|
95
|
+
- `GET /api/direct-sessions/:sessionId` — 单个会话详情
|
|
96
|
+
- `POST /api/direct-sessions/:sessionId/finalize` — finalize 会话
|
|
97
|
+
- `POST /api/direct-sessions/:sessionId/audit` — audit 会话
|
|
98
|
+
- `POST /api/direct-sessions/:sessionId/hide` — 隐藏过期会话
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Evidence Pack v2 文件结构
|
|
2
|
+
|
|
3
|
+
> 本文基于 v1.5.1 源码编写;安装时请使用已验证发布的 <published-version>。(Evidence Pack v2)
|
|
4
|
+
> 相关页面:`export_task_evidence_pack` MCP 工具、Lineage 与 Evidence Pack 工作流
|
|
5
|
+
|
|
6
|
+
## 概述
|
|
7
|
+
|
|
8
|
+
`export_task_evidence_pack` 导出 8 个有界文件到
|
|
9
|
+
`.patchwarden/evidence-packs/<lineage_id>/`。每个文件只包含有界摘要,
|
|
10
|
+
**不**包含完整 stdout/stderr/diff/secrets/.env/token/cookie/凭据路径。
|
|
11
|
+
|
|
12
|
+
## 文件清单
|
|
13
|
+
|
|
14
|
+
| 文件 | 用途 |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `evidence.json` | 完整有界证据包(机器可读),含 lineage、policy、catalog 摘要。 |
|
|
17
|
+
| `EVIDENCE.md` | 人类可读的 Markdown 证据摘要。 |
|
|
18
|
+
| `risk.json` | 聚合的风险项与严重度(high/medium/low)。 |
|
|
19
|
+
| `verify.json` | 每轮迭代和 direct session 的结构化验证记录。 |
|
|
20
|
+
| `diffstat.json` | 文件级增删统计(路径、增删行数),不含完整 diff。 |
|
|
21
|
+
| `lineage.json` | lineage 有界摘要(goal、final_status、stop_reason、task 计数)。 |
|
|
22
|
+
| `attestation.json` | 版本、commit、Node/OS、tool profile、schema epoch 等溯源信息。 |
|
|
23
|
+
| `redactions.json` | 本次导出中脱敏的类别与计数(不存原始隐藏值)。 |
|
|
24
|
+
|
|
25
|
+
## risk.json
|
|
26
|
+
|
|
27
|
+
从 lineage 的 rounds(`fail_checks` / `warn_checks`)和 `warnings` 聚合风险项。
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"risks": [
|
|
32
|
+
{
|
|
33
|
+
"source": "round",
|
|
34
|
+
"task_id": "task-main",
|
|
35
|
+
"severity": "high",
|
|
36
|
+
"category": "fail_check",
|
|
37
|
+
"detail": "verification failed: npm test exited with code 1"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"source": "round",
|
|
41
|
+
"task_id": "task-main",
|
|
42
|
+
"severity": "medium",
|
|
43
|
+
"category": "warn_check",
|
|
44
|
+
"detail": "minor scope drift"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"source": "lineage",
|
|
48
|
+
"severity": "low",
|
|
49
|
+
"category": "warning",
|
|
50
|
+
"detail": "diff.patch was truncated"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"count": 3,
|
|
54
|
+
"by_severity": { "high": 1, "medium": 1, "low": 1 }
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**严重度映射**:
|
|
59
|
+
|
|
60
|
+
- `high` — round 的 `fail_checks`
|
|
61
|
+
- `medium` — round 的 `warn_checks`
|
|
62
|
+
- `low` — lineage 的 `warnings`
|
|
63
|
+
|
|
64
|
+
如果 lineage 无风险信息,写 `{"risks": [], "count": 0, "by_severity": {"high": 0, "medium": 0, "low": 0}}`。
|
|
65
|
+
|
|
66
|
+
## verify.json
|
|
67
|
+
|
|
68
|
+
从 lineage 的 rounds 和 direct_sessions 提取结构化验证记录。
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"records": [
|
|
73
|
+
{
|
|
74
|
+
"source": "round",
|
|
75
|
+
"task_id": "task-main",
|
|
76
|
+
"role": "main",
|
|
77
|
+
"verification_status": "passed",
|
|
78
|
+
"audit_verdict": "pass",
|
|
79
|
+
"passed": true
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"source": "direct_session",
|
|
83
|
+
"session_id": "direct-one",
|
|
84
|
+
"verification_status": "passed",
|
|
85
|
+
"audit_verdict": "pass",
|
|
86
|
+
"passed": true,
|
|
87
|
+
"command_count": 3,
|
|
88
|
+
"passed_commands": 3,
|
|
89
|
+
"failed_commands": 0
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"count": 2,
|
|
93
|
+
"summary": { "total": 2, "passed": 2, "failed": 0 },
|
|
94
|
+
"latest_status": "passed",
|
|
95
|
+
"overall_passed": true
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**有界规则**:不含 stdout_tail/stderr_tail/完整验证日志,只保留状态与计数摘要。
|
|
100
|
+
|
|
101
|
+
如果 lineage 无验证信息,写空 records 数组。
|
|
102
|
+
|
|
103
|
+
## diffstat.json
|
|
104
|
+
|
|
105
|
+
从 lineage 引用的 task 目录(`<tasksDir>/<task_id>/file-stats.json`)聚合文件级增删统计。
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"files": [
|
|
110
|
+
{
|
|
111
|
+
"path": "src/index.ts",
|
|
112
|
+
"status": "modified",
|
|
113
|
+
"additions": 12,
|
|
114
|
+
"deletions": 3,
|
|
115
|
+
"task_id": "task-main"
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"count": 1,
|
|
119
|
+
"totals": { "additions": 12, "deletions": 3 }
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**有界规则**:只存文件路径与行级增删计数,**不**含完整 diff 内容。所有路径经过
|
|
124
|
+
`redactSensitiveValue` 脱敏处理。如果 task 目录不存在或 file-stats.json 缺失,写空数组。
|
|
125
|
+
|
|
126
|
+
## lineage.json
|
|
127
|
+
|
|
128
|
+
lineage 的有界摘要,不含完整 rounds 详情或 warnings/errors 原文。
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"lineage_id": "lineage_20260709_120000_a1b2c3d4",
|
|
133
|
+
"goal": "Fix authentication bug",
|
|
134
|
+
"final_status": "accepted",
|
|
135
|
+
"stop_reason": "success",
|
|
136
|
+
"iterations_count": 1,
|
|
137
|
+
"task_counts": {
|
|
138
|
+
"main": 1,
|
|
139
|
+
"fix": 0,
|
|
140
|
+
"cleanup": 0,
|
|
141
|
+
"direct_sessions": 1
|
|
142
|
+
},
|
|
143
|
+
"verification": { "latest_status": "passed", "passed": true },
|
|
144
|
+
"worktree": { "isolation_mode": "worktree", "status": "active" },
|
|
145
|
+
"agent_routing": { "selected_agent": "codex" },
|
|
146
|
+
"warnings_count": 0,
|
|
147
|
+
"errors_count": 0,
|
|
148
|
+
"truncated": false
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## attestation.json
|
|
153
|
+
|
|
154
|
+
记录生成此证据包时的环境与版本溯源信息。
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"patchwarden_version": "1.5.1",
|
|
159
|
+
"package_version": "1.5.1",
|
|
160
|
+
"commit": "bc950a2",
|
|
161
|
+
"node_version": "v20.11.0",
|
|
162
|
+
"os": { "platform": "win32", "arch": "x64" },
|
|
163
|
+
"tool_profile": "full",
|
|
164
|
+
"schema_epoch": "2026-07-05-v13",
|
|
165
|
+
"generated_at": "2026-07-09T12:00:00.000Z"
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**字段说明**:
|
|
170
|
+
|
|
171
|
+
- `patchwarden_version` — `src/version.ts` 中的 `PATCHWARDEN_VERSION`
|
|
172
|
+
- `package_version` — `package.json` 中的 version(与 patchwarden_version 一致)
|
|
173
|
+
- `commit` — `git rev-parse --short HEAD` 获取的 short hash;非 Git 环境为 `"unknown"`
|
|
174
|
+
- `node_version` — `process.version`
|
|
175
|
+
- `os` — `process.platform` 与 `process.arch`
|
|
176
|
+
- `tool_profile` — 当前工具目录快照的 profile
|
|
177
|
+
- `schema_epoch` — `TOOL_SCHEMA_EPOCH`
|
|
178
|
+
|
|
179
|
+
## redactions.json
|
|
180
|
+
|
|
181
|
+
记录本次导出中脱敏的类别、原因与计数。**不存原始隐藏值**。
|
|
182
|
+
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"redactions": [
|
|
186
|
+
{
|
|
187
|
+
"category": "known_token_format",
|
|
188
|
+
"reason": "matched known token format",
|
|
189
|
+
"count": 1
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
"total_redacted": 1,
|
|
193
|
+
"bounded": true,
|
|
194
|
+
"note": "Only categories and counts are recorded; original secret values are never persisted."
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**脱敏类别**:
|
|
199
|
+
|
|
200
|
+
| category | 匹配内容 |
|
|
201
|
+
| --- | --- |
|
|
202
|
+
| `private_key` | PEM 私钥块 |
|
|
203
|
+
| `bearer_token` | `Bearer <token>` 格式 |
|
|
204
|
+
| `npm_token` | npm `_?authToken=` 赋值 |
|
|
205
|
+
| `credential_assignment` | `api_key=` / `secret=` / `password=` 等凭据赋值 |
|
|
206
|
+
| `known_token_format` | `sk_` / `ghp_` / `github_pat_` 前缀的 token |
|
|
207
|
+
|
|
208
|
+
## 安全边界
|
|
209
|
+
|
|
210
|
+
- 所有 v2 文件经过 `redactSensitiveValue` 处理后才写入磁盘。
|
|
211
|
+
- `redactions.json` 只记录类别 + 原因 + 计数,**永不**持久化原始密钥值。
|
|
212
|
+
- `diffstat.json` 只存文件路径与行级计数,不含 diff 正文。
|
|
213
|
+
- `verify.json` 只存状态摘要,不含 stdout/stderr tail。
|
|
214
|
+
- `.patchwarden/evidence-packs/` 不进入 npm 包(package.json `files` 已排除)。
|
|
215
|
+
- MCP 工具 `export_task_evidence_pack` 的输入参数无破坏性变更,只是输出多了文件。
|