@awebai/oats 0.29.4 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +12 -6
  2. package/bin/oats.mjs +194 -50
  3. package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
  4. package/capabilities/oats-aweb/injects/aweb.md +1 -1
  5. package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
  6. package/capabilities/oats-aweb/oats.json +5 -12
  7. package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
  8. package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
  9. package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
  10. package/capabilities/oats-code-review/injects/reviewer.md +26 -0
  11. package/capabilities/oats-code-review/oats.json +16 -0
  12. package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
  13. package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
  14. package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
  15. package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
  16. package/capabilities/oats-developer/injects/developer.md +38 -0
  17. package/capabilities/oats-developer/oats.json +17 -0
  18. package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
  19. package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
  20. package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
  21. package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
  22. package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
  23. package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
  24. package/capabilities/oats-engineering-expert/oats.json +17 -0
  25. package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
  26. package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
  27. package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
  28. package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
  29. package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
  30. package/capabilities/oats-okf/bin/oats-okf.mjs +8 -4
  31. package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
  32. package/capabilities/oats-okf/lib/inspection.mjs +26 -7
  33. package/capabilities/oats-okf/lib/sources.mjs +16 -2
  34. package/capabilities/oats-okf/lib/worker.mjs +5 -16
  35. package/capabilities/oats-okf/oats.json +6 -3
  36. package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
  37. package/capabilities/oats-okf-harvest/oats.json +3 -3
  38. package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
  39. package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +2 -2
  40. package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
  41. package/capabilities/oats-okf-maintenance/oats.json +2 -2
  42. package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +1 -1
  43. package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
  44. package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
  45. package/capabilities/oats-workspace-experts/oats.json +9 -0
  46. package/docs/capabilities.md +160 -171
  47. package/docs/capability-manifest.schema.json +6 -11
  48. package/docs/configuration.md +213 -64
  49. package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
  50. package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
  51. package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
  52. package/docs/design/2026-09-27-team-model-v2.md +97 -117
  53. package/docs/design/2026-09-28-automations-trust.md +38 -0
  54. package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
  55. package/docs/design/HISTORY.md +65 -0
  56. package/docs/design/README.md +23 -54
  57. package/docs/desktop-cli-api.md +1787 -1777
  58. package/docs/desktop.md +30 -91
  59. package/docs/execution-targets.md +146 -292
  60. package/docs/first-team.md +31 -17
  61. package/docs/implementation.md +76 -288
  62. package/docs/integrations.md +118 -320
  63. package/docs/knowledge-capability-authoring.md +25 -52
  64. package/docs/knowledge-reference/acceptance.md +3 -3
  65. package/docs/knowledge-reference/adoption.md +1 -1
  66. package/docs/knowledge-reference/harvester.md +2 -2
  67. package/docs/knowledge-reference/package-craft.md +3 -3
  68. package/docs/knowledge-reference/provider-mapping.md +3 -6
  69. package/docs/knowledge-reference/reader-capture.md +3 -3
  70. package/docs/knowledge-theory.md +62 -166
  71. package/docs/knowledge.md +225 -404
  72. package/docs/layers.md +42 -97
  73. package/docs/oats-local.schema.json +58 -5
  74. package/docs/oats-membership.schema.json +1 -8
  75. package/docs/oats-package.schema.json +5 -5
  76. package/docs/oats-workspace.schema.json +8 -22
  77. package/docs/official-catalog.md +25 -28
  78. package/docs/packages.md +45 -63
  79. package/docs/plans/0.30-close-out.md +61 -0
  80. package/docs/release-lane.md +77 -0
  81. package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
  82. package/docs/release-notes/v0.19.0.md +48 -147
  83. package/docs/release-notes/v0.19.1.md +2 -3
  84. package/docs/release-notes/v0.19.3.md +2 -15
  85. package/docs/release-notes/v0.20.0.md +0 -15
  86. package/docs/release-notes/v0.22.0.md +71 -138
  87. package/docs/release-notes/v0.22.1.md +42 -90
  88. package/docs/release-notes/v0.22.10.md +1 -1
  89. package/docs/release-notes/v0.22.11.md +1 -47
  90. package/docs/release-notes/v0.22.12.md +4 -13
  91. package/docs/release-notes/v0.22.13.md +1 -42
  92. package/docs/release-notes/v0.22.14.md +3 -11
  93. package/docs/release-notes/v0.22.15.md +1 -46
  94. package/docs/release-notes/v0.22.16.md +6 -8
  95. package/docs/release-notes/v0.22.18.md +1 -99
  96. package/docs/release-notes/v0.22.19.md +3 -14
  97. package/docs/release-notes/v0.22.2.md +6 -15
  98. package/docs/release-notes/v0.22.3.md +0 -1
  99. package/docs/release-notes/v0.22.4.md +1 -14
  100. package/docs/release-notes/v0.22.5.md +2 -12
  101. package/docs/release-notes/v0.22.6.md +0 -3
  102. package/docs/release-notes/v0.23.0.md +9 -25
  103. package/docs/release-notes/v0.23.1.md +9 -25
  104. package/docs/release-notes/v0.23.2.md +2 -4
  105. package/docs/release-notes/v0.24.0.md +56 -97
  106. package/docs/release-notes/v0.24.1.md +7 -11
  107. package/docs/release-notes/v0.24.10.md +34 -45
  108. package/docs/release-notes/v0.24.11.md +12 -20
  109. package/docs/release-notes/v0.24.12.md +35 -48
  110. package/docs/release-notes/v0.24.13.md +34 -41
  111. package/docs/release-notes/v0.24.2.md +9 -13
  112. package/docs/release-notes/v0.24.3.md +7 -11
  113. package/docs/release-notes/v0.24.4.md +6 -6
  114. package/docs/release-notes/v0.24.5.md +6 -10
  115. package/docs/release-notes/v0.24.6.md +2 -5
  116. package/docs/release-notes/v0.24.7.md +46 -75
  117. package/docs/release-notes/v0.24.8.md +58 -96
  118. package/docs/release-notes/v0.24.9.md +38 -54
  119. package/docs/release-notes/v0.25.0.md +59 -76
  120. package/docs/release-notes/v0.25.1.md +57 -81
  121. package/docs/release-notes/v0.25.2.md +51 -70
  122. package/docs/release-notes/v0.25.3.md +11 -13
  123. package/docs/release-notes/v0.25.4.md +9 -13
  124. package/docs/release-notes/v0.25.5.md +3 -5
  125. package/docs/release-notes/v0.25.6.md +20 -29
  126. package/docs/release-notes/v0.25.7.md +5 -7
  127. package/docs/release-notes/v0.25.8.md +26 -39
  128. package/docs/release-notes/v0.26.0.md +175 -646
  129. package/docs/release-notes/v0.27.0.md +4 -5
  130. package/docs/release-notes/v0.27.1.md +4 -6
  131. package/docs/release-notes/v0.27.2.md +1 -1
  132. package/docs/release-notes/v0.28.0.md +57 -124
  133. package/docs/release-notes/v0.29.0.md +89 -208
  134. package/docs/release-notes/v0.29.1.md +1 -1
  135. package/docs/release-notes/v0.29.2.md +3 -4
  136. package/docs/release-notes/v0.30.0.md +205 -0
  137. package/docs/schedules.md +280 -363
  138. package/docs/servers.md +99 -117
  139. package/docs/soul.schema.json +2 -9
  140. package/docs/souls-and-instances.md +145 -158
  141. package/docs/workspaces.md +132 -215
  142. package/lib/automations.mjs +21 -6
  143. package/lib/core.mjs +226 -74
  144. package/lib/instance-events.mjs +1 -1
  145. package/lib/instance-inspect.mjs +109 -34
  146. package/lib/instance-lifecycle.mjs +14 -1
  147. package/lib/instance-resolution.mjs +26 -27
  148. package/lib/launch-preference.mjs +87 -0
  149. package/lib/materialize.mjs +3 -3
  150. package/lib/resolve.mjs +29 -87
  151. package/lib/schedule.mjs +1 -1
  152. package/lib/teams-verbs.mjs +195 -0
  153. package/lib/teams.mjs +190 -0
  154. package/lib/triggers.mjs +2 -2
  155. package/lib/workspace.mjs +54 -147
  156. package/package-catalog.json +9 -15
  157. package/package.json +1 -1
  158. package/skills/oats-getting-started/SKILL.md +25 -13
  159. package/capabilities/oats-review/injects/review.md +0 -69
  160. package/capabilities/oats-review/oats.json +0 -10
  161. package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
  162. package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
  163. package/docs/conventions.md +0 -90
  164. package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
  165. package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
  166. package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
  167. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
  168. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
  169. package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
  170. package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
  171. package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
  172. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
  173. package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
  174. package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
  175. package/docs/design/2026-09-15-captured-dispatch.md +0 -127
  176. package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
  177. package/docs/design/2026-09-15-package-preparation.md +0 -100
  178. package/docs/design/2026-09-15-portable-data-contract.md +0 -121
  179. package/docs/design/2026-09-15-portable-declarations.md +0 -189
  180. package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
  181. package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
  182. package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
  183. package/docs/design/2026-09-15-source-observation.md +0 -119
  184. package/docs/design/2026-09-16-captured-admission.md +0 -77
  185. package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
  186. package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
  187. package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
  188. package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
  189. package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
  190. package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
  191. package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
  192. package/docs/design/2026-09-16-portable-onboarding.md +0 -179
  193. package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
  194. package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
  195. package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
  196. package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
  197. package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
  198. package/docs/design/2026-09-17-captured-native-start.md +0 -58
  199. package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
  200. package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
  201. package/docs/design/2026-09-17-public-captured-start.md +0 -108
  202. package/docs/design/2026-09-17-public-prepare-request.md +0 -90
  203. package/docs/design/2026-09-18-captured-pi-host.md +0 -205
  204. package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
  205. package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
  206. package/docs/design/2026-09-20-redesign-program-board.md +0 -142
  207. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
  208. package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
  209. package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
  210. package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
  211. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
  212. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
  213. package/docs/design/2026-09-24-phase-d-plan.md +0 -305
  214. package/docs/design/2026-09-25-teams-contract.md +0 -258
  215. package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
  216. package/docs/design/desktop-ux-plan.md +0 -362
  217. package/docs/design/launch-configurations.md +0 -168
  218. package/docs/design/okf-mirror-provenance.md +0 -105
  219. package/docs/design/operations-contract.md +0 -141
  220. package/docs/oats-member.schema.json +0 -38
  221. package/skills/integration-authoring/SKILL.md +0 -84
  222. package/skills/oats-support/SKILL.md +0 -79
  223. package/skills/skill-craft/SKILL.md +0 -109
  224. package/skills/soul-craft/SKILL.md +0 -116
@@ -1,41 +1,45 @@
1
- # Configuration — `oats-local.yaml`
2
-
3
- A deployment has **one** per-machine file: `oats-local.yaml`. It says which
4
- workspace this machine realizes and holds the few facts that are true of this
5
- host only. Everything shared — members, packages and their versions, teams,
6
- defaults, stores, the messaging policy — lives in the workspace repo's
7
- `oats-workspace.yaml`; everything about a soul lives in its `soul.yaml`
8
- ([workspaces.md](workspaces.md)).
9
-
10
- **`oats-config.yaml` no longer exists.** Its `capabilities.layers` /
11
- `additive` / `from:` / `global` / `agent-types` blocks are gone — activation is
12
- derived from workspace defaults plus each soul's `capabilities:` — and its
13
- `souls:` blocks are gone — per-instance provider content moved to
14
- `oats spawn … --provider`. There is no `oats init`, no `oats use`, no config
15
- scope chain, no adopted config templates. A 0.24.x deployment is rebuilt, not
16
- converted: write `oats-local.yaml` with `oats onboard` and move what the old
17
- file declared into `oats-workspace.yaml` and each soul's `soul.yaml`.
1
+ # Configuration: `oats-local.yaml`
2
+
3
+ A deployment has **one** per-machine file, `oats-local.yaml`. It names the
4
+ workspace this machine realizes and holds the facts that are true of this host
5
+ only. Everything shared (members, packages and their versions, shared teams,
6
+ defaults, stores) lives in the workspace repository's `oats-workspace.yaml`,
7
+ and everything about a soul lives in its `soul.yaml` ([workspaces.md](workspaces.md)).
8
+ Write the first version with `oats onboard`; never commit it to a shared
9
+ repository.
18
10
 
19
11
  ## The file
20
12
 
21
13
  ```yaml
22
14
  schemaVersion: 2
23
- workspace: git:github.com/acme/agents # REQUIRED — the workspace host, observed over the remote
15
+ workspace: git:github.com/acme/agents # REQUIRED: the workspace host, read over the remote
24
16
 
25
- clones: # optional — member clones that are not beside oats-local.yaml under their repo name
17
+ clones: # member clones not beside this file under their repo name
26
18
  github.com/acme/platform: /Users/ana/src/acme-platform
27
19
 
28
- settings: # optional — host-owned values per capability
20
+ settings: # host-owned values per capability
29
21
  oats.okf:
30
22
  bindings-file: /Users/ana/.oats/okf-bindings.json
31
- state-dir: /Users/ana/.oats/okf
32
- oats.aweb:
33
- delivery: channel
34
23
 
35
- souls: # optional — souls this machine does not run
36
- disabled: [data-analyst]
24
+ teams: # LOCAL teams: only this deployment uses them
25
+ ana-research: { team: "ana-research:acme.aweb.ai", description: Ana's research }
26
+ defaultTeam: ana-research # the team every instance lives in
27
+ souls:
28
+ teams:
29
+ "*": [ana-research] # every soul is in these teams here
30
+ data-analyst: [platform] # and this one also joins a shared team
31
+ default:
32
+ data-analyst: platform # per-soul override of defaultTeam
33
+ disabled: [legacy-bot] # souls not run on this machine
34
+
35
+ host:
36
+ name: ana-laptop # which workspace triggers and schedules run here
37
+ triggers:
38
+ disabled: [platform/nightly-review]
39
+ schedules:
40
+ disabled: [platform/weekly-digest]
37
41
 
38
- launch-configs: # optional — named ways this host starts a harness
42
+ launch-configs: # named ways this host starts a harness
39
43
  personal:
40
44
  harness: claude
41
45
  executable: "./bin/claude-wrapper.sh" # relative → against this deployment directory
@@ -51,59 +55,204 @@ refused (`E_WORKSPACE_SCHEMA`).
51
55
 
52
56
  | key | meaning |
53
57
  |---|---|
54
- | `workspace` | Repo ref of the workspace host (`git:host/org/repo`, `https://…`, `git@host:…`, `file:///…`, `/abs/bare.git`). Read with your own Git credentials; the repo need not be cloned. |
55
- | `clones` | `<canonical repo key>: <absolute path>` — where a member's clone lives when it is not at `<deployment>/<member name>/`. Only a soul's **work target** (`work: worktree \| checkout`) needs a clone. Lookup order: `spawn --repo`, then this map (keys normalised through `parseRepoRef`, so any ref spelling of the same repo matches), then `<deployment>/<member name>` (a member named `agents` → `<deployment>/agents-repo`, since `agents/` is the instance root); none → `E_CLONE_MISSING`; a directory whose `origin` is another repo → `E_CLONE_MISMATCH`. |
56
- | `settings.<cap>.<key>` | Host-owned provider values the capability's manifest asks for — absolute paths, state roots, delivery modes. The workspace file **refuses** absolute paths; this is where they go. Merged into the capability's provider payload after the soul's own payload and before any `--provider` flag (see [three homes](workspaces.md#provider-payloads-have-three-homes)). |
57
- | `souls.disabled` | Soul names not run on this machine; reported by `oats sync` ("disabled here"). |
58
- | `launch-configs.<name>` | A named way to start a harness on this host (0.26.0; lead decision 2 — a spawn-time host choice, never a soul field): `harness` (`pi` \| `claude` \| `codex`, required; named `runtime` before 0.27.0, which is still read with a `deprecated-runtime-name` warning), `executable` (a bare name looked up on `PATH`, or a path — relative to this deployment directory), `args` (literal, no shell), `env` (a literal string, non-secret by contract and always redacted, or `{ fromEnv: NAME }` resolved on the host at start), `model`, `yolo`. Selected with `--launch-config <name>` on `oats spawn` and `oats session start \| restart`; explicit flags override its fields. Written by `oats launch-config set <name> --file <json>` / `remove <name>`, which rewrite only this block. Earlier kernels read `launch-configs:` from a scope's `oats-config.yaml`; 0.26.0 refuses it there with a message naming this move. |
58
+ | `workspace` | Repo ref of the workspace host (`git:host/org/repo`, `https://…`, `git@host:…`, `file:///…`, `/abs/bare.git`). Read with your own Git credentials; it need not be cloned. |
59
+ | `standalone` | A repo ref to realize on its own: its souls and `from: here` capabilities plus `oats.core`, with no workspace lookup. For a repository whose workspace this machine cannot read ([workspaces.md](workspaces.md#the-standalone-case)). |
60
+ | `clones` | `<repo key>: <absolute path>` for a member clone that is not at `<deployment>/<member name>/`. Only a soul whose work target needs a clone (`work: worktree \| checkout`) uses it. Lookup order: `spawn --repo`, then this map, then `<deployment>/<member name>` (a member named `agents` → `<deployment>/agents-repo`). None → `E_CLONE_MISSING`; a directory whose `origin` is another repository → `E_CLONE_MISMATCH`. |
61
+ | `settings.<cap>.<key>` | Host-owned values a capability's manifest asks for: absolute paths, state roots, delivery modes. The workspace file refuses absolute paths; they go here. Merged into the capability's provider payload after the soul's own and before any `--provider` flag ([three homes](workspaces.md#provider-payloads-have-three-homes)). |
62
+ | `teams.<label>` | A **local** team: `{ team: <provider team id>, description? }`. Shared teams are committed in `oats-workspace.yaml`; a label in both is refused. Written by `oats teams add <label> --team <id>` and `oats teams remove <label>`. |
63
+ | `defaultTeam` | The team every instance of this deployment lives in: a label of a local or shared team. The first `oats teams add` sets it; `oats teams default <label>` changes it. |
64
+ | `souls.teams` | Which teams each soul joins here: `"*"` applies to every soul; a soul's own entry (its name, or `<package>/<soul>`) adds to it. Every soul is also in its default team. Written by `oats soul teams <soul>\|'*' --add … --remove …`. |
65
+ | `souls.default` | A per-soul override of `defaultTeam`; it must be one of that soul's teams here (`E_TEAM_NOT_ELIGIBLE`). Written by `oats soul teams <soul> --default <label>`. |
66
+ | `souls.disabled` | Souls not run on this machine; a spawn is refused with `E_SOUL_DISABLED`. A bare name disables every soul of that name; `<package>/<soul>` or `<member>/<soul>` disables one. |
67
+ | `host.name` | This machine's name. A workspace trigger or schedule runs only on the host named by its `runsOn` ([schedules.md](schedules.md)). |
68
+ | `automations.trust` | The workspace triggers and schedules (`<member>/<id>`) this host agrees to run, or `"*"` for every one the workspace places here (0.30). Absent or empty: none runs. See [Who runs workspace automations](#who-runs-workspace-automations). |
69
+ | `triggers.disabled`, `schedules.disabled` | Workspace triggers and schedules (`<member>/<id>`) this host does not run, without a commit. Written by `oats trigger disable` / `oats schedule disable`. |
70
+ | `launch-configs.<name>` | A named way to start a harness on this host, chosen at spawn or session start, never by the soul. See [Launch configurations](#launch-configurations). |
71
+ | `souls.launch` | This machine's launch preference per soul (0.30): `"*"` for every soul, a soul's own entry (its name, or `<package>/<soul>`) over it. A value is a `launch-configs` name or an inline `{ harness, model? }`. It overrides the soul's own `launch:`; explicit spawn flags win over both. See [Launch preferences](#launch-preferences). |
72
+
73
+ How teams are resolved, and what a messaging provider does with them, is in
74
+ [workspaces.md](workspaces.md#teams).
75
+
76
+ ## Launch configurations
77
+
78
+ An entry has `harness` (`pi` \| `claude` \| `codex`, required), `executable`
79
+ (a bare name looked up on `PATH`, or a path relative to this deployment
80
+ directory), `args` (literal, no shell), `env` (a literal string, or
81
+ `{ fromEnv: NAME }` resolved on the host at start), `model` and `yolo`. A
82
+ launch configuration is a host choice: a soul never names one.
83
+
84
+ - Select one with `--launch-config <name>` on `oats spawn`,
85
+ `oats session start` and `oats session restart`. A named configuration is
86
+ a unit: a `--harness` that disagrees with it is refused
87
+ (`E_LAUNCH_CONFIG_MISMATCH`); `--model` and `--yolo` override its fields.
88
+ - Without `--launch-config` or `--harness`, a spawn follows the soul's
89
+ [launch preference](#launch-preferences) (else `pi` with its defaults), and
90
+ an existing home keeps what it recorded. `--harness` alone leaves the recorded
91
+ configuration behind and uses the new harness's defaults. A model never
92
+ crosses harnesses.
93
+ - The executable must be a regular executable file; it is never run to probe
94
+ it.
95
+ - `oats launch-config list` shows the effective entries;
96
+ `oats launch-config set <name> --file <json>` and
97
+ `oats launch-config remove <name>` rewrite only this block;
98
+ `oats launch-config preview (--home <abs> | --soul <name>) --json` shows
99
+ what a start would run (harness, model, executable, argv, redacted
100
+ environment, command and preflight checks) and starts nothing.
101
+ - The old key `runtime` is still read as `harness`, with a
102
+ `deprecated-runtime-name` warning.
103
+
104
+ ### Launch preferences
105
+
106
+ A soul says what its role should run on, and each machine may override it
107
+ (0.30; the design is
108
+ [soul launch preferences](design/2026-09-28-soul-launch-preference.md)):
109
+
110
+ ```yaml
111
+ # souls/<soul>/soul.yaml — only a harness and a model
112
+ launch: { harness: claude, model: claude-opus-5-5 }
113
+
114
+ # oats-local.yaml
115
+ souls:
116
+ launch:
117
+ "*": personal # a launch configuration, for every soul here
118
+ oats-expert: { harness: claude, model: claude-opus-5-5 }
119
+ oats.engineering/code-reviewer: { harness: codex } # a package soul
120
+ ```
121
+
122
+ - **Precedence for a new launch:** `--launch-config` or `--harness`, then
123
+ `souls.launch.<soul>`, then `souls.launch."*"`, then the soul's `launch:`,
124
+ then `pi` with its defaults. `--model` alone keeps the deciding layer's
125
+ harness and replaces only its model.
126
+ - A **launch configuration** name runs that configuration's full recipe. An
127
+ **inline or soul preference** runs its harness the way this host starts it
128
+ without a configuration (the executable on `PATH`, no args, no env), with
129
+ its `model`. A preference without `model` uses the harness's own model; it
130
+ never borrows a lower layer's.
131
+ - **A missing harness is refused**, never replaced: `E_HARNESS_UNAVAILABLE`
132
+ names the layer that chose it and the fix (install the harness, or override
133
+ it here in `souls.launch`). `oats souls` still lists the soul, with the
134
+ problem.
135
+ - **Existing homes keep their launch.** A changed preference does not affect
136
+ a running or stopped home until `oats session restart --reselect-launch`
137
+ (or `start --reselect-launch`) or a respawn. `session start|restart --model`
138
+ keeps the recorded harness and replaces only the model. `oats readiness --home` shows
139
+ the drift as the `launch-changed` warning; `oats inspect --home` shows
140
+ `launch` (the record) beside `launchCurrent`.
141
+ - `oats souls`, `oats inspect --soul` and `oats spawn … --preview` show each
142
+ soul's `launch`: its own preference, the effective launch, and which layer
143
+ decided (`from`) and where (`at`).
144
+ - **Migration.** 0.29 refuses a soul.yaml it does not know, so a committed
145
+ soul gains `launch:` only once every deployment of the workspace runs 0.30.
146
+ Until then, set the preference in `souls.launch` on each machine.
147
+
148
+ **Environment references.** `{ fromEnv: SRC }` is rendered as a reference,
149
+ never a value, in the recorded command and in every answer. At start each
150
+ source variable must be set on the host (`E_LAUNCH_ENV_MISSING`, before
151
+ anything is created or stopped), and only the harness's pane receives it.
152
+ `list` and `preview` redact every environment value, literals included.
153
+
154
+ **The launch recipe.** A spawn records what a start is made of in
155
+ `instance.json` under `launch`: the harness, the configuration and where it
156
+ came from, the executable, args, env, model, yolo, and each capability's
157
+ launch contribution with its settings and trust. One renderer turns it into
158
+ the `command`. Configuration `args` go after the harness's own options and
159
+ before capability arguments; every argument is single-quoted.
160
+
161
+ **Starting and restarting a home.** `oats session start --home <abs>` runs
162
+ the recorded recipe. With `--launch-config`, `--harness` or `--yolo`, the
163
+ recipe is resolved again against the home's recorded context and every check
164
+ runs first. With `--reselect-launch`, the launch preferences decide again
165
+ (the home's recorded soul and this deployment's `souls.launch`). A capability that contributed harness-specific arguments must
166
+ declare a `launch` hook to follow a harness change; otherwise the start is
167
+ refused (`E_LAUNCH_PREPARATION`). A launch hook's warnings do not stop
168
+ the start: `session start|restart` print them (and answer them as
169
+ `warnings` under `--json`), as spawn does, and each is kept as a
170
+ `launch-warning` instance event (`oats instance events`).
171
+ `oats session restart` runs the same
172
+ checks, then sends SIGTERM to the harness and what it started, waits
173
+ (`--stop-grace <seconds>`, default 20) for them to exit, and starts again in
174
+ place. It never escalates: a harness still running is reported
175
+ (`E_SESSION_STOP_FAILED`) and nothing is launched. What a harness saves on
176
+ SIGTERM is its own; a wrapper script should `exec` the harness or forward
177
+ signals.
178
+
179
+ ## Who runs workspace automations
180
+
181
+ A workspace trigger or schedule names the host that runs it (`runsOn`) and
182
+ the GitHub account it acts as (`owner`). Both come from a commit, so a host
183
+ also has to say yes itself (0.30):
184
+
185
+ ```yaml
186
+ automations:
187
+ trust:
188
+ - agents/pr-review # <member>/<id>
189
+ - agents/nightly-digest
190
+ # or: trust: "*" # every automation the workspace places on this host
191
+ ```
192
+
193
+ - It runs only if `runsOn` is this host's `host.name`, its `owner` is this
194
+ host's `gh` account, **and** `trust` admits it. `triggers.disabled` and
195
+ `schedules.disabled` still opt out on top.
196
+ - A placed but untrusted one never runs. Its row has reason `untrusted`, and
197
+ `oats workspace status` warns with the line to add.
198
+ - An entry that names nothing is a warning, not an error.
199
+ - `automations` is a host key: the committed `oats-workspace.yaml` refuses
200
+ it.
201
+ - **Upgrading to 0.30:** a host that ran workspace automations must add its
202
+ `trust` lines; until then they do not run there.
203
+ - Your own triggers and schedules (`oats trigger add`, `oats schedule add`)
204
+ need no trust. Details: [schedules.md](schedules.md#workspace-triggers-and-schedules).
59
205
 
60
- ## Where it sits and how it is found
206
+ ## The deployment directory
61
207
 
62
- Every `oats` command that needs the workspace (`sync`, `workspace status`,
63
- `capabilities`, `souls`, `spawn`, `status` drift) walks **up** from the current
208
+ Every `oats` command that needs the workspace walks **up** from the current
64
209
  directory (or `--dir`) to the nearest `oats-local.yaml`; its directory is the
65
- deployment. Not found → `E_LOCAL_MISSING`. The deployment is also a
66
- **configuration boundary**: nothing above the directory holding
67
- `oats-local.yaml` composes into it (a deployment created inside another
68
- scope — a scratch deployment under a repository, a fixture under an operator
69
- workspace — sees only its own files; `oats inspect` reports it, not the outer
70
- scope, as the workspace). Beside it:
210
+ deployment. Not found → `E_LOCAL_MISSING`. Nothing above that directory
211
+ composes into it: a deployment created inside another one sees only its own
212
+ files.
71
213
 
72
214
  ```
73
- ~/acme-workspace/
215
+ ~/acme/
74
216
  ├── oats-local.yaml
75
- ├── oats-lock.json # written by `oats sync` (lock v3; docs/packages.md)
76
- ├── agents/ # instance homes + fetched member-soul sources (created by `oats sync` / `oats onboard` if absent)
77
- └── <member clones>/ # only where someone works IN a repo
217
+ ├── oats-lock.json # written by `oats sync` (packages.md)
218
+ ├── oats-schedules.json # this host's local schedules and triggers (schedules.md)
219
+ ├── agents/ # instance homes and the fetched soul copies
220
+ ├── .oats/modules/ # the capability store for operator-level commands
221
+ └── <member clones>/ # only where someone works IN a repository
78
222
  ```
79
223
 
80
- Never commit `oats-local.yaml` to a shared repo: it names one machine's paths.
81
- Two operators of the same workspace share the declarations through Git and
82
- nothing else.
224
+ **The capability store.** A capability command run from the deployment for a
225
+ soul (`oats <namespace> <command> --soul <soul>`) fetches that capability at
226
+ its locked commit into `.oats/modules/<capability>@<commit12>/`, verifies its
227
+ content digest against the lock (recorded beside it as
228
+ `.<capability>@<commit12>.digest`) and runs that copy. A tree that no longer
229
+ matches its record is fetched again. An instance never uses the store: each
230
+ home has its own copy under `<home>/.oats/modules/<capability>/`
231
+ ([souls-and-instances.md](souls-and-instances.md)). The store is a cache; it
232
+ is safe to delete.
83
233
 
84
- ## What is NOT in it
234
+ ## What is not in it
85
235
 
86
- - **Which capabilities a soul gets** — the soul's `capabilities:` plus the
87
- workspace `defaults` (and `defaults.byTeam`). There is no per-deployment
88
- activation or targeting.
89
- - **Versions** — `packages:` in the workspace file; exact commits in
236
+ - **Which capabilities a soul gets:** the soul's `capabilities:` plus the
237
+ workspace `defaults`.
238
+ - **Versions:** `packages:` in the workspace file; exact commits in
90
239
  `oats-lock.json`.
91
- - **Trust** — membership for members; the declaration in the workspace's
92
- `packages:` for packages (no approval step). No per-operator trust list.
93
- - **Per-instance provider facts** (a retained messaging seat, a one-off state
94
- root) — `oats spawn <soul> --provider <cap> key=value`, recorded in
95
- `instance.json.providers`.
96
- - **Team labels, stores, messaging policy** — the workspace file.
240
+ - **Trust:** membership for members, the workspace's `packages:` declaration
241
+ for packages ([packages.md](packages.md#trust)).
242
+ - **Per-instance provider facts:** `oats spawn <soul> --provider <cap> key=value`,
243
+ recorded in the instance's `instance.json`.
244
+ - **Shared teams, stores and defaults:** the workspace file.
97
245
 
98
246
  ## Inspecting the effective configuration
99
247
 
100
248
  ```bash
101
- oats workspace status # membership table, locked packages, external souls
249
+ oats workspace status # members, locked packages, external souls
102
250
  oats sync # confirm, resolve, lock, report the diff
103
- oats capabilities | oats souls # everything a soul may name, with origin and team
104
- oats spawn <soul> --preview # the exact modules (from/commit/changedSince), team, resolution revision
105
- oats doctor # this deployment's oats-local.yaml and lock, plus kernel diagnostics
251
+ oats teams # shared and local teams, and the default
252
+ oats soul teams <soul> # the teams one soul joins here
253
+ oats spawn <soul> --preview # the exact modules, teams and provider payloads
254
+ oats doctor # this deployment's files and the lock
106
255
  ```
107
256
 
108
- Environment knobs the kernel honours: `OATS_REMOTE_CACHE` (relocates the
109
- invisible fetch cache), `OATS_PACKAGE_CATALOG` (an alternative catalog file).
257
+ Environment: `OATS_REMOTE_CACHE` relocates the fetch cache;
258
+ `OATS_PACKAGE_CATALOG` names an alternative package catalog file.
@@ -1,61 +1,47 @@
1
1
  ---
2
2
  type: Decision
3
3
  status: accepted-boundary
4
- title: Knowledge and harvesting capability contract boundary
5
- description: OATS provides generic context, binding, lifecycle and execution contracts; capabilities implement knowledge and harvesting functionality.
4
+ title: Knowledge and messaging capability contract boundary
5
+ description: OATS provides generic selection, lifecycle and execution contracts; knowledge and messaging capabilities implement their own behaviour.
6
6
  timestamp: 2026-09-16
7
7
  ---
8
8
 
9
- # Knowledge and harvesting capability contract boundary
9
+ # Knowledge and messaging capability contract boundary
10
10
 
11
- **OATS provides contracts; capabilities provide functionality.** Knowledge and
12
- harvesting follow the same separation as the
13
- [messaging capability contract](2026-09-16-messaging-capability-contract.md).
14
- The reference knowledge theory remains optional authoring guidance, not a mandatory
15
- runtime model or a kernel-owned harvester.
11
+ **OATS provides contracts; capabilities provide functionality.** The kernel
12
+ has no knowledge model, harvester, messaging backend or identity system of its
13
+ own. The official providers are `oats.okf` (knowledge) and `oats.aweb`
14
+ (messaging); any other capability may fill either slot with a different model.
16
15
 
17
16
  ## Responsibilities
18
17
 
19
- | Kernel contract/support | Capability functionality |
18
+ | Kernel supplies | The capability owns |
20
19
  |---|---|
21
- | Selection, exact executable approval and the shared resolver | Interpret provider-owned declarations; validate and render its nonsecret bindings |
22
- | Verified captured source/instance/context and bounded invocation data | Select/read the knowledge relevant to that context through its own model/tools |
23
- | Generic lifecycle events, hook outcomes and cleanup custody | Initialize its memory protocol, capture/freeze inputs and perform its own retirement handoff |
24
- | Generic native evidence APIs where applicable | Choose which evidence to collect, how to interpret it and its durable source/cursor format |
25
- | Source-independent helper/job execution, exact artifact/record references and admission identity | Supply harvester helpers, prompts, runtime conventions, schedules and input/destination receipts |
26
- | Truthful execution/uncertainty and declared operation result contracts | Judge promotion, validate, retry, publish and establish provider-specific acceptance |
27
-
28
- Reuse ProviderBinding, captured invocation/lifecycle, declared operations and
29
- execution capsules. Any missing generic field is reviewed/versioned once. Do not
30
- introduce a second config parser, resolver, command registry or harvesting engine.
31
- Capability-specific data remains opaque to the kernel.
32
-
33
- ## Default OKF versus alternatives
34
-
35
- `oats.okf` owns stores/nodes, reads/owns, immutable views, STATE/log/notes conventions,
36
- durable source descriptors, harvester judgment and store-specific delivery. Its
37
- existing promotion bar and PR-only Git knowledge publication remain in force.
38
- Other capabilities may use different models, stores and harvesting machinery;
39
- they are not required to imitate OKF's filesystem or workflow.
40
-
41
- The knowledge-theory expert is an authoring aid, not a runtime dispatcher,
42
- universal harvester or required approval service. Capability ownership does not
43
- waive repository governance, work boundaries, secret exclusions, exact executable
44
- approval or truthful lifecycle/custody reporting.
45
-
46
- ## Integration checks
47
-
48
- - Audit helper memory/injection suppression and source handoff projection for
49
- accidental kernel-owned knowledge policy. Move new behavior behind neutral
50
- contracts or capability declarations as appropriate; do not blindly enable
51
- recursive harvesting or weaken existing fail-closed guards.
52
- - A knowledge-specific source receipt may remain a compatibility input for a
53
- provider, but must not become the mandatory shape for every alternative.
54
- - Retirement must honor required capture/handoff outcomes before deleting their
55
- source. The capability supplies the evidence and outcome; the kernel does not
56
- implement the provider's memory/promotion algorithm.
57
- - Independent work must retain everything it needs through the existing execution
58
- and provider custody contracts, without a live source/config fallback.
59
-
60
- This records the boundary and remaining audit, not a claim that every consumer is
61
- already refactored or that a fresh deployment/live harvester is qualified.
20
+ | Selection: one provider per slot, resolved from the soul and the workspace defaults, copied into the home at its locked commit | Interpreting its own settings and declarations; the kernel treats them as opaque |
21
+ | Lifecycle hooks (`spawn`, `launch`, `retire`) with the hook environment: settings and their origins, the home, the soul, the teams | What happens at each event: registering a source, minting an identity, joining a team, handing off at retirement |
22
+ | A required spawn hook's failure rolls the spawn back; every other hook is advisory | Reporting its own outcome truthfully in the hook answer |
23
+ | Command and operation dispatch from the copied module, and the readiness relay (`binding.check`) | Its commands, operations and readiness answer |
24
+ | The soul's teams, as declarations | Enrolment, membership, transport and wake delivery; a declared team is not proof of enrolment |
25
+
26
+ The contracts themselves are in [capabilities.md](../capabilities.md): hooks
27
+ and their environment, commands, operations and the readiness check.
28
+
29
+ ## Rules
30
+
31
+ - **No second engine.** A capability does not get its own resolver, config
32
+ parser or command registry in the kernel; a missing generic field is added
33
+ once, to the shared contract, and versioned.
34
+ - **Knowledge.** The provider decides where knowledge lives, who reads and
35
+ owns what, how evidence is captured and judged, and how accepted knowledge
36
+ is delivered. `oats.okf`'s model (owned nodes in central bases, independent
37
+ harvest, PR-only Git delivery) is the reference, not a requirement for
38
+ alternatives ([knowledge theory](../knowledge-theory.md)).
39
+ - **Messaging.** The provider owns identity, addressing, teams and delivery,
40
+ using only the authority it is given. Configuration never implies privacy or
41
+ access: contact, delivery and history are verified through the provider's
42
+ own mechanisms.
43
+ - **No secrets in the contract.** Hooks contribute locators and endpoints,
44
+ never credentials, and nothing credential-bearing is recorded in
45
+ `instance.json` or logs.
46
+ - Capability ownership does not waive repository governance, work
47
+ boundaries or truthful lifecycle reporting.