@ckanner/flywheel 0.31.0 → 0.31.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.
Files changed (136) hide show
  1. package/CHANGELOG.md +48 -5
  2. package/CONTRIBUTING.md +19 -0
  3. package/LICENSE +21 -0
  4. package/README.en.md +4 -171
  5. package/README.md +152 -269
  6. package/README.zh-CN.md +116 -0
  7. package/bin/flywheel-claude-code-pro-worker.js +1 -1
  8. package/bin/flywheel-codex-pro-worker.js +1 -1
  9. package/bin/flywheel-dsh-worker.js +1 -1
  10. package/bin/flywheel.js +1 -1
  11. package/bin/runtime.js +1 -1
  12. package/docs/README.md +84 -0
  13. package/docs/README.zh-CN.md +64 -0
  14. package/docs/archive/README.md +13 -0
  15. package/docs/archive/codex-pro-adapter-handoff.md +197 -0
  16. package/docs/archive/design-v0.24.md +540 -0
  17. package/docs/design.md +681 -0
  18. package/docs/en/claude-code-pro.md +25 -16
  19. package/docs/en/configuration.md +306 -141
  20. package/docs/en/contributing.md +303 -0
  21. package/docs/en/flow-console.md +67 -13
  22. package/docs/en/getting-started.md +232 -126
  23. package/docs/en/investigation.md +219 -0
  24. package/docs/en/jev-shadow.md +67 -0
  25. package/docs/en/model-policy.md +147 -62
  26. package/docs/en/releasing.md +207 -0
  27. package/docs/en/session-evaluation.md +4 -2
  28. package/docs/en/session-recovery.md +49 -6
  29. package/docs/en/workflow.md +222 -114
  30. package/docs/evaluation/README.md +12 -0
  31. package/docs/evaluation/jev-historical-provisional.json +138 -0
  32. package/docs/evaluation/jev-historical-result-2026-11-10.json +174 -0
  33. package/docs/plans/2026-11-01-dsh-integration.md +67 -0
  34. package/docs/plans/2026-11-01-model-profiles-preflight.md +29 -0
  35. package/docs/plans/2026-11-01-npm-installation.md +19 -0
  36. package/docs/plans/2026-11-03-codex-pro-default.md +28 -0
  37. package/docs/plans/2026-11-06-adaptive-workflow.md +365 -0
  38. package/docs/plans/2026-11-07-session-lifecycle.en.md +424 -0
  39. package/docs/plans/2026-11-07-session-lifecycle.md +337 -0
  40. package/docs/plans/2026-11-08-flow-console.md +271 -0
  41. package/docs/plans/2026-11-10-jev-shadow.md +32 -0
  42. package/docs/plans/2026-11-10-task-discovery.md +17 -0
  43. package/docs/plans/2026-11-10-workbench-redesign.md +19 -0
  44. package/docs/plans/2026-11-12-feedback-driven-workflows.md +739 -0
  45. package/docs/plans/README.md +22 -0
  46. package/docs/reviews/2026-08-24-v0.18-review-fixplan.md +265 -0
  47. package/docs/reviews/2026-09-12-pr4-pr5-review.md +70 -0
  48. package/docs/reviews/README.md +12 -0
  49. package/docs/validation/2026-11-01-npm-installation.md +105 -0
  50. package/docs/validation/2026-11-01-profiles-preflight.md +67 -0
  51. package/docs/validation/2026-11-01-results.md +114 -0
  52. package/docs/validation/2026-11-03-codex-pro-default.md +90 -0
  53. package/docs/validation/2026-11-04-dsh-native-view.md +85 -0
  54. package/docs/validation/2026-11-04-release-0.28.1.md +33 -0
  55. package/docs/validation/2026-11-04-release-0.28.2.md +35 -0
  56. package/docs/validation/2026-11-05-dsh-0.2.2-compatibility.md +26 -0
  57. package/docs/validation/2026-11-05-registry-smoke-recovery.md +26 -0
  58. package/docs/validation/2026-11-05-release-0.28.3.md +32 -0
  59. package/docs/validation/2026-11-05-subscription-model-access.md +60 -0
  60. package/docs/validation/2026-11-05-view-order.md +14 -0
  61. package/docs/validation/2026-11-07-adaptive-workflow.md +79 -0
  62. package/docs/validation/2026-11-07-claude-code-pro.md +144 -0
  63. package/docs/validation/2026-11-07-session-lifecycle.md +136 -0
  64. package/docs/validation/2026-11-08-session-p3-p4.md +99 -0
  65. package/docs/validation/2026-11-09-flow-console.md +81 -0
  66. package/docs/validation/2026-11-10-jev-shadow.md +50 -0
  67. package/docs/validation/2026-11-10-task-discovery.md +45 -0
  68. package/docs/validation/2026-11-10-workbench-redesign.md +54 -0
  69. package/docs/validation/2026-11-11-release-0.30.2.md +65 -0
  70. package/docs/validation/2026-11-11-release-0.31.0.md +46 -0
  71. package/docs/validation/2026-11-12-dsh-0.2.2-rc.2.md +58 -0
  72. package/docs/validation/2026-11-12-feedback-driven-workflows.md +187 -0
  73. package/docs/validation/README.md +41 -0
  74. package/docs/validation/evidence/2026-11-08-session-p3-p4.json +5430 -0
  75. package/docs/validation/evidence/claude-node-bridges.txt +118 -0
  76. package/docs/validation/evidence/claude-npm-build.txt +15 -0
  77. package/docs/validation/evidence/claude-npm-candidate.json +54 -0
  78. package/docs/validation/evidence/claude-npm-install.txt +21 -0
  79. package/docs/validation/evidence/claude-npm-tests.txt +145 -0
  80. package/docs/validation/evidence/claude-plugin-tests.txt +205 -0
  81. package/docs/validation/evidence/claude-quality-gate.txt +29 -0
  82. package/docs/validation/evidence/claude-race.txt +7 -0
  83. package/docs/validation/evidence/codex-pro-070-probes.txt +4 -0
  84. package/docs/validation/evidence/dsh-bridge.txt +4 -0
  85. package/docs/validation/evidence/dsh-native-view-bridge-tests.txt +1 -0
  86. package/docs/validation/evidence/dsh-native-view-build.txt +15 -0
  87. package/docs/validation/evidence/dsh-native-view-candidate.json +54 -0
  88. package/docs/validation/evidence/dsh-native-view-inspect.txt +27 -0
  89. package/docs/validation/evidence/dsh-native-view-install-tests.txt +19 -0
  90. package/docs/validation/evidence/dsh-native-view-npm-tests.txt +143 -0
  91. package/docs/validation/evidence/dsh-native-view-plugin-tests.txt +99 -0
  92. package/docs/validation/evidence/dsh-native-view-quality-gate.txt +29 -0
  93. package/docs/validation/evidence/dsh-plugin-tests.txt +48 -0
  94. package/docs/validation/evidence/function-coverage.txt +378 -0
  95. package/docs/validation/evidence/npm-build.txt +13 -0
  96. package/docs/validation/evidence/npm-contract-tests.txt +65 -0
  97. package/docs/validation/evidence/npm-dsh-bridge.txt +18 -0
  98. package/docs/validation/evidence/npm-dsh-plugin-tests.txt +62 -0
  99. package/docs/validation/evidence/npm-function-coverage.txt +420 -0
  100. package/docs/validation/evidence/npm-install-tests.txt +20 -0
  101. package/docs/validation/evidence/npm-quality-gate.txt +29 -0
  102. package/docs/validation/evidence/npm-race.txt +7 -0
  103. package/docs/validation/evidence/pr-dsh-bridge.txt +4 -0
  104. package/docs/validation/evidence/pr-dsh-plugin-tests.txt +48 -0
  105. package/docs/validation/evidence/pr-function-coverage.txt +379 -0
  106. package/docs/validation/evidence/pr-quality-gate.txt +28 -0
  107. package/docs/validation/evidence/pr-race.txt +6 -0
  108. package/docs/validation/evidence/profiles-control-smoke.json +1 -0
  109. package/docs/validation/evidence/profiles-dsh-bridge.txt +18 -0
  110. package/docs/validation/evidence/profiles-dsh-plugin-tests.txt +59 -0
  111. package/docs/validation/evidence/profiles-function-coverage.txt +411 -0
  112. package/docs/validation/evidence/profiles-quality-gate.txt +29 -0
  113. package/docs/validation/evidence/profiles-race.txt +7 -0
  114. package/docs/validation/evidence/quality-gate.txt +28 -0
  115. package/docs/validation/evidence/race.txt +6 -0
  116. package/docs/validation/evidence/watchdog-startup-after.txt +2 -0
  117. package/docs/validation/evidence/watchdog-startup-before.txt +6 -0
  118. package/docs/validation/evidence/watchdog-startup-quality-gate.txt +29 -0
  119. package/docs/validation/evidence/watchdog-startup-race.txt +7 -0
  120. package/docs/{claude-code-pro.md → zh-CN/claude-code-pro.md} +23 -17
  121. package/docs/{configuration.md → zh-CN/configuration.md} +323 -139
  122. package/docs/zh-CN/contributing.md +240 -0
  123. package/docs/{flow-console.md → zh-CN/flow-console.md} +55 -12
  124. package/docs/zh-CN/getting-started.md +352 -0
  125. package/docs/zh-CN/investigation.md +182 -0
  126. package/docs/zh-CN/jev-shadow.md +79 -0
  127. package/docs/zh-CN/model-policy.md +123 -0
  128. package/docs/zh-CN/releasing.md +120 -0
  129. package/docs/{session-evaluation.md → zh-CN/session-evaluation.md} +4 -2
  130. package/docs/{session-recovery.md → zh-CN/session-recovery.md} +46 -12
  131. package/docs/zh-CN/workflow.md +270 -0
  132. package/npm/install.js +1 -1
  133. package/package.json +12 -25
  134. package/docs/getting-started.md +0 -418
  135. package/docs/model-policy.md +0 -65
  136. package/docs/workflow.md +0 -314
@@ -1,10 +1,20 @@
1
- # 模型 profiles、阶段绑定与预检
1
+ # 配置指南
2
2
 
3
- [English](en/configuration.md) · 简体中文
3
+ [文档首页](../README.zh-CN.md) · [English](../en/configuration.md) · 简体中文
4
4
 
5
- Flywheel 在启动时加载一份完整配置,再把模型 profile 展开成每个阶段的实际绑定。模型选择是显式配置,不由另一个模型替你决定;修改配置后需要重新启动引擎。
5
+ Flywheel 启动时选择一份完整配置,展开模型 profiles,再解析阶段绑定。模型分配、
6
+ 工作流选择、权限、调度和会话历史是独立策略。安装保留已有文件,修改配置后需重启引擎。
6
7
 
7
- ## 1. 配置来源
8
+ 编辑前先用 `config inspect` 查明生效文件。下文只展示部分字段的示例是需要并入完整
9
+ 配置的**片段**。
10
+
11
+ - [配置来源](#配置来源)与[完整模板](#从完整模板开始)
12
+ - [模型字段](#字段与身份)与[订阅预设迁移](#将已有配置迁移到订阅预设)
13
+ - [权限](#完全权限与无需逐步确认)与[调度](#调度与-worktree)
14
+ - [会话历史](#会话策略历史复用与调用安全)与[工作流策略](#工作流策略与恢复)
15
+ - [后端接入](#codex-pro-与旧配置迁移)、[预算](#后备渠道与预算)和[预检](#无推理诊断)
16
+
17
+ ## 配置来源
8
18
 
9
19
  发现顺序为任务目录、项目 Git 根目录、全局文件、内嵌默认表,选择第一个存在的完整文件。全局默认路径为 `~/.config/flywheel/flywheel.config.json`;`FLYWHEEL_CONFIG` 可覆盖全局文件路径,但不能越过已经存在的任务/项目配置。当前不通过 `XDG_CONFIG_HOME` 改变该默认路径。
10
20
 
@@ -18,11 +28,117 @@ flywheel config inspect --cwd /repo --task-dir /repo/docs/task --json
18
28
 
19
29
  展示值包含 Flywheel 已确定的 driver 默认:DSH/Codex/Kimi 的空 thinking 为 high,pi/omp/zcode 为 max;Kimi/Codex/Zcode 的空 model 使用各自 driver 常量。pi/omp 未指定模型时仍留空,表示 Flywheel 不能从配置确定它。`residentSession` 只有 Plan+Kimi+明确启用时为 true,不把其他阶段忽略的请求显示为已生效。
20
30
 
21
- ### 将旧配置切换到已有的三种资源
31
+ ### 在控制台编辑配置
32
+
33
+ DSH 的「全局 / 项目配置」先读取显式作用域和文件 revision,再编辑模型绑定、角色会话策略、预算、超时、重试或全局权限。在表单旁审阅改动并保存。目标文件被其他编辑器修改时拒绝覆盖,保存结果未确认时先重新读取核对。新项目文件以当前版本默认模板创建完整配置,项目文件优先于全局,任务文件优先于项目,不按字段合并。
34
+
35
+ 高级调用通过 stdin 传入 JSON。读取示例使用 `flywheel control config-edit --cwd /absolute/repo`,输入为 `{"scope":"project"}`。保存使用 `control config-save`,输入包含 scope、读取返回的 revision,以及仅包含改动章节的 values。reset=true 从内嵌默认完整模板开始替换。配置保存创建备份并原子发布,下一次引擎启动时加载。
36
+
37
+ ## 字段与身份
38
+
39
+ | 字段 | 含义 | 示例 |
40
+ |---|---|---|
41
+ | `harness` | 实际工具循环与进程后端 | `dsh`、`kimi`、`codex-pro`、`claude-code-pro`;`codex` 为显式旧 CLI 路径 |
42
+ | `provider` | DSH SDK 已注册的 LLM adapter ID;仅 DSH 使用 | `deepseek-account`、`chatgpt` |
43
+ | `channel` | 配置中的凭证/后备/计量渠道名称 | `deepseek-account-sdk`、`chatgpt-sdk`、`kimi-subscription` |
44
+ | `model` | 传给后端的精确模型标识 | `deepseek-flash`、`kimi-code/k3.1-pro`、`gpt-6.1-sol` |
45
+ | `thinking` | 请求的推理等级 | `high` |
46
+ | `profile` | 当前 Flywheel 配置内的一组模型字段引用 | `flash`、`gpt-review`、`kimi` |
47
+
48
+ Flywheel 的 model profile 与 DSH 的 `sdk`/`desktop` profile 是两件事。前者复用模型定义,后者决定宿主实际加载的插件和授权配置。channel 别名本身不会切换 DSH 账号;给同一个 provider 起两个 channel 名称不等于拥有两份独立订阅或额度。
49
+
50
+ DSH 的实际 provider 按 `binding.provider` → `channels[channel].provider` → 旧 `channel` 名解析。前两者都明确配置而不相等时拒绝加载。兼容旧内联配置的最后一项只适用于 DSH;Codex Pro/旧 Codex CLI 和 Kimi 使用自己的登录状态,不接受一个会被静默忽略的 provider。
51
+
52
+ ### DeepSeek 账号与 API Key 是两个 provider
53
+
54
+ | 方式 | Provider | 凭证来源 | 选择方式 |
55
+ |---|---|---|---|
56
+ | DSH 已登录、已充值的 DeepSeek 账号 | `deepseek-account` | DSH 的 `deepseekAccount` 服务 | 当前源码默认;不要求 `DEEPSEEK_API_KEY` |
57
+ | DeepSeek API Key | `deepseek-official` | DSH credentials/启动环境中的 API key,默认引用 `DEEPSEEK_API_KEY` | 仅在用户明确选择 API 路径时配置 |
58
+
59
+ 标准 SDK profile 叠加的 [base](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/bundle/base/cordis.patch.yml) 包含账号服务和这两种 adapter。标准桌面与 SDK 使用同一 `DSH_HOME` 时,默认共享该 home 下的[账号授权存储](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/credentials/credentials-local/src/index.ts);profile 隔离插件配置,不要求把 token 复制到 `sdk` 或改用 `desktop` profile。自定义 home、凭证存储或 SDK 插件集时,须核对它们指向同一授权来源。这里不读取或展示凭证值。
60
+
61
+ DSH 桌面在登录后且没有任何 provider API key 时,可以自动选择账号目录里的第一个模型。该桌面默认不决定独立 SDK 会话的 provider/model,且“第一个模型”不保证是 Flash。Flywheel 因此明确传入 `deepseek-account`/`deepseek-flash`;账号未登录、授权失效或额度不足时保留失败。默认预设没有 API Key 后备;用户显式配置的后备链仍按既有规则处理。已核对的[官方账号 adapter](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek-account/src/index.ts)、[API adapter](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek-api-key/src/index.ts)及[默认选择逻辑](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/api/session-controller/src/index.ts)是这一边界的依据。
62
+
63
+ 需要继续用 API Key 的自定义配置仍受支持:在完整配置的相关绑定及其 channel 中一致选择 `deepseek-official`,按 DSH API provider 的正常方式配置凭证。不要仅改 channel 名却保留冲突的显式 provider;也不必为账号路径额外添加 API key。
64
+
65
+ ## 从完整模板开始
66
+
67
+ 查看默认内联表或可复用 profiles 表:
68
+
69
+ ```sh
70
+ flywheel template flywheel.config.example.json
71
+ flywheel template flywheel.profiles.example.json
72
+ ```
73
+
74
+ 确认目标没有需要保留的配置后,选择其中一份导出到项目根。已有配置先备份并审阅差异,避免 shell 重定向覆盖它。可以使用 Bash 的 noclobber 避免覆盖已有普通文件:
75
+
76
+ ```sh
77
+ (set -C; flywheel template flywheel.profiles.example.json > flywheel.config.json)
78
+ ```
79
+
80
+ 不要只写几个 profiles 后期待继承另一个文件的内容。下面只是解释结构的片段;完整可用起点在第二份模板中:
81
+
82
+ ```json
83
+ {
84
+ "profiles": {
85
+ "flash": {
86
+ "harness": "dsh",
87
+ "provider": "deepseek-account",
88
+ "channel": "deepseek-account-sdk",
89
+ "model": "deepseek-flash",
90
+ "thinking": "high"
91
+ },
92
+ "gpt": {
93
+ "harness": "dsh",
94
+ "provider": "chatgpt",
95
+ "channel": "chatgpt-sdk",
96
+ "model": "gpt-6.1-sol",
97
+ "thinking": "high"
98
+ }
99
+ },
100
+ "loops": {
101
+ "review": { "profile": "gpt" },
102
+ "judge": { "profile": "gpt", "model": "gpt-6-astra" },
103
+ "intake": { "profile": "flash", "thinking": "low" }
104
+ },
105
+ "routes": {
106
+ "default": { "profile": "flash" }
107
+ },
108
+ "channels": {
109
+ "deepseek-account-sdk": { "harness": "dsh", "provider": "deepseek-account", "env-key": null },
110
+ "chatgpt-sdk": { "harness": "dsh", "provider": "chatgpt", "env-key": null }
111
+ }
112
+ }
113
+ ```
114
+
115
+ 这些模型名沿用本仓库的初始绑定,能否使用仍由实际账号和 adapter 决定。读取配置、看到模型名称、adapter 接受参数都不等于账号已获授权。DeepSeek 默认仅 Flash;profiles 不引入自动跨渠道付费回退。
116
+
117
+ ### 覆盖与错误规则
22
118
 
23
- 当前源码的 `subscriptions` 预设只使用 ChatGPT 订阅、Kimi Code 订阅和 DSH 已登录并充值的 DeepSeek 账号(仅 Flash,`provider:deepseek-account`)。普通安装/升级仍保留已有配置;所以旧文件里的 Z.AI/GLM、Kimi K3、API provider 和旧 thinking 不会因升级 UI 自动消失。
119
+ | 情况 | 行为 |
120
+ |---|---|
121
+ | 阶段省略某字段 | 继承所引用 profile 的字段 |
122
+ | 阶段显式写 `model`/`channel`/`thinking` 等 | 只覆盖该阶段,不修改共享 profile 或其他阶段 |
123
+ | `thinking: ""` | 使用对应 harness 的现有默认 effort,不重新继承 profile |
124
+ | Plan `resident-session: false` | 明确关闭 Plan 历史复用;加载、profile 展开和配置导出均保留其显式存在 |
125
+ | `judge-panel: null` | 关闭第二意见,保持默认行为 |
126
+ | profile 定义缺 `harness/model/channel`,或这些字段为空/null/纯空白 | 加载失败 |
127
+ | profile 不存在、未知字段、错拼阶段名、不支持的 harness | 加载失败,不静默回落 |
128
+ | profile 再引用另一个 profile | 不支持继承链;加载失败 |
129
+ | `_note`、`_note_*` | 允许配置对象中的说明文字,不进入执行绑定 |
24
130
 
25
- **发行边界:**迁移命令与 `permissions.mode` 已在 0.28.2 发行,但该版内嵌预设仍选择 `deepseek-official` API Key。账号默认修复从 0.28.3 开始提供。安装前核对 registry 版本。先通过 `flywheel template flywheel.config.example.json` 核对所用二进制包含 `deepseek-account`,再用下面的迁移命令;在旧 0.28.2 上重跑迁移不会得到账号默认。
131
+ `resident-session` 是既有阶段选项,不能放进 profile。它继续控制旧 Kimi Plan 行为,
132
+ 其显式 false 在 scoped 下也保持 Plan 退出;其他角色的历史复用由顶层 `sessions`
133
+ 控制。恢复的是历史,不是要求一个模型进程永久存活。
134
+
135
+ 旧内联绑定保留原有缺省行为,不强制迁移。`env-key: null`、`retry.jitter: 0`、`worktree.enabled: false` 等已有合法零值继续支持。显式切换 harness 或 channel 时,要一起核对继承的 provider;必要时用 `provider: ""` 清除显式值,再按新 channel 解析,不能保留另一个 adapter 的 ID。
136
+
137
+ ## 将已有配置迁移到订阅预设
138
+
139
+ 当前的 `subscriptions` 预设只使用 ChatGPT 订阅、Kimi Code 订阅和 DSH 已登录并充值的 DeepSeek 账号(仅 Flash,`provider:deepseek-account`)。普通安装/升级仍保留已有配置;所以旧文件里的 Z.AI/GLM、Kimi K3、API provider 和旧 thinking 不会因升级 UI 自动消失。
140
+
141
+ 先用已安装的二进制执行 `flywheel template flywheel.config.example.json`,确认它实际包含所需预设。当前预设选择 `deepseek-account`;旧二进制可能仍包含旧默认值。版本变化见[变更日志](../../CHANGELOG.md)。
26
142
 
27
143
  在实际项目目录运行以下命令;若任务目录有单独配置,再加 `--task-dir /repo/docs/my-task`:
28
144
 
@@ -34,25 +150,88 @@ flywheel config inspect --cwd /repo --json
34
150
 
35
151
  第一条只预览。`--apply` 明确应用到当前实际命中的任务/项目/全局文件,并先备份原始字节。没有文件时写全局配置,不创建意外的项目覆盖。可以用 `--expect-sha256` 绑定之前预览的摘要;文件已经变化时拒绝陈旧应用。预算、worktree、验证、重试、价格和用户说明等非模型设置保留,Plan 明确设置的 `resident-session:false` 以及现有 `sessions` 策略或其缺省状态也保留;模型迁移不会让旧文件自动启用 scoped。配置损坏、额外自定义路由/阶段或不支持的文件身份会明确阻断,不猜测替代。
36
152
 
37
- 迁移写入完整的阶段模型、thinking 和渠道,去掉被替换绑定的旧 profile 引用,清除所选渠道的旧 fallback/模型映射,使旧付费渠道不再自动可达;未引用的自定义 profiles/channels 仍保留。包括 0.28.2 留下的 API channel,也可以作为未引用配置保留,但不会成为账号路由的自动后备。默认关闭第二意见,并明确报告旧多模态路由被停用。默认分配仍是 Kimi K3.1 Pro high 负责 Plan/frontend/Garden,DeepSeek Flash high 负责普通执行、low 负责 Intake,GPT-6.1 Sol high 负责 hard/Review,GPT-6 Astra high 负责 Judge。hard 通过 Codex Pro 插件,Review/Judge 通过 DSH ChatGPT provider。Kimi 缺省模型为 `kimi-code/k3.1-pro`;显式写入的自选模型不会被仅修改 driver 缺省值覆盖。档位依据与尚未完成的对照评估见[推理等级与账号选择](model-policy.md)。
153
+ 迁移写入完整的阶段模型、thinking 和渠道,去掉被替换绑定的旧 profile 引用,清除所选渠道的旧 fallback/模型映射,使旧付费渠道不再自动可达;未引用的自定义 profiles/channels 仍保留。包括旧版留下的 API channel,也可以作为未引用配置保留,但不会成为账号路由的自动后备。默认关闭第二意见,并明确报告旧多模态路由被停用。默认分配仍是 Kimi K3.1 Pro high 负责 Plan/frontend/Garden,DeepSeek Flash high 负责普通执行、low 负责 Intake,GPT-6.1 Sol high 负责 hard/Review,GPT-6 Astra high 负责 Judge。hard 通过 Codex Pro 插件,Review/Judge 通过 DSH ChatGPT provider。Kimi 缺省模型为 `kimi-code/k3.1-pro`;显式写入的自选模型不会被仅修改 driver 缺省值覆盖。档位依据与尚未完成的对照评估见[推理等级与账号选择](model-policy.md)。
38
154
 
39
155
  迁移不登录账号,也不发模型请求。当前运行中的任务继续使用启动时已加载的配置;新配置在下一次启动生效。检查迁移后的 source/scope/bindings,再按需要停止和恢复任务。
40
156
 
41
157
  迁移期间不要同时编辑目标文件。迁移锁协调 Flywheel 迁移进程;写入前再次检查文件,再原子替换完整文件,不提供对任意外部编辑器的原子 CAS。报告以 `configurationStatus` 区分拟议配置 `proposed`、重读确认的实际配置 `effective` 和写入后尚未确认的 `unconfirmed`;备份/写入失败不能把新模型显示成已生效。
42
158
 
43
- ### 完全权限与无需逐步确认
159
+ ## 完全权限与无需逐步确认
44
160
 
45
161
  ```json
46
162
  {"permissions":{"mode":"full-access"}}
47
163
  ```
48
164
 
49
- 新安装模板和显式 `subscriptions` 迁移都写入这一设置。全部阶段使用完全权限:DSH/Codex 请求 `danger-full-access` 与 `approval=never`,Codex Pro 通过其公开 machine API 映射,Kimi print 沿用原生 auto。它表示这些 worker 可以访问当前操作系统用户本来能够访问的文件和命令,并不从 DSH 对话框的权限下拉菜单继承。
165
+ 新安装模板和显式 `subscriptions` 迁移都写入这一全局设置;已有逐绑定覆盖仍优先。未覆盖阶段使用完全权限:DSH/Codex 请求 `danger-full-access` 与 `approval=never`,Codex Pro 通过其公开 machine API 映射,Kimi print 沿用原生 auto。它表示这些 worker 可以访问当前操作系统用户本来能够访问的文件和命令,并不从 DSH 对话框的权限下拉菜单继承。
50
166
 
51
167
  旧文件没有 `permissions` 时保持 `role-based`:Plan/Execute 为项目内写入,Review/Judge 为只读。两种策略都不等待交互审批;只读/项目限制下的 `never` 可能直接拒绝动作,不能把它等同于完全权限。`permissions.mode` 的拼写、类型和枚举都会在启动前校验。
52
168
 
53
169
  完全权限不会关闭 Flywheel 的任务边界、冻结验收、验证和候选身份检查。评审职责仍是评价已有候选,修改候选或验收条件不能取得有效通过。需要受限权限时显式使用 `role-based`;工作区隔离本身不是 OS 沙箱。
54
170
 
55
- ### 会话策略、历史复用与调用安全
171
+ ### 逐绑定权限覆盖
172
+
173
+ `permissions.bindings` 按 `loops.<role>`、`routes.<route>` 或 `judge-panel` 覆盖
174
+ 全局策略,值为 `read-only`、`workspace-write` 或 `danger-full-access`;未覆盖绑定
175
+ 沿用全局设置。例如:
176
+
177
+ ```json
178
+ {
179
+ "permissions": {
180
+ "mode": "full-access",
181
+ "bindings": {"loops.review": "read-only"}
182
+ }
183
+ }
184
+ ```
185
+
186
+ 字段以[权限 schema](https://github.com/ckanner/flywheel/blob/main/templates/permission-policy.schema.json)为准。各后端必须
187
+ 支持选定能力;Claude Code Pro 要求完全权限,原生审批设置不提供 OS 只读沙箱。
188
+ 实际权限变化也会改变会话复用资格。
189
+
190
+ ## 调度与 Worktree
191
+
192
+ 新安装默认配置选择并行调度,最大并发为 2。已有完整配置没有 `scheduler` 时归一为
193
+ **serial**,显式 serial 也保持不变。安装新版不会替换这些配置。
194
+ [调度 schema](https://github.com/ckanner/flywheel/blob/main/templates/scheduler-policy.schema.json)将总并发与各渠道并发限制在 1–8。
195
+
196
+ ```json
197
+ {
198
+ "scheduler": {
199
+ "mode": "parallel",
200
+ "max-parallel": 2,
201
+ "providers": {"deepseek-account": 1}
202
+ },
203
+ "worktree": {"enabled": true}
204
+ }
205
+ ```
206
+
207
+ 虽然字段名为 `providers`,其键仍是**实际配置渠道名**,并非 DSH provider ID。
208
+ 内联模板使用 `deepseek-account`;如果绑定的 channel 是 `deepseek-account-sdk`,
209
+ 就应使用后者作为限制键。
210
+
211
+ 并行资格来自 packet 的冻结声明:
212
+
213
+ ```yaml
214
+ schedule:
215
+ after: [M01-T01]
216
+ writes: [src/search/, tests/search/]
217
+ ```
218
+
219
+ 依赖须指向较早的已知 packet。写入范围是规范的相对路径或目录前缀,不支持通配符
220
+ 或越界。只有就绪且写入范围互不重叠的 packet 有并行资格;缺失声明、范围冲突或使用
221
+ live 凭证的单元仍串行。hard 预算在前一调用持久化计量前只接纳一个模型调用。
222
+ Review、集成与终验保持串行。
223
+
224
+ `worktree.enabled` 默认 true,只控制 packet 目录的自动管理,与调度独立。并行且
225
+ 自动管理时要求独立 worktree,创建失败就停止;旧串行路径可记录原地执行回退。
226
+ 关闭自动管理后,执行者可共享任务 checkout,或在实现前登记合格的外部 worktree。
227
+ 共享批次等待 worker 收尾后验证完整共同候选,全部成员通过才可交付;外部 worktree
228
+ 会被保留。
229
+
230
+ 项目工作区归属与实际执行位置分别记录。原生后端无法独立设置 `workspace-write`
231
+ 沙箱根时,会在派发前拒绝不支持的目录分离组合,不扩大权限。登记与批次规则见
232
+ [控制台指南](flow-console.md#串行与并行)。
233
+
234
+ ## 会话策略、历史复用与调用安全
56
235
 
57
236
  ```json
58
237
  {"sessions":{"mode":"scoped","policy-version":1}}
@@ -61,13 +240,13 @@ flywheel config inspect --cwd /repo --json
61
240
  新安装的两份配置模板显式选择 `scoped`。已有配置没有 `sessions` 时归一为
62
241
  `fresh`/版本 1,升级不会改写原文件。显式声明时两个字段均必填;未知模式、未来版本、
63
242
  null、错拼字段和不完整对象在模型启动前拒绝。字段信源为
64
- [会话策略 schema](../templates/session-policy.schema.json)。
243
+ [会话策略 schema](https://github.com/ckanner/flywheel/blob/main/templates/session-policy.schema.json)。
65
244
 
66
245
  `sessions.mode` 控制历史复用,不关闭调用安全记录。Codex Pro、Claude Code Pro、DSH 和 Kimi 的主任务
67
246
  Plan/Execute/Review/Judge 调用在两种模式下都先记录调用意图,再保存可信终态回执。
68
247
  `fresh` 不复用通用的角色历史,保持后端原有的新调用方式,并保留既有 Kimi Plan
69
248
  `resident-session` 行为;`scoped` 在身份兼容且终态满足条件时延续同角色历史。
70
- 其他适配器及 mock 仍使用原有调用路径;Intake/Garden 不在本轮角色会话策略内。
249
+ 其他适配器及 mock 仍使用原有调用路径;Intake/Garden 不在该角色会话策略内。
71
250
 
72
251
  | 角色 | 历史作用域与责任 |
73
252
  |---|---|
@@ -162,7 +341,86 @@ partial/unknown 用量不补零,也不能单凭缺失用量触发输入阈
162
341
  未来字段或不合法值在启动前失败。如何对真实任务进行三策略配对评估、选择阈值以及
163
342
  保留未确认结果,见[会话效果评估](session-evaluation.md)。
164
343
 
165
- ### 工作流策略与恢复
344
+ ### 可信的执行者增量上下文
345
+
346
+ 可选 `sessions.context` 省略或为 `"full"` 时保留完整提示词;显式
347
+ `"verified-incremental"` 开启仅针对 Execute 的优化。首轮与重建完整提供权威
348
+ 上下文;后续同角色续用只有在 Go 复核已消费终态回执、精确绑定、提示词版本、
349
+ 契约及全部 context/cache 文件内容摘要后,才可省略稳定契约。引用必须在当前
350
+ 执行目录内可读、为普通文件,每个文件最多 1 MiB。增量包含当前反馈、前后候选
351
+ 身份、尝试次数和权威引用。
352
+
353
+ 文件缺失或修订、契约变化、旧任务缺少检查点、上下文回执校验失败,均回到完整
354
+ 输入。模型、effort、权限或显式会话模式变化会重建历史。Plan、Review、Judge
355
+ 保持完整输入,Reviewer 每次仍检查完整当前候选与全部适用需求。
356
+ `state.sessions.records[*].context` 保存模式、身份和原因。这是协议能力,不是
357
+ 已测得的 token 节省或模型等质量证据。
358
+
359
+ ## 有界执行策略(显式启用)
360
+
361
+ `execution-policy` 版本 1 独立于 Auto/Quick/Full。省略时保持既有固定路由和
362
+ 渠道后备。[schema](https://github.com/ckanner/flywheel/blob/main/templates/execution-policy.schema.json)
363
+ 要求完整绑定及明确允许集合。核对账号和权限后,把以下章节加入实际命中的
364
+ **完整配置文件**;不能将其独立放为局部 override 文件:
365
+
366
+ ```json
367
+ {
368
+ "execution-policy": {
369
+ "version": 1,
370
+ "bindings": {
371
+ "flash-low": {
372
+ "harness": "dsh", "provider": "deepseek-account",
373
+ "channel": "deepseek-account", "model": "deepseek-flash",
374
+ "thinking": "low", "permission": "danger-full-access",
375
+ "session-mode": "scoped"
376
+ },
377
+ "flash-high": {
378
+ "harness": "dsh", "provider": "deepseek-account",
379
+ "channel": "deepseek-account", "model": "deepseek-flash",
380
+ "thinking": "high", "permission": "danger-full-access",
381
+ "session-mode": "scoped"
382
+ }
383
+ },
384
+ "routes": {
385
+ "default": {
386
+ "initial": "flash-low", "allowed": ["flash-low", "flash-high"],
387
+ "quality-order": ["flash-low", "flash-high"],
388
+ "after-stalled-attempts": 1, "max-switches": 1
389
+ }
390
+ }
391
+ }
392
+ }
393
+ ```
394
+
395
+ 绑定必须完整声明 harness/provider/channel/model/thinking、permission 和
396
+ session-mode,非 DSH 的 provider 写为 `""`。版本 1 支持已有持久调用记录的
397
+ DSH、Kimi、Codex Pro、Claude Code Pro。每个绑定权限必须等于该路由已有授权,
398
+ 所以示例假设路由本来就使用 `danger-full-access`;后端仍须验证模型实际可用性
399
+ 及公开配置/权限能力。
400
+
401
+ `quality-order` 是用户声明的实验顺序,不是模型能力排名。只有完整重复 L1
402
+ 观测确认候选、检查集合、已记录环境及失败均未变化,Go 才可前进一项。版本 1
403
+ 要求 `after-stalled-attempts:1`,在既有空转停止前考虑切换。AUTH、QUOTA、
404
+ 传输/协议错误和 unknown 不触发能力升级。原 packet 的 `max-retries` 和任务
405
+ token 预算继续生效;切换不清零失败、不增加尝试、不削减最终门禁或 Review。
406
+
407
+ 可选 `channel-fallbacks` 将一个允许绑定 ID 映射到另一个,目标须匹配显式配置
408
+ 的渠道后备链、目标 harness 和路由模型映射。已有渠道链不能越出允许集合。
409
+ 每个 packet 的 `max-switches` 同时限制两种切换。Go 在派发前冻结策略身份;
410
+ `state.packets[*].execution-policy.history` 分别保存 `quality-upgrade` 和
411
+ `channel-fallback` 的完整前后绑定、尝试与原因。并行 packet 各自持有记录。
412
+
413
+ `config inspect --json` 在 `execution-policy` 下展示完整声明,普通绑定表仍是
414
+ 配置基线,当前选择由 packet/session 状态记录。Doctor 既有绑定探测不证明每个
415
+ 允许的实验绑定均已通过接纳;实际派发仍须通过适配器配置与权限检查。
416
+
417
+ 每次切换均冷启动 Execute,仅改变 effort 也不例外;effort 保留在会话身份中。
418
+ unknown 或未消费调用先对账。恢复时删除或改变冻结策略会被拒绝:恢复原配置,
419
+ 或者用新任务运行新实验。会话/适配器回执保留请求值与可得接口接纳事实;无法
420
+ 确认的 effective effort、用量和订阅成本保持 unknown。工作流、Review/Judge
421
+ 及交付授权仍是独立边界。
422
+
423
+ ## 工作流策略与恢复
166
424
 
167
425
  工作流决定运行哪些阶段;模型 profiles、loops、routes 和 `permissions.mode` 仍决定
168
426
  各阶段使用什么后端与权限。**工作流写在 Spec 的 YAML frontmatter,不写进
@@ -214,42 +472,12 @@ flywheel control status --task-dir /repo/docs/task --cwd /repo
214
472
  Quick 复用现有 Execute 与 Review 绑定,不自动改变 thinking、账户、后备渠道或
215
473
  全访问设置。全部必需验证仍运行,适用 L2/L3 必须在实际候选中、最终 Review 前完成。
216
474
  完整最终 Review 逐项核对需求,正常首次成功只调用 Execute 与最终 Review 两个阶段。
217
- 字段信源为 [Spec schema](../templates/spec.schema.json) 与
218
- [state schema](../templates/state.schema.json),运行流程见[工作流指南](workflow.md)。
219
-
220
- ### 可选 Claude Code Pro
221
-
222
- 新增 `harness:claude-code-pro` 与未绑定的 `claude-sonnet` profile,可用于任意已配置 loop 或 Execute route。模型、thinking、optional peer 安装、full-access-only 权限及正常续接边界见 [Claude Code Pro 指南](claude-code-pro.md)。`provider` 仍只用于 DSH 原生 adapter;默认阶段分配不变。
223
-
224
- ## 2. 四个概念各负责什么
225
-
226
- | 字段 | 含义 | 示例 |
227
- |---|---|---|
228
- | `harness` | 实际工具循环与进程后端 | `dsh`、`kimi`、`codex-pro`、`claude-code-pro`;`codex` 为显式旧 CLI 路径 |
229
- | `provider` | DSH SDK 已注册的 LLM adapter ID;仅 DSH 使用 | `deepseek-account`、`chatgpt` |
230
- | `channel` | 配置中的凭证/后备/计量渠道名称 | `deepseek-account-sdk`、`chatgpt-sdk`、`kimi-subscription` |
231
- | `profile` | 当前 Flywheel 配置内的一组模型字段引用 | `flash`、`gpt-review`、`kimi` |
475
+ 字段信源为 [Spec schema](https://github.com/ckanner/flywheel/blob/main/templates/spec.schema.json) 与
476
+ [state schema](https://github.com/ckanner/flywheel/blob/main/templates/state.schema.json),运行流程见[工作流指南](workflow.md)。
232
477
 
233
- Flywheel 的 model profile 与 DSH 的 `sdk`/`desktop` profile 是两件事。前者复用模型定义,后者决定宿主实际加载的插件和授权配置。channel 别名本身不会切换 DSH 账号;给同一个 provider 起两个 channel 名称不等于拥有两份独立订阅或额度。
478
+ ## Codex Pro 与旧配置迁移
234
479
 
235
- DSH 的实际 provider 按 `binding.provider` → `channels[channel].provider` → 旧 `channel` 名解析。前两者都明确配置而不相等时拒绝加载。兼容旧内联配置的最后一项只适用于 DSH;Codex Pro/旧 Codex CLI 和 Kimi 使用自己的登录状态,不接受一个会被静默忽略的 provider。
236
-
237
- ### DeepSeek 账号与 API Key 是两个 provider
238
-
239
- | 方式 | Provider | 凭证来源 | 选择方式 |
240
- |---|---|---|---|
241
- | DSH 已登录、已充值的 DeepSeek 账号 | `deepseek-account` | DSH 的 `deepseekAccount` 服务 | 当前源码默认;不要求 `DEEPSEEK_API_KEY` |
242
- | DeepSeek API Key | `deepseek-official` | DSH credentials/启动环境中的 API key,默认引用 `DEEPSEEK_API_KEY` | 仅在用户明确选择 API 路径时配置 |
243
-
244
- 标准 SDK profile 叠加的 [base](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/bundle/base/cordis.patch.yml) 包含账号服务和这两种 adapter。标准桌面与 SDK 使用同一 `DSH_HOME` 时,默认共享该 home 下的[账号授权存储](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/credentials/credentials-local/src/index.ts);profile 隔离插件配置,不要求把 token 复制到 `sdk` 或改用 `desktop` profile。自定义 home、凭证存储或 SDK 插件集时,须核对它们指向同一授权来源。这里不读取或展示凭证值。
245
-
246
- DSH 桌面在登录后且没有任何 provider API key 时,可以自动选择账号目录里的第一个模型。该桌面默认不决定独立 SDK 会话的 provider/model,且“第一个模型”不保证是 Flash。Flywheel 因此明确传入 `deepseek-account`/`deepseek-flash`;账号未登录、授权失效或额度不足时保留失败。默认预设没有 API Key 后备;用户显式配置的后备链仍按既有规则处理。已核对的[官方账号 adapter](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek-account/src/index.ts)、[API adapter](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek-api-key/src/index.ts)及[默认选择逻辑](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/api/session-controller/src/index.ts)是这一边界的依据。
247
-
248
- 需要继续用 API Key 的自定义配置仍受支持:在完整配置的相关绑定及其 channel 中一致选择 `deepseek-official`,按 DSH API provider 的正常方式配置凭证。不要仅改 channel 名却保留冲突的显式 provider;也不必为账号路径额外添加 API key。
249
-
250
- ### Codex Pro 默认与旧配置迁移
251
-
252
- 0.28.0 的内嵌 hard 路由使用插件路径。下面是需放入自己完整配置的绑定片段,不是可替换全部配置的文件:
480
+ 内嵌 hard 路由使用插件路径。下面是需放入自己完整配置的绑定片段,不是可替换全部配置的文件:
253
481
 
254
482
  ```json
255
483
  {
@@ -266,8 +494,8 @@ DSH 桌面在登录后且没有任何 provider API key 时,可以自动选择
266
494
 
267
495
  完整 profiles 模板使用 `profiles.codex-pro`,hard 路由引用它。插件精确消费
268
496
  `dsh-subagent-codex-pro@0.9.0` 的公开 `dsh-subagent-codex-pro/machine` API。
269
- 当前候选将已审查源码生成的真实公开包一并打入插件,不能据此推断 0.9.0 已在 registry
270
- 发行。内部仍使用 Codex app-server 和用户已有登录,不需要父模型二次委派;缺包、
497
+ 精确依赖由插件 package 和 lockfile 锁定;生命周期开发时使用的源码包见
498
+ [vendor 来源记录](https://github.com/ckanner/flywheel/blob/main/plugins/dsh/vendor/README.md)。内部仍使用 Codex app-server 和用户已有登录,不需要父模型二次委派;缺包、
271
499
  版本或回执不符会失败,不自动回退 `codex exec`。Claude 另为精确 `0.4.0` optional peer,
272
500
  未选择该后端时无需安装。
273
501
 
@@ -291,79 +519,52 @@ full-access 核对 `danger-full-access`/`dangerFullAccess`,不将其称为
291
519
 
292
520
  指标的 `codex-pro-receipt` 保存完整 machine receipt,包含请求、实际配置、thread/turn、进程、清理、usage 和失败事实。effort 的 `accepted: true` 不等于服务器证明了实际推理强度,`effectiveEffort` 保留 null。仅 `usage.status: "complete"` 的本次增量进入已知预算;partial/unknown 原样留在回执并计入未知调用。插件不提供实际美元成本,原始 cost 保持 unknown;Flywheel 只有在用户显式配置 pricing 且 usage 完整时才能另行估算,估算不等于订阅账单。
293
521
 
294
- ## 3. 从完整示例开始
522
+ ### Worker 环境
295
523
 
296
- 查看默认内联表或可复用 profiles 表:
524
+ | 环境变量 | 用途 |
525
+ |---|---|
526
+ | `FLYWHEEL_DSH_WORKER` | 可选 DSH worker 路径;npm 启动器通常解析同版本依赖 |
527
+ | `FLYWHEEL_DSH_BIN` | DSH 命令,默认 PATH 中的 `dsh` |
528
+ | `FLYWHEEL_DSH_PROFILE` | SDK profile,默认 `sdk`,不能为 `desktop` |
529
+ | `DSH_HOME` | DSH 自身解释的配置根目录 |
530
+ | `FLYWHEEL_KIMI_BIN` | Kimi 命令,默认 PATH 中的 `kimi` |
531
+ | `FLYWHEEL_CODEX_PRO_WORKER` | 可选 Codex Pro worker 路径,通常由 npm 解析 |
532
+ | `FLYWHEEL_CODEX_BIN` | 插件使用的 Codex 程序,默认 PATH 中的 `codex` |
533
+ | `CODEX_HOME` | Codex 自身解释的已有配置/登录目录 |
297
534
 
298
- ```sh
299
- flywheel template flywheel.config.example.json
300
- flywheel template flywheel.profiles.example.json
301
- ```
535
+ 这些设置须对启动引擎的进程可见,安装器不复制凭证。GUI 启动器记录安装时的工具
536
+ 路径;终端中的临时 export 不会改变已运行的桌面进程。
302
537
 
303
- 确认目标没有需要保留的配置后,选择其中一份导出到项目根。已有配置先备份并审阅差异,避免 shell 重定向覆盖它。下面只是解释结构的片段;完整可用起点在第二份模板中:
538
+ ### 权限与清理边界
304
539
 
305
- ```json
306
- {
307
- "profiles": {
308
- "flash": {
309
- "harness": "dsh",
310
- "provider": "deepseek-account",
311
- "channel": "deepseek-account-sdk",
312
- "model": "deepseek-flash",
313
- "thinking": "high"
314
- },
315
- "gpt": {
316
- "harness": "dsh",
317
- "provider": "chatgpt",
318
- "channel": "chatgpt-sdk",
319
- "model": "gpt-6.1-sol",
320
- "thinking": "high"
321
- }
322
- },
323
- "loops": {
324
- "review": { "profile": "gpt" },
325
- "judge": { "profile": "gpt", "model": "gpt-6-astra" },
326
- "intake": { "profile": "flash", "thinking": "low" }
327
- },
328
- "routes": {
329
- "default": { "profile": "flash" }
330
- },
331
- "channels": {
332
- "deepseek-account-sdk": { "harness": "dsh", "provider": "deepseek-account", "env-key": null },
333
- "chatgpt-sdk": { "harness": "dsh", "provider": "chatgpt", "env-key": null }
334
- }
335
- }
336
- ```
337
-
338
- 这些模型名沿用本仓库的初始绑定,能否使用仍由实际账号和 adapter 决定。读取配置、看到模型名称、adapter 接受参数都不等于账号已获授权。DeepSeek 默认仅 Flash;profiles 不引入自动跨渠道付费回退。
540
+ Claude 原生 init 发生在 prompt 之后,不提供 Codex 同等的预派发 `thread-ready`
541
+ 保证。Claude 要求显式完全权限;Kimi CLI 同样不提供 OS 沙箱保证。须分别判断实际
542
+ 后端能力与生命周期证据。
339
543
 
340
- ### 覆盖与错误规则
341
-
342
- | 情况 | 行为 |
343
- |---|---|
344
- | 阶段省略某字段 | 继承所引用 profile 的字段 |
345
- | 阶段显式写 `model`/`channel`/`thinking` 等 | 只覆盖该阶段,不修改共享 profile 或其他阶段 |
346
- | `thinking: ""` | 使用对应 harness 的现有默认 effort,不重新继承 profile |
347
- | Plan `resident-session: false` | 明确关闭 Plan 历史复用;加载、profile 展开和配置导出均保留其显式存在 |
348
- | `judge-panel: null` | 关闭第二意见,保持默认行为 |
349
- | profile 定义缺 `harness/model/channel`,或这些字段为空/null/纯空白 | 加载失败 |
350
- | profile 不存在、未知字段、错拼阶段名、不支持的 harness | 加载失败,不静默回落 |
351
- | profile 再引用另一个 profile | 不支持继承链;加载失败 |
352
- | `_note`、`_note_*` | 允许配置对象中的说明文字,不进入执行绑定 |
544
+ worker 异常退出不能证明插件的独立管理进程已停止。启动后无法确认清理时,引擎记录
545
+ 证据并结束运行,不自动重试或换渠道。恢复前核对本任务的 app-server/guardian 进程,
546
+ 再由 Go 核对原调用结果,见[中断恢复](session-recovery.md)。
353
547
 
354
- `resident-session` 是既有阶段选项,不能放进 profile。它继续控制旧 Kimi Plan 行为,
355
- 其显式 false 在 scoped 下也保持 Plan 退出;其他角色的历史复用由顶层 `sessions`
356
- 控制。恢复的是历史,不是要求一个模型进程永久存活。
548
+ ## 可选 Claude Code Pro
357
549
 
358
- 旧内联绑定保留原有缺省行为,不强制迁移。`env-key: null`、`retry.jitter: 0`、`worktree.enabled: false` 等已有合法零值继续支持。显式切换 harness 或 channel 时,要一起核对继承的 provider;必要时用 `provider: ""` 清除显式值,再按新 channel 解析,不能保留另一个 adapter 的 ID。
550
+ 新增 `harness:claude-code-pro` 与未绑定的 `claude-sonnet` profile,可用于任意已配置 loop 或 Execute route。模型、thinking、optional peer 安装、full-access-only 权限及正常续接边界见 [Claude Code Pro 指南](claude-code-pro.md)。`provider` 仍只用于 DSH 原生 adapter;默认阶段分配不变。
359
551
 
360
- ## 4. 后备渠道与记录
552
+ ## 后备渠道与预算
361
553
 
362
554
  `channels[channel].fallback` 仍是人工配置的有界后备链,只有既有错误分类/重试策略允许时才使用。切换后依据新渠道重新选择 provider 和模型;不会继续沿用原渠道的 provider。后备渠道省略 harness 时继承当前 harness,不回到链起点的后端。
363
555
 
364
556
  指标分别保存 `harness`、`provider`、`channel`、`model`。provider 来自 driver 可确认的结果,未知时为 null;channel 继续描述配置渠道。usage 和美元成本未报告时保持 unknown,订阅不会被当成已知零成本。profiles 不改变计费规则,也不会绕过 hard budget。
365
557
 
366
- ## 5. 预检范围和结果
558
+ 默认 token 预算为 soft,每日上限 2,000,000。soft 报告不确定用量,hard 在未知用量使
559
+ 预算无法核实时停止。关闭预算强制并不关闭计量,也不把 unknown 变成零。
560
+
561
+ Codex Pro 只有本次调用完整用量进入已知 token 计量,partial/unknown 保留在回执中。
562
+ 插件不提供实际美元账单;显式 pricing 与完整 usage 可产生估算,但不等于订阅费用。
563
+
564
+ 验收命令使用受限环境。项目需要 `GOCACHE`、`GOPATH` 等额外工具变量时,把变量名加入
565
+ `verify.env-allowlist` 并确保引擎环境已有该变量;不要将凭证值写入契约或提交的配置。
566
+
567
+ ## 无推理诊断
367
568
 
368
569
  ```sh
369
570
  flywheel doctor --cwd /repo --json
@@ -404,38 +605,21 @@ lifecycle/recovery 导出、Node >=22.18.0 与 Codex 命令版本;同一 wor
404
605
  | `unknown` | 未验证,例如账号授权、额度与真实模型服务能力 |
405
606
  | `skipped` | 非必需绑定、mock、重复探测或前置检查失败等 |
406
607
 
407
- 任何 probe 都不发送 `session/prompt`、不运行 L1/L2/L3、不写 Flywheel 状态或创建工作树;SDK 初始化可能访问 provider 目录并产生自己的会话/缓存文件。只读指 Flywheel 配置与任务状态,不表示整个宿主文件系统绝对无写入。
608
+ 任何 probe 都不发送 `session/prompt`、不运行 L1/L2/L3、不写 Flywheel 状态或创建工作树;SDK 初始化可能访问 provider 目录并使用临时探测会话存储及自己的缓存文件。只读指 Flywheel 配置与任务状态,不表示整个宿主文件系统绝对无写入。
408
609
 
409
610
  桌面面板、`/flywheel` 和 `flywheel_control` 共用 `control config|doctor`,可省略 taskDir;只有 doctor 支持 `probe:true`。诊断阻断与传输失败分开显示。桌面使用的 PATH/profile/环境可能与终端不同,安装后应在面板里再检查一次。
410
611
 
411
- ### 在流程控制台编辑配置
412
-
413
- DSH 的「全局 / 项目配置」先读取显式作用域和文件 revision,再编辑模型绑定、角色会话策略、预算、超时、重试或全局权限。保存前显示字段差异。目标文件被其他编辑器修改时拒绝覆盖,保存结果未确认时先重新读取核对。新项目文件以当前版本默认模板创建完整配置,项目文件优先于全局,任务文件优先于项目。
414
-
415
- 高级调用通过 stdin 传入 JSON。读取示例使用 `flywheel control config-edit --cwd /absolute/repo`,输入为 `{"scope":"project"}`。保存使用 `control config-save`,输入包含 scope、读取返回的 revision,以及仅包含改动章节的 values。reset=true 从内嵌默认完整模板开始替换。配置保存创建备份并原子发布,下一次引擎启动时加载。
416
-
417
- ### 控制台权限与调度
418
-
419
- `permissions.bindings` 在全局 `permissions.mode` 上按 `loops.<role>`、`routes.<route>`、`judge-panel` 覆盖实际宿主权限,值为 `read-only`、`workspace-write` 或 `danger-full-access`。语法以 `permission-policy.schema.json` 为准;后端仍须证明支持该权限,不会把 Claude 原生审批模式伪装成只读沙箱。
420
-
421
- `scheduler` 的字段以 `scheduler-policy.schema.json` 为准。新默认允许 parallel(最大并发 2),已有显式 serial 保留;parallel 只并发满足冻结 `schedule.after/writes` 的独立单元,`max-parallel` 控制任务并发,`providers` 按实际账号渠道限流。hard 预算在确认计费前只允许一个模型调用。声明缺失或写入冲突不会被解释为独立。
422
-
423
- `worktree.enabled` 默认 true,只控制引擎自动创建/管理 Worktree;关闭不禁止并行,也不禁止用户或模型自行创建。项目归属与实际执行目录分别记录,外部目录登记协议见[流程控制台](flow-console.md)。当前原生后端不能把 `workspace-write` 沙箱根和项目目录独立设置,不支持的分离组合会在派发前失败;不会扩大权限来掩盖问题。
424
-
425
- 例如把 Review 固定为只读,并允许两个已声明独立的任务并行:
426
-
427
- ```json
428
- {
429
- "permissions": {
430
- "mode": "full-access",
431
- "bindings": {"loops.review":"read-only"}
432
- },
433
- "scheduler": {"mode":"parallel","max-parallel":2,"providers":{"deepseek-account":1}}
434
- }
435
- ```
612
+ ## 可选 JEV 影子评估
436
613
 
437
- 这是字段片段,不是可直接替代完整配置的文件。控制台按实际文件读取完整草稿并校验后保存。CLI 运行索引、受管 Session 交互、指标完整性和 PR/Merge 权限边界见[流程控制台](flow-console.md)。
614
+ `jev-shadow.enabled` 默认 false,省略时也关闭。全局/项目编辑器提供开关。任务
615
+ 运行期间只捕获本地快照,不在任务关键路径发送 HTTP 请求;后续显式
616
+ `flywheel shadow run` 才执行可选联网评估并单独记账。影子结果不能改变 Quick/Full
617
+ 或授权新动作。新的决策采用需独立显式 opt-in 与数据边界,既有影子开关不授予
618
+ 该权限。endpoint、版本、凭证、预算与恢复见[JEV 指南](jev-shadow.md)。
438
619
 
439
- ## 可选 JEV 影子评估
620
+ ## 参考文件
440
621
 
441
- `jev-shadow.enabled` 默认 false,旧配置缺省同样关闭。全局/项目编辑器支持开关;开启只观察新任务,失败不阻断流程,不改变实际 Quick/Full。endpoint、固定响应版本、密钥变量名和时限详见 [JEV 指南](jev-shadow.md)。此功能需要 0.30.1 CLI/插件。
622
+ - [内联默认配置](https://github.com/ckanner/flywheel/blob/main/templates/flywheel.config.example.json)
623
+ - [完整 profiles 示例](https://github.com/ckanner/flywheel/blob/main/templates/flywheel.profiles.example.json)
624
+ - [系统设计](../design.md)
625
+ - [Worker 协议](https://github.com/ckanner/flywheel/blob/main/plugins/dsh/PROTOCOL.md)