@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
package/docs/servers.md CHANGED
@@ -1,148 +1,130 @@
1
1
  # Servers: running instances on another machine
2
2
 
3
- A **server** is another machine with its own installed OATS, reached over an
4
- OpenSSH host alias. Registering one lets `oats spawn`, `oats retire` and
5
- `oats status` run there with the same flags and the same JSON envelope as
6
- locally, and lets the Desktop offer it at spawn time. The contract behind
7
- this is the execution-targets contract (`docs/execution-targets.md`, landing
8
- with the transport work).
3
+ A **server** is another machine with its own OATS and deployment, reached
4
+ over OpenSSH. `--server <id>` runs a command on that machine's OATS with the
5
+ same flags and JSON envelope as a local call. The server's kernel does the
6
+ work ([execution-targets.md](execution-targets.md)); this machine routes and
7
+ keeps a saved route per remote instance.
9
8
 
10
9
  ## Register
11
10
 
12
11
  ```bash
13
12
  oats server add build --ssh build-host --workspace /srv/team --oats /usr/local/bin/oats
14
- oats server check build # ssh reachability, remote oats version, workspace roster; no mutation
13
+ oats server check build # ssh reachability, remote version, workspace roster; changes nothing
15
14
  oats server list
15
+ oats server remove build
16
16
  ```
17
17
 
18
- - `--ssh` is an OpenSSH host alias or host name. Keys, users, ports and host
19
- verification live in your `~/.ssh/config`; the registry stores none of it and
20
- refuses `user@host` or option-shaped values. Connections are non-interactive
21
- (`BatchMode=yes`): a host that would prompt fails fast with ssh's message.
22
- - `--workspace` is the absolute path of an OATS workspace on the server: the
23
- same team repository checked out there, with its own `agents/`.
24
- - `--oats` is the remote executable (default `oats` on the login shell's PATH).
25
- - `--path` names directories to prepend to the remote PATH for every routed
26
- command (`~/.local/bin:/opt/pi/bin`). A non-interactive ssh command runs in
27
- the login shell's minimal PATH, and the remote kernel's spawn preflight looks
28
- for the harness binary (`claude`, `pi`, `codex`) there; without this, a
29
- harness installed under the user's home is "not found" even though it runs
30
- fine in an interactive shell on that host.
18
+ - `--ssh` is an OpenSSH host alias or host name, never `user@host` or an
19
+ option. Users, keys and host verification belong in `~/.ssh/config`.
20
+ Connections are non-interactive (`BatchMode=yes`): a prompt fails fast.
21
+ - `--workspace` is the absolute path of the deployment directory on the
22
+ server: the directory that holds its `oats-local.yaml`
23
+ ([configuration.md](configuration.md)). Routed commands run there as
24
+ `--dir <workspace>`.
25
+ - `--oats` is the remote executable (default: `oats` on the remote PATH).
26
+ - `--path` prepends directories to the minimal remote PATH of every routed
27
+ command (`~/.local/bin:/opt/pi/bin`), where the remote spawn looks for the
28
+ harness binary.
29
+ - `--herdr` records the remote Herdr path in the registration and in each
30
+ saved route. Routed commands do not pass it on; the remote kernel finds
31
+ `herdr` on its own PATH.
32
+ - `--label` sets a display name. `--replace` overwrites an existing id.
31
33
  - Registrations live in `~/.oats/servers.json` on this machine, never in a
32
- repository scope.
34
+ repository.
33
35
 
34
36
  ## Run there
35
37
 
36
38
  ```bash
37
39
  oats spawn dev --server build --purpose fix-123 --task-file task.md
38
40
  oats status --server build
41
+ oats session attach --server build --instance dev-fix-123
39
42
  oats retire dev-fix-123 --server build
40
43
  ```
41
44
 
42
- The remote kernel does the work in its registered workspace: composition,
43
- worktree, identity, launch, retirement. The local side only routes: a local
44
- `--task-file` travels as text, every argument is quoted for the remote login
45
- shell, and the remote's version and envelope are checked before either
46
- mutation (spawn and retire). A spawn is also held to what the remote
47
- advertises: a harness it does not list (including the soul's own default as
48
- the remote roster reports it), a session backend it lacks, or a launch option
49
- such as `--yolo` it does not know is refused with `E_REMOTE_INCOMPATIBLE`
50
- saying what was established. A remote that advertises nothing (any kernel
51
- before 0.22.2) is assumed to run pi and claude on tmux with no options, and
52
- the refusal says so rather than claiming the remote lacks the feature; a soul
53
- the remote roster does not list with a harness is validated by the remote
54
- kernel itself at spawn. `--dir` and `--server` do not combine; the remote
55
- workspace comes from the registration.
45
+ Arguments are quoted for the remote shell. Local files (`--task-file`,
46
+ `--wake-file`, a schedule or launch-configuration `--file`) are read here and
47
+ sent as text or on stdin, never as paths.
48
+
49
+ | Command | Where it runs | The server must advertise |
50
+ |---|---|---|
51
+ | `spawn` | registered workspace | the requested harness, backend and yolo option; `launch-config` for `--launch-config`; `schedule` for a wake schedule |
52
+ | `status` | registered workspace | |
53
+ | `retire` | saved route | `retire-home` to retire by exact home |
54
+ | `session inspect`, `session attach` | saved route | `session` |
55
+ | `session start`, `session restart` | saved route | `session-start`; `session-restart`; `launch-config` when `--launch-config`, `--harness` or `--yolo` is given |
56
+ | `session upload` | saved route | `session-upload` |
57
+ | `okf harvest --instance <name>` | the saved home | `harvest` |
58
+ | `schedule ...` | registered workspace | `schedule` |
59
+ | `launch-config list\|set\|remove\|preview` | `--dir`, a saved route, or the registered workspace | `launch-config` |
60
+ | `inspect`, `operation run` | `--dir`, a saved route, or the registered workspace | `operations` |
61
+
62
+ Before every routed command except `status`, the kernel reads the server's
63
+ `oats version --json`. A remote OATS older than 0.22.1 is refused, and so is a
64
+ missing feature (`E_REMOTE_INCOMPATIBLE`), before anything is sent. A spawn is
65
+ checked against the harness it would use (the flag, or the soul's default as
66
+ the remote roster reports it). A host that advertises no harness list is
67
+ assumed to run only pi and claude, on tmux, with no launch options.
68
+
69
+ **Addressing an instance.** Instance commands take `--instance <name>` (spawned
70
+ from this machine) or `--home </remote/home>`. The home is the identity; use it
71
+ when two souls on the host own same-named instances. A name and a home that
72
+ disagree are refused (`E_HOME_MISMATCH`).
73
+
74
+ **`--dir` with `--server`.** For `inspect`, `operation` and `launch-config`,
75
+ an explicit `--dir` names a directory on the server and travels as is. Every
76
+ other routed command refuses `--dir`; its scope comes from the registration.
77
+
78
+ **Not routed.** `session input` runs on the execution host, where schedules
79
+ and messaging capabilities call it. `session restart --stop-grace` is refused
80
+ with `--server`; the remote default applies. `session attach --print` shows
81
+ the ssh command without running it.
82
+
83
+ ## The roster and harvest
56
84
 
57
85
  ```bash
58
- oats session attach --server build --instance dev-fix-123 # viewer through an ssh PTY
86
+ oats server roster --json # one group per server and target
87
+ oats okf harvest --server build --instance dev-fix-123 # the harvest, run in the saved home
59
88
  ```
60
89
 
61
- The viewer runs the execution host's own `oats session attach` (Herdr terminal
62
- or an isolated tmux linked viewer) over `ssh -t`, addressed by the saved route:
63
- the remote binary and path come from the snapshot, never from the caller.
64
- Address the home rather than the name (`--home </remote/home>`) when two
65
- souls on the host own an instance of the same name: the home is the identity,
66
- the saved route that owns it supplies the target, and a name given together
67
- with a home that is not its saved route is refused. The
68
- `oats session` commands ship in kernel 0.22.2: against an older server both
69
- session routes refuse with `E_REMOTE_INCOMPATIBLE` before connecting a viewer,
70
- and `ssh -t <host> tmux attach -t oats` remains the way in.
90
+ The **roster** is what the Desktop shows: one group per server id and route
91
+ target (host and workspace), with the registration (present or not), the
92
+ probe result, the remote souls, the instances joined with saved routes
93
+ (`savedRoute`, `running` or `null` when unknown, `retirePending`,
94
+ `rollbackIncomplete`, `missingRemotely`), and `retireFailures` (deferred
95
+ self-retirements that failed there). A removed or edited registration keeps
96
+ its group from the saved routes. State is pulled on every call within
97
+ `--per-target` (default 20 s) of a total `--budget` (default 45 s); a group
98
+ not reached is reported with `E_ROSTER_BUDGET`. `--server <id>` narrows it.
71
99
 
72
- ```bash
73
- oats server roster --json # every remote group, one status pull each
74
- oats okf harvest --server build --instance dev-fix-123 # the knowledge harvest, run in the saved home
75
- ```
76
-
77
- The **roster** is what the Desktop projects: one group per server id and
78
- route target (host and workspace), each with the registration (present or
79
- not), the probe (`ok`, or the error that stopped it), the souls the remote
80
- reports with their `agentsRoot`, the instances joined with this machine's
81
- saved routes (`savedRoute`; `running` true/false, or `null` when the remote
82
- could not be asked; `retirePending`; `rollbackIncomplete` for a quarantined
83
- home; `missingRemotely` when a saved route names an instance the reachable
84
- remote no longer lists), and `retireFailures` (deferred self-retirements
85
- that failed there and need `oats retire` again). A registration that was
86
- removed or edited keeps its group from the saved routes alone, so nothing
87
- spawned through it disappears from view. Remote state is pulled every time,
88
- never cached, within a budget: each group gets at most `--per-target` (20 s)
89
- of a `--budget` (45 s) total, and groups the budget cannot reach are reported
90
- with `E_ROSTER_BUDGET` rather than dropped or waited for. **Harvest** runs
91
- the knowledge package's own `okf harvest --json` in the instance's saved home
92
- on the host (a route that outlives the registration, like retire): the home
93
- comes from the route saved at spawn, never from the caller, the remote must
94
- advertise `harvest` in its version probe (0.22.3), and the package's envelope
95
- is relayed as is. **Retire** through a saved route sends that route's home as
96
- `--home` when the remote advertises `retire-home` in its probe `features`, so
97
- a same-named twin under another agent on the host is never the one retired;
98
- locally, `oats retire <name> --home <path>` does the same and a bare name that
99
- resolves to several homes is refused.
100
+ **Harvest** runs the knowledge capability's `okf harvest --json` in the
101
+ instance's saved home on the server and relays its envelope.
100
102
 
101
103
  ## What this machine keeps
102
104
 
103
- A **route snapshot** per remote instance under `~/.oats/remote/<server>/`,
104
- taken at spawn: the ssh host, workspace and oats path the instance was spawned
105
- through, plus the remote home. Later `retire --server` uses the snapshot, not
106
- today's registry, so editing or removing a registration never orphans a remote
107
- home; the snapshot is removed only when the remote kernel reports the home
108
- gone. Remote state is never cached: `status --server` pulls it every time and
109
- appends this machine's snapshots for that server.
110
-
111
- A registration edited to a different host or workspace (`server add
112
- --replace`) while saved routes still point at the old target is refused at
113
- the next `spawn --server` with `E_ROUTE_CHANGED`: a new snapshot under the
114
- same server id would silently retarget them. Register the new target under a
115
- new id, or retire the old instances first; the roster shows both targets
116
- until then. A saved route whose instance is gone on the host (the roster
117
- shows it `missingRemotely`) cannot be retired away: drop it on purpose with
118
- `oats server forget <id> --instance <name>`. Saved routes are keyed by name
119
- under their server id: spawning an explicit `--instance` name that already
120
- has a route there is refused (`E_ROUTE_EXISTS`), and a generated name that
121
- collides with another soul's route on the same host leaves the new instance
122
- without a saved route (`routeConflict` in the result, a warning naming the
123
- host-side retire), never overwriting the existing one. The roster gives a
124
- route to the remote row with the same name and home only; a same-named twin
125
- under another soul is observed only.
105
+ A **saved route** per remote instance, under `~/.oats/remote/<server>/`,
106
+ written at spawn: the ssh host, workspace, oats path, optional Herdr path and
107
+ PATH prefix, and the remote home. Retire, harvest and session commands use
108
+ the saved route, not the current registration, so editing or removing a
109
+ registration never orphans a remote home. The route is removed when the
110
+ remote kernel reports the home gone.
111
+
112
+ - `oats server add --replace` to a different host or workspace, while saved
113
+ routes still point at the old one, makes the next `spawn --server` fail with
114
+ `E_ROUTE_CHANGED`. Register the new target under a new id, or retire the old
115
+ instances first.
116
+ - A saved route is never pointed at a different home. A spawn whose name already
117
+ has a route under that server leaves the new instance without one
118
+ (`routeConflict` in the result, with a warning naming the host-side retire).
119
+ - A saved route whose instance is gone on the host (`missingRemotely`) cannot
120
+ be retired. Drop it with `oats server forget <id> --instance <name>`.
121
+ - `retire --server` sends the saved home as `--home`, so a same-named
122
+ instance under another soul is never the one retired.
126
123
 
127
124
  ## Limits
128
125
 
129
- - Routed: `spawn`, `retire`, `status`, `okf harvest`, and, against a 0.22.2
130
- or later server, `session inspect` (the execution host's envelope, relayed;
131
- a Desktop preflight before attaching) and `session attach`; against a
132
- server whose version probe advertises the `session-start` feature (0.22.9
133
- or later), `session start` (the execution host starts the stopped instance
134
- in its saved home; `--model` travels). Session input
135
- runs on the execution host, where the wake broker calls it. `server roster`
136
- is local (registrations and saved routes, one status pull per group). The
137
- version probe's `remote` list names this kernel's remote-side surface
138
- (`roster` and `harvest` from 0.22.3).
139
- - No Git over SSH: repository operations always run on the server, by its
140
- kernel, in its workspace.
141
- - A remote needs an OATS at least 0.22.1 (`MIN_REMOTE_VERSION`) for spawn,
142
- retire and status, 0.22.2 for the session routes, and 0.22.3 for harvest
143
- and for the exact-home retire; the record commands
144
- (`capture`, `recall`) need Node 22.5+ there for `node:sqlite`, which
145
- lifecycle routing does not.
146
- - Lifecycle actions on a remote instance need a saved route from this
147
- machine; an instance the remote reports that was spawned elsewhere shows in
148
- the roster without one (`savedRoute: false`) and is read-only here.
126
+ - Lifecycle actions need a saved route from this machine. An instance the
127
+ remote reports but that was spawned elsewhere appears in the roster with
128
+ `savedRoute: false` and is read-only here.
129
+ - No Git runs over SSH: repository operations always run on the server, by
130
+ its kernel, in its deployment.
@@ -7,13 +7,13 @@
7
7
  "required": ["schemaVersion", "name", "description", "work"],
8
8
  "additionalProperties": false,
9
9
  "properties": {
10
+ "launch": { "description": "The soul's launch preference (0.30; feature launch-preference): what the role should run on. Only harness and model: args, env, yolo and the executable stay host facts (launch configurations). A machine overrides it in oats-local.yaml souls.launch; explicit flags win over both. A committed soul gains it only when every deployment runs 0.30 (0.29 refuses the key).", "type": "object", "additionalProperties": false, "required": ["harness"], "properties": { "harness": { "enum": ["pi", "claude", "codex"], "description": "The harness the role should run on." }, "model": { "type": "string", "minLength": 1, "pattern": "^[^\\s-][^\\s]*$", "description": "A model id for that harness; absent: the harness's own model." } } },
10
11
  "schemaVersion": { "const": 2 },
11
12
  "name": { "$ref": "#/$defs/slug" },
12
13
  "description": { "type": "string" },
13
14
  "work": { "enum": ["worktree", "checkout", "directory", "workspace"] },
14
- "team": { "$ref": "#/$defs/teamLabels", "description": "Team label, or a non-empty list of distinct labels (the first is the primary); overrides the repo's default from oats-membership.yaml. Each label's messaging payload reaches the provider as an eligible team (OATS_TEAMS); joining is the provider's explicit act." },
15
15
  "private": { "type": "boolean", "deprecated": true,
16
- "description": "Ignored since 0.26.0: souls have no private mode. Every soul of a confirmed member is listed and spawnable; discovery warns soul-private-ignored. Accepted so existing files still validate; remove it." },
16
+ "description": "Tolerated and ignored: souls have no private mode. Every soul of a confirmed member is listed and spawnable; discovery warns soul-private-ignored. Accepted so existing files still validate; remove it." },
17
17
  "capabilities": {
18
18
  "type": "object",
19
19
  "propertyNames": { "$ref": "#/$defs/capabilityName" },
@@ -31,13 +31,6 @@
31
31
  },
32
32
  "$defs": {
33
33
  "slug": { "type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$" },
34
- "label": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$" },
35
- "teamLabels": {
36
- "anyOf": [
37
- { "$ref": "#/$defs/label" },
38
- { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/label" } }
39
- ]
40
- },
41
34
  "capabilityName": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$" },
42
35
  "repoKey": { "type": "string", "pattern": "^[^\\s@/][^\\s@]*/[^\\s@]+$" },
43
36
  "fromLocation": {