@sublang/playbook 7.0.0 → 9.0.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 (62) hide show
  1. package/README.md +20 -7
  2. package/docs/cli.md +88 -43
  3. package/docs/configuration.md +221 -119
  4. package/docs/embedding.md +78 -27
  5. package/package.json +4 -3
  6. package/reference/sdlc/captain.playbook/captain.playbook.js +16 -5
  7. package/reference/sdlc/captain.playbook/captain.playbook.ts +20 -6
  8. package/reference/sdlc/code.md +1 -1
  9. package/reference/sdlc/code.playbook/bin/interactive-session.js +816 -0
  10. package/reference/sdlc/code.playbook/bin/launch-config.js +1078 -116
  11. package/reference/sdlc/code.playbook/bin/playbook.js +489 -34
  12. package/reference/sdlc/code.playbook/bin/run.js +283 -298
  13. package/reference/sdlc/code.playbook/bin/session-store.js +818 -26
  14. package/reference/sdlc/code.playbook/code.fsm.d.ts +9 -6
  15. package/reference/sdlc/code.playbook/code.fsm.introspect.js +2 -2
  16. package/reference/sdlc/code.playbook/code.fsm.introspect.ts +2 -2
  17. package/reference/sdlc/code.playbook/code.fsm.js +18 -15
  18. package/reference/sdlc/code.playbook/code.fsm.ts +21 -21
  19. package/reference/sdlc/code.playbook/code.gears.md +1 -1
  20. package/reference/sdlc/code.playbook/code.playbook.d.ts +2 -1
  21. package/reference/sdlc/code.playbook/code.playbook.js +25 -15
  22. package/reference/sdlc/code.playbook/code.playbook.ts +34 -17
  23. package/reference/sdlc/code.playbook/code.registry.d.ts +5 -13
  24. package/reference/sdlc/code.playbook/code.registry.js +3 -10
  25. package/reference/sdlc/code.playbook/code.registry.ts +7 -32
  26. package/reference/sdlc/code.playbook/playbook-captain.d.ts +39 -14
  27. package/reference/sdlc/code.playbook/playbook-captain.js +1014 -299
  28. package/reference/sdlc/code.playbook/playbook-captain.ts +1450 -406
  29. package/reference/sdlc/code.playbook/playbook.config.template.yaml +41 -49
  30. package/reference/sdlc/decide.md +4 -4
  31. package/reference/sdlc/decide.playbook/decide.fsm.d.ts +10 -10
  32. package/reference/sdlc/decide.playbook/decide.fsm.js +21 -14
  33. package/reference/sdlc/decide.playbook/decide.fsm.ts +27 -23
  34. package/reference/sdlc/decide.playbook/decide.gears.md +3 -5
  35. package/reference/sdlc/decide.playbook/decide.playbook.d.ts +11 -13
  36. package/reference/sdlc/decide.playbook/decide.playbook.js +465 -246
  37. package/reference/sdlc/decide.playbook/decide.playbook.ts +623 -283
  38. package/reference/sdlc/decide.playbook/decide.registry.d.ts +5 -13
  39. package/reference/sdlc/decide.playbook/decide.registry.js +3 -9
  40. package/reference/sdlc/decide.playbook/decide.registry.ts +7 -31
  41. package/reference/sdlc/review.md +4 -5
  42. package/reference/sdlc/review.playbook/review.fsm.d.ts +9 -11
  43. package/reference/sdlc/review.playbook/review.fsm.js +30 -24
  44. package/reference/sdlc/review.playbook/review.fsm.ts +39 -35
  45. package/reference/sdlc/review.playbook/review.gears.md +6 -5
  46. package/reference/sdlc/review.playbook/review.playbook.d.ts +2 -1
  47. package/reference/sdlc/review.playbook/review.playbook.js +29 -23
  48. package/reference/sdlc/review.playbook/review.playbook.ts +38 -28
  49. package/reference/sdlc/review.playbook/review.registry.d.ts +5 -13
  50. package/reference/sdlc/review.playbook/review.registry.js +3 -16
  51. package/reference/sdlc/review.playbook/review.registry.ts +7 -38
  52. package/slc/gears2fsm.md +45 -24
  53. package/slc/link.md +297 -135
  54. package/slc/text2gears.md +19 -18
  55. package/src/runtime.d.ts +21 -16
  56. package/src/runtime.ts +20 -23
  57. package/src/xstate-playbook-runtime.d.ts +34 -20
  58. package/src/xstate-playbook-runtime.js +973 -400
  59. package/src/xstate-playbook-runtime.ts +1203 -457
  60. package/src/xstate-runtime.d.ts +17 -7
  61. package/src/xstate-runtime.js +198 -81
  62. package/src/xstate-runtime.ts +339 -112
package/README.md CHANGED
@@ -19,7 +19,11 @@ SubLang Playbook addresses both:
19
19
 
20
20
  ![Venn diagram: Skill is flexible, Workflow is deterministic, and Playbook sits in the intersection as both.](docs/assets/playbook-venn.svg)
21
21
 
22
- Vocabulary: the **Boss** is you; the **Captain** is the coordinating agent you talk to; **players** are the agents a playbook delegates work to.
22
+ Vocabulary: the **Boss** is you; the **Captain** is the coordinating agent you
23
+ talk to; a **role** is a playbook-local job such as `coder`; and a **player** is
24
+ a stable Captain-session agent and provider conversation to which one or more
25
+ roles bind. Roles describe the workflow, while player IDs decide which work
26
+ shares conversation continuity.
23
27
 
24
28
  Run `playbook` for an interactive tmux UI powered by [cligent](https://github.com/sublang-ai/cligent), or `playbook run` for the same Captain session without tmux in scripts and CI.
25
29
 
@@ -28,7 +32,10 @@ Run `playbook` for an interactive tmux UI powered by [cligent](https://github.co
28
32
  Out of the box, Playbook includes **CODE** for implementation, **REVIEW** for commit-based review and fixes, and **DECIDE** for independently proposed and reviewed specification decisions.
29
33
  CODE and DECIDE call REVIEW as a nested playbook.
30
34
 
31
- The shared starter config uses Claude as both Captain and Coder, and Codex as Reviewer.
35
+ The shared starter config uses Claude as both Captain and the `dev.coder`
36
+ player, and Codex as `dev.reviewer`. CODE, REVIEW, and DECIDE bind their local
37
+ roles explicitly to those two stable players, so nested and later engagements
38
+ share a conversation only where their bindings name the same player ID.
32
39
 
33
40
  ```sh
34
41
  npm install -g @sublang/playbook
@@ -44,7 +51,7 @@ Prerequisites:
44
51
  - Authenticated [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) or `ANTHROPIC_API_KEY`
45
52
  - Authenticated [Codex CLI](https://github.com/openai/codex) or `OPENAI_API_KEY`
46
53
 
47
- Interactive `playbook` additionally needs `tmux` and [`glow`](https://github.com/charmbracelet/glow#installation) on `PATH`; headless `playbook run` does not.
54
+ Interactive `playbook` additionally needs tmux 3.3 or newer and [`glow`](https://github.com/charmbracelet/glow#installation) on `PATH`; headless `playbook run` does not.
48
55
 
49
56
  CODE works in the current directory and can edit and commit autonomously, so use a clean branch or worktree.
50
57
 
@@ -58,17 +65,23 @@ Type a task, enter `/code <task>` for implementation, or enter
58
65
 
59
66
  On first launch, Playbook writes its config to `${XDG_CONFIG_HOME:-$HOME/.config}/playbook/playbook.config.yaml`.
60
67
 
61
- The same config, compiled Captain, enabled playbooks, players, and nested calls power headless turns.
68
+ The same config, compiled Captain, enabled playbooks, stable players, and
69
+ nested calls power headless turns. Both front ends create the same durable
70
+ logical session: copy the reported session ID to reopen an interactive session
71
+ headlessly or a headless session interactively.
62
72
  Run REVIEW explicitly, or pipe a longer request to Captain:
63
73
 
64
74
  ```sh
65
75
  playbook run "/review review the latest commit"
66
76
  printf '%s\n' 'Implement the approved specification, then review it.' | playbook run
77
+ # Later, either presentation can reopen the returned/reported session id:
78
+ playbook --session 4f2c0000-0000-4000-8000-000000009ab1
79
+ playbook run --session 4f2c0000-0000-4000-8000-000000009ab1 "continue"
67
80
  ```
68
81
 
69
82
  `playbook run` prints the one Boss-visible Captain reply to stdout and operational status to stderr; CODE and DECIDE can complete their nested REVIEW calls there too.
70
83
 
71
- See [Using the CLI](docs/cli.md) for flags and durable continuation, [Configuring agents](docs/configuration.md) for the shared lineup, [Embedding](docs/embedding.md) for custom hosts, and the [changelog](CHANGELOG.md) for releases.
84
+ See [Using the CLI](docs/cli.md) for flags and durable continuation, [Configuring agents](docs/configuration.md) for the shared lineup, [Embedding](docs/embedding.md) for custom hosts, and the [changelog](https://github.com/sublang-ai/playbook/blob/main/CHANGELOG.md) for releases.
72
85
 
73
86
  ## Create your own playbook
74
87
 
@@ -116,8 +129,8 @@ pnpm playbook # drive a Boss turn against the source tree
116
129
  ```
117
130
 
118
131
  Playbook is itself spec-driven: the compiler phases are specs in [`slc/`](slc), and the reference playbooks are regenerated from their prose sources.
119
- Edit a source, regenerate its GEARS, FSM, and runtime artifacts, sync the tests and downstream specs until `pnpm test` passes, and commit with co-author trailers per [`specs/packages/git.md`](specs/packages/git.md).
120
- The gears↔FSM contract ([the playbook package](specs/packages/playbook.md)) and runtime contract ([the playbook-runtime package](specs/packages/playbook-runtime.md)) are pinned in [`specs/packages/`](specs/packages) and verified by the test suite.
132
+ Edit a source, regenerate its GEARS, FSM, and runtime artifacts, sync the tests and downstream specs until `pnpm test` passes, and commit with co-author trailers per [`specs/packages/git.md`](https://github.com/sublang-ai/playbook/blob/main/specs/packages/git.md).
133
+ The gears↔FSM contract ([the playbook package](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook.md)) and runtime contract ([the playbook-runtime package](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-runtime.md)) are pinned in [`specs/packages/`](https://github.com/sublang-ai/playbook/tree/main/specs/packages) and verified by the test suite.
121
134
 
122
135
  ## License
123
136
 
package/docs/cli.md CHANGED
@@ -8,6 +8,9 @@ interactive tmux-play UI and a headless `playbook run` turn for scripts and
8
8
  CI. Both use the same compiled Captain, enabled catalog, players, nested
9
9
  stack, and [config](configuration.md); only presentation differs.
10
10
 
11
+ The interactive form requires tmux 3.3 or newer and `glow` on `PATH`;
12
+ the headless form requires neither presentation tool.
13
+
11
14
  ## Installing agent SDKs
12
15
 
13
16
  Each adapter is backed by a vendor runtime that installing
@@ -15,7 +18,7 @@ Each adapter is backed by a vendor runtime that installing
15
18
  agent stack you did not ask for. Which versions each adapter supports
16
19
  is [cligent](https://github.com/sublang-ai/cligent)'s knowledge and
17
20
  ships with it
18
- ([DR-027](../specs/decisions/027-runtime-compatibility-from-cligent.md));
21
+ ([DR-027](https://github.com/sublang-ai/playbook/blob/main/specs/decisions/027-runtime-compatibility-from-cligent.md));
19
22
  the commands below install the latest, which cligent accepts from its
20
23
  supported floor up. Install the SDKs your config names, each as its
21
24
  own top-level install root:
@@ -42,7 +45,7 @@ finds a bare specifier by walking *up* from there — which reaches the
42
45
  install prefix's own `node_modules`, but never into a sibling package's
43
46
  subtree. An SDK that landed inside some other package is invisible to
44
47
  the adapter even though it is on disk
45
- ([DR-026](../specs/decisions/026-optional-adapter-sdks.md)).
48
+ ([DR-026](https://github.com/sublang-ai/playbook/blob/main/specs/decisions/026-optional-adapter-sdks.md)).
46
49
 
47
50
  Both surfaces check this before doing any work: a declared adapter
48
51
  whose runtime is not loadable — or is installed below the version
@@ -51,14 +54,16 @@ runtime is reported as not installed; a stale one with its installed
51
54
  and required versions, never as absent. Either way the remedy printed
52
55
  is cligent's pinned install, `npm install -g <package>@<version>`, so
53
56
  following it cannot install a version the gate refuses again
54
- ([[playbook-cli-40](../specs/packages/playbook-cli.md#playbook-cli-40)]).
57
+ ([[playbook-cli-40](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-cli.md#playbook-cli-40)]).
55
58
 
56
59
  ## Interactive
57
60
 
58
61
  ```sh
59
- playbook # launch the configured playbooks in tmux-play
60
- playbook --list # ids, slash commands, and intents; no launch
61
- playbook --help # config path, auth pointers, agent-swap recipe
62
+ playbook # fresh durable session in this directory
63
+ playbook --cwd /path/to/repo # fresh session in an explicit directory
64
+ playbook --session <id> # reopen either front end's settled session
65
+ playbook --list # ids, slash commands, and intents; no launch
66
+ playbook --help # config path, auth pointers, binding recipe
62
67
  ```
63
68
 
64
69
  Without a global install, `npx` runs the same bin — but name each
@@ -78,12 +83,23 @@ already present, since each distinct package set is a distinct tree —
78
83
  and replaying your original arguments, so the printed command works in
79
84
  one hop.
80
85
 
81
- The command resolves its config (seeding it on first run), composes a
82
- `tmux-play` config, checks adapter readiness, and launches. It exits
83
- with tmux-play's status, re-raises a terminating signal on itself, and
84
- exits `127` when it cannot launch at all
85
- ([[playbook-cli-1](../specs/packages/playbook-cli.md#playbook-cli-1)],
86
- [[playbook-cli-2](../specs/packages/playbook-cli.md#playbook-cli-2)]).
86
+ For a managed launch, the outer command resolves current config (seeding it on
87
+ first use), prepares the complete stored catalog and presenter, waits for the
88
+ pane child to acquire the session lease and publish its settled turn-zero
89
+ record, prints the verified session ID, and then attaches. A normal outer
90
+ detach exits `0`; the pane child keeps owning the durable session and accepting
91
+ turns until it shuts down. Preparation, attachment, or required cleanup
92
+ failure prints its diagnostics and exits nonzero.
93
+
94
+ Before native-client hand-off, SIGHUP, SIGINT, or SIGTERM aborts activation,
95
+ joins the child, retires the lease, and only then re-raises the signal. At the
96
+ synchronous native-client hand-off, ownership transfers before tmux starts, so
97
+ later signals use native client detach or termination semantics and do not
98
+ retire the pane child's session. Only `--config` and composed
99
+ `--theme-diagnostics` use the stock subprocess boundary: those forms mirror
100
+ its exit status or signal and exit `127` when it cannot be spawned
101
+ ([[playbook-cli-1](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-cli.md#playbook-cli-1)],
102
+ [[playbook-cli-2](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-cli.md#playbook-cli-2)]).
87
103
 
88
104
  ### Running a Boss turn
89
105
 
@@ -102,27 +118,29 @@ currently offers. It never does the specialized work itself, and a
102
118
  conversational turn — including a progress or status question — leaves
103
119
  the engagement, its parked state, and any pending player question
104
120
  untouched
105
- ([[playbook-captain-1](../specs/packages/playbook-captain.md#playbook-captain-1)],
106
- [[playbook-captain-2](../specs/packages/playbook-captain.md#playbook-captain-2)]).
121
+ ([[playbook-captain-1](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-captain.md#playbook-captain-1)],
122
+ [[playbook-captain-2](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-captain.md#playbook-captain-2)]).
107
123
 
108
124
  The current CODE, REVIEW, and DECIDE workflows take their deterministic
109
- initial event from the selecting Boss turn. CODE and DECIDE then call
110
- REVIEW as a nested playbook: an exact same-name child role continues the
111
- ancestor's player pane and backend conversation, while any additional
112
- role uses REVIEW's configured fallback. When a player surfaces a
125
+ initial event from the selecting Boss turn. CODE and DECIDE then call REVIEW
126
+ as a nested playbook. Local role names do not imply continuity: each frame
127
+ uses the exact stable player IDs configured under its `roles` map. Equal IDs
128
+ share one pane and provider conversation across nested and later root
129
+ engagements; distinct IDs remain isolated even when their agent settings are
130
+ identical. When a player surfaces a
113
131
  clarifying question the FSM parks, the pane shows the question, and a
114
132
  judge classifies your next turn as its reply or a fresh directive that
115
133
  abandons it
116
- ([[playbook-runtime-2](../specs/packages/playbook-runtime.md#playbook-runtime-2)]).
134
+ ([[playbook-runtime-2](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-runtime.md#playbook-runtime-2)]).
117
135
 
118
136
  The Captain pane shows start/stop/finished status with `◇` lines and
119
137
  streams progress with captain-speech classification and questions
120
- ([[playbook-runtime-3](../specs/packages/playbook-runtime.md#playbook-runtime-3)]), while player
138
+ ([[playbook-runtime-3](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-runtime.md#playbook-runtime-3)]), while player
121
139
  prompts ride their own panes. A turn that actually did something ends
122
140
  with one Captain reply summarizing what changed, composed only from that
123
141
  turn's reported outcome; a turn that changed nothing ends with an
124
142
  ordinary reply and no saved-counts line
125
- ([[playbook-captain-19](../specs/packages/playbook-captain.md#playbook-captain-19)]).
143
+ ([[playbook-captain-19](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-captain.md#playbook-captain-19)]).
126
144
 
127
145
  ## Headless
128
146
 
@@ -147,7 +165,7 @@ stderr, and `--verbose` adds only telemetry topic names to stderr.
147
165
 
148
166
  | Flag | Meaning |
149
167
  | --- | --- |
150
- | `--with <path>` | overlay the shared config for a new session; repeatable |
168
+ | `--with <path>` | overlay current config for a fresh session or compatible ordinary reopen; repeatable |
151
169
  | `--no-provision` | do not create missing engine links for configured filesystem registries |
152
170
  | `--json` | print exactly one `sessionId` / `reply` object |
153
171
  | `--verbose` | add Captain telemetry topic names to stderr |
@@ -164,13 +182,18 @@ Captain reply. Argument, config, catalog, readiness, or pre-turn setup errors
164
182
  exit `1`; a started-turn, persistence, lease-release, or presentation failure
165
183
  exits `2` with stdout empty. SIGINT, SIGTERM, and SIGHUP preserve the
166
184
  uncertain boundary, withhold stdout, and are re-raised after lease retirement
167
- ([[playbook-cli-18](../specs/packages/playbook-cli.md#playbook-cli-18)]).
185
+ ([[playbook-cli-18](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-cli.md#playbook-cli-18)]).
168
186
 
169
187
  The former positional `<from>`, `resume`, `--player`, `--captain`,
170
188
  `--option`, `--cwd`, `--last`, run-only `--config`, and top-level `run:`
171
- config are removed. Enable a registry under `playbooks`, tune its inline
172
- agents and options there or in a fresh `--with` overlay, invoke its effective
173
- `/command`, and run from the working directory you want agents to use.
189
+ config are removed from `playbook run`. Enable a registry under `playbooks`,
190
+ declare provider agents once under top-level `players`, bind every local role
191
+ under `playbooks.<id>.roles`, tune compatible model and effort in a `--with`
192
+ overlay, invoke the effective `/command`, and run from the working directory
193
+ you want agents to use. Legacy `playbooks.<id>.players` blocks are rejected and
194
+ are not auto-migrated because choosing equal or distinct new player IDs chooses
195
+ conversation sharing or isolation; see [Migrating per-playbook
196
+ players](configuration.md#migrating-per-playbook-players).
174
197
 
175
198
  ### Piping a Spex update prompt
176
199
 
@@ -198,8 +221,8 @@ the primary config file. Before either front end imports a configured
198
221
  filesystem registry, the shared launcher checks whether that module can
199
222
  resolve `xstate` and `@sublang/playbook/xstate-runtime`. When needed, it
200
223
  creates engine symlinks beside the module and prints one provisioning line
201
- ([[playbook-cli-36](../specs/packages/playbook-cli.md#playbook-cli-36)],
202
- [DR-024](../specs/decisions/024-runtime-engine-provisioning.md)).
224
+ ([[playbook-cli-36](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-cli.md#playbook-cli-36)],
225
+ [DR-024](https://github.com/sublang-ai/playbook/blob/main/specs/decisions/024-runtime-engine-provisioning.md)).
203
226
 
204
227
  A directory where both imports already resolve is untouched, and
205
228
  `--no-provision` disables new links for either fresh front end. If the
@@ -208,23 +231,38 @@ module's directory is a git repository, add `node_modules/` to its
208
231
 
209
232
  ### Continuing a Captain session
210
233
 
211
- Every successfully presented headless turn is stored under
212
- `${XDG_STATE_HOME:-$HOME/.local/state}/playbook/sessions/` before stdout.
213
- Continue the newest logical session, or select the id returned by `--json`:
234
+ Interactive and headless commands write the same logical-session records under
235
+ `${XDG_STATE_HOME:-$HOME/.local/state}/playbook/sessions/`. A fresh interactive
236
+ child persists turn zero before printing `playbook: session <id>` and opening
237
+ Boss input; a fresh headless turn returns the same kind of ID in `--json`.
238
+ After the current writer exits or explicitly hands off, either presentation
239
+ can reopen either origin:
214
240
 
215
241
  ```sh
242
+ # Reopen the latest settled session headlessly:
216
243
  playbook run --continue "keep the scope small; skip the docs"
244
+
245
+ # Reopen one exact session in either presentation:
246
+ playbook --session 4f2c0000-0000-4000-8000-000000009ab1
217
247
  playbook run --session 4f2c0000-0000-4000-8000-000000009ab1
218
248
  ```
219
249
 
220
- A missing reply is read verbatim from stdin. Continuation restores the exact
250
+ A missing headless reply is read verbatim from stdin. Reopening restores the
221
251
  compiled Captain conversation, engagement stack, nested child boundary,
222
- mapped-player conversations, normalized execution config, and absolute
223
- working directory. It does not reread current config, does not repeat a
224
- settled or pending child start, and rejects `--with` because an existing
225
- session's lineup is frozen
226
- ([[playbook-cli-22](../specs/packages/playbook-cli.md#playbook-cli-22)],
227
- [DR-031](../specs/decisions/031-shared-captain-session-front-ends.md)).
252
+ stable-player ledger, and absolute working directory without replaying a
253
+ settled or pending child start. One exclusive writer owns the session, so a
254
+ detached interactive pane child remains the owner until it shuts down; a
255
+ competing front end fails closed instead of forking the history.
256
+
257
+ An ordinary reopen reads current config and any opening `--with` fragments,
258
+ projects them to the stored catalog and player roster, and requires the stored
259
+ role bindings plus every structural setting to remain exact. Compatible
260
+ current `model` and `effort` selections apply to the next call, including an
261
+ explicit boolean `false` provider-default reset. The retained provider token
262
+ is never silently replaced by a fresh conversation if that selection is not
263
+ supported
264
+ ([[playbook-cli-22](https://github.com/sublang-ai/playbook/blob/main/specs/packages/playbook-cli.md#playbook-cli-22)],
265
+ [DR-032](https://github.com/sublang-ai/playbook/blob/main/specs/decisions/032-explicit-roles-session-players.md)).
228
266
 
229
267
  ### Recovering an uncertain turn
230
268
 
@@ -238,8 +276,15 @@ playbook run --session 4f2c0000-0000-4000-8000-000000009ab1 --retry-uncertain
238
276
  playbook run --session 4f2c0000-0000-4000-8000-000000009ab1 --discard-uncertain
239
277
  ```
240
278
 
241
- Retry reads no input and reuses the byte-exact recorded turn; it may duplicate
242
- external effects. Discard reads no input and runs no model: it restores the
243
- exact prior settled boundary, or deletes a never-settled fresh session, while
244
- abandoning the attempted work. Session files written by the removed direct
245
- v6 runner are not shared-Captain sessions and cannot be continued.
279
+ Retry reads no input and reuses the byte-exact recorded turn and its exact
280
+ attempted Captain, player, and per-role model/effort selections; current config
281
+ cannot retune that attempt, and retry may duplicate external effects. Discard
282
+ reads no input and runs no model: it restores the exact prior settled boundary,
283
+ or deletes a never-settled fresh session, while abandoning the attempted work.
284
+ An interrupted interactive turn uses the same uncertain record and is
285
+ recovered with these headless commands. Session files written by the removed
286
+ direct v6 runner and legacy record schemas are not shared schema-3 Captain
287
+ sessions and cannot be continued. Explicit selection rejects them. Implicit
288
+ `--continue` reports and skips released schema-2 Captain records, naming each
289
+ session and path; move them outside the sessions directory or remove them to
290
+ silence the warning. Malformed records and unknown schemas still fail closed.