@ckanner/flywheel 0.31.0 → 0.32.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 +122 -5
- package/CONTRIBUTING.md +19 -0
- package/LICENSE +21 -0
- package/README.en.md +4 -171
- package/README.md +152 -269
- package/README.zh-CN.md +116 -0
- package/bin/flywheel-claude-code-pro-worker.js +1 -1
- package/bin/flywheel-codex-pro-worker.js +1 -1
- package/bin/flywheel-dsh-worker.js +1 -1
- package/bin/flywheel.js +1 -1
- package/bin/runtime.js +1 -1
- package/docs/README.md +86 -0
- package/docs/README.zh-CN.md +64 -0
- package/docs/archive/README.md +13 -0
- package/docs/archive/codex-pro-adapter-handoff.md +197 -0
- package/docs/archive/design-v0.24.md +540 -0
- package/docs/design.md +812 -0
- package/docs/en/claude-code-pro.md +25 -16
- package/docs/en/configuration.md +405 -145
- package/docs/en/contributing.md +303 -0
- package/docs/en/flow-console.md +142 -24
- package/docs/en/getting-started.md +232 -126
- package/docs/en/investigation.md +263 -0
- package/docs/en/jev-shadow.md +5 -0
- package/docs/en/jev.md +240 -0
- package/docs/en/model-policy.md +154 -62
- package/docs/en/releasing.md +207 -0
- package/docs/en/session-evaluation.md +4 -2
- package/docs/en/session-recovery.md +88 -6
- package/docs/en/workflow.md +241 -114
- package/docs/evaluation/README.md +12 -0
- package/docs/evaluation/jev-historical-provisional.json +138 -0
- package/docs/evaluation/jev-historical-result-2026-11-10.json +174 -0
- package/docs/plans/2026-11-01-dsh-integration.md +67 -0
- package/docs/plans/2026-11-01-model-profiles-preflight.md +29 -0
- package/docs/plans/2026-11-01-npm-installation.md +19 -0
- package/docs/plans/2026-11-03-codex-pro-default.md +28 -0
- package/docs/plans/2026-11-06-adaptive-workflow.md +365 -0
- package/docs/plans/2026-11-07-session-lifecycle.en.md +424 -0
- package/docs/plans/2026-11-07-session-lifecycle.md +337 -0
- package/docs/plans/2026-11-08-flow-console.md +271 -0
- package/docs/plans/2026-11-10-jev-shadow.md +32 -0
- package/docs/plans/2026-11-10-task-discovery.md +17 -0
- package/docs/plans/2026-11-10-workbench-redesign.md +19 -0
- package/docs/plans/2026-11-12-feedback-driven-workflows.md +739 -0
- package/docs/plans/2026-11-12-unified-jev-decisions.md +89 -0
- package/docs/plans/2026-11-13-jev-execution-decisions.md +110 -0
- package/docs/plans/2026-11-13-p5-ready-queue-prewarm.md +178 -0
- package/docs/plans/README.md +25 -0
- package/docs/reviews/2026-08-24-v0.18-review-fixplan.md +265 -0
- package/docs/reviews/2026-09-12-pr4-pr5-review.md +70 -0
- package/docs/reviews/README.md +12 -0
- package/docs/validation/2026-11-01-npm-installation.md +105 -0
- package/docs/validation/2026-11-01-profiles-preflight.md +67 -0
- package/docs/validation/2026-11-01-results.md +114 -0
- package/docs/validation/2026-11-03-codex-pro-default.md +90 -0
- package/docs/validation/2026-11-04-dsh-native-view.md +85 -0
- package/docs/validation/2026-11-04-release-0.28.1.md +33 -0
- package/docs/validation/2026-11-04-release-0.28.2.md +35 -0
- package/docs/validation/2026-11-05-dsh-0.2.2-compatibility.md +26 -0
- package/docs/validation/2026-11-05-registry-smoke-recovery.md +26 -0
- package/docs/validation/2026-11-05-release-0.28.3.md +32 -0
- package/docs/validation/2026-11-05-subscription-model-access.md +60 -0
- package/docs/validation/2026-11-05-view-order.md +14 -0
- package/docs/validation/2026-11-07-adaptive-workflow.md +79 -0
- package/docs/validation/2026-11-07-claude-code-pro.md +144 -0
- package/docs/validation/2026-11-07-session-lifecycle.md +136 -0
- package/docs/validation/2026-11-08-session-p3-p4.md +99 -0
- package/docs/validation/2026-11-09-flow-console.md +81 -0
- package/docs/validation/2026-11-10-jev-shadow.md +50 -0
- package/docs/validation/2026-11-10-task-discovery.md +45 -0
- package/docs/validation/2026-11-10-workbench-redesign.md +54 -0
- package/docs/validation/2026-11-11-release-0.30.2.md +65 -0
- package/docs/validation/2026-11-11-release-0.31.0.md +46 -0
- package/docs/validation/2026-11-12-dsh-0.2.2-rc.2.md +58 -0
- package/docs/validation/2026-11-12-feedback-driven-workflows.md +187 -0
- package/docs/validation/2026-11-12-release-0.31.1.md +58 -0
- package/docs/validation/2026-11-12-session-console-ux.md +46 -0
- package/docs/validation/2026-11-12-unified-jev-decisions.md +93 -0
- package/docs/validation/2026-11-13-dsh-settings-controls.md +104 -0
- package/docs/validation/2026-11-13-jev-execution-decisions.md +140 -0
- package/docs/validation/2026-11-13-p5-ready-queue-prewarm.md +138 -0
- package/docs/validation/2026-11-13-p5-review-closure.md +114 -0
- package/docs/validation/2026-11-13-p5-tracked-runtime-fixes.md +108 -0
- package/docs/validation/2026-11-13-prewarm-receipts-and-expiry-tests.md +92 -0
- package/docs/validation/2026-11-13-workspace-redesign.md +66 -0
- package/docs/validation/README.md +51 -0
- package/docs/validation/evidence/2026-11-08-session-p3-p4.json +5430 -0
- package/docs/validation/evidence/2026-11-13-p5-npm-candidate.json +54 -0
- package/docs/validation/evidence/claude-node-bridges.txt +118 -0
- package/docs/validation/evidence/claude-npm-build.txt +15 -0
- package/docs/validation/evidence/claude-npm-candidate.json +54 -0
- package/docs/validation/evidence/claude-npm-install.txt +21 -0
- package/docs/validation/evidence/claude-npm-tests.txt +145 -0
- package/docs/validation/evidence/claude-plugin-tests.txt +205 -0
- package/docs/validation/evidence/claude-quality-gate.txt +29 -0
- package/docs/validation/evidence/claude-race.txt +7 -0
- package/docs/validation/evidence/codex-pro-070-probes.txt +4 -0
- package/docs/validation/evidence/dsh-bridge.txt +4 -0
- package/docs/validation/evidence/dsh-native-view-bridge-tests.txt +1 -0
- package/docs/validation/evidence/dsh-native-view-build.txt +15 -0
- package/docs/validation/evidence/dsh-native-view-candidate.json +54 -0
- package/docs/validation/evidence/dsh-native-view-inspect.txt +27 -0
- package/docs/validation/evidence/dsh-native-view-install-tests.txt +19 -0
- package/docs/validation/evidence/dsh-native-view-npm-tests.txt +143 -0
- package/docs/validation/evidence/dsh-native-view-plugin-tests.txt +99 -0
- package/docs/validation/evidence/dsh-native-view-quality-gate.txt +29 -0
- package/docs/validation/evidence/dsh-plugin-tests.txt +48 -0
- package/docs/validation/evidence/function-coverage.txt +378 -0
- package/docs/validation/evidence/npm-build.txt +13 -0
- package/docs/validation/evidence/npm-contract-tests.txt +65 -0
- package/docs/validation/evidence/npm-dsh-bridge.txt +18 -0
- package/docs/validation/evidence/npm-dsh-plugin-tests.txt +62 -0
- package/docs/validation/evidence/npm-function-coverage.txt +420 -0
- package/docs/validation/evidence/npm-install-tests.txt +20 -0
- package/docs/validation/evidence/npm-quality-gate.txt +29 -0
- package/docs/validation/evidence/npm-race.txt +7 -0
- package/docs/validation/evidence/pr-dsh-bridge.txt +4 -0
- package/docs/validation/evidence/pr-dsh-plugin-tests.txt +48 -0
- package/docs/validation/evidence/pr-function-coverage.txt +379 -0
- package/docs/validation/evidence/pr-quality-gate.txt +28 -0
- package/docs/validation/evidence/pr-race.txt +6 -0
- package/docs/validation/evidence/profiles-control-smoke.json +1 -0
- package/docs/validation/evidence/profiles-dsh-bridge.txt +18 -0
- package/docs/validation/evidence/profiles-dsh-plugin-tests.txt +59 -0
- package/docs/validation/evidence/profiles-function-coverage.txt +411 -0
- package/docs/validation/evidence/profiles-quality-gate.txt +29 -0
- package/docs/validation/evidence/profiles-race.txt +7 -0
- package/docs/validation/evidence/quality-gate.txt +28 -0
- package/docs/validation/evidence/race.txt +6 -0
- package/docs/validation/evidence/watchdog-startup-after.txt +2 -0
- package/docs/validation/evidence/watchdog-startup-before.txt +6 -0
- package/docs/validation/evidence/watchdog-startup-quality-gate.txt +29 -0
- package/docs/validation/evidence/watchdog-startup-race.txt +7 -0
- package/docs/{claude-code-pro.md → zh-CN/claude-code-pro.md} +23 -17
- package/docs/{configuration.md → zh-CN/configuration.md} +397 -142
- package/docs/zh-CN/contributing.md +240 -0
- package/docs/zh-CN/flow-console.md +216 -0
- package/docs/zh-CN/getting-started.md +352 -0
- package/docs/zh-CN/investigation.md +213 -0
- package/docs/zh-CN/jev-shadow.md +5 -0
- package/docs/zh-CN/jev.md +192 -0
- package/docs/zh-CN/model-policy.md +128 -0
- package/docs/zh-CN/releasing.md +120 -0
- package/docs/{session-evaluation.md → zh-CN/session-evaluation.md} +4 -2
- package/docs/{session-recovery.md → zh-CN/session-recovery.md} +75 -12
- package/docs/zh-CN/workflow.md +284 -0
- package/npm/install.js +1 -1
- package/package.json +12 -25
- package/docs/flow-console.md +0 -122
- package/docs/getting-started.md +0 -418
- package/docs/model-policy.md +0 -65
- package/docs/workflow.md +0 -314
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# JEV 总开关与取证决策实现验收
|
|
2
|
+
|
|
3
|
+
[验收索引](README.md) · [方案](../plans/2026-11-12-unified-jev-decisions.md) · [当前使用指南](../zh-CN/jev.md)
|
|
4
|
+
|
|
5
|
+
## 源码与范围
|
|
6
|
+
|
|
7
|
+
基线为 main `e035b5b5736c2d26da7ada2bf1ca97ee020fd5a2`,源码版本 0.31.1。
|
|
8
|
+
本记录验证从该基线起的统一 JEV 改动;提交身份以承载本记录的 PR 为准。没有修改
|
|
9
|
+
六包发行版本、Provider 默认模型、依赖锁、vendored 包或用户实际配置。
|
|
10
|
+
|
|
11
|
+
本次完成:唯一 `jev.enabled` 总开关;自动冻结调查策略;真实动作选择、依据证据
|
|
12
|
+
跳过冗余动作和提前进入报告;运行中关闭及策略收紧复核;旧影子自动路径退役;
|
|
13
|
+
受同一配置约束的显式在线评估;桌面、Task/New/Run 和双语文档同步。
|
|
14
|
+
|
|
15
|
+
## 环境和依赖身份
|
|
16
|
+
|
|
17
|
+
- Linux x86_64,Go 1.27.4,Node 24.22.1,npm 11.9.0。
|
|
18
|
+
- DSH 测试依赖从未修改的 package-lock 安装,为 `0.2.2-rc.2`;旧宿主兼容夹具为 `0.2.1-rc.5`。
|
|
19
|
+
- Codex Pro 使用既有锁定的 `0.9.0` vendor 包,未变更 integrity。
|
|
20
|
+
- Claude Code Pro 使用既有已审阅的 `0.4.0` 源码 tarball;45 个安装文件与 tarball
|
|
21
|
+
逐字节比对一致,SHA256 为
|
|
22
|
+
`125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`。
|
|
23
|
+
这说明测试 peer 的身份,不声称本次完成 registry 发布。
|
|
24
|
+
|
|
25
|
+
## 执行结果
|
|
26
|
+
|
|
27
|
+
| 检查 | 结果 | 证据边界 |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| `make quality-gate` | PASS | vet、gofmt 与全部 Go 测试;每个被测函数 100% 语句覆盖,保留既有 cmd 单行入口例外 |
|
|
30
|
+
| investigation / state / decision 的 `go test -race` | PASS | 调查选择、状态、journal 和恢复的并发检查 |
|
|
31
|
+
| CLI 决策与后台调查取消的 targeted `go test -race` | PASS | 开关、显式评估、进行中取消与子进程退出 |
|
|
32
|
+
| `npm test` | 142 PASS,0 skipped | 启动器、安装器、发行门禁和协议单测 |
|
|
33
|
+
| `npm --prefix plugins/dsh run check` | 256 PASS + 9 旧宿主测试 PASS,0 skipped | 插件构建、渲染、配置、控制与 adapter 行为 |
|
|
34
|
+
| 调查状态文案最后调整后的重建及 targeted tests | 12 PASS,0 skipped | “最近观察到的状态”、取证效果和异常快照显示 |
|
|
35
|
+
| 三个 Go → Node offline bridge 套件 | PASS,0 skipped | DSH、Codex Pro、Claude Code Pro 的真实跨进程协议桥接 |
|
|
36
|
+
| 文档围栏、相对链接、锚点与 `git diff --check` | PASS | 本次改动的当前文档与 skills,不重写历史结果 |
|
|
37
|
+
|
|
38
|
+
首轮完整 Go 行为测试通过,但逐函数门禁发现 `attachPreparation` 的 skipped 回执
|
|
39
|
+
分支缺少覆盖。补充“跳过的 JEV 请求不计费且恢复不重复记账”的真实调查移交回归后,
|
|
40
|
+
重新执行完整 `make quality-gate` 并通过,没有降低覆盖门禁或删除该有效分支。
|
|
41
|
+
|
|
42
|
+
## 核心行为证据
|
|
43
|
+
|
|
44
|
+
### 一个开关与完整作用域
|
|
45
|
+
|
|
46
|
+
测试验证默认关闭、显式开启、旧 `jev-shadow.enabled=true` 不会自动升级为在线
|
|
47
|
+
授权、新配置优先、编辑保存移除旧 key,以及 global on → project off → task on
|
|
48
|
+
的整文件优先级。真实 Git 根/子目录和相对 task 路径验证项目关闭不能被全局开启
|
|
49
|
+
覆盖。Task 等价的调查输入省略 `decision` 时,Start 仍自动取得正确采用策略;
|
|
50
|
+
旧的 per-contract 模式无法绕过关闭状态。
|
|
51
|
+
|
|
52
|
+
### 实际采用及减少动作
|
|
53
|
+
|
|
54
|
+
`TestMasterAutomaticallyEnablesEvidenceFinishAndStillAcceptsAnalystReport` 使用
|
|
55
|
+
真实 Go 调查循环及本地 HTTP fixture。原动作集有三项,JEV 先选择有效取证,随后
|
|
56
|
+
选择 finish:实际保留一项观察、两次 JEV 协议请求和引用证据的 finish 记录,进入
|
|
57
|
+
awaiting-report。重复 Run 不再次取证,分析报告仍可提交;缺少局限的缩短调查报告
|
|
58
|
+
被拒绝,过程不创建实现 completed 状态。
|
|
59
|
+
|
|
60
|
+
defer 的独立测试验证未观察到的假设不提供快捷选项,随后只跳过绑定的冗余动作。
|
|
61
|
+
成功但截断、失败、无输出、无关联假设或候选摘要改变的观察不能授权提前结束。
|
|
62
|
+
候选集合遵守 16 项协议上限;依据是实际观察,不是模型自行声明已证明根因。
|
|
63
|
+
|
|
64
|
+
### 关闭、取消和恢复
|
|
65
|
+
|
|
66
|
+
- 请求进行中关闭、最终候选检查时关闭,均不采用返回的建议。
|
|
67
|
+
- 当前数据范围、阈值、调用次数或固定目标收紧/改变时,旧策略停止可选决策。
|
|
68
|
+
- 关闭后仍核对旧 pending,保留未知用量;重新开启不清空累计调用预算。
|
|
69
|
+
- 控制效果 CAS 失败后,恢复读取原回执,未重复发送请求。
|
|
70
|
+
- 冻结 deadline 在配置发现前生效;最后策略检查期间取消后不保存新动作 Pending。
|
|
71
|
+
- 显式评估的进行中取消返回 143、保留 unknown 回执;以后读取同一回执返回 3,
|
|
72
|
+
请求计数保持一次。配置发现本身也在 signal context 内。
|
|
73
|
+
- v0.31.1 原始 question hash 的固定回归验证旧成功回执仍可恢复并保留已知用量。
|
|
74
|
+
- 调查移交实现时,已知/未知用量按原派发日只导入一次;skipped 不作为付费或
|
|
75
|
+
未知费用调用导入。原修复范围与验收规则保持有效。
|
|
76
|
+
|
|
77
|
+
### 桌面与入口
|
|
78
|
+
|
|
79
|
+
渲染和控制测试验证只有一个 `jev.enabled` 控件,不存在独立 shadow/adopt 开关、
|
|
80
|
+
expected-model 输入或第二次启用确认。展示使用真实已采用/基线记录、取证效果与
|
|
81
|
+
证据引用;持久状态标为“最近观察到的 JEV 状态”。异常配置或效果响应保留最后的
|
|
82
|
+
有效视图。Task、New、Run 保留各自职责并共用 Go 策略,skills 不实现循环。
|
|
83
|
+
|
|
84
|
+
## 复核和边界
|
|
85
|
+
|
|
86
|
+
并行独立复核发现并修正:默认 cwd 绕过项目关闭、提前结束阻止提交报告、策略
|
|
87
|
+
收紧未复核、最后策略读取期间取消仍可能写 Pending、旧 question hash 兼容和
|
|
88
|
+
过期观察可能授权快捷分支。完整门禁验证修正后的生产代码。
|
|
89
|
+
|
|
90
|
+
这里的 HTTP 仅为 loopback fixture,桥接测试使用离线协议桩。没有真实付费 JEV/
|
|
91
|
+
模型调用,没有证明模型正确率、净耗时或 token 成本改善。没有运行 npm 发布或
|
|
92
|
+
用户 Mac 桌面验收。候选输入的全路径前后摘要检查仍保留,未声称优化了该开销。
|
|
93
|
+
修复策略、重新规划与模型路由的 JEV 自动采用仍不属于当前接入动作族。
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# DSH 设置开关与最新工作台整合复核
|
|
2
|
+
|
|
3
|
+
## 范围与源码
|
|
4
|
+
|
|
5
|
+
用户授权复核并合并已有 PR,再检查最新 DSH 工作台并优化 JEV 与新增运行配置。
|
|
6
|
+
PR #38 已合并为 `ea277a488c3aa80a52282f8c5822aef0ed7e1246`;本轮将其与
|
|
7
|
+
PR #37 的 `8fb87e4b8ee82e4cd3d5bb8d84cbe1bcda4481ea` 整合为
|
|
8
|
+
`a7c54da8c72d34d16a41cacda2f819f05b7eefa7`,核对树
|
|
9
|
+
`4baa10fdae817ddb1631f379303475706ccd6b56` 后合并。
|
|
10
|
+
主分支合并提交为 `59bfb2dc5f8f6888ba2121967bd5ebccb4f88b74`。
|
|
11
|
+
后续 UI 改动位于 `feat/dsh-config-switches`,保留新工作台结构。
|
|
12
|
+
|
|
13
|
+
兼容整合保留会话归属、只读 Remote、独立设置页、固定导航与保存栏、角色会话策略、
|
|
14
|
+
revision 和未知结果保护;补回 JEV 实际采用、执行决策、模型历史与预热打包。
|
|
15
|
+
修正自动合并残留的已删除 `submit` 保存函数引用,并清除后置本地化中的旧影子说明。
|
|
16
|
+
|
|
17
|
+
## UI 行为
|
|
18
|
+
|
|
19
|
+
- `jev.enabled` 是唯一 JEV 总开关。`scheduler.prewarm` 与 `worktree.enabled`
|
|
20
|
+
各有独立原生 checkbox `role=switch`,关联 label、可见开关状态、焦点样式、
|
|
21
|
+
44px 点击区域和 pending 禁用;forced-colors 下保留原生 checkbox。
|
|
22
|
+
- dispatch 保持 batch/ready-queue 选择,串行时仍可查看与保留已选值;说明并行、
|
|
23
|
+
并发数大于 1、自动 Worktree 管理等配置条件,并明确 Full 与独立任务依赖由运行时核对。
|
|
24
|
+
- prewarm 说明仅提前初始化支持的 DSH Review SDK,正式准入前不创建/恢复 Session、
|
|
25
|
+
不发送模型请求;Worktree 名称明确为引擎自动管理,不将关闭误写为删除目录。
|
|
26
|
+
- JEV 文本和数字的无效输入保留为草稿,不覆盖最后合法值。关闭 JEV 仅放弃本组
|
|
27
|
+
无效草稿,切为 serial 仅清除隐藏的并发数草稿;其他组错误保持。
|
|
28
|
+
- 合法连接、`allowed-data:[]`、Provider 并发额度、模型、Session 和预算不因无关
|
|
29
|
+
开关重置。保留合法 `_note`/`_note_*`,endpoint 长度按 Unicode 码点计算。
|
|
30
|
+
- 高级 JSON 中检测出的非法字段保留原文与修正入口;未完成 JSON 时禁用结构化
|
|
31
|
+
字段,导航、修正、撤销继续可用,避免关闭开关顺便覆盖整份 JSON 草稿。
|
|
32
|
+
完整 schema、有效配置选择和原子保存继续由 Go 负责。
|
|
33
|
+
- 保存栏使用简短状态;JEV 对既有任务的关闭语义、冻结策略与普通设置的生效时机
|
|
34
|
+
放在内容区。中英文配置指南、工作台指南、设计和 changelog 同步更新。
|
|
35
|
+
|
|
36
|
+
依据仓库钉住的 [DSH UI 规范](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/.agents/skills/dsh-client-ui-ux/SKILL.md)
|
|
37
|
+
复用颜色变量与既有布局,不引入宿主内部 UI 模块。新增样式没有使用超过 500 的字重。
|
|
38
|
+
触控导航按钮为 44px,窄导航仍为 54px,并以 5px 上下留白容纳按钮。
|
|
39
|
+
|
|
40
|
+
## 已执行检查
|
|
41
|
+
|
|
42
|
+
环境为 Linux amd64、Go 1.27.0、Node 24.22.1。
|
|
43
|
+
|
|
44
|
+
| 检查 | 结果与适用范围 |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| 整合后的 `make quality-gate` | 通过,每个被测 Go 函数 100%;后续 UI 改动没有修改 Go、schema 或嵌入技能 |
|
|
47
|
+
| 整合后的插件与 rc.5 宿主 | 287/287 与 10/10,通过,无跳过 |
|
|
48
|
+
| 根 `npm test` | 142/142,通过;后续 UI 阶段未修改 npm 运行/安装实现 |
|
|
49
|
+
| 三种 Go → Node public bridge,`-race` | DSH、Codex Pro、Claude Code Pro 均通过,没有后端跳过 |
|
|
50
|
+
| 最终 workbench 定向行为 | 34/34,通过,新增 8 个用例覆盖开关、草稿、缓存与配置保护 |
|
|
51
|
+
| 最终插件完整检查与 rc.5 宿主 | 295/295 与 10/10,通过,无失败或跳过 |
|
|
52
|
+
| 实际插件 DOM → 真实 Go 保存 | 1/1,通过;仅操作临时项目,global 为合成只读回执 |
|
|
53
|
+
| 六包隔离构建 | 通过;四平台二进制、插件与入口均为开发候选 0.31.1 |
|
|
54
|
+
| 同一候选 Linux amd64 隔离安装 | 10/10,通过,无跳过,包含可选 Claude 的真实安装路径 |
|
|
55
|
+
| 文档与差异 | 相对链接、锚点、代码围栏及 `git diff --check` 通过 |
|
|
56
|
+
|
|
57
|
+
DOM 保存检查用真实控件将无效概率 `1.5` 改为关闭 JEV,确认 Go 保存
|
|
58
|
+
`enabled:false`,保留原 endpoint、合法阈值 `0.6`、空数据授权。dispatch、prewarm、
|
|
59
|
+
Worktree 分别保存为 ready-queue、true、false,其他配置不变。随后用过期 revision
|
|
60
|
+
再次实写,Go 返回 exit 1、`ok:false` 和 `configuration changed`,原文件字节完全不变。
|
|
61
|
+
临时项目已删除,没有读取或写入真实 global 配置。
|
|
62
|
+
|
|
63
|
+
独立审查覆盖 Go 配置语义与 UI 实际 diff,没有剩余代码阻塞问题。
|
|
64
|
+
使用官方主题变量对开关滑块/轨道做静态颜色计算:浅色开启 4.235:1、关闭 5.799:1,
|
|
65
|
+
深色开启 8.118:1、关闭 9.252:1。这仅是颜色计算,不是浏览器渲染验收。
|
|
66
|
+
|
|
67
|
+
## 候选与证据身份
|
|
68
|
+
|
|
69
|
+
- 候选目录:`/workspace/scratch/fd8cf2c66d48/ui-candidate`。
|
|
70
|
+
- 源快照 SHA256:`665e37d7372a7ea2108446690dfc83599bc645249d58cde6e8b063f07f8bac6f`。
|
|
71
|
+
- 实际与包内 client bundle SHA256:`05a8909c583ee314479ce7615e6398e53e5f7882c7f1196fb2f91460019c40d9`。
|
|
72
|
+
- DOM 保存所用 Go 二进制 SHA256:`e773dbcb00893417de2e5f57e055a8423dd8f384814ee5d1395d5c9961e9e780`。
|
|
73
|
+
- Claude 0.4.0 使用 vendor 记录的精确 SHA256
|
|
74
|
+
`125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`;从已安装的
|
|
75
|
+
已审阅包恢复后核对原哈希,没有采用缓存中另一份同版本但不同字节的包。
|
|
76
|
+
|
|
77
|
+
包内 client、`console-read.js` 和 `prewarm.js` 与最终本地产物逐字节相同。
|
|
78
|
+
候选在最后一处 test-only 选择器修正及本验收记录/索引写入之前生成;之后产品源码
|
|
79
|
+
与 bundle 未改变。它是 dirty 开发候选,不是 registry 已发行的 0.31.1,不可直接发布。
|
|
80
|
+
|
|
81
|
+
日志位于本轮工作目录:`ui-merge-quality.log`、`ui-merge-plugin-recheck.log`、
|
|
82
|
+
`ui-merge-npm-recheck.log`、`ui-merge-bridges.log`、`ui-final-plugin-verified.log`、
|
|
83
|
+
`ui-final-candidate.log`、`ui-final-install.log`,以及 `ui-browser/go-save-validation.log`。
|
|
84
|
+
|
|
85
|
+
## 保留的失败与未验收部分
|
|
86
|
+
|
|
87
|
+
1. 整合时 Gateway 测试写死 macOS `/private/tmp`,Linux 在到达会话隔离断言前失败。
|
|
88
|
+
改用真实临时目录,保留隔离、未派发变更和不写会话日志的全部断言,最终整套通过。
|
|
89
|
+
2. 根 npm 首次与编译并发运行时,一个 500ms 子进程夹具未及时启动;未改断言或时限,
|
|
90
|
+
定向和原完整命令复测均通过。初次日志 `ui-merge-npm.log` 保留。
|
|
91
|
+
3. UI 最终检查首次的 `client.test.js` 子进程退出为 SIGKILL;定位发现原测试的
|
|
92
|
+
全局 `[role=status]` 会选中隐藏设置页的新状态提示。改为实际“操作反馈”region,
|
|
93
|
+
保留单飞、旧响应失效和新目标结果断言。单文件 26/26 通过;最终全套结果见上表。
|
|
94
|
+
4. 整合 CI [43430598190](https://github.com/ckanner/flywheel/actions/runs/43430598190)
|
|
95
|
+
没有执行测试步骤:npm-candidate 失败且无 steps,下游跳过。这不是 CI 通过,
|
|
96
|
+
没有修改 workflow 或分支保护来放行。
|
|
97
|
+
5. Playwright Chromium 不在当前环境;系统 Chromium 的 ProcessSingleton socket
|
|
98
|
+
被运行环境拒绝,连接浏览器也不可用,cloud browser 无法访问本地夹具并返回
|
|
99
|
+
明确的 URL 安全策略拒绝。已停止尝试,没有绕过限制。实际浏览器尺寸、亮暗截图、
|
|
100
|
+
原生 Space 键操作与用户 Mac DSH 安装验收均未完成。DOM 不冒充视觉验收。
|
|
101
|
+
|
|
102
|
+
本轮未调用真实模型,未验收真实延迟、资源、质量或成本收益;默认 dispatch=batch、
|
|
103
|
+
prewarm=false 与唯一默认关闭的 JEV 设置保持不变。未发布 npm、创建发行标签或修改
|
|
104
|
+
用户桌面安装。后续真实环境验收不能由本记录中的离线结果替代。
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# JEV 执行决策与诊断扩展:工程验证
|
|
2
|
+
|
|
3
|
+
[验证索引](README.md) · [本轮方案](../plans/2026-11-13-jev-execution-decisions.md) · [JEV 使用指南](../zh-CN/jev.md) · [调查指南](../zh-CN/investigation.md)
|
|
4
|
+
|
|
5
|
+
## 源码与范围
|
|
6
|
+
|
|
7
|
+
本轮接在 PR #37 的 `4ea69cc54176d7afa36d235e6b7dc8728005a671` 后;PR 的 main
|
|
8
|
+
基线仍为 `e035b5b5736c2d26da7ada2bf1ca97ee020fd5a2`。本记录与所验证的实现一同
|
|
9
|
+
提交,精确源码身份以承载本记录的 Git commit 为准。源码包版本仍为 0.31.1,
|
|
10
|
+
没有修改六包版本、Provider 默认绑定、依赖锁、vendor 或用户实际配置。
|
|
11
|
+
|
|
12
|
+
用户明确要求先补完剩余工程,真实账号、模型效果与桌面验收后置。因此这里记录
|
|
13
|
+
离线工程验证;不把本地协议 fixture 的正确执行称为真实 JEV 正确率或速度收益。
|
|
14
|
+
|
|
15
|
+
本轮补齐:
|
|
16
|
+
|
|
17
|
+
| 能力 | 实际实现 |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| 有界复现与实验 | `run_command` 在批准输入的私有副本中执行精确 argv,保存物理结果、输入身份及清理状态 |
|
|
20
|
+
| 外部查询 | `http_read` 执行批准的 HTTPS GET/HEAD,限制时长与输出,拒绝重定向与环境代理 |
|
|
21
|
+
| 失败后的策略选择 | 在合法 `repair`、`feedback-N`、`recheck-N` 和 `replan` 中实际采用 JEV 选择 |
|
|
22
|
+
| 模型/effort | `model-N` 只能选择已有 `execution-policy` 完整批准绑定,共用切换预算并冷启动 |
|
|
23
|
+
| 定向短检查 | 可选 `feedback-checks`,最多八项;用 `purpose` 提供语义用途,不向 JEV 发送原命令 |
|
|
24
|
+
| 恢复与并发 | 持久请求意图、任务共享上限、真实动作状态、Plan 回执和 checkpoint 恢复 |
|
|
25
|
+
| 桌面与使用入口 | 展示选择、实际效果、未知状态、实验结果和具体模型切换;保留 Task/New/Run 与 Auto/Quick/Full |
|
|
26
|
+
|
|
27
|
+
所有在线 JEV 路径沿用唯一 `jev.enabled`,没有恢复影子执行或增加动作族开关。
|
|
28
|
+
最终 L1/适用 L2/L3、独立 Review、权限、已有尝试与规划次数仍由 Go 检查。
|
|
29
|
+
|
|
30
|
+
## 环境与构建身份
|
|
31
|
+
|
|
32
|
+
- Linux x86_64,Go 1.27.4,Node 24.22.1,npm 11.9.0。
|
|
33
|
+
- DSH 测试依赖使用未修改的锁文件与 `0.2.2-rc.2`;旧宿主 fixture 为 `0.2.1-rc.5`。
|
|
34
|
+
- Codex Pro 继续使用原锁定的 `0.9.0` vendor 包;Claude Code Pro 使用已核对的
|
|
35
|
+
`0.4.0` 源码 tarball,SHA256 为
|
|
36
|
+
`125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`。
|
|
37
|
+
- `make build` 的本地 Linux 二进制 SHA256 为
|
|
38
|
+
`9a0df53755ceef4db05af025c1bb3e7f433ca00d24b368e7c5987621a22cb65b`。
|
|
39
|
+
它在提交前构建,用于下面的真实引擎场景;不是 npm 发行产物。
|
|
40
|
+
|
|
41
|
+
## 已执行检查
|
|
42
|
+
|
|
43
|
+
| 检查 | 结果 | 验证边界 |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| `make quality-gate` | PASS | vet、gofmt、全部 Go 行为测试和逐函数 100% statement coverage;既有单行 cmd 入口例外不变 |
|
|
46
|
+
| investigation/contract/state/decision 的 race 测试 | PASS | 实际子进程、loopback HTTP、状态校验、journal、预算及恢复;最后日桶修复后另重跑 state 全包 race |
|
|
47
|
+
| `go test -race ./internal/machine -run 'TestRuntime' -count=1` | PASS | 五类实际执行分支、并行共享预算、取消、动态关闭、反馈与 Plan 恢复;最终冻结版本 18.51 秒 |
|
|
48
|
+
| `npm test` | 142 PASS,0 skipped | 启动器、安装器、发行门禁与协议回归 |
|
|
49
|
+
| `npm --prefix plugins/dsh run check` | 263 PASS + 9 旧宿主测试 PASS,0 skipped | 插件构建、配置、桌面渲染、控制、worker 与宿主兼容 |
|
|
50
|
+
| 三个 Go → Node offline bridge | PASS,0 skipped | DSH、Codex Pro、Claude Code Pro 的真实跨进程协议 |
|
|
51
|
+
| `make build` 与 `FLYWHEEL_EVAL_BINARY=… npm run test:sessions` | 36 场景 PASS | 六类场景、三种会话策略、两轮配对;96 次离线 adapter 调用全部有实际观察 |
|
|
52
|
+
| 当前文档的相对链接、锚点、围栏与 `git diff --check` | PASS | 双语指南、方案、技能及本记录的导航与格式 |
|
|
53
|
+
|
|
54
|
+
36 条场景覆盖 first-pass、L1 repair、Review return、long-context、stop-resume 与
|
|
55
|
+
configuration-change。全部 `oraclePass=true`;没有 unobserved/unknown 场景。
|
|
56
|
+
这些场景使用真实本地引擎和公开 adapter 的离线 fixture,不证明真实模型缓存、
|
|
57
|
+
质量或 token 成本改善。
|
|
58
|
+
|
|
59
|
+
插件中间一轮出现过一次既有控制 fixture 的 ready 文件等待超时:尚未进入进程
|
|
60
|
+
收尾断言。未修改代码门禁或扩大超时;同用例单独完整重跑通过,最终 263 项主
|
|
61
|
+
套件及 9 项旧宿主套件也全部通过。保留这次事实,不把首次失败隐去。
|
|
62
|
+
|
|
63
|
+
## 关键行为证据
|
|
64
|
+
|
|
65
|
+
### 调查确实执行命令和 HTTP
|
|
66
|
+
|
|
67
|
+
真实子进程测试核对复制输入、精确 argv、显式环境、执行权限位、源文件变动、
|
|
68
|
+
超时/取消/信号、输出截断与清理结果。未知清理保留工作目录和 pending,恢复
|
|
69
|
+
不重跑。输出含凭据时脱敏;截断边界切出的凭据前缀也不写入回执。
|
|
70
|
+
|
|
71
|
+
loopback HTTP 测试核对 GET/HEAD、精确地址、命名 header 环境变量、状态码、
|
|
72
|
+
响应截断和超时,验证不会跟随重定向或环境代理。错误地址、头、凭据和响应不能
|
|
73
|
+
伪造成功观察。执行结果绑定原批准动作,不能把另一动作的回执用于当前观察。
|
|
74
|
+
|
|
75
|
+
真实 Go 调查循环接本地 JEV 协议 fixture,分别选择 command/HTTP,再消费真实
|
|
76
|
+
结构化结果并进入 finish。默认不授予 `logs` 时仍可发送批准的状态、退出码和
|
|
77
|
+
HTTP 结果等结构化事实,原始输出不外发;失败、截断、预期非零退出等不授权
|
|
78
|
+
提前结束取证。已有调查回执恢复与报告门禁继续生效。
|
|
79
|
+
|
|
80
|
+
### 执行策略有实际效果
|
|
81
|
+
|
|
82
|
+
`TestRuntimeJEVActuallySelectsRepairFeedbackModelAndReplan` 在真实 Execute/L1
|
|
83
|
+
失败后逐一选择 repair、feedback、recheck、model 和 replan,核对后续实际行为。
|
|
84
|
+
短检查只提供下一轮反馈,完整验收仍独立存在。用途缺失的短检查留作 Executor
|
|
85
|
+
指导,不作为 JEV 定向选择候选;模型候选包含当前与目标的实际完整绑定。
|
|
86
|
+
|
|
87
|
+
`TestRuntimeQuickReplanUsesTheExistingOneWayFullUpgrade` 验证 Quick 的重规划走
|
|
88
|
+
原有单向 Full 升级。渠道错误与未结束的调用不会被改写成模型质量问题;新模型
|
|
89
|
+
不能绕过 unknown 会话。Review 空转的确定性基线不会误触发原本仅用于 L1 的
|
|
90
|
+
质量升级。
|
|
91
|
+
|
|
92
|
+
### 中断不能制造第二次执行
|
|
93
|
+
|
|
94
|
+
请求预留 CAS 冲突时,零 JEV HTTP、零请求 journal,磁盘上的其他写入保持不变。
|
|
95
|
+
请求已派发后未知只读恢复,不重复请求或记账;坏 journal 仍保留冻结的回执身份,
|
|
96
|
+
不会制造无法再次加载的零值回执。
|
|
97
|
+
|
|
98
|
+
实际短检查修改候选或验证输入时,保存 `feedback-stale` 并阻断。清理未知保存
|
|
99
|
+
`feedback-unknown`;终态保存失败保留原 `feedback-running`,恢复不重放。保存
|
|
100
|
+
错误和候选错误并发出现时,保留最先发生的持久化错误。
|
|
101
|
+
|
|
102
|
+
Plan 派发前保存 `replan-running`、决策原因与旧 invocation 边界。真实中断测试
|
|
103
|
+
验证:已确认的新 Plan 回执与 checkpoint 可复用,第二次 Plan 调用数为零;只有
|
|
104
|
+
旧 consumed 标志、回执缺失、候选变化或检查点不匹配时阻断,不猜测原结果。
|
|
105
|
+
|
|
106
|
+
### 总预算与关闭语义
|
|
107
|
+
|
|
108
|
+
两 packet 的真实并发测试验证共同调用上限,调查移交的已用调用也占同一额度。
|
|
109
|
+
模型切换、恢复和 packet 切换不能重置它;未派发的 skipped 不虚构付费调用,
|
|
110
|
+
记录数另有 100 条上限。已知/未知用量只核算一次,按原派发日归属;过期日桶
|
|
111
|
+
不会因迟到回执复活,累计总量仍保留。
|
|
112
|
+
|
|
113
|
+
配置关闭、目标变化、数据授权收紧、候选变化等使可选选择弃权。并行选择使用
|
|
114
|
+
原 worker 的取消域,并把模型切换后的会话退役记录同步回 worker,后续保存不会
|
|
115
|
+
重新启用旧历史。关闭 JEV 不会抹去未知动作、原回执或预算。
|
|
116
|
+
|
|
117
|
+
### 桌面与文档
|
|
118
|
+
|
|
119
|
+
渲染测试区分“建议被接受”“控制效果已应用”“动作已收尾”和“任务已完成”,
|
|
120
|
+
展示真实 before/after 模型绑定、原因、尝试次数与时间。pending、反馈未知和
|
|
121
|
+
重规划未收尾显示核对提示;坏快照保留原有效视图并禁止基于它再次启动。
|
|
122
|
+
投影只保留有限诊断摘要,不向画布暴露原始决策快照或目标配置。
|
|
123
|
+
|
|
124
|
+
Task 保留统一目标准备与启动入口,New 保留只准备后停下,Run 保留已有任务
|
|
125
|
+
启动/恢复;没有把循环、重试或模型选择搬入 skill。设计、schema、示例、双语
|
|
126
|
+
指南及技能随代码更新,历史验收记录不改写。
|
|
127
|
+
|
|
128
|
+
## 本轮没有证明的内容
|
|
129
|
+
|
|
130
|
+
真实 JEV/模型账号、实际决策质量、耗时/token/费用配对以及用户 Mac 桌面
|
|
131
|
+
操作,按用户要求留到后续。PR 的远端 CI 状态独立于上述本地检查,以新提交的
|
|
132
|
+
GitHub Checks 为准;没有把本次源码提交称为合并、npm 发布或用户机器升级。
|
|
133
|
+
|
|
134
|
+
`run_command` 的 `host-process` 只是批准输入的私有副本及受管进程,不是 OS
|
|
135
|
+
沙箱,不能阻止主机用户能力内的其他路径或网络访问。需要强隔离的任务必须批准
|
|
136
|
+
真实容器/沙箱入口。没有配置额外允许绑定时,JEV 继续使用原模型,不能生成
|
|
137
|
+
新的账号、权限或付费渠道。
|
|
138
|
+
|
|
139
|
+
原方案 P5 的 ready queue、预热和进一步流水化继续以实际瓶颈与收益为前提。
|
|
140
|
+
它们不属于本轮以缺省配置强行加入的功能,后续效果验收再决定是否实施相应优化。
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# P5 就绪队列与 DSH 运行时预热:工程验证
|
|
2
|
+
|
|
3
|
+
[验证索引](README.md) · [本轮实施方案](../plans/2026-11-13-p5-ready-queue-prewarm.md) · [配置指南](../zh-CN/configuration.md#就绪队列与运行时准备) · [恢复指南](../zh-CN/session-recovery.md#dsh-预热运行时的重启核对)
|
|
4
|
+
|
|
5
|
+
## 源码与本轮范围
|
|
6
|
+
|
|
7
|
+
本轮接在 PR #37 的 `c445393c4f7238677146028b89efe520253f8318` 后,main 基线为
|
|
8
|
+
`e035b5b5736c2d26da7ada2bf1ca97ee020fd5a2`。本记录与实现一同提交,最终源码以
|
|
9
|
+
承载本记录的 Git commit 为准。六包版本仍为 0.31.1,模型/Provider 默认、依赖锁、
|
|
10
|
+
vendor、用户实际配置没有改变。
|
|
11
|
+
|
|
12
|
+
用户要求把原计划中的条件性工程优化也补齐,真实账号、性能和 Mac 桌面验收留到
|
|
13
|
+
后面。因此“工程能力实现”与“原方案的净收益验收”分别记录,前次 JEV 验证中 P5
|
|
14
|
+
尚未实施的结论保留为当时事实。
|
|
15
|
+
|
|
16
|
+
| 本轮能力 | 实际范围 |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| 就绪队列 | Full、parallel、自动管理 Worktree、并发上限大于 1 时,Execute/L1 空位及时补位 |
|
|
19
|
+
| 流水化 | 独立执行槽位不等待批次尾部;串行 packet 的检查与下一次 DSH Review 初始化重叠 |
|
|
20
|
+
| 一次性预热 | 原公开 DSH SDK `initialize`,无 Session、无 prompt;正式调用之后才创建或恢复角色会话 |
|
|
21
|
+
| 配置与工作台 | `scheduler.dispatch`、`scheduler.prewarm`;缺省 batch/false,保留原并发及工作流选择 |
|
|
22
|
+
| 恢复 | 持久准备意图、原私有清理回执、PID 与进程组退出核对、不可降级的 sessions v3 标记 |
|
|
23
|
+
| 已有候选接纳 | 完成受管 Session claim/return 与通用补丁导入的能力评估;没有新增任意补丁导入 |
|
|
24
|
+
|
|
25
|
+
`jev.enabled` 仍是唯一 JEV 总开关。这两个 scheduler 字段不属于 JEV 子开关;
|
|
26
|
+
Task/New/Run、单阶段操作和 Auto/Quick/Full 的职责保持。
|
|
27
|
+
|
|
28
|
+
## 环境
|
|
29
|
+
|
|
30
|
+
- Linux x86_64,Go 1.27.4,Node 24.22.1,npm 11.9.0。
|
|
31
|
+
- DSH 依赖保持原锁定的 0.2.2-rc.2;旧宿主兼容 fixture 为 0.2.1-rc.5。
|
|
32
|
+
- Codex Pro 保持原 vendor 0.9.0。Claude Code Pro 使用真实 0.4.0 源码 tarball,
|
|
33
|
+
SHA256 为 `125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`。
|
|
34
|
+
- SDK 桥接使用原公开实现与离线模型 fixture,没有调用真实 JEV 或付费模型。
|
|
35
|
+
- 本地原生二进制 SHA256 为
|
|
36
|
+
`036c1bf957ee8943e14310db02642f3d194c5e86d85969b1c517b7d2af81f9d1`,用于下面的
|
|
37
|
+
36 条场景,不是 npm 发行产物。
|
|
38
|
+
|
|
39
|
+
## 已执行检查
|
|
40
|
+
|
|
41
|
+
以下是实际执行的离线工程检查;没有以历史结果替代新行为的验证。
|
|
42
|
+
|
|
43
|
+
| 检查 | 结果 | 证据边界 |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| `make quality-gate` | PASS | 全 Go 测试、vet、gofmt、逐函数 100% statement coverage;最终 machine 全包约 195.3 秒 |
|
|
46
|
+
| queue/parallel/shared 的 machine race | PASS | 补位、依赖、共享预算、取消、准备失败、重规划与恢复;parallel.go 全部 14 个函数 100% |
|
|
47
|
+
| machine `TestPrewarm*` race | PASS | Full/Quick 真实编排、意图持久化、验证顺序、绑定变化及失败阻断 |
|
|
48
|
+
| drivers 全包 race + 最终 TTL 定向 race | PASS | 全包 72.167 秒;最后 TTL 修复后定向 4.198 秒,新增 21 个函数全部 100% |
|
|
49
|
+
| config/state/contract race | PASS | 配置默认与加载、扩展 schema、v1/v2/v3 兼容及旧引擎拒绝新责任 |
|
|
50
|
+
| `npm test` | 142 PASS,0 skipped | npm 启动器、安装器及发行协议;最终一轮约 29.4 秒 |
|
|
51
|
+
| `npm --prefix plugins/dsh run check` | 274 + 9 PASS,0 skipped | 主套件及旧宿主兼容;最终 TTL 改动另过 14 项 Node 行为测试,最终 UI 文案另过构建及两项回归 |
|
|
52
|
+
| DSH/Codex Pro/Claude 三个 Go → Node bridge | PASS,0 skipped | 最终 DSH 使用 race,15.428 秒;另两后端约 29.9 秒;公共适配器与实际子进程 |
|
|
53
|
+
| `make build`、36 条 session evaluation | 36 / 36 PASS | 96 次离线 adapter 调用,36 项独立 oracle 通过,0 未观察场景、0 未解决恢复或未知 outcome |
|
|
54
|
+
| 六包候选及隔离安装 | 10 PASS,0 skipped | 六个同版本实际 tarball,隔离 registry/profile,包含真实 optional Claude 包;不发布 |
|
|
55
|
+
| 文档链接/锚点/围栏、`git diff --check` | PASS | 21 个 Markdown、371 个相对链接、82 个 anchor、103 个围栏;当前双语指南、设计、方案与本记录 |
|
|
56
|
+
|
|
57
|
+
第一轮完整 Go 门禁暴露 formal handoff 错误传播分支缺少调用链覆盖;补充真实
|
|
58
|
+
RunTask 回归,断言清理未知时零 Review 派发、保留原责任、不得进入下一 packet,
|
|
59
|
+
随后最终完整门禁逐函数达到 100%。没有放宽覆盖率规则。
|
|
60
|
+
|
|
61
|
+
### npm 候选身份
|
|
62
|
+
|
|
63
|
+
[六包候选清单](evidence/2026-11-13-p5-npm-candidate.json)保留每包字节数和完整性。
|
|
64
|
+
它是以 `c445393c` 为父基线的开发快照,`dirty:true`,snapshot SHA256 为
|
|
65
|
+
`ff80895639a09f0e6310948d9e6530c51c1bae7a2784ee16eb55ac0ac2522496`,不能用于正式
|
|
66
|
+
发布。构建完成后仅补充本记录的验证结果与候选身份,不把候选冒称最终 clean commit。
|
|
67
|
+
|
|
68
|
+
直接检查插件 tarball,确认 `dist/prewarm.js` 与最后源码逐字节相同,且实际 worker
|
|
69
|
+
导入该模块;其 SHA256 为
|
|
70
|
+
`59c07971b67c10496b4cd1cbb3aa9d3939abdd1f80e438ff2e99cfe7640d9636`。
|
|
71
|
+
安装测试使用真实六包和独立用户目录,覆盖重复 setup、用户配置/技能保护、原生
|
|
72
|
+
取消、公开 adapter 运行、配置编辑与部分失败恢复。
|
|
73
|
+
|
|
74
|
+
## 关键行为证据
|
|
75
|
+
|
|
76
|
+
### 就绪队列确实缩短批次等待
|
|
77
|
+
|
|
78
|
+
受控长/短 lane 测试证明:首个 packet 的 Execute 和 L1 都完成后,下一独立项可在
|
|
79
|
+
慢 sibling 尚未完成时启动,并发上限不增加。没有把 Execute 返回当作依赖完成,
|
|
80
|
+
没有让有冲突、缺少写入声明或需要 live 凭据的项目获得额外并行资格。
|
|
81
|
+
|
|
82
|
+
首窗须全部准备且 CAS 保存后才运行;后续补位只为实际将接纳的一项准备工作区。
|
|
83
|
+
尝试耗尽、空转、取消、预算停止和后续 worktree 准备失败不接纳更多项;未接纳项
|
|
84
|
+
保留原状态。测试检查真实已启动集合、已有产物、等待清理及恢复后的调用数量。
|
|
85
|
+
Plan 修订之后重新选择,不使用原队列执行新契约。
|
|
86
|
+
|
|
87
|
+
共享 checkout 仍走原批次和共同候选屏障。Review、Plan、集成等操作仍等已启动
|
|
88
|
+
worker 停稳。准备了工作区但尚未 Execute 的恢复项先吸收已交付基线,再走正常
|
|
89
|
+
Execute/L1;不对空候选伪造原执行证据。
|
|
90
|
+
|
|
91
|
+
### 初始化与正式推理有可观察的边界
|
|
92
|
+
|
|
93
|
+
Node 与 Go 跨进程测试观察 prepare 阶段仅调用 `initialize`,在正式请求前不存在
|
|
94
|
+
Session/prompt。实际消费同一 SDK 后才创建或恢复会话,正式请求保留自己的
|
|
95
|
+
RequestID、权限、执行目录与项目目录。public SDK 通过原 `InvokeHarness` 测试
|
|
96
|
+
read-only、项目目录与执行目录分离、fresh、persistent create 和 persistent restore。
|
|
97
|
+
|
|
98
|
+
machine 测试分别执行 Full 和 Quick:准备发生在 Execute 证据保存之后;实际 Review
|
|
99
|
+
必须等待适用 L1/Quick gate 与正式调用意图持久化。scope、账号 channel 或运行时
|
|
100
|
+
绑定改变会先关闭未使用实例;关闭未知时没有 warm/cold Review 派发,也不执行
|
|
101
|
+
下一 packet。单阶段 Execute、明确暂停在 Review 前、并行 lane 与共享候选不预热。
|
|
102
|
+
|
|
103
|
+
`worker-prewarm` metrics phase 记录准备与验证可能重叠的窗口,不是纯 SDK 启动
|
|
104
|
+
延迟,不计成额外模型调用,也不证明该实例在调用时已经准备完成。正式调用时长从
|
|
105
|
+
正式 Run 入口计算,不包含之前的验证等待。
|
|
106
|
+
|
|
107
|
+
### 过期、取消与恢复不能伪造成功
|
|
108
|
+
|
|
109
|
+
准备准入最多 60 秒。到期原子禁止新的 formal handoff,再给正常关闭一个最多三秒
|
|
110
|
+
的短窗口;超过后沿用 watchdog TERM/KILL 并等待进程组。正式请求已移交时,
|
|
111
|
+
已排队的准备计时器不能取消它。Close 与到期竞争不能重置关闭宽限。
|
|
112
|
+
|
|
113
|
+
跨进程检查曾暴露一个实际问题:Go 的 TTL 比 worker 先开始计时,直接终止整个
|
|
114
|
+
组会先杀掉 SDK,无法取得正常 shutdown 证明。本轮改为先退休派发资格,再有界
|
|
115
|
+
等待正常清理,并加入同一 RequestID 安全过期冷启动的桥接回归。只有尚未尝试
|
|
116
|
+
正式 start、精确未派发收据、可信完整输出、SDK 与整个进程组清理及剩余期限均
|
|
117
|
+
成立时,才允许一次冷调用。该调用共享剩余 wall/idle,不新增业务尝试或预算。
|
|
118
|
+
|
|
119
|
+
缺失、错配、损坏、非私有、符号链接、过大、追加 JSON、文件或目录同步失败的
|
|
120
|
+
回执均不提供恢复许可。重启要求 worker PID 和原 PGID 都明确退出;leader 已退出
|
|
121
|
+
但孙进程仍存活也阻断。没有启动进程的本地事实使用单独 no-process 回执,不凭
|
|
122
|
+
缺失 PID 推断。取消、SDK 关闭未知或 formal 派发未知不能被优化开关覆盖。
|
|
123
|
+
|
|
124
|
+
首次准备将 session 账本提升为 v3;后续正式调用、清理、接管保持版本。新引擎
|
|
125
|
+
兼容旧 v1/v2,旧引擎按原 schema 拒绝 v3,防止其忽略新的清理责任。
|
|
126
|
+
|
|
127
|
+
## 未执行或未证明的内容
|
|
128
|
+
|
|
129
|
+
真实账号和 Mac 桌面验收按用户要求后置。没有测定端到端速度提升、token/费用
|
|
130
|
+
下降、真实模型质量等价、预热净收益或应当默认开启的阈值;不能把 fixture 的时间
|
|
131
|
+
或 100% statement coverage 当成这些结论。
|
|
132
|
+
|
|
133
|
+
本轮仅实现单个一次性 DSH Review runtime,不声称原生 Codex Pro、Claude Code Pro
|
|
134
|
+
或 Kimi 已有相同公开预热接口,不是长期常驻 worker 池。通用外部补丁导入仍是
|
|
135
|
+
独立工作,受管 Session claim/return 的已有能力在实施计划中单独说明。
|
|
136
|
+
|
|
137
|
+
远端 CI 与本地门禁分别核对;本记录不代替 GitHub Checks。没有合并、tag、npm
|
|
138
|
+
发行或更新用户机器。本地候选只用于检查新 worker 模块随包可用。
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# PR #37 后续复核:P5 恢复边界与 JEV 凭据名称
|
|
2
|
+
|
|
3
|
+
[验证索引](README.md) · [P5 实施计划](../plans/2026-11-13-p5-ready-queue-prewarm.md) · [前次 P5 工程验证](2026-11-13-p5-ready-queue-prewarm.md)
|
|
4
|
+
|
|
5
|
+
## 源码与范围
|
|
6
|
+
|
|
7
|
+
本次从 PR #37 的 `f75fd1f59773f9083e55ea4bbe0a7f0b0203d159` 继续。
|
|
8
|
+
该基线已包含 ready queue、Execute/L1 流水化和一次性 DSH 初始化预热。
|
|
9
|
+
本轮在独立 checkout 复核并补齐暂停、迟到计时器和 JEV 配置冻结边界;最终源码
|
|
10
|
+
以承载本记录的提交为准。前次测试和六包候选身份继续只对应前次记录中的源码。
|
|
11
|
+
|
|
12
|
+
默认保持 `scheduler.dispatch=batch`、`scheduler.prewarm=false`;不改变现有
|
|
13
|
+
Provider、模型、并发、JEV 总开关、依赖锁或用户配置。真实账号、Mac 桌面、净性能
|
|
14
|
+
收益及默认启用决定按用户要求后置。通用外部 patch 导入和长期 worker 池不属于
|
|
15
|
+
本轮原有 P5 工程范围。
|
|
16
|
+
|
|
17
|
+
## 修复与失败复现
|
|
18
|
+
|
|
19
|
+
### 并行任务在 Review 前暂停
|
|
20
|
+
|
|
21
|
+
当前轮次 Execute/L1 全部通过后,原实现将这些新候选当作恢复候选,绕过
|
|
22
|
+
`--pause-before review`。基线回归中 batch 已提前调用两次 Review,ready queue
|
|
23
|
+
直接把整个任务完成。本轮在已派发 worker 停稳后保存 `paused`,保留 `l1-passed`
|
|
24
|
+
候选及工作区,不评审、不集成。恢复后每个 packet 的 Execute 仍只发生一次;
|
|
25
|
+
后续集成改变候选时照常重新验证。
|
|
26
|
+
|
|
27
|
+
batch 的暂停点在已接纳的有界批次后;ready queue 可先补完当前固定独立候选集。
|
|
28
|
+
未接纳项没有新目录、调用意图或尝试次数。既有失败、取消和预算出口保持。
|
|
29
|
+
|
|
30
|
+
### 预热回调重新核对当前事实
|
|
31
|
+
|
|
32
|
+
原 `AfterFunc` 回调已经排队后,`Stop`/`Reset` 不能撤回它。新增回归在基线上
|
|
33
|
+
实际复现:刷新 activity 后仍被旧 idle 回调取消、进程结束后被改记超时,以及
|
|
34
|
+
初始化失败被迟到准备 TTL 改成一次冷模型调用。
|
|
35
|
+
|
|
36
|
+
修复让 idle 回调核对最新活动期限,准备与正式调用回调核对物理进程退出。
|
|
37
|
+
进一步的受管进程回归发现,仅核对 `processDone` 还不够:worker 已发出
|
|
38
|
+
`warm-result(error=SERVER)`、但尚未退出时,TTL 仍可能改写结果并触发冷调用。
|
|
39
|
+
因此准备回调也尊重已收到的终态。真实 `TIMEOUT` 对照仍沿同一 RequestID 冷启动,
|
|
40
|
+
保留全部未派发、清理和剩余期限要求;初始化失败不取得该权限。
|
|
41
|
+
|
|
42
|
+
独立 review 又发现,直接在 `warmTerminal` 时返回会同时跳过关闭计时器,导致
|
|
43
|
+
仍活着的 worker 不在原宽限内退出;未手动释放 stdin 的真实进程回归复现该失败。
|
|
44
|
+
最终实现只抑制终态重分类,对仍存活的未交接 worker 继续安排原有界关闭,不重置
|
|
45
|
+
已经开始的关闭宽限。收到终态与完成物理清理始终分别确认。
|
|
46
|
+
|
|
47
|
+
初次定向覆盖检查的 `expirePrepare` 为 88.9%,其余 20 个函数为 100%。通过真实
|
|
48
|
+
“私有未派发收据存在、没有 stdout 终态帧、进程已经退出”的 fixture 补齐物理退出
|
|
49
|
+
分支,最终 21 个预热函数均为 100%。没有人为改写终态标志来填充覆盖率。
|
|
50
|
+
|
|
51
|
+
### JEV 凭据名称可冻结并恢复
|
|
52
|
+
|
|
53
|
+
PR review 指出的配置/契约不一致仍存在于基线:配置允许小写和混合大小写,
|
|
54
|
+
`preparation.schema.json` 的 `decision.key-env` 却只允许大写。真实配置加载到
|
|
55
|
+
`Start`/`SavePreparation` 的回归复现四个失败:小写、混合大小写、下划线开头
|
|
56
|
+
及 120 位混合名称。
|
|
57
|
+
|
|
58
|
+
本轮只放宽准备契约的字符集,保留原 128 位上限,保持原名称和契约哈希。
|
|
59
|
+
新配置仍限制为 120 位;旧 121/128 位大写冻结契约继续可读,129 位及非法名字
|
|
60
|
+
仍拒绝。测试覆盖再次 CAS 保存和读取,并确认非法配置不创建 preparation。
|
|
61
|
+
|
|
62
|
+
## 本轮工程验证
|
|
63
|
+
|
|
64
|
+
环境:Linux x86_64、Go 1.27.4、Node v24.22.1、npm 11.9.0。
|
|
65
|
+
Go 使用已有精确版本模块缓存,`GOPROXY=off`、`GOTOOLCHAIN=local`;没有修改依赖。
|
|
66
|
+
|
|
67
|
+
| 检查 | 本轮结果 |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| 新增回归:原实现失败、修复后通过 | 已确认上述暂停、计时和凭据名称行为;真实过期对照继续通过 |
|
|
70
|
+
| `make quality-gate` | 最终修复后重新执行通过;vet、格式、全包测试及每个被测函数 100% statement coverage,原单行 cmd 入口例外不变 |
|
|
71
|
+
| 受影响调度、预热与 JEV 凭据路径 `-race` | 通过;最后的预热分类/清理修复再次跑完整 `TestDSHPrewarm*` race,21 个函数均 100% |
|
|
72
|
+
| `npm test` | 142 通过,0 失败、0 跳过 |
|
|
73
|
+
| `npm --prefix plugins/dsh run check` | 主套件 274 通过、旧宿主 9 通过,均 0 失败、0 跳过 |
|
|
74
|
+
| 三个公开 adapter 的 Go → Node `-race` bridge | DSH、Codex Pro、Claude Code Pro 均通过,0 跳过 |
|
|
75
|
+
| 最终 native build 与 session evaluation | 构建通过;36/36 场景、96 次实际离线 adapter 调用全部通过,0 未观察、0 unknown outcome |
|
|
76
|
+
| 文档链接、锚点、围栏及 diff | 8 个变更 Markdown、173 个相对链接、42 个锚点和 42 个围栏通过;`git diff --check` 通过 |
|
|
77
|
+
|
|
78
|
+
定向验证使用以下命令;完整门禁仍单独覆盖全部 Go 包及逐函数覆盖率:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
go test -race ./internal/drivers ./internal/machine \
|
|
82
|
+
./internal/investigation ./internal/contract ./internal/config ./internal/state \
|
|
83
|
+
-run '^(TestDSHPrewarm|TestReadyQueue|TestParallel|TestFullScheduler|TestDeclaredWriteScope|TestConfiguredJEVKeyNames|TestPreparationJEVKeyNames)' \
|
|
84
|
+
-count=1
|
|
85
|
+
FLYWHEEL_TEST_NODE_BRIDGE=1 go test -race ./internal/drivers \
|
|
86
|
+
-run '^Test(DSH|CodexPro|ClaudeCodePro)NodeWorkerOfflineBridge$' -count=1 -v
|
|
87
|
+
make build
|
|
88
|
+
FLYWHEEL_EVAL_BINARY="$PWD/flywheel" npm run test:sessions
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
上述定向 race 的名称过滤器没有选中 config/state 包中的测试,因此不将那两包
|
|
92
|
+
描述为定向 race 通过;它们的实际完整测试由 quality gate 覆盖。最后新增的
|
|
93
|
+
有界收尾回归另以 `go test -race ./internal/drivers -run '^TestDSHPrewarm' -count=1`
|
|
94
|
+
执行,覆盖率单独核对。开发中的较早完整门禁不代替最终修复后的重新执行。
|
|
95
|
+
|
|
96
|
+
插件依赖沿用基线锁定的环境;本轮逐文件核对 Codex Pro 的 79 个文件和 Claude
|
|
97
|
+
Code Pro 的 45 个文件,与实际 tarball 完全相同。可选 Claude peer 使用已审阅
|
|
98
|
+
源码生成的 0.4.0 tarball(不宣称本轮从 registry 安装),其 SHA-256 为
|
|
99
|
+
`125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`;
|
|
100
|
+
Codex Pro 0.9.0 的仓库 vendor tarball SHA-256 为
|
|
101
|
+
`4a86380fdde0d7f2673c4b1f2d5c8682cf61d6a4b83deb65eab8fe76f6032198`。
|
|
102
|
+
|
|
103
|
+
本轮未重建六包发行候选;前次候选安装结果不能代表此次源码的发行验收。
|
|
104
|
+
离线 adapter 和进程测试不等同真实模型调用或桌面验收。
|
|
105
|
+
|
|
106
|
+
## 远端检查与交付边界
|
|
107
|
+
|
|
108
|
+
基线 [CI run 43386131427](https://github.com/ckanner/flywheel/actions/runs/43386131427)
|
|
109
|
+
仍为 failure:`npm-candidate` 的 `runner_id=0`、`steps=[]`,下游 test skipped,
|
|
110
|
+
日志下载返回 404。check 显示有两条 annotation,但当前连接的 endpoint 允许范围
|
|
111
|
+
不能读取其内容;现有证据不足以确认具体平台原因。
|
|
112
|
+
|
|
113
|
+
后续提交的远端 CI 状态单独记录在 PR;本地通过不把远端检查变成通过。
|
|
114
|
+
本次提交不合并 PR、不打 tag、不发布 npm,也不升级用户安装。
|