@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
@@ -1,65 +0,0 @@
1
- # Phase 4 — implementing workspace model v2: proposal for the human
2
-
3
- **Date:** 2026-09-23 · **Status:** PROPOSED — nothing lands before the human approves this plan.
4
- **Decision:** `agents/oats-expert/soul/knowledge/decisions/workspace-model-v2.md` · **Worked example:** [2026-09-23-simplified-workspace-model.md](2026-09-23-simplified-workspace-model.md)
5
-
6
- ## What we are building, in one paragraph
7
-
8
- A clean v2 of the kernel's declaration, resolution and launch path: read `oats-workspace.yaml` v2 / `oats-membership.yaml` / `soul.yaml` v2 / `oats-local.yaml` over Git remotes; confirm membership; resolve every capability by `from:`; fetch packages at the locked version with per-version approval in lock v3; copy each capability whole into the instance (`.oats/modules/` + `.agents/skills/`); compose `AGENTS.md`; launch the harness normally. Remove the installed-capability tier, the classic activation config and the v1 declaration readers. No migration. The framework's own repos become the first real v2 workspace and the Desktop follows through new DTOs under new feature names.
9
-
10
- ## Where the current code is
11
-
12
- `lib/` is 82 modules / 21 k lines; `core.mjs` alone is 9.2 k. The v1 declaration/portable path is spread over ~20 modules (`workspace-definition`, `workspace-discovery`, `source-spec`, `portable-*`, `capability-provenance`, `prepared-resources`, `resolution-shape`, `captured-*`, `packages` 1.4 k). Much of that machinery exists to carry per-soul versioned sources, migration evidence and the installed tier — the things v2 removes. The lifecycle core (spawn/retire/session/events/schedule, the Desktop DTOs, `binding` validation, the lock) stays.
13
-
14
- **Approach (human, 2026-09-23): the new modules ARE the kernel — no `lib/v2/`, no seam, no flag.** Each phase replaces canonical code on main and deletes what it supersedes; tests are updated to the new truth in the same phase. Desktop contracts that change do so under new feature names; the Desktop follows in W12.
15
-
16
- ## Work packages
17
-
18
- Each is one PR (or two small ones), reviewed by me, on `main`, as canonical code from the first phase (no seam — see the approach above). Order is dependency order; W1–W3 can proceed in parallel lanes. **Status (2026-09-23): W1–W8 and W10 shipped in OATS 0.25.0 (PR99 `59ae22df`); W8's last part — folding the classic no-`oats-local.yaml` spawn path into the one pipeline and deleting the v1 residue — is a follow-up; W9/W9b/W11/W12 are Phases D–F.**
19
-
20
- | # | Package | Delivers | Owner | Size |
21
- |---|---|---|---|---|
22
- | **W1** | **Schemas + fixtures** | `oats-workspace.schema.json` v2, `oats-membership.schema.json`, `soul.schema.json` v2, `oats-local.schema.json`, lock v3; the Northwind example as a **test fixture workspace** (three teams, five repos as bare local remotes) used by every later package | lead | S |
23
- | **W2** | **Remote observation** | `lib/remote.mjs`: fetch a file or a tree from a Git remote at default-branch or exact commit, in the operator's access context (git credential helper / `gh` token), with typed `cannot read <url>`; bounded; a content-addressed **fetch cache** under the OS cache dir (invisible plumbing) | lead | M |
24
- | **W3** | **Membership + discovery** | `lib/workspace.mjs`: read the workspace file; for each member read `oats-membership.yaml`; confirm both halves in one access context (`E_MEMBERSHIP_UNCONFIRMED` naming the missing/unreadable half); enumerate `souls/*/soul.yaml` and `capabilities/*/oats.json`; apply `private`; team labels (`E_TEAM_UNKNOWN`); standalone case | lead | M |
25
- | **W4** | **Resolution** | `lib/resolve.mjs`: workspace defaults ⊕ `defaults.byTeam` ⊕ soul (`off` removes) → for each `(name, from)`: member lookup or package lookup; slot filling from `layer:` (`E_SLOT_CONFLICT`); produces an immutable **resolution** (the input to preview/apply — reuses `decision.revision`) | lead | M |
26
- | **W5** | **Packages v2 + lock v3** | `lib/packages.mjs` (rewritten in place): `packages:` → catalog/git ref → commit; integrity; **approval per version** stored in `oats-lock.json` v3 (`approved.executables` digest); `oats package add|remove`; a moved tag fails integrity and re-asks; **delete** `oats install/restore/use/init` and the installed tier | lead | M |
27
- | **W6** | **Materialization + launch** | `lib/materialize.mjs`: copy each resolved capability whole into `<instance>/.oats/modules/<cap>/`; copy `skills/` into `<instance>/.agents/skills/<cap>/`; compose `AGENTS.md` (soul + injects); record `modules{}` and **`providers{}` (from `spawn --provider <cap> k=v`, the instance-level payload home; merged with soul + `oats-local.yaml` settings before `binding`)** in `instance.json`; keep `CLAUDE.md`/`.claude/skills` aliases; **launch the harness normally** (drop the ambient-skill exclusion; keep model/profile pinning) | lead | M |
28
- | **W7** | **CLI switch-over** | `oats sync`, `oats spawn` (preview/apply unchanged in shape, now fed by W4/W6), `oats capabilities` / `oats souls` with origin + team, `oats workspace status`; `oats status` shows `modules … @ commit` + `member moved since`; `oats version --json` advertises `workspaceApi: 2` + feature `workspace-v2`; **remove the v1 readers** (`oats.yaml`, per-soul `source:`, `oats-config.yaml` activation) — a v1 file at a v2 path errors naming the schema | lead | M |
29
- | **W8** | **Delete v1** | Remove `portable-*`, `source-spec`, `capability-provenance` (v1 parts), `prepared-resources`, migration stores/evidence, the installed tier in `packages.mjs`, classic config activation, their tests and docs; `core.mjs` loses everything that only served v1 | lead | L (mostly deletion) |
30
- | **W9** | **Framework repos as the first workspace (decisions 18–21)** | `oats-workspace.yaml` v2 in `oats` (drop the six imports; `packages:` pins oats.framework/okf/aweb/jira/linear/authoring/dev **as packages**; `teams:` global/engineering; `defaults`); `oats-membership.yaml` in ALL seven repos; the six soul editions rewritten (`oats.okf: {from: package}` etc. even though the repos are members); **a new expert soul in every package repo** — `okf-expert`, `aweb-expert`, `jira-expert`, `linear-expert`, `authoring-expert`, `dev-expert` (v2 `souls/<name>/`, team global, knows and evolves that capability); `package-catalog.json` kept as the official marketplace (bare-version `packages:` entries resolve through it) | lead (member-repo PRs to their owners; the expert souls' AGENTS.md drafted by me, reviewed by the package owner) | L |
31
- | **W9b** | **`oats.core` and `oats.setup` rewritten for the new architecture (human, 2026-09-23)** | The two official capabilities' skills and injects are rewritten to teach the *new* model, not patched: **`oats.core`** (`oats-operate`, `oats-souls`, the "you run on OATS" inject) — how an agent works inside an instance under this architecture: its home layout (`.oats/modules/`, `.agents/skills/`, `instance.json` modules/providers), the verbs it will actually use (`status`, `spawn --preview/--provider`, `retire`, `session`, `instance events`, `capabilities`, `souls`, `workspace status`), what a workspace/member/package/team is *from the agent's seat*, drift ("member moved since"), how to find and read other souls. **`oats.setup`** (`oats-config`/`oats-packages` → renamed to what they now are: `oats-workspace`, `oats-packages`, `oats-onboarding`) — the whole architecture and its best practices: workspace ↔ repo handshake and why, `oats-workspace.yaml` / `oats-membership.yaml` / `soul.yaml` v2 / `oats-local.yaml` field by field, teams as labels, member-tier vs package-tier and the non-collapse rule, `packages:` + lock v3 + per-version approval, the official catalog vs `git:` refs, `sync`/`package add`, the deployment directory (the operator's; no naming convention) and clone-then-spawn, private items, external souls, the standalone case, provider payload homes (soul/machine/spawn), what is deliberately NOT versioned and why. Every skill is validated against the shipped CLI (`oats <verb> --help` snapshot test) so they cannot drift from the commands. | lead (swarm + review) | M |
32
- | **W10** | **Docs** | **the rebuild guide (removed in 0.26.0; ships with the schemas; states that 0.24.x keeps spawning 0.24.x deployments)**; `docs/workspaces.md` rewritten around v2; `souls-and-instances.md`, `packages.md`, `configuration.md` (mostly deleted), `first-team.md` → the operator's deployment directory; DTO doc § Workspace v2; release notes | lead | M |
33
- | **W11** | **Onboarding skill** | `oats-setup-expert` / `oats.setup`: ASK for the deployment directory (an existing folder with the operator's clones is the usual case — no named convention, decision 9), `oats sync`, clone-then-spawn; **the hosting rule for mixed public/private organisations (decision 26): ask up front whether any member is private; if so the workspace file is hosted in a private repo that is NOT a public member (a dedicated private `workspace` repo is the honest shape), public contributors get the standalone case with `oats.core` by default (decision 25); `oats onboard` prints the same rule in its next-steps**; the `oats-operate` skill updated for the new verbs | lead | S |
34
- | **W12** | **Desktop follow-through** | New kernel DTOs (from W7) consumed the usual way — engineer reads the merged head, files pins, wires: Capabilities/Souls origin + team columns; "installed" removed as a state; spawn preview shows modules (from/commit/hash) + team; Workspaces surface shows membership status | Desktop engineer, after W7 | M |
35
-
36
- **Team review (Antares, 2026-09-23) folded in:** rebuild guide (W10), **second review (two aweb teams, stores, soul layout, standalone, public/private hosting → decisions 23–26: `messaging.byTeam`, stores = repo + provider `root`, `souls/` only, `oats.core` standalone default, private host rule taught by onboarding),** `--provider` instance payload (W6/W7), drift display (W7), duplicate-name rule (W6), 0.24.x-keeps-working stated everywhere.
37
-
38
- **Not in scope:** K11 (member admission UI/"Join"), K12 (transcript verb), 10B editor/detach — they wait behind this.
39
-
40
- ## How phases land
41
-
42
- Each phase = one developer-swarm workflow (parallel agents, disjoint files, against a written module contract) → one adversarial-review workflow (independent reviewers with different lenses) → fixes → my four-gate review → merge to main. No compatibility flag: when a phase lands, its modules are the kernel and the v1 code they replace is deleted in the same PR, with tests rewritten. Between phases main is always green and always the canonical state.
43
-
44
- ## Releases
45
-
46
- - **0.24.14** — 10A + 10B-0 (already planned; nothing v2). Ships first, independent.
47
- - **0.25.0** — W1–W8: the new model is the kernel, v1 deleted as each phase landed; `workspaceApi: 2`. Breaking by design (no migration).
48
- - **0.26.0** — W9 live (framework repos on v2), W11 onboarding, W12 Desktop.
49
-
50
- ## Risks and how the plan handles them
51
-
52
- | Risk | Mitigation |
53
- |---|---|
54
- | Remote access context is subtle (SSH vs HTTPS vs `gh` token; private repos) | W2 uses git itself (`git ls-remote`, `git archive`/shallow fetch) with the operator's configured credential helpers — no new credential store; typed `cannot read` never guesses |
55
- | `core.mjs` entanglement makes W8 risky | W8 is deletion behind a green W7; `rg` proof of zero importers per module before each deletion (the v1-residue table from the Phase C review); CI + the Northwind fixture + Desktop suites are the gate |
56
- | Package approval UX ("asks once") in non-interactive spawns | `oats sync` is where approval is asked; `spawn` refuses `E_PACKAGE_UNAPPROVED` pointing at `sync` — never prompts mid-spawn |
57
- | Latest-state members drift between preview and apply | The resolution records the member commit; apply re-observes and refuses `E_DECISION_STALE` if it moved — same mechanism as today's decision revision |
58
- | Desktop relying on "installed" | Removed as a state in W12; until then the Capabilities view keeps working on 0.24.x DTOs (contracts unchanged) |
59
-
60
- ## What I need from you
61
-
62
- 1. **Approve the plan shape** (parallel v2 beside v1, one switch-over release, then delete) or tell me you want in-place.
63
- 2. **Confirm I implement the kernel packages W1–W11 myself**, with the Desktop engineer on W12 after W7 — or whether Juan's side should take lanes (W2 remote observation and W5 packages are the most separable).
64
- 3. **0.25.0 as the breaking release number** — fine?
65
- 4. Anything in W9 you want different for the framework repos (team labels for the six souls: I'd put the five experts under `global`, `oats-setup-expert` under `global`, and any dev capabilities in `oats-dev` under `engineering`).
@@ -1,242 +0,0 @@
1
- # Desktop Phase F — the Desktop is built FOR workspace model v2
2
-
3
- > **Vocabulary (2026-09-26):** there is no "personal team". Read it below as **the workspace's default team**. See the AMENDMENT at the top of [the teams contract](2026-09-25-teams-contract.md). This document is a record and keeps its original wording.
4
-
5
- **Status**: boundary for the Desktop engineer, issued 2026-09-24 by the lead under
6
- the human's direction: *"the desktop should not just adapt to the new version,
7
- it should be natively built for it."* Supersedes the Phase 3 parity plan's
8
- assumptions about what the Desktop reads; keeps its visual deliverable (the
9
- redesign frames, excl. 05/06).
10
-
11
- **Human's second directive, verbatim intent**: make ultra sure the Desktop is set
12
- up to work in the new setup — new versions, new CLI, new deployment shape.
13
-
14
- ## 0. Why this is a rebuild of the model, not a patch
15
-
16
- The Desktop today is a 0.24 product that *tolerates* 0.25 kernels: its
17
- `ACCEPT_RANGE` admits `0.25.x`, so it launches, and the few CLI verbs it drives
18
- (`version`, `session *`, `spawn`, `retire`, `schedule`, `catalog`) still answer.
19
- But its **model of a deployment is 0.24's**, reimplemented in
20
- `packages/desktop/server/deployment.mjs`: it reads `oats-config.yaml`,
21
- `agents/<name>/soul`, `local-agents/`, and capability manifests from
22
- `.agents/capabilities/installed/`, and derives the roster itself. None of these
23
- is how a v2 deployment is shaped:
24
-
25
- | 0.24 (what the Desktop reads) | v2 (what a deployment IS) |
26
- |---|---|
27
- | `oats-config.yaml` at the repo root | `oats-local.yaml` at the deployment directory → `workspace:` URL |
28
- | souls at `agents/<name>/soul` | souls at `souls/<name>` **in member repos**, materialised per commit into `agents/<name>/souls/<commit>` |
29
- | capabilities installed into `.agents/capabilities/installed/` | packages resolved through `oats-workspace.yaml` + the official catalog, locked in `oats-lock.json`, **copied whole into each instance home** (`.oats/modules/<cap>`) |
30
- | `team:` block | `oats-membership.yaml` `team:` label per member; `messaging.byTeam.<label>` payloads |
31
- | `oats catalog` DTO | removed; the catalog is `package-catalog.json` resolved by `oats sync` |
32
- | roster derived by the Desktop | `oats status --json` is the roster (agents, instances, `modules[]` drift, `soul` source drift, `identity`) |
33
-
34
- A Desktop that keeps the left column and adds a few right-column fields is the
35
- "adapt" outcome the human rejected. Phase F replaces the left column.
36
-
37
- ## 1. The principle: the kernel is the model; the Desktop renders and drives it
38
-
39
- - **Read model**: every fact the Desktop shows about a deployment comes from
40
- the kernel's JSON surfaces — `oats status --json`, `oats inspect --json`,
41
- `oats workspace status --json`, `oats spawn --preview --json`, `oats
42
- readiness --json`, `oats version --json`, `oats sync --json`. The Desktop
43
- does not parse `oats-config.yaml`, `oats-local.yaml`, `soul.yaml`,
44
- manifests or lock files itself. Where a fact is missing from a kernel
45
- surface, the fix is a kernel PR (lead's lane), not a Desktop-side parser.
46
- - **Write model**: every mutation is a kernel verb with `--json`: `sync`,
47
- `sync --approve`, `spawn` (preview → `--expect-decision` apply), `retire`,
48
- `session start|restart|recompose`, `schedule *`, `onboard`. The Desktop
49
- never writes a deployment file.
50
- - **Version contract**: `oats version --json` `features[]` is the capability
51
- probe. The Desktop's `ACCEPT_RANGE` moves to `>=0.25.6 <0.27.0` (the first
52
- kernel with `served-identity`), and each feature the UI depends on is gated
53
- on its `features[]` name, not on a version number.
54
-
55
- ## 2. Deliverables (slices; each is one PR against main, each reviewed by the lead)
56
-
57
- **F1 — Deployment model on kernel JSON.** Replace
58
- `server/deployment.mjs`'s own readers with `oats status --json` (+ `oats
59
- workspace status --json` for the workspace header: name, key, members, packages,
60
- lock state, `approvalNeeded`). Roster rows carry `modules[]` drift, `soul`
61
- source (`repo: <member> @ <c7>`, "member moved since"), `identity`. Legacy
62
- `local-agents/`/`tmp-agents/` paths are dropped. Remove `server/catalog.mjs`'s
63
- `oats catalog` DTO validation (the verb no longer exists).
64
-
65
- **F2 — Workspace onboarding and sync.** A "Open deployment" flow that: detects a
66
- directory with `oats-local.yaml` (v2), or offers `oats onboard` for one without
67
- (the kernel asks for the deployment directory and the workspace URL — the
68
- Desktop collects both, never invents a folder name; decision 9). A "Sync"
69
- action runs `oats sync --json`; exit 2 with `approvalNeeded[]` renders an
70
- approval sheet showing each package's `executables` digest and applies with
71
- `oats sync --approve <id>@<version>` (the version string is what
72
- `approvalNeeded[].version` reports — for a git-pinned package, the full OID).
73
- Lock drift and `E_PACKAGE_INTEGRITY` are surfaced verbatim.
74
-
75
- **F3 — Spawn dialog on the v2 preview.** The preview already carries
76
- `modules`, `providers`, `settings.<cap>`, `team`, `resolution`, `decision`.
77
- Render: which modules the instance will get and from where (package vs member,
78
- commit); the merged `settings.<cap>` per provider (read-only); **Identity**
79
- select (local | global) with a Resident field for global, prefilled from
80
- `settings.<messaging cap>.identity`, forwarded as `--provider <cap>
81
- identity.mode=… identity.resident=…` (decision 27 — there is no kernel flag);
82
- `decision.effective.providers` is what the confirm binds. `cli-adapter.mjs`
83
- `SPAWN_ARG_RULES` gains one `provider` rule (capability id, dotted key, value
84
- grammar); no identity-named rules. Work mode select includes `workspace`.
85
-
86
- **F3 amended by the human (2026-09-24). This supersedes design frame 02 and the
87
- text above wherever they differ.** The dialog leads with the **instance name**:
88
- the purpose field becomes a name field that shows `<soul>-<purpose>` live and
89
- then the kernel's final name from the preview. A no-prefix toggle maps to
90
- `spawn --name <slug>`, gated on the `spawn-name` feature; `--purpose` stays the
91
- default. **Runtime and model** are always visible, with their resolved value and
92
- its source. **Relationship** sits in the main form, shown by default: None /
93
- Child of / Sibling of / Parent of. There is **no** modules/capabilities list and
94
- no attach-knowledge / child-spawn / open-PR toggles, because those behaviours
95
- come from capabilities. There is **no** preview button either. The preview runs
96
- in the background to fill the real defaults, and apply still binds with
97
- `--expect-decision` (`E_DECISION_STALE` re-previews). A collapsed section named
98
- **Developer settings** holds:
99
- - **work**: base | branch and the worktree path. A `checkout` soul is offered
100
- "Use a worktree instead?" (`--work worktree`); the work mode itself comes
101
- from the soul's `work:`.
102
- - harness permissions
103
- - launch config
104
- - session backend
105
- - Run on (the execution server)
106
- - wake-up
107
- - messaging identity (`--provider <cap> identity.mode=…`, decision 27)
108
-
109
- (Second human redirect, same day: relationship moved into the main form, work
110
- moved into the collapsed section, and the section was renamed from "Advanced".)
111
- Every modal gets a darker backdrop.
112
-
113
- **F4 — Instance card and roster on v2 facts.** The served-identity line (`acts
114
- as <address> via grant, expires <t>` / `alias <a> on <team>`); module rows with
115
- "moved since" markers and a **re-spawn** action (preview → apply, then retire
116
- the old instance — module homes answer `E_UNSUPPORTED_MODE` to
117
- `session recompose` by design; an instance never changes under itself); the
118
- soul-source row; quarantine state from `rollbackIncomplete` with the retry
119
- action (`oats retire`) and `--force` behind a confirm.
120
-
121
- **F5 — Redesign frames** (the original Phase 3 deliverable, excl. 05/06),
122
- implemented on top of F1–F4 rather than on the 0.24 model.
123
-
124
- **F7 — Side panels redesigned, teams everywhere (human, 2026-09-25). This
125
- supersedes the frames and the text above wherever they differ.** One Desktop PR:
126
- - **Side panels** in the spawn modal's design language (frame 01a):
127
- - an identity header and compact cards;
128
- - only useful facts (no "Not reported" rows), and empty sections hidden;
129
- - relative dates, and shortened paths with Copy;
130
- - errors as one plain sentence, with the code behind Details;
131
- - discoverable cross-links between an instance and its soul.
132
- - **Terminal-side context panel tabs, in order:** Instance · Soul · Git & GitHub.
133
- - **Teams, per surface** (teams contract `docs/design/2026-09-25-teams-contract.md`):
134
- - **Soul** (Workspace inspector): the soul's labels, primary marked, each
135
- joinable or "not mapped by this workspace". Read-only, from
136
- `inspect --soul` `teams`.
137
- - **Instance** (Workspace inspector and the terminal-side Instance tab): the
138
- live panel (#178). Personal is always on; joined teams have Leave, and
139
- joinable ones have Join.
140
- - **Spawn modal, main form** (not Developer settings), a Teams row:
141
- - "Personal team — always", fixed;
142
- - each joinable label as an unchecked checkbox, sent as
143
- `--provider <messaging> join=<a,b>`;
144
- - unmapped labels greyed with the reason;
145
- - the line "By default it's only in your personal team. Tick the teams it
146
- should also join."
147
-
148
- The row is shown iff the preview carries `teams` AND the messaging
149
- module's preview row lists `join` in `declares` (feature
150
- `settings-declared`; the Desktop gates on declared facts, never on
151
- versions).
152
- - **Second human redirect (QA, same day):** unmapped labels are not shown
153
- anywhere (no greyed rows, no "not mapped" text), and Teams in the spawn
154
- modal is one row styled like Relationship.
155
-
156
- **F6 — Version and doctor surface.** `oats version --json` and `oats doctor
157
- --json` in an About/Health pane; `ACCEPT_RANGE` and the three pins move to
158
- `>=0.25.6`; a kernel below the floor is refused with the upgrade command shown.
159
-
160
- Order: F1 → F2 → F3 → F4 → F5 → F6, or F1 then F3/F4 in parallel if the engineer
161
- spawns children (its call; the lead reviews each PR).
162
-
163
- ## 3. What the engineer must LEARN first (before F1)
164
-
165
- Read, in this order, in the checked-out main:
166
- 1. `docs/workspaces.md` — the v2 model end to end (deployment vs workspace,
167
- members, packages, payloads, `byTeam`, hosting).
168
- 2. the 0.25 rebuild guide (removed in 0.26.0; `docs/configuration.md` and
169
- `oats onboard` now) — how an operator builds a deployment (this is the
170
- flow F2 wraps).
171
- 3. `docs/desktop-cli-api.md` — every JSON surface, with examples; note
172
- `features[]`, `decision.effective.providers`, `instances[].identity`.
173
- 4. `docs/design/2026-09-23-workspace-module-contracts.md` §0.25.x — what
174
- changed per release and why.
175
- 5. `agents/oats-expert/soul/knowledge/decisions/workspace-model-v2.md` and
176
- `…/served-identity-is-a-messaging-layer-fact.md` — the decisions.
177
- 6. `test/fixtures/northwind/build.mjs` — the two-team fixture workspace; run
178
- `node --test test/spawn-workspace.test.mjs` once and read what a v2 spawn
179
- produces on disk (`.oats/modules/`, `instance.json` `modules`/`providers`/
180
- `workspace.soul.id`).
181
-
182
- Then build a scratch deployment by hand with the CLI (`oats onboard`, `oats
183
- sync`, `oats sync --approve`, `oats spawn --preview`, `oats spawn --no-launch`,
184
- `oats status`, `oats inspect`, `oats retire`) against the Northwind fixture
185
- remotes, and keep the transcript: F1's tests are written against exactly those
186
- JSON shapes.
187
-
188
- ## 3b. Native rework, not a compatibility layer (human, 2026-09-24)
189
-
190
- The human's rule, verbatim intent: *"do a native rework — do not keep v1-specific
191
- things, and no v1 modules calling v2 modules."* Concretely:
192
-
193
- - **Remove, do not wrap.** A 0.24 reader (`server/deployment.mjs`'s
194
- `oats-config.yaml`/`soul.yaml`/manifest parsing, `local-agents/`,
195
- `.agents/capabilities/installed/`, the `oats catalog` DTO) is deleted in the
196
- slice that replaces it — never kept behind a flag, a fallback branch, or an
197
- "if the kernel is old" path. The Desktop supports one kernel line
198
- (`ACCEPT_RANGE` from 0.25.6) and refuses older ones with the upgrade command.
199
- - **No adapters between generations.** No module whose job is to translate a
200
- v1-shaped object into a v2-shaped one or vice versa (no `legacyRosterToV2()`,
201
- no `toOldCard()`); the v2 kernel JSON is consumed where it is read and shaped
202
- once for rendering. If a v1 module still needs a v2 fact, the v1 module is
203
- the thing being replaced — replace it, do not feed it.
204
- - **Names and types follow v2.** Types, fields and UI labels use the kernel's
205
- vocabulary (workspace, member, package, module, deployment, soul source,
206
- served identity); 0.24 vocabulary (installed capability, config chain, team
207
- block, agents root as identity) leaves the codebase with the code that used
208
- it. `git grep` for the old terms is part of each slice's exit check.
209
- - **Tests follow the same rule.** Fixtures shaped like 0.24 deployments are
210
- deleted with the readers; new fixtures are v2 deployments produced by the
211
- kernel (Northwind or a hand-built scratch deployment), not hand-written
212
- JSON imitating old shapes.
213
- - **One exception, stated per case.** Where a 0.24 concept has a genuine v2
214
- successor with the same meaning and the Desktop code is already correct for
215
- it (a terminal broker, a tmux target admission), it stays — the PR names it
216
- as "unchanged, v2-agnostic", not as "kept for compatibility".
217
-
218
- Exit check for Phase F as a whole: no file under `packages/desktop/` reads a
219
- deployment file, names a 0.24 concept, or contains a code path that exists
220
- only for a kernel below the floor.
221
-
222
- ## 4. Rules that do not change
223
-
224
- - `packages/desktop/**` only; kernel gaps go to the lead as a written ask
225
- (they become kernel PRs; the engineer never adds a Desktop-side parser to
226
- work around one).
227
- - No native tmux/PTY/Electron execution by the agent; the lead's native gate
228
- at review time is the acceptance.
229
- - Every slice: focused tests + the intended mutants on the new code; the
230
- Desktop suite green; one PR per slice against main; lead's pr-review.
231
- - The design frames are the visual authority; the kernel JSON is the data
232
- authority; where a frame shows a 0.24 concept (an "installed capability"
233
- list, a `team:` block), the frame is adapted to the v2 concept and the
234
- adaptation noted in the PR.
235
-
236
- ## 5. Acceptance for Phase F as a whole
237
-
238
- The lead builds a fresh v2 deployment from the Northwind fixture using ONLY the
239
- Desktop (open → onboard → sync → approve → spawn with a global identity →
240
- inspect → retire) on kernel 0.25.6+, and every fact shown matches `oats status
241
- --json` / `oats inspect --json` byte for byte. Nothing in
242
- `packages/desktop/server` reads a deployment file.
@@ -1,305 +0,0 @@
1
- # Phase D — the OATS project runs on the architecture it offers (plan)
2
-
3
- > **Vocabulary (2026-09-26):** there is no "personal team". Read it below as **the workspace's default team**. See the AMENDMENT at the top of [the teams contract](2026-09-25-teams-contract.md). This document is a record and keeps its original wording.
4
-
5
- **Status**: plan, 2026-09-24, lead. Decisions 18–22 of the workspace model, the
6
- five-soul roster and its 2026-09-24 amendment, the human's sequencing
7
- ("knowledge centralisation first"; "do not retire live souls until their
8
- instances retire"). Mailed to the human and the OSS coordinator before the
9
- first swarm. Method per standing instruction: write → swarm build →
10
- adversarial-review swarm → PR → main; releases under delegated authority.
11
-
12
- ## Co-leads and lanes (human, 2026-09-24)
13
-
14
- The human made the two `oats-expert` instances — the redesign lead
15
- (`oats-expert-knowledge-reworks`) and the maintainer of the second deployment
16
- (`oats-expert-antares`) — **co-leads with equivalent authority**, who agree on
17
- pushes. Agreed by both on 2026-09-24:
18
-
19
- | Lane | Owner | Status |
20
- |---|---|---|
21
- | Desktop Phase F (engineer PRs, native gates) | lead | assigned |
22
- | Kernel (`lib/`, `bin/`; kernel gaps raised by anyone) | lead | assigned |
23
- | Releases 0.25.7 and D5 (catalog + 0.26.0) | lead | assigned |
24
- | oats.aweb 1.13.0 re-land end to end | Antares | assigned |
25
- | D1 operator node + integrations node | Antares | assigned (draft PR `d1/operator-node` handed over) |
26
- | aweb and okf package-expert seams | Antares | assigned |
27
- | D2, D3, D4, desktop + kernel bundle migrations (D1 remainder) | lead, driven by the child instance `oats-expert-phase-d` | assigned (human, 2026-09-24: picked up by the lead's side after all, so as not to wait on the other deployment's human). The lead reviews and merges; Class B items go to Antares for ACK; D3's aweb/okf seams are drafted by the driver and settled with Antares. **Antares is a REQUIRED cross-reviewer** on D4's `oats.setup` rewrite (it must not drift from the operator node) and on D3's `aweb-expert` and `okf-expert` souls (the seams); the rest of the driver's PRs it reads without gating. |
28
-
29
- **Push protocol.**
30
- - **Class A** — notify after, one line: stewardship, docs and knowledge inside
31
- one's own lane or node; merging a PR the other co-lead approved in writing;
32
- merging one's own lane's PR after the other co-lead's review; the bump PR of
33
- an agreed release.
34
- - **Class B** — `PUSH INTENT: <what> @ <commit/PR>` → `ACK <message-id>` before
35
- acting: tags, releases, npm publishes, catalog pins; framework-behaviour
36
- changes (kernel semantics, OKF/memory contracts, workspace config semantics,
37
- published skills); merges into the other's lane; reverts, force-anything,
38
- branch or tag deletion. A blocking intent unanswered for about 45 minutes goes
39
- to the human, never to action.
40
- - **Amendment (the human, 2026-09-26 ~14:00Z): "do the merge then fix if something broke".**
41
- - A PR the lead has reviewed and approved is **merged immediately** by the lead (`gh pr merge --squash --match-head-commit <approved oid>`), without waiting for PR CI. CI runs on main after the merge.
42
- - A red main is fixed forward at once, by the author or the lead, before anything else merges.
43
- - **Tags still wait for main CI green on their exact SHA** (a tag never moves).
44
- - Developers run only the affected suites locally (the nested globs included). The full glob and `smoke:tarball` run in CI, sharded ×6.
45
- - The watcher no longer relays merges.
46
- - **Amendment (the human, 2026-09-26 ~13:10Z): "lets approve and tag ourselves all of these PRs".**
47
- - With the co-lead unresponsive since ~10:30Z, the lead's review + green CI is the full Class B gate, in BOTH lanes: merges, okf/aweb tags, catalog pins, releases.
48
- - Every such act is logged, with its head/tag oid, in a running account mailed to the co-lead for after-the-fact review.
49
- - The co-lead's objections then go to the human, and a revert follows only on the human's word.
50
- - This ends when the co-lead resumes and the lead records that here.
51
- - Every PR is reviewed by the co-lead who did not author it (a helper's PR is
52
- reviewed by its own lead, inside that lead's lane). A disagreement not settled
53
- in two mails goes to the human. Standing rules unchanged: PR CI is the full
54
- gate; published tags never move; no destructive git on shared checkouts.
55
- - `main` on these repositories carries no branch or tag protection: the parity
56
- gate and the cross-review are the only things between a merge and `main`.
57
-
58
- ## Human decision (2026-09-24): no package approval
59
-
60
- **Package approval is removed from the kernel and from the Desktop.** People
61
- install a package only when they trust it. Declaring it in the workspace's
62
- `packages:` IS the trust decision, so there's no second, per-version approval
63
- step. This supersedes the "executables approved once per version" rule in
64
- `docs/workspaces.md` (§ Packages, lock, approval, catalog) and everything built
65
- on it:
66
- - `oats sync` exit 2 for pending approvals and `approvalNeeded`
67
- - `--approve <id>@<version>` and the interactive prompt
68
- - the lock's `approved` record
69
- - `E_PACKAGE_UNAPPROVED` at spawn and dispatch
70
- - the Desktop F2 approval flow (`E_APPROVAL_STALE`)
71
- - the planned pinned `--approve …=<digest>`
72
-
73
- What stays: the lock still pins each package to the exact commit and integrity,
74
- and restore still refuses drift (`E_PACKAGE_INTEGRITY`). Reproducibility is not
75
- approval. It's a breaking contract change, so it ships in a minor release, and
76
- the Desktop requires that kernel.
77
-
78
- ## Slices, in order
79
-
80
- ### D1 — Knowledge centralisation (IN PROGRESS)
81
-
82
- Goal: every roster soul's knowledge lives in the central base
83
- `awebai/oats-knowledge` (OKF 2.1.4), one owned node each; the in-repo
84
- `agents/*/soul/knowledge` bundles stop receiving writes and are decommissioned
85
- when no live instance links them.
86
-
87
- Done: nodes `oats-operator-expert` and `integrations-expert` chartered
88
- (oats-knowledge PR #3); eight attributed seeds landed in
89
- `agents/oats-expert/soul/knowledge/inbox` (oats PR #121); the roster amendment
90
- accepted; the rule "no per-soul knowledge merges" in force.
91
-
92
- Work:
93
- 1. **Copy-migrate by judgement** (the 2026-09-21 method: two-part test plus the
94
- 2026-09-24 recipe refinement; not copying): `agents/oats-expert/soul/knowledge`
95
- (~130 files) → node `oats-expert`; `agents/oats-desktop-engineer/soul/knowledge`
96
- (~120) → `oats-desktop-expert`; `agents/cli-dev/soul/knowledge` (~155) →
97
- `oats-kernel-expert`; `agents/integrations-expert/soul/knowledge` (13) →
98
- `integrations-expert`. Others (`dev-coordinator`, `docs-expert`, `ux-designer`,
99
- `lead`, `oats-coordinator`) are assessed for the few universal concepts they
100
- hold and otherwise not carried. One PR per node on oats-knowledge, reviewed
101
- by the lead; the OSS coordinator reviews the operator and integrations PRs.
102
- 2. **Seed the operator node** — attributed to `oats-expert-antares`:
103
- MOVE (not copy) from the oats-expert bundle: `lessons/the-aweb-team-root-must-sit-where-the-spawn-hook-looks`,
104
- `lessons/okf-state-directory-must-sit-outside-every-work-tree`,
105
- `lessons/capability-trust-hash-covers-the-installation-record`,
106
- `lessons/a-locally-minted-oats-identity-has-no-cross-team-first-contact-address`,
107
- `lessons/stale-checkout-serves-stale-soul`,
108
- `playbooks/rebuild-a-deployment-in-scratch-against-local-bare-remotes`;
109
- generalise the R1–R10 rebuild findings and the published-combination
110
- verifications from `stewardship/delivery-log` (the log keeps the record).
111
- From the inbox: `check-the-record-before-redesigning-identity`,
112
- `grant-custody-service-and-renewal-belong-on-the-custody-host` (operator
113
- half), `the-wake-broker-accepts-a-grant-home`.
114
- 3. **Seed the integrations node** — from the inbox:
115
- `a-merged-provider-payload-cannot-enforce-host-only-keys`,
116
- `aw-grant-commands-resolve-the-identity-from-cwd-only` (discipline half),
117
- `oats-runtime-requirements-for-grant-backed-resident-operation`; from the
118
- integrations-expert bundle: `fake-aw-must-model-real-refusals` and the rest
119
- of this week's harvested lessons.
120
- 4. **Route the remainder of the inbox**: aweb package expert (D3) gets
121
- `aweb-grants-are-team-bound-to-the-custody-identitys-active-team`,
122
- `a-grant-signed-send-must-name-the-subject-as-sender` and the aw halves;
123
- kernel expert gets `path-keyed-owner-registry-breaks-under-per-commit-soul-copies`.
124
- 5. **Rebind the souls** in `souls/<name>/`: the `knowledge:` grammar there is
125
- still 0.24's (`capability` + `source: git:…@v2.1.2#oats-package`); v2 is
126
- `capabilities: { oats.okf: { from: package } }` plus `okf.json`
127
- (`{ version: 1, owner: <node owner uuid>, owns: ["oats/<node>"], reads: [...] }`)
128
- and the store `oats` naming `awebai/oats-knowledge` / `knowledge` / `main`.
129
- Add `souls/oats-operator-expert` (rename of `oats-setup-expert`, keeps the
130
- `oats.setup` charter) and `souls/integrations-expert`.
131
- 6. **Do NOT delete** `agents/<n>/soul/knowledge` or the legacy souls while a
132
- live instance links them (human rule). Record which are live; decommission
133
- as they retire; new spawns use `souls/<n>`.
134
- 7. **Release playbook** (`oats-expert` node, stewardship area): landing order
135
- for provider PRs (tag → pin on the branch → squash; a bundled provider never
136
- lands ahead of its tag), the version literals to bump on a catalog bump,
137
- the mirror checker, the bump-PR step. First entries: today's two lessons.
138
-
139
- ### D2 — The OATS workspace as a v2 workspace (decisions 18, 19, 21)
140
-
141
- `oats-workspace.yaml` at the `oats` repo (name `oats`; members = the seven
142
- framework repos incl. `oats` itself; `packages:` = oats.framework / okf / aweb /
143
- jira / linear / authoring / dev pinned from the catalog; `defaults.capabilities`
144
- = `oats.core` from package + knowledge `oats.okf`); `oats-membership.yaml` ×7
145
- (each package repo is a member AND a package publisher — non-collapse:
146
- `packages:` resolves it as a package, membership only grants trust and a soul).
147
- `package-catalog.json` stays the official marketplace (decision 21); the `oats`
148
- repo keeps `oats-dev` as dev capabilities. A fresh deployment directory (asked
149
- for, never named by convention — decision 9) is the acceptance: `oats onboard`
150
- → `sync` → `approve` → spawn every roster soul `--no-launch`.
151
-
152
- ### D3 — Souls to `souls/<name>` and the six package-expert souls (decision 20)
153
-
154
- Each package repo carries `souls/oats-<pkg>-expert` (oats-okf-expert,
155
- oats-aweb-expert, oats-jira-expert, oats-linear-expert, oats-authoring-expert,
156
- oats-dev-expert), the expert in that package, with a node in the central base
157
- from day one. **Messaging (human, 2026-09-24; supersedes the lead's per-soul rule):**
158
- `oats.aweb` is the workspace's messaging **default**
159
- (`defaults.messaging: { oats.aweb: { from: package } }`, oats#140); a soul
160
- without messaging says `messaging: none`. The human calls it "the most
161
- important capability, and most workspaces will use it as default", so the
162
- provider must work well as a default. Open items (oats.aweb unless noted):
163
- an unconfigured default must not make every soul unspawnable (onboarding sets
164
- the messaging root before the first spawn, and/or an unconfigured provider
165
- reports what is missing instead of refusing); error texts and `setup` must stop
166
- pointing at `oats-config.yaml`; the deployment names its messaging root
167
- explicitly rather than by search; `aw mail` usable from `work/`; retired aliases
168
- reusable. Kernel (lead): in v2 the team scope is the deployment directory and
169
- the team id comes from the messaging payload, not the classic `team:` block.
170
- #140 merges together with the first answer to the unspawnable-default item.
171
- **Teams (human, 2026-09-24): seamless by default.** (R1) Every person gets a
172
- **personal team per workspace**, created on first use with no invite and no
173
- manual initialisation — two people, or one person on two workspaces, get
174
- separate teams; stable across one person's machines. (R2) When a soul whose
175
- `team:` label the workspace maps to a shared team (`messaging.byTeam.<label>.team`)
176
- is spawned, the instance **joins that team seamlessly**. Authorization for R2
177
- (what entitles a person to join without an invite) is oats.aweb's design call
178
- with the aweb project, fail-closed and visible when the entitlement is missing.
179
- Kernel (lead): pass the soul's team label and the workspace identity so the
180
- provider derives the personal team deterministically; an unmapped team means
181
- "personal". The onboarding skill's manual invite-then-join step is the 1.12.0
182
- path and is rewritten when the provider ships R1/R2.
183
- **Teams, re-stated as THE priority (human, 2026-09-25; amends R1/R2):**
184
- "As long as we don't have this working seamlessly, people won't understand
185
- things." The two most important messaging behaviours, above every other
186
- messaging item:
187
- - **(R1) A personal team by default.** A user's agents in a workspace get
188
- that person's personal team for the workspace with no setup step. This is
189
- the default whenever the workspace maps nothing else.
190
- - **Defaults and joining (human, later the same day; refines R1/R2′):**
191
- - By default an instance is in the person's personal team ONLY, even when
192
- its soul names teams.
193
- - Joining a wider team is explicit: a spawn choice, or at any point of the
194
- instance's life one simple command, run by the human, another agent, or
195
- the instance when told to. It covers only the soul's labels the workspace
196
- maps.
197
- - The Desktop offers these controls.
198
- - Personal teams are per WORKSPACE: one personal team spanning several
199
- workspaces is wrong, and aweb's per-workspace get-or-create (abjj) is
200
- urgent. Nobody uses OATS in production yet, which is what keeps this a
201
- fix and not a migration.
202
- - Contract: `docs/design/2026-09-25-teams-contract.md`.
203
- - **(R2′) Wider teams, at spawn AND during an instance's life.** When a soul
204
- belongs to one or more wider teams, its instance is also included in each
205
- team the soul specifies, both at spawn and at any later point of its life,
206
- not only at spawn. The teams are exactly those the workspace defines
207
- (`messaging.byTeam` / the workspace's team labels); no team outside the
208
- workspace's definition, and none silently missing. R2′ supersedes R2's
209
- "is spawned … joins": joining is a lifetime operation, and a soul may name
210
- several teams.
211
- Both are oats.aweb's (Antares) with aweb primitives. **The kernel's share is
212
- the lead's:**
213
- - today `soul.team` is ONE label (docs/soul.schema.json), and the messaging
214
- payload merges `byTeam[soul.team]` for that one label. "Team/teams" needs a
215
- soul to name several team labels, and the payload to carry each mapped
216
- team's entry (not one merged view), so the provider can join all of them;
217
- - the workspace identity and the person's identity reach the provider, so
218
- the personal team derives deterministically;
219
- - a lifecycle entry point for "join now" during an instance's life (for
220
- example, a provider operation or hook run against a live home when the
221
- workspace's teams or the soul's team labels change at a new commit).
222
- The contract shape is decided with Antares and recorded as a Decision before
223
- code. **Human, same day:** the primitives must be seamlessly integrated into
224
- the aweb messaging capability (acceptance is the oats.aweb experience: no
225
- manual `aw team …` anywhere we ship, and live instances follow the
226
- workspace's teams), and kernel changes are in scope, so the provider is not
227
- bent around today's kernel.
228
- **Naming (lead, 2026-09-24):** the `oats-` prefix on all six —
229
- it matches the repository names and the roster's `oats-kernel-`/`oats-desktop-`/
230
- `oats-operator-expert`, and it keeps instance aliases from colliding with the
231
- messaging project's own `aweb-expert` soul on a shared team. **Seams named in the
232
- charters** (roster amendment): `oats-aweb-expert` READS
233
- `aweb-protocol-expert` in base `aweb-oss-knowledge` (repo
234
- `github.com/awebai/aweb`, root `knowledge/`, branch `main`, OKF 2.1.x
235
- descriptor at `knowledge/okf-base.json`; owner `1913b77b-…`) through a
236
- read-only store reference; `oats-okf-expert` names its seam to the knowledge-theory
237
- material in `oats-expert`. Whether the aweb bookshelf decisions the program
238
- rests on are published into that node is the aweb side's call (asked).
239
-
240
- ### D4 — `oats.core` and `oats.setup` rewritten (decision 22, W9b)
241
-
242
- Not patched: written for the v2 world. `oats.core`: home layout, `oats status`
243
- with modules/soul/identity rows, spawn preview → apply, `sync --approve`, the
244
- two-directory boundary, what a module is. `oats.setup` (held by
245
- `oats-operator-expert`): onboarding that ASKS for the deployment directory and
246
- the workspace URL, the hosting rule (decision 26), the public-member executable
247
- rule, the rebuild guide as procedure with the operator node as rationale.
248
- Developer souls in `oats.dev` gain `promotesTo: <node>` (roster amendment);
249
- the harvester delivers to that node as a PR the owning expert reviews.
250
-
251
- **D4 also removes the legacy the v2 model already declared gone** (human,
252
- 2026-09-24; boundary §3b's native-rework rule applied to the repository):
253
- - **Docs, skills, examples** (driver, in D4): delete what v2 removed rather than
254
- rewriting it (e.g. the OAS migration guide, the legacy Desktop succession
255
- doc, `oats-config.yaml` examples, the `oats-config` skill); rewrite what
256
- survives against `oats-local.yaml` and the workspace file; every remaining
257
- mention of `oats-config.yaml` either describes its removal or is gone.
258
- - **Kernel** (lead, one Class B PR after D2 lands, because the OATS workspace
259
- itself stops reading `oats-config.yaml` only once D2 converts it): the
260
- `oats-config.yaml` scope chain and its readers, the `local-agents/` and
261
- `tmp-agents/` layouts, the OAS-scope probes, the installed-capability tier
262
- remnants. Removed, not flagged; the `REMOVED_VERBS` answers stay.
263
- - **In-repo package copies** (`capabilities/oats-{okf,aweb,jira,linear,authoring}`)
264
- are NOT removed in D4: `package.json` ships `capabilities/` as the kernel's
265
- bundled providers, pinned by the mirror-parity, release-packaging and
266
- clean-room tests. Whether 0.26.0 still bundles them is a release decision
267
- for D5 (lead); until then they stay unmarked. `private` becomes a schema key
268
- (the kernel already reads it); `oats-review` is marked private.
269
- - **Legacy souls** (`agents/*` and their knowledge bundles) are NOT part of D4:
270
- they go when the live instances linking them retire (human rule).
271
-
272
- **Human direction 2026-09-25: runtime → harness** ("throughout the app and cli and everywhere"). It ships in 0.26.0 as one kernel PR after (e):
273
- - every kernel-owned name is renamed with no alias (`--harness`, `launch-configs.<n>.harness`, `instance.json.harness`, JSON fields, feature `harness`);
274
- - two released-contract aliases stay: the provider env sets both `OATS_HARNESS` and `OATS_RUNTIME`, and manifests may say `requires[].runtime` or `requires[].harness`;
275
- - the Desktop switches on the `harness` feature.
276
-
277
- **Human direction 2026-09-25 (~17:20Z), amending the above: release 0.26.0 WITHOUT the harness rename; harness ships as a separate, later release.**
278
- - 0.26.0 ships main as it stands once the in-flight PRs land: (e), K, the teamsOf check, `layers.<layer>.from`, and Desktop F7. It keeps the `runtime` names everywhere.
279
- - The harness rename (the kernel PR, with the alias addendum: env `OATS_RUNTIME`, stdin `launch.runtime`, manifest `agents[].runtime`/`requires[].runtime`, `spawn --runtime`) ships in the **next minor, 0.27.0**. It is a breaking CLI/JSON change (`--runtime` refused on session/launch-config, `version.runtimes` dropped, launch-configs field renamed), so it isn't a patch. It ships together with the Desktop's switch on feature `harness`, and the Desktop's accepted kernel range widens to include 0.27.
280
- - Neither the kernel harness PR nor the Desktop switch merges to main before the v0.26.0 tag.
281
-
282
- Also: "core capabilities" is the human vocabulary for the knowledge/messaging/tasks capabilities in prose; wire names are unchanged.
283
-
284
- ### D5 — Catalog update and 0.26.0
285
-
286
- Catalog pins for the new package versions; **widen Desktop `ACCEPT_RANGE` and
287
- the three pins FIRST** (minor bump rule); release notes; tag; the fresh
288
- deployment from D2 rebuilt on the published artefacts by the OSS coordinator
289
- (outsider verification) before the program board marks Phase D done.
290
-
291
- ## Adversarial review (per slice)
292
-
293
- Each slice's swarm is followed by a review swarm with the standing lenses
294
- (direction against the decisions; correctness by reproduction; security —
295
- trust at acquisition, hoisted paths, hook approval, host-only keys; docs as
296
- contract — every guide claim has a test), plus two Phase-D-specific ones: **the
297
- outsider** (can a reader who was not in the room set OATS up from `oats.setup`
298
- alone?) and **the seam** (does every cross-project read resolve to a real node
299
- with a real owner?).
300
-
301
- ## Out of scope
302
-
303
- Desktop (Phase F, its own boundary); oats.aweb 1.13.0 re-land (held on the
304
- aweb release); legacy `~/OATS` deployment cutover (the operator's, on the
305
- published 0.26.0).