@ckanner/flywheel 0.31.1 → 0.32.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 (44) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +4 -2
  3. package/README.zh-CN.md +1 -1
  4. package/docs/README.md +5 -3
  5. package/docs/README.zh-CN.md +2 -2
  6. package/docs/design.md +167 -36
  7. package/docs/en/configuration.md +106 -11
  8. package/docs/en/contributing.md +1 -1
  9. package/docs/en/flow-console.md +88 -24
  10. package/docs/en/getting-started.md +4 -1
  11. package/docs/en/investigation.md +127 -83
  12. package/docs/en/jev-shadow.md +3 -65
  13. package/docs/en/jev.md +240 -0
  14. package/docs/en/model-policy.md +7 -0
  15. package/docs/en/session-recovery.md +39 -0
  16. package/docs/en/workflow.md +20 -1
  17. package/docs/plans/2026-11-12-unified-jev-decisions.md +89 -0
  18. package/docs/plans/2026-11-13-jev-execution-decisions.md +110 -0
  19. package/docs/plans/2026-11-13-p5-ready-queue-prewarm.md +178 -0
  20. package/docs/plans/README.md +3 -0
  21. package/docs/validation/2026-11-12-release-0.31.1.md +58 -0
  22. package/docs/validation/2026-11-12-session-console-ux.md +46 -0
  23. package/docs/validation/2026-11-12-unified-jev-decisions.md +93 -0
  24. package/docs/validation/2026-11-13-dsh-settings-controls.md +104 -0
  25. package/docs/validation/2026-11-13-jev-execution-decisions.md +140 -0
  26. package/docs/validation/2026-11-13-p5-ready-queue-prewarm.md +138 -0
  27. package/docs/validation/2026-11-13-p5-review-closure.md +114 -0
  28. package/docs/validation/2026-11-13-p5-tracked-runtime-fixes.md +108 -0
  29. package/docs/validation/2026-11-13-prewarm-receipts-and-expiry-tests.md +92 -0
  30. package/docs/validation/2026-11-13-release-0.32.0.md +78 -0
  31. package/docs/validation/2026-11-13-workspace-redesign.md +66 -0
  32. package/docs/validation/README.md +11 -0
  33. package/docs/validation/evidence/2026-11-13-p5-npm-candidate.json +54 -0
  34. package/docs/zh-CN/configuration.md +79 -8
  35. package/docs/zh-CN/contributing.md +1 -1
  36. package/docs/zh-CN/flow-console.md +73 -22
  37. package/docs/zh-CN/getting-started.md +3 -1
  38. package/docs/zh-CN/investigation.md +91 -60
  39. package/docs/zh-CN/jev-shadow.md +3 -77
  40. package/docs/zh-CN/jev.md +192 -0
  41. package/docs/zh-CN/model-policy.md +5 -0
  42. package/docs/zh-CN/session-recovery.md +29 -0
  43. package/docs/zh-CN/workflow.md +15 -1
  44. package/package.json +7 -7
@@ -0,0 +1,108 @@
1
+ # P5 继续复核:就绪队列会话与预热错误处理
2
+
3
+ [验证索引](README.md) · [P5 实施方案](../plans/2026-11-13-p5-ready-queue-prewarm.md) · [前次复核](2026-11-13-p5-review-closure.md)
4
+
5
+ ## 源码与范围
6
+
7
+ 本次从 PR #37 的 `89a936d0cc0e74d49f0a1f9edcd6d7d249bf7db4` 继续,
8
+ 最终源码以承载本记录的提交为准。该基线已经包含原先暂缓的 ready queue、
9
+ Execute/L1 槽位流水化和一次性 DSH Review 运行时预热。本轮对照原方案及最新
10
+ 实现,补齐实际会话与子进程路径中的两个问题及其相邻竞争条件。
11
+
12
+ 调度默认仍为 `dispatch=batch`、`prewarm=false`,唯一 JEV 开关仍为
13
+ `jev.enabled`。真实账号、Mac 桌面、质量/耗时/token/费用配对和默认启用
14
+ 决定按用户要求后置。任意外部补丁导入、常驻 worker 池与没有公开初始化接口的
15
+ 其他 harness 预热,不属于当前 P5 承诺范围;原整体方案 §14 允许候选接纳
16
+ 独立排期,P5 实施方案 §5 已评估现有受管 Session 的接管与交回路径。
17
+
18
+ ## 修复与失败复现
19
+
20
+ ### 1. 就绪队列补位不恢复正在运行的兄弟调用
21
+
22
+ 原 `newWorker` 直接复制协调器当前完整状态。首窗中的慢任务仍在运行时,它的
23
+ Session `intent` 已经持久化;随后补入的 worker 复制到该记录,在自己的
24
+ `invokeScoped` 中把它当作遗留调用恢复。由于真实终态尚不存在,新任务在派发前
25
+ 就报缺少回执,并取消整组。已有 mock harness 补位测试未经过这条调用跟踪路径。
26
+
27
+ 本轮使用实际 `invokeScoped`、会话账本、回执保存和真实 Git worktree,配合
28
+ 离线 adapter fixture 复现。fresh 与 scoped 两种方式在原实现均只能派发两项,
29
+ 第三项不能在慢任务结束前补位。fixture 不代表真实模型服务。
30
+
31
+ 修复为每一轮保存完整的派发前会话快照,所有 worker 从该快照开始维护自己的
32
+ 调用。最新 packet 和预算仍取自协调器;协调器持续合并本 packet 会话、检查
33
+ 重复历史并记账。历史遗留未核对调用仍保留在快照和启动恢复中,没有全局跳过
34
+ `reconcileSessionReceipts`。
35
+
36
+ 独立复核进一步发现同一边界的反向风险:真实 unknown 终态已保存,但 worker
37
+ 还未从 Execute 循环返回时,补位不能继续。终态文件保存失败时,记录则仍为
38
+ `intent`,并通过 `Action=wait` 表达阻断。两个回归均在修复前实际观察到 peer
39
+ 多派发一次。现在协调器一旦合并到 `blocked` 或 `wait` 就停止新接纳并取消,
40
+ 已有可信回执继续记账;无法保存的回执保持未确认、未记账。
41
+
42
+ 新增回归覆盖 fresh/scoped 补位、跨 packet 历史冲突、真实 unknown 在切换
43
+ 调度/会话方式后继续阻断、批次前未完成回执保留,以及上述两个提前停止准入场景。
44
+
45
+ ### 2. 预热初始化失败保留原分类
46
+
47
+ 原实现过滤预热控制帧后,只从私有回执恢复未派发与清理事实,丢失
48
+ `warm-result.error`。真实受管子进程回归确认 `INVALID_REQUEST`、`AUTH`、
49
+ `QUOTA`、`SERVER`、`RATE_LIMIT` 均变为 `TRANSPORT`,改变既有重试或后备
50
+ 判断。真实 Go → Node worker 使用不支持的 desktop profile,也复现该错误,
51
+ 且确认初始化失败前没有启动 SDK。
52
+
53
+ 现在只接受既有错误枚举;完整协议流、精确未派发回执、SDK/进程组清理、正常
54
+ 错误退出码及无取消/超时等条件全部满足后,保留原错误码和诊断消息。未知/空
55
+ 错误码、损坏尾帧、矛盾退出码等不取得可信结构化分类,未知清理继续阻断。
56
+
57
+ 另外,初始化可能先失败,再等待 SDK 清理,期间 Go TTL 已触发。原
58
+ `prepareExpired=true` 会使随后到达的 AUTH/SERVER 被当作正常过期,实际发起
59
+ 一次冷调用。新增延迟终态回归在修复前观察到 `cold-model-call`,修复后明确
60
+ 拒绝非 TIMEOUT 的已知初始化失败获得冷回退。真正 TIMEOUT 的精确回执、同一
61
+ RequestID、剩余时限和清理要求保持。
62
+
63
+ ## 最终工程验证
64
+
65
+ 环境:Linux x86_64、Go 1.27.4、Node v24.22.1、npm 11.9.0。Go 使用既有
66
+ 精确版本模块缓存与 `GOPROXY=off`、`GOTOOLCHAIN=local`;依赖声明和锁未变。
67
+
68
+ | 检查 | 本轮结果 |
69
+ | --- | --- |
70
+ | 新增行为在旧实现失败、修复后通过 | 已确认;调度使用原 HEAD 的 Go overlay 复现,预热包含真实子进程及公开 Node worker |
71
+ | `make quality-gate` | 通过:vet、格式、全包测试及每个被测 Go 函数 100% statement coverage;原单行 cmd 入口例外不变 |
72
+ | 调度相关 `-race` | 通过;最终 `parallel.go` 两个变更函数均 100% statement coverage |
73
+ | 全部 `TestDSHPrewarm*` 的 `-race` | 通过;21 个预热函数均 100% statement coverage |
74
+ | 根 `npm test` | 142 通过,0 失败、0 跳过 |
75
+ | `npm --prefix plugins/dsh run check` | 274 主测试与 9 旧宿主兼容测试通过,0 失败、0 跳过 |
76
+ | DSH/Codex Pro/Claude Code Pro Go → Node `-race` bridge | 全部通过,0 跳过,包含本轮新增初始化错误回归 |
77
+ | 最终 native build 与 session evaluation | 通过:36/36 场景、96 次实际离线 adapter 调用;0 未观察场景、0 unknown outcome |
78
+ | 文档链接、锚点、围栏与 diff | 6 个变更 Markdown、165 个相对链接、43 个锚点、36 个围栏通过;`git diff --check` 通过 |
79
+ | 独立代码复核 | 调度会话隔离、未知/回执保存失败准入与预热分类/过期顺序复核无剩余阻塞项 |
80
+
81
+ 定向命令如下;定向包覆盖率只代表过滤后的测试范围,不能替代完整逐函数门禁:
82
+
83
+ ```bash
84
+ go test -race ./internal/machine \
85
+ -run '^(TestReadyQueue|TestParallel|TestFullScheduler|TestDeclaredWriteScope)' \
86
+ -count=1
87
+ go test -race ./internal/drivers -run '^TestDSHPrewarm' -count=1
88
+ FLYWHEEL_TEST_NODE_BRIDGE=1 go test -race ./internal/drivers \
89
+ -run '^Test(DSH|CodexPro|ClaudeCodePro)NodeWorkerOfflineBridge$' -count=1 -v
90
+ make quality-gate
91
+ make build
92
+ FLYWHEEL_EVAL_BINARY="$PWD/flywheel" npm run test:sessions
93
+ ```
94
+
95
+ 插件依赖沿用前次已验证环境。可选 Claude Code Pro 0.4.0 使用前次已审阅源码
96
+ tarball,并非本轮从 registry 获取;详见[前次依赖身份记录](2026-11-13-p5-review-closure.md#本轮工程验证)。
97
+ 没有修改 npm 发行逻辑,也没有重建六包候选;历史候选安装证据仍只覆盖其记录的
98
+ 源码,不作为本次源码的六包发行验收。
99
+
100
+ ## 远端检查与交付
101
+
102
+ 基线提交对应的 [CI run 43418248409](https://github.com/ckanner/flywheel/actions/runs/43418248409)
103
+ 仍为 failure,`npm-candidate` 失败、下游 test skipped。本轮提交的精确远端状态
104
+ 单独记录在 PR;本地门禁通过不等于远端 CI 通过,也不证明实际模型性能或桌面效果。
105
+
106
+ 本轮交付继续更新 PR #37;不将源码提交称为已经合并、打 tag、发布 npm 或更新
107
+ 用户安装。当前约定的工程功能,包括 P5 可选优化,均已有实现;真实效果验收仍
108
+ 属于后续工作。
@@ -0,0 +1,92 @@
1
+ # DSH 预热回执大小与 TTL 测试同步修复
2
+
3
+ ## 范围与原始问题
4
+
5
+ 基线为 `9ff7d704356bb8302a097e94dff924b95e7c2616`。本轮处理
6
+ [Issue #41](https://github.com/ckanner/flywheel/issues/41) 与
7
+ [Issue #42](https://github.com/ckanner/flywheel/issues/42),用户授权修复并提交 PR。
8
+
9
+ Issue #41 是生产读写边界不一致:Node 将完整初始化错误写入私有终态回执,
10
+ Go 只接受不超过 8192 字节的文件。新增回归先在未修改的写入实现上执行:
11
+ 真实 Go → Node worker → 离线 SDK 的 ASCII、多字节、JSON 转义场景分别生成
12
+ 9221、40221、28221 字节回执,均被 Go 拒绝;直接写入测试还复现了恰好超出
13
+ 上限一字节的 8193 字节文件。上述失败说明 SDK 已清理也不足以弥补格式超限。
14
+
15
+ Issue #42 是测试同步问题:原成功用例在启动子进程前设置 75ms 准备期限和
16
+ 25ms 清理宽限,未确认夹具已安装可生成回执的关闭处理。Issue 报告 macOS ARM64、
17
+ Go 1.27.3 下重复 20 次全部失败。本轮 Linux 原用例重复 20 次通过(6.299 秒);
18
+ 该结果不否定 macOS 报告,也不能证明原测试没有启动时序依赖。
19
+
20
+ 随后在独立的原基线 checkout 中,仅给启动测试二进制的 shell 增加 200ms 延迟,
21
+ 保留原 75ms/25ms 设置和成功断言。该受控复现于 0.124 秒内失败,报告
22
+ `Signal:terminated`、`Settled:false`、`TRANSPORT` 和没有可信终态回执,与 Issue
23
+ 描述一致。这个故意失败的复现只用于记录原因,没有进入修复分支,也不冒充 macOS 验证。
24
+
25
+ ## 修复行为
26
+
27
+ - Node 在排他发布前按完整 JSON 的 UTF-8 字节数限定终态文件,包括转义和末尾换行。
28
+ 仅过长的 `error` 诊断保留前缀并加 ` [truncated]`;短错误和恰好符合上限的错误完整保留。
29
+ 算法只扫描可容纳的前缀,按 Unicode 码点计算实际 JSON 字节数,不拆开有效代理对。
30
+ - protocol、warmId、binding、workerPid、dispatched、cleanupConfirmed 保持完整。
31
+ 证明字段本身无法满足大小限制时拒绝发布;私有权限、排他发布和文件/目录同步保留。
32
+ Go 生产代码、8192 字节读取上限、身份和进程组退出核对均未修改。
33
+ - 成功过期测试使用夹具自身发布的接纳标记,确认 prepare 已读入、关闭处理已就绪。
34
+ 该标记不是 `warm-ready`;测试明确断言 SDK 未就绪,再重新设置现有真实定时器。
35
+ 正式调用在过期前开始,验证同一 Request ID 只冷调用一次,并只获得剩余时限。
36
+ - 独立负例在子进程尚未读取 prepare 时触发实际准备期限:进程有界退出,但没有
37
+ 可信清理回执,仍保持未知结果、拒绝恢复和冷调用,不能伪造 no-process 证明。
38
+ - 跨语言回归使用真实 worker 与离线 JSON-RPC SDK;初始化错误仍是未派发失败,
39
+ SDK 方法只有 initialize 和 shutdown。删除、损坏或将清理证明改为 false 后,
40
+ Go 仍拒绝恢复。
41
+
42
+ ## 验证结果
43
+
44
+ 环境:Linux x86_64、Go 1.27.0、Node 24.22.1。全部模型与 SDK 响应使用离线夹具。
45
+
46
+ | 检查 | 结果 |
47
+ | --- | --- |
48
+ | 新增回执大小用例,修复前 | 预期失败,原始日志保留 |
49
+ | Go → Node → SDK 长错误回归,修复前 | 三类场景预期失败,Go 拒绝超限回执 |
50
+ | 直接回执边界用例,修复后 | 6/6 通过 |
51
+ | Node 预热专项完整测试 | 17/17 通过,无跳过 |
52
+ | Go → Node → SDK 长错误回归,修复后 | ASCII、多字节、JSON 转义场景通过 |
53
+ | TTL 同步与未接纳边界重复检查 | 两个用例各 20 次通过,共 40 次,10.916 秒 |
54
+ | 同上,启用 race | 两个用例各 20 次通过,共 40 次,27.789 秒,无 race 报告 |
55
+ | 完整 Go 质量门禁 | `make quality-gate` 通过,所有被测函数 100% 语句覆盖率 |
56
+ | 插件完整检查与旧宿主兼容 | 最终 `npm --prefix plugins/dsh run check` 退出 0;302/302 与 rc.5 10/10 通过,均无跳过 |
57
+ | Go → Node 公开桥接与 race | 最终 DSH、Codex Pro、Claude Code Pro 三后端均通过,57.232 秒,无跳过或 race 报告 |
58
+ | 独立代码复核与文档检查 | 独立复核未发现阻断项;文档相对链接、围栏和 `git diff --check` 通过 |
59
+
60
+ 插件完整检查首轮为 301/302 通过。未修改的 Claude 后端用例
61
+ `stubborn: SIGTERM waits for the owned Claude group to stop` 在 6.254 秒后发现
62
+ `receipt.cleanup.confirmed:false`;此前的退出码 143、取消和失败结果断言均通过。
63
+ 这不是该用例 15 秒测试期限到达,也没有证据将原因归为 CPU 竞争。该路径及其依赖、
64
+ 夹具均未修改,且不导入本轮修改的 DSH 预热模块;原失败日志保留。在不改动代码、
65
+ 超时或断言的情况下,该用例定向复测 1/1 通过(3.647 秒),随后完整复测 302/302
66
+ 通过(213.621 秒),旧宿主 rc.5 兼容测试 10/10 通过(4.236 秒),均无跳过。
67
+ 复测通过不替代首次失败记录;该次清理确认失败的具体原因尚未确定。
68
+
69
+ 三后端 Go → Node 桥接的首轮 race 检查于 70.438 秒退出 1。Codex Pro、Claude
70
+ Code Pro 和本轮新增的三类长错误回归均通过;DSH 的既有公开 SDK 预热用例等待
71
+ ready 超过 3 秒,持久化历史用例触发 3 秒 idle watchdog,
72
+ `account-token-invalid-incomplete-tail` 则出现 `Cancelled:true`、缺失错误消息,
73
+ 原日志未输出该项的具体取消原因。三项保持原代码、超时和断言定向复测全部通过
74
+ (13.334 秒),没有 race 报告。最终三后端完整复测结果见上表;本轮没有修改这些
75
+ 失败路径,首次失败的具体原因仍未确定,不能仅以复测通过归因于环境。
76
+
77
+ ## 验证边界
78
+
79
+ 此环境不能执行 macOS 测试;Issue 中的 macOS 结果是问题报告证据,不是本轮执行结果。
80
+ 后续 macOS 应对两个修复后的 TTL 用例重复运行,并执行完整质量门禁:
81
+
82
+ ```sh
83
+ go test ./internal/drivers \
84
+ -run '^TestDSHPrewarm(LocalTTLAndSafeColdFallbackBoundaries|DeadlineBeforeAdmissionDoesNotAuthorizeColdFallback)$' \
85
+ -count=20 -timeout=2m
86
+ make quality-gate
87
+ ```
88
+
89
+ 修复只约束新发布的回执,不改写已有超限或损坏的历史文件。已有未知清理责任仍按
90
+ 原规则阻断;诊断截断不能把初始化失败当作安全过期,也不能证明模型调用成功。
91
+ 生产准备期限仍为 60 秒,默认预热关闭;没有延长生产时限、删除失败断言或放宽恢复。
92
+ 本轮不涉及真实模型性能、桌面安装、npm 发行或用户配置修改。
@@ -0,0 +1,78 @@
1
+ # 0.32.0 正式发行与本机安装
2
+
3
+ 用户授权合并已审查 PR、关联关闭 Issue、发布新版本并安装到现有 DSH 桌面。
4
+ PR #43 按已审查 head `2a8af72f82cbacc16d61495653c458ed2021ea29` 合并为
5
+ `ae4ba2cd1c7be3895df1d8380d23ab278c262a7f`,GitHub 自动关闭 #41、#42。
6
+ 发行前后均核对没有其他开放 PR;本次没有修改两项修复的实现。
7
+
8
+ ## 发行身份
9
+
10
+ - 源码/标签 `v0.32.0`:`578b778a074948c98301b43ac20a4923714ca0e0`。
11
+ - Git tree:`8dcaff150f7ee2602134daeb4fef474fc56a02b7`。
12
+ - 源码 snapshot SHA256:`29418bd2f909906573d2d706712334af43bcba09ca12cf745e78695b8357a822`。
13
+ - 正式候选清单 SHA256:`61ddf4fb4007390851e8a0a3c591dc256415114e96525523fda3b5703ef77a95`。
14
+ - 构建工具链:macOS arm64,Go 1.27.3、Node 24.22.1、npm 12.2.1。
15
+
16
+ 六包在干净源码中隔离构建、打包一次。先使用 `candidate-0-32-0`,全部精确版本和
17
+ integrity 与原候选一致、官方 registry 安装通过后,再逐包提升 `latest`。
18
+ 最终发行器确认六包均为 0.32.0,源码、远端标签、候选及所有 latest 完整性复核通过。
19
+ 同一组六包和候选清单保存在 [v0.32.0 Release](https://github.com/ckanner/flywheel/releases/tag/v0.32.0)。
20
+
21
+ ## 已执行验证
22
+
23
+ | 检查 | 结果与范围 |
24
+ | --- | --- |
25
+ | macOS 源码审查 | PR #43 精确 head 的完整 Go 门禁通过,逐函数 100%;发行提交仅改变六包版本、锁文件根版本及 CHANGELOG 标题 |
26
+ | macOS 插件及桥接 | 同一已审查实现的插件 302/302、旧宿主 10/10、DSH/Codex Pro/Claude Code Pro 三桥接通过,无跳过 |
27
+ | macOS 超时复现回归 | 接纳后安全过期及接纳前拒绝回退各 20 次通过;race 模式各 20 次通过;原 20/20 失败证据保留在 #42 |
28
+ | Linux arm64 发行源码 | Go 完整门禁通过,逐函数 100%;插件 302/302、旧宿主 10/10、三桥接通过,无跳过 |
29
+ | Linux 核心 race | machine、verify、watchdog、drivers、cli、modules、diagnostic 全部通过 |
30
+ | npm 协议及发行测试 | 两个平台均 142/142 通过 |
31
+ | 真实引擎会话离线场景 | 两个平台均完成 36 个 trial/96 次夹具调用,所有 oracle 通过,无未知或未观察场景 |
32
+ | 同一正式候选真实安装 | macOS arm64、Linux arm64 各 10/10,通过且无跳过 |
33
+ | 官方 registry 安装 | 精确 0.32.0、实际 npm 和原生 CLI、11 个 Skill 通过;桌面注册部分为 CLI 协议桩 |
34
+ | 已安装内容 | 入口包 150 文件、全局 worker 包 106、桌面插件 106、当前平台包 3,全部与正式 tarball 逐文件一致 |
35
+ | 已安装技能 | 11 个 Skill 的 13 个内容文件与发行 tag 一致 |
36
+ | 本机 SDK 探测 | doctor 返回 ok:true;四项 SDK 目录/权限/收尾探测 pass,inferenceTested:false |
37
+
38
+ 可选 Claude Code Pro 使用已审查源码产物 0.4.0,SHA256
39
+ `125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`;
40
+ Codex Pro 使用仓库 vendor 中记录的 0.9.0 原包。未把缺失 optional peer 的跳过记作通过。
41
+
42
+ ## 本机配置与桌面边界
43
+
44
+ 现有 Node 26.12.1 npm prefix 下的 CLI 与 desktop profile 插件均已安装 0.32.0。
45
+ 安装报告 `ok:true`、`ready:true`,DSH 仍为 0.2.2-rc.2。安装器保留旧配置后,再按用户
46
+ 既有明确要求,通过带 revision 的 `control config-save`、`reset:true` 完整覆盖为
47
+ 安装版模板;解析后深比较完全一致。
48
+
49
+ 全局配置 SHA256 为
50
+ `20fae2b10ad725bf5f7c06080201d1b37142f08ec74d835c053f7106d07006e9`。
51
+ 默认 scoped、parallel/最大并发 2、batch、自动 Worktree 开启、预热关闭、JEV 关闭;
52
+ 预算保留模板的 soft/每日 2,000,000 token,可由新版设置选择关闭。本次未自行改动模板默认值。
53
+ 安装前五个实际存在的配置和安装元数据文件已备份、校验,目录为
54
+ `~/.config/flywheel/backups/pre-0.32.0-install-20261113T163236Z/`。
55
+
56
+ **桌面重载和新版原生画布验收尚未完成。** 检查时 DSH 仍显示运行中会话、停止生成按钮
57
+ 和一个后台任务;原生插件详情仍显示进程加载的 0.31.1,与磁盘 0.32.0 区分记录。
58
+ 遵守用户“等现有任务结束后再重载”的要求,没有停止任务或重启 DSH,并恢复原会话页面。
59
+ 后续安全重载及画布验收应追加实际结果,不能将磁盘安装、离线渲染或 SDK 探测冒充桌面已切换。
60
+
61
+ ## 保留的失败与限制
62
+
63
+ - [发布 Actions 43459618683](https://github.com/ckanner/flywheel/actions/runs/43459618683)
64
+ 和 [CI 43459618646](https://github.com/ckanner/flywheel/actions/runs/43459618646) 未通过。
65
+ 发布 preflight 没有执行步骤,annotation 指明账号付款或 spending limit 问题;本机验证不冒充 Actions 通过。
66
+ - Linux 容器原有 npm 缓存的 `CACHEDIR.TAG` 权限导致初次 npm 阶段和候选安装 EACCES。
67
+ Go 门禁已通过;保留原始失败日志,使用容器内独立可写缓存续跑剩余检查并重跑安装,
68
+ 没有改变源码、候选、测试断言或容器非 root 用户。
69
+ - macOS Intel 包被 npm 接收后超过 180 秒尚未公开,发行器按原规则停止。
70
+ npm 官方版本页确认 0.32.0 处于 Validating;没有重复上传该包。
71
+ 使用原候选和同样源码/标签/完整性前置检查继续上传两个无依赖 Linux 平台包;
72
+ 四个平台全部公开并核对后,才恢复标准发行器上传插件和入口包。
73
+ - PR #43 作者记录的首次 Linux Claude 清理、DSH 桥接失败仍保留在
74
+ [原验证记录](2026-11-13-prewarm-receipts-and-expiry-tests.md);本轮通过不删除历史失败。
75
+ - doctor 的账号与既有会话 unknown、沙箱 warn、无任务契约 skipped 保持原含义。
76
+ 未发送真实推理 prompt;不建立真实模型质量、额度、JEV 收益或预热性能结论。
77
+
78
+ 本记录为发行后文档,不移动发行标签,不改写已发布 tarball。
@@ -0,0 +1,66 @@
1
+ # 工作台重设计实现与验收
2
+
3
+ ## 范围
4
+
5
+ 承接 [会话隔离与静默读取修复](2026-11-12-session-console-ux.md),实现用户审阅的新版布局、
6
+ 可选 Token 预算和分阶段 Session 策略。基线为
7
+ `e035b5b5736c2d26da7ada2bf1ca97ee020fd5a2`,开发分支 `codex/session-console-ux`。
8
+ 本轮未提交、推送、合并、发布或修改用户桌面安装。
9
+
10
+ 主界面保留流程与记录,设置独立进入;项目与执行目录在底栏直接展示。配置导航与
11
+ 内容分配独立高度,保存区固定;后台状态读取保留画布,不再插入加载行使页面跳动。
12
+ 节点结果、处理入口、本次配置和真实会话摘要直接显示;详细证据与受管会话各有入口。
13
+ PR 与 Merge 分开显示。画布仍以引擎真实编号表示未提供名称的任务,不使用设计稿中的虚构名称。
14
+
15
+ 普通阶段与失败单元重试由显式点击提交一次 revision-bound 请求。重试理由只记录
16
+ “控制台手动请求”这一事实,不伪造用户对失败的分析;引擎仍限制为一次 Execute/L1。
17
+ 重开已完成任务仍需填写原因并确认,保留状态版本漂移、依赖、L1/Review、预算和未知结果阻断。
18
+
19
+ 模型与会话表直接编辑角色模式,Execute 路由共用角色策略,各 packet 历史独立。
20
+ 显式 Plan 选择处理旧 resident-session 开关;已有冲突需要明确点击同步,不自动改文件。
21
+ 已启用的第二意见拥有独立角色行。节点动作来自实际会话记录,而非 scoped 配置推断。
22
+ 预算 off 隐藏门限但继续计量;soft/hard 仍按任务、UTC 日桶处理,不改变安装默认值。
23
+
24
+ ## 已执行检查
25
+
26
+ | 检查 | 结果 |
27
+ | --- | --- |
28
+ | 插件 `npm run check` | 最终 264/264,通过,无跳过 |
29
+ | 固定 rc.5 宿主检查 | 10/10,通过,含公开 Gateway 静默读取与持久关联 |
30
+ | Go → Node 三后端离线桥接 | 通过,25.725s;未调用真实模型 |
31
+ | 根 `npm test` | 142/142,通过 |
32
+ | 六包隔离构建 | 通过,四平台二进制及插件/入口同版本 |
33
+ | 同候选 macOS ARM64 npm 安装 | 10/10,通过,无跳过 |
34
+ | 实际插件浏览器验证 | 亮/暗主题、390px/680px/桌面宽度;导航保持 54px,按钮 36px;390px 页面宽度无溢出 |
35
+ | 隔离配置保存 | 实际 Go `config-save` 保存 off;Plan fresh 同步 resident-session=false;随后恢复测试配置的 soft 与 Plan 继承设置 |
36
+ | 用户配置 | SHA256 仍为 `12acfcf0799b150d49f9ae10890dbab3aaca776a6be3363fad6614d61c7e77aa` |
37
+ | Go 全量门禁、Linux 安装、CI | 本轮未运行;没有改动 Go 源码;不沿用历史结果作为本轮通过 |
38
+ | 发布与用户 DSH 原生安装验收 | 未执行;浏览器为真实插件构建加合成运行回执,不等于桌面部署验收 |
39
+
40
+ ## 保留的失败及修正
41
+
42
+ 1. 旧 UI 用例依赖折叠、二次确认、固定按钮文案。按新操作路径更新,保留对单飞、未知结果、
43
+ 状态漂移、红色 L1、接管锁和精确保存字段的断言;新增预算关闭、角色覆盖、Plan 冲突与
44
+ 第二意见、未保存草稿、真实 Session 动作及后台刷新布局测试。
45
+ 2. `post-dispatch failures` 的 Node 夹具两次未在 1 秒窗口内写出 start 日志,单独复测也失败;
46
+ 后续定向回归通过不能抹去这个时序问题。改用 shell 内建先记录派发并产生所需故障,
47
+ timeout 分支用 `exec sleep`;保持 1 秒控制期限、实际派发日志和 unknown 阻断断言。
48
+ 修改后单项与最终全量检查通过。原失败日志为 `/tmp/flywheel-v2-sixth.log`、
49
+ `/tmp/flywheel-v2-timing-rerun.log`;修复后单项为 `/tmp/flywheel-v2-timing-fixed.log`。
50
+ 3. 安装检查曾因历史临时 Claude tarball 被移除失败。未改版本、未重打包;从 npm 缓存找回
51
+ 原字节,核对 SHA256 后继续。最终路径为 `/tmp/flywheel-v2-artifacts/claude-reviewed-0.4.0.tgz`,
52
+ SHA256 `125951f39d27a87072a9dc20c622a19089ad7ba84b69ba6228e1fbb03f46f581`。
53
+
54
+ ## 最终候选与边界
55
+
56
+ 候选:`/tmp/flywheel-v2-reviewed-candidate`;源快照 SHA256:
57
+ `b6d12f9bb9bd93b0925a2cc3b9bac8625cc04108dda216ce6d7e55aa9bc2de8d`。
58
+ 沿用源码 0.31.1 版本号的 **dirty 开发候选,不可发布**,不是 registry 已发布的 0.31.1。
59
+ 本验收记录与索引在测试后添加,不在该候选快照中。
60
+
61
+ 最终日志为 `/tmp/flywheel-v2-delivery-plugin.log`、`/tmp/flywheel-v2-delivery-build.log`、
62
+ `/tmp/flywheel-v2-delivery-install.log`、`/tmp/flywheel-v2-bridge.log`、`/tmp/flywheel-v2-npm.log`。
63
+ 截图保存在本次会话的 `flywheel-implementation-v2/` 可视化输出目录。
64
+
65
+ 未伪造原生 Provider 跳转:进入会话复用已有受管历史、Prompt 与 CLI 入口。真实模型质量、
66
+ 账号额度、Provider 完整原生会话界面,以及用户桌面的最终布局仍需后续安装后验收。
@@ -11,6 +11,17 @@ Historical records retain their original language and findings.
11
11
 
12
12
  | Date | Record |
13
13
  | --- | --- |
14
+ | 2026-11-13 | [0.32.0 正式发行与本机安装(桌面重载待完成)](2026-11-13-release-0.32.0.md) |
15
+ | 2026-11-13 | [DSH 预热回执大小与 TTL 测试同步修复](2026-11-13-prewarm-receipts-and-expiry-tests.md) |
16
+ | 2026-11-13 | [DSH 设置开关与最新工作台整合复核](2026-11-13-dsh-settings-controls.md) |
17
+ | 2026-11-13 | [P5 继续复核:就绪队列会话与预热错误处理](2026-11-13-p5-tracked-runtime-fixes.md) |
18
+ | 2026-11-13 | [PR #37 后续复核:P5 恢复边界与 JEV 凭据名称](2026-11-13-p5-review-closure.md) |
19
+ | 2026-11-13 | [P5 就绪队列与 DSH 运行时预热:工程验证](2026-11-13-p5-ready-queue-prewarm.md) |
20
+ | 2026-11-13 | [JEV 执行决策与诊断扩展:工程验证](2026-11-13-jev-execution-decisions.md) |
21
+ | 2026-11-12 | [JEV 总开关与取证决策实现验收](2026-11-12-unified-jev-decisions.md) |
22
+ | 2026-11-13 | [工作台重设计:布局、预算与 Session 策略](2026-11-13-workspace-redesign.md) |
23
+ | 2026-11-12 | [会话工作台、静默读取与交互优化](2026-11-12-session-console-ux.md) |
24
+ | 2026-11-12 | [0.31.1 正式发行与桌面验收](2026-11-12-release-0.31.1.md) |
14
25
  | 2026-11-12 | [反馈驱动工作流、受管调查与 JEV 有限决策实现验收](2026-11-12-feedback-driven-workflows.md) |
15
26
  | 2026-11-12 | [DSH 0.2.2-rc.2 兼容复核(0.31.1)](2026-11-12-dsh-0.2.2-rc.2.md) |
16
27
  | 2026-11-11 | [0.31.0 正式发行与桌面验收](2026-11-11-release-0.31.0.md) |
@@ -0,0 +1,54 @@
1
+ {
2
+ "format_version": 1,
3
+ "version": "0.31.1",
4
+ "source": {
5
+ "commit": "c445393c4f7238677146028b89efe520253f8318",
6
+ "tree": "9939179984458686b4d733d8b68ae7422f3ee9ed",
7
+ "dirty": true,
8
+ "snapshot_sha256": "ff80895639a09f0e6310948d9e6530c51c1bae7a2784ee16eb55ac0ac2522496"
9
+ },
10
+ "packages": [
11
+ {
12
+ "name": "@ckanner/flywheel-darwin-arm64",
13
+ "version": "0.31.1",
14
+ "filename": "ckanner-flywheel-darwin-arm64-0.31.1.tgz",
15
+ "bytes": 4309758,
16
+ "integrity": "sha512-IqTN27gpBhHa6iLaejFni1PABIpu7jDbzt1kRnpKKKbOstImceSxBvVzXNRNtJxOOq2ZQSZ+1/ZZ5K2HKE4iEw=="
17
+ },
18
+ {
19
+ "name": "@ckanner/flywheel-darwin-amd64",
20
+ "version": "0.31.1",
21
+ "filename": "ckanner-flywheel-darwin-amd64-0.31.1.tgz",
22
+ "bytes": 4653825,
23
+ "integrity": "sha512-TzrRLn3HbkZhpyvx9F1aHDXVMZL/+A6RLxOkmPuLmqKzyoms54gEoQf3gGzmn0kgKIHqgw3Ez0TlpCg1Pgez8g=="
24
+ },
25
+ {
26
+ "name": "@ckanner/flywheel-linux-arm64",
27
+ "version": "0.31.1",
28
+ "filename": "ckanner-flywheel-linux-arm64-0.31.1.tgz",
29
+ "bytes": 4166099,
30
+ "integrity": "sha512-3nblFbtZCxSkRlB4/tMxAUcSyi0+6MLyya8JsPsL4z+k0zbT/FFLPT6+Nv1eDgx2jzTzMfY2LE/5loq5Xdv5Gg=="
31
+ },
32
+ {
33
+ "name": "@ckanner/flywheel-linux-amd64",
34
+ "version": "0.31.1",
35
+ "filename": "ckanner-flywheel-linux-amd64-0.31.1.tgz",
36
+ "bytes": 4590120,
37
+ "integrity": "sha512-/hXKuLOxwLtsfvP3FzGFaS85ZzSenrjWWaszH9k3QZc1Oh1Rq855Bvbif5HzUmvg/o0wRyUX+Rf8TM4J7BVWSQ=="
38
+ },
39
+ {
40
+ "name": "@ckanner/dsh-plugin-flywheel",
41
+ "version": "0.31.1",
42
+ "filename": "ckanner-dsh-plugin-flywheel-0.31.1.tgz",
43
+ "bytes": 310216,
44
+ "integrity": "sha512-fbTb1Wtfa48aGTB0dRr1a+2/LG4/jKur9aGlLNgeNXBy6zBvW9XEgF3C2oc/X32kiOrL3xdsfAGCpQSVNAo3Jg=="
45
+ },
46
+ {
47
+ "name": "@ckanner/flywheel",
48
+ "version": "0.31.1",
49
+ "filename": "ckanner-flywheel-0.31.1.tgz",
50
+ "bytes": 546889,
51
+ "integrity": "sha512-yawn/WQUWYpe8xgqRZPRiO6rLX4dO7Bd4VuSGk5wSdsV+kOsNgF3JaAzk4hzHYeNJX6GzcJAsJ+/hhxyKNcMkA=="
52
+ }
53
+ ]
54
+ }
@@ -192,13 +192,17 @@ flywheel config inspect --cwd /repo --json
192
192
  新安装默认配置选择并行调度,最大并发为 2。已有完整配置没有 `scheduler` 时归一为
193
193
  **serial**,显式 serial 也保持不变。安装新版不会替换这些配置。
194
194
  [调度 schema](https://github.com/ckanner/flywheel/blob/main/templates/scheduler-policy.schema.json)将总并发与各渠道并发限制在 1–8。
195
+ 新旧配置的 `dispatch` 均缺省为 `batch`,`prewarm` 缺省为 false;这两个设置不改变
196
+ Quick/Full 流程,也不启用 JEV。
195
197
 
196
198
  ```json
197
199
  {
198
200
  "scheduler": {
199
201
  "mode": "parallel",
200
202
  "max-parallel": 2,
201
- "providers": {"deepseek-account": 1}
203
+ "providers": {"deepseek-account": 1},
204
+ "dispatch": "batch",
205
+ "prewarm": false
202
206
  },
203
207
  "worktree": {"enabled": true}
204
208
  }
@@ -231,6 +235,56 @@ Review、集成与终验保持串行。
231
235
  沙箱根时,会在派发前拒绝不支持的目录分离组合,不扩大权限。登记与批次规则见
232
236
  [控制台指南](flow-console.md#串行与并行)。
233
237
 
238
+ ### 就绪队列与运行时准备
239
+
240
+ `scheduler.dispatch` 接受 `batch` 或 `ready-queue`。batch 等待当前有界批次结束后
241
+ 选择更多任务;ready queue 在一个 Execute/L1 槽位释放后接纳下一项已就绪的独立
242
+ packet。适用条件是 Full、并行调度、最大并发大于 1、自动管理 Worktree。Quick、
243
+ 串行、最大并发为 1 和关闭自动管理的任务保持原路径。共享 checkout 沿用批次规则,
244
+ 包括执行者之后可能登记外部 Worktree 的情况。
245
+
246
+ ready queue 的首个窗口必须全部准备并保存目录后才派发;随后补位先准备该项目录,
247
+ 再占用空闲槽位。准备失败停止新接纳、取消并等待已启动工作;尚未接纳的排队任务
248
+ 不创建目录或模型调用。依赖仅在交付后满足。Review、重规划和集成等待全部已接纳
249
+ worker 收尾,再串行推进;合成候选始终复验。已有总并发/渠道限制、hard 预算、
250
+ 尝试上限和未知结果恢复约束继续生效。
251
+
252
+ 新补入的 packet 不会恢复或取消兄弟任务仍在运行的模型调用;这些调用及其共同
253
+ 计费继续由协调器持有。真实未知结果或终态回执保存失败均立即停止新接纳,恢复前
254
+ 必须核对原调用。
255
+
256
+ `--pause-before review` 同样适用于独立 Worktree 的并行任务。本轮 Execute/L1
257
+ 全部通过、worker 停稳后,任务在第一个 Review 和集成前暂停,保留已验证候选。
258
+ batch 完成已接纳批次;ready queue 可先按原规则补完固定独立候选队列,再到达这个
259
+ 暂停点。恢复同一任务时复用仍有效的执行证据,不重复 Execute;后续集成改变候选
260
+ 时仍需重新验证。
261
+
262
+ `scheduler.prewarm:true` 允许串行 packet 在 Execute 后运行确定性检查的同时,
263
+ 初始化一个 DSH Review runtime。初始化不发送模型 prompt,也不创建或恢复 Session;
264
+ 真正 Review 推理仍等待检查完成与正常准入。并行 Execute/L1 lane 不准备 runtime,
265
+ 必须越过屏障进入串行 Review 后才可开始准备;共享候选批次不预热。因此主要重叠
266
+ 机会是串行 Execute 后的 L1 和适用 Quick 检查,不能把每个并行 lane 的验证时间
267
+ 都算作被隐藏的启动时间。
268
+
269
+ 未使用或身份不匹配的 runtime 必须先完成有界清理,才可继续模型工作。待用实例
270
+ 在尚未尝试正式派发前达到 60 秒存活上限时,只有精确、持久的未派发回执、SDK 和
271
+ 整个进程组的清理均已确认,且未取消、正式调用未超时,才可使用同一已持久化请求
272
+ 身份及剩余时限冷启动一次;这不增加尝试额度或重置预算。未知清理仍阻断。其他
273
+ harness 保持普通启动。会话历史续用与运行时准备相互独立,角色历史仍隔离。
274
+
275
+ 已确认的初始化失败保留原错误分类,并遵守正常重试和渠道后备规则。认证或请求
276
+ 参数错误不会变成传输重试,也不视为允许冷启动回退的正常预热过期。
277
+
278
+ 在“设置 → 运行方式”中,dispatch 使用整批/就绪队列选择框,prewarm 使用独立
279
+ 开关。表单说明就绪队列尚未满足的配置条件,保留所选值;任务适用性仍由引擎核对。
280
+ 高级 JSON 也可设置这两个选项。保存后在下次启动生效,当前进程保持
281
+ 已载入策略;恢复时仍须核对已有调用和共享批次,再派发新工作。待收尾预热仍需原始
282
+ 未派发 prompt 的清理回执、文件和目录同步,以及 worker 与原进程组退出证明,
283
+ 关闭 `prewarm` 不能绕过,详见
284
+ [预热恢复](session-recovery.md#dsh-预热运行时的重启核对)。两项优化保持可选,
285
+ 真实延迟、资源消耗与默认采用策略另行验收。离线检查证明行为和恢复正确,不承诺
286
+ 速度或 token 节省,详见 [P5 实施计划](../plans/2026-11-13-p5-ready-queue-prewarm.md)。
287
+
234
288
  ## 会话策略、历史复用与调用安全
235
289
 
236
290
  ```json
@@ -410,6 +464,10 @@ token 预算继续生效;切换不清零失败、不增加尝试、不削减
410
464
  `state.packets[*].execution-policy.history` 分别保存 `quality-upgrade` 和
411
465
  `channel-fallback` 的完整前后绑定、尝试与原因。并行 packet 各自持有记录。
412
466
 
467
+ 开启 `jev.enabled` 后,确认结束的失败也可由 JEV 选择合法绑定,切换记录为
468
+ `jev-model-selection`,共用原 `max-switches` 与冷启动规则,不改变渠道错误处理。
469
+ 允许绑定仍是明确的资源/权限声明,JEV 开关不会把新 provider、账号或模型加入集合。
470
+
413
471
  `config inspect --json` 在 `execution-policy` 下展示完整声明,普通绑定表仍是
414
472
  配置基线,当前选择由 packet/session 状态记录。Doctor 既有绑定探测不证明每个
415
473
  允许的实验绑定均已通过接纳;实际派发仍须通过适配器配置与权限检查。
@@ -609,13 +667,26 @@ lifecycle/recovery 导出、Node >=22.18.0 与 Codex 命令版本;同一 wor
609
667
 
610
668
  桌面面板、`/flywheel` 和 `flywheel_control` 共用 `control config|doctor`,可省略 taskDir;只有 doctor 支持 `probe:true`。诊断阻断与传输失败分开显示。桌面使用的 PATH/profile/环境可能与终端不同,安装后应在面板里再检查一次。
611
669
 
612
- ## 可选 JEV 影子评估
613
-
614
- `jev-shadow.enabled` 默认 false,省略时也关闭。全局/项目编辑器提供开关。任务
615
- 运行期间只捕获本地快照,不在任务关键路径发送 HTTP 请求;后续显式
616
- `flywheel shadow run` 才执行可选联网评估并单独记账。影子结果不能改变 Quick/Full
617
- 或授权新动作。新的决策采用需独立显式 opt-in 与数据边界,既有影子开关不授予
618
- 该权限。endpoint、版本、凭证、预算与恢复见[JEV 指南](jev-shadow.md)。
670
+ ## JEV 决策
671
+
672
+ `jev.enabled` 是唯一 JEV 启用设置,默认 false。桌面编辑器只提供一个总开关;
673
+ 开启后,调查准备自动冻结采用策略,包含动作选择、依据证据跳过冗余取证和提前
674
+ 进入报告;确认结束的实施失败还可选择有界返修、已批准反馈检查、重规划或允许
675
+ 执行绑定。Task/New/Run 共用引擎拥有的同一策略。关闭后停止后续请求及采用,
676
+ 保留已有回执与预算。
677
+
678
+ 正常任务没有独立影子/建议开关。旧 `jev-shadow` 只用于把连接信息迁移到关闭的
679
+ 统一配置,编辑器保存时移除旧 key;明确的新 `jev` 优先。配置仍按任务/项目/
680
+ 全局/内嵌表选择一份完整文件,不深合并。目标地址、固定模型、密钥变量、限制、
681
+ 数据类别和恢复规则见 [JEV 指南](jev.md)。
682
+
683
+ Packet 可选声明最多八项 `feedback-checks`,使用与验收命令相同的 `cmd`/`script`
684
+ 和 `expect` 结构。这些是已批准的短诊断候选,不替代 `acceptance.L1/L2/L3`。
685
+ 为每项填写简短 `purpose`(最多 160 字符),说明它能区分什么原因;JEV 接收这段
686
+ 已批准的用途说明,不接收原命令。缺少 `purpose` 的检查仍供执行者参考,但不进入
687
+ JEV 的定向检查候选。用途不得包含凭据、原始日志或命令正文。JEV 也可选择已有
688
+ 失败且可核对的 L1 检查。
689
+ 执行沿用验证超时、环境白名单和进程收尾规则。检查变化属于契约身份变化,旧决策失效。
619
690
 
620
691
  ## 参考文件
621
692
 
@@ -162,7 +162,7 @@ CI 在 Ubuntu 和 macOS 使用同一候选,Linux 另跑 race。按实际执行
162
162
  | 调度、worktree、执行位置或交付 | `workflow.md`、`configuration.md`、`flow-console.md`、设计章节及相关 skills |
163
163
  | 会话续用、恢复、接管或计量 | `session-recovery.md`、配置/工作流/控制台相关章节、设计及受影响的 worker 契约 |
164
164
  | 桌面 UI、任务发现或操作控制 | `flow-console.md`、插件 README,以及提到该界面的快速开始步骤 |
165
- | 评估工具、场景或结果解释 | `session-evaluation.md` 或 `jev-shadow.md`、对应输入输出契约;实际执行新检查后补带日期证据 |
165
+ | 评估工具、场景或结果解释 | `session-evaluation.md` 或 `jev.md`、对应输入输出契约;实际执行新检查后补带日期证据 |
166
166
  | 包布局、许可证或发行行为 | `releasing.md`、相关安装步骤、manifest/lockfile、包内链接及适用的许可/来源记录 |
167
167
  | 文档移动、重命名或标题变化 | 两份文档索引、语言链接、所有入链路径/锚点、包清单、内嵌引用、脚本与测试 |
168
168
  | 贡献者或 AI 操作规范 | [AGENTS.md](https://github.com/ckanner/flywheel/blob/main/AGENTS.md)、两份贡献指南及导航,保持要求一致 |