@assuredloop/orca-bot-kit 0.2.0 → 0.4.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 +31 -15
- package/SETUP.md +10 -4
- package/package.json +1 -1
- package/rules/finishing.md +3 -0
- package/rules/mail.md +3 -3
- package/rules/scope.md +4 -2
- package/rules/tests-first.md +6 -4
- package/skills/obk-arch/LICENSES.md +7 -0
- package/skills/obk-arch/NOTICE.md +113 -5
- package/skills/obk-arch/SKILL.md +221 -10
- package/skills/obk-bot-building/NOTICE.md +2 -2
- package/skills/obk-bot-building/SKILL.md +108 -19
- package/skills/obk-debugging/SKILL.md +30 -15
- package/skills/obk-decision-memo/NOTICE.md +1 -1
- package/skills/obk-finops/NOTICE.md +1 -1
- package/skills/obk-finops/SKILL.md +6 -4
- package/skills/obk-fleet-review/SKILL.md +42 -5
- package/skills/obk-grilling/NOTICE.md +11 -3
- package/skills/obk-grilling/SKILL.md +11 -7
- package/skills/obk-grooming/SKILL.md +5 -2
- package/skills/obk-handoff/NOTICE.md +1 -1
- package/skills/obk-recall/NOTICE.md +1 -1
- package/skills/obk-researching/NOTICE.md +1 -1
- package/skills/obk-researching/SKILL.md +19 -9
- package/skills/obk-reviewing/SKILL.md +4 -1
- package/skills/obk-tdd/SKILL.md +54 -23
- package/skills/obk-teach/NOTICE.md +2 -2
- package/skills/obk-why/NOTICE.md +1 -1
- package/skills/obk-why/SKILL.md +21 -10
- package/src/book.js +2 -2
- package/src/bot.js +1 -1
- package/src/cli.js +117 -33
- package/src/groom.js +5 -3
- package/src/health.js +2 -2
- package/src/hooks.js +73 -18
- package/src/init.js +3 -3
- package/src/launch.js +28 -5
- package/src/message.js +38 -19
- package/src/orca-window.cjs +21 -0
- package/src/orca.js +191 -28
- package/src/pause.js +11 -6
- package/src/record.js +1 -1
- package/src/restart.js +6 -5
- package/src/retire.js +41 -6
- package/src/roster.js +1 -1
- package/src/rules.js +2 -2
- package/src/skills.js +113 -21
- package/src/sources.js +4 -3
- package/src/up.js +57 -23
- package/src/usage.js +2 -2
|
@@ -33,7 +33,7 @@ plainly" comes from.
|
|
|
33
33
|
## This kit's own design
|
|
34
34
|
|
|
35
35
|
The PRD and the ADRs carry the rest: the line-up suggestions and the
|
|
36
|
-
role-to-skills guidance (PRD 6.8, ADR
|
|
36
|
+
role-to-skills guidance (PRD 6.8, ADR 0019, which puts that table in the
|
|
37
37
|
management skill), a session's settings and the rule that the kit never
|
|
38
38
|
hardcodes a model id, the approval levels and that the widest one is used only
|
|
39
39
|
when the user asks for it in plain words, the two plain defaults that no
|
|
@@ -92,7 +92,7 @@ to pass on. See [LICENSES.md](LICENSES.md).
|
|
|
92
92
|
his usage review complains of one question per turn.
|
|
93
93
|
- The answer handed back is the roster card PRD 6.8 decides (name, harness,
|
|
94
94
|
model and effort, a two-line charter, one hard limit).
|
|
95
|
-
- The skills for each role are named, since ADR
|
|
95
|
+
- The skills for each role are named, since ADR 0019 puts that choice in the
|
|
96
96
|
management skill.
|
|
97
97
|
- What the command line does and does not do, checked against `obk --help`:
|
|
98
98
|
`obk skills fetch` was missing; a charter, settings or list change is an
|
|
@@ -113,18 +113,44 @@ nobody can compare with last week's.
|
|
|
113
113
|
Approval is the ordinary automatic level unless the user asks for something
|
|
114
114
|
else in plain words. Do not raise it to make a session smoother.
|
|
115
115
|
|
|
116
|
+
A session that works on files of its own gets a work dir inside the bot's
|
|
117
|
+
folder, under `work/`: `--work-dir work/<session>`. Every clone it needs goes
|
|
118
|
+
in there too, not beside the bots folder or anywhere else outside the bot
|
|
119
|
+
home. Where the user names another place in plain words, that place is the
|
|
120
|
+
work dir, and its clones go there. `work/` is kept out of the bots repo, and a
|
|
121
|
+
path written relative to the bot home still points at the right folder when
|
|
122
|
+
the bots folder moves. `obk session add` and `obk session change` say so when a
|
|
123
|
+
work dir leads out of the bot home; take that back to the user rather than
|
|
124
|
+
past them.
|
|
125
|
+
|
|
116
126
|
## Offer a line-up rather than a blank page
|
|
117
127
|
|
|
118
128
|
Someone making their first bots does not know what a good set looks like, so
|
|
119
|
-
propose one and say what each part is for. A pair of developers on
|
|
120
|
-
models with an architect over them
|
|
121
|
-
|
|
129
|
+
propose one and say what each part is for. A pair of developers, perhaps on
|
|
130
|
+
different models, with an architect over them: each developer works an issue
|
|
131
|
+
of its own, and the architect hands out the issues, settles disagreements and
|
|
122
132
|
digs into the hard causes. A workhorse, a writer and a thinker, for work that
|
|
123
133
|
is not development.
|
|
124
134
|
|
|
125
135
|
Suggestions only: they take out or rename what they like, and you build what
|
|
126
136
|
they end up with.
|
|
127
137
|
|
|
138
|
+
## A bot that writes code
|
|
139
|
+
|
|
140
|
+
Its tests come from a different author than its code, and its work is read
|
|
141
|
+
by a different reviewer. Write it that way in the charter and the start
|
|
142
|
+
prompts: "a different author", "a different reviewer". Which kind each one
|
|
143
|
+
is, a fresh subagent, a new session, another bot or a person, is the user's
|
|
144
|
+
to say. Ask them, and write what they chose; where they leave it open, leave
|
|
145
|
+
it open. Do not choose for them: the kind you write becomes the rule. A
|
|
146
|
+
line-up that hands one developer's tests to the other has two sessions on
|
|
147
|
+
every issue and loses the pair's parallel work.
|
|
148
|
+
|
|
149
|
+
The kit's `tests-first` and `review` rule units say this. They apply to code,
|
|
150
|
+
so a bot carries them only when its `rules:` list in `bot.yaml` names them,
|
|
151
|
+
as `kit:tests-first` and `kit:review`; add them to a code-writing bot's list
|
|
152
|
+
by hand and run `obk rules build`.
|
|
153
|
+
|
|
128
154
|
## Give it the skills the job needs, and no more
|
|
129
155
|
|
|
130
156
|
Match the skills to the work, not to the title. Something that mostly finds
|
|
@@ -148,7 +174,8 @@ their machine on their risk.
|
|
|
148
174
|
Someone moving in usually has a conversation going that they do not want to
|
|
149
175
|
lose. Take the harness's own id for it and record it against the session in
|
|
150
176
|
the book (by hand, since no command takes an outside id), and `obk up` brings
|
|
151
|
-
it back with its history
|
|
177
|
+
it back with its history; then read its tab and answer what is on screen
|
|
178
|
+
(see "When a tab it opened is waiting"). Whether a harness resumes a conversation that was
|
|
152
179
|
started in another folder is something to try before promising.
|
|
153
180
|
|
|
154
181
|
Everything else is best effort, and say so plainly rather than promising a
|
|
@@ -166,7 +193,9 @@ them, and `obk up` opens what is missing in Orca. `obk bot change` gives a
|
|
|
166
193
|
bot a new charter, `obk session change` changes a session's settings, and
|
|
167
194
|
`obk skills remove` takes a skill off a list (then `obk skills build`). `obk
|
|
168
195
|
pause` stops a bot or a session for now and `obk unpause` brings it back;
|
|
169
|
-
`obk retire` ends one.
|
|
196
|
+
`obk retire` ends one. After `obk up`, `obk restart` or `obk unpause`, read
|
|
197
|
+
every tab it opened and answer what is on screen yourself (next section).
|
|
198
|
+
For a special case no command covers, such as a bot's
|
|
170
199
|
rules list, edit the file, run `obk rules build` or `obk skills build`, and
|
|
171
200
|
say that you edited it by hand.
|
|
172
201
|
Run `obk --help` for the flags of the version actually installed rather than
|
|
@@ -193,28 +222,88 @@ and linking skills add things and are safe to run again; closing a tab,
|
|
|
193
222
|
pausing or retiring a bot and restarting anything are not, and they wait for
|
|
194
223
|
the word.
|
|
195
224
|
|
|
225
|
+
## When a tab it opened is waiting
|
|
226
|
+
|
|
227
|
+
A new tab often stops on a first-run screen before the session starts:
|
|
228
|
+
the harness asking whether to trust the folder, Codex asking to review
|
|
229
|
+
hooks, a harness offering its own update, the shell offering to update
|
|
230
|
+
itself. Answering these is your job, not the user's. Answer them in the tab
|
|
231
|
+
yourself, without asking, and tell the user afterwards what you answered.
|
|
232
|
+
The kit types the launch line and nothing more, so no one else will.
|
|
233
|
+
|
|
234
|
+
Look at every tab `obk up`, `obk restart` or `obk unpause` opened, not only
|
|
235
|
+
the ones it says are waiting. The kit cannot always tell: a tab stopped on a
|
|
236
|
+
trust screen is often reported as up, Claude Code's every time and Codex's
|
|
237
|
+
sometimes. Read each screen with `<orca> terminal read --terminal <handle>
|
|
238
|
+
--screen`, where `<handle>` is the terminal the kit named for the tab and
|
|
239
|
+
`<orca>` is the Orca CLI the kit uses: `$OBK_ORCA` when that is set, and
|
|
240
|
+
otherwise `/Applications/Orca.app/Contents/Resources/bin/orca`. A bare
|
|
241
|
+
`orca` can fail. Send each answer as one `<orca> terminal send --terminal
|
|
242
|
+
<handle> --text …`, with the return inside the text and no `--enter`:
|
|
243
|
+
|
|
244
|
+
| On screen | Send | Which is |
|
|
245
|
+
|---|---|---|
|
|
246
|
+
| Claude Code's folder trust list | `\x1b[B\r` | down, return: it starts on **No, exit** |
|
|
247
|
+
| Codex's `Trust this folder?`, `1. Trust and continue` | `1\r` | yes (older: `1. Yes, continue`) |
|
|
248
|
+
| Codex's `Hooks need review` | `2\r` | trust all and continue |
|
|
249
|
+
| Codex's `/new`: `Where should the new conversation run?` | `1\r` | current checkout (bot home) |
|
|
250
|
+
| Codex's update offer, `1. Update now` | `1\r` | accept it |
|
|
251
|
+
| `[oh-my-zsh] Would you like to update?` | `n` | no: the shell is the user's to update |
|
|
252
|
+
| Claude Code's `Teach auto mode about…` | `2\r` | **Not now**: it writes the user's settings |
|
|
253
|
+
|
|
254
|
+
Read the numbers off the screen in front of you rather than trusting the
|
|
255
|
+
table: a harness that has added an option has moved them. Codex's hooks
|
|
256
|
+
question matters most. The kit's hook is how the book learns which
|
|
257
|
+
conversation the session is running, and until it is answered the
|
|
258
|
+
conversation has not started. Codex's trust applies to the repository root,
|
|
259
|
+
which is the whole bots folder. Codex's `/new` asks where the new
|
|
260
|
+
conversation runs; the answer is always the current checkout, the bot home,
|
|
261
|
+
and never `2. New worktree`: the kit never makes a git worktree.
|
|
262
|
+
|
|
263
|
+
Where the kit says no session came up, the shell swallowed the launch line,
|
|
264
|
+
usually while it was asking its own question. Answer the shell, then close
|
|
265
|
+
that one tab (`<orca> terminal close --terminal <handle> --tab`) and run
|
|
266
|
+
`obk up` again. This is the one tab you may close without asking: the kit
|
|
267
|
+
opened it a moment ago, and it holds no conversation.
|
|
268
|
+
|
|
269
|
+
A screen you do not recognise gets no keypress. Take what it says, and which
|
|
270
|
+
bot and tab it is in, to the user. When you have answered, read the screen
|
|
271
|
+
again and check a session is running before you call the bot ready.
|
|
272
|
+
|
|
196
273
|
## When the bot is already running
|
|
197
274
|
|
|
198
275
|
Changing a bot whose sessions are up is the ordinary case rather than the
|
|
199
|
-
awkward one.
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
276
|
+
awkward one. Putting a skill on a bot or taking one off reaches its running
|
|
277
|
+
sessions without a restart, and `obk skills build` says, session by session,
|
|
278
|
+
how:
|
|
279
|
+
|
|
280
|
+
- Claude Code: the kit types `/reload-skills` into the session's tab. That is
|
|
281
|
+
Claude Code's own reload. A busy session queues it and runs it as a command
|
|
282
|
+
when its turn ends, so it never reaches the model as text.
|
|
283
|
+
- Codex: nothing is typed, because Codex has no reload command. It takes the
|
|
284
|
+
change at the start of its next turn, not in the middle of the one it is on.
|
|
285
|
+
|
|
286
|
+
The kit reports a session it could not tell, and why: not up, or on a screen
|
|
287
|
+
waiting for an answer. A session that is not up reads its skills when it
|
|
288
|
+
starts.
|
|
289
|
+
|
|
290
|
+
Told is not the same as confirmed. Before telling anyone a skill is there,
|
|
291
|
+
check that the session can use it: ask it to load the skill. Do not look
|
|
292
|
+
again at the disk you just wrote, since that says nothing about what another
|
|
293
|
+
process has loaded. Do not ask a Codex session whether the skill is in its
|
|
294
|
+
list: it has answered "none" while its list held the skill. Where a skill has
|
|
295
|
+
not appeared after the next turn, say so. A restart would make it appear, and
|
|
296
|
+
meanwhile the session can read the skill's `SKILL.md` by the path the kit
|
|
297
|
+
printed. A restart is the user's to ask for. Taking one because it is quick
|
|
298
|
+
ends a conversation they were in the middle of.
|
|
210
299
|
|
|
211
300
|
Instructions are not skills. A session is working from the rules it read when
|
|
212
301
|
it started, so a change to a bot's `AGENTS.md` may not reach one that is
|
|
213
302
|
already up even when a skill change would, and a session's model, effort or
|
|
214
303
|
approval only changes when it is started again (`obk restart`, on the user's
|
|
215
|
-
word). Say which you changed, and what that
|
|
216
|
-
now. Where everything needs restarting, remind
|
|
217
|
-
ops tab.
|
|
304
|
+
word, and then read its tabs as above). Say which you changed, and what that
|
|
305
|
+
means for the sessions running now. Where everything needs restarting, remind
|
|
306
|
+
them to do it from Bot Father's ops tab.
|
|
218
307
|
|
|
219
308
|
And tell them. A bot's sessions share its rules and its skills, so a change
|
|
220
309
|
made for one of them lands on all of them, and the session that asked is not
|
|
@@ -21,7 +21,10 @@ part of its own below.
|
|
|
21
21
|
A reproduction you can run is what every other step here leans on, so get one
|
|
22
22
|
before settling on a cause. Scale the rest to the bug: when the error names the
|
|
23
23
|
line and the fix is plain, the check, the fix and the proof are minutes of
|
|
24
|
-
work, and most of what follows is for when it is not.
|
|
24
|
+
work, and most of what follows is for when it is not. A step you leave out that
|
|
25
|
+
would otherwise apply gets said: which one, why, and what evidence makes it
|
|
26
|
+
unnecessary or stands in for it. Group the ones that go together; do not recite
|
|
27
|
+
every part you did not need.
|
|
25
28
|
|
|
26
29
|
These are defaults for work where nothing says otherwise. A user who asks for
|
|
27
30
|
something else gets what they asked for; say which of these you left and why.
|
|
@@ -111,17 +114,22 @@ reported and not a different one nearby. The wrong bug gets the wrong fix.
|
|
|
111
114
|
Capture the exact symptom: the message, the wrong value, the timing.
|
|
112
115
|
|
|
113
116
|
Then make it smaller. Remove one input, one caller, one setting, one step at a
|
|
114
|
-
time, running the check after each. Stop when
|
|
115
|
-
|
|
117
|
+
time, running the check after each. Stop when making it smaller would not
|
|
118
|
+
improve the diagnosis or the regression test: usually that is when every
|
|
119
|
+
remaining piece is load-bearing, and sooner when the reproduction already
|
|
120
|
+
isolates the cause. Keep the evidence you stopped on.
|
|
116
121
|
|
|
117
122
|
This is not tidiness. A small reproduction leaves fewer things to suspect, and
|
|
118
123
|
it is what the regression test will be written from.
|
|
119
124
|
|
|
120
125
|
## Candidates, then the cause in one sentence
|
|
121
126
|
|
|
122
|
-
|
|
123
|
-
on its own anchors you to whatever
|
|
124
|
-
that is a search for confirmation.
|
|
127
|
+
While the cause is uncertain, write down the plausible competing candidates and
|
|
128
|
+
rank them before testing any. One candidate on its own anchors you to whatever
|
|
129
|
+
occurred to you first, and everything after that is a search for confirmation.
|
|
130
|
+
Once a discriminating check has established the cause, stop: the cause, not
|
|
131
|
+
only the line and the value, since a null that fails on one line may come from a
|
|
132
|
+
load that failed earlier. Do not invent alternatives after the fact.
|
|
125
133
|
|
|
126
134
|
Each one has to be falsifiable. Say what it predicts: *if X is the cause,
|
|
127
135
|
changing Y makes it go away, and changing Z makes it worse.* A candidate that
|
|
@@ -206,9 +214,11 @@ you are theorising without evidence.
|
|
|
206
214
|
- **Before blaming the visible thing, measure the layer underneath.** The raw
|
|
207
215
|
command, the plain request, the same thing without your wrapper. A
|
|
208
216
|
hypothesis the lower layer disproves is retired, not circled.
|
|
209
|
-
- **When the tool itself fails,
|
|
210
|
-
|
|
211
|
-
the
|
|
217
|
+
- **When the tool itself fails, decide whether that failure matters.**
|
|
218
|
+
Diagnose it when its failure is the thing under investigation, or could make
|
|
219
|
+
the evidence wrong: swapping it then moves the problem somewhere you
|
|
220
|
+
understand less well. Otherwise name the failure, reach the same evidence by
|
|
221
|
+
an equivalent route, and keep the original output.
|
|
212
222
|
|
|
213
223
|
### What an error says, and what it tells you to do
|
|
214
224
|
|
|
@@ -389,8 +399,9 @@ them shared before trying a third, and test that. Suspect it; it may still turn
|
|
|
389
399
|
out not to be the cause.
|
|
390
400
|
|
|
391
401
|
The same symptom after a fix means the idea was never finished: stop patching
|
|
392
|
-
and read the path again from the start before touching the code. Three
|
|
393
|
-
have failed: stop and report.
|
|
402
|
+
and read the path again from the start before touching the code. Three fix
|
|
403
|
+
attempts made without a sound cause have failed: stop and report. A hypothesis a
|
|
404
|
+
useful probe ruled out does not count toward three; ruling it out is progress.
|
|
394
405
|
|
|
395
406
|
When each fix moves the problem somewhere else, or turns up more shared state,
|
|
396
407
|
or would need a large restructuring to do properly, the shape of the thing is
|
|
@@ -404,16 +415,20 @@ and what ruled it out, and what you need (access, an artefact, a decision).
|
|
|
404
415
|
|
|
405
416
|
- The original reproduction no longer reproduces, and you ran it again to see.
|
|
406
417
|
- The regression test passes, or the absence of a seam is written down.
|
|
407
|
-
- The
|
|
418
|
+
- The checks the project requires still pass, with those that cover the change
|
|
419
|
+
and its credible effects elsewhere; the whole suite when the change is broad or
|
|
420
|
+
shared. When you leave the whole suite out, name what you ran instead.
|
|
408
421
|
- Every temporary log is gone. Search for the marker you used.
|
|
409
422
|
- Throwaway harnesses are deleted, or clearly marked as what they are.
|
|
410
|
-
- The
|
|
411
|
-
|
|
423
|
+
- The cause is written down where the next person to touch this will find it:
|
|
424
|
+
the commit message, the regression test, the issue or the change description
|
|
425
|
+
will do. Do not write it out a second time only to satisfy this step.
|
|
412
426
|
|
|
413
427
|
## Away from code
|
|
414
428
|
|
|
415
429
|
A configuration, a document, a data pipeline or a prompt gives way to the same
|
|
416
430
|
moves: something that shows the fault reliably, what changed, a cause that
|
|
417
|
-
covers every symptom, and the fix proved on the thing that failed.
|
|
431
|
+
covers every symptom, and the fix proved on the thing that failed. The cause is
|
|
432
|
+
kept in whatever record that work already has.
|
|
418
433
|
|
|
419
434
|
Sources and licences: [NOTICE.md](NOTICE.md).
|
|
@@ -116,7 +116,7 @@ prescribes neither, because PRD 7.1 leaves the user free in how they keep
|
|
|
116
116
|
documents, and it says instead to match whatever the project already does.
|
|
117
117
|
|
|
118
118
|
Where this overlaps `obk-grilling` and `obk-why`, that is deliberate and
|
|
119
|
-
what ADR
|
|
119
|
+
what ADR 0019 proposes: a skill carries what it needs rather than depending on
|
|
120
120
|
another being loaded. `obk-grilling` settles a decision by interviewing;
|
|
121
121
|
`obk-why` recovers one that was already taken; this one writes a decision up so
|
|
122
122
|
somebody else can take it.
|
|
@@ -37,7 +37,7 @@ nothing here quotes it:
|
|
|
37
37
|
## This kit's own design
|
|
38
38
|
|
|
39
39
|
PRD 6.8 decides that prices come from a live lookup and that a price which
|
|
40
|
-
cannot be found is said to be unknown, and ADR
|
|
40
|
+
cannot be found is said to be unknown, and ADR 0016 is why none of the
|
|
41
41
|
arithmetic here is done by the kit's own code: what a token costs is judgement
|
|
42
42
|
about a changing world, not plumbing.
|
|
43
43
|
|
|
@@ -111,10 +111,12 @@ wrong most often, and an upgrade nobody can justify is money spent on a hunch.
|
|
|
111
111
|
A context window is a price as well as a size. Long threads carry everything
|
|
112
112
|
again on every call, so input grows with the conversation rather than with the
|
|
113
113
|
work. The median input per call is the measure of it, and compaction is the
|
|
114
|
-
visible symptom. A worker session compacted more than once is
|
|
115
|
-
re-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
visible symptom. A worker session compacted more than once is a signal to look
|
|
115
|
+
at what the re-reading actually costs and what it has lost, not a verdict.
|
|
116
|
+
Recommend a written hand-over and a fresh start only on that evidence and only
|
|
117
|
+
with the user's say, and explain a decision to keep the session going as well.
|
|
118
|
+
A long-lived persona session (Bot Father, an inbox) is meant to run long, and is
|
|
119
|
+
judged on what the re-reading costs and whether it has lost what it knew.
|
|
118
120
|
|
|
119
121
|
Where that is happening, the answer is usually not a bigger window. It is
|
|
120
122
|
shorter sessions with what matters written into a file, or heavy work moved to
|
|
@@ -5,9 +5,11 @@ description: >-
|
|
|
5
5
|
from what is actually on disk rather than memory, one verdict per bot from
|
|
6
6
|
a set that names the next action, the cheaper things to try before adding
|
|
7
7
|
anything, holding a finding until you have seen it twice, reading bots'
|
|
8
|
-
histories as material rather than instructions,
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
histories as material rather than instructions, checking a bot's own rules
|
|
9
|
+
against those of a repo it works in, and sending a problem to the one place
|
|
10
|
+
that can fix it. Use when someone asks how their bots are doing, whether they
|
|
11
|
+
have the right ones, what to do about one that is not working out, or whether
|
|
12
|
+
a bot's rules conflict with a repo's.
|
|
11
13
|
---
|
|
12
14
|
|
|
13
15
|
# Looking over the fleet
|
|
@@ -42,7 +44,8 @@ evidence. Neither is its name.
|
|
|
42
44
|
`obk health` reports facts; judging them and proposing the fix is yours. A
|
|
43
45
|
block in a bot's `AGENTS.md` edited by hand: move the edit into the charter or
|
|
44
46
|
outside the block, then `obk rules build`. A permission bypass in Orca's own
|
|
45
|
-
launch settings: remind the user, in plain words, every time
|
|
47
|
+
launch settings: remind the user, in plain words, every time `obk health`
|
|
48
|
+
reports it.
|
|
46
49
|
Something lying about that nobody owns: say what it is, and leave removing it
|
|
47
50
|
to them.
|
|
48
51
|
|
|
@@ -85,7 +88,11 @@ the evidence is genuinely thin, and say what would settle it.
|
|
|
85
88
|
|
|
86
89
|
Before a verdict that keeps or ends a bot, look at one real thing it produced
|
|
87
90
|
lately, not its account of itself: did it run, was it right, and would anyone
|
|
88
|
-
miss it.
|
|
91
|
+
miss it. A grooming check can stand in for that look only when it cites the
|
|
92
|
+
specific output and what the check found, still bears on this verdict and is
|
|
93
|
+
current, and you say you are inheriting it. A "looks fine" summary is not the
|
|
94
|
+
output. A changed charter, model or output, or evidence against it, warrants a
|
|
95
|
+
fresh look.
|
|
89
96
|
|
|
90
97
|
Nothing is retired or deleted because you concluded it. Stopping a bot and
|
|
91
98
|
retiring one are the two that cannot be quietly undone: propose them, give
|
|
@@ -138,6 +145,36 @@ Two of these together usually mean the charter or the settings are wrong, not
|
|
|
138
145
|
that the model is bad. Count them per bot rather than carrying an impression
|
|
139
146
|
around, and say what you counted.
|
|
140
147
|
|
|
148
|
+
## A bot's rules against a repo's
|
|
149
|
+
|
|
150
|
+
A bot that works in a repo answers to two sets of rules: its own, which are
|
|
151
|
+
its `AGENTS.md` and each session's start prompt, and the repo's. A session that
|
|
152
|
+
starts at the bot home is given only its own; the repo's reach it only if it
|
|
153
|
+
goes and reads them. So look for conflicts between the two whenever a bot
|
|
154
|
+
starts on a repo, and in every review of a bot that works in one.
|
|
155
|
+
|
|
156
|
+
The roster names each session's work dir, and a clone there is a repo the bot
|
|
157
|
+
works in. Read the bot's `AGENTS.md`, its charter and rule units, and the
|
|
158
|
+
start prompt of each session that works there, which the roster shows or
|
|
159
|
+
names the file of; the kit sends it apart from `AGENTS.md`. Then read in the
|
|
160
|
+
clone the `AGENTS.md` or `CLAUDE.md` at the root, any deeper ones, and the
|
|
161
|
+
documents they say decide. Where two passages cover the same thing, set them
|
|
162
|
+
side by side: who approves and who merges, whether work goes on a branch or
|
|
163
|
+
straight to main, who writes the tests and who reviews, what may be done
|
|
164
|
+
without asking, and what must never be done.
|
|
165
|
+
|
|
166
|
+
A conflict is where doing what one says means breaking what the other says.
|
|
167
|
+
One saying more than the other is not a conflict: the bot does both. A repo
|
|
168
|
+
rule you think is unwise is not one either; judging the repo's rules is not
|
|
169
|
+
part of this review.
|
|
170
|
+
|
|
171
|
+
Report each conflict to the user, or to whoever the bot's work comes from,
|
|
172
|
+
quoting both passages and where each lives, with its one fix: the bot's
|
|
173
|
+
charter, rules or start prompt change, or the repo's owner is asked to change
|
|
174
|
+
theirs. You change neither yourself, and nothing settles it automatically.
|
|
175
|
+
Until it is settled, the bot holds the part of its work the conflict covers;
|
|
176
|
+
tell its session what the conflict is.
|
|
177
|
+
|
|
141
178
|
## One finding, one kind of fix
|
|
142
179
|
|
|
143
180
|
Each finding gets one remedy, and the kind of remedy follows from the kind of
|
|
@@ -33,8 +33,7 @@ with thanks:
|
|
|
33
33
|
being a glossary and not a spec or a scratchpad, creating files lazily when
|
|
34
34
|
there is first something to write, the three conditions that must all hold
|
|
35
35
|
before a decision is worth recording and what each one rules out, the
|
|
36
|
-
decision note being
|
|
37
|
-
decision was made and why, optional parts included only when they earn it,
|
|
36
|
+
decision note's value being in recording that a decision was made and why,
|
|
38
37
|
and the kinds of decision usually worth writing: the architectural shape,
|
|
39
38
|
how the parts are meant to communicate with each other, a technology choice
|
|
40
39
|
that carries lock-in, a boundary and what is deliberately outside it, a
|
|
@@ -42,7 +41,7 @@ with thanks:
|
|
|
42
41
|
code, and an alternative rejected for a non-obvious reason.
|
|
43
42
|
|
|
44
43
|
`grill-with-docs` is a one-line skill that loads the two above, and `grill-me`
|
|
45
|
-
one that loads `grilling` alone. ADR
|
|
44
|
+
one that loads `grilling` alone. ADR 0019 proposes that a kit skill carries
|
|
46
45
|
what it needs rather than relying on another being loaded, so the two are
|
|
47
46
|
consolidated here into one. Issue #46 asks for a skill that works
|
|
48
47
|
on its own, and PRD 7.2 proposes this shape (one self-contained skill that
|
|
@@ -93,6 +92,15 @@ not mistaken for consolidation:
|
|
|
93
92
|
merely agreed with in passing, and what had been assumed on his behalf, were
|
|
94
93
|
the things that later had to be untangled.
|
|
95
94
|
|
|
95
|
+
- **A decision note lists its alternatives and is replaced whole.**
|
|
96
|
+
`ADR-FORMAT` makes a note one paragraph, with the rejected options and the
|
|
97
|
+
consequences optional. The owner decided that a decision record lists every
|
|
98
|
+
alternative that was on the table with why it was not chosen, and that a
|
|
99
|
+
change is a new record replacing the old one whole, restating what still
|
|
100
|
+
holds with the full context and history (issue #264, 2026-09-24). `obk-arch`
|
|
101
|
+
teaches the record; this skill's note says the same, so the two do not
|
|
102
|
+
disagree.
|
|
103
|
+
|
|
96
104
|
- **Questions are kept short.** `grilling` allows a question several
|
|
97
105
|
paragraphs of setup; a long one here is taken as a sign it is two questions
|
|
98
106
|
or that teaching should come first.
|
|
@@ -56,8 +56,10 @@ recommendation you do not believe wastes the round.
|
|
|
56
56
|
Q2: <what the question is about>
|
|
57
57
|
...
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
Up to about three useful, answerable questions is a round, and none added to make
|
|
60
|
+
up the number. Do not put a large frontier at once: a round of nine is a form,
|
|
61
|
+
and it gets filled in like one. When only one or two decisions are left, ask them
|
|
62
|
+
and finish.
|
|
61
63
|
|
|
62
64
|
Keep each question short enough to answer in a sentence. When a question needs
|
|
63
65
|
three paragraphs of setup, that is usually a sign it is really two questions,
|
|
@@ -176,11 +178,13 @@ just does not need the essay. An easy one will simply be re-made, an
|
|
|
176
178
|
unsurprising one raises no questions, and one with no alternative has nothing
|
|
177
179
|
to explain beyond doing the obvious thing.
|
|
178
180
|
|
|
179
|
-
One of these is
|
|
180
|
-
and why
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
181
|
+
One of these is as short as it can be while it says what the situation was,
|
|
182
|
+
what was decided and why, each alternative that was on the table with why it
|
|
183
|
+
was not chosen, and what the choice costs. The value is in recording *that* it
|
|
184
|
+
was decided and *why*, not in filling in headings. When the decision changes,
|
|
185
|
+
write a new note that replaces the old one whole: it restates what still holds,
|
|
186
|
+
gives the full context, and says what each earlier note decided and why it
|
|
187
|
+
changed. The old note changes only to say which note replaced it.
|
|
184
188
|
|
|
185
189
|
The ones worth writing are usually: the overall shape of the thing, and how
|
|
186
190
|
its parts are meant to talk to each other; a choice that will be expensive to
|
|
@@ -110,8 +110,11 @@ does not wait.
|
|
|
110
110
|
A bot reporting on its own work has the same blind spot as the work. Its
|
|
111
111
|
summary was written by the thing being reviewed.
|
|
112
112
|
|
|
113
|
-
So each run, take one output a bot actually
|
|
114
|
-
the message, the change, the answer.
|
|
113
|
+
So each run that has work in its window, take one output a bot actually
|
|
114
|
+
produced and look at it: the file, the message, the change, the answer. A run
|
|
115
|
+
whose window held no work says so in a line and checks nothing: reopening
|
|
116
|
+
yesterday's output adds nothing, and inventing activity to have one to check is
|
|
117
|
+
worse. Three questions are enough. Did the work
|
|
115
118
|
happen at all. Is the result right. Would anyone notice if this stopped.
|
|
116
119
|
|
|
117
120
|
One checked output beats a page of self-reports, and it is what turns a
|
|
@@ -38,7 +38,7 @@ PRD 6.5 decides the part neither source covers: clearing a session triggers no
|
|
|
38
38
|
handoff. This skill runs when it is asked for. Both originals hold themselves
|
|
39
39
|
to that too, mattpocock's with `disable-model-invocation: true` in its
|
|
40
40
|
frontmatter and pstack's in the playbook's own first line, "this is explicit
|
|
41
|
-
only". That frontmatter is not portable (ADR
|
|
41
|
+
only". That frontmatter is not portable (ADR 0019), so here the description
|
|
42
42
|
carries it: the phrases that ask for it, and the two things that do not
|
|
43
43
|
trigger it.
|
|
44
44
|
|
|
@@ -46,7 +46,7 @@ missing one as a limit on what could be checked. The privacy rule is kept and
|
|
|
46
46
|
generalised: another project's history is not read without being asked.
|
|
47
47
|
|
|
48
48
|
One departure: the original keeps itself from being invoked on its own with
|
|
49
|
-
`disable-model-invocation: true`, which is not portable frontmatter (ADR
|
|
49
|
+
`disable-model-invocation: true`, which is not portable frontmatter (ADR 0019
|
|
50
50
|
and PRD 7.2: these run on purpose, never automatically). Its description can
|
|
51
51
|
therefore say "before starting or resuming work" safely; ours cannot, so the
|
|
52
52
|
description and the skill both say it runs when it is asked for, and that
|
|
@@ -119,7 +119,7 @@ anything out from whatever sources exist, keeps the confidence labels and the
|
|
|
119
119
|
null-result discipline in the skill itself, and leaves how the work is divided
|
|
120
120
|
up to whoever is doing it.
|
|
121
121
|
|
|
122
|
-
Where this overlaps `obk-why`, that is deliberate and allowed by ADR
|
|
122
|
+
Where this overlaps `obk-why`, that is deliberate and allowed by ADR 0019: a
|
|
123
123
|
skill carries what it needs rather than depending on another being loaded.
|
|
124
124
|
`obk-why` anchors in code and its history; this one is about sources, coverage
|
|
125
125
|
and how far a claim can be trusted.
|
|
@@ -67,11 +67,15 @@ precise citation is worth more than a paragraph of plausible summary.
|
|
|
67
67
|
|
|
68
68
|
- **Quote rather than paraphrase** where the wording carries the weight, and
|
|
69
69
|
record where it came from closely enough that a reader can land on it.
|
|
70
|
-
- **Go wide
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
- **Go as wide as the question is open.** While claims are unresolved or
|
|
71
|
+
contrary evidence is plausible, cast a broad net so you find out what is
|
|
72
|
+
adjacent, then go deep on what matters. A narrow question that one
|
|
73
|
+
authoritative record settles needs no broad net.
|
|
74
|
+
- **Read far enough to trust the part you use.** The title and the summary are
|
|
75
|
+
what someone wanted it to say. The qualification that changes the answer is
|
|
76
|
+
usually further down, in a footnote, a reply or a revision; read on until you
|
|
77
|
+
know none bears on your claim. Settling one flag does not take the whole
|
|
78
|
+
manual.
|
|
75
79
|
- **Resist the story.** When three things line up and a fourth does not, the
|
|
76
80
|
fourth is the interesting one. It does not get filed away for tidiness.
|
|
77
81
|
- **Consider the other way round.** Before calling something strong evidence,
|
|
@@ -86,8 +90,8 @@ means something to a reader who knows what was looked for: "nothing there" is
|
|
|
86
90
|
worth little, and "searched these three places for these terms, found nothing"
|
|
87
91
|
tells the next person where not to go again.
|
|
88
92
|
|
|
89
|
-
|
|
90
|
-
what to do next. Too many results means the
|
|
93
|
+
While the answer is still open, run several related queries rather than one.
|
|
94
|
+
How the search goes tells you what to do next. Too many results means the
|
|
91
95
|
question is too broad: narrow it, or sample deliberately across the different
|
|
92
96
|
kinds rather than taking the first few. Too few usually means the words are
|
|
93
97
|
wrong rather than the answer missing: try what the field itself calls the
|
|
@@ -222,7 +226,11 @@ been smoothed over. It is worth going back and asking which.
|
|
|
222
226
|
|
|
223
227
|
## What you hand back
|
|
224
228
|
|
|
225
|
-
Lead with the answer and how sure you are, in a few lines.
|
|
229
|
+
Lead with the answer and how sure you are, in a few lines. What follows are the
|
|
230
|
+
questions the hand-back has to answer, not headings to print: a one-line answer
|
|
231
|
+
is one line, and it still carries its citation and any uncertainty or search
|
|
232
|
+
limit that would change how it is used. Leave out what has nothing in it; an
|
|
233
|
+
empty section says nothing. Then:
|
|
226
234
|
|
|
227
235
|
- **The question**, as you understood it, and what you left out of it.
|
|
228
236
|
- **What the sources say**, each with where it came from and its date, and the
|
|
@@ -231,7 +239,9 @@ Lead with the answer and how sure you are, in a few lines. Then:
|
|
|
231
239
|
- **What follows from that**, marked as your reasoning rather than as findings.
|
|
232
240
|
- **Other explanations that fit**, where more than one does.
|
|
233
241
|
- **Where sources disagree**, with both sides and their citations.
|
|
234
|
-
- **What you could not find out**, with what you searched
|
|
242
|
+
- **What you could not find out**, with what you searched: the boundary of the
|
|
243
|
+
search, what settled the answer, and the places that could matter which you
|
|
244
|
+
left unchecked.
|
|
235
245
|
- **Where you looked**, one line per source, including the ones that held
|
|
236
246
|
nothing and the ones you could not reach, with the reason.
|
|
237
247
|
|
|
@@ -387,7 +387,10 @@ test you wrote yourself closes the thread and loses the check.
|
|
|
387
387
|
|
|
388
388
|
**Then fix, in this order:** what is broken or unsafe, then the small certain
|
|
389
389
|
things, then the structural ones. One at a time, running the check after each,
|
|
390
|
-
so you know which change did what.
|
|
390
|
+
so you know which change did what. Fixes that touch only wording can go
|
|
391
|
+
together, and so can changes whose shared check still shows which one failed; a
|
|
392
|
+
behaviour change still gets the check that covers it. Say how you grouped them
|
|
393
|
+
and which checks you ran.
|
|
391
394
|
|
|
392
395
|
**Answer plainly.** No performative agreement, no thanks, no apology: state the
|
|
393
396
|
fix or state the pushback. If you pushed back and turned out to be wrong, say
|