@assuredloop/orca-bot-kit 0.26.1 → 0.28.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.
package/README.md CHANGED
@@ -141,19 +141,41 @@ words, `dangerously-skip`
141
141
  ([ADR 0015](docs/adr/0015-three-approval-levels-auto-by-default.md)). Only
142
142
  `obk permission approval` changes it, after your yes: `session add` and
143
143
  `session change` take no approval, and refuse an extra argument that sets one
144
- ([ADR 0041](docs/adr/0041-permission-changes-and-risky-operations-have-commands-of-their-own.md)).
144
+ ([ADR 0051](docs/adr/0051-permission-changes-and-risky-operations-have-commands-of-their-own.md))
145
+ or that widens what the session may write or run, such as `--add-dir`, Claude
146
+ Code's `--settings` or Codex's `--profile`. On Codex, `-c` passes only for a
147
+ short list of keys known to be safe, such as `model_reasoning_effort`
148
+ ([ADR 0049](docs/adr/0049-extra-arguments-that-widen-a-session-are-refused.md)).
149
+ A Codex session's work dir stays in its bot folder: Codex may write in its work
150
+ dir, so `session add` and `session change` refuse one outside the bot folder for
151
+ a Codex session
152
+ ([ADR 0045](docs/adr/0045-a-codex-sessions-work-dir-stays-in-its-bot-folder.md)).
153
+
154
+ A bot or a session can also run on [Pi](https://pi.dev) (`--harness pi`, tested
155
+ with Pi 1.1.0). Pi asks before no tool call, so a Pi session is always
156
+ `dangerously-skip`, and the kit refuses `auto` and `ask` for it. Sign in to Pi
157
+ yourself first: `obk up` asks Pi which models it can use, and starts nothing
158
+ when Pi has none, or not the one the session names. The kit gives a Pi session
159
+ its id, so `obk up` resumes it after its tab is closed. Pi has no context
160
+ setting: name a model that carries it. Mail, temporary sessions, skills and
161
+ health for a Pi session come later, and so do `obk init --harness pi` and
162
+ `obk session clear` and `compact` on Pi.
145
163
 
146
164
  Every bot gets the kit's default permission rules, written by the kit with
147
165
  nobody asked: its own commands for this bots folder, reading a long message,
148
- `git add` and `git commit`, and Orca's `orca orchestration check --run`
149
- ([ADR 0036](docs/adr/0036-the-kit-writes-every-bots-default-permission-rules.md)).
150
- `obk permission`, `obk retire`, `obk pause`, `obk restart`, `obk bot create`
151
- and `obk init` are not in the set, and keep your yes
152
- ([ADR 0041](docs/adr/0041-permission-changes-and-risky-operations-have-commands-of-their-own.md)).
166
+ `git add` and `git commit`
167
+ ([ADR 0050](docs/adr/0050-the-kit-writes-every-bots-default-permission-rules.md)).
168
+ `obk permission`, `obk retire`, `obk pause`, `obk restart`, `obk bot create`,
169
+ `obk bot change`, `obk session add`, `obk session change` and `obk init` are
170
+ not in the set, and keep your yes
171
+ ([ADR 0051](docs/adr/0051-permission-changes-and-risky-operations-have-commands-of-their-own.md)).
153
172
  A rule beyond the set is written by `obk permission allow`, after your yes to
154
- the exact rule. A bot that still holds the `obk restart` or `obk bot create`
155
- rule, which kit 0.26.0 gave every bot, keeps it: `obk rules build` and `obk up`
156
- name it, with the `obk permission disallow` command that takes it back.
173
+ the exact rule. A bot that still holds a rule that the kit gave every bot
174
+ before and that is no longer in the set keeps it: the rule of `obk restart`,
175
+ `obk bot create`, `obk bot change`, `obk session add`, `obk session change`,
176
+ `obk session mail` or `obk session nudge`, or of Orca's
177
+ `orca orchestration check --run`. `obk rules build` and `obk up` name it, with
178
+ the `obk permission disallow` command that takes it back.
157
179
 
158
180
  Neither command touches Orca. `obk up` is what makes it all real there: an Orca
159
181
  project per bot, a tab per session, each started at the bot home with its own
@@ -365,19 +387,6 @@ address that is none of your bots folder's sessions, the hook tells it so, and
365
387
  names the address `obk message to` would have given. The message goes either
366
388
  way ([ADR 0032](docs/adr/0032-a-native-message-outside-the-fleet-is-warned-about.md)).
367
389
 
368
- And a third: at the end of each turn, it tells the session once about fleet
369
- mail the kit sent it that is still unread, without typing into its tab
370
- ([ADR 0035](docs/adr/0035-messaging-transport.md)). It asks Orca only when the kit
371
- knows of mail for that session.
372
-
373
- A Codex bot gets one more hook too. Inside Codex's sandbox the kit cannot always
374
- tell whether the receiver of a message has its harness in front, as for a Claude
375
- session busy running a command, so `obk message send` leaves that nudge, and the
376
- hook, which Codex runs outside its sandbox right after the command, decides it and
377
- types it, or says why not ([ADR 0034](docs/adr/0034-orca-is-the-host.md)). Codex
378
- asks you to trust a hook it has not seen before, so a Codex bot made before this
379
- hook asks again once.
380
-
381
390
  So: kill a tab, or reboot, and `obk up` brings the session back with the
382
391
  conversation it was having, rather than starting a new one. Clear a session —
383
392
  `/clear` on Claude Code, `/new` on Codex — and the kit writes down the new id,
@@ -464,6 +473,7 @@ obk permission disallow --bots /path/to/my-bots --bot api-bot --rule 'Bash(gh pr
464
473
  obk permission approval --bots /path/to/my-bots --bot api-bot --session daily --approval ask
465
474
  obk permission approval --bots /path/to/my-bots --bot api-bot --temps --approval dangerously-skip
466
475
  obk session change --bots /path/to/my-bots --bot api-bot --session daily --model opus
476
+ obk session change --bots /path/to/my-bots --bot bot-father --session daily --harness codex
467
477
  obk skills remove --bots /path/to/my-bots --bot api-bot --skill kit:obk-tdd
468
478
  obk pause --bots /path/to/my-bots --bot api-bot [--session daily]
469
479
  obk unpause --bots /path/to/my-bots --bot api-bot [--session daily]
@@ -471,13 +481,21 @@ obk retire --bots /path/to/my-bots --bot api-bot [--session daily]
471
481
  ```
472
482
 
473
483
  A change to a charter or a setting is written at once, and a running session
474
- takes it when it next starts. A session keeps its harness: to move one, retire
475
- it and add another. A pause closes the tabs the way a restart does, with the
484
+ takes it when it next starts. A session can move to the other harness with
485
+ `--harness`, Bot Father's management session too: it then starts a new
486
+ conversation there, the book keeps the old one in its history, and its model,
487
+ effort and context go back to the new harness's defaults unless you give them
488
+ too. A pause closes the tabs the way a restart does, with the
476
489
  same refusals, and one more: it also refuses a tab with only its shell in front
477
490
  whose conversation the book does not name. `obk up` leaves what is paused
478
491
  closed until `obk unpause` brings it back with its conversations. Retiring a
479
492
  session takes it off the bot and keeps its conversations in the book under
480
- `retired`. Retiring a bot closes
493
+ `retired`. Once its tab is closed, it stops what the session left running in
494
+ its work dir: each of your processes whose working folder is there, and what
495
+ they started, with SIGTERM and, after up to 3 seconds, SIGKILL. It names each
496
+ process it stopped, and each it left: one that only shares a process group with
497
+ them, or one it could not stop. Where it cannot read the processes, as inside
498
+ Codex's sandbox, it says so and stops nothing. Retiring a bot closes
481
499
  its tabs, removes its Orca project and moves its folder to `retired/`; it will
482
500
  not touch a bot whose Orca project holds a tab your book does not name. The
483
501
  folder moves only once Orca no longer lists the project; if Orca still lists it,
@@ -522,7 +540,9 @@ obk groom --bots /path/to/my-bots --on --at 04:00 --run-on codex --model gpt-6-s
522
540
  Each fire then makes a temporary Codex session of the grooming session's, named
523
541
  `groom-<date and time>`, which does the grooming, mails its report back, and is
524
542
  retired; the grooming session sends the report on to the management session. A
525
- run an earlier fire left behind is retired at the next one.
543
+ run an earlier fire left behind is retired at the next one. Each run also
544
+ carries the grooming session's own prompt, as `--on` finds it: after you change
545
+ that prompt, run `obk groom --at <HH:MM>` alone, which keeps the runs on Codex.
526
546
 
527
547
  ## When something is wrong
528
548
 
@@ -557,6 +577,8 @@ What it looks for:
557
577
  `<bot>.<session>` every fleet's sessions had before 0.10.0, which a session of
558
578
  another fleet can write to. Its next start through the kit gives it one of its
559
579
  own, so the finding names the `obk restart … --session` that does it;
580
+ - **a process still running in a retired session's work dir**: one from before
581
+ retire stopped them, or one it could not stop, with its pid and command;
560
582
  - **leftovers no book owns**: an Orca project inside your bots folder with no
561
583
  bot in it, a tab in a bot's project that the book does not name, a start
562
584
  prompt written for a session that has gone, a clone of a skills source you no
@@ -580,7 +602,7 @@ verdict: which of these matter, and in what order, is for you or for Bot Father.
580
602
  ## Sessions and bots that talk
581
603
 
582
604
  Ask the kit how to reach a session, and it answers with the road and the
583
- address ([ADR 0035](docs/adr/0035-messaging-transport.md)):
605
+ address ([ADR 0042](docs/adr/0042-messaging-transport.md)):
584
606
 
585
607
  ```sh
586
608
  obk message to --bots /path/to/my-bots --to api-bot/daily
@@ -623,17 +645,17 @@ mailbox where it was and says so, and the harness starts all the same. A check
623
645
  holds its turn for 40 seconds at most: with more mail than it reads in that
624
646
  time, it shows what it read and says the rest is still waiting.
625
647
 
626
- Nothing in a mailbox wakes anybody, so each message gets one signal that tells
627
- the receiver to look. Orca's own notice comes first: Orca types it into an idle
628
- tab. The kit watches an idle receiver for up to 8 seconds, and reads the
629
- receiver's own record of its turns. When Orca's notice is there, the kit types
630
- nothing. When no turn started, the kit types its own line. A Claude session busy
631
- with a turn gets nothing typed: its hook tells it at the end of the turn. A busy
632
- Codex session gets the kit's line, which Codex takes into the turn it is having.
633
- The send says which signal went. A session that is not up is not typed into at
634
- all; its message waits. When a session is retired, the kit says how many
635
- messages sent to it were not read with `obk message check`, and who sent them
636
- ([ADR 0035](docs/adr/0035-messaging-transport.md)).
648
+ Nothing in a mailbox wakes anybody, so each message gets one signal: Orca's
649
+ own notice, which Orca types into the receiver's tab once it is idle. A busy
650
+ receiver gets it a minute or a few after its turn ends. The kit types nothing
651
+ into the receiver's tab, and the send says which road it took. For urgent mail,
652
+ `obk message send --interrupt` presses Escape once in a busy receiver's tab to
653
+ end its turn, and then sends the message, so the notice comes at once. Codex
654
+ keeps a command it was running as a background terminal after an Escape. A
655
+ receiver reads its mail with `obk message check`, which marks it read: a bare
656
+ `orca orchestration check` leaves it unread, and Orca then gives no more
657
+ notices for that mailbox
658
+ ([ADR 0042](docs/adr/0042-messaging-transport.md)).
637
659
 
638
660
  A message longer than 4 KiB is written to a file beside your bots folder and
639
661
  named in the message, so a long one arrives whole without landing a document in
@@ -677,9 +699,14 @@ real Orca and the real harnesses on your own machine. No CI runner can do that,
677
699
  so these are run by hand before a change that touches Orca or a harness is
678
700
  merged. A system test touches only what it creates and removes it afterwards,
679
701
  except the mailbox Runs Orca gives no way to delete, which the run names; it
680
- never closes a tab it did not open. The trust its harnesses write into your
681
- `~/.codex/config.toml` and `~/.claude.json` for the run's own throwaway folders
682
- is taken out again after the run, and named; nothing else in them is changed.
702
+ never closes a tab it did not open. Before any test loads, the command copies
703
+ your `~/.claude.json` and `~/.codex/config.toml` into a new
704
+ `obk-config-backup-*` folder in your temp folder, readable by you alone, and
705
+ says where; if a copy fails, no test runs. After the run it says whether each
706
+ file still matches its copy, and never copies one back: that is yours to
707
+ decide. The trust its harnesses write into your `~/.codex/config.toml` and
708
+ `~/.claude.json` for the run's own throwaway folders is taken out again after
709
+ the run, and named; nothing else in them is changed.
683
710
  An Orca project the run leaves in one of its own throwaway folders is named,
684
711
  with its setup id, and fails the run; the command removes none itself.
685
712
 
package/SETUP.md CHANGED
@@ -38,11 +38,19 @@ git --version
38
38
  /Applications/Orca.app/Contents/Resources/bin/orca status --json
39
39
  claude --version # at least one of these
40
40
  codex --version # 0.156.1 or newer
41
+ pi --version # 1.1.0, for a bot on Pi
41
42
  ```
42
43
 
43
44
  The Orca line must come back with `ok: true` and `result.runtime.reachable:
44
- true`. Anything else means Orca is not running, whatever else it says: ask them
45
- to start it, then run the line again.
45
+ true`. When it answers that Orca is not running or not reachable, ask them to
46
+ start it, then run the line again.
47
+
48
+ When the line fails with an error instead of an answer, the error is the
49
+ problem. It does not show that Orca is stopped. Tell them the error as the CLI
50
+ printed it, and do not ask them to start Orca for it. For example, `EPERM` with
51
+ `process.cwd failed` or `uv_cwd` means that the CLI cannot read the folder the
52
+ shell is in, while Orca can be running. Run the line again from their home
53
+ folder.
46
54
 
47
55
  On the Orca CLI path: `/usr/local/bin/orca` is a root-only symlink on some
48
56
  machines and fails for an ordinary user, so use the full path above. If Orca
@@ -132,8 +140,9 @@ Read everything it prints. Three parts of it matter to them:
132
140
  not stop Bot Father for the kit's own commands, reading a long message
133
141
  beside the bots folder, and its commits. The kit writes this set for every
134
142
  bot, with nobody asked. Say in a sentence what it allows, and that
135
- `obk permission`, `obk retire`, `obk pause` and `obk init` are not in it and
136
- keep their yes;
143
+ `obk permission`, `obk retire`, `obk pause`, `obk restart`, `obk bot create`,
144
+ `obk bot change`, `obk session add`, `obk session change` and `obk init` are
145
+ not in it and keep their yes;
137
146
  - **anything it says about Orca's own default launch arguments.** Orca adds
138
147
  these to every agent it launches, relaunches and resumes. When they carry a
139
148
  permission bypass, every session runs in that mode whatever approval level the
@@ -192,21 +201,22 @@ that folder itself, exactly as you gave it to `obk init`:
192
201
  "$ORCA" terminal read --terminal <handle> --screen --json
193
202
  ```
194
203
 
195
- What you will see, and the usual answer. Each goes as one
204
+ What you will see, and the usual answer. Each key goes as one
196
205
  `"$ORCA" terminal send --terminal <handle> --text …`, with the return inside the
197
206
  text and **no** `--enter`, because a menu takes a return as the keypress it is
198
- waiting for:
207
+ waiting for. Where the Send cell names `obk` commands, send no keys: the kit
208
+ answers that screen, by the command and its arguments below the table.
199
209
 
200
210
  | On screen | Send | Which is | Proven on |
201
211
  |---|---|---|---|
202
212
  | Claude Code's folder trust list | `\x1b[B\r` | down, then return: its selection starts on **No, exit** | Claude Code 2.1.283 |
203
213
  | Codex's directory trust, `1. Trust and continue` (older: `1. Yes, continue`) | `\r` | return: its selection starts on **Trust and continue** | Codex 0.160.0 |
204
- | Codex's `Hooks need review` | `\x1b[B\r` | down, then return, to **Trust all and continue**; if the selection already starts there, return alone | Codex 0.160.0 |
214
+ | Codex's `Hooks need review` | `obk session trust-hooks`, or `obk temp trust-hooks` for a temporary session | the kit checks the hooks, then goes to **Trust all and continue** | Codex 0.160.0 |
205
215
  | Codex's `/new`: `Where should the new conversation run?` | `\r` | return: its selection starts on **Current checkout** (bot home); on 0.162.0 it is called **1. Use current Git worktree** (Keep using the current working directory). Never **Create new Git worktree** | Codex 0.160.0; Codex 0.162.0 (#516) |
206
216
  | Codex's update offer, `1. Update now` | `\r` | return: its selection starts on **Update now**, which accepts it | Codex 0.156.1; seen on 0.157.1 (offering 0.158.0) with the selection on **Update now**, not pressed; 0.158.0 offered 0.160.0, taken on 2026-10-02 by Bot Father's restarts |
207
217
  | `[oh-my-zsh] Would you like to update?` | `n` | they update their own shell | oh-my-zsh bf77e35 |
208
- | Claude Code's `Teach auto mode about your environment?` | `\x1b` | Esc, which cancels it (**Not now**). On 2.1.283 it is a form, not a list: `How you use Claude here`, `Also scan shell history`, `Also scan your other repos`, `Continue`, and `Enter to continue · Esc to cancel`. **Never send a return**: Enter is **Continue**, which starts a scan of the project, recent Claude sessions and, by default, the machine's shell history | Not yet proven: Esc cancels in Claude Code 2.1.283's code, not yet seen live (#370); the form was seen live twice on 2.1.283, in #261's live test and #239's live run 1 (#416); 2.1.278 showed a numbered list, answered with 2. Not now |
209
- | Claude Code 2.1.289's `Teach auto mode about your environment?`, a numbered list: `1. Yes`, `2. Not now`, `3. Don't show again`, and `Enter to confirm · Esc to cancel`, above the input box | `\x1b[B\r` | down, then return, to **2. Not now**: its selection starts on **1. Yes**. Read the screen after the down arrow, and send the return only with the selection on **2. Not now**. Never **1. Yes**, which starts the teach scan, and never **3. Don't show again** | Not yet proven: the list was seen live on 2.1.289 with its selection on 1. Yes, in #489's live run 1, and was not answered there |
218
+ | Claude Code's `Teach auto mode about your environment?` | `obk session answer`, or `obk temp answer` for a temporary session | the kit sends Esc, which cancels it (**Not now**). On 2.1.283 and 2.1.302 it is a form, not a list: `How you use Claude here`, `Also scan shell history`, `Also scan your other repos`, `Continue`, and `Enter to continue · Esc to cancel`. On 2.1.283, `Also scan shell history` shows `true` and the foot starts `←/→ to change usage`. On 2.1.302, it shows `false` and the foot starts `←/→ to change`. **Never send a return**: Enter is **Continue**, which starts a scan of the project, recent Claude sessions and, by default, the machine's shell history | Not yet proven: Esc cancels in Claude Code 2.1.283's code, not yet seen live (#370); the form was seen live twice on 2.1.283, in #261's live test and #239's live run 1 (#416); 2.1.278 showed a numbered list, answered with 2. Not now; the 2.1.302 form was seen live once, in #604 |
219
+ | Claude Code 2.1.289's `Teach auto mode about your environment?`, a numbered list: `1. Yes`, `2. Not now`, `3. Don't show again`, and `Enter to confirm · Esc to cancel`, above the input box | `obk session answer`, or `obk temp answer` for a temporary session | the kit goes down, then returns, to **2. Not now**: its selection starts on **1. Yes**. The kit reads the screen after the down arrow, and sends the return only with the selection on **2. Not now**. Never **1. Yes**, which starts the teach scan, and never **3. Don't show again** | Not yet proven: the list was seen live on 2.1.289 with its selection on 1. Yes, in #489's live run 1, and was not answered there |
210
220
 
211
221
  Each key counts on where the selection starts, as it did on the version named.
212
222
  Read the screen in front of you before you send: if the selection is somewhere
@@ -233,8 +243,9 @@ that a narrow permission rule of the kit's default set allows it rather than a
233
243
  rule to type into any tab. On Codex's hooks review, the maker runs
234
244
  `obk temp trust-hooks --bots <their path> --name <session>`. On Claude Code's
235
245
  `Teach auto mode` screen, it runs `obk temp answer --bots <their path> --name <session>`.
236
- That command reads the screen and answers only when it holds one of the two
237
- shapes in the table exactly as the kit knows it: Esc for the 2.1.283 form, and
246
+ That command reads the screen and answers only when it holds one of the
247
+ shapes in the table exactly as the kit knows it: Esc for the 2.1.283 and
248
+ 2.1.302 forms, and
238
249
  **2. Not now** for the 2.1.289 list. On the list it sends the arrows, reads the
239
250
  screen again, and sends the return only with the selection on **2. Not now**.
240
251
  It refuses any other screen, types nothing then, and prints what it saw.
@@ -298,8 +309,10 @@ obk health --bots <their path>
298
309
 
299
310
  It reads the setup and says what it found, and writes nothing at all. It exits 1
300
311
  when it found something, so do not read a non-zero exit as a broken setup. The
301
- one exception is an error with no findings, saying Orca is not answering: that
302
- is a real problem, and the fix is to start Orca and run it again.
312
+ one exception is an error with no findings: that is a real problem. Tell them
313
+ the error as it is. When it says Orca is not answering, run the Orca line from
314
+ step 1 again, and go by what that gives: start Orca only when it answers that
315
+ Orca is not running.
303
316
 
304
317
  Relay what it says in plain words. Nothing it prints is a verdict: which findings
305
318
  matter is for them, or for Bot Father, to judge. If something looks wrong to you,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assuredloop/orca-bot-kit",
3
- "version": "0.26.1",
3
+ "version": "0.28.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
package/rules/mail.md CHANGED
@@ -8,16 +8,16 @@ To reach another session, ask the kit for the road rather than guessing an
8
8
  address: `"${OBK_CLI:-obk}" message to --bots <bots> --to <bot>/<session>`. It
9
9
  answers with the address and the command that carries it.
10
10
 
11
- If your harness refuses a message, do not send it again by another road. Tell
12
- your maker or your user, with the harness's reason. A refusal can mean a missing
13
- permission rule, which they can add through the kit after the user's yes.
11
+ If your harness refuses a message, do not send it again by another road. Tell your maker or your
12
+ user, with the harness's reason. A refusal can mean a missing permission rule. Send the refusal to
13
+ whoever adds your rules: your maker, your user or your fleet's manager.
14
14
 
15
- Mail is queued, not an interruption. Read it when you finish what you are on.
15
+ Mail is queued, not an interruption. When Orca says you have mail, read it
16
+ with `"${OBK_CLI:-obk}" message check --bots <bots>`, never a bare `orca
17
+ orchestration check`: that leaves it unread, and Orca stops telling you of mail.
16
18
 
17
19
  Ask for a reply when you need one, and send one when you were asked for one.
18
20
 
19
- A message sent is queued, not read or acted on: the reply, or the work done,
20
- is what shows it arrived. Look for one before you send it again.
21
+ A sent message is only queued. Look for the reply or the work before you resend.
21
22
 
22
- Write to the session that needs it, not to several in the hope that one of
23
- them is right.
23
+ Write only to the session that needs it, not to several at once.
@@ -213,10 +213,14 @@ its commits. The kit writes this default set itself, with nobody asked:
213
213
  does not have yet to its `bot.yaml` and its settings, or for Codex its
214
214
  `.codex/rules/obk.rules`, and say which rules they wrote. The set leaves out
215
215
  the commands that keep the user's yes: `obk permission`, `obk retire`, `obk
216
- pause`, `obk restart`, `obk bot create` and `obk init`. A bot that still holds
217
- the `obk restart` or `obk bot create` rule from kit 0.26.0 keeps it, and `obk
218
- rules build` and `obk up` name it with the `obk permission disallow` command
219
- that takes it back; run that command only after the user's yes. Never write a
216
+ pause`, `obk restart`, `obk bot create`, `obk bot change`, `obk session add`,
217
+ `obk session change` and `obk init`. A bot that still holds a rule that the
218
+ kit gave every bot before and that is no longer in the set (`obk restart`,
219
+ `obk bot create`, `obk bot change`, `obk session add`, `obk session change`,
220
+ `obk session mail`, `obk session nudge`, or Orca's `orca orchestration check
221
+ --run`) keeps it, and `obk rules build` and `obk up` name
222
+ it with the `obk permission disallow` command that takes it back; run that
223
+ command only after the user's yes. Never write a
220
224
  permission rule into a settings or rules file by hand.
221
225
 
222
226
  The charter decides what else the bot needs. What it lets the bot do without
@@ -284,26 +288,29 @@ sometimes. Read each screen with `<orca> terminal read --terminal <handle>
284
288
  --screen`, where `<handle>` is the terminal the kit named for the tab and
285
289
  `<orca>` is the Orca CLI the kit uses: `$OBK_ORCA` when that is set, and
286
290
  otherwise `/Applications/Orca.app/Contents/Resources/bin/orca`. A bare
287
- `orca` can fail. Send each answer as one `<orca> terminal send --terminal
288
- <handle> --text …`, with the return inside the text and no `--enter`:
291
+ `orca` can fail. Send each key as one `<orca> terminal send --terminal
292
+ <handle> --text …`, with the return inside the text and no `--enter`. Where
293
+ the Send cell names `obk` commands, send no keys: the kit answers that
294
+ screen, by the commands below, the first for a long-lived session and the
295
+ second for a temporary one.
289
296
 
290
297
  | On screen | Send | Which is | Proven on |
291
298
  |---|---|---|---|
292
299
  | Claude Code's trust list | `\x1b[B\r` | down, return: off **No, exit** | Claude Code 2.1.283 |
293
300
  | Codex's `Trust this folder?` | `\r` | return: it starts on yes | Codex 0.160.0 |
294
- | Codex's `Hooks need review` | `\x1b[B\r` | **Trust all and continue** | Codex 0.160.0 |
301
+ | Codex's hooks review | `obk session trust-hooks`, `obk temp trust-hooks` | trust | Codex 0.160.0 |
295
302
  | Codex's `Where should the new conversation run?` | `\r` | **Current checkout** | Codex 0.160.0 |
296
303
  | Codex's update offer, `1. Update now` | `\r` | **Update now**, where it starts | Codex 0.156.1 |
297
304
  | `[oh-my-zsh] Would you like to update?` | `n` | no: the user updates it | oh-my-zsh bf77e35 |
298
- | Claude Code's `Teach auto mode…` | `\x1b` | Esc: Not now; no return | Not yet proven, below |
299
- | The same, 2.1.289's list | `\x1b[B\r` | down, return: **2. Not now** | Not yet proven, below |
305
+ | Claude Code's Teach form | `obk session answer`, `obk temp answer` | Esc | Not yet proven, below |
306
+ | Its 2.1.289 list | `obk session answer`, `obk temp answer` | 2. Not now | Not yet proven, below |
300
307
 
301
308
  Each key counts on where the selection starts on the version named. Read the
302
309
  screen before you send: if the selection is elsewhere or the options have
303
310
  moved, go to the answer with the arrows, then return. Never a digit and then
304
311
  return: on Codex's update offer that took the highlighted **Update now**,
305
312
  whatever the digit was. Codex's trust said `1. Yes, continue` on older
306
- versions. Its hooks review sometimes starts on `2` already: then return alone.
313
+ versions.
307
314
  Its update offer was proven on 0.156.1; 0.157.1 showed it with the selection on
308
315
  Update now, not pressed, and 0.158.0 offered 0.160.0, taken on 2026-10-02 by
309
316
  Bot Father's restarts.
@@ -314,8 +321,10 @@ shell history. Esc cancels it (Not now) in its code; that is not yet proven
314
321
  live, though the form was seen live twice on 2.1.283. On 2.1.278 it was a
315
322
  numbered list, answered with `2. Not now`, and on 2.1.289 it is one again:
316
323
  `1. Yes`, `2. Not now`, `3. Don't show again`, above the input box, its
317
- selection on 1. Yes (seen live, not answered, in #489). Go down to 2. Not now,
318
- read the screen, and only then return. Codex's hooks
324
+ selection on 1. Yes (seen live, not answered, in #489). The kit goes down to
325
+ 2. Not now, reads the screen, and only then returns. On 2.1.302 it is the
326
+ form again, with `Also scan shell history` on `false` and a foot that starts
327
+ `←/→ to change` (seen live in #604); the kit sends it Esc too. Codex's hooks
319
328
  question matters most. The kit's hook is how the book learns which
320
329
  conversation the session is running, and until it is answered the
321
330
  conversation has not started. Codex's trust applies to the repository root,
@@ -324,15 +333,15 @@ conversation runs (0.156.1, 0.157.1, 0.158.0 and 0.160.0 all did); the answer is
324
333
  always the current checkout, the bot home, and never `2. New worktree`:
325
334
  the kit never makes a git worktree.
326
335
 
327
- The hooks review of a Codex temporary session you made yourself is the one
328
- exception: answer it with `obk temp trust-hooks --bots <bots> --name
336
+ The hooks review of a Codex temporary session you made yourself is answered
337
+ through the kit: answer it with `obk temp trust-hooks --bots <bots> --name
329
338
  <session>`, not with the keys. It reads the screen, chooses **Trust all and
330
339
  continue** only if the review is there, and checks that the review went. A
331
340
  permission rule can allow that one command, where it cannot allow keys sent
332
341
  into any tab. The same goes for Claude Code's `Teach auto mode` screen on a
333
342
  temporary session you made: answer it with `obk temp answer --bots <bots>
334
343
  --name <session>`. It answers only a shape in the table exactly as the kit
335
- knows it (Esc on the 2.1.283 form, 2. Not now on the 2.1.289 list, the return
344
+ knows it (Esc on the 2.1.283 and 2.1.302 forms, 2. Not now on the 2.1.289 list, the return
336
345
  only after a second look), refuses any other screen, and checks that it went. The kit's
337
346
  default set allows it, as it allows `obk temp trust-hooks`.
338
347
 
@@ -171,9 +171,10 @@ For a bot with its own memory, the report gets a short section:
171
171
  - **A proposed cut**, when it is near or over the limit: which entries could go
172
172
  or be merged, and why.
173
173
 
174
- A contradiction is not yours to fix. Send it to that bot's own session, as Bot
175
- Father's management session, whose pass this is: `obk message to --from
176
- bot-father/<its session> --to <bot>/<session>` gives the road. Where the road
174
+ A contradiction is not yours to fix. Send it to that bot's own session, from
175
+ your own session, for Bot Father's pass: `obk message to --to <bot>/<session>`,
176
+ run in your own tab, gives the road. In a session's tab the kit sends only as
177
+ that session (#570), so name no other with `--from`. Where the road
177
178
  is the mailbox, `obk message send` carries it, whatever you run on. Where it is
178
179
  an address, that road is Claude Code's own messaging, and it is yours only if
179
180
  you run on Claude Code yourself; if you do not, put the finding in your report