@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
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": {