@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
@@ -1,63 +1,155 @@
1
- # Reasoning effort and account selection
2
-
3
- [中文](../model-policy.md) · English
4
-
5
- Checked on 2026-11-05. This note separates documented capabilities, adapter behavior, engineering recommendations, and measurements. Official model documentation and request paths have been reviewed. **No representative Flywheel comparison of high, xhigh, and max has been run**, and no live user-account inference or quota check was performed. The defaults are editable starting points, not a measured optimum.
6
-
7
- ## Why most bindings use high
8
-
9
- Seven of the eight stage/route bindings use `high`; Intake uses `low`. High matches the documented defaults for Kimi K3.1 Pro and DeepSeek Flash. GPT-6.1 Sol's API default is medium, so Flywheel explicitly requests a higher level. Astra's model page lists five levels without stating a universal API default. Sources: [Kimi models](https://www.kimi.com/code/docs/en/kimi-code/models), [DeepSeek thinking](https://api-docs.deepseek.com/guides/thinking_mode/), [Sol](https://developers.openai.com/api/docs/models/gpt-6.1-sol), and [Astra](https://developers.openai.com/api/docs/models/gpt-6-astra).
10
-
11
- High provides an initial comparison baseline without starting every loop at maximum effort. More reasoning can help difficult tasks while adding latency and usage; it does not guarantee a better delivery on every task. OpenAI's [deployment checklist](https://developers.openai.com/api/docs/guides/deployment-checklist) recommends representative evaluation before adopting xhigh/max for their additional cost and latency. That supports the evaluation method, not a claim that this project's defaults have already been benchmarked.
12
-
13
- ## Effort values differ by backend
14
-
15
- | Current path | Checked capability | Flywheel request |
16
- |---|---|---|
17
- | GPT-6.1 Sol / Codex Pro 0.9.0 | Model supports `low/medium/high/xhigh/max`; machine API forwards effort | hard: high |
18
- | Sol and Astra / DSH ChatGPT provider | Models and checked provider catalog support `low/medium/high/xhigh/max`; serialized as `reasoning.effort` | Review and Judge: high |
19
- | Kimi K3.1 Pro / Kimi CLI | Native `low/high/max`, default high; thinking cannot be disabled | Plan, frontend, Garden: high |
20
- | DeepSeek Flash / DSH rc.5 | DSH accepts `off/low/high/max`, default high | ordinary execution: high; Intake: low |
21
-
22
- GPT supports xhigh and max; their absence from the defaults is a policy choice, not an interface limitation. These names are not a shared scale across providers. Kimi compatibility aliases xhigh/max/ultra resolve to native max. DeepSeek's generic API maps xhigh to high, while the DSH adapter used here rejects xhigh before that mapping because it accepts only the four listed values. Use max when explicitly selecting Flash's higher supported level. See the native model documentation above and DSH's [configuration](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek/src/config.ts) and [serialization](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek/src/serialize.ts).
23
-
24
- The ChatGPT provider snapshot is `388868f91bcdc05795fb94d21b868ded6d7219c9` (0.1.17): [dated model measurements](https://github.com/ckanner/dsh-plugin-chatgpt/blob/388868f91bcdc05795fb94d21b868ded6d7219c9/src/models/served.ts) and [request serialization](https://github.com/ckanner/dsh-plugin-chatgpt/blob/388868f91bcdc05795fb94d21b868ded6d7219c9/src/convert/request.ts). A catalog is not a live entitlement check for the user's account. The Codex Pro plugin name does not establish a separate server reasoning mode.
25
-
26
- ## Stages worth comparing first
27
-
28
- These are **engineering recommendations inferred from stage responsibilities**, not measured performance results. This correction preserves effort choices; it adds no automatic escalation, effort-changing retry, or budget policy.
29
-
30
- | Stage | Baseline | Candidate comparison |
1
+ # Models, reasoning effort, and accounts
2
+
3
+ [Documentation](../README.md) · English · [简体中文](../zh-CN/model-policy.md)
4
+
5
+ Flywheel selects a model through a stage or execution-route binding. The
6
+ [default template](https://github.com/ckanner/flywheel/blob/main/templates/flywheel.config.example.json) is the source
7
+ of truth for new configurations; an existing installation keeps its own
8
+ configuration. These defaults are an editable baseline. The repository does not
9
+ establish that they are the optimum for representative tasks, or that increasing
10
+ reasoning effort improves every delivery.
11
+
12
+ ## Default bindings
13
+
14
+ | Stage or route | Harness | Model | Access path | Effort |
15
+ |---|---|---|---|---|
16
+ | Plan | `kimi` | `kimi-code/k3.1-pro` | Kimi Code subscription through the native CLI | `high` |
17
+ | Execute: default | `dsh` | `deepseek-flash` | DSH `deepseek-account` | `high` |
18
+ | Execute: frontend | `kimi` | `kimi-code/k3.1-pro` | Kimi Code subscription through the native CLI | `high` |
19
+ | Execute: hard | `codex-pro` | `gpt-6.1-sol` | Codex login through the public machine API | `high` |
20
+ | Review | `dsh` | `gpt-6.1-sol` | DSH `chatgpt` provider | `high` |
21
+ | Judge | `dsh` | `gpt-6-astra` | DSH `chatgpt` provider | `high` |
22
+ | Intake | `dsh` | `deepseek-flash` | DSH `deepseek-account` | `low` |
23
+ | Garden | `kimi` | `kimi-code/k3.1-pro` | Kimi Code subscription through the native CLI | `high` |
24
+
25
+ The harness owns the agent/tool loop. A DSH `provider` selects its native LLM
26
+ adapter, while a `channel` names the configured account/credential path. A
27
+ `codex-pro` harness is not a DSH provider called `subagent_codex_pro`. Kimi uses
28
+ its native CLI, not ACP. Auto, Quick, and Full do not change these bindings or
29
+ increase effort automatically; see [Configuration](configuration.md).
30
+
31
+ Claude Code Pro is available as an [optional backend](claude-code-pro.md), with
32
+ no default stage or route assigned. Its profile uses an explicit native model
33
+ and effort rather than an implicit replacement for another subscription.
34
+
35
+ ## Account selection
36
+
37
+ The default and `subscriptions` preset use `deepseek-account` with
38
+ `deepseek-flash`. Standard DSH desktop and SDK profiles under the same DSH home
39
+ can share account authorization without an additional API key. Custom profiles
40
+ must load the account service and adapter. Independent SDK calls still supply
41
+ an explicit provider/model; changing the desktop chat model does not update
42
+ Flywheel's bindings.
43
+
44
+ `deepseek-official` is a separate API-key provider, selected only by explicit
45
+ configuration. The default preset does not switch payment channels after an
46
+ authentication or quota failure. User-configured fallback chains retain their
47
+ own policy. ChatGPT and Kimi subscriptions likewise require the corresponding
48
+ installed adapter or CLI and its supported login flow.
49
+
50
+ Upgrades preserve existing user files. To adopt the subscription preset, inspect
51
+ the effective complete configuration, preview the migration, then explicitly
52
+ apply it as described in [Configuration](configuration.md). Restart the engine
53
+ afterward; neither installing packages nor changing a desktop chat model
54
+ migrates a running task.
55
+
56
+ ## Reasoning effort is backend-specific
57
+
58
+ The following capabilities were checked for the documented integrations on
59
+ **2026-11-05**. They are compatibility evidence for those snapshots, not a live
60
+ catalog or an account-entitlement check.
61
+
62
+ | Checked integration | Accepted request values | Notes |
31
63
  |---|---|---|
32
- | Intake | Flash low | high for ambiguous input or difficult merging/classification |
33
- | Plan | Kimi high | max for architecture, dependency, or acceptance-design problems |
34
- | Execute default | Flash high | max for difficult implementation or root-cause analysis; not xhigh |
35
- | Execute frontend | Kimi high | max for complex interaction state or cross-component consistency |
36
- | Execute hard | Sol high | prioritize xhigh comparisons; max for the hardest tasks |
37
- | Review | Sol high | xhigh for high-impact concurrency, consistency, or permission reviews |
38
- | Judge | Astra high | prioritize xhigh for high-impact milestone acceptance; max for the hardest cases |
39
- | Garden | Kimi high | low for routine organization; max for difficult cross-task synthesis |
40
-
41
- Hard execution tackles difficult implementation. Judge independently examines a whole milestone after L2/L3, making these two stages useful first comparisons. Changing every stage together makes the cause of any improvement harder to identify. OpenAI's [reasoning guide](https://developers.openai.com/api/docs/guides/reasoning) describes effort by task difficulty; applying that guidance to Flywheel's stages remains an inference.
42
-
43
- Change `thinking` in the effective complete configuration, inspect it, and restart the engine. Use `routes.hard.thinking` for hard only and `loops.judge.thinking` for Judge only. Stage overrides avoid changing every consumer of a shared profile. A task file with only those two fields is not a complete configuration and does not inherit the rest of the project file.
44
-
45
- For an actual comparison, hold the model, backend, context, task, and acceptance conditions fixed. Measure delivery success, first-pass acceptance, missed defects and false alarms, total time including rework, and input/output/reasoning/cache usage. Record observable subscription quota separately; unknown values remain unknown. API prices do not directly determine subscription task capacity.
46
-
47
- ## Request evidence is not quality evidence
48
-
49
- Source and offline protocol tests establish field transmission and error behavior. SDK configuration acceptance or a successful machine-API request establishes acceptance at that interface. Independent effective-effort evidence and improved delivery quality require server evidence or actual task measurements.
50
-
51
- DSH `initialize` validates configuration but returns only serverInfo. Flywheel's `ready.reasoningEffort` echoes the request after initialization; it is not independent model-server attestation. Codex Pro separates `requestedEffort`, `accepted`, and unknown `effectiveEffort:null`. See the [DSH SDK server](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/sdk/server/src/server.ts) and [Codex Pro 0.9.0 protocol](https://github.com/ckanner/dsh-subagent-codex-pro/blob/37da3d75de32b809c4fb1a631ccc15191f3d87f9/docs/machine.md). A no-inference doctor cannot establish account balance, real inference, or higher-effort benefits.
52
-
53
- ## The funded DeepSeek account is the intended default
54
-
55
- Current source selects `deepseek-account` for Flash in defaults and the subscription preset. Standard desktop and SDK profiles can reuse account authorization under the same DSH home; an additional API key is unnecessary. `deepseek-official` remains a separate, explicitly chosen API-key provider, not an automatic fallback.
56
-
57
- Desktop login can initialize an account-model default, but independent SDK calls still need explicit provider/model values. Flywheel requests `deepseek-account` and `deepseek-flash`, preserving both the selected access method and the Flash-only choice. Authentication or quota failures are reported. The default preset has no cross-channel fallback; explicit user-defined fallback chains retain their existing policy.
58
-
59
- **Release and migration are separate:** 0.28.3 changes the embedded default to account access; 0.28.2 still embeds the API default. Upgrades preserve user configuration, so adoption requires 0.28.3 or later followed by explicit migration. See [Configuration](configuration.md#deepseek-account-and-api-key-providers) for credential-sharing conditions and the preview/apply workflow. No user credentials or running tasks were modified by this source change.
60
-
61
- ## Optional Claude Code Pro
62
-
63
- Claude remains unassigned in the default model policy. The optional `claude-code-pro` harness accepts an explicit native model and low/medium/high/xhigh/max request; an installed CLI or account can reject a choice. No new model ranking or effort benchmark is implied. See [the adapter guide](claude-code-pro.md) for the companion 0.4.0 public API, full-access boundary, and usage semantics.
64
+ | GPT-6.1 Sol / Codex Pro 0.9.0 | `low`, `medium`, `high`, `xhigh`, `max` | The machine API forwards the selected effort |
65
+ | Sol and Astra / DSH ChatGPT provider | `low`, `medium`, `high`, `xhigh`, `max` | The provider serializes `reasoning.effort` |
66
+ | Kimi K3.1 Pro / native CLI | `low`, `high`, `max` | Thinking cannot be disabled; compatibility aliases `xhigh`, `max`, and `ultra` resolve to native `max` |
67
+ | DeepSeek Flash / checked DSH adapter | `off`, `low`, `high`, `max` | This adapter rejects `medium` and `xhigh` |
68
+
69
+ Names do not form a common scale across providers. In particular, a generic
70
+ API's compatibility mapping does not override the DSH adapter's own input
71
+ validation. Use `max`, not `xhigh`, when evaluating Flash's higher supported
72
+ level on this path. The adapter must reject an unsupported selection rather
73
+ than silently choose another model or effort.
74
+
75
+ Compatibility references: [Kimi model documentation](https://www.kimi.com/code/docs/en/kimi-code/models),
76
+ [DeepSeek thinking](https://api-docs.deepseek.com/guides/thinking_mode/),
77
+ [Sol model reference](https://developers.openai.com/api/docs/models/gpt-6.1-sol),
78
+ [Astra model reference](https://developers.openai.com/api/docs/models/gpt-6-astra),
79
+ [DSH DeepSeek configuration](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek/src/config.ts),
80
+ and [serialization](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/llm/llm-deepseek/src/serialize.ts).
81
+ The checked ChatGPT provider is 0.1.17 at `388868f91bcdc05795fb94d21b868ded6d7219c9`:
82
+ [model catalog](https://github.com/ckanner/dsh-plugin-chatgpt/blob/388868f91bcdc05795fb94d21b868ded6d7219c9/src/models/served.ts)
83
+ and [request serialization](https://github.com/ckanner/dsh-plugin-chatgpt/blob/388868f91bcdc05795fb94d21b868ded6d7219c9/src/convert/request.ts).
84
+
85
+ ## Choose and evaluate a baseline
86
+
87
+ Seven of the eight default bindings use `high`; Intake uses `low`. Keeping a
88
+ stable starting point makes comparisons attributable to a particular stage.
89
+ The following candidates are engineering judgments based on stage
90
+ responsibilities, not measured Flywheel quality results.
91
+
92
+ | Stage | Candidate comparison |
93
+ |---|---|
94
+ | Intake | Compare `high` for ambiguous input, merging, or classification |
95
+ | Plan | Compare `max` for difficult architecture, dependencies, or acceptance design |
96
+ | Execute: default | Compare Flash `max` for difficult implementation or root-cause analysis |
97
+ | Execute: frontend | Compare Kimi `max` for complex interaction state or cross-component consistency |
98
+ | Execute: hard | Compare Sol `xhigh` first; evaluate `max` on the hardest tasks |
99
+ | Review | Compare `xhigh` for concurrency, consistency, or permission reviews |
100
+ | Judge | Compare Astra `xhigh` for high-impact milestone acceptance, then `max` where justified |
101
+ | Garden | Compare `low` for routine organization and `max` for difficult cross-task synthesis |
102
+
103
+ Change `thinking` in the effective complete configuration. For example, change
104
+ `routes.hard.thinking` to affect only hard execution, or
105
+ `loops.judge.thinking` to affect only Judge. A stage override avoids changing all
106
+ consumers of a shared profile. Do not create an incomplete task configuration
107
+ containing only these fields: configuration discovery selects one file rather
108
+ than merging files.
109
+
110
+ Hold the model, harness, context, task, permissions, and acceptance conditions
111
+ fixed. Measure delivery success, first-pass acceptance, missed defects and false
112
+ alarms, total time including rework, and input/output/reasoning/cache usage.
113
+ Record observable subscription quota separately and preserve unknown values.
114
+ API prices do not directly determine subscription task capacity. The
115
+ [session evaluation guide](session-evaluation.md) describes the repository's
116
+ paired experiment tooling; effort comparisons need their own fixed conditions.
117
+
118
+ ## Bounded model and effort experiments
119
+
120
+ The optional [execution policy](configuration.md#bounded-execution-policy-opt-in)
121
+ declares complete allowed bindings per route, including account, effort,
122
+ permission and history mode. Auto/Quick/Full do not enable it. A confirmed
123
+ repeated L1 stall may advance the declared experiment order within existing
124
+ attempt/token budgets and an explicit switch limit. This deterministic rule
125
+ does not prove the next model is better. Channel errors use separately declared
126
+ fallbacks; neither mechanism may select an undeclared model or payment channel.
127
+
128
+ When the single [JEV switch](jev.md) is enabled, a confirmed failure can also
129
+ offer the already allowed bindings as decision candidates. The engine checks
130
+ the frozen allowlist, permission, remaining attempts and switch budget before
131
+ adoption. No extra JEV model-routing switch is required. Without an allowed
132
+ alternative, the configured binding stays in use. A semantic choice is recorded
133
+ as a choice, not as measured proof that the selected model is faster or better.
134
+
135
+ Effort changes cold-start the role and record complete before/after bindings.
136
+ Comparisons must include rereading, startup and actual known/unknown usage and
137
+ cost. Offline tests run real engine repair and recovery paths with controlled
138
+ driver results; they do not establish live model quality or speed. Use matched
139
+ real tasks with frozen oracles before changing defaults or claiming savings.
140
+
141
+ ## Interpret configuration and quality evidence
142
+
143
+ Source and offline protocol tests establish field transmission and error
144
+ behavior. SDK or machine-API acceptance establishes acceptance at that interface.
145
+ Independent effective-effort evidence and better delivery quality require
146
+ backend evidence or actual task measurements.
147
+
148
+ DSH `initialize` validates configuration but returns only server information.
149
+ Flywheel's `ready.reasoningEffort` echoes the request after initialization;
150
+ it is not independent model-server attestation. Codex Pro separates
151
+ `requestedEffort`, `accepted`, and an unknown `effectiveEffort:null`.
152
+ See the [DSH SDK server](https://github.com/deepseek-ai/deepseek-harness/blob/b830ec950faba0a46dda564be3e2d854afed94f1/packages/sdk/server/src/server.ts)
153
+ and [Codex Pro machine protocol](https://github.com/ckanner/dsh-subagent-codex-pro/blob/37da3d75de32b809c4fb1a631ccc15191f3d87f9/docs/machine.md).
154
+ A no-inference doctor cannot prove account balance, live inference, or the
155
+ benefit of a higher effort setting.
@@ -0,0 +1,207 @@
1
+ # Releasing Flywheel
2
+
3
+ [Documentation](../README.md) · English · [简体中文](../zh-CN/releasing.md)
4
+
5
+ This runbook is for maintainers. Users should follow
6
+ [getting started](getting-started.md). A source commit, GitHub Release, or
7
+ successful `npm pack` does not establish that a version is available from npm.
8
+ Actual releases and verification limits belong in the
9
+ [validation records](../validation/README.md).
10
+
11
+ ## 1. Release identity and prerequisites
12
+
13
+ One release contains six packages at the same exact version, published in
14
+ the following order:
15
+
16
+ | Order | Package | Contents |
17
+ | --- | --- | --- |
18
+ | 1–4 | `@ckanner/flywheel-{darwin,linux}-{arm64,amd64}` | Four platform-specific Go binaries |
19
+ | 5 | `@ckanner/dsh-plugin-flywheel` | Desktop plugin and workers |
20
+ | 6 | `@ckanner/flywheel` | User-facing CLI, installer, and documentation |
21
+
22
+ The meta package pins all five dependencies. Every Flywheel package declares
23
+ MIT and includes its `LICENSE`; the plugin retains third-party notices.
24
+ The Codex Pro dependency is pinned to 0.9.0 and bundled from the
25
+ [recorded source candidate](https://github.com/ckanner/flywheel/blob/main/plugins/dsh/vendor/README.md). Claude Code
26
+ Pro 0.4.0 remains an optional peer, not a seventh Flywheel release package.
27
+
28
+ Use Git, Go **1.27**, Node **24.22.1**, and npm **12.2.1**, matching the
29
+ repository workflows. The end-user Node requirement is lower; the release
30
+ toolchain is deliberately fixed. The reviewed source must be clean, all six
31
+ versions must agree, and the exact `vX.Y.Z` tag must point to HEAD. Never move
32
+ an existing release tag or replace already-published package bytes.
33
+
34
+ `candidate.json` records the source commit, tree, snapshot SHA-256, and each
35
+ tarball's SHA-512 integrity. Build once, then verify, test, and publish those
36
+ same tarballs. A candidate with `source.dirty: true` is for development only.
37
+
38
+ ## 2. Validate the release source
39
+
40
+ Run the checks required by the [contribution guide](contributing.md) and
41
+ the current [CI workflow](https://github.com/ckanner/flywheel/blob/main/.github/workflows/ci.yml):
42
+
43
+ | Area | Required evidence |
44
+ | --- | --- |
45
+ | Go | `make quality-gate` and the workflow's core-package race checks |
46
+ | DSH plugin | Locked dependency installation, build, and behavior tests |
47
+ | Backend boundary | DSH, Codex Pro, and Claude Code Pro offline bridge tests |
48
+ | npm | `npm test` and real installation of the six-package candidate |
49
+ | Native CLI | Build, version/help, and JSON configuration checks |
50
+ | Session policies | `npm run test:sessions` with the built native binary |
51
+ | Documentation | Links, language parity, packaged guides, and licenses |
52
+
53
+ Prepare the exact optional Claude tarball using the workflow's pinned source
54
+ SHA and SHA-256 check. For plugin/bridge tests, the workflow temporarily
55
+ installs it as a development dependency and restores the source manifests.
56
+ Export `FLYWHEEL_CLAUDE_CODE_PRO_TARBALL` as the absolute path to that verified
57
+ tarball before running candidate installation tests.
58
+ An absent optional peer does not count as a passed Claude backend check.
59
+
60
+ These checks use isolated profiles and offline model fixtures. They do not
61
+ establish live account readiness, model quality, or physical desktop layout.
62
+ Record the actual platforms tested; cross-compilation does not establish
63
+ runtime verification on the target platform.
64
+
65
+ ## 3. Build one candidate
66
+
67
+ From the clean checkout of the reviewed release tag, run each command and
68
+ stop on failure:
69
+
70
+ ```sh
71
+ FLYWHEEL_RELEASE_VERSION=$(node -p "require('./package.json').version")
72
+ FLYWHEEL_RELEASE_SHA=$(git rev-parse HEAD)
73
+ node scripts/release-preflight.js --version "$FLYWHEEL_RELEASE_VERSION" --tag "v$FLYWHEEL_RELEASE_VERSION" --json
74
+ npm run build:npm
75
+ node scripts/release-publish.js verify-candidate --directory dist-npm --source-sha "$FLYWHEEL_RELEASE_SHA"
76
+ FLYWHEEL_NPM_PACKAGES_DIR=dist-npm npm run test:install
77
+ ```
78
+
79
+ Set the Claude tarball environment variable described above before the final
80
+ command. The build installs locked plugin dependencies inside an isolated
81
+ source snapshot, with lifecycle scripts disabled, then builds the workers and
82
+ four Go binaries. It does not reuse the caller's `node_modules` or `dist`.
83
+ Root-level `npm install` is not required.
84
+
85
+ Preserve `dist-npm/`, its `candidate.json`, source identity, toolchain versions,
86
+ and validation results. Verify all six packed MIT licenses and the root and
87
+ plugin language editions. If source changes before any upload, prepare a new
88
+ candidate from the new reviewed source. After any upload, retain the original
89
+ candidate and follow the recovery rules below.
90
+
91
+ ## 4. GitHub Actions publication
92
+
93
+ Pushing the reviewed tag triggers [publish.yml](https://github.com/ckanner/flywheel/blob/main/.github/workflows/publish.yml).
94
+ An existing tag can also be supplied to its manual dispatch. Linux and macOS
95
+ verify the same candidate artifact; the publish job refreshes remote refs and
96
+ requires the tag to still identify the checked source.
97
+
98
+ GitHub access and npm publication rights are separate. Configure trusted
99
+ publishing for each of the six packages with owner `ckanner`, repository
100
+ `flywheel`, workflow `publish.yml`, and no environment unless the workflow is
101
+ changed to use one. Both **npm publish** and **npm dist-tag** permissions are
102
+ needed. The workflow also supports an authorized `NPM_TOKEN` fallback.
103
+
104
+ New packages require npm's initial package-creation authorization before
105
+ their trusted publisher can be configured. Use the normal authorized npm
106
+ flow; do not upload different placeholder bytes under the release version.
107
+ See the official [trusted publisher](https://docs.npmjs.com/trusted-publishers/)
108
+ and [dist-tag](https://docs.npmjs.com/adding-dist-tags-to-packages/) documentation
109
+ for account setup. `npm whoami` identifies an account, not its publishing rights.
110
+
111
+ Publication requires explicit repository visibility: `public` requires
112
+ provenance; `private` disables unsupported private-source provenance. Choose
113
+ the repository's actual visibility. Publishing a package does not change
114
+ repository visibility, and OIDC authentication is separate from provenance.
115
+
116
+ ## 5. Publish locally from private source
117
+
118
+ A maintainer can build from a normal Git checkout. With the current release
119
+ policy, new uploads from a public repository must use section 4: the publisher
120
+ requires provenance, which npm generates only in a supported cloud CI/CD
121
+ environment, not an ordinary local browser-login session. See
122
+ [npm provenance requirements](https://docs.npmjs.com/generating-provenance-statements/).
123
+ The local upload example below applies only when the source repository is
124
+ actually private. Do not label a public repository private to bypass this
125
+ requirement. No downloaded archive is required. Complete source review and
126
+ the checks above first. If Actions cannot run, record the maintainer's
127
+ authorization, actual local results, and checks that were not performed;
128
+ do not report unavailable CI as passing.
129
+
130
+ From the same clean tagged source and its original candidate:
131
+
132
+ ```sh
133
+ npm login --auth-type=web --scope=@ckanner --registry=https://registry.npmjs.org/
134
+ npm run release:local -- --repository-visibility private
135
+ ```
136
+
137
+ Complete the normal browser/2FA prompts in the terminal. The publisher
138
+ requires a TTY; do not pipe its output through `tee`.
139
+
140
+ `release:local` performs these steps:
141
+
142
+ 1. Recheck clean source, exact local and remote tag, tree, snapshot, candidate
143
+ manifest, and package integrity.
144
+ 2. Run candidate installation, then verify the source and candidate again.
145
+ 3. Upload platform packages, plugin, and meta under `candidate-X-Y-Z`.
146
+ 4. Install the exact version from the official npm registry.
147
+ 5. Recheck source and remote tag, promote `latest` in the same order, and
148
+ verify all six tags and integrities.
149
+
150
+ The command uses the repository's existing release checks. Only npm publish
151
+ and dist-tag writes inherit terminal I/O; registry queries retain strict JSON
152
+ parsing and bounded timeouts. The command does not log in, create or move
153
+ tags, or change account security settings.
154
+
155
+ For a reviewed older release that needs newer tooling, `--source-directory`
156
+ can point at its exact tagged worktree and `--directory` at its original
157
+ candidate. The source defaults to the tooling checkout; the candidate
158
+ directory defaults to `dist-npm/` inside the selected source directory. Explicit
159
+ relative paths resolve from the invocation directory. Do not copy newer
160
+ tooling into old release source or rebuild an already-published version.
161
+
162
+ ## 6. Visibility, promotion, and retry behavior
163
+
164
+ Packages first use the candidate tag. All exact versions and integrities must
165
+ be visible and registry installation must succeed before `latest` moves.
166
+ Platform packages are promoted first, the plugin next, and the user-facing
167
+ meta package last. npm has no atomic six-package tag transaction.
168
+
169
+ Only a structured E404 means a queried version is absent. Authentication,
170
+ transport, cancellation, malformed output, or missing integrity fails the
171
+ operation. Registry queries accept the supported scalar and single-element
172
+ array response shapes; multiple results are rejected.
173
+
174
+ After upload, visibility checks have a 180-second budget per package, with
175
+ E404 backoff from 2 seconds to at most 15 seconds. Each read is bounded by
176
+ 30 seconds and the remaining budget. Promotion verification uses the same
177
+ bounded approach for `latest` and integrity. It repeats reads, not writes,
178
+ and refuses a newer `latest`, conflicting integrity, or invalid version.
179
+
180
+ | Failure | Recovery |
181
+ | --- | --- |
182
+ | Authentication or browser approval | Resolve the authorized npm login; retain the candidate. |
183
+ | Some packages uploaded | Retry the original candidate; existing versions must match its integrity. |
184
+ | Registry visibility timeout | Preserve the artifact and retry after the external issue is resolved. |
185
+ | Installation or tag promotion failed | Resume with the same candidate; do not downgrade a newer `latest`. |
186
+ | Source must change after upload | Use a new uniform version and a new reviewed tag. |
187
+ | Original candidate is missing | Recover it; do not assume a rebuild has identical bytes. |
188
+
189
+ With Actions, rerun failed jobs using the original artifact. Locally, rerun
190
+ the final `release:local` command against the preserved source and candidate.
191
+
192
+ ## 7. Record completion
193
+
194
+ Publication is complete only after all six exact versions and integrities,
195
+ registry installation, and final `latest` checks have passed. Record those
196
+ results separately from source review, local tests, CI, and desktop acceptance.
197
+ For an additional exact-version installation check:
198
+
199
+ ```sh
200
+ FLYWHEEL_NPM_VERSION=X.Y.Z npm run test:registry
201
+ ```
202
+
203
+ Replace `X.Y.Z` with the released version. Record source SHA, candidate
204
+ identity, actual platforms, failures/retries, and remaining limits in a dated
205
+ validation record and release notes. See the
206
+ [0.30.2 release record](../validation/2026-11-11-release-0.30.2.md) for a
207
+ historical example; it is evidence for that release, not a live registry status.
@@ -1,8 +1,10 @@
1
1
  # Session quality policy and paired evaluation
2
2
 
3
- P4 provides two executable capabilities: bounded rebuilding based on confirmed facts, and paired experiments using three history policies on the same tasks. Rebuild thresholds default to disabled. The evaluator preserves original conditions and results, keeps missing usage unknown, and assumes no quality, cache, or speed benefit.
3
+ [Documentation](../README.md) · English · [简体中文](../zh-CN/session-evaluation.md)
4
4
 
5
- See [configuration](configuration.md) for the policy and [recovery](session-recovery.md) for lifecycle and ledger semantics. Implementation entry points are the [quality policy](../../internal/machine/session_quality.go), [evaluator](../../scripts/evaluate-sessions.js), and [corpus preparer](../../scripts/prepare-session-evaluation.js).
5
+ Flywheel supports bounded context rebuilding based on confirmed facts and paired experiments using three history policies on the same tasks. Rebuild thresholds default to disabled. The evaluator preserves original conditions and results, keeps missing usage unknown, and assumes no quality, cache, or speed benefit.
6
+
7
+ See [configuration](configuration.md) for the policy and [recovery](session-recovery.md) for lifecycle and ledger semantics. Implementation entry points are the [quality policy](https://github.com/ckanner/flywheel/blob/main/internal/machine/session_quality.go), [evaluator](https://github.com/ckanner/flywheel/blob/main/scripts/evaluate-sessions.js), and [corpus preparer](https://github.com/ckanner/flywheel/blob/main/scripts/prepare-session-evaluation.js).
6
8
 
7
9
  ## Bounded rebuilding
8
10
 
@@ -1,6 +1,27 @@
1
1
  # Interrupted calls and context quality
2
2
 
3
- This guide describes the P3/P4 source implementation. P1/P2 role-history continuation and saved-receipt consumption remain available. The new public contracts require **Codex Pro 0.9.0** or **Claude Code Pro 0.4.0**. Source readiness, npm publication, account access, and measured task outcomes are separate evidence.
3
+ [Documentation](../README.md) · English · [简体中文](../zh-CN/session-recovery.md)
4
+
5
+ Flywheel separates reuse of a role’s conversation history from recovery of an
6
+ interrupted invocation. Fresh and scoped histories both retain invocation safety
7
+ checks. Durable public-journal recovery requires **Codex Pro 0.9.0** or
8
+ **Claude Code Pro 0.4.0**; DSH and Kimi retain their own supported recovery paths.
9
+
10
+ ## Resume an existing task
11
+
12
+ Use the original task ledger and integration directory. Read its status, then
13
+ request continuation through the normal engine entry point:
14
+
15
+ ```sh
16
+ flywheel control status --cwd /repo --task-dir /repo/docs/my-task
17
+ flywheel control start --cwd /repo --task-dir /repo/docs/my-task
18
+ ```
19
+
20
+ The engine reconciles earlier calls before making another model request. A
21
+ `pending` or `unknown` outcome can keep the task blocked; preserve its journals
22
+ and diagnostics rather than deleting state or selecting a fresh session to
23
+ force progress. A status response describes current facts, not permission to
24
+ replay an unresolved call.
4
25
 
5
26
  ## Ownership
6
27
 
@@ -44,6 +65,49 @@ At `cleanup-confirmed`, before acknowledging, Go captures the post-call candidat
44
65
 
45
66
  A durable receipt without the Go candidate checkpoint may reconcile trustworthy usage while leaving business execution blocked. A proven pre-dispatch rejection may be treated as unexecuted only with confirmed cleanup and an unchanged original candidate and guard. Review/Judge contract and candidate checks remain mandatory.
46
67
 
68
+ ### Shared-checkout execution
69
+
70
+ For shared-checkout execution, an Execute receipt fingerprints its declared write scope and binds that scope into the session identity. Independent peer changes do not discard a known invocation; changes within its own scope still reject stale receipts. L1, independent Review and collective delivery validate the entire combined candidate. Scoped receipts neither prove batch completion nor bypass unknown dispatch, outcome or cleanup.
71
+
72
+ ### DSH runtime preparation after a restart
73
+
74
+ Optional `scheduler.prewarm` prepares a DSH Review runtime without a model prompt
75
+ while deterministic checks run. Before starting it, Go saves a single
76
+ `worker-prewarm` responsibility in task state, including the preparation identity,
77
+ role/scope, binding and run. Its terminal receipt is private under
78
+ `.control/prewarm/`; it is separate from a model invocation or passing Review.
79
+
80
+ The complete terminal JSON is limited to 8 KiB after UTF-8 serialization, including
81
+ escaped characters and the trailing newline. Long error diagnostics are shortened
82
+ with a truncation marker; ordinary short errors and all identity, dispatch and
83
+ cleanup fields remain intact. Diagnostic truncation does not relax any recovery
84
+ check or turn an initialization failure into a safe-expiry fallback.
85
+
86
+ A restarted engine never resumes that prepared worker. It may discharge the old
87
+ responsibility only when the matching receipt proves that no prompt was submitted,
88
+ SDK cleanup was confirmed, and both the recorded worker and its original process
89
+ group have exited. Receipt publication synchronizes the file and its directory;
90
+ recovery repeats those durability checks before clearing state. If no process was
91
+ ever started, an explicit local no-process receipt can establish that fact;
92
+ elapsed time or a missing PID cannot. Missing, oversized, corrupt or mismatched receipts, a
93
+ live or unconfirmed process/group, or uncertain cleanup keep the task blocked.
94
+ Turning prewarming off does not bypass reconciliation. After safe resolution,
95
+ subsequent work follows the current configuration and its normal invocation checks.
96
+
97
+ Within the same engine run, a safely expired unused runtime may fall back once to
98
+ a cold invocation only before any formal start was attempted, with the same
99
+ persisted invocation identity and its remaining deadlines. This is not restart
100
+ reuse, a second billed model attempt, or a way around unknown effects. Cancellation,
101
+ expired invocation deadlines, incomplete cleanup, or untrusted output prevent that
102
+ fallback.
103
+
104
+ Creating the first preparation record advances `state.sessions.version` to **3**
105
+ and later operations retain that version. This storage compatibility marker makes
106
+ older engines reject a task whose cleanup responsibilities they cannot interpret.
107
+ The new engine still reads versions 1 and 2. `sessions.policy-version` remains 1;
108
+ worker and lifecycle protocols retain their separate version contracts. Do not
109
+ edit the storage version or delete receipts to force a downgrade.
110
+
47
111
  ## Accounting and budgets
48
112
 
49
113
  Consumed invocations do not create another model request or call count. If an unknown invocation later yields trusted usage, Go appends an auditable correction tied to the same call, provider, original day, and lifetime totals. Recovery does not recreate an expired daily bucket.
@@ -54,7 +118,7 @@ Unknown is not zero. Rebuilds, role overrides, new workers, and Quick-to-Full tr
54
118
 
55
119
  ## Bounded context rebuilds
56
120
 
57
- `sessions.roles` can override fresh/scoped independently for Plan, Execute, Review, and Judge. Other roles inherit the global mode. See [session configuration](configuration.md#session-policy-history-reuse-and-invocation-safety).
121
+ `sessions.roles` can override fresh/scoped independently for Plan, Execute, Review, Judge, and judge-panel. Other roles inherit the global mode. See [session configuration](configuration.md#session-policy-history-reuse-and-invocation-safety).
58
122
 
59
123
  Optional `sessions.quality` supports:
60
124
 
@@ -68,16 +132,34 @@ All thresholds default to disabled. They may rebuild only after the previous cal
68
132
 
69
133
  A rebuild records its reason and generation and hands over current contracts, workspace, valid reports, verification, and structured feedback. It never imports another role's private transcript or issues an unmetered model-compression call. A returning Reviewer must still inspect the entire current candidate.
70
134
 
71
- ## Paired P4 evaluation
135
+ ### Verified incremental inputs
136
+
137
+ Explicit `sessions.context:"verified-incremental"` permits Execute to reuse a
138
+ confirmed same-role stable contract after Go verifies that the consumed receipt
139
+ proves `dispatched` and `completed`, together with the prompt version, current
140
+ contract and readable context/cache file digests. A safe admission rejection or
141
+ failed/cancelled turn may preserve the old thread, but cannot prove delivery of
142
+ that turn's newly prepared authority; the next call resends full input. New
143
+ input carries feedback, candidate identities, attempt and references. Changed or
144
+ unavailable authority, legacy missing checkpoints and invalid context receipts
145
+ select full input. The decision and reason are saved on the role record. Review
146
+ and Judge keep full current inputs and never inherit Executor private history.
147
+
148
+ An opt-in [execution policy](configuration.md#bounded-execution-policy-opt-in)
149
+ can select another complete allowed binding. Every switch starts a new history
150
+ generation, including effort-only changes. Explicit session mode is also part
151
+ of the binding. Unknown/pending invocations reconcile first; fresh context cannot
152
+ authorize replaying uncertain effects. Switch records separate quality upgrades
153
+ from channel fallback and preserve the original task and packet budgets.
154
+
155
+ ## Paired evaluation
72
156
 
73
157
  The repository tools pin source and use an independent frozen oracle to compare fresh, Execute-only scoped, and role-scoped policies. The corpus covers first-pass success, L1 repair, Review return, long context, stop/resume, and configuration changes, with repeated trials and rotated strategy order. Reports retain quality, omissions, regressions, repair rounds, repeated findings, elapsed time, known/unknown tokens and cache use, rebuild reasons, and recovery failures. Actual state evidence determines whether a scenario occurred.
74
158
 
75
- The offline native fixture exercises the real Go engine, worker v3, and public plugin API. It validates the evaluator and safety behavior, not model quality, cache rates, or savings. Real paired results require an available native CLI, account, permissions, and model. Defaults remain unchanged until that evidence exists. See the [configuration guide](configuration.md) and the help for `scripts/prepare-session-evaluation.js` and `scripts/evaluate-sessions.js`.
159
+ The offline native fixture exercises the real Go engine, worker v3, and public plugin API. It validates the evaluator and safety behavior, not model quality, cache rates, or savings. Real paired results require an available native CLI, account, permissions, and model. Defaults remain unchanged until that evidence exists. See the [paired evaluation guide](session-evaluation.md) for commands and report interpretation.
76
160
 
77
161
  ## Retention and operation
78
162
 
79
163
  Recovery journals have private permissions, exclusive creation, identity/digest checks, and atomic persistence. Existing directories never authorize redispatch. They are task audit data and may contain model output and diagnostics; keep their access and backups with the task. Do not copy credentials or delete uncertain evidence during upgrades.
80
164
 
81
165
  There is currently no automatic journal-retention timer. Archive evidence through the project's task lifecycle after completion or explicit resolution of an unknown result. Deleting a journal is not a recovery procedure. `control status` and doctor are observation surfaces; models and skills never write `state.json`. Resume through the normal Go entry point from the original task directory so the engine can reconcile before making a new call.
82
-
83
- For shared-checkout execution, an Execute receipt fingerprints its declared write scope and binds that scope into the session identity. Independent peer changes do not discard a known invocation; changes within its own scope still reject stale receipts. L1, independent Review and collective delivery validate the entire combined candidate. Scoped receipts neither prove batch completion nor bypass unknown dispatch, outcome or cleanup.