@ckanner/flywheel 0.31.1 → 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 (39) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/docs/README.md +5 -3
  3. package/docs/README.zh-CN.md +2 -2
  4. package/docs/design.md +166 -35
  5. package/docs/en/configuration.md +106 -11
  6. package/docs/en/contributing.md +1 -1
  7. package/docs/en/flow-console.md +88 -24
  8. package/docs/en/investigation.md +127 -83
  9. package/docs/en/jev-shadow.md +3 -65
  10. package/docs/en/jev.md +240 -0
  11. package/docs/en/model-policy.md +7 -0
  12. package/docs/en/session-recovery.md +39 -0
  13. package/docs/en/workflow.md +20 -1
  14. package/docs/plans/2026-11-12-unified-jev-decisions.md +89 -0
  15. package/docs/plans/2026-11-13-jev-execution-decisions.md +110 -0
  16. package/docs/plans/2026-11-13-p5-ready-queue-prewarm.md +178 -0
  17. package/docs/plans/README.md +3 -0
  18. package/docs/validation/2026-11-12-release-0.31.1.md +58 -0
  19. package/docs/validation/2026-11-12-session-console-ux.md +46 -0
  20. package/docs/validation/2026-11-12-unified-jev-decisions.md +93 -0
  21. package/docs/validation/2026-11-13-dsh-settings-controls.md +104 -0
  22. package/docs/validation/2026-11-13-jev-execution-decisions.md +140 -0
  23. package/docs/validation/2026-11-13-p5-ready-queue-prewarm.md +138 -0
  24. package/docs/validation/2026-11-13-p5-review-closure.md +114 -0
  25. package/docs/validation/2026-11-13-p5-tracked-runtime-fixes.md +108 -0
  26. package/docs/validation/2026-11-13-prewarm-receipts-and-expiry-tests.md +92 -0
  27. package/docs/validation/2026-11-13-workspace-redesign.md +66 -0
  28. package/docs/validation/README.md +10 -0
  29. package/docs/validation/evidence/2026-11-13-p5-npm-candidate.json +54 -0
  30. package/docs/zh-CN/configuration.md +79 -8
  31. package/docs/zh-CN/contributing.md +1 -1
  32. package/docs/zh-CN/flow-console.md +73 -22
  33. package/docs/zh-CN/investigation.md +91 -60
  34. package/docs/zh-CN/jev-shadow.md +3 -77
  35. package/docs/zh-CN/jev.md +192 -0
  36. package/docs/zh-CN/model-policy.md +5 -0
  37. package/docs/zh-CN/session-recovery.md +29 -0
  38. package/docs/zh-CN/workflow.md +15 -1
  39. package/package.json +7 -7
@@ -196,13 +196,17 @@ An existing complete file without `scheduler` normalizes to **serial**, and an
196
196
  explicit serial choice remains unchanged. Installing a new release does not replace
197
197
  that file. The [scheduler schema](https://github.com/ckanner/flywheel/blob/main/templates/scheduler-policy.schema.json)
198
198
  bounds total and per-channel concurrency from 1 to 8.
199
+ Both new and existing configurations default to `dispatch: "batch"` and
200
+ `prewarm: false`. These settings do not change the Quick/Full workflow or enable JEV.
199
201
 
200
202
  ```json
201
203
  {
202
204
  "scheduler": {
203
205
  "mode": "parallel",
204
206
  "max-parallel": 2,
205
- "providers": {"deepseek-account": 1}
207
+ "providers": {"deepseek-account": 1},
208
+ "dispatch": "batch",
209
+ "prewarm": false
206
210
  },
207
211
  "worktree": {"enabled": true}
208
212
  }
@@ -239,6 +243,74 @@ backends that cannot separate a `workspace-write` sandbox root reject unsupporte
239
243
  split-directory requests before dispatch, without expanding permissions. See the
240
244
  [console guide](flow-console.md#parallel-execution) for registration and batch rules.
241
245
 
246
+ ### Ready queues and runtime preparation
247
+
248
+ `scheduler.dispatch` accepts `batch` or `ready-queue`. Batch dispatch waits for the
249
+ current bounded group before selecting more work. Ready queues admit the next
250
+ already independent packet when an Execute/L1 slot becomes free. They apply to
251
+ Full with parallel scheduling, a maximum above one, and automatic Worktree
252
+ management. Quick, serial scheduling, a maximum of one, and automatic management
253
+ off retain their existing path. Shared-checkout execution retains its batch rules,
254
+ including when executors may register external Worktrees later.
255
+
256
+ The first ready-queue window must have every Worktree prepared and saved before
257
+ dispatch. Later packets prepare their directory before taking a freed slot. A
258
+ preparation failure stops admission and cancels and awaits started workers; queued
259
+ packets that have not been admitted create no directory or model invocation.
260
+ Dependencies become ready only after delivery. Review, replanning and integration
261
+ wait for all admitted workers to settle, and every combined candidate is rechecked.
262
+ Existing total/channel limits, hard budgets, attempts and unknown-result recovery
263
+ remain in force.
264
+
265
+ A replacement packet does not recover or cancel a sibling's still-running model
266
+ call. The coordinator retains those calls and their shared accounting. An unknown
267
+ result or failed receipt persistence stops new admission immediately and must be
268
+ reconciled before resuming.
269
+
270
+ `--pause-before review` also applies to independent parallel Worktrees. Once all
271
+ Execute/L1 work in the current group passes and its workers settle, the task pauses
272
+ before any Review or integration, retaining the verified candidates. Batch mode
273
+ finishes its admitted group; ready-queue mode may refill the fixed independent
274
+ queue before reaching that boundary. Resuming the same task reuses valid execution
275
+ evidence instead of repeating Execute. A candidate changed by later integration
276
+ still requires validation again.
277
+
278
+ `scheduler.prewarm: true` allows a serial packet to initialize one DSH Review
279
+ runtime while its post-Execute deterministic checks run. Initialization sends no
280
+ model prompt or Session request. Review inference still waits for its checks and
281
+ normal admission. Parallel Execute/L1 lanes do not prepare runtimes: after their
282
+ barrier, preparation can begin only in the serial Review path. Shared-candidate
283
+ batches do not prewarm. The main overlap opportunity is therefore a serial
284
+ Execute's L1 and applicable Quick checks, not every parallel lane's validation.
285
+
286
+ Unused or incompatible runtimes must finish bounded cleanup before further model
287
+ work. If an unused runtime reaches its 60-second lifetime before a formal start
288
+ is attempted, one cold invocation may use the same persisted request identity and
289
+ remaining time allowance. This requires an exact, durable no-dispatch receipt,
290
+ confirmed SDK and process-group cleanup, and no cancellation or expired invocation
291
+ deadline. It does not grant another attempt or reset a budget. Unknown cleanup
292
+ remains blocking. Other harnesses start normally. Session history reuse is separate
293
+ from runtime preparation and retains role isolation.
294
+
295
+ Confirmed initialization failures preserve their reported error classification and
296
+ the normal retry/fallback rules. An authentication or invalid-request failure does
297
+ not become a transport retry or qualify as a harmless prepared-runtime expiration.
298
+
299
+ In Settings → Execution, dispatch is a Batch/Ready queue selector and prewarm is
300
+ an independent switch. The form shows unmet Ready queue configuration conditions
301
+ without resetting the selected value; task eligibility is checked by the engine.
302
+ Both options also remain available in advanced JSON. Saving
303
+ applies to the next start; the current process retains its loaded policy. A resumed
304
+ run still reconciles existing invocations and shared batches before new dispatch.
305
+ An outstanding prepared worker also requires its original no-prompt cleanup
306
+ receipt, synchronized file and directory, and confirmed worker/process-group exit,
307
+ even after `prewarm` is disabled; see
308
+ [prewarm recovery](session-recovery.md#dsh-runtime-preparation-after-a-restart).
309
+ Both optimizations remain optional while live latency, resource use and adoption
310
+ defaults are evaluated separately. Offline checks establish behavior and recovery,
311
+ not a guaranteed speed or token improvement. See the
312
+ [P5 implementation plan](../plans/2026-11-13-p5-ready-queue-prewarm.md) (Chinese).
313
+
242
314
  ## Session policy, history reuse, and invocation safety
243
315
 
244
316
  ```json
@@ -384,6 +456,12 @@ dispatch; `state.packets[*].execution-policy.history` records separate
384
456
  `quality-upgrade` and `channel-fallback` events with full before/after bindings,
385
457
  attempt and reason. Parallel packets retain independent records.
386
458
 
459
+ With `jev.enabled`, confirmed failures can also select a legal binding through
460
+ JEV. These switches are recorded as `jev-model-selection`, use the same
461
+ `max-switches` and cold-start rules, and do not alter channel-error handling.
462
+ The allowed bindings remain an explicit resource/permission declaration; the
463
+ JEV switch does not add a provider, account or model to that set.
464
+
387
465
  `config inspect --json` exposes the complete declaration under
388
466
  `execution-policy`; the ordinary bindings table remains the configured baseline.
389
467
  Current choices belong to packet/session state. Doctor's existing binding probes
@@ -532,16 +610,33 @@ Codex Pro checks actually import the public API and verify exact version 0.9.0/p
532
610
  No probe sends an inference prompt, runs L1/L2/L3, creates a worktree, or writes Flywheel task state. SDK initialization may contact a provider's catalog and write its own cache files and temporary probe-session persistence; read-only here is scoped to Flywheel state and configuration. Recheck in the desktop panel because its PATH/profile/environment may differ from the terminal.
533
611
 
534
612
 
535
- ## Optional JEV shadow evaluation
536
-
537
- `jev-shadow.enabled` defaults to false, including configurations that omit it. The
538
- global/project editor exposes the switch. During task execution it only captures
539
- local snapshots; it does not send HTTP requests on the task's critical path.
540
- A later explicit `flywheel shadow run` performs the optional network evaluation
541
- with separate accounting. Shadow results cannot change Quick/Full or authorize
542
- new actions. New decision adoption requires its own explicit opt-in and data
543
- boundary; the existing shadow switch does not grant it. See the
544
- [JEV guide](jev-shadow.md) for endpoint, version, credentials, budgets and recovery.
613
+ ## JEV decisions
614
+
615
+ `jev.enabled` is the only JEV activation setting and defaults to false. The desktop
616
+ editor exposes one switch; enabled investigation preparations automatically freeze
617
+ an adoption policy for action selection, evidence-backed deferral and early report
618
+ handoff. Confirmed implementation failures can also select bounded repair, an
619
+ approved feedback check, replanning or an allowed execution binding. Task/New/Run
620
+ share the same engine-owned policy. Disabling stops subsequent
621
+ requests and adoption, while existing receipts and budgets are retained.
622
+
623
+ There is no independent task shadow/advisory switch. Legacy `jev-shadow` is read
624
+ only to migrate connection hints into a disabled unified configuration; editor saves
625
+ remove the old key. Explicit new `jev` wins, and configuration still selects one
626
+ complete task/project/global/embedded file without merging. Endpoint, fixed model,
627
+ credential variable, limits, data categories and recovery are documented in the
628
+ [JEV guide](jev.md).
629
+
630
+ Packets may declare up to eight optional `feedback-checks`, using the same
631
+ `cmd`/`script` and `expect` shape as an acceptance command. They are short,
632
+ approved diagnostic candidates, not replacements for `acceptance.L1/L2/L3`.
633
+ Add a concise `purpose` (up to 160 characters) explaining what each check can
634
+ distinguish. JEV receives that approved purpose, not the command. A check without
635
+ `purpose` remains executor guidance and is excluded from JEV's targeted candidates.
636
+ Keep credentials, raw logs and command text out of the purpose. JEV may also use
637
+ an eligible previously failed L1 check. Execution uses the existing
638
+ verification timeout, environment allowlist and process cleanup rules. Changing
639
+ these checks changes the contract identity and invalidates stale decisions.
545
640
 
546
641
  ## Reference files
547
642
 
@@ -196,7 +196,7 @@ contract rules.
196
196
  | Scheduling, worktrees, execution locations, or delivery | `workflow.md`, `configuration.md`, `flow-console.md`, design sections, and affected skills |
197
197
  | Session reuse, recovery, handoff, or accounting | `session-recovery.md`, configuration/workflow/console sections, design, and affected worker contracts |
198
198
  | Desktop UI, task discovery, or operator controls | `flow-console.md`, plugin READMEs, and getting-started instructions that name the UI |
199
- | Evaluation tools, scenarios, or result interpretation | `session-evaluation.md` or `jev-shadow.md`, their input/output contracts, and dated evidence when new checks actually run |
199
+ | Evaluation tools, scenarios, or result interpretation | `session-evaluation.md` or `jev.md`, their input/output contracts, and dated evidence when new checks actually run |
200
200
  | Package layout, licenses, or release behavior | `releasing.md`, relevant installation instructions, manifests/lockfiles, packaged links, and applicable license/provenance notices |
201
201
  | A documentation move, rename, or heading change | Both documentation indexes, language links, all incoming paths/anchors, package lists, embedding references, scripts, and tests |
202
202
  | Contributor or AI operating rules | [AGENTS.md](https://github.com/ckanner/flywheel/blob/main/AGENTS.md), both contribution guides, and their navigation; keep the requirements consistent |
@@ -2,17 +2,15 @@
2
2
 
3
3
  [Documentation](../README.md) · English · [简体中文](../zh-CN/flow-console.md)
4
4
 
5
- The DSH Flywheel view brings task selection, workflow stages, configuration, session
5
+ The DSH Flywheel view brings the current task, workflow stages, configuration, session
6
6
  interaction, and delivery into one place. Keep the CLI, platform packages, and DSH
7
7
  plugin at the same version. For installation, see [Getting started](getting-started.md).
8
8
 
9
9
  ## Find a task without entering paths
10
10
 
11
- The canvas starts with task selection. One registered task belonging to the current DSH conversation opens automatically; multiple tasks require a choice. Terminal runs record DSH's host session ID when it is available. This is discovery metadata, never authorization. The UI reads Go state after finding an index entry; the index is not proof of liveness or completion.
11
+ The view follows the current conversation automatically; there is no task selector or editable path field. Its explicit tool association takes priority. Without one, the latest registered run with an exact matching host session ID opens. Foreign and ownerless runs are not shown. The index supplies identity only; Go status establishes progress. Unconfirmed operations retain their original target.
12
12
 
13
- Older records without a host ID remain selectable under Recent tasks on this computer. Selection performs a read-only status query and associates the task with the conversation. Refreshing the list does not start, retry or replace a manually selected task. Read failures retain the existing canvas; unresolved operations still require reconciliation against their original task.
14
-
15
- There are no editable task/project path fields. The project workspace remains the original repository; the execution directory may be a task checkout or independent Worktree. These locations are displayed separately when known. The task folder contains the specification, acceptance checks and progress. A prepared task can be associated using read-only status and then selected from the list.
13
+ The project, task folder, execution directory and branch appear directly when known. Use `flywheel_control status` in the intended conversation to associate a prepared or standalone terminal task. Old UI-generated status command records do not establish a new association.
16
14
 
17
15
  DSH keeps the original repository in the Session header and switches the current execution directory through its public API. The desktop Host periodically attaches Flywheel SDK sessions to matching existing projects; task status also ensures the original project is registered. It does not create a desktop workspace for every packet Worktree or rewrite old Session headers. Probes use temporary persistence, leaving no new user sessions. Native Providers start sessions in the project; task prompts name the actual execution directory for every shell/file operation. Backends unable to separate a `workspace-write` sandbox root reject that combination before dispatch instead of widening permissions. Full access and supported read-only modes retain their actual semantics.
18
16
 
@@ -21,25 +19,24 @@ Loading a skill does not start the engine. `flywheel-task` prepares the appropri
21
19
  | Conversation entry | Does it start the engine? | How the UI finds the task |
22
20
  |---|---|---|
23
21
  | `/flywheel-new <goal>` | Prepares contracts for review only | Before handing over the proposal, the assistant registers a candidate through read-only `status`; an uninitialized task shows its identity and location, not execution progress |
24
- | `/flywheel-run <task directory>` | Starts or resumes an existing task | Start and query the original task path to associate it with the conversation; select the intended task when there are multiple candidates |
25
- | `/flywheel-task <goal>` | Prepares, then starts | Launch and associate through `flywheel_launch`, then check status |
22
+ | `/flywheel-run <task directory>` | Starts or resumes an existing task | Start and query the original task path to associate it with the conversation; the view follows the explicit association |
23
+ | `/flywheel-task <goal>` | Prepares, then starts | Use investigation control for evidence collection or `flywheel_launch` for implementation, then check status |
26
24
 
27
25
  `new → run` and `task` use the same engine; the canvas is not exclusive to one
28
26
  skill. Writing task files alone does not register a view, and a failed association
29
27
  query must not be replaced with launch merely to populate the canvas. Report an
30
- unavailable association tool explicitly. Tasks actually run from a standalone
31
- terminal remain selectable under Recent tasks on this computer.
28
+ unavailable association tool explicitly. Standalone terminal tasks without a host ID require an explicit association in the intended conversation.
32
29
 
33
30
  While the canvas is visible, registered-task discovery refreshes every five seconds.
34
31
  An observed running task refreshes status every two seconds, backing off to ten
35
32
  seconds after an unsuccessful response. Hidden documents skip those requests.
36
- Refresh is read-only and does not replay uncertain operations.
33
+ Refresh uses a read-only Remote instead of a slash command, so it does not append chat events or JSON. Explicit mutations and uncertain-result reconciliation retain durable command receipts. Old chat records are preserved.
37
34
 
38
35
  ## This stage versus the full workflow
39
36
 
40
37
  When `run.kind` and `control.kind` identify the same single-stage operation, This run shows its recorded outcome. A review-only run defaults to **L1 → Review**, including the recorded verdict and score, while stating that overall delivery is not complete. Switch to Full workflow for the larger graph.
41
38
 
42
- Continue workflow is behind an explicit disclosure. A passed stage does not start subsequent stages or mark the task completed. Failed, cancelled and unknown operations cannot inherit an older green verdict. Run ID, HEAD and digests are collapsed under Run details and file locations.
39
+ Continue workflow is directly visible when applicable. New-task launch options appear only before an engine state exists. A passed stage does not start subsequent stages or mark the task completed. Failed, cancelled and unknown operations cannot inherit an older green verdict. Run ID, HEAD and digests are directly visible in node details.
43
40
 
44
41
  ## Investigation before implementation
45
42
 
@@ -60,33 +57,73 @@ for the supported read/search actions, command protocol, and handoff requirement
60
57
 
61
58
  ## Configuration
62
59
 
63
- In an existing DSH conversation view, Flywheel remains after Statistics; the blank new-session landing page does not yet show these conversation views. Its navigation tabs are Workflow, Run history, and Configuration. Global settings require no task directory. Project settings target the selected Git root. Discovery still selects one complete file in task → project → global → embedded order; it does not deep-merge files.
60
+ In an existing DSH conversation view, Flywheel remains after Statistics; the blank new-session landing page does not yet show these conversation views. Its primary navigation is Workflow and History; Settings opens a separate workspace. Global settings require no task directory. Project settings target the selected Git root. Discovery still selects one complete file in task → project → global → embedded order; it does not deep-merge files.
64
61
 
65
- Opening Configuration automatically reads the selected scope. Workflow policy, model assignments, budget/retries and JEV shadow advice have separate sections. Save and Discard appear beside the form only after edits. Ordinary saving takes one click; first enabling JEV explains local capture and the separate explicit evaluation transfer. Serial mode omits concurrency controls. Minutes and seconds are converted precisely to engine millisecond fields.
62
+ Opening Settings automatically reads the selected scope. Execution, Models and sessions, Budget and retries, JEV, and Advanced and diagnostics have separate sections. Save, Discard and Restore defaults stay in a fixed footer; Save is disabled without changes. Saving takes one click, including the single JEV master switch; the form explains supported decisions and the configured data scope. Serial mode omits concurrency controls. Minutes and seconds are converted precisely to engine millisecond fields.
66
63
 
67
- More configuration actions provides reload and installed-default restoration. Scope changes or reloads first disclose unsaved drafts; restoring defaults loads a pending full replacement before saving. Failures retain the draft and an uncertain save requires reconciliation. Go checks file identity, backs up the original and publishes atomically. A running engine retains its snapshot. The displayed source is file-level: task → project → global → installed defaults selects one file, not a per-field overlay. New files start from the installed template.
64
+ Reload, complete JSON editing, diagnostics and raw responses live in Advanced and diagnostics. The narrow navigation row is fixed at 54px with 36px buttons (44px for coarse pointers); shorter content cannot stretch it. Leaving Settings, scope changes or reloads first disclose unsaved drafts; restoring defaults loads a pending full replacement before saving. Failures retain the draft and an uncertain save requires reconciliation. Go checks file identity, backs up the original and publishes atomically. Implementation runs retain their configuration snapshot. JEV additionally rechecks current activation and tighter permissions at decision boundaries; see [JEV recovery](jev.md#data-budgets-and-recovery). The displayed source is file-level: task → project → global → installed defaults selects one file, not a per-field overlay. New files start from the installed template.
68
65
 
69
66
  Resources include ChatGPT through DSH or Codex Pro, Kimi Code, DeepSeek Account (Flash by default), and optional Claude Code Pro. Defaults come from the embedded template. Use config inspect and doctor for actual backend capabilities. An absent peer or unsupported permission fails explicitly. Provider sign-in stays with its normal account flow.
70
67
 
71
68
  `permissions.bindings` overrides `loops.<role>`, `routes.<route>` or `judge-panel`. Unspecified bindings use the global policy. History overrides are role-based: execution routes share the execute policy while each packet keeps its own session. Scoped continuation requires the same task, role, goal and eligible binding; fresh also retains invocation-safety records.
72
69
 
73
- The optional [JEV shadow evaluator](jev-shadow.md) is disabled by default. Enabling
74
- it captures a local task summary; only an explicit `shadow run` sends it for evaluation.
75
- Advice does not select workflow policy. Investigation decisions use a separate,
76
- explicit policy described in the [investigation guide](investigation.md).
70
+ [JEV decisions](jev.md) use one default-off master switch. Enabling it activates
71
+ supported investigation and failure-action decisions automatically, including approved
72
+ execution-model choices. Configuration inspection is read
73
+ only; it is not another switch. The investigation view shows the last observed JEV
74
+ state, adopted versus baseline actions, and evidence-referenced deferral or early
75
+ report effects. A stored state label is not a live re-read of configuration. These
76
+ collection effects never mean the root cause is proven or implementation completed.
77
+
78
+ ### Switches and scheduling choices
79
+
80
+ Settings uses one JEV master switch. Automatic task Worktree management and early
81
+ DSH Review runtime preparation have their own switches in Execution. Each switch
82
+ has an associated label, a visible On/Off state, and native checkbox keyboard
83
+ behavior. Toggling edits the draft; Save changes writes the selected scope. No
84
+ second JEV confirmation or task-specific enable switch is required.
85
+
86
+ Parallel dispatch remains a two-option policy selector: Batch waits for the
87
+ current batch, while Ready queue refills an available Execute/L1 slot with another
88
+ eligible independent packet. The form preserves the selected policy and explains
89
+ unmet configuration conditions; it cannot establish whether a future task will
90
+ use Full or have independent work. Ready queue requires Full, parallel scheduling,
91
+ a maximum above one and automatic Worktrees. Early runtime preparation is
92
+ independent of JEV and only initializes a supported DSH Review SDK; no Session or
93
+ model prompt is created before normal admission. Defaults remain Batch and
94
+ preparation Off. See [runtime scheduling](configuration.md#scheduling-and-worktrees).
95
+
96
+ Automatic Worktree management controls engine-owned directories. Turning it off
97
+ does not delete existing directories or prohibit externally managed Worktrees.
98
+ The JEV section explains the allowed data boundary and current-task disable
99
+ semantics beside the fields. Disabling JEV or switching to serial discards the
100
+ invalid input drafts hidden by that change and retains the last valid values;
101
+ unrelated errors still require correction. Detected invalid fields entered through advanced JSON remain editable there and
102
+ block Save until corrected; Go still validates the complete configuration.
103
+ A valid connection, provider quota, explicit empty allowed-data list, role policy
104
+ or budget is not reset by an unrelated switch. Invalid drafts and stale/unknown
105
+ saves retain the existing protections.
106
+
107
+ ### Session defaults and stage overrides
108
+
109
+ Execution sets the default fresh/scoped policy. Models and sessions lets each role inherit or override it. Execute routes share a role policy while packets retain independent histories. An explicit Plan choice reconciles the legacy Kimi history switch; inheritance preserves it. Nodes show actual session IDs, actions and reasons, not a resume inferred from configuration.
110
+
111
+ ### Optional usage budget
112
+
113
+ Choose Off, Warn only, or Stop at limit. Off hides the threshold while retaining accounting. Warn only does not stop execution; a hard budget blocks new calls at the limit or when usage is unknown. Thresholds apply per task and UTC day; blank means no limit. Timeouts and transport retries remain independent, as do Provider quotas. The form reads actual settings and never silently changes an existing soft budget to off.
77
114
 
78
115
  ## Canvas and operations
79
116
 
80
- The left-to-right overview groups Plan/decomposition, scheduling, task branches, integration/final checks and PR/Merge. Selecting a node opens view-local Progress, Sessions and Run configuration details. Open task workflow drills into Execute, L1, Review and Git delivery; integration and remote delivery groups also expand. Colors have text labels. Identity, project/worktree, branch, HEAD, run ID, bindings and evidence come from actual receipts.
117
+ The left-to-right overview groups Plan/decomposition, scheduling, task branches, integration/final checks and PR/Merge. Selecting a node directly shows its outcome, actions, configuration snapshot and actual role-session facts. Evidence and managed session interaction have separate explicit destinations. Open task workflow drills into Execute, L1, Review and Git delivery; integration can be inspected separately, while PR and Merge are separate nodes. Colors have text labels. Identity, project/worktree, branch, HEAD, run ID, bindings and evidence come from actual receipts.
81
118
 
82
119
  The canvas uses the available plugin width, with two-axis panning, zoom, fit width, current-step location, paging and a list alternative. New snapshots preserve the viewport and selection; location can switch to the running packet's page. Large tasks use bounded excerpts. Read full node evidence loads one packet with a matching fresh revision; it never changes the ledger.
83
120
 
84
121
  Focus canvas expands the view in a plugin-owned native dialog. Exit or Escape returns without starting or stopping the task. It does not change the DSH global layout or composer. Unknown operation outcomes exit focus mode so the original-invocation reconciliation action remains visible.
85
122
 
86
- Node operation confirmation freezes the observed revision; a changed snapshot invalidates it. Retry once requires a reason, while reopening a completed packet explains evidence invalidation. Review cannot run with a red current L1. Unqueried remote state, closed PR and merged PR remain distinct.
123
+ Ordinary node operations dispatch once with the observed revision. Repair and retry records the explicit console action and adds one Execute/L1 attempt, without inventing an explanation for the failure. Reopening a completed packet still requires a reason and confirmation of downstream evidence invalidation; a changed revision invalidates that confirmation. Review cannot run with a red current L1. Unqueried remote state, closed PR and merged PR remain distinct.
87
124
 
88
125
  - Run stage submits the observed revision for lease-bound admission.
89
- - Continue once records a reason and adds one Execute/L1 attempt without resetting failures or billing.
126
+ - Repair and retry records the explicit console action and adds one Execute/L1 attempt without resetting failures or billing.
90
127
  - Reopening a completed packet archives old evidence and invalidates downstream acceptance.
91
128
  - Git delivery requires current L1 and independent Review evidence.
92
129
  - Final acceptance runs milestone gates and Judge without starting Plan or unfinished execution units.
@@ -102,7 +139,7 @@ Explicitly independent packets with satisfied dependencies can be run ahead in t
102
139
  Read `flywheel template scheduler-policy.schema.json` for the current fields and bounds. For example:
103
140
 
104
141
  ```json
105
- {"scheduler":{"mode":"parallel","max-parallel":2,"providers":{"deepseek-account":1}}}
142
+ {"scheduler":{"mode":"parallel","max-parallel":2,"providers":{"deepseek-account":1},"dispatch":"batch","prewarm":false}}
106
143
  ```
107
144
 
108
145
  Provider-limit keys are actual configuration channel names. The example uses the inline template's `deepseek-account`; a binding using `deepseek-account-sdk` needs that key instead. Eligibility comes from frozen packet contracts:
@@ -115,6 +152,23 @@ schedule:
115
152
 
116
153
  Dependencies reference earlier known packet IDs. Writes are normalized relative paths or directory prefixes, without globs or escapes. Include ordinary tests/configuration and account for shared test resources. Undeclared independence, overlapping scopes and live-credential units remain serial.
117
154
 
155
+ ### Dispatch and runtime preparation
156
+
157
+ The configuration editor also offers `scheduler.dispatch` and `scheduler.prewarm`.
158
+ The defaults are `batch` and false. Selecting `ready-queue` fills a free Execute/L1
159
+ slot from the remaining independent Full packets when automatic Worktree management
160
+ is enabled and the parallel limit exceeds one. Review, replanning and integration
161
+ retain the all-workers-settled barrier. Shared-checkout runs keep batch dispatch.
162
+
163
+ Prewarming initializes one DSH Review runtime while a serial packet performs its
164
+ post-Execute deterministic checks. It sends no model prompt until normal Review
165
+ admission. Parallel Execute/L1 lanes and shared candidates do not prewarm; an
166
+ independent cohort must settle before its serial Review path may prepare a runtime.
167
+ Other harnesses use the cold path. Unused runtimes must finish bounded cleanup.
168
+ Neither setting changes JEV activation, task qualification or completion gates.
169
+ Saving takes effect on the next start. See [Configuration](configuration.md#ready-queues-and-runtime-preparation)
170
+ for eligibility, recovery and the separate live-performance evaluation.
171
+
118
172
  ### Execution directories
119
173
 
120
174
  Configuration → Workflow policy → Automatically manage task Worktrees is on by default (`worktree.enabled`). It controls automatic directory creation/management independently from parallel scheduling. The installation default allows parallel execution with a limit of two; existing complete files without `scheduler` remain serial, as do explicit serial settings. Parallel automatic management requires isolated worktrees and stops if creation fails; the legacy serial path can record an in-place fallback. With automatic management off, tasks may run concurrently in the task checkout or choose their own Worktrees. Shared directories do not provide file isolation: write-scope conflicts, candidate drift and failed acceptance still stop progress.
@@ -144,13 +198,23 @@ Each terminal line is a prompt. `/history` reads the latest response; `/reconcil
144
198
 
145
199
  Returning runs L1, applicable Quick gates and independent Review. Human text is not a passing verdict. Candidate-bound human-takeover evidence allows normal subsequent delivery. Release does not claim verification and cannot bypass unknown effects or cleanup. Milestone sessions currently expose read-only responses; interactive handoff is packet-scoped.
146
200
 
147
- Ledger storage v2 is accepted by the new engine alongside legacy v1. Older engines reject v2 rather than ignoring human ownership. Session policy-version remains 1; worker/lifecycle versions are independent.
201
+ This return path requires an existing eligible managed session. It does not import
202
+ an arbitrary patch prepared before the task, and running Verify followed by Review
203
+ does not create that provenance. A general existing-candidate admission interface
204
+ remains separate work.
205
+
206
+ The engine accepts session ledger storage versions 1, 2 and 3. Human handoff
207
+ requires at least v2; the first runtime prewarm records v3 so older engines reject
208
+ cleanup responsibilities they cannot interpret. Later handoffs retain v3.
209
+ Session policy-version remains 1; worker/lifecycle versions are independent.
210
+ [Recovery](session-recovery.md#dsh-runtime-preparation-after-a-restart) explains the
211
+ original cleanup receipt required after an interrupted preparation.
148
212
 
149
213
  ## Discovery and comparison
150
214
 
151
215
  CLI and desktop starts register run IDs. A conversation retains multiple confirmed task associations. The index lives in `runs/` beside the global configuration, optionally overridden by absolute `FLYWHEEL_RUNS_DIR`. It shows the latest 100 registrations and never scans the disk. Query Go again for liveness.
152
216
 
153
- Run history uses a selection list with adjacent details for operation kind, branch, HEAD, contract/configuration conditions, elapsed time and newly observed attempts, failures and deliveries. Selecting a record does not launch it; opening its canvas refreshes current Go state. Metrics scope chooses the selected run or all calls for its task, including legacy observations. The reference compares conditions without changing the metrics target. Invocation/receipt reconciliation precedes aggregation; late receipts keep their original attribution and are not double-billed. A group with entirely missing cost shows Not reported, not $0.
217
+ Run history is limited to the currently associated task and uses a selection list with adjacent details for operation kind, branch, HEAD, contract/configuration conditions, elapsed time and newly observed attempts, failures and deliveries. Selecting a record does not launch it; opening its canvas refreshes current Go state. Metrics scope chooses the selected run or all calls for its task, including legacy observations. The reference compares conditions without changing the metrics target. Invocation/receipt reconciliation precedes aggregation; late receipts keep their original attribution and are not double-billed. A group with entirely missing cost shows Not reported, not $0.
154
218
 
155
219
  Usage, cost and duration are known amounts, with missing/partial observations retained. Costs may include estimates from configured prices. Call failure rate is not code quality. Different conditions permit descriptive comparison only; quality conclusions require acceptance evidence and an independent oracle.
156
220