@awebai/oats 0.23.0 → 0.23.1

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 (37) hide show
  1. package/README.md +48 -18
  2. package/capabilities/oats-okf/agents/memory-harvest/AGENTS.md +18 -24
  3. package/capabilities/oats-okf/agents/memory-harvest/soul.yaml +2 -2
  4. package/capabilities/oats-okf/bin/oats-okf.mjs +105 -517
  5. package/capabilities/oats-okf/injects/okf.md +32 -67
  6. package/capabilities/oats-okf/lib/config.mjs +112 -0
  7. package/capabilities/oats-okf/lib/inspection.mjs +96 -0
  8. package/capabilities/oats-okf/lib/io.mjs +103 -0
  9. package/capabilities/oats-okf/lib/migration.mjs +116 -0
  10. package/capabilities/oats-okf/lib/sources.mjs +238 -0
  11. package/capabilities/oats-okf/lib/stores.mjs +331 -0
  12. package/capabilities/oats-okf/lib/worker.mjs +352 -0
  13. package/capabilities/oats-okf/oats.json +23 -7
  14. package/capabilities/oats-okf/schemas/okf-base.schema.json +46 -0
  15. package/capabilities/oats-okf/schemas/okf-bindings.schema.json +112 -0
  16. package/capabilities/oats-okf/schemas/okf-soul.schema.json +37 -0
  17. package/capabilities/oats-okf/skills/memory-harvest/SKILL.md +263 -140
  18. package/capabilities/oats-okf/skills/okf/SKILL.md +13 -4
  19. package/docs/capabilities.md +14 -3
  20. package/docs/configuration.md +11 -1
  21. package/docs/design/okf-mirror-provenance.md +105 -0
  22. package/docs/desktop-cli-api.md +59 -10
  23. package/docs/first-team-demo.md +6 -1
  24. package/docs/first-team.md +151 -115
  25. package/docs/integrations.md +42 -42
  26. package/docs/knowledge-capability-authoring.md +10 -7
  27. package/docs/knowledge-migration.md +138 -0
  28. package/docs/knowledge.md +316 -129
  29. package/docs/layers.md +57 -62
  30. package/docs/migration-from-oas.md +7 -1
  31. package/docs/packages.md +26 -2
  32. package/docs/release-notes/v0.23.1.md +97 -0
  33. package/docs/schedules.md +42 -3
  34. package/docs/souls-and-instances.md +55 -48
  35. package/package-catalog.json +6 -1
  36. package/package.json +1 -1
  37. package/capabilities/oats-okf/lib/harvest-branch.mjs +0 -43
@@ -0,0 +1,105 @@
1
+ # Internal: finalizing the OKF mirror's source provenance
2
+
3
+ The standalone `oats.okf` distribution is authoritative. The framework's
4
+ `capabilities/oats-okf/` and `scripts/okf-source-inventory.json` are generated
5
+ mirrors, not authoring surfaces. This procedure does not publish the source,
6
+ accept a PR, update the catalog, commit, fetch, or change branches.
7
+
8
+ ## Development versus publication
9
+
10
+ - `node scripts/check-okf-mirror.mjs --generate --source <standalone-repository>`
11
+ captures current exported working bytes, including dirty/untracked files.
12
+ It always records `release.status: pending`, null final refs and
13
+ `published: false`, even when HEAD happens to have a published tag.
14
+ - `node scripts/check-okf-mirror.mjs --verify` uses only the checked-in inventory
15
+ and mirror. No Git, clone, credentials or network is needed for either a
16
+ pending or finalized inventory. It checks exact file sets (including empty
17
+ directories), file bytes, portable Git executable modes, literal symlink
18
+ targets, wrapper hashes, and consistent release metadata.
19
+ - `--verify-source --source <standalone-repository>` verifies pending snapshots
20
+ against their exact recorded working state, including branch/dirty metadata.
21
+ For published inventories it rechecks the immutable commit, payload, origin
22
+ tag object and peeled commit, ignoring the recorded local branch name. The
23
+ checkout must still be clean at the recorded accepted commit; renamed
24
+ branches and detached HEAD are supported. This published-source check needs
25
+ origin access. It does not depend on cached remote-tracking refs.
26
+
27
+ Offline verification is an integrity check of a reviewed checked-in inventory,
28
+ not independent proof that a remote still advertises a tag. The explicit source
29
+ check supplies that evidence. No boolean flag is a publication attestation.
30
+
31
+ ## Post-publication command
32
+
33
+ Only after source review/merge and actual publication of `v2.0.0`:
34
+
35
+ 1. Obtain the **accepted full merged commit ID** from the source review/release
36
+ record. Do not substitute a mutable branch name, abbreviated hash, or whatever
37
+ HEAD happens to resolve to. The legacy inventory field `finalMergedCommit`
38
+ records this caller-supplied acceptance; Git cannot prove human PR approval.
39
+ 2. Have a clean standalone checkout at that commit, with the published tag
40
+ available locally and `origin` pointing to `awebai/oats-okf`. Fetch/check out
41
+ deliberately through the parent release procedure; the checker never does it.
42
+ 3. From the framework checkout, run:
43
+
44
+ ```bash
45
+ node scripts/check-okf-mirror.mjs --finalize \
46
+ --source .agents/knowledge-rework/repos/okf \
47
+ --final-tag v2.0.0 \
48
+ --final-commit "${OKF_V2_ACCEPTED_COMMIT:?set the reviewed full merged source commit ID}" &&
49
+ node scripts/check-okf-mirror.mjs --verify-source \
50
+ --source .agents/knowledge-rework/repos/okf &&
51
+ node --test test/okf-mirror-parity.test.mjs
52
+ ```
53
+
54
+ The relative source path above is the existing ignored work-view convention;
55
+ substitute an explicitly resolved standalone repository path in other work
56
+ views. The command must not be run while source acceptance is still changing.
57
+
58
+ 4. Review the resulting payload/inventory diff, run the remaining release gates,
59
+ then advance the catalog through the parent integration process. Finalization
60
+ itself never touches the catalog.
61
+
62
+ `--finalize` requires both `--final-tag` and a full SHA-1/SHA-256 `--final-commit`.
63
+ It replaces only the mirrored capability and inventory, just like `--generate`,
64
+ but stamps `release.status: published` only after all checks succeed:
65
+
66
+ - The version tag is exactly `v<distribution version>`; HEAD is the explicitly
67
+ accepted commit and Git reports a clean source tree. Masked index entries
68
+ (`assume-unchanged`/`skip-worktree`) are not accepted.
69
+ - Actual exported files and wrappers match raw objects at that commit, not just
70
+ Git status or filtered checkout content. Ignored exported extras, untracked
71
+ empty directories, CRLF/filter changes, hidden byte changes, mode drift with
72
+ `core.filemode=false`, and literal symlink-target differences fail closed.
73
+ Git replacement objects are disabled. Published inventories also record and
74
+ hash wrapper file modes; materialization preserves those modes and bytes.
75
+ - Exactly one effective origin fetch URL identifies the official source. The
76
+ usual official GitHub HTTPS/SSH spellings are equivalent. URL rewrites to an
77
+ unrelated repository are rejected. The remote query uses canonical public
78
+ HTTPS with source-local Git configuration disabled, so local upload-pack/SSH
79
+ overrides cannot fabricate its response. Prompts/helpers are disabled and
80
+ Git commands have a bounded timeout.
81
+ - The local tag resolves to the accepted commit. A fresh `ls-remote` query must
82
+ advertise the same tag object and the same peeled commit (or direct commit
83
+ for a lightweight tag). Both annotated and lightweight tags are supported.
84
+ Missing/unreachable origin, unpublished tags or mismatched refs fail closed.
85
+ - The source is checked again after staging the copy, before replacing the
86
+ mirror or inventory. Failed acceptance checks leave both untouched. Ordinary
87
+ filesystem failures during replacement are not a multi-file transaction.
88
+
89
+ The published record retains `source.head`, clean-state metadata, the branch
90
+ observed at generation (informational during immutable verification), the
91
+ accepted final tag/commit, `remote: origin`, and the exact `tagObject`. Thus
92
+ changing an annotated tag object without changing its commit still invalidates
93
+ `--verify-source`. Remote checks attest what was advertised when queried; they
94
+ cannot prevent an upstream tag from being moved later. Do not move released
95
+ tags, and re-run source verification at the release gate.
96
+
97
+ ## Isolated regression coverage
98
+
99
+ `test/okf-mirror-parity.test.mjs` uses temporary source repositories and local bare
100
+ origins only, including tag creation/deletion/movement solely inside fixtures.
101
+ The JavaScript `finalizeOkfMirror`/`verifyOkfSource` APIs accept an explicit
102
+ `repository` expectation for these fixtures and record their real source
103
+ identity; the CLI cannot override the official repository. No tests publish to
104
+ GitHub. Checked-in mirror tests accept consistent pending **or** published
105
+ provenance, so finalizing the source does not require weakening those tests.
@@ -18,7 +18,8 @@ prints exactly one JSON object on stdout:
18
18
  ```
19
19
 
20
20
  `version` is the installed package's exact semver (e.g. `0.20.0`).
21
- Desktop 0.22 accepts `desktopApi === 1` and semver `>=0.22.0 <0.23.0`.
21
+ Desktop 0.23 accepts `desktopApi === 1` and semver `>=0.22.0 <0.24.0`
22
+ (the earlier Desktop 0.22 band was `>=0.22.0 <0.23.0`).
22
23
 
23
24
  Optional features are negotiated from the probe's `features` array. Starting
24
25
  an existing home requires `session-start`; named launch configurations and
@@ -138,18 +139,66 @@ subcommand), `E_CAPABILITY_INACTIVE`, `E_CAPABILITY_BLOCKED` (untrusted),
138
139
  `E_CAPABILITY_BROKEN`, `E_DUPLICATE_NAMESPACE`, `E_CONFIG_BROKEN` — all still
139
140
  exactly one stdout envelope with a nonzero exit.
140
141
 
141
- ### `oats okf harvest --json`
142
+ ### Knowledge operations and OKF v2
142
143
 
143
- Run with cwd fixed to the resolved instance home. `result` is one of:
144
+ Discover provider-declared operations rather than assuming a particular memory
145
+ format. The knowledge capability's version owns its result shape; CLI API v1
146
+ does not freeze the old OKF v1 `harvest: spawned|skipped` body for every provider.
147
+ See [knowledge](knowledge.md) for the prepared OKF 2.0.0 version scope.
148
+
149
+ ```bash
150
+ oats operation run knowledge:inspect --home /absolute/source-home --json
151
+ oats operation run knowledge:harvest --home /absolute/source-home --json
152
+ ```
153
+
154
+ The operation runner preserves the provider view/action through the ordinary
155
+ operations contract. Direct `oats okf inspect` returns the standard JSON-v1
156
+ success/error envelope. Its result includes:
157
+
158
+ - `summary`, durable `source`, frozen `owns`, `reads`, `bases`;
159
+ - `acceptedView` (the registered snapshot, not a fresh read), `status` with
160
+ capture/processing/delivery/acceptance receipts, and `scheduler` diagnostics;
161
+ - `liveMemory: {available, reason, observedAt}` and labeled `documents`.
162
+
163
+ Live Markdown documents are `Working state (STATE.md)`, `Log (log.md)` and
164
+ sorted `Pending note: <relative-name>`, including nested notes. Missing files
165
+ are omitted; durable receipts follow as a text document. Only a live source
166
+ whose pointer/metadata still matches may supply live memory. Retired, missing,
167
+ reused or unverified homes return durable documents and explicit unavailability.
168
+ Unsafe live documents fail instead of returning a partial success. Inspection is
169
+ read-only and does not capture, refresh, schedule or launch a model.
170
+
171
+ The explicit preview limit is **256 KiB per document**, with `truncated: true`
172
+ and original `bytes` for larger files. Smaller files are byte-exact. The complete
173
+ JSON envelope drains stdout; consumers must not clip it at a small output-buffer
174
+ limit. Provider `read` returns full Markdown, not this inspection preview.
175
+
176
+ After the home disappears, operate from durable deployment context:
177
+
178
+ ```bash
179
+ oats okf inspect --source /absolute/state/sources/UUID/source.json --soul domain-expert --json
180
+ oats okf refresh --source /absolute/state/sources/UUID/source.json --soul domain-expert --json
181
+ ```
182
+
183
+ Every descriptor-selected read/refresh creates its new view under that source's
184
+ state directory, not the invoking repository or a replacement home.
185
+
186
+ Direct `oats okf harvest --json` captures notes and record and requests an
187
+ independent directory worker. Representative result shapes (not exhaustive):
188
+
189
+ ```json
190
+ {"status":"running","run":"<run-id>","instance":"<worker-instance>","home":"/absolute/worker-home"}
191
+ ```
144
192
 
145
193
  ```json
146
- {"harvest":"spawned","instance":"memory-harvest-<slug>","window":"memory-harvest-<slug>"}
147
- {"harvest":"skipped","reason":"no pending notes"}
194
+ {"status":"empty","processed":true}
148
195
  ```
149
196
 
150
- Failure: `{"schemaVersion":1,"ok":false,"error":{"code":"E_HARVEST_FAILED","message":"..."}}`
151
- with exit 1. Skip reasons are human-readable strings (loop guard, no notes,
152
- no root, no identity, harvester already running, workspace-mode soul not in a
153
- git repo).
197
+ An explicit `--no-launch` request can return `status: "ready"` without starting
198
+ a model; existing runs report their current status without starting duplicates.
199
+ Nonzero errors use the ordinary JSON-v1 error envelope. `running`/`ready` are not
200
+ successful knowledge delivery. Inspect and reconcile provider receipts; never
201
+ infer acceptance from a launch or from a worker disappearing.
154
202
 
155
- Contract tests / canonical fixtures: `test/cli-json-contract.test.mjs`.
203
+ Kernel envelope/dispatch tests live in `test/cli-json-contract.test.mjs`;
204
+ provider-specific behavior is qualified against the exported OKF runtime.
@@ -4,6 +4,10 @@ On 2026-09-05 we installed the published OATS artifacts and used Pi and
4
4
  Claude Code workers to fix issues found during a fresh review. The first
5
5
  team's work was release preparation in this repository.
6
6
 
7
+ > **Historical v1 qualification.** The results below remain evidence for the
8
+ > named versions, not the prepared v2 runtime. Current setup, external ownership
9
+ > and independent delivery are in [the first-team guide](first-team.md).
10
+
7
11
  ## The setup
8
12
 
9
13
  | Component | Qualified value |
@@ -82,6 +86,7 @@ The run found first-use problems that unit tests alone had not resolved:
82
86
  - A combined workspace roster did not make the workspace a spawn scope for
83
87
  every child repository. Commands select the owning repository explicitly.
84
88
 
85
- The [first-team guide](first-team.md) includes these setup details. The
89
+ The [first-team guide](first-team.md) now describes the prepared v2 setup;
90
+ these historical v1 outcomes are not v2 acceptance evidence. The
86
91
  package owners are responsible for improving their defaults; the kernel
87
92
  continues to resolve capabilities through the same replaceable contracts.
@@ -1,21 +1,22 @@
1
1
  # Run your first OATS team
2
2
 
3
- Start with one repository and one small, real task. An OATS soul keeps the
4
- role and knowledge; an instance gets a working session and a Git worktree.
5
- Review its work, let it promote useful notes, then retire the instance.
3
+ Start with one repository and one small, real task. A soul keeps the role and
4
+ curated skills; an instance gets a working session and repository view. With OKF
5
+ v2, expertise lives in external owned nodes, not the soul or task branch.
6
6
 
7
- This guide follows the published **0.22.0** path exercised on 2026-09-05
8
- with `oats.dev` 1.0.0, `oats.okf` 1.4.1, `oats.aweb` 1.8.0, and
9
- `oats.authoring` 1.0.0. The [qualification example](first-team-demo.md)
10
- records the actual tasks and outcomes. Existing OAS users should follow
11
- [the migration guide](migration-from-oas.md) first.
7
+ > This guide targets the **v0.23.1 integration of published OKF 2.0.0**, whose
8
+ > published kernel prerequisite is OATS >=0.23.0. Check the matching framework
9
+ > release availability before installation; see [release notes](release-notes/v0.23.1.md).
10
+ > The [qualification example](first-team-demo.md) records real **v1** tasks on
11
+ > earlier versions, not v2 acceptance. Existing knowledge needs
12
+ > [v1 preservation and cutover](knowledge-migration.md), not fresh initialization.
12
13
 
13
14
  ## Install and choose a scope
14
15
 
15
- Have Node.js 22+, Git, tmux, and an authenticated agent runtime available.
16
- Launch Pi or Claude Code once yourself to confirm that your chosen model
17
- works. The current OKF package runs its harvester in **Pi**, including when
18
- its working agent uses Claude Code, so this configuration needs Pi too.
16
+ Install matching published kernel and Pi adapter releases. Have Node.js 22+, Git, tmux and an authenticated working runtime
17
+ available. OKF's independent worker can use Pi, Claude or Codex; authenticate
18
+ that selected runtime too. Plain-directory knowledge needs no Git/gh, although
19
+ this guide's coding worktree does need Git.
19
20
 
20
21
  ```bash
21
22
  npm install -g @awebai/oats@latest
@@ -23,150 +24,186 @@ pi install npm:@awebai/oats-pi@latest
23
24
  node --version
24
25
  tmux -V
25
26
  oats version
26
- ```
27
-
28
- Install matching kernel and adapter versions from the same release.
29
-
30
- Use a repository with an initial Git commit. Keep your normal working
31
- changes committed or otherwise accounted for before giving an agent work.
32
- The commands below run from that repository:
33
-
34
- ```bash
35
27
  cd /path/to/project
36
- oats init --package oats.dev --config default
28
+ oats init --raw
29
+ oats install git:github.com/awebai/oats-okf@v2.0.0
37
30
  oats list
38
31
  ```
39
32
 
40
- Initialization acquires the package closure and writes an editable
41
- `oats-config.yaml` plus an exact lock. It does not create a team account or
42
- approve executable hooks. `oats.dev` is our reference development policy;
43
- edit its team name and provider choices for your own project.
33
+ Use a repository with an initial commit for this coding-worktree example.
34
+ Raw initialization writes editable configuration with integrations disabled;
35
+ installation separately acquires the published OKF 2.0.0 closure and exact lock.
36
+ Neither step approves hooks, authenticates a runtime or joins a team. Inspect
37
+ the acquired version before continuing. An existing development template or
38
+ lock may still select v1: follow explicit preservation/update/cutover instead
39
+ of applying fresh initialization or carrying v1 knowledge settings into v2.
44
40
 
45
- For several repositories, initialize their common workspace directory
46
- instead. Run create/spawn/retire with `--dir /path/to/workspace/project` for
47
- the repository that owns the soul. `oats status --team` at the workspace
48
- shows the combined roster, but that does not select a repository for spawn.
41
+ For several repositories initialize their common workspace, then select the
42
+ repository owning the soul with `--dir /path/to/workspace/project` for
43
+ create/spawn/retire. A team roster does not select a work repository for spawn.
49
44
 
50
- ## Set the model and connect messaging
45
+ ## Configure explicit knowledge and optional messaging
51
46
 
52
47
  Edit the existing entries in `oats-config.yaml`; do not append a second
53
- `capabilities` block. Set `team.name` to your own team. If you already use
54
- aw, set `team.id` to its exact existing ID so instances join that team.
55
-
56
- Under `capabilities.layers`, configure the model your Pi installation can
57
- actually use. This example was used in our qualification; replace the
58
- model if you authenticate through another provider:
48
+ `capabilities` map. This example targets only the source soul for knowledge:
59
49
 
60
50
  ```yaml
61
- knowledge:
62
- capability: oats.okf
63
- from: installed
64
- settings:
65
- harvest-model: openai-codex/gpt-5.5
66
- messaging:
67
- capability: oats.aweb
68
- from: installed
69
- global: true
70
- souls:
71
- memory-harvest: false
72
- tasks: none
51
+ agent-types:
52
+ developers:
53
+ description: Coding experts
54
+ capabilities:
55
+ layers:
56
+ knowledge:
57
+ capability: oats.okf
58
+ from: installed
59
+ souls:
60
+ backend-expert:
61
+ enabled: true
62
+ settings:
63
+ bindings-file: /absolute/config/okf-bindings.json
64
+ harvest-runtime: pi
65
+ messaging: none
66
+ tasks: none
73
67
  ```
74
68
 
75
- The `oats.okf` 1.4.1 default harvester model is
76
- `github-copilot/gpt-5.5`; it will not work without that provider. The
77
- messaging exclusion above keeps temporary harvesters from creating aliases
78
- while an identity-retirement issue is being corrected. Workers still get
79
- messaging identities. With a `souls` exclusion, state `global: true`
80
- explicitly so scope-level commands such as `oats aweb setup` stay active.
69
+ There is no hardcoded required harvester model in v2: omitted `harvest-model`
70
+ uses the selected runtime's configured default. Choose a model explicitly if
71
+ needed. Source and worker runtimes are independent.
81
72
 
82
- Review and approve the executable capabilities, then check onboarding:
73
+ Review the acquired Git payload and approve executable surfaces:
83
74
 
84
75
  ```bash
85
76
  oats trust oats.okf
86
- oats trust oats.aweb
87
- oats aweb setup
88
- oats doctor
89
77
  ```
90
78
 
91
- `oats aweb setup` prints the next step: install the `aw` CLI if needed,
92
- initialize an identity with `aw init`, then create or join your team. Follow
93
- that output and rerun setup until it confirms membership. For an existing
94
- team, join it rather than creating another with the same name. Setup's exit
95
- status alone does not establish that onboarding finished.
96
-
97
- Messaging is optional. To work without it, set `messaging: none`, omit the
98
- aweb trust/setup commands, and keep the knowledge configuration above.
99
- Packages, souls, Git worktrees, and local knowledge do not require hosted
100
- messaging. See [configuration](configuration.md) for other providers.
79
+ Use the catalog Git package, not the bundled npm mirror: npm omits the source
80
+ worker's `CLAUDE.md` symlink, so the mirror is not a self-contained distribution.
81
+ Acquisition alone is not activation or trust.
101
82
 
102
- ## Give an instance a real task
83
+ Messaging is optional. If desired, retain/configure the template's `oats.aweb`
84
+ layer, set `team.name` and any existing `team.id`, then review/trust it and run
85
+ `oats aweb setup`. Follow its install, initialization and create/join instructions
86
+ until it confirms membership. Join an existing team rather than duplicating it;
87
+ setup's exit status alone does not establish onboarding completion. A source-only
88
+ knowledge target does not require the service worker to have a messaging identity.
103
89
 
104
- On 0.22.0, create the roster directory first; a fresh-scope creation fix is
105
- included in 0.22.1.
90
+ ## Create the soul and provision an external base
106
91
 
107
92
  ```bash
108
- mkdir -p agents
109
93
  oats create backend-expert --type developers --repo . --work worktree --runtime pi
110
94
  ```
111
95
 
112
- Edit `agents/backend-expert/soul/AGENTS.md` to describe the role, repository
113
- conventions, and the checks that matter. Review and commit the new soul,
114
- configuration, lock, generated ignore rules, and adopted template base under
115
- `.agents/config-templates/adopted/`. A worktree starts from a Git commit;
116
- uncommitted soul changes are not present on the worker's branch. Keep aw
117
- credentials out of Git.
96
+ Edit `agents/backend-expert/soul/AGENTS.md` for the role and required checks.
97
+ V2 does not scaffold knowledge in the soul. For a small local first base, create
98
+ `/absolute/config/okf-bindings.json`:
118
99
 
119
- Then launch one bounded task:
100
+ ```json
101
+ {"version":1,"stateDir":"../durable-okf-state","bases":{"team":{"id":"team-knowledge","kind":"directory","path":"../team-knowledge"}}}
102
+ ```
103
+
104
+ Those paths resolve from `/absolute/config`, not the project. Choose durable,
105
+ physical paths outside the source home/worktree and **outside every Git working
106
+ tree**, including ignored directories. State, accepted bases and bindings must
107
+ not overlap. Review [full placement rules](knowledge.md#bindings-document).
108
+
109
+ Create `/absolute/config/team-nodes.json`:
110
+
111
+ ```json
112
+ {"backend":{"path":"backend","owner":"backend-expert-stable-id"}}
113
+ ```
114
+
115
+ Explicitly provision the new base, refusing any existing destination:
120
116
 
121
117
  ```bash
122
- oats spawn backend-expert --purpose first-fix --task "Fix one small issue, run the relevant checks, commit the change, and report what changed. Capture any reusable lesson and harvest it before finishing."
118
+ oats okf init --base team --nodes /absolute/config/team-nodes.json --confirm --soul backend-expert --json
119
+ ```
120
+
121
+ Write `agents/backend-expert/soul/okf.json`:
122
+
123
+ ```json
124
+ {"version":1,"owner":"backend-expert-stable-id","owns":["team/backend"],"reads":[]}
125
+ ```
126
+
127
+ For team-shared Git knowledge instead, follow [Git provisioning](knowledge.md#owner-and-base-descriptors)
128
+ and review/merge its initialization PR before spawning. Git knowledge always
129
+ uses PR delivery, not commits on the coding instance's branch.
130
+
131
+ Review and commit soul/configuration/lock changes, generated ignore rules and
132
+ the adopted template base under `.agents/config-templates/adopted/`. Keep
133
+ credentials and private durable evidence out of Git. Check `oats doctor --soul
134
+ backend-expert --json`. Configuration and a successful doctor do not substitute
135
+ for accepted-base validation by the required spawn hook.
136
+
137
+ ## Give an instance a real task
138
+
139
+ ```bash
140
+ oats spawn backend-expert --purpose first-fix --task "Fix one small issue, run the relevant checks, commit the code change, and report what changed. Read the relevant accepted knowledge indexes and capture non-obvious lessons in notes."
123
141
  oats status --team
124
142
  ```
125
143
 
126
- Choose `--runtime claude` at creation for a Claude Code worker. Today its
127
- first session can require **two interactive confirmations**: folder trust
128
- and the development-channels confirmation used by the aweb integration.
129
- Attach to the tmux session printed by spawn and answer them. A created
130
- window is not evidence that the agent has started working.
144
+ Choose `--runtime claude` or `codex` if preferred. Complete any native folder
145
+ trust, authentication or messaging-plugin confirmations in the printed session.
146
+ A created window is not proof the agent is working.
147
+
148
+ The instance home is under `agents/<soul>/instances/<instance>/`; `work/` is its
149
+ Git worktree. `knowledge/view.json` identifies immutable accepted snapshots.
150
+ The worker reads indexes selectively, maintains state/log/notes, and never edits
151
+ accepted knowledge. This is instructional, not an OS filesystem sandbox.
152
+ Review its code commits through the repository's ordinary PR workflow.
131
153
 
132
- Each instance has a home under `agents/<soul>/instances/<instance>/`; its
133
- `work/` directory is the repository worktree. Read the instance's report
134
- and review its commits there. Agents using aw run coordination commands
135
- from their own home, which holds their identity.
154
+ ## Inspect, judge and retire
136
155
 
137
- ## Harvest, review, and retire
156
+ From the source home, read-only inspection shows identity-matching state/log/notes
157
+ plus durable processing receipts:
138
158
 
139
- With OKF active, the worker keeps state and notes in its home. After a
140
- commit it can run `oats okf harvest` there. If it reports pending notes but
141
- has not harvested, ask it to do so, or run the command from that instance's
142
- home yourself. Retirement does not initiate knowledge promotion.
159
+ ```bash
160
+ oats okf inspect --json
161
+ ```
162
+
163
+ Spawn registered one per-source command job, but **did not install a host timer**.
164
+ For this first task an operator may request one manual harvest from the source
165
+ home; without `--no-launch` this starts the configured model worker:
166
+
167
+ ```bash
168
+ oats okf harvest --json
169
+ ```
143
170
 
144
- The harvester reviews notes, updates the soul's knowledge, and commits the
145
- promotion into the worker's branch. Let it finish before final review or
146
- retirement. Review **all** commits, including the promotion, and merge the
147
- accepted work into the repository's main branch through your normal
148
- workflow. Then, from the repository scope:
171
+ The worker judges durable notes **and captured record**, in its own directory
172
+ execution space. It leaves live notes and soul skills untouched. Directory
173
+ delivery is recoverable publication with validation and receipts. Git delivery
174
+ requires a real reviewed PR and merge-visible acceptance. Inspect receipts rather
175
+ than equating a worker spawn with learning. See [operator commands](knowledge.md#inspection-and-operator-commands)
176
+ for scaffold-only requests, completion and retry.
177
+
178
+ Source retirement need not wait for a worker to finish: it must first certify
179
+ final notes/record custody. From the repository scope:
149
180
 
150
181
  ```bash
151
182
  oats retire backend-expert-first-fix
152
183
  oats status --team
153
184
  ```
154
185
 
155
- Read the retirement result, including any retained home or recovery path.
156
- With aweb enabled, also inspect `oats aweb roster`: local retirement alone
157
- is not proof that a remote alias was removed. During the current hosted
158
- alias-retirement issue, use a fresh purpose for the next instance and have
159
- the team administrator clear any stale alias before reusing its name.
186
+ Read the retirement result. An uncertified capture retains the home for retry;
187
+ never delete it to bypass recovery. Durable descriptors, evidence and runs survive
188
+ successful retirement. Use `oats okf inspect --source <absolute-source.json>
189
+ --soul backend-expert --json` from deployment context afterward. If messaging is
190
+ active, also verify its retirement receipt and roster rather than assuming local
191
+ cleanup proves identity release.
192
+
193
+ For automatic future judgment, review [source jobs](schedules.md#okf-v2-source-jobs)
194
+ and explicitly opt into host-timer installation. No-launch tests should never
195
+ install it or enable live model launches.
160
196
 
161
- Start the same soul on the next useful task after its knowledge commit is
162
- on main. Check that the new instance can find and use the promoted lesson.
163
- That completes the first lifecycle: useful work, reviewed learning, clean
164
- local retirement, and a successor with the updated soul.
197
+ After provider acceptance, start a fresh instance of the same soul on a useful
198
+ task. Check that it finds **and uses** the promoted lesson without the original
199
+ source. That is the learning acceptance step; a no-launch reader only verifies
200
+ scaffolding and references.
165
201
 
166
- ## Optional conversation record
202
+ ## Optional host-wide conversation capture
167
203
 
168
- Knowledge promotion and conversation capture are separate. To enable the
169
- local transcript record and query it:
204
+ Knowledge judgment and the native conversation record are separate. OKF uses
205
+ source-targeted native capture through the CLI; host-wide watcher/hook setup is
206
+ an additional deliberate operator action:
170
207
 
171
208
  ```bash
172
209
  oats setup
@@ -174,6 +211,5 @@ oats capture --status
174
211
  oats recall "a phrase from your completed task"
175
212
  ```
176
213
 
177
- Capture reads supported transcripts and aweb logs after setup, subject to
178
- ignore rules. Native turns are content-addressed; signed aweb messages
179
- retain their source signatures. See [the turn record](../README.md#the-turn-record).
214
+ Capture respects privacy exclusions. Native turns are content-addressed; signed
215
+ aweb messages retain their source signatures. See [the turn record](../README.md#the-turn-record).