@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.
Files changed (153) hide show
  1. package/CHANGELOG.md +122 -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 +86 -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 +812 -0
  18. package/docs/en/claude-code-pro.md +25 -16
  19. package/docs/en/configuration.md +405 -145
  20. package/docs/en/contributing.md +303 -0
  21. package/docs/en/flow-console.md +142 -24
  22. package/docs/en/getting-started.md +232 -126
  23. package/docs/en/investigation.md +263 -0
  24. package/docs/en/jev-shadow.md +5 -0
  25. package/docs/en/jev.md +240 -0
  26. package/docs/en/model-policy.md +154 -62
  27. package/docs/en/releasing.md +207 -0
  28. package/docs/en/session-evaluation.md +4 -2
  29. package/docs/en/session-recovery.md +88 -6
  30. package/docs/en/workflow.md +241 -114
  31. package/docs/evaluation/README.md +12 -0
  32. package/docs/evaluation/jev-historical-provisional.json +138 -0
  33. package/docs/evaluation/jev-historical-result-2026-11-10.json +174 -0
  34. package/docs/plans/2026-11-01-dsh-integration.md +67 -0
  35. package/docs/plans/2026-11-01-model-profiles-preflight.md +29 -0
  36. package/docs/plans/2026-11-01-npm-installation.md +19 -0
  37. package/docs/plans/2026-11-03-codex-pro-default.md +28 -0
  38. package/docs/plans/2026-11-06-adaptive-workflow.md +365 -0
  39. package/docs/plans/2026-11-07-session-lifecycle.en.md +424 -0
  40. package/docs/plans/2026-11-07-session-lifecycle.md +337 -0
  41. package/docs/plans/2026-11-08-flow-console.md +271 -0
  42. package/docs/plans/2026-11-10-jev-shadow.md +32 -0
  43. package/docs/plans/2026-11-10-task-discovery.md +17 -0
  44. package/docs/plans/2026-11-10-workbench-redesign.md +19 -0
  45. package/docs/plans/2026-11-12-feedback-driven-workflows.md +739 -0
  46. package/docs/plans/2026-11-12-unified-jev-decisions.md +89 -0
  47. package/docs/plans/2026-11-13-jev-execution-decisions.md +110 -0
  48. package/docs/plans/2026-11-13-p5-ready-queue-prewarm.md +178 -0
  49. package/docs/plans/README.md +25 -0
  50. package/docs/reviews/2026-08-24-v0.18-review-fixplan.md +265 -0
  51. package/docs/reviews/2026-09-12-pr4-pr5-review.md +70 -0
  52. package/docs/reviews/README.md +12 -0
  53. package/docs/validation/2026-11-01-npm-installation.md +105 -0
  54. package/docs/validation/2026-11-01-profiles-preflight.md +67 -0
  55. package/docs/validation/2026-11-01-results.md +114 -0
  56. package/docs/validation/2026-11-03-codex-pro-default.md +90 -0
  57. package/docs/validation/2026-11-04-dsh-native-view.md +85 -0
  58. package/docs/validation/2026-11-04-release-0.28.1.md +33 -0
  59. package/docs/validation/2026-11-04-release-0.28.2.md +35 -0
  60. package/docs/validation/2026-11-05-dsh-0.2.2-compatibility.md +26 -0
  61. package/docs/validation/2026-11-05-registry-smoke-recovery.md +26 -0
  62. package/docs/validation/2026-11-05-release-0.28.3.md +32 -0
  63. package/docs/validation/2026-11-05-subscription-model-access.md +60 -0
  64. package/docs/validation/2026-11-05-view-order.md +14 -0
  65. package/docs/validation/2026-11-07-adaptive-workflow.md +79 -0
  66. package/docs/validation/2026-11-07-claude-code-pro.md +144 -0
  67. package/docs/validation/2026-11-07-session-lifecycle.md +136 -0
  68. package/docs/validation/2026-11-08-session-p3-p4.md +99 -0
  69. package/docs/validation/2026-11-09-flow-console.md +81 -0
  70. package/docs/validation/2026-11-10-jev-shadow.md +50 -0
  71. package/docs/validation/2026-11-10-task-discovery.md +45 -0
  72. package/docs/validation/2026-11-10-workbench-redesign.md +54 -0
  73. package/docs/validation/2026-11-11-release-0.30.2.md +65 -0
  74. package/docs/validation/2026-11-11-release-0.31.0.md +46 -0
  75. package/docs/validation/2026-11-12-dsh-0.2.2-rc.2.md +58 -0
  76. package/docs/validation/2026-11-12-feedback-driven-workflows.md +187 -0
  77. package/docs/validation/2026-11-12-release-0.31.1.md +58 -0
  78. package/docs/validation/2026-11-12-session-console-ux.md +46 -0
  79. package/docs/validation/2026-11-12-unified-jev-decisions.md +93 -0
  80. package/docs/validation/2026-11-13-dsh-settings-controls.md +104 -0
  81. package/docs/validation/2026-11-13-jev-execution-decisions.md +140 -0
  82. package/docs/validation/2026-11-13-p5-ready-queue-prewarm.md +138 -0
  83. package/docs/validation/2026-11-13-p5-review-closure.md +114 -0
  84. package/docs/validation/2026-11-13-p5-tracked-runtime-fixes.md +108 -0
  85. package/docs/validation/2026-11-13-prewarm-receipts-and-expiry-tests.md +92 -0
  86. package/docs/validation/2026-11-13-workspace-redesign.md +66 -0
  87. package/docs/validation/README.md +51 -0
  88. package/docs/validation/evidence/2026-11-08-session-p3-p4.json +5430 -0
  89. package/docs/validation/evidence/2026-11-13-p5-npm-candidate.json +54 -0
  90. package/docs/validation/evidence/claude-node-bridges.txt +118 -0
  91. package/docs/validation/evidence/claude-npm-build.txt +15 -0
  92. package/docs/validation/evidence/claude-npm-candidate.json +54 -0
  93. package/docs/validation/evidence/claude-npm-install.txt +21 -0
  94. package/docs/validation/evidence/claude-npm-tests.txt +145 -0
  95. package/docs/validation/evidence/claude-plugin-tests.txt +205 -0
  96. package/docs/validation/evidence/claude-quality-gate.txt +29 -0
  97. package/docs/validation/evidence/claude-race.txt +7 -0
  98. package/docs/validation/evidence/codex-pro-070-probes.txt +4 -0
  99. package/docs/validation/evidence/dsh-bridge.txt +4 -0
  100. package/docs/validation/evidence/dsh-native-view-bridge-tests.txt +1 -0
  101. package/docs/validation/evidence/dsh-native-view-build.txt +15 -0
  102. package/docs/validation/evidence/dsh-native-view-candidate.json +54 -0
  103. package/docs/validation/evidence/dsh-native-view-inspect.txt +27 -0
  104. package/docs/validation/evidence/dsh-native-view-install-tests.txt +19 -0
  105. package/docs/validation/evidence/dsh-native-view-npm-tests.txt +143 -0
  106. package/docs/validation/evidence/dsh-native-view-plugin-tests.txt +99 -0
  107. package/docs/validation/evidence/dsh-native-view-quality-gate.txt +29 -0
  108. package/docs/validation/evidence/dsh-plugin-tests.txt +48 -0
  109. package/docs/validation/evidence/function-coverage.txt +378 -0
  110. package/docs/validation/evidence/npm-build.txt +13 -0
  111. package/docs/validation/evidence/npm-contract-tests.txt +65 -0
  112. package/docs/validation/evidence/npm-dsh-bridge.txt +18 -0
  113. package/docs/validation/evidence/npm-dsh-plugin-tests.txt +62 -0
  114. package/docs/validation/evidence/npm-function-coverage.txt +420 -0
  115. package/docs/validation/evidence/npm-install-tests.txt +20 -0
  116. package/docs/validation/evidence/npm-quality-gate.txt +29 -0
  117. package/docs/validation/evidence/npm-race.txt +7 -0
  118. package/docs/validation/evidence/pr-dsh-bridge.txt +4 -0
  119. package/docs/validation/evidence/pr-dsh-plugin-tests.txt +48 -0
  120. package/docs/validation/evidence/pr-function-coverage.txt +379 -0
  121. package/docs/validation/evidence/pr-quality-gate.txt +28 -0
  122. package/docs/validation/evidence/pr-race.txt +6 -0
  123. package/docs/validation/evidence/profiles-control-smoke.json +1 -0
  124. package/docs/validation/evidence/profiles-dsh-bridge.txt +18 -0
  125. package/docs/validation/evidence/profiles-dsh-plugin-tests.txt +59 -0
  126. package/docs/validation/evidence/profiles-function-coverage.txt +411 -0
  127. package/docs/validation/evidence/profiles-quality-gate.txt +29 -0
  128. package/docs/validation/evidence/profiles-race.txt +7 -0
  129. package/docs/validation/evidence/quality-gate.txt +28 -0
  130. package/docs/validation/evidence/race.txt +6 -0
  131. package/docs/validation/evidence/watchdog-startup-after.txt +2 -0
  132. package/docs/validation/evidence/watchdog-startup-before.txt +6 -0
  133. package/docs/validation/evidence/watchdog-startup-quality-gate.txt +29 -0
  134. package/docs/validation/evidence/watchdog-startup-race.txt +7 -0
  135. package/docs/{claude-code-pro.md → zh-CN/claude-code-pro.md} +23 -17
  136. package/docs/{configuration.md → zh-CN/configuration.md} +397 -142
  137. package/docs/zh-CN/contributing.md +240 -0
  138. package/docs/zh-CN/flow-console.md +216 -0
  139. package/docs/zh-CN/getting-started.md +352 -0
  140. package/docs/zh-CN/investigation.md +213 -0
  141. package/docs/zh-CN/jev-shadow.md +5 -0
  142. package/docs/zh-CN/jev.md +192 -0
  143. package/docs/zh-CN/model-policy.md +128 -0
  144. package/docs/zh-CN/releasing.md +120 -0
  145. package/docs/{session-evaluation.md → zh-CN/session-evaluation.md} +4 -2
  146. package/docs/{session-recovery.md → zh-CN/session-recovery.md} +75 -12
  147. package/docs/zh-CN/workflow.md +284 -0
  148. package/npm/install.js +1 -1
  149. package/package.json +12 -25
  150. package/docs/flow-console.md +0 -122
  151. package/docs/getting-started.md +0 -418
  152. package/docs/model-policy.md +0 -65
  153. package/docs/workflow.md +0 -314
@@ -0,0 +1,79 @@
1
+ # Auto/Quick/Full 第一阶段实施与验收
2
+
3
+ 日期:2026-11-07。对应 [PR #29](https://github.com/ckanner/flywheel/pull/29),基线为
4
+ `f6272907a5e9fdc891bec0394a593636a5bb8214`。原方案的文档提交为
5
+ `a9e8f9763b9d9bfb81f19fb903f1b336a6944737`;本轮在同一 PR 追加实现。
6
+ 最终提交、完整门禁结果和六包候选的源码快照标识记录在 PR 的验收表中。
7
+
8
+ ## 已实施范围
9
+
10
+ 统一入口为 `flywheel-task`:当前宿主研究代码,准备任务集成 worktree、Spec、
11
+ packets 与真实检查依据,再通过 `flywheel_launch` 或 `control launch` 启动。
12
+ CLI 消费已准备的契约,不另行调用分类模型,不接管自然语言需求研究。
13
+
14
+ Auto/Quick/Full 是流程选择,不是模型或权限预设。旧任务继续 Full;新任务的
15
+ Go 选择器检查结构、需求映射、资格事实、证据、风险,以及 L1/L2/L3 的适用性。
16
+ 首版 Quick 限一个里程碑和一个可独立验收的 packet,没有任意文件数阈值。
17
+
18
+ Quick 保留 Execute、L1、适用缺陷注入、实际候选上的 L2/L3、一次独立最终
19
+ Review,以及同一候选的本地 Git 交付。正常首次成功有两次阶段 Agent 调用;
20
+ 宿主准备、内部工具轮次、重试和升级不计入这两个阶段。Plan/Judge 不适用时
21
+ 分别记录理由,没有伪造通过裁决。
22
+
23
+ 策略版本、请求模式、生效策略、阶段适用性与升级事件由引擎持久化。Quick 发现
24
+ 新风险、验证缺口或有界修复失败时只向 Full 升级,保留任务身份、预算、已有
25
+ 工作区、尝试和历史。手动最终 Review 也立即保存必要的升级 checkpoint,但
26
+ 不在这个单步内调用 Plan 或继续交付。未知策略版本和不一致状态在加载期拒绝。
27
+
28
+ DSH 使用公开 session projection 折叠原有 command/native tool/PTC 事件,恢复
29
+ 确切的 taskDir/cwd。没有增加自定义 Session 事件,没有扫描或猜测任务目录,
30
+ 也没有第二份引擎状态。重放、checkpoint、fork、会话切换和迟到响应保持隔离。
31
+ 未确认的变更必须先查询原任务;没有已记录会话目录时,省略 cwd 的变更请求在
32
+ Go 派发前拒绝,显式绝对路径仍可使用。
33
+
34
+ 新增的第 11 个 skill 及其契约参考文件进入二进制内嵌、快照安装与真实 npm
35
+ 安装检查。旧的准备、运行、执行、评审、验证、状态按钮及中英文指南同步更新。
36
+
37
+ ## 验收覆盖
38
+
39
+ | 层面 | 命令或测试入口 | 验证的事实 |
40
+ |---|---|---|
41
+ | Go 全部包 | `make quality-gate` | vet、gofmt、全部测试与逐函数 100% statement coverage;不降低旧门禁 |
42
+ | Quick 行为与恢复 | `internal/machine/workflow_*_test.go` | 两次调用正常完成、候选 L2/L3、独立最终裁决、退回修复、资格变化与单向升级、预算和工作区保留 |
43
+ | 完成与故障 | 同上及已有 Git/进程测试 | unit 已交付、milestone 已关闭、task 已完成三个 checkpoint 的恢复;外部提交改变候选不能复用旧绿灯;读失败、CAS、取消、Git hook/提交失败保留现场 |
44
+ | 契约和状态 | contract/state/diagnostic/cli 的 workflow 测试 | 合法选择、旧账本 Full、未知版本、阶段矛盾、只读预检、字面 argv、活动任务防重复启动和模式冲突 |
45
+ | DSH 插件 | `npm --prefix plugins/dsh run check` | 两个受支持版本的真实发布包,包括 Session、SessionProjectionRegistry、renderer、native/PTC dispatcher,及控制协议/视图行为 |
46
+ | Go/Node 边界 | `FLYWHEEL_TEST_NODE_BRIDGE=1 go test ./internal/drivers -run '^Test(DSH\|CodexPro)NodeWorkerOfflineBridge$' -count=1 -v` | 两类 worker 的真实跨进程协议、权限、取消、清理回执与错误语义 |
47
+ | 并发行为 | CI 中相同的七个核心包 `go test -race ... -count=1` | machine、verify、watchdog、drivers、cli、modules、diagnostic |
48
+ | npm 协议 | `npm test` | 启动器、安装器、配置保护及发行契约 |
49
+ | 六包安装 | `npm run build:npm` 后 `FLYWHEEL_NPM_PACKAGES_DIR=dist-npm npm run test:install` | 隔离源码快照构建、真实本地 registry 安装、11 个 skills 与引用文件、实际 host 入口导入、配置保护、离线 worker 与取消 |
50
+
51
+ 六包安装夹具提供真实锁定的 `dsh-subagent-codex-pro@0.8.0` 与 `zod@4.3.6`
52
+ 发布 tarball,核对源码锁文件的 SHA-512、包名、版本与依赖图。不会用伪造 schema
53
+ 依赖或只检查工作区源文件来代替安装后的入口。
54
+
55
+ ## 审查中修复的问题
56
+
57
+ - Quick 的手动 Review 不能漏掉适用缺陷注入;缺失、不可注入或未完成结果不能交付。
58
+ - milestone 已关闭后恢复也重新核对最终候选,防止收尾前崩溃后错误认可另一份已提交代码。
59
+ - Quick 及其升级任务的缺陷注入配置进入证据和契约身份,原生 Full 的旧身份保持兼容。
60
+ - 手动评审发现必须 Full 时立即持久化;不能在重启后重新取得一次 Quick 裁决来抹掉风险。
61
+ - 初始 CAS 保存失败时不创建 Git 契约 checkpoint,也不启动模型。
62
+ - 控制诊断取消后不再为了填充响应 cwd 额外运行 Git,保留正常清理和退出行为。
63
+ - 修正新 skill 文案的 YAML 解析问题,避免安装时漏装;真正安装的新 skill 数量为 11。
64
+ - 同一任务再次启动后刷新实际状态,避免视图只保留旧状态;无法证明会话 cwd 时提前拒绝变更。
65
+ - 独立审查复现了宿主测试共用 100ms 超时导致正常 status 偶发失败;改为真实进程启动后显式取消挂起请求,正常恢复使用原有控制期限,生产超时与断言不变。
66
+ - 明确 `flywheel-run` 同时收到 `pause=review` 与 mode 时在同一前台命令中透传,防止遗漏用户显式 Full 选择。
67
+
68
+ ## 验证边界
69
+
70
+ 本轮使用 Linux、Go 1.27、Node 24.22.1 和 npm 12.2.1。真实发布的 DSH
71
+ 0.2.1-rc.5/0.2.2-rc.1 包参与离线测试;模型结果由明确的测试驱动提供。
72
+ 这不等同于用户 Mac 的原生桌面视觉验收、Seatbelt/钥匙串行为或真实账号推理。
73
+ 没有声称所有实际任务都只需两次调用,也没有用阶段减少推导耗时或费用减半。
74
+
75
+ 六包为开发候选,源码版本沿用 0.28.5,并明确标记不可发布;不覆盖已有 npm
76
+ 发行或 tag,不提升 latest,不修改用户安装。正式发行须另选新版本并遵守现有
77
+ 精确 tag、同一候选、完整性和安装门禁。模型、账号、完全权限选择、串行 packet
78
+ 调度与独立 Execute/Review 会话保持现有约定。多任务团队、依赖图并行、附件协议
79
+ 以及引擎内自动 GitHub 交付仍属于后续范围。
@@ -0,0 +1,144 @@
1
+ # Claude Code Pro 接入、设计复核与验收
2
+
3
+ 本记录对应 2026-11-07 的增量任务:复核近期 PR、会话设计与实现,接入
4
+ `dsh-subagent-claude-code-pro`,先提供可配置能力,不预先决定使用哪个 loop。
5
+ 源码实现、离线验证、PR 合并、npm 发布和用户安装是独立状态。
6
+
7
+ ## 1. 设计与基线
8
+
9
+ 本次读取并核对的实际 GitHub 状态:
10
+
11
+ | PR | 状态 | 与本次工作的关系 |
12
+ |---|---|---|
13
+ | [#29](https://github.com/ckanner/flywheel/pull/29) | closed、已合并 | Auto/Quick/Full 与统一任务入口,保留已有实现 |
14
+ | [#30](https://github.com/ckanner/flywheel/pull/30) | open | scoped 会话、角色隔离与分期恢复的设计方案 |
15
+ | [#31](https://github.com/ckanner/flywheel/pull/31) | open | P1/P2 角色账本、正常续接及已保存回执恢复的实现基线 |
16
+
17
+ Flywheel 基线为 #31 的 `56bfda287587fec64d0d812de2726695e0d2d727`,
18
+ tree 为 `3145b47e12c2f65d2aebf60200c69aa7831b05af`。新增改动堆叠在该实现上,
19
+ 不将仍然打开的 PR 描述为已经合并。
20
+
21
+ 复核重点包括 `docs/design.md` 的设计不变量、会话方案、真实调用链、状态 CAS/回执
22
+ 消费、角色保护、计量、配置诊断、技能入口、npm 安装和 CI/发布验证。Go 仍是唯一
23
+ 编排与状态所有者;skills 只执行校验、调用和结果翻译。
24
+
25
+ ## 2. 本次实现
26
+
27
+ - 新增独立 `harness:claude-code-pro`,通过受管 Node worker 调用公开 machine API。
28
+ 不把 DSH 工具名 `subagent_claude_code` 冒充原生 LLM provider,也不增加父模型委派。
29
+ - 配置入口覆盖 Plan、Execute routes、Review、Judge/第二意见、Intake、Garden。
30
+ 模型与 effort 明确传递;模板只增加未绑定的 `claude-sonnet` profile,现有默认绑定不变。
31
+ - 接通 fresh/scoped、显式 session resume、请求/run/session 身份与原始回执。
32
+ 主任务沿用已有角色账本和回执恢复;Intake/Garden 保持独立建议调用。
33
+ - 完整模型 ID 要求实际观察值一致;sonnet/opus/haiku 别名核对对应 family。
34
+ CLI 未证明的实际 effort 不会被写成已验证。
35
+ - 首版只接受显式 full-access,映射原生 bypassPermissions;原生审批模式不等于
36
+ read-only/workspace-write 的 OS 沙箱。不支持的权限在派发前拒绝。
37
+ - 新增 worker 包装器、npm 路径解析、安装报告、doctor/inspect、双语使用说明和技能
38
+ 前提。Claude 插件是精确 optional peer 0.3.2;缺少它不影响未选择 Claude 的流程。
39
+ - 未知派发、结果或清理不能进入成功路径,也不能通过 fresh、重试或换渠道绕过。
40
+ 原始 partial/unknown usage 继续保留;CLI 的 API 等价成本不是订阅账单。
41
+
42
+ 完整配置和能力边界见[中文指南](../zh-CN/claude-code-pro.md)与
43
+ [English guide](../en/claude-code-pro.md)。
44
+
45
+ ## 3. 独立审查发现及修复
46
+
47
+ | 确认问题 | 修复及实际回归 |
48
+ |---|---|
49
+ | 本地 harness 拒绝丢失 Session 事实 | 原基线 fresh/scoped/保留检查点三个反例均失败;修复后明确 not-dispatched、已清理和零消耗,修正配置后可继续 |
50
+ | Kimi/DSH 派发前取消误记 unknown | 只有 watchdog 已证明未启动才记录未派发;实际启动后的取消不冒充可复用终态 |
51
+ | 超长 Claude 请求尚未解析 ID 就被 worker 拒绝 | Go 对实际发送的同一 JSONL 字节预检 1 MiB;包括转义和换行,精确上限及多 1 byte 均有回归 |
52
+ | 矛盾 Claude 回执可能留下可继续状态 | 核验配置、退出、终态、清理、usage 和输出组合后再赋予可信状态;坏尾帧、重复终态、错 session、错模型等全部拒绝 |
53
+ | Intake/Garden 在结果未知时仍可能选择后续候选 | 保存已知计量后停止 retry/fallback,记录 invocation 原因;不以进程已清理推断业务结果 |
54
+ | 包含缓存的输入被重复计价 | DSH/Codex Pro/Claude Code Pro 先拆出未缓存输入,再各计一次;保留原始 token 口径及 legacy pi 语义 |
55
+ | 强杀 worker 后原生 Claude 仍存活 | 上游先建立独立 guardian 的 IPC lifeline,再派发 CLI;父进程消失仍能清理 native group |
56
+
57
+ 缓存数值反例:100 个未缓存输入、900 个 cache read、10 个输出,输入/输出每百万
58
+ $1、cache read 每百万 $0.1,正确估算是 $0.0002,旧实现会算为 $0.0011。
59
+ 非法缓存子集、负数与溢出式输入返回未知,不生成负成本或重复费用。
60
+
61
+ guardian 原始反例在 worker SIGKILL 后 300 ms 仍观察到 native 存活。修复后的
62
+ 独立探针使用最终真实 npm 安装(非 symlink):对整个 worker PGID 强杀,普通挂起的
63
+ native/guardian 均退出,忽略 SIGTERM 的 native/guardian 也在强制清理后退出。
64
+ 另验证单独强杀 guardian 时,仍存活的父 API 清理已登记 native,并返回 unknown。
65
+ 这些测试没有将清理成功解释为业务完成;所有测试进程已回收。
66
+
67
+ ## 4. 上游交付与真实依赖
68
+
69
+ 配套 [Claude Code Pro PR #1](https://github.com/ckanner/dsh-subagent-claude-code-pro/pull/1)
70
+ 新增公开 machine v1、类型、双语契约、严格流校验及进程监督。保留原有 51 项桌面测试,
71
+ 总计 80/80 本地测试通过。公共 machine.js 的 line/function coverage 为 100%,
72
+ branch coverage 为 94.64%;不声称上游全仓 100%。
73
+
74
+ | 身份 | 值 |
75
+ |---|---|
76
+ | 最终上游 source commit | `28483f8aafc15463c6d365100b64c04480cb56b5` |
77
+ | 最终 source tree | `573e322a7596845d16d84ddf9c2140f967b20fae` |
78
+ | package / machine protocol | `dsh-subagent-claude-code-pro@0.3.2` / `1` |
79
+ | tarball SHA-256 | `d55b3a52d7b0d350556f65da572194bfe3db89550f4b7ea4cbdbab7997fbf125` |
80
+ | npm integrity | `sha512-ly9kmxP+n3+GxhYgiKLrJTdWBxcGf9gRcb5lF5G27Ikk8wiq1cdr5iiTxsOVeK3s72JEeuLOLIqDWjCj1voX9w==` |
81
+
82
+ npm 12.2.1 生成真实 tarball,60,585 bytes、37 files、零运行时依赖。它被实际安装到
83
+ Flywheel 的 Node 依赖树,并核对 machine/guardian/runner/类型的文件字节;
84
+ 全局隔离安装测试再次安装同一个 tarball。未编辑版本伪装 0.3.1 兼容,也未虚构 npm
85
+ registry 的 0.3.2 发行或 lock integrity。
86
+
87
+ 上游[最终 CI run 42393984627](https://github.com/ckanner/dsh-subagent-claude-code-pro/actions/runs/42393984627)
88
+ 中,Ubuntu/macOS × Node 22/24 四个 job 均成功。远端首先暴露两处测试假设:macOS
89
+ 临时目录要比较 realpath,孤儿 guardian 的 EPERM 探针应继续等待且只以 ESRCH 认定消失。
90
+ 两个后续提交只修改测试,保留原截止时间及断言;运行时代码、打包文件和 tarball hash
91
+ 均未改变。这个结果不代表真实账号或用户 Mac 桌面 live 已通过。
92
+
93
+ ## 5. Flywheel 完整本地验收
94
+
95
+ 环境:Linux amd64、Go 1.27.0、Node 24.22.1、npm 12.2.1。测试使用真实公开插件/SDK
96
+ 与真实子进程;原生模型服务由离线 CLI/app-server fixture 代替,没有发出账号推理请求。
97
+
98
+ | 检查 | 最终结果 | 原始记录 |
99
+ |---|---|---|
100
+ | `make quality-gate` | vet、gofmt、全部 Go 包、每个被测函数 100% statement coverage | [Go 门禁](evidence/claude-quality-gate.txt) |
101
+ | 七个核心包 `go test -race` | 全部通过 | [race](evidence/claude-race.txt) |
102
+ | `npm --prefix plugins/dsh run check` | 168 个主测试 + 8 个隔离 rc.5 宿主测试通过;0 skipped | [插件测试](evidence/claude-plugin-tests.txt) |
103
+ | Go → Node → DSH/Codex Pro/Claude | 三后端及全部子场景通过;Claude 15 个子场景,缺 peer 会失败而非跳过 | [桥接测试](evidence/claude-node-bridges.txt) |
104
+ | 根目录 `npm test` | 127/127 通过 | [npm 契约](evidence/claude-npm-tests.txt) |
105
+ | 六包隔离构建 | 四平台二进制、DSH 插件、meta 同版本候选成功,源码 clean | [构建](evidence/claude-npm-build.txt) |
106
+ | 实际 npm 安装 | 9/9 通过,0 skipped;包含缺 peer 与显式安装 peer 两条路径 | [安装](evidence/claude-npm-install.txt) |
107
+ | 原生 CLI | build、version、control/doctor help、JSON inspect 与内嵌 profile 通过 | 实际 8 个默认 binding,未自动选择 Claude |
108
+ | 独立审查 | 所有确认问题关闭,最终安装字节上的 worker 整组强杀反例通过 | 本记录 §3 |
109
+
110
+ 安装测试使用隔离 registry、HOME、global prefix 和 DSH 协议桩;确认用户配置、已修改
111
+ skills 与重复 setup 行为。安装后的 worker 导入真实 machine API,执行离线 Claude,
112
+ 确认配置、持久会话、22-token 用量、unknown 订阅成本和进程组消失。
113
+
114
+ CI 与正式 publish 的 verify 阶段均固定上述上游 commit,单次打包并核对 SHA-256,
115
+ 两种 OS 消费相同 artifact,三后端 bridge 与真实可选安装都启用。npm 12 的
116
+ `--no-save` 不会单独放入该 optional peer;验证环境临时用 `--save-dev` 安装真实包,
117
+ 构建/测试前恢复两个源 manifest,退出 trap 再恢复。正式六包发布、tag、registry、
118
+ promotion 门禁没有改变;本次没有触发发布。
119
+
120
+ ## 6. 已测源码与候选身份
121
+
122
+ | 项目 | 值 |
123
+ |---|---|
124
+ | 已测本地代码提交 | `2e2c20bfbfe68981259bcbbd32eb3f2941d9d5a1` |
125
+ | 相同代码的 GitHub 提交 | `4234ca9d2de224e09a9751654711b2b902cfe6ab` |
126
+ | 两端一致的代码 tree | `f71e267e3a774867fd0b2d6fdac92982ba2f46a9` |
127
+ | 六包源码快照 SHA-256 | `57a9c5afdfc129bc9a88abe79a15a47c3e4a3163c3c0af5ee849a1efc63b03cd` |
128
+ | candidate.json SHA-256 | `a5544e2dfe94827e89dcefa857662a3c335b68e68bec92f01d4faa6866f56971` |
129
+
130
+ 完整六包身份见实际保存的 [candidate.json](evidence/claude-npm-candidate.json)。
131
+ 后续验收提交只增加本记录/原始日志、设计链接,并将两个工作流的上游 source pin
132
+ 推进到只修测试的最终上游提交;没有修改已测运行时代码、测试、技能或打包文件。
133
+ PR 上分别记录 Flywheel 远端 Actions 状态,不用本地通过替代远端执行证据。
134
+
135
+ ## 7. 仍然明确保留的边界
136
+
137
+ - 0.3.2 是配套源码候选,不等于已发布 npm。Flywheel 源码版本仍为 0.28.5,本次不覆盖
138
+ 已存在的 registry 版本,不移动 tag/latest,不修改用户现有 Mac 安装。
139
+ - P1/P2 的正常终态续接、角色隔离及已保存回执恢复继续成立;P3 的 early durable ack、
140
+ 在途只读查询与任意崩溃点恢复没有实现。guardian 解决物理监督,不恢复未知业务效果。
141
+ - 同时失去父进程和 guardian,或 guardian 在报告原生身份前被强杀,仍可能缺少完整
142
+ 清理证明。未知结果保持阻断,不能凭可能已结束的进程推断成功。
143
+ - P4 的真实账号、模型质量、缓存收益和性能对照尚未运行。上游 macOS 离线 CI 通过,
144
+ 不等同于 Flywheel 在用户 Mac 桌面、实际 CLI/账号或 Seatbelt 的 live 验收。
@@ -0,0 +1,136 @@
1
+ # 角色会话续接与回执恢复:实现验收记录
2
+
3
+ 日期:2026-11-07。实现 PR:[flywheel #31](https://github.com/ckanner/flywheel/pull/31)。
4
+
5
+ ## 来源与交付边界
6
+
7
+ 本实现基于已合并的 [#29](https://github.com/ckanner/flywheel/pull/29)(Auto/Quick/Full)
8
+ 和仍开放的设计 [#30](https://github.com/ckanner/flywheel/pull/30)。恢复源码时逐一核验了
9
+ #30 的 344 个 Git blob,基线提交为 `e56e8b62e48b1f938df2b54e94bfbede50ecc1e0`,
10
+ 基线 tree 为 `e30631033405f6465c7650a61e0f4cafea5c2b43`。
11
+
12
+ 按[方案](../plans/2026-11-07-session-lifecycle.md)的分期,本 PR 实现 P1/P2:
13
+ Codex Pro、默认 DSH 路径与 Kimi 的角色续接,以及正常终态回执落盘后的恢复。
14
+ 它没有把“阻止未知结果重放”描述成已经实现 P3 的早期确认与只读恢复 API,也没有将
15
+ 未进行的 P4 真实质量、缓存、性能实验标为完成。Intake/Garden 不属于本轮主任务角色。
16
+
17
+ 所有测试均在本轮恢复后的源码上重新执行。此前已失效工作环境的测试结果不作为本次
18
+ 候选的通过依据。提交按阶段保存到独立实现分支,未修改 main、发行 tag 或 npm latest。
19
+
20
+ ## 实际行为
21
+
22
+ - 新任务模板选择 `"sessions": {"mode": "scoped", "policy-version": 1}`;旧配置省略该项时
23
+ 仍按 fresh 读取,不隐式迁移。Plan 明确的 `resident-session:false` 保留其含义。
24
+ - 会话属于任务、物理工作目录、角色及 packet/里程碑。Quick 最终 Review 与 Full 单元
25
+ Review 分开,Judge 与第二意见分开;普通修复分别续接 Executor 和 Reviewer 自己的历史。
26
+ - Spec、packet、里程碑的目标身份采用明确的字段集合。兼容的验收/版本修订可以续接已
27
+ 消费的历史;目标、正文、边界、需求归属、模型、渠道或权限发生不兼容变化时重建。
28
+ - fresh 和 scoped 都记录支持后端的主任务调用。切换模式、换后端、换角色或重新启动,
29
+ 都不能越过未核对的派发、结果或清理事实。历史存在也不能重置预算、尝试次数和停止意图。
30
+ - Go 在派发前保存 intent;结果先写入有摘要的原子回执,再以 state CAS 应用。每个作用域
31
+ 只保留一个最新回执槽,计量按 invocation ID 与 receipt digest 去重。
32
+ - 收到的回执与是否可以继续推进分开判断:可信调用的消耗应记账;过期候选、无效保护证据
33
+ 或未知执行事实仍阻止继续运行。取消不丢掉已发生的消耗,Go 证明未调用适配器的本地取消
34
+ 则记录零消耗,避免制造未知账单。
35
+ - Plan/Review/Judge 原始前后保护证据一起持久化。重启不能用被修改后的候选重新定义
36
+ “调用前”基线,也不能用新的 L1、集成检查或缺陷抽检替代原回执所见证据。
37
+ - 不更换既有模型或付费渠道。默认 Flash Execute、DSH GPT Review、Kimi 订阅及 Codex Pro
38
+ 路径分别按自己的适配器能力处理;没有增加默认第二意见或 Quick 模型阶段。
39
+
40
+ ## 后端验证与限制
41
+
42
+ | 后端 | 本轮可验证的行为 | 尚不能据此声称的能力 |
43
+ |---|---|---|
44
+ | Codex Pro | 精确公开插件 0.8.0;outer v1 fresh/v2 persistent;显式 threadId;跨进程恢复;独立 request/run/turn;仅本次 run 增量记账 | 任意崩溃点恢复、早期持久化 ack、后端 exactly-once、真实账号授权与费用 |
45
+ | DSH | 实际公开 SDK、AgentLoop 与 JSONL persistence;新进程 `session/resume`;保留原历史且只新增一个 turn;当前调用输出和用量;私有策略回执 | 把自造事件写进原生历史、根据错误文本猜测缺失历史、未知 turn 的安全重放 |
46
+ | Kimi | 配置和 argv、显式会话 ID、当前调用 resume hint 与 cwd 校验、清理和未知用量分离 | 由 CLI 未提供的 run/turn ID 或 usage;把进程退出当成任意远端结果已知 |
47
+
48
+ DSH 策略证明使用与请求、session、nonce 绑定的私有文件,不再写入破坏公开 SDK 重放的
49
+ 自定义历史事件。worker 禁用自主调度/委派及未纳入当前计量的辅助模型调用。测试中的
50
+ 模型适配器与命令响应是离线桩,SDK、会话持久化、worker 和进程边界使用实际代码。
51
+
52
+ `.sessions` 是 Go 的恢复证据,不是第二份状态机;文件最大 32 MiB,读取拒绝符号链接、
53
+ FIFO 和非法身份。该有界槽不代替后端历史的保留策略。本版本不自动删除 Codex/DSH/Kimi
54
+ 的原生历史,也不宣称子进程退出会删除历史。运行配置路径引用的身份不证明同路径内容或
55
+ 账号从未改变;这种没有公开可核验身份的变化仍是明确限制。
56
+
57
+ ## Review 中复现并修复的问题
58
+
59
+ | 问题 | 修复与回归证据 |
60
+ |---|---|
61
+ | 恢复请求在启动前失败,被错判成未知执行 | 对相关联且确认未发送/已清理的失败保留原检查点;空 ID 和精确回显 ID 均覆盖,错误非空 ID 仍拒绝 |
62
+ | 收到回执后 CAS 失败导致再调用或再扣预算 | 故障注入覆盖 Plan、Execute、Review、Judge、panel 及报告收集后窗口;恢复时不重新发模型请求 |
63
+ | 报告已从 worktree 收走,再恢复时误报缺失 | 以原回执报告为准;仅在恢复已确认结果时容许已收集的临时报告不在原位置 |
64
+ | 已完成回执恢复仍依赖当前 secret | 缺失 secret 不改变已声明的凭据名称引用;不修改实际 child env;四个角色的真实步骤恢复回归覆盖 |
65
+ | 原始保护证据被重启后的状态替代 | 原始 before/after guard 和完整候选、契约、验证输入绑定;非法 Plan/Review/Judge 写入不能变成有效通过 |
66
+ | Full 抽检或 Quick final gate 在恢复时重新生成 | 保留原始检查与时间身份;Full 两单元抽检只执行原有四次检查,原 Review 不重复派发 |
67
+ | 里程碑历史忽略其 packet 的目标变化 | Plan/Judge/panel 的 goal identity 纳入里程碑及所属 packet 的明确目标字段;15 个目标变化子用例先红后绿,验收修订对照仍可续接 |
68
+ | DSH 损坏/截断结果流保留不可信用量 | 无效 stream、关联身份和截断清除 usage/cost;完整相关回执的用量与不安全的外层退出分别记录 |
69
+ | DSH 成功回执加异常 exit 仍保持可恢复 | 使用协议结果与物理退出分别校验,异常组合阻断重放 |
70
+ | 取消、CAS 或缺失候选证明使已发生调用漏账 | 在恢复入口独立处理可信回执的可归属计量;保持未知执行阻断和原始 guard 校验;本地未派发取消不虚增未知用量 |
71
+ | 非法回执哈希被写回状态后破坏 schema | 读取时拒绝非规范的非空 candidate/guard 哈希;缺失证明与损坏证明分开,9 个非法形状子用例先红后绿 |
72
+
73
+ 主要回归在 [sessions_test.go](https://github.com/ckanner/flywheel/blob/main/internal/machine/sessions_test.go)、
74
+ [session_workflow_test.go](https://github.com/ckanner/flywheel/blob/main/internal/machine/session_workflow_test.go)、
75
+ [session_fault_test.go](https://github.com/ckanner/flywheel/blob/main/internal/machine/session_fault_test.go)、
76
+ [session_guard_test.go](https://github.com/ckanner/flywheel/blob/main/internal/machine/session_guard_test.go) 与
77
+ [session_audit_test.go](https://github.com/ckanner/flywheel/blob/main/internal/machine/session_audit_test.go)。状态、schema、配置、
78
+ 诊断、CLI、各后端和 Node worker 另有各自的行为与故障测试。
79
+
80
+ ## 最终本地验证
81
+
82
+ 执行环境:Linux amd64,Go **1.27.0**,Node **24.22.1**,npm **12.2.1**。
83
+
84
+ | 检查 | 本轮结果 |
85
+ |---|---|
86
+ | Go 定向行为与故障测试 | 全部通过;独立 guard、协议、账务和 CAS 审查均未发现剩余确认阻断项 |
87
+ | `make quality-gate` | 通过;vet、gofmt、所有被测包与每个被测函数均为 100% statement coverage;cmd 单行入口按现有门禁排除 |
88
+ | CI 相同的七个核心包 `go test -race` | 全部通过:machine、verify、watchdog、drivers、cli、modules、diagnostic;machine 86.850 秒 |
89
+ | DSH `npm run check` | 145 个主套件测试及 8 个隔离旧宿主测试通过 |
90
+ | Go → Node → DSH/Codex Pro | 合并桥接命令通过,含公开 SDK 的真实持久化续接 |
91
+ | 根目录 `npm test` | 126/126 通过 |
92
+ | 六包构建与同一候选真实安装 | 构建 6 个同版本包成功;安装测试 7/7 通过、0 skipped,21.026 秒 |
93
+ | 原生 CLI | `make build`、version、control/doctor help、JSON config inspect 均通过;内嵌默认策略为 scoped/1 |
94
+ | 文档、差异与远端 tree | 20 份改动 Markdown 的 151 个本地链接、32 个锚点及围栏通过;`git diff --check` 通过;远端 tree 与本地已检查暂存 tree 一致 |
95
+
96
+ 最终代码验证与六包构建固定在提交
97
+ `2ca8afc50bb858459d9b66755ccd3e1457914c92`,tree 为
98
+ `faa53b698ff186fa248c8ebb42d7f42118609092`,构建时 `dirty:false`。
99
+ 本文件的后续提交仅补全验收记录,不更改已测运行时代码、测试、技能或发行文件。
100
+
101
+ 六包源码快照 SHA-256:
102
+ `4bd35144a14574fe69b4f79261393c91a762045cf93b0d8f21b39f67dd841fea`。
103
+ `candidate.json` SHA-256:
104
+ `47d3a1a9e4d97971067df78821d5e1466a8b43ea488c04d14ed7d3c2611d0f71`。
105
+ 候选清单记录六个 tarball 的尺寸和 SHA-512 integrity;真实安装使用这些同一份字节。
106
+ 包包含 meta launcher、DSH plugin、Darwin/Linux × arm64/amd64 四个原生二进制。
107
+ 跨平台构建成功不等于四个平台都已运行:实际安装和可执行检查是在 Linux amd64 完成。
108
+
109
+ 版本仍为 0.28.5;这些包用于开发验收,不是新发行,正式发行必须选择新版本并执行发行门禁。
110
+ 完整命令使用固定工具链,包括:
111
+
112
+ ```bash
113
+ make quality-gate
114
+ go test -race ./internal/machine ./internal/verify ./internal/watchdog ./internal/drivers ./internal/cli ./internal/modules ./internal/diagnostic -count=1
115
+ npm --prefix plugins/dsh run check
116
+ FLYWHEEL_TEST_NODE_BRIDGE=1 go test ./internal/drivers -run '^Test(DSH|CodexPro)NodeWorkerOfflineBridge$' -count=1 -v
117
+ npm test
118
+ npm run build:npm
119
+ FLYWHEEL_NPM_PACKAGES_DIR=dist-npm npm run test:install
120
+ ```
121
+
122
+ ## 远端与未验证项
123
+
124
+ 中间检查点 `dbb5a455fedf7aac25790a01ef3e3895e0221fc8` 的
125
+ [GitHub Actions run 42388417156](https://github.com/ckanner/flywheel/actions/runs/42388417156)
126
+ 在约三秒内失败:npm-candidate 没有 runner 名称、steps 为空,后续 test skipped;
127
+ 日志读取为 404 BlobNotFound。不能据此声称代码测试失败的具体原因,也不能声称远端
128
+ Linux/macOS CI 已通过。最终代码提交 `2ca8afc` 的
129
+ [run 42389676602](https://github.com/ckanner/flywheel/actions/runs/42389676602) 也在两秒左右
130
+ 出现同样的无 runner、无步骤失败,后续 test skipped。本地门禁与远端 CI 状态分别记录;
131
+ 没有将已完成的本地 Linux 验证冒充远端或 Mac 通过。
132
+
133
+ 没有运行真实 ChatGPT/Kimi/DeepSeek 账号推理、Mac 桌面/Seatbelt 验收或成对缓存效果
134
+ 实验;不报告虚构的节省比例。没有发布 npm、提升 latest、修改用户已有安装或登录账号。
135
+ P3 仍需要上游新增公开、可等待的 typed lifecycle、派发前持久化确认和只读 recovery
136
+ 契约;现有文本 progress 和 run 回执不能替代它们。P4 需要真实任务与账号测量。
@@ -0,0 +1,99 @@
1
+ # 会话 P3 / P4 实现与验收
2
+
3
+ 日期:2026-11-08 UTC。承接原设计 PR #30、P1/P2 实现 #31 和 Claude 接入 #32。本文只记录本轮已经观察到的结果;旧验收记录保留历史身份,不替代当前检查。
4
+
5
+ **实现结论:**P3 的公开生命周期、持久化确认与只读回执恢复,以及 P4 的角色策略、有界上下文重建和可执行配对评估系统已完成源码与离线验证。真实账号 admission 在当前环境的 `thread/start` 阶段超时,未取得真实模型质量/缓存/性能对照结果;默认质量阈值维持关闭。本文不宣称任意崩溃点 exactly-once、跨机器自动恢复或真实收益。
6
+
7
+ 机器可读证据:[2026-11-08-session-p3-p4.json](evidence/2026-11-08-session-p3-p4.json)。其中 fixture token 数据明确为合成协议输入,live 质量字段保持 null;没有保存账号凭证。
8
+
9
+ ## 1. 配套来源
10
+
11
+ | 依赖 | 源码与 PR | 精确源码 tree | 真实 tarball SHA-256 |
12
+ |---|---|---|---|
13
+ | Codex Pro 0.9.0 | [PR #5](https://github.com/ckanner/dsh-subagent-codex-pro/pull/5),`37da3d75de32b809c4fb1a631ccc15191f3d87f9` | `00df1042b0010dc37ce8ab6048f75a434325962c` | `4a86380fdde0d7f2673c4b1f2d5c8682cf61d6a4b83deb65eab8fe76f6032198` |
14
+ | Claude Code Pro 0.4.0 | [PR #1](https://github.com/ckanner/dsh-subagent-claude-code-pro/pull/1),`ec0b99176b67512f3ca1838ec2a349dcb0189214` | `13c6a3f7e3f332eee98f4e5cde77ba8806c608c1` | `125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581` |
15
+
16
+ 两份远端 tree 与实际测试、打包源码一致。Codex 的实际 npm 包按真实 lock integrity bundle 到 Flywheel;Claude 保持可选 peer。来源与 MIT 许可见 [vendor](https://github.com/ckanner/flywheel/blob/main/plugins/dsh/vendor/README.md)。未发布任何 npm 包、移动 latest 或创建发行 tag;Flywheel 保持原有源码版本,正式发行必须选新的统一版本。
17
+
18
+ 上游本轮 CI 均为准确提交,Ubuntu/macOS × Node 22/24 四格通过,包含真实 pack/install:
19
+
20
+ - [Codex run 42432776034](https://github.com/ckanner/dsh-subagent-codex-pro/actions/runs/42432776034):本地 196 tests,190 passed,6 项既有 live/CLI 环境 skip;新增 P3 测试全部执行。
21
+ - [Claude run 42432722680](https://github.com/ckanner/dsh-subagent-claude-code-pro/actions/runs/42432722680):91/91,本地与四格 CI 通过;strict TypeScript consumer 及安装入口通过。
22
+
23
+ ## 2. P3 的实际边界
24
+
25
+ worker v3 传递 lifecycle v1,原始 machine 请求/回执保持 protocol 1。Go 先保存 intent,并在 ACK 前 fsync 检查点、状态和必要候选证据;上游 supervisor 在发送 terminal/cleanup-confirmed 前先持久化完整原始回执。terminal ACK 丢失不改写已发生结果。
26
+
27
+ Codex 能在 turn/start 前交出实际 thread/configuration,由 Go 完整检查 sandboxPolicy 后确认。Claude init 在 prompt 之后出现,因此显式不具备预派发 thread-ready,也不发明 native turn ID;它仍等待派发前 intent/possible ACK。DSH/Kimi 维持各自既有能力,不冒充这些新接口。
28
+
29
+ 只读恢复只读取原 request/run/journal,不发 prompt、不启动 CLI、不查全局历史。成功回执必须同时具有原 Go cleanup 检查点中的候选/guard/report,才可继续业务;缺少原候选证明时可对账可信用量,但仍阻断。pending 不证明进程存活,supervisor 也丢失时不重放。
30
+
31
+ usage 从 unknown 转为 known 通过同调用 correction,保留原 provider、日期和 lifetime;不重复 call 或 token,不复活已淘汰日桶。metrics 的新行与已有行重试都验证文件/目录同步,CAS 失败不重复追加。
32
+
33
+ 实际故障测试包括:拒绝 intent/possible ACK、坏或抢先 ACK、pending ACK 期间 SIGINT/TERM/HUP、worker 整个进程组 SIGKILL、supervisor 本身 SIGKILL、终态通知丢失、重复只读查询、坏摘要/错身份/路径所有权、状态与 metrics 持久化失败。所有执行/清理未知仍阻断。
34
+
35
+ ## 3. P4 实现与完整离线对照
36
+
37
+ 可按 Plan、Execute、Review、Judge、judge-panel 覆盖 fresh/scoped。三种质量阈值分别基于已确认 turn、Execute 候选不变、完整单次 input;默认均关闭。重建交接当前权威材料,不引入未计量的模型压缩,不继承另一角色私有 transcript,不清空任务预算或 attempts。
38
+
39
+ 固定 corpus 实现纯函数 `compactRanges`,有独立冻结 oracle 验证输出与输入不变性。评估器隔离 clone、固定模型/effort/权限/配置身份,轮换三种策略的次序并重复。场景根据实际状态和用量判断,不凭标签算成功。
40
+
41
+ 最终链路:真实 Go → worker v3 → 实际 final Codex 0.9.0 包 → 明确标记的 native CLI fixture。
42
+
43
+ | 检查 | 结果 |
44
+ |---|---:|
45
+ | 场景 | first-pass、L1 repair、Review return、long context、stop/resume、configuration change |
46
+ | 策略 | fresh、executor-scoped、role-scoped |
47
+ | 重复 | 每场景每策略 2 次 |
48
+ | trial / 完整配对 | 36 / 12 |
49
+ | Go 调用记录 | 96(Execute 54、Review 42) |
50
+ | 独立 oracle | 36/36 通过 |
51
+ | 各场景 observed / unobserved / unknown | 6 / 0 / 0 |
52
+ | 每策略 trial / 调用 | 12 / 32 |
53
+ | 各策略 resume | fresh 0、executor-scoped 4、role-scoped 6 |
54
+
55
+ 该结果验证真实引擎、协议、策略选择、Git 交付与实验工具;fixture token 不可用于模型收益分析。停止恢复场景是 Review 前语义暂停,P3 活跃调用强杀另有故障测试。
56
+
57
+ 评估二进制 SHA-256:`b1361dbe5bb84bf3f5b80e4ffba7c54770a178cd791c9e1c38c88bf37cdb69e8`。Corpus commit `4b86f5e4bf548b4e71af9134d9bced60d07609d0`、tree `e69bf877d80396f902c7a6ee69a584b4aa051cf3`。报告 hash、每 trial 状态、oracle 与缺失用量语义见证据 JSON。复现入口见[配对评估指南](../zh-CN/session-evaluation.md)。
58
+
59
+ ## 4. 真实账号 admission:有执行尝试,无效果结论
60
+
61
+ 使用官方 `codex 0.167.0`、既有 ChatGPT 登录、`gpt-6.1-sol/high`、role-based(Execute 请求 workspace-write),通过最终 Go、worker 与公开 0.9.0 API 运行实际 evaluator。未复制 token、改变 managed 权限、切换认证渠道或用 fixture 代替此次模型路径。
62
+
63
+ 仅运行 1 trial/1 Execute invocation,约 33.349 秒后 Go exit 3、任务 escalated。`thread/start` 没有在原生/Go 时限内返回,取消后 receipt 的 failure 为 thread-start/aborted;dispatch=not-dispatched、cleanup.confirmed=true。没有收到任何 lifecycle frame,所以没有虚构 early checkpoint。外层超时/取消使 outcome 保守保持 unknown,状态 blocked,评估器立即停止,不继续任何其他策略或场景。
64
+
65
+ 原生 usage unknown;Go 只能依据确认未派发归一化为零用量,这不构成模型成本测量。质量、遗漏与回归字段均 null,无法形成有效配对。已有原生登录和 model catalog 不证明成功推理;此环境没有产生可用于质量、缓存或耗时比较的模型结果。
66
+
67
+ 此前单独 admission 还观察到 full-access 被 managed requirements 拒绝,以及允许的 workspace-write thread/start 超时。未绕过环境约束。真实 P4 验收仍需可完成模型执行的原生环境;保持默认阈值关闭,不能声称模型节省比例或某策略优于其他策略。
68
+
69
+ ## 5. 本地门禁与独立审查
70
+
71
+ 环境:Linux amd64,Go 1.27.0、Node 24.22.1、npm 12.2.1。
72
+
73
+ | 门禁 | 当前结果 |
74
+ |---|---|
75
+ | `make quality-gate` | vet/fmt/全部 Go 测试通过,逐函数 100% statement coverage |
76
+ | 7 个核心包 `go test -race` | 全部通过 |
77
+ | Go → Node → 实际公开包/SDK | DSH、Codex、Claude 完整桥接通过,新增 P3 8 场景全部执行 |
78
+ | `npm --prefix plugins/dsh run check` | 194 主测试 + 8 个旧宿主测试,0 failed / 0 skipped |
79
+ | 严格 transport | 20/20,含提前/重复/跨序列 ACK 与信号收尾 |
80
+ | 真实 public lifecycle bridge | 6/6,含整进程组死亡和只读回执恢复 |
81
+ | 根目录 `npm test` | 141/141,0 failed / 0 skipped |
82
+ | P4 完整 native fixture | 36 trial 全通过,不作为 live 模型结果 |
83
+ | skills / 文档 | 内嵌 skill YAML 校验通过;双语链接、围栏、JSON/YAML、diff whitespace 检查通过 |
84
+
85
+ 独立审查关闭了:过期日桶复活;Claude 不支持的 turn-accepted/turn ID;已知生命周期与未知底层 outcome 的保守用量对账;未派发 Claude proposal UUID 被误当历史;bundle 安装测试的互斥 registry 请求断言。均保留原有未知阻断和权限门禁。
86
+
87
+ 根 npm 测试还发现正向 fixture 从进程 spawn 起 250ms 发送 SIGTERM 的冷启动竞态。通过 600ms preload 稳定复现、保留失败证据,再将正向场景改为语义阶段暂停;新增冷启动负面回归继续要求未初始化的信号死亡停止实验。没有放宽生产 timeout 或让 unknown 自动重试。
88
+
89
+ ## 6. 六包候选与 Flywheel 远端 CI
90
+
91
+ 从干净的实现提交 `9796db37a2b86922cf11a87f33191315a7ca32eb` 构建一次六个同版本候选。源码 tree `460bfbfd05418f79a6d1c1d4644733f56e826e5d` 与 GitHub 一致,snapshot SHA-256 为 `b0c5c6293e0e69921a8ff7a081d6077e04772665b4684031dcbd10b3ddf6776b`,`source.dirty=false`。完整包名、大小和 SHA-512 记录在证据 JSON 的 npmCandidate。
92
+
93
+ 同一批 tarball 的真实 npm 安装测试 **9/9 通过、0 skipped**,覆盖缺少 optional Claude 和显式安装精确 0.4.0 peer、worker、CLI、控制接口、skills 与安装保护。Codex bundle 不向 registry 请求未发布的 0.9.0。包内上游的 **79 个文件内容摘要**与冻结 vendor tar 全部一致;唯一 mode 差异是 npm 将声明的 `lib/machine-cli.js` 从 0644 安装为 0755,内容未改变。不是用软链或伪版本替代公开插件。
94
+
95
+ 该安装验收实际运行于 Linux amd64;四个平台二进制均已交叉构建,但交叉构建不替代 macOS 生命周期/桌面真机验收。没有发布这些 0.28.5 开发候选;已存在的 registry 版本不可覆盖。
96
+
97
+ 实现提交的 [Flywheel CI run 42434356573](https://github.com/ckanner/flywheel/actions/runs/42434356573) 在约 3 秒后 failure:npm-candidate 的 runner_id=0、runner_name 为空、steps=[];后续 test skipped、steps=[]。即没有执行构建或测试。当前连接器不支持读取 check-run annotations,不能核实具体启动原因,也不能推断为代码测试失败或宣称远端通过。两个上游的四格通过不替代 Flywheel 自身的 CI。
98
+
99
+ 最后的验收记录提交只更新本 Markdown 与证据 JSON,不改已测运行时代码、测试、skills、schema、workflow、lock 或包清单。保留这一次构建的候选与真实安装结果,不为文档补录生成另一批同版本字节。
@@ -0,0 +1,81 @@
1
+ # 流程控制台实现与验收
2
+
3
+ 日期:2026-11-09。源码基线为 `1087b686fa308284b6b68f238129f6779e0ba113`(0.29.1)。0.30.0 六包已发布并完成 latest 复核;正式源码为 `c24cb0e62042dfe3378bc9c06b0e6951159a7b25`。源码检查、npm 发行、本机安装与原生桌面交互均已完成,证据与边界分别记录如下。
4
+
5
+ ## 已实现范围
6
+
7
+ - DSH 原生会话视图内的横向画布:Plan/拆分、调度、任务分支、Execute、L1、Review、集成、终验、PR、Merge;按需展开、分页、定位和有界诊断。
8
+ - 全局/项目配置编辑:默认模板、内容 CAS、备份、原子写入、Provider/Harness/模型/thinking、角色历史策略、逐绑定权限、预算和调度。
9
+ - 节点级执行、失败后有理由地继续一次、已完成节点重开、独立 packet 提前执行、验证后 Git 交付和单独终验;最近控制操作的结束回执与失败原因持久化。
10
+ - CLI 运行登记、多任务会话关联、项目/分支/HEAD/run 归属、调用绑定快照及按原 invocation 对账的指标。缺失/部分数据保留,不将调用失败率当作代码质量。
11
+ - 受管 packet session 的原 thread 交互、回执核对、验证交回、保持暂停退出。配置 policy-version 1 与会话存储 v2 分离;冻结的 0.29.1 schema 验证旧引擎拒绝新账本。
12
+ - 冻结依赖和写入范围下的独立 worktree 并行 Execute/L1;一个协调器串行 CAS/计费,hard 预算在计费确认前不释放调用槽;Review 与合成候选集成串行。
13
+ - 按明确 repo/HEAD/base 授权的 PR 操作,检查 fetch/push 目标、不强推、不隐式推 tags/submodules,更新已有 Draft PR,精确 HEAD 合并,远端排队与最终回执分开。
14
+
15
+ ## 已完成的源码验证
16
+
17
+ - `make quality-gate`:vet、fmt、全量 Go 测试和逐函数 100% 覆盖通过。记录:`/tmp/flywheel-console-quality-final2.log`。
18
+ - 七个核心包 race 检查通过:machine、state、contract、config、metrics、drivers、watchdog。记录:`/tmp/flywheel-console-race-final.log`。
19
+ - DSH/Codex Pro/Claude Code Pro 三个真实 Go↔Node 离线桥接通过。Claude 使用已核对的 0.4.0 源码 tarball,不宣称 registry 已提供该版本。记录:`/tmp/flywheel-console-bridge-final.log`。
20
+ - 根目录 npm 141 项通过。真实引擎/公开适配器离线配对评估 36 条、96 次调用通过独立 oracle;这是 fixture 结果,不是模型质量、缓存或性能结论。记录:`/tmp/flywheel-console-sessions-final.log`。
21
+ - 客户端检查涵盖已发布宿主插槽、工具回执、fork/迟到响应隔离、配置冲突、节点证据、Session 接管、明确 PR 授权及多个任务关联。最终插件与六包安装门禁应在冻结候选上再次运行,结果与 candidate.json 一起保留。
22
+
23
+ ## 关键故障检查
24
+
25
+ | 场景 | 验证结果 |
26
+ |---|---|
27
+ | 两个独立 Execute 同时在飞 | 实际重叠;第二次 Review 能读到第一次集成成果;没有丢失计费 |
28
+ | hard 预算/渠道并发限制 | 前一调用计费后再接纳下一调用,超额不派发 |
29
+ | 并行停止 | 等待所有已启动执行器退出;未知回执保持阻断 |
30
+ | 同一 thread 被分配给其他 packet | typed lifecycle 在 ACK 前拒绝 |
31
+ | 合成候选失败/冲突 | 不使用旧绿灯;保留 worktree、失败证据及成果 |
32
+ | 清理成功、最终 CAS 尚未持久化 | 仅在规范 checkout 仍匹配原验收候选时补齐交付状态 |
33
+ | 人工调用中断后重启 | 原回执只消费/计费一次;不会重新发送 Prompt |
34
+ | 配置/goal/权限或重建策略变化 | 精确接管请求拒绝换成另一个 session |
35
+ | 旧引擎读取 v2 | 加载即失败,不能忽略接管标记 |
36
+ | PR 预先存在或已合并 | 先核对实际结果;推送后不重复创建 Draft PR |
37
+ | 远端未知/排队 | 不把命令退出成功当成最终合并 |
38
+ | 200 个节点及大量历史 | 画布响应受限,完整节点按需读取,原始账本不变 |
39
+
40
+ ## 视觉与真实运行边界
41
+
42
+ 实际构建的客户端在隔离 HTTP 预览中接入真实 Go 控制接口,使用 mock drivers。检查亮暗主题、390px 容器、中文长路径、表单、展开、横移和节点操作。浏览器组名为“Flywheel 控制台验证”。预览不读取真实用户配置,也没有发送真实模型 Prompt。
43
+
44
+ 旧版实现曾把原任务概况挤在画布之前;本轮已将概况和启动选项折叠。普通表单操作采用 36px 控件,紧凑工具保留 28px,触摸区域至少 44px,节点字重不超过 500,主题使用 DSH 别名。
45
+
46
+ 真实 DSH 桌面版本已核对为 0.2.2-rc.1,源码验收时正式安装是 0.29.1。正式更新需在提交/发行授权及候选门禁后执行。真实账号模型质量/计费、完整 Provider 原生历史 UI 跳转和里程碑 session 的交互接管不由离线结果证明;当前交互通过控制台与受管 CLI 连接精确 packet session。
47
+
48
+ ## 开发候选与发行准备
49
+
50
+ 开发候选快照 `4d18b03eed0f2f5d304851df6cc7d3241594a81106f52a3863801658f133f1f6` 的同一组六包分别通过 macOS Node 24.22.1、Linux ARM64 Node 24.22.1 容器及用户 macOS Node 26.12.1 安装门禁,每次 10 项通过、零跳过。可选 Claude 使用真实 0.4.0 tarball,SHA-256 为 `125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`。开发候选带 dirty 标志,不用于上传。
51
+
52
+ 2026-11-09 用户已批准本轮提交、推送 main、创建并推送 `v0.30.0`、正式发布及桌面安装。正式候选需在提交后从干净精确 tag 重新构建一次,核对同组六包安装后才发布;本记录不预先声称这些后续步骤成功。
53
+
54
+ ## 正式发行与本机安装回执
55
+
56
+ - `main` 与 `v0.30.0` 已推送。annotated tag 对象为 `c013931cf4fe6b690421745f9603fa3ddf016f94`,提交为 `c24cb0e62042dfe3378bc9c06b0e6951159a7b25`,tree 为 `0c33f6a3b4c5bea6be9cd440c6a02380e23053e0`。
57
+ - 正式候选从干净精确 tag 构建一次,快照为 `f943be278fe65d55014c5096acaf214635f6430c665a5e42264e25aaf3ee50dc`。同组六包在 macOS Node 24、Linux ARM64 Node 24 和用户 macOS Node 26 各通过 10 项安装检查、零跳过;发布重试一直复用这些 tarball。
58
+ - Linux 工作流要求的 machine/verify/watchdog/drivers/cli/modules/diagnostic 七包 race 检查通过。首次 root 容器使权限拒绝夹具失效,并缺少 gh 与 init;保留该失败,改用普通用户、gh 和 init 后通过,未修改源码或用例时限。
59
+ - [main CI](https://github.com/ckanner/flywheel/actions/runs/42601424905) 和 [publish](https://github.com/ckanner/flywheel/actions/runs/42601517516) 因账号付款/支出限制未启动 job。使用用户授权的手动发行,不将 Actions 记为通过。
60
+ - 六包按平台 → 插件 → 入口发布到 `candidate-0-30-0`,逐包核对完整性,随后官方 registry 安装通过(真实 npm、native CLI、11 个 skills、零推理请求)。六包 latest 更新与完整性最终复核通过,记录为 `/tmp/flywheel-console-0300-final-registry-fresh.log`;精确来源和远端 tag 又作了核对。
61
+ - 认证期间发生过超时及 npm 服务端拒绝旧 authId;仅重开对应官方认证,不重建包。最终只读 npm 查询也出现过超时,失败记录保留;使用独立查询缓存和更短的单次 fetch 等待后,同一 `verify-latest` 门禁通过,没有放宽完整性或版本判断。
62
+ - 本机 CLI 与 DSH desktop profile 插件均确认 0.30.0,安装报告 `ok:true, ready:true`。源码目录内的首次 npx 调用命中旧全局入口,版本核对发现后改为精确全局安装和明确路径 setup,未将旧报告当作升级成功。
63
+ - 用户要求的全局配置完整覆盖已通过 revision 检查、备份和原子写入完成,归一化值与 0.30.0 内嵌默认值完全一致。当前为 scoped/policy-version 1、full-access、serial/max-parallel 2。配置 SHA-256 为 `aff154c7f9d61afe3192f4f9b54bc32d50c7b84120d19756e350ca3fda8d6835`;旧配置另存备份。
64
+ - 无推理 doctor 通过,四项 DSH SDK 探测通过。可选 Claude 0.4.0 使用上文记录的真实源码包安装到同一全局 prefix,worker doctor 确认接口可用;不宣称它已公开发布或真实模型已验证。
65
+ - 桌面重载前确认当前显示的两个后台任务均已结束。Mac 锁屏导致的暂停已在用户解锁后解除。专用会话使用已发布的原生 AgentLoop/SDK 和本地固定响应适配器,真实模型请求为 0;该离线轮次只用于进入原生会话视图,不伪造真实模型效果。
66
+
67
+ ## 原生桌面交互验收
68
+
69
+ - DSH 0.2.2-rc.1 的“统计”之后显示 Flywheel,实际进入“Flywheel 流程控制台”。会话为 `flywheel-console-desktop-d0634ce3-c14a-422d-a46d-28bf13c3c618`,名称明确标记“离线控制台验证”。空白新会话首页不显示这排会话视图,测试使用已有完整离线轮次的专用会话。
70
+ - 通过原生面板读取隔离任务,横向主线和任务分支正常出现;展开 M01-T01 后可见 Execute、L1、Review 和 Git 交付,节点详情带目录、分支、HEAD、run、失败次数与证据入口。
71
+ - 从桌面填写人工继续原因并点击“人工继续一次”,真实 Go 控制接口接纳后显示运行中并禁用重复操作;结束后恢复暂停,显示预设 mock 场景的 L1/spin 失败原因。尝试与累计失败均由 5 增至 6,最终 revision 为 45,run 为 `YANVY5DOODUCY356S6TXLQFYY3`。随后 CLI 独立只读核对 `running:false`、`status:paused` 和同一失败回执。失败是夹具预期,不表示编码任务已完成。
72
+ - 原生“全局 / 项目配置”读取的目标是全局配置文件,显示 scoped、完全权限、串行与最大并发 2。资源菜单包含 DeepSeek Account · Flash、ChatGPT · DSH、Kimi Code · K3.1 Pro、ChatGPT · Codex Pro、Claude Code Pro;打开后取消,没有改变默认绑定。
73
+ - 验证后全局配置摘要仍为上文记录值。桌面留在已暂停的离线测试画布,真实模型推理、账号计费、实际外部 PR/Merge 和完整 Provider 历史 UI 跳转不由此次检查证明。
74
+
75
+ ## 原始失败与处置
76
+
77
+ - Codex 自带 Git shell 包装器叠加测试负载,触发三个既有 CLI 用例的时限失败。失败日志保留;随后定位工具链差异,使用系统 Git 与固定 Node 24 验证,原用例时限没有放宽。包级总等待窗口为 30 分钟,用于容纳增长后的套件。
78
+ - 全量检查发现空节点详情的空值访问和提前取消的错误分类,已修复并回归。
79
+ - 并行执行重试耗尽后保留原 Plan 升级路径,在集成之前完成失败单元的收尾/修订,避免把局部成功误当作整批完成。
80
+
81
+ 本轮没有通过测试夹具制造真实 PR、Merge、npm 发布或模型业务验收结果。发布候选的 SHA、tarball integrity 与安装记录由发行工具产出;源码门禁不能替代它们。
@@ -0,0 +1,50 @@
1
+ # JEV 可选影子评估验收
2
+
3
+ ## 范围与身份
4
+
5
+ 基线 `5d682291e39c46c4e5e7c275f3d195ffce7e5d6c`,分支 `codex/jev-workflow-shadow`;本轮为未提交源码。尚未发布 npm,也没有改动用户已安装的 0.30.0 或本机全局配置。完整设计见 [方案](../plans/2026-11-10-jev-shadow.md),用户说明见 [指南](../zh-CN/jev-shadow.md)。
6
+
7
+ - 默认关闭、缺省关闭;Config schema、模板、全局/项目编辑器及只读 inspect 共用 `jev-shadow`。
8
+ - 开启只观察首次普通 run 的新任务;先保存原工作流,再最多一个原生 System One 请求。不改变实际模式、任务预算、权限或 Session。硬预算跳过;实验用量单列。
9
+ - 可选依赖的密钥、网络、模型版本、记录故障均不能阻断任务;用户取消仍停止原任务。旧任务恢复与手动单阶段不补发。
10
+ - 独立 prepare/run/report 支持审阅摘要、显式实验、离线核对。schema 严格校验、重复键和错误 UTF-8 拒绝、私有目录、意图先落盘、不可覆盖终态、未知不重放;输入和原始响应不会被当成主引擎命令。
11
+
12
+ ## 本机确定性验证
13
+
14
+ - Go 全量 `make quality-gate` 最终通过:vet、格式检查、全部包测试、每个实测函数 100% 覆盖率;门禁未调整。最终日志 `/tmp/flywheel-jev-quality-complete.log`。
15
+ - `internal/shadow` 单独覆盖率 100%,`go test -race ./internal/shadow -count=1` 通过。
16
+ - 开发二进制的真实 `control config-edit/config-save` 在隔离临时配置中完成默认关闭 → 开启 → 关闭;每步由 `config inspect --json` 核对,未改用户配置。
17
+ - 新任务真实引擎 + loopback HTTP 测试:JEV 给 Full 建议时原 Quick 仍执行至 Review 前暂停;第二次启动无新增 JEV 请求。取消发生于影子 HTTP 时,引擎返回 ErrInterrupted,Execute 未运行。
18
+ - 开关关闭与恢复任务:无凭据读取、无网络、无结果目录。开启测试覆盖缺少密钥、无效目标、401、超时、摘要拒绝、记录路径错误及硬预算跳过;原状态逐字一致。
19
+ - JEV 回执覆盖完整成功、错误版本、坏 JSON、重复键、过大响应、重定向拒绝、未知 usage、并发争抢、残缺 intent、文件写入/fsync/发布故障、缓存身份不匹配及损坏记录;错误响应正文不入回执。
20
+ - 根目录 `npm test`:141 项通过,零跳过。
21
+ - `go test -race ./internal/machine -run 'TestOptionalShadow|TestAutomaticShadow' -count=1` 通过。
22
+ - DSH `npm --prefix plugins/dsh run check`:206 项主测试和 8 项旧宿主检查通过,零跳过。新增实际渲染交互测试确认默认关闭并发送布尔配置值。
23
+ - Go/Node DSH、Codex Pro、Claude Code Pro 三组离线桥接通过。Claude 测的是本地精确公开接口候选(0.4.0,本轮复核 tarball SHA-256 为 `125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`;来源和身份见 [vendor 记录](https://github.com/ckanner/flywheel/blob/main/plugins/dsh/vendor/README.md)),不据此声称 registry 有新版本。未进行本轮原生桌面安装/UI 验收。
24
+
25
+ 首次全量 Go 测试发现既有 `TestRunClaudeCodeProPhysicalFailuresAndNonDispatch` 在关闭 stdin 的 fixture 中返回 watchdog timeout,未返回预期 request write failed。fixture 使用 shell + 额外 sleep 子进程,输出管道和 TERM 清理可拖到 3 秒 deadline。将该用例独立提取并改为 `exec sleep`,保持单进程、原错误与 unknown 断言,新增 `TimedOut=false`;没有修改驱动时限或生产清理逻辑。独立回归连续 30 次通过(8.946 秒)。首次失败保留在 `/tmp/flywheel-jev-quality.log`,不以重跑覆盖原记录。
26
+
27
+ 第二轮所有 Go 行为测试通过,但逐函数覆盖检查发现 `planUntilValid` 的保存失败出口未命中(98.4%):新任务在更早的状态检查处退出,使旧的间接场景不再覆盖该边界。补充直接 CAS 冲突测试:在上下文快照后推进磁盘 revision,确认 Plan 保存失败、零模型派发、磁盘字节不变、内存进度为 failed。该测试已独立通过;没有删除防御分支或降低覆盖率门禁。第二轮日志保留在 `/tmp/flywheel-jev-quality-final.log`。
28
+
29
+ ## MeRouter 真实调用
30
+
31
+ 使用现有 `MEROUTER_API_KEY`,仅调用 `https://merouter.play.one2x.ai/v1/systemone`,模型 alias `jev`,响应固定 `jev-1.14.0`。未用 admin/service key,未改 MeRouter 服务配置。
32
+
33
+ [数据集](../evaluation/jev-historical-provisional.json)是六个已完成工作项的有界回溯摘要,带 Git 提交来源。没有声称它们是历史 Auto 决策:实际基线均 unknown,标签 provisional。标签、基线和来源不发送给模型。[精简结果](../evaluation/jev-historical-result-2026-11-10.json)记录数据/问题/策略摘要及概率;原私有回执在 `/tmp/flywheel-jev-integration-20261110/`。
34
+
35
+ | 项目 | 实测结果 |
36
+ |---|---|
37
+ | HTTP 调用 | 6 次,全部有效响应,未自动重试 |
38
+ | 建议 | 3 Full、3 abstain、0 Quick |
39
+ | Full 工作项 | 角色会话、lifecycle/recovery、交互式流程控制台 |
40
+ | 弃权工作项 | 标签排序、安装指南、桌面指南;检查或具体修改依据不足 |
41
+ | 已知 usage | input 7234、output 900;实际账单扣费未取证 |
42
+ | 本次延迟 | p50 498 ms,p95 1072 ms;六条串行样本,不代表生产 SLO |
43
+ | 无密钥同目录重读 | 6 个缓存结果,new-calls=0 |
44
+ | 生产校准 | false;无已确认真实标签,误放率/Quick 覆盖率保持 null |
45
+
46
+ 初次数据文件把标签字段误写为 reviewer,schema 在网络调用前拒绝;改为 author 后开始六次调用。未把该校验错误算成模型请求。结果并不支持让 JEV 接管 Auto:小任务的摘要还会触发弃权,当前交付保持默认关闭、仅旁路观察。
47
+
48
+ ## 待验证边界
49
+
50
+ 正式发行和桌面安装不在本轮已完成项中。后续只有在用户选择开启后才会积累决策时样本;需要独立人工确认标签、评价漏判/误放/弃权与每完成任务的实际成本,再决定是否提议生产路由。不能从合成样本或本轮六条回溯材料推断成本、性能或质量收益。