@awebai/oats 0.29.4 → 0.30.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 (263) hide show
  1. package/README.md +12 -6
  2. package/bin/oats.mjs +194 -50
  3. package/docs/capabilities.md +160 -171
  4. package/docs/capability-manifest.schema.json +6 -11
  5. package/docs/configuration.md +213 -64
  6. package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
  7. package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
  8. package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
  9. package/docs/design/2026-09-27-team-model-v2.md +97 -117
  10. package/docs/design/2026-09-28-automations-trust.md +38 -0
  11. package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
  12. package/docs/design/HISTORY.md +65 -0
  13. package/docs/design/README.md +23 -54
  14. package/docs/desktop-cli-api.md +1787 -1777
  15. package/docs/desktop.md +30 -91
  16. package/docs/execution-targets.md +146 -292
  17. package/docs/first-team.md +31 -17
  18. package/docs/implementation.md +77 -288
  19. package/docs/integrations.md +118 -320
  20. package/docs/knowledge-capability-authoring.md +25 -52
  21. package/docs/knowledge-reference/acceptance.md +3 -3
  22. package/docs/knowledge-reference/adoption.md +1 -1
  23. package/docs/knowledge-reference/harvester.md +2 -2
  24. package/docs/knowledge-reference/package-craft.md +3 -3
  25. package/docs/knowledge-reference/provider-mapping.md +3 -6
  26. package/docs/knowledge-reference/reader-capture.md +3 -3
  27. package/docs/knowledge-theory.md +62 -166
  28. package/docs/knowledge.md +225 -404
  29. package/docs/layers.md +42 -97
  30. package/docs/oats-local.schema.json +58 -5
  31. package/docs/oats-membership.schema.json +1 -8
  32. package/docs/oats-package.schema.json +5 -5
  33. package/docs/oats-workspace.schema.json +8 -22
  34. package/docs/official-catalog.md +25 -28
  35. package/docs/packages.md +45 -63
  36. package/docs/plans/0.30-close-out.md +83 -0
  37. package/docs/release-lane.md +82 -0
  38. package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
  39. package/docs/release-notes/v0.19.0.md +48 -147
  40. package/docs/release-notes/v0.19.1.md +2 -3
  41. package/docs/release-notes/v0.19.3.md +2 -15
  42. package/docs/release-notes/v0.20.0.md +0 -15
  43. package/docs/release-notes/v0.22.0.md +71 -138
  44. package/docs/release-notes/v0.22.1.md +42 -90
  45. package/docs/release-notes/v0.22.10.md +1 -1
  46. package/docs/release-notes/v0.22.11.md +1 -47
  47. package/docs/release-notes/v0.22.12.md +4 -13
  48. package/docs/release-notes/v0.22.13.md +1 -42
  49. package/docs/release-notes/v0.22.14.md +3 -11
  50. package/docs/release-notes/v0.22.15.md +1 -46
  51. package/docs/release-notes/v0.22.16.md +6 -8
  52. package/docs/release-notes/v0.22.18.md +1 -99
  53. package/docs/release-notes/v0.22.19.md +3 -14
  54. package/docs/release-notes/v0.22.2.md +6 -15
  55. package/docs/release-notes/v0.22.3.md +0 -1
  56. package/docs/release-notes/v0.22.4.md +1 -14
  57. package/docs/release-notes/v0.22.5.md +2 -12
  58. package/docs/release-notes/v0.22.6.md +0 -3
  59. package/docs/release-notes/v0.23.0.md +9 -25
  60. package/docs/release-notes/v0.23.1.md +9 -25
  61. package/docs/release-notes/v0.23.2.md +2 -4
  62. package/docs/release-notes/v0.24.0.md +56 -97
  63. package/docs/release-notes/v0.24.1.md +7 -11
  64. package/docs/release-notes/v0.24.10.md +34 -45
  65. package/docs/release-notes/v0.24.11.md +12 -20
  66. package/docs/release-notes/v0.24.12.md +35 -48
  67. package/docs/release-notes/v0.24.13.md +34 -41
  68. package/docs/release-notes/v0.24.2.md +9 -13
  69. package/docs/release-notes/v0.24.3.md +7 -11
  70. package/docs/release-notes/v0.24.4.md +6 -6
  71. package/docs/release-notes/v0.24.5.md +6 -10
  72. package/docs/release-notes/v0.24.6.md +2 -5
  73. package/docs/release-notes/v0.24.7.md +46 -75
  74. package/docs/release-notes/v0.24.8.md +58 -96
  75. package/docs/release-notes/v0.24.9.md +38 -54
  76. package/docs/release-notes/v0.25.0.md +59 -76
  77. package/docs/release-notes/v0.25.1.md +57 -81
  78. package/docs/release-notes/v0.25.2.md +51 -70
  79. package/docs/release-notes/v0.25.3.md +11 -13
  80. package/docs/release-notes/v0.25.4.md +9 -13
  81. package/docs/release-notes/v0.25.5.md +3 -5
  82. package/docs/release-notes/v0.25.6.md +20 -29
  83. package/docs/release-notes/v0.25.7.md +5 -7
  84. package/docs/release-notes/v0.25.8.md +26 -39
  85. package/docs/release-notes/v0.26.0.md +175 -646
  86. package/docs/release-notes/v0.27.0.md +4 -5
  87. package/docs/release-notes/v0.27.1.md +4 -6
  88. package/docs/release-notes/v0.27.2.md +1 -1
  89. package/docs/release-notes/v0.28.0.md +57 -124
  90. package/docs/release-notes/v0.29.0.md +89 -208
  91. package/docs/release-notes/v0.29.1.md +1 -1
  92. package/docs/release-notes/v0.29.2.md +3 -4
  93. package/docs/release-notes/v0.30.0.md +205 -0
  94. package/docs/release-notes/v0.30.1.md +123 -0
  95. package/docs/schedules.md +280 -363
  96. package/docs/servers.md +99 -117
  97. package/docs/soul.schema.json +2 -9
  98. package/docs/souls-and-instances.md +145 -158
  99. package/docs/workspaces.md +137 -215
  100. package/lib/automations.mjs +21 -6
  101. package/lib/core.mjs +226 -74
  102. package/lib/instance-events.mjs +1 -1
  103. package/lib/instance-inspect.mjs +109 -34
  104. package/lib/instance-lifecycle.mjs +14 -1
  105. package/lib/instance-resolution.mjs +26 -27
  106. package/lib/launch-preference.mjs +87 -0
  107. package/lib/materialize.mjs +3 -3
  108. package/lib/packages.mjs +1 -1
  109. package/lib/resolve.mjs +30 -88
  110. package/lib/schedule.mjs +1 -1
  111. package/lib/teams-verbs.mjs +195 -0
  112. package/lib/teams.mjs +190 -0
  113. package/lib/triggers.mjs +2 -2
  114. package/lib/workspace.mjs +54 -147
  115. package/package-catalog.json +10 -16
  116. package/package.json +1 -3
  117. package/skills/oats-getting-started/SKILL.md +25 -13
  118. package/capabilities/oats-authoring/LICENSE +0 -21
  119. package/capabilities/oats-authoring/oats-package.json +0 -11
  120. package/capabilities/oats-authoring/oats.json +0 -12
  121. package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +0 -84
  122. package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +0 -109
  123. package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +0 -116
  124. package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +0 -11
  125. package/capabilities/oats-aweb/bin/oats-aweb.mjs +0 -1338
  126. package/capabilities/oats-aweb/injects/aweb.md +0 -47
  127. package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -356
  128. package/capabilities/oats-aweb/lib/captured-execution.mjs +0 -91
  129. package/capabilities/oats-aweb/lib/captured-native.mjs +0 -91
  130. package/capabilities/oats-aweb/lib/grant-custody.mjs +0 -38
  131. package/capabilities/oats-aweb/lib/invocation-shape.mjs +0 -135
  132. package/capabilities/oats-aweb/lib/portable-binding.mjs +0 -146
  133. package/capabilities/oats-aweb/lib/session-readiness.mjs +0 -56
  134. package/capabilities/oats-aweb/lib/wake-receive.mjs +0 -56
  135. package/capabilities/oats-aweb/oats.json +0 -208
  136. package/capabilities/oats-aweb/skills/LICENSE +0 -21
  137. package/capabilities/oats-aweb/skills/VENDORED.md +0 -31
  138. package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +0 -201
  139. package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +0 -161
  140. package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +0 -61
  141. package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +0 -116
  142. package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +0 -74
  143. package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +0 -216
  144. package/capabilities/oats-jira/bin/oats-jira.mjs +0 -40
  145. package/capabilities/oats-jira/injects/jira.md +0 -10
  146. package/capabilities/oats-jira/oats.json +0 -22
  147. package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +0 -179
  148. package/capabilities/oats-linear/bin/oats-linear-hook.mjs +0 -34
  149. package/capabilities/oats-linear/bin/oats-linear.mjs +0 -344
  150. package/capabilities/oats-linear/injects/linear.md +0 -8
  151. package/capabilities/oats-linear/oats.json +0 -24
  152. package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +0 -223
  153. package/capabilities/oats-okf/bin/oats-okf-binding.mjs +0 -14
  154. package/capabilities/oats-okf/bin/oats-okf.mjs +0 -209
  155. package/capabilities/oats-okf/injects/okf.md +0 -42
  156. package/capabilities/oats-okf/lib/binding-wire.mjs +0 -348
  157. package/capabilities/oats-okf/lib/captured-worker.mjs +0 -109
  158. package/capabilities/oats-okf/lib/config.mjs +0 -124
  159. package/capabilities/oats-okf/lib/consult.mjs +0 -518
  160. package/capabilities/oats-okf/lib/harvest-status.mjs +0 -88
  161. package/capabilities/oats-okf/lib/harvest-switch.mjs +0 -94
  162. package/capabilities/oats-okf/lib/inspection.mjs +0 -119
  163. package/capabilities/oats-okf/lib/invocation-context.mjs +0 -111
  164. package/capabilities/oats-okf/lib/invocation-shape.mjs +0 -135
  165. package/capabilities/oats-okf/lib/io.mjs +0 -118
  166. package/capabilities/oats-okf/lib/migration.mjs +0 -137
  167. package/capabilities/oats-okf/lib/okf-validate.mjs +0 -123
  168. package/capabilities/oats-okf/lib/portable-binding.mjs +0 -199
  169. package/capabilities/oats-okf/lib/source-contract.mjs +0 -46
  170. package/capabilities/oats-okf/lib/sources.mjs +0 -424
  171. package/capabilities/oats-okf/lib/stores.mjs +0 -473
  172. package/capabilities/oats-okf/lib/worker.mjs +0 -497
  173. package/capabilities/oats-okf/oats.json +0 -148
  174. package/capabilities/oats-okf/schemas/okf-base.schema.json +0 -46
  175. package/capabilities/oats-okf/schemas/okf-bindings.schema.json +0 -112
  176. package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +0 -87
  177. package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +0 -113
  178. package/capabilities/oats-okf/schemas/okf-soul.schema.json +0 -37
  179. package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +0 -144
  180. package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +0 -86
  181. package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +0 -104
  182. package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +0 -140
  183. package/capabilities/oats-okf-harvest/injects/harvester.md +0 -12
  184. package/capabilities/oats-okf-harvest/oats.json +0 -26
  185. package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +0 -168
  186. package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +0 -192
  187. package/capabilities/oats-okf-harvest/skills/okf-authoring/SKILL.md +0 -151
  188. package/capabilities/oats-okf-harvest/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
  189. package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +0 -170
  190. package/capabilities/oats-okf-maintenance/injects/maintainer.md +0 -12
  191. package/capabilities/oats-okf-maintenance/lib/provenance.mjs +0 -50
  192. package/capabilities/oats-okf-maintenance/oats.json +0 -21
  193. package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +0 -159
  194. package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +0 -192
  195. package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +0 -151
  196. package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
  197. package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +0 -146
  198. package/capabilities/oats-review/injects/review.md +0 -69
  199. package/capabilities/oats-review/oats.json +0 -10
  200. package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
  201. package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
  202. package/docs/conventions.md +0 -90
  203. package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
  204. package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
  205. package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
  206. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
  207. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
  208. package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
  209. package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
  210. package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
  211. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
  212. package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
  213. package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
  214. package/docs/design/2026-09-15-captured-dispatch.md +0 -127
  215. package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
  216. package/docs/design/2026-09-15-package-preparation.md +0 -100
  217. package/docs/design/2026-09-15-portable-data-contract.md +0 -121
  218. package/docs/design/2026-09-15-portable-declarations.md +0 -189
  219. package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
  220. package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
  221. package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
  222. package/docs/design/2026-09-15-source-observation.md +0 -119
  223. package/docs/design/2026-09-16-captured-admission.md +0 -77
  224. package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
  225. package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
  226. package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
  227. package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
  228. package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
  229. package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
  230. package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
  231. package/docs/design/2026-09-16-portable-onboarding.md +0 -179
  232. package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
  233. package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
  234. package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
  235. package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
  236. package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
  237. package/docs/design/2026-09-17-captured-native-start.md +0 -58
  238. package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
  239. package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
  240. package/docs/design/2026-09-17-public-captured-start.md +0 -108
  241. package/docs/design/2026-09-17-public-prepare-request.md +0 -90
  242. package/docs/design/2026-09-18-captured-pi-host.md +0 -205
  243. package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
  244. package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
  245. package/docs/design/2026-09-20-redesign-program-board.md +0 -142
  246. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
  247. package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
  248. package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
  249. package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
  250. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
  251. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
  252. package/docs/design/2026-09-24-phase-d-plan.md +0 -305
  253. package/docs/design/2026-09-25-teams-contract.md +0 -258
  254. package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
  255. package/docs/design/desktop-ux-plan.md +0 -362
  256. package/docs/design/launch-configurations.md +0 -168
  257. package/docs/design/okf-mirror-provenance.md +0 -105
  258. package/docs/design/operations-contract.md +0 -141
  259. package/docs/oats-member.schema.json +0 -38
  260. package/skills/integration-authoring/SKILL.md +0 -84
  261. package/skills/oats-support/SKILL.md +0 -79
  262. package/skills/skill-craft/SKILL.md +0 -109
  263. package/skills/soul-craft/SKILL.md +0 -116
@@ -81,16 +81,15 @@ A self-contained package has an `oats.json`:
81
81
  slot.
82
82
  - `skills` entries can be skill directories or roots containing skills.
83
83
  - `inject` is optional instance instruction Markdown.
84
- - Only `soul-scaffold`, `spawn`, and `retire` hooks are accepted. A hook is a
84
+ - The hooks are `spawn`, `launch` and `retire`. A hook is a
85
85
  command string, or `{ command, required }`. `required: true` is valid **only
86
86
  on `spawn`**: the hook's failure then fails the spawn and rolls it back,
87
87
  instead of producing an instance whose capability never configured itself —
88
88
  an aweb identity that could not be minted leaves an agent believing it can be
89
89
  woken by mail. Every other hook stays best-effort and only warns, so advisory
90
- work never becomes a spawn blocker. `retire` and `soul-scaffold` cannot be
90
+ work never becomes a spawn blocker. `launch` and `retire` cannot be
91
91
  required: they run outside a spawn transaction, so there is no moment to
92
- enforce them. The kernel no longer runs `soul-scaffold` (it ran when
93
- `oats create` wrote a soul); a manifest may still declare it.
92
+ enforce them. A `soul-scaffold` hook is tolerated and ignored.
94
93
  - A capability declaring a **required** spawn hook should declare a `retire` hook
95
94
  too. Without one, OATS has no way to undo what the spawn hook did and no way to
96
95
  know whether it did anything, so a failure quarantines the home rather than
@@ -156,9 +155,7 @@ A self-contained package has an `oats.json`:
156
155
 
157
156
  `capability` is the only manifest identity field; it may also carry
158
157
  `private: true` (a **repo-owned** capability: listed, but usable only by souls
159
- of its own repo) and `team: <label>`
160
- (the one workspace team label it is listed under; without it, the primary of
161
- its repository's default). The machine-readable contract is
158
+ of its own repo). The machine-readable contract is
162
159
  [`capability-manifest.schema.json`](capability-manifest.schema.json).
163
160
 
164
161
  ## Who gets a capability
@@ -172,9 +169,6 @@ defaults:
172
169
  knowledge: { oats.okf: { from: package } } # slot default: a layer capability
173
170
  messaging: none
174
171
  tasks: none
175
- byTeam:
176
- engineering:
177
- capabilities: { acme-release-tooling: { from: github.com/acme/agents } }
178
172
 
179
173
  # souls/release-manager/soul.yaml — the soul's own choices
180
174
  capabilities:
@@ -182,110 +176,80 @@ capabilities:
182
176
  acme-deploy: { from: package }
183
177
  acme-house-style: off
184
178
  knowledge:
185
- owns: release-manager
179
+ harvest: off # this soul's knowledge-slot payload
186
180
  ```
187
181
 
188
182
  Composition order: `defaults.<slot>` ⊕ `defaults.capabilities` ⊕
189
- `defaults.byTeam[<label>]` for each of the soul's team labels, in order ⊕
190
183
  `soul.capabilities` — later wins, `off` removes, a soul `<slot>: none` drops
191
- the workspace's slot default. Two labels that give one capability different
192
- entries are `E_TEAM_CONFLICT`, naming both labels; identical entries are fine,
193
- and a capability the soul names itself settles it (the soul's entry wins). A resolved
194
- capability whose manifest says `layer: X` fills slot X; two for one slot are
184
+ the workspace's slot default. Teams compose nothing, so a soul's composition
185
+ is the same for every person and machine. A resolved capability whose manifest says `layer: X` fills slot X; two for one slot are
195
186
  `E_SLOT_CONFLICT`. Provider settings start from the manifest's own declared
196
187
  defaults (`settings.<key>.default`, the lowest layer), then take the workspace's
197
- `messaging` payload (its base: no `byTeam` entry is merged, per teams
198
- amendment K) for the messaging slot, the soul's
188
+ `messaging` payload for the messaging slot, the soul's
199
189
  slot payload, `oats-local.yaml` `settings.<cap>`, and `oats spawn --provider`,
200
190
  deep-merged in that order. There are no agent types, no `global`, no
201
191
  per-deployment activation or exclusion maps.
202
192
 
203
- ### Several team labels
204
-
205
- A soul's `team` (or its repository's default in `oats-membership.yaml`) is a
206
- label or a non-empty list of distinct labels; the first is the **primary**:
207
-
208
- ```yaml
209
- # souls/release-manager/soul.yaml
210
- schemaVersion: 2
211
- name: release-manager
212
- description: Cuts and ships releases.
213
- work: worktree
214
- team: [engineering, reviewers]
215
- ```
216
-
217
- - `OATS_TEAM_LABEL` is the primary label. The merged messaging payload takes
218
- **no** label's `byTeam` entry, the primary's included (teams amendment K), so
219
- `OATS_TEAM_ID` (the payload's `team`) is the default team a host, soul or spawn set; empty means the provider's default.
220
- - Every label is an **eligible team**: the kernel hands the messaging provider
221
- `teams`, one `{ label, team, mapped, payload }` per label in order. `payload`
222
- is `workspace.messaging` ⊕ `byTeam[<label>]` when the workspace maps the
223
- label (`team` is then its team id), else the base alone with `mapped: false`
224
- and `team: null`. A soul with no label gets `[]` (the workspace's default team only).
225
- - `teams` travels **beside** a provider's settings, never inside them:
226
- `OATS_TEAMS` (the JSON), `OATS_TEAM_LABELS` (comma-joined) and
227
- `OATS_TEAMS_SOURCE` in the environment of every hook, home command and
228
- provider check. The environment is their only channel: a check's stdin
229
- request stays the released binding wire, which providers decode strictly.
230
- The variables are empty (not `[]`) when a home's teams are unknown.
231
- - `OATS_TEAMS_SOURCE` is `live` (read from the workspace now, or a fresh
232
- resolution) or `recorded` (the spawn-time list). **A provider leaves a joined
233
- team only on a `live` list**: a recorded one lacks every team mapped since
234
- the spawn, so acting on it could drop a valid membership.
235
- - Joining an eligible team is the provider's explicit act (a spawn choice or a
236
- command at any time); the kernel never joins anything.
237
- - For an existing home the teams are **live** where they are acted on: its
238
- launch hook (`oats session start|restart`), its messaging module's commands
239
- and `messaging:` operations (`oats operation run --home`), and `oats inspect
240
- --home` read the soul's labels and the workspace's `messaging` as they stand
241
- now — two repository reads (the workspace host, the soul's own repo), never a
242
- discovery; `oats readiness --home` takes them from the discovery it already
243
- runs. The home's modules and skills stay as spawned. Every other capability
244
- command and operation gets the teams the spawn recorded in `instance.json`
245
- (`teams`), marked `recorded`, at no remote cost; so does any read where the
246
- workspace cannot be reached.
247
- - **Known limitation (0.26.0):** a scheduled wake's session start uses the
248
- recorded teams (`OATS_TEAMS_SOURCE=recorded`), so its launch hook leaves
249
- nothing; the next operator start or messaging command is live.
250
- - A label in the workspace's `teams:` but not in `messaging.byTeam` is a
251
- discovery warning (`unmapped-team-label`, one per label naming its souls); a
252
- label not in `teams:` at all is the `E_TEAM_UNKNOWN` problem.
253
-
254
- ## Exact harness composition
255
-
256
- Every spawned instance receives:
257
-
258
- - canonical soul skills;
259
- - a **full copy** of every capability the soul resolved to, under
260
- `<instance>/.oats/modules/<capability>/` (manifest, `bin/`, injects, skills);
261
- - those capabilities' skills copied to `<instance>/.agents/skills/<capability>/<skill>/`.
262
-
263
- `instance.json` records per module its source (`from`), commit and content
264
- digest, and the composed skill names with their source. `.claude/skills` points
265
- to the same canonical directory. **The harness starts normally**: pi, Claude
266
- Code and Codex run their own skill discovery with cwd = the instance home;
267
- ambient skills (user-level, the work tree's `.agents/skills/`) coexist with the
268
- OATS-composed set. `instance.json` records what OATS composed, not everything
269
- the harness may discover.
270
-
271
- Duplicate skill names **within the composed set** fail the spawn naming both
272
- capabilities (`E_SKILL_DUPLICATE`). A composed skill and an ambient skill with
273
- one name is the harness's own precedence, not an error.
274
-
275
- The instance's `AGENTS.md` is a generated regular file containing:
276
-
277
- 1. the canonical soul `AGENTS.md`;
278
- 2. the kernel and work-mode blocks;
279
- 3. each module's inject, in deterministic (name) order.
280
-
281
- Its `CLAUDE.md` symlinks to `AGENTS.md`. The committed soul remains unchanged.
282
- Edit the canonical soul or the capability's inject in its repo, then spawn a
283
- new instance; do not edit generated blocks as source-of-truth changes.
193
+ ### Teams in the provider environment
194
+
195
+ A soul's teams here (the committed shared teams, and the deployment's `oats-local.yaml` `teams`, `defaultTeam`, `souls.teams`,
196
+ `souls.default` — see [workspaces.md](workspaces.md#teams)) travel **beside** a
197
+ provider's settings, never inside them, in the environment of every hook, home
198
+ command and provider check:
199
+
200
+ - `OATS_DEFAULT_TEAM` — the soul's default label; `OATS_DEFAULT_TEAM_ID` — its
201
+ provider id; `OATS_DEFAULT_TEAM_FROM` — `deployment` (`defaultTeam`) or `soul`
202
+ (`souls.default`).
203
+ - No default configured: none of the three is set. An **unmapped** default (a
204
+ shared team declared without an id): `OATS_DEFAULT_TEAM` and
205
+ `OATS_DEFAULT_TEAM_FROM` are set and `OATS_DEFAULT_TEAM_ID` is not. What a
206
+ provider does then is its own contract; a messaging provider typically
207
+ refuses the spawn, naming the unmapped label, or saying no team is
208
+ configured.
209
+ - `OATS_TEAMS` — JSON `[{label, team, default, from: "shared"|"local"}]`: every
210
+ mapped team the soul may be in here, the default included (`default: true`),
211
+ default first, then by label. Eligible to join = the rows with `default: false`.
212
+ Unset when a home's teams are unknown (none recorded, and unreadable now).
213
+ - `OATS_TEAMS_SOURCE` — `live` (the workspace and `oats-local.yaml` read now, or
214
+ a fresh resolution) or `recorded` (the spawn-time record). **A provider leaves
215
+ a joined team only on a `live` list**: a recorded one lacks every change since
216
+ the spawn.
217
+
218
+ The environment is their only channel: a check's stdin request stays the
219
+ released binding wire, which providers decode strictly. Joining a team other
220
+ than the default is the provider's explicit act (a spawn choice or a command at
221
+ any time); the kernel never joins anything.
222
+
223
+ For an existing home the teams are **live** where they are acted on: its launch
224
+ hook (`oats session start|restart`), its messaging module's commands and
225
+ `messaging:` operations (`oats operation run --home`), and `oats inspect
226
+ --home` read the workspace host and the deployment's `oats-local.yaml` as they
227
+ stand now — one repository read, never a discovery; `oats readiness --home`
228
+ takes them from the discovery it already runs. The home's modules and skills
229
+ stay as spawned. Every other capability command and operation gets the teams
230
+ the spawn recorded in `instance.json` (`teams`, `defaultTeam`), marked
231
+ `recorded`, at no remote cost; so does any read where the workspace cannot be
232
+ reached. A scheduled wake's session start uses the recorded teams, so its
233
+ launch hook leaves nothing; the next operator start or messaging command is
234
+ live.
235
+
236
+ ## What an instance receives
237
+
238
+ Every spawned instance gets a **full copy** of each capability its soul
239
+ resolved to, under `<home>/.oats/modules/<capability>/` (manifest, `bin/`,
240
+ injects, skills), and those skills under
241
+ `<home>/.agents/skills/<capability>/<skill>/`. Its generated `AGENTS.md` is the
242
+ soul's `AGENTS.md`, the kernel and work-mode blocks, then each module's inject
243
+ in name order. Two composed skills with one name fail the spawn
244
+ (`E_SKILL_DUPLICATE`). The harness then starts normally, with its own skill
245
+ discovery; the details are in [souls-and-instances.md](souls-and-instances.md).
246
+ Change a capability's inject or skills in its repository, then spawn a new
247
+ instance: the generated files are not a source.
284
248
 
285
249
  Inspect a composition before it exists:
286
250
 
287
251
  ```bash
288
- oats spawn release-manager --preview # modules (from / commit / changedSince), team, resolution revision
252
+ oats spawn release-manager --preview # modules (from / commit / changedSince), teams + default, resolution revision
289
253
  oats spawn release-manager --preview --json
290
254
  ```
291
255
 
@@ -302,7 +266,7 @@ packages is in [packages.md](packages.md). There is no installed
302
266
  copy at a deployment and no `oats install`/`trust`/`update`/`remove`.
303
267
 
304
268
  One package can carry capabilities meant for **different souls**. oats.okf
305
- 4.0.0 ships three:
269
+ ships three:
306
270
 
307
271
  - `oats.okf` fills every working soul's knowledge slot;
308
272
  - `oats.okf-harvest` is composed only into its harvester soul;
@@ -328,22 +292,11 @@ reported as `publishes` and consumed only as a package.
328
292
 
329
293
  ## Agents a capability needs
330
294
 
331
- A capability declares no agents: `agents:` in a manifest was **removed in
332
- 0.29.0**. Resolution refuses a module that still declares it with
333
- `E_CAPABILITY_AGENTS_REMOVED { capability, agents }` (spawn, `spawn --preview`,
334
- `inspect --soul`, operator commands). Ship the agent as a soul instead:
335
-
336
- - a **package soul**: `souls/<name>/` beside the package's capabilities, listed
337
- in `oats-package.json` `souls:`, spawned as `oats spawn <package>/<name>`
338
- (or the bare name when unique), reading the package's capabilities with
339
- `from: here` ([packages.md](packages.md#package-souls)). The post-commit
340
- `reviewer` is one: oats.dev 1.1.0's `oats.dev/reviewer`, beside `oats.review`;
341
- - or a **member soul**: `souls/<name>/` in a member repository, using a
342
- member capability `from: here`.
343
-
344
- A home an earlier kernel spawned from a manifest `agents:` soul (its agent
345
- directory holds only `instances/`) is still listed by `oats status`, may anchor
346
- a `--parent`, and retires; nothing creates one any more.
295
+ A capability declares no agents (a manifest `agents:` is refused with
296
+ `E_CAPABILITY_AGENTS_REMOVED`). Ship the agent as a soul: a **package soul**
297
+ beside the package's capabilities ([packages.md](packages.md#package-souls)),
298
+ such as oats.engineering's `code-reviewer` beside `oats.code-review`, or a **member soul** in a
299
+ member repository, using the capability `from: here`.
347
300
 
348
301
  ## Commands and hooks
349
302
 
@@ -352,23 +305,36 @@ instance's modules (or the soul's resolved set). Workspace commands (`sync`,
352
305
  `package`, `workspace status`, `capabilities`, `souls`, `doctor`) are always
353
306
  available.
354
307
 
355
- A manifest's `helperInjection` and a hook's `inputs` are **ignored since 0.26**:
356
- they served the captured path (removed in 0.26), are still accepted so that
357
- existing manifests load, and change nothing.
308
+ A manifest's `helperInjection` and a hook's `inputs` are tolerated and ignored.
309
+
310
+ Hooks receive:
358
311
 
359
- Hooks receive `OATS_EVENT`, `OATS_CAPABILITY`, `OATS_LAYER`, `OATS_INSTANCE`,
360
- `OATS_HOME`, `OATS_AGENT`, `OATS_SOUL`, `OATS_CONTEXT`, `OATS_WORKSPACE`,
361
- `OATS_ROOT`, `OATS_LEVEL`, `OATS_SETTINGS`, `OATS_SETTINGS_ORIGINS`, and
362
- `OATS_META`. `OATS_SETTINGS_ORIGINS` (0.29.0) says where each leaf of
312
+ - `OATS_EVENT`, `OATS_CAPABILITY`, `OATS_LAYER`, `OATS_LEVEL`;
313
+ - `OATS_INSTANCE`, `OATS_INSTANCE_HOME` (the home, absolute; `OATS_HOME` is a
314
+ compatibility alias), `OATS_AGENT`, `OATS_SOUL`, `OATS_SOUL_ID`,
315
+ `OATS_CONTEXT`, `OATS_WORKSPACE`, `OATS_ROOT`;
316
+ - `OATS_CLI_BIN` (the running kernel's `bin/oats.mjs`);
317
+ - `OATS_SETTINGS`, `OATS_SETTINGS_ORIGINS`, `OATS_META`;
318
+ - the team and workspace variables of
319
+ [Teams in the provider environment](#teams-in-the-provider-environment),
320
+ plus `OATS_WORKSPACE_NAME`, `OATS_WORKSPACE_KEY` and `OATS_TEAM_SCOPE`
321
+ (the deployment directory). `OATS_TEAM_NAME` is always empty.
322
+
323
+ A spawn hook also gets `OATS_TASK`, `OATS_REPO`, `OATS_BRANCH`, `OATS_WORK`,
324
+ `OATS_HARNESS`, `OATS_KIND` and, for a spawn a trigger started,
325
+ `OATS_TRIGGER_EVENT_FILE`. A launch hook also gets `OATS_HARNESS` and
326
+ `OATS_PREVIOUS_HARNESS`.
327
+
328
+ `OATS_SETTINGS_ORIGINS` says where each leaf of
363
329
  `OATS_SETTINGS` came from: a JSON object from a JSON pointer to `{ kind, at }`,
364
330
  `kind` being `manifest-default`, `workspace`, `soul`, `host`, `spawn` or
365
331
  `anchor` (the last layer that set it), e.g.
366
332
  `{"/harvest":{"kind":"soul","at":"soul.yaml#/knowledge"}}`. A provider tells a
367
- soul-set value from a host-set one there, and never reads `soul.yaml` for it.
368
- A home spawned before 0.29.0 recorded none: `{}`. A final JSON line may
369
- return `meta`, `brief`, `warning`, or harness-specific `launch` arguments. A
370
- **spawn hook only** may also return an `env` object for the launched process;
371
- returning `env` from retire or soul-scaffold is an explicit contract error.
333
+ soul-set value from a host-set one there, and never reads `soul.yaml` for it;
334
+ a home with none recorded gives `{}`. A final JSON line may return `meta`,
335
+ `brief`, `warning`, or harness-specific `launch` arguments. A **spawn or
336
+ launch hook** may also return an `env` object for the launched process;
337
+ returning `env` from a retire hook is an explicit contract error.
372
338
 
373
339
  A **launch hook** runs at every start and restart of a home for each provider
374
340
  recorded at spawn (under its recorded settings). Its `launch` arguments and
@@ -378,8 +344,7 @@ after the start succeeds — the same record the spawn hook wrote and the retire
378
344
  hook later reads as `OATS_META` — so a provider that re-issues a credential at
379
345
  start (a renewed session grant, for example) leaves the CURRENT one on record. A
380
346
  launch hook that answers without `meta` keeps its previous entry; a start whose
381
- preparation fails changes nothing. (Kernel ≥ 0.25.5; earlier kernels collected
382
- launch `meta` and discarded it.)
347
+ preparation fails changes nothing.
383
348
 
384
349
  Hook environment values are strings, at most 8192 UTF-8 bytes, with no NUL or
385
350
  newlines. Names use the portable environment grammar and must belong to an
@@ -390,11 +355,10 @@ for this contract. Hyphenated vendors are also excluded because translating a
390
355
  hyphen to `_` would let `aweb-evil.*` collide with names already inside
391
356
  `aweb.*`'s `AWEB_*` namespace.
392
357
 
393
- A manifest's `settings.<key>` may carry `hostOnly: true` (decision 27). Such a
358
+ A manifest's `settings.<key>` may carry `hostOnly: true`. Such a
394
359
  key is a fact about the machine — a custody directory, a state root — and the
395
360
  resolver accepts it only from the deployment's own `oats-local.yaml`
396
- `settings.<capability>`; a committed workspace or soul file (every
397
- `messaging.byTeam` entry of a label the soul carries included) or a
361
+ `settings.<capability>`; a committed workspace or soul file or a
398
362
  `--provider` flag carrying it is refused (`E_WORKSPACE_SCHEMA`, reason
399
363
  `host-only-key`).
400
364
  Declare it for any key whose value points at something a committed file must
@@ -425,11 +389,11 @@ A failed compensation, unverifiable topology removal, or reported spawn state
425
389
  without a retire hook uses the standard retryable quarantine instead. Ordinary
426
390
  advisory hook execution failure itself contributes no environment.
427
391
 
428
- The environment prefix applies to the initial Pi or Claude process. `--no-launch`
429
- validates command preparation but launches no harness. The fallback shell
430
- after that process exits does not inherit command-scoped assignments, and OATS
431
- has no restart command or replay policy yet. The generated command is persisted
432
- as before; hooks must contribute locators, selectors, or broker endpoints—not
392
+ The environment prefix applies to the harness process (pi, Claude Code or
393
+ Codex). `--no-launch` validates command preparation but launches no harness.
394
+ The fallback shell after that process exits does not inherit command-scoped
395
+ assignments; `oats session start|restart` runs the launch hooks again. The
396
+ generated command is persisted; hooks must contribute locators, selectors, or broker endpoints—not
433
397
  bearer tokens or private key material. An instance-lifetime local principal may
434
398
  be selected by a home locator. A replaceable execution serving a durable global
435
399
  identity must instead use a custody/action broker or equivalent narrow adapter;
@@ -443,28 +407,50 @@ spawn order. Hooks run from the instance's own copy
443
407
 
444
408
  ## Official packages
445
409
 
446
- | Capability | Kind | Provides | Package |
447
- |---|---|---|---|
448
- | `oats.core` | additive | day-to-day OATS operation for an instance | `oats.framework` |
449
- | `oats.setup` | additive | whole-architecture knowledge for an onboarding expert | `oats.framework` |
450
- | `oats.okf` | knowledge core capability | External owned OKF bases, durable notes/record custody, independent judgment and inspection | `oats.okf` |
451
- | `oats.aweb` | messaging core capability | aweb identity lifecycle and messaging skills | `oats.aweb` |
452
- | `oats.jira` | tasks core capability | Jira task protocol via `acli` | `oats.jira` |
453
- | `oats.linear` | tasks core capability | Linear GraphQL task commands and workflow | `oats.linear` |
454
- | `oats.authoring` | additive | capability, skill, and soul authoring guidance | `oats.authoring` |
455
-
456
- Each is pinned by a bare version in `packages:` and resolved through the
457
- [official catalog](official-catalog.md); each package repo is also a member
458
- of the OATS workspace carrying its expert soul (`okf-expert`, `aweb-expert`, …).
459
- The framework's own souls say `oats.okf: { from: package }` — membership never
460
- turns a package into a latest-state capability.
410
+ The official packages and the capabilities and souls each carries are listed
411
+ in the [official catalog](official-catalog.md#the-packages). Each is pinned by a bare version in
412
+ `packages:`; each package repository is also a member of the OATS workspace,
413
+ carrying its expert soul. The framework's own souls say
414
+ `oats.okf: { from: package }`: membership never turns a package into a
415
+ latest-state capability.
461
416
 
462
417
  ## Operations a capability declares
463
418
 
464
- A manifest may declare `operations` (named actions or views delegating to
465
- its own commands) that a GUI or a schedule invokes through `oats operation
466
- run <layer>:<name>`; `oats inspect --json` reports them with availability.
467
- See [docs/design/operations-contract.md](design/operations-contract.md).
419
+ A manifest may declare `operations`: named actions or views that a GUI, a
420
+ schedule or an operator invokes without knowing the provider.
421
+
422
+ ```json
423
+ "operations": {
424
+ "harvest": { "kind": "action", "command": "harvest", "context": "home", "description": "Promote this instance's notes" },
425
+ "inspect": { "kind": "view", "command": "inspect", "context": "home", "description": "Show this instance's working knowledge" }
426
+ }
427
+ ```
428
+
429
+ - `command` names one of the manifest's `commands`. `kind` is `action`
430
+ (default) or `view`; `context` is `home` (default: runs in an instance
431
+ home) or `scope`.
432
+ - Optional `args` declare `{ name, flag, required, description }`; the runner
433
+ passes `--arg name=value` as those flags and refuses unknown or missing
434
+ required ones.
435
+ - A view answers `{ documents: [{ label, kind: "markdown"|"text", path?, text? }], summary? }`;
436
+ the kernel validates that shape and relays it.
437
+
438
+ `oats inspect --json` lists each operation with its availability.
439
+ `oats operation run <layer>:<name> (--home <abs> | --soul <name>) [--arg k=v …] --json`
440
+ resolves the provider that fills `<layer>` for the subject and runs its
441
+ command exactly as `oats <namespace> <command>` would, with the hook
442
+ identity variables of that subject and the invoking process's own identity
443
+ removed. It refuses an undeclared operation (`E_OPERATION_UNKNOWN`), a slot
444
+ with no provider or a home operation without `--home`
445
+ (`E_OPERATION_UNAVAILABLE`), and a missing host command
446
+ (`E_CAPABILITY_REQUIRES`).
447
+
448
+ The provider must exit 0 with exactly one JSON envelope on stdout. Otherwise
449
+ the outcome is **unconfirmed**: `E_OPERATION_TIMEOUT` (after 240 s) or
450
+ `E_OPERATION_RESULT`, with `error.details { unconfirmed: true, exit, envelope?, stderr? }`.
451
+ A provider's own `ok: false` is relayed with its code. A schedule of kind
452
+ `operation` runs the same command ([schedules.md](schedules.md)). The JSON
453
+ shapes are in [desktop-cli-api.md](desktop-cli-api.md#inspect-readiness-and-operation-run-on-the-workspace-model-operationsapi-2-soulsapi-2-readinessapi-2-oats-0260).
468
454
 
469
455
  ## Readiness check (`binding.check`)
470
456
 
@@ -473,7 +459,7 @@ manifest is asked by `oats readiness` whether it is ready for the subject. The
473
459
  subject is an instance home (`--home`) or a soul (`--soul`). The command named
474
460
  by `binding.check` receives one request and answers once. The kernel relays
475
461
  that answer to consumers as it came: readiness `providers` items. For the
476
- consumer side, see [desktop-cli-api.md](desktop-cli-api.md#oats-readiness---home---soul---dir---policy---json-readinessapi-2).
462
+ consumer side, see [desktop-cli-api.md](desktop-cli-api.md#oats-readiness---home-----soul----dir----policy---json--readinessapi-2).
477
463
  This check reads configuration only; it binds nothing and does not change a
478
464
  spawn's fail-closed hooks.
479
465
 
@@ -492,9 +478,9 @@ passed as arguments; no shell is involved.
492
478
 
493
479
  ```json
494
480
  {"schemaVersion":1,"phase":"check","slot":"messaging","capability":"my.provider",
495
- "settings":{"team":"acme:eng","root":"/srv/aw"},
481
+ "settings":{"root":"/srv/aw"},
496
482
  "input":{"context":{"kind":"workspace","workspace":"github.com/acme/agents","deployment":"/srv/acme",
497
- "soul":"release-manager","team":"engineering","instance":"release-manager-1",
483
+ "soul":"release-manager","instance":"release-manager-1",
498
484
  "home":"/srv/acme/agents/release-manager/instances/release-manager-1"},
499
485
  "action":{"kind":"readiness"}}}
500
486
  ```
@@ -503,9 +489,9 @@ passed as arguments; no shell is involved.
503
489
  - `settings` is the merged provider payload: the one the spawn recorded for a
504
490
  home, or the one the resolution computes for a soul.
505
491
  - The request has exactly these keys; a provider may decode it strictly. The
506
- soul's eligible teams (see *Several team labels*) are not on stdin: the check
507
- reads them from `OATS_TEAMS` / `OATS_TEAMS_SOURCE` / `OATS_TEAM_LABELS`.
508
- - `context.team` is the soul's primary team label, or `null`.
492
+ soul's teams (see [Teams in the provider environment](#teams-in-the-provider-environment))
493
+ are not on stdin: the check reads them from `OATS_DEFAULT_TEAM*`, `OATS_TEAMS`
494
+ and `OATS_TEAMS_SOURCE`.
509
495
  - `instance` and `home` are `null` for a soul subject.
510
496
 
511
497
  **Environment:**
@@ -516,16 +502,19 @@ passed as arguments; no shell is involved.
516
502
  `OATS_SETTINGS_ORIGINS` (where each leaf came from, as hooks get it);
517
503
  - `OATS_CLI_BIN`;
518
504
  - `OATS_WORKSPACE` (the deployment);
519
- - the team variables `OATS_TEAM_ID` (the messaging payload's `team`: the
520
- workspace's default team if one is set; empty = the provider's default),
521
- `OATS_TEAM_SCOPE`, `OATS_TEAM_LABEL`, `OATS_TEAM_NAME`,
522
- `OATS_TEAM_LABELS`, `OATS_TEAMS`, `OATS_TEAMS_SOURCE`, `OATS_WORKSPACE_NAME` and
505
+ - the team variables `OATS_DEFAULT_TEAM`, `OATS_DEFAULT_TEAM_ID`,
506
+ `OATS_DEFAULT_TEAM_FROM`, `OATS_TEAMS`, `OATS_TEAMS_SOURCE` (see
507
+ [Teams in the provider environment](#teams-in-the-provider-environment)),
508
+ `OATS_TEAM_SCOPE`, `OATS_TEAM_NAME`, `OATS_WORKSPACE_NAME` and
523
509
  `OATS_WORKSPACE_KEY`;
524
510
  - `OATS_AGENT` (the soul);
525
- - `OATS_SOUL` when the soul directory is known;
511
+ - `OATS_SOUL`, the soul directory: a home's recorded one, or for a soul
512
+ (`readiness --soul`, `inspect --soul`) its copy at the resolved commit,
513
+ which the kernel materialises first as a spawn would (0.30; a copy that
514
+ cannot be made fails readiness under `installed`, producer `soul copy`);
526
515
  - for a home, `OATS_INSTANCE` and `OATS_INSTANCE_HOME`.
527
- - A home's `OATS_WORKSPACE_NAME` is `""` until spawn records the workspace
528
- name.
516
+ - `OATS_TEAM_SCOPE` is the deployment directory; `OATS_TEAM_NAME` is always
517
+ empty.
529
518
 
530
519
  **Answer** — exit 0, and exactly one JSON document on stdout (whitespace
531
520
  around it is fine; progress text is not):
@@ -11,7 +11,7 @@
11
11
  "$defs": {
12
12
  "HelperInjection": {
13
13
  "deprecated": true,
14
- "description": "DEPRECATED and IGNORED since OATS 0.26: it served the captured path (removed in 0.26). Still accepted so existing manifests validate; it changes nothing. Omit it.",
14
+ "description": "Tolerated and ignored: accepted so existing manifests validate; it changes nothing. Omit it.",
15
15
  "oneOf": [
16
16
  {"type":"object","required":["version","mode"],"additionalProperties":false,"properties":{"version":{"const":1},"mode":{"enum":["inherit","omit"]}}},
17
17
  {"type":"object","required":["version","mode","path"],"additionalProperties":false,"properties":{"version":{"const":1},"mode":{"const":"file"},"path":{"type":"string","minLength":1,"pattern":"^(?![A-Za-z]:)(?!.*(?:^|/)\\.{1,2}(?:/|$))[^/\\\\\u0000]+(?:/[^/\\\\\u0000]+)*$"}}}
@@ -61,11 +61,6 @@
61
61
  "type": "boolean",
62
62
  "description": "Workspace discovery: true makes this member capability repo-owned — listed (private: true) but usable only by souls of its own repository (E_CAPABILITY_PRIVATE elsewhere)."
63
63
  },
64
- "team": {
65
- "type": "string",
66
- "pattern": "^[a-z0-9][a-z0-9._-]*$",
67
- "description": "Workspace discovery: the team label for this capability; else the repository's default from oats-membership.yaml."
68
- },
69
64
  "layer": {
70
65
  "enum": [
71
66
  "knowledge",
@@ -83,7 +78,7 @@
83
78
  "inject": {
84
79
  "type": "string"
85
80
  },
86
- "helperInjection": {"$ref":"#/$defs/HelperInjection","deprecated":true,"description":"DEPRECATED and IGNORED since OATS 0.26 (accepted so existing manifests validate; changes nothing). Omit it."},
81
+ "helperInjection": {"$ref":"#/$defs/HelperInjection","deprecated":true,"description":"Tolerated and ignored (accepted so existing manifests validate; changes nothing). Omit it."},
87
82
  "environment": {
88
83
  "type": "array",
89
84
  "items": {
@@ -120,7 +115,7 @@
120
115
  },
121
116
  {
122
117
  "title": "harness package requirement",
123
- "description": "A package that must be installed into a specific harness's own package manager. Raised only for deployments using that harness, satisfied by the harness's package list rather than by PATH, and installed only with explicit consent. The harness is named by `harness` (0.27.0) or by `runtime`, its pre-0.27 name that released manifests use: exactly one of the two.",
118
+ "description": "A package that must be installed into a specific harness's own package manager. Raised only for deployments using that harness, satisfied by the harness's package list rather than by PATH, and installed only with explicit consent. The harness is named by `harness` or by `runtime`, its old name that released manifests use: exactly one of the two.",
124
119
  "type": "object",
125
120
  "required": [
126
121
  "package",
@@ -140,7 +135,7 @@
140
135
  },
141
136
  "runtime": {
142
137
  "type": "string",
143
- "description": "The pre-0.27 name of `harness`, accepted for released manifests.",
138
+ "description": "The old name of `harness`, accepted for released manifests.",
144
139
  "enum": [
145
140
  "pi",
146
141
  "claude"
@@ -210,7 +205,7 @@
210
205
  "items": { "type": "string", "minLength": 1, "maxLength": 200, "not": { "pattern": "[{}]|[^\\x20-\\x7e]" } }
211
206
  },
212
207
  "keys": {
213
- "description": "Owned operator-key declarations: exact names or trailing-dot namespaces, no other pattern syntax. Kernel 0.24.4 validates shape only; filtering, overlap checks and ownership attribution are deferred to 0.25. Providers must ignore foreign keys themselves.",
208
+ "description": "Owned operator-key declarations: exact names or trailing-dot namespaces, no other pattern syntax. The kernel validates their shape only; providers must ignore foreign keys themselves.",
214
209
  "type": "array",
215
210
  "uniqueItems": true,
216
211
  "items": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*\\.?$(?![\\s\\S])" }
@@ -281,7 +276,7 @@
281
276
  },
282
277
  "hostOnly": {
283
278
  "type": "boolean",
284
- "description": "When true, this key is a host fact (a custody path, a state directory): the resolver accepts it only from the deployment's oats-local.yaml settings.<capability> and refuses it in the workspace file, byTeam payloads, a soul's slot payload and --provider flags (E_WORKSPACE_SCHEMA reason host-only-key). Decision 27."
279
+ "description": "When true, this key is a host fact (a custody path, a state directory): the resolver accepts it only from the deployment's oats-local.yaml settings.<capability> and refuses it in the workspace file, a soul's slot payload and --provider flags (E_WORKSPACE_SCHEMA reason host-only-key). Decision 27."
285
280
  }
286
281
  },
287
282
  "additionalProperties": false