@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,136 +1,116 @@
1
- # Team model v2: the workspace defines teams and the default; souls declare which they may join
1
+ # Team model v2: shared and local teams, the default team, and membership per deployment
2
2
 
3
- Status: **PROPOSED 2026-09-27** (the lead drafts; the messaging co-lead shapes it; the human confirms the open questions). It supersedes teams-contract §3 amendment K's default-team rule and the "primary" label. The rest of `2026-09-25-teams-contract.md` stands: explicit join, only eligible labels, live reconciliation, and the provider's join/leave verbs.
3
+ **Status:** decided and implemented (kernel 0.30.0, feature `team-model-2`). This record decides where teams, the default team and team membership live, how the kernel resolves them, and what the kernel hands a messaging provider. The reference pages ([workspaces.md](../workspaces.md#teams), [capabilities.md](../capabilities.md#teams-in-the-provider-environment), [desktop-cli-api.md](../desktop-cli-api.md#team-model-v2-feature-team-model-2-oats-0300-replaces-feature-teams)) win on operator-visible behaviour.
4
4
 
5
- ## The human's direction (2026-09-27, verbatim)
5
+ ## Why
6
6
 
7
- > "El workspace define los equipos que hay, y a que equipo se instancian los souls por default. Y luego en el soul.yaml defines a que equipos se puede unir ese soul, y un default si quieres override el default de el workspace."
8
- >
9
- > "we do not need aweb primitives for this, we already have teams. we need to be able to add and remove souls to teams."
10
- >
11
- > "only pepe and i are using this for now, just clean up and do the right thing. no backwards comp required. setup may require creating accounts and teams, we need to support onboarding."
7
+ Team membership is **local to each deployment**, over shared repositories and souls. Two people running the same souls from the same repositories have different sets of teams: some are shared (both map the label to the same provider team), some are personal, and each has their own default. Membership therefore never lives in a committed file, and every soul, member or package, is treated the same.
12
8
 
13
- ## Why: today's model has four overlapping ideas
9
+ What is shared is a fact, not a choice: a shared team's provider id is the same for everyone. That fact is committed once; everything personal is local.
14
10
 
15
- 1. The workspace's `teams:` labels + `messaging.byTeam.<label>` map labels to provider teams. This part is right.
16
- 2. **The default team is not the workspace's.** After amendment K it's the provider setting `team`, else the provider's own default. For oats.aweb that's the messaging root's active team: host state, invisible in config.
17
- 3. **"Primary"** (the first of a soul's `team:` labels) sets `OATS_TEAM_LABEL` and ordering but isn't the default team.
18
- 4. **`oats-membership.yaml` `team`** is a repository-level default label layered under the soul's.
11
+ ## The model (option B)
19
12
 
20
- On top of that, a soul can override the default only by writing a provider team *id* in its messaging slot, not a workspace label. And adding or removing a soul's teams means hand-editing YAML.
13
+ The chosen model is **option B: shared facts committed, personal choices local**. The committed `oats-workspace.yaml` `teams:` declares the shared teams with their provider ids; each deployment's `oats-local.yaml` declares its local teams, its default team and all membership.
21
14
 
22
- ## The model
15
+ ### Where it lives
16
+
17
+ Committed `oats-workspace.yaml` (shared teams only; edited by PR):
23
18
 
24
- ### The workspace (`oats-workspace.yaml`)
25
19
  ```yaml
26
20
  teams:
27
- dev: { description: … }
28
- platform: { description: … }
29
- defaultTeam: dev # NEW: required when `teams` is non-empty; a declared label
30
- messaging:
31
- oats.aweb: { from: package }
32
- byTeam:
33
- dev: { team: <provider team id> }
34
- platform: { team: <provider team id> }
21
+ oats: { team: oats:example.aweb.ai } # a shared team: the same provider id for everyone
35
22
  ```
36
- - **`teams:`** declares the teams that exist (labels), as today.
37
- - **`defaultTeam:`** is the team a soul's instances go to by default. It's a label, never a provider id.
38
- - **`messaging.byTeam.<label>`** maps each label to its provider team, as today. It's the ONLY place a provider team id is written.
39
- - **Validation:** `defaultTeam` must be a declared label (`E_TEAM_UNKNOWN`). Once messaging is active, the default team's label must be mapped (`E_TEAM_UNMAPPED`, a refusal, not a warning: an instance must have somewhere to live).
40
23
 
41
- ### The soul (`soul.yaml`)
24
+ Local `oats-local.yaml` (the deployment's per-machine file, never committed):
25
+
42
26
  ```yaml
43
- teams: [dev, platform] # RENAMED from `team`: the teams this soul MAY join
44
- defaultTeam: platform # NEW, optional: overrides the workspace's; must be in `teams`
27
+ teams:
28
+ antares-oats: { team: antares-oats:ana.aweb.ai } # a local (personal) team: label → provider id
29
+ defaultTeam: antares-oats
30
+ souls:
31
+ disabled: [...]
32
+ teams: # the extra teams each soul's instances MAY join here
33
+ "*": [oats] # every soul
34
+ oats-expert: [oats] # one soul: its bare name, or <package>/<soul> for a package soul
35
+ default: # an optional per-soul override of defaultTeam
36
+ oats-expert: oats
45
37
  ```
46
- - **`teams:`** is the eligible labels. Each must be declared by the workspace (`E_TEAM_UNKNOWN`), as today. The list is unordered: **"primary" goes away.**
47
- - **`defaultTeam:`** is optional. It must be one of the soul's `teams`, else `E_TEAM_NOT_ELIGIBLE`. When omitted, the workspace's `defaultTeam` applies, and the soul is eligible for it implicitly.
48
- - **Removed:**
49
- - a soul's messaging-slot provider team id override;
50
- - `oats-membership.yaml` `team` (two layers only: the workspace, then the soul);
51
- - the old `team:` key.
52
-
53
- No aliases (the human: no backwards compatibility).
54
-
55
- ### Resolution (the kernel)
56
- - `effectiveDefault = soul.defaultTeam ?? workspace.defaultTeam`.
57
- - The provider receives the default team's mapped payload as its default. It gets **no root-active-team fallback.**
58
- - Plus the eligible set, `{label → payload}` for every label in `soul.teams ∪ {effectiveDefault}` that the workspace maps.
59
- - **The env names** (renamed, no aliases):
60
- - `OATS_DEFAULT_TEAM` (the label) and `OATS_DEFAULT_TEAM_ID` (its mapped provider id);
61
- - `OATS_TEAMS` (the JSON of the eligible set).
62
- - `OATS_TEAM_LABEL`, `OATS_TEAM_LABELS` and `OATS_TEAM_ID` go.
63
- - **A standalone deployment** (no workspace) sets `teams` / `defaultTeam` / `messaging.byTeam` in its local config, with the same rules.
38
+
39
+ - **`teams.<label>`** is `{ team?, description? }` in the committed file and `{ team, description? }` locally. These are the only places a provider team id is written. A shared team without `team` is declared but not yet created: readiness `team-unmapped`, a failure when it is the default, a warning otherwise.
40
+ - **A label in both files** is `team-label-collision`, a readiness warning and never a spawn refusal: the shared definition wins, and the fix is renaming the local label. A teammate's PR adding a shared team never breaks another deployment on sync.
41
+ - **`defaultTeam`** is the team every instance of this deployment lives in: its default-team identity. It names a label from either file. `oats teams add` of the first team sets it.
42
+ - **`souls.teams`** lists the teams a soul's instances are eligible to join here: `"*"` for every soul, and a soul's own entry adds to it. Eligible teams are offered, never auto-joined.
43
+ - **`souls.default`** overrides `defaultTeam` for one soul; it must be one of that soul's teams (`E_TEAM_NOT_ELIGIBLE`).
44
+ - **An undeclared label** anywhere is `E_TEAM_UNKNOWN`: a spawn, preview or `inspect --soul` refusal, and a readiness item.
45
+ - **Messaging active and no default** is `E_TEAM_UNCONFIGURED` (a readiness failure). There is no guessed team and no fallback to a provider's own active team.
46
+ - **A label never gates, restricts, changes trust or partitions the knowledge store.**
47
+
48
+ ### Not part of the model
49
+
50
+ These keys are refused with `E_WORKSPACE_SCHEMA` (reason `removed-key`), naming the replacement; there are no aliases:
51
+
52
+ - `oats-workspace.yaml` `messaging.byTeam` (the id is `teams.<label>.team`) and `defaults.byTeam` (capabilities compose from the committed workspace and the soul only, so composition is the same for everyone);
53
+ - `soul.yaml` `team:` and `oats-membership.yaml` `team`;
54
+ - the "primary" label;
55
+ - the messaging provider's own `team` setting, at every layer.
56
+
57
+ ### Resolution
58
+
59
+ - `defaultOf(soul) = souls.default[soul] ?? defaultTeam`.
60
+ - `teamsOf(soul) = {defaultOf(soul)} ∪ souls.teams["*"] ∪ souls.teams[soul]`, each label resolved through `teams.<label>`. The deployment default is among a soul's teams only when it is that soul's default or the soul lists it.
61
+ - A soul's teams are rows `{label, team, default, from: "shared"|"local"}`, the default first, then by label; its default is `{label, team, from: "deployment"|"soul"}`. The spawn preview, `inspect --soul`, `oats souls` and readiness report them; `instance.json` records them at spawn.
62
+ - **Changing `defaultTeam`** does not move running instances (their default-team identity is fixed): readiness `--home` warns `default-team-changed` until respawn.
64
63
 
65
64
  ### At spawn, and live
66
- - An instance is **always in its effective default team** (it can't leave it: `E_TEAM_DEFAULT`).
67
- - It joins other eligible teams explicitly: the spawn choice `join=…`, or the provider's join/leave on a live instance. This is unchanged from the teams contract.
68
- - **When a soul loses a label**, or the workspace unmaps it, a joined instance leaves it on the next live read. This is unchanged: teams contract §7 decision 6.
69
- - **When the effective default changes** (the workspace or soul `defaultTeam` edited), running instances keep their team until respawn. Readiness warns (`default-team-changed`) and names the new default.
70
65
 
71
- ### Verbs: add and remove a soul's teams, set its default
72
- The CLI edits `soul.yaml` for a soul the deployment can edit (a member soul in a clone on this computer, or a local soul):
66
+ - **At spawn an instance joins its default team only.** Every other eligible team is offered: the spawn's `join=<labels>` provider setting (a trigger's `spawn.teams` becomes it), and checkboxes in the Desktop spawn dialog. Each joined team gets its own identity.
67
+ - **Later**, the provider's per-instance join and leave verbs opt one instance in or out of an eligible team. The default team is the instance's identity and is not left.
68
+ - **Live rule:** a joined team that is no longer eligible (removed from the soul's list, or the team removed) is left on the next live read. A newly eligible team is offered, never auto-joined. Nothing else is undone.
69
+
70
+ ### Verbs
71
+
72
+ The kernel verbs edit `oats-local.yaml` in place; they never call a provider, clone, or open a PR.
73
+
73
74
  ```
74
- oats soul teams <soul> # eligible, default (and where it comes from)
75
- oats soul teams <soul> --add <label>[,<label>] | --remove <label>[,<label>]
76
- oats soul teams <soul> --default <label> | --clear-default
75
+ oats teams [--json] # this deployment's teams, ids, the default, problems
76
+ oats teams add <label> --team <id> [--description d] # declare a local team
77
+ oats teams remove <label> # a local team nothing references
78
+ oats teams default <label>
79
+ oats soul teams <soul>|'*' [--add a,b] [--remove a,b] [--default <label> | --clear-default]
77
80
  ```
78
- - Each edit validates against the workspace (known label; the default ∈ teams) and writes the file.
79
- - **For a member soul it edits the clone's working tree and says so:** the change travels by commit/PR, as every config change does (oats.setup). It never pushes.
80
- - **Package souls are read-only:** their teams are the package's. A workspace adds a package soul to a team through the workspace instead, `teams.<label>.souls: [<pkg>/<soul>]`, which extends that soul's eligible set. Proposed; see Open question 3.
81
- - The Desktop gets the same controls on a soul's page (add/remove/default), and the spawn dialog shows the default + eligible teams.
82
-
83
- ### Onboarding (setup creates accounts and teams)
84
- - **`oats aweb setup`** (the provider's setup verb, a setup-time human act):
85
- - creates the account (`aw init --new-account --username …`) when none exists;
86
- - creates every declared team that the workspace doesn't map yet;
87
- - writes the resulting ids into `messaging.byTeam` **as a proposed diff** for the human to commit (oats.setup: config changes by PR).
88
- - It never runs at spawn, mint, retire or wake.
89
- - **What aweb allows today** (the messaging lane, from aweb's lead, 2026-09-27):
90
- - **The first account and its default team:** fully automatable (`aw init --new-account --username …`).
91
- - **An additional team on a BYOD domain:** automatable headlessly with the namespace controller key:
92
- 1. `aw id team create --name <t> --namespace <domain>`;
93
- 2. the team key signs `aw id team invite`;
94
- 3. the root runs `accept-invite --local`.
95
-
96
- `aw id team register` hosts it on aweb.ai. No human login is needed.
97
- - **An additional team on a hosted account (`<u>.aweb.ai`):** NO CLI path. Only a logged-in human creates it, in the dashboard. aweb's lead proposes a generic `aw team create <name>` under the logged-in account.
98
- - **Update (2026-09-27, the human's decision via aweb's lead): the hosted gap closes headlessly** (aweb `aweb-abkh`, pending a Cloud + CLI release).
99
- - A member of an org-owned hosted team creates a sibling team in the same account with `aw id team create --name <t>`, which returns the new `team_id` + a **single-use invite token**. The caller doesn't auto-join.
100
- - The home that should hold the new team's member runs `aw --identity-home <root> id team accept-invite <token> --name <alias> --local`.
101
- - No TTY, no `aw auth`; bounded by the account plan's team limit.
102
- - **So setup is designed FULLY HEADLESS:**
103
- 1. The account + the workspace's default team: `aw init --new-account --username …`.
104
- 2. Every further declared team (hosted or BYOD): `aw id team create --name <label>` + `accept-invite --local` into the deployment's root.
105
- 3. Setup writes each new id into `messaging.byTeam` as a proposed diff for the human to commit.
106
- - **The only gate is the aw/Cloud version floor** that ships `aweb-abkh`. Below it, a hosted extra team is refused with the remedy "upgrade aw" (the provider's readiness names the floor), not a guided dashboard step. The model doesn't change.
107
- - Setup needs no human login at all on this path.
108
- - Setup never runs at spawn/mint/retire/wake, and OATS holds no human login (the provider consumes the resulting root).
109
- - The oats.setup skills (`oats-teams`, `oats-onboarding`, `oats-workspace-config`) teach the model and the verbs.
110
-
111
- ## Open questions (for the human)
112
- 1. **At spawn:** is an instance in ONLY its default team (others joined explicitly), as proposed? Or does it join every team its soul lists?
113
- 2. **When a soul's team is removed:** do running instances leave on the next live read (proposed, as today), or only when told to?
114
- 3. **Package souls:** is a workspace-side `teams.<label>.souls: [...]` the right way to add a package soul to a team? The alternative is that package souls have only their package's teams.
115
-
116
- ## Sequencing (proposed)
117
- 1. **Now, small (the messaging lane):** an oats.aweb release with the setup `--new-account` fix + the dead `helperInjection` key.
118
- 2. **This design:** the co-lead shapes it → the human answers 1–3 → **Decided**.
119
- 3. **Kernel 0.30.0 (breaking):**
120
- - the schemas;
121
- - resolution + env;
122
- - the `oats soul teams` verb;
123
- - readiness;
124
- - the oats.setup skills;
125
- - docs.
126
- 4. **oats.aweb 1.17:** the default from the kernel (no root-active fallback); `oats aweb setup` onboarding.
127
- 5. **Desktop:**
128
- - the server passes the new fields (the engineer);
129
- - the soul-page team controls + the spawn dialog (the ux-designer).
130
- 6. **The KB + migration** of the two existing deployments (one-shot, by the humans with the setup-admin soul).
131
-
132
- **Owners (proposed):**
133
- - the kernel: a cli-dev;
134
- - oats.aweb + onboarding: the messaging co-lead's developer;
135
- - the Desktop: the engineer + the ux-designer;
136
- - this doc, the review and the release: the lead.
81
+
82
+ - `oats teams add` of a label already declared in either file is `E_TEAM_EXISTS`.
83
+ - `oats teams remove` of a label still referenced (`defaultTeam`, `souls.teams`, `souls.default`) is `E_TEAM_IN_USE`, naming every reference; there is no cascade. A shared label is not removable here (`E_TEAM_SHARED`: it is edited by PR).
84
+ - `oats soul teams` with an unknown label is `E_TEAM_UNKNOWN`; a `--default` outside the soul's teams after the write is `E_TEAM_NOT_ELIGIBLE`; `--default` with `'*'` is `E_BAD_ARGS`.
85
+ - The Desktop offers the same controls, labelled "on this computer": the deployment's teams and default, and a soul's teams here.
86
+
87
+ ### Onboarding
88
+
89
+ Setup is the messaging provider's act, run by a human at setup time, never at spawn, mint, retire or wake. OATS holds no human login. The provider's setup is expected to:
90
+
91
+ - create the account and the first team when none exists, and record it locally with `oats teams add` (which makes it the default);
92
+ - create a new **local** team at the provider, then record it with `oats teams add <label> --team <id>`. A local team is never declared without an existing id;
93
+ - for a **shared** team declared without an id, let its owner create it and print the exact line to commit (`teams: { <label>: { team: <id> } }`), by PR; setup never edits the committed file;
94
+ - join an **existing shared** team through its owner's invite;
95
+ - normalize a label to the provider's team-name rules rather than passing it raw; the local mapping, not the name, is the truth.
96
+
97
+ ## The kernel ↔ provider contract
98
+
99
+ **Environment** (every provider context: lifecycle hooks, home commands, operations and readiness checks). Teams travel beside a provider's settings, never inside them.
100
+
101
+ - `OATS_DEFAULT_TEAM`: the soul's default label. `OATS_DEFAULT_TEAM_ID`: its provider id. `OATS_DEFAULT_TEAM_FROM`: `deployment` (`defaultTeam`) or `soul` (`souls.default`).
102
+ - No default configured: none of the three is set. An unmapped default: `OATS_DEFAULT_TEAM` and `OATS_DEFAULT_TEAM_FROM` are set, `OATS_DEFAULT_TEAM_ID` is not.
103
+ - `OATS_TEAMS`: JSON `[{label, team, default, from: "shared"|"local"}]`, every **mapped** team the soul may be in here, the default included (`default: true`), default first, then by label. Eligible to join = the rows with `default: false`. Unset when a home's teams are unknown (none recorded and unreadable now).
104
+ - `OATS_TEAMS_SOURCE`: `live` (the workspace and `oats-local.yaml` read now, or a fresh resolution) or `recorded` (the spawn-time record in `instance.json`). **A provider leaves a joined team only on a `live` list**: a recorded list lacks every change since the spawn.
105
+ - Live reads happen where teams are acted on: a home's launch hook (`oats session start|restart`), its messaging module's commands and operations, `oats inspect --home` and `oats readiness --home`. Every other context gets the recorded teams. A scheduled wake's session start uses the recorded teams, so it leaves nothing.
106
+ - The pre-0.30 names `OATS_TEAM_LABEL`, `OATS_TEAM_LABELS` and `OATS_TEAM_ID` are always unset.
107
+
108
+ **What the messaging provider does with it:**
109
+
110
+ - mint an instance's default-team identity from `OATS_DEFAULT_TEAM_ID`, and join the other eligible teams only when asked (`join=` at spawn, or its per-instance verbs);
111
+ - refuse the spawn, naming the problem, when no default is configured or the default is unmapped;
112
+ - keep one identity root per team and mint each identity from that team's root, never from whatever team a root happens to have active; report a declared team with no member root as its own readiness problem;
113
+ - make a leave caused by a live read visible: a warning in the hook or command output, a `left: [{label, team, at, reason: "no-longer-eligible"}]` list (the last 20) in its teams document, and the instance's events (`oats instance events`). There is no acknowledge state, and readiness does not nag;
114
+ - report its teams document with `defaultTeam` in exactly the kernel's shape, `{label, team, from}`.
115
+
116
+ **Kernel verbs are config only.** `oats teams add | remove | default` write `oats-local.yaml` `teams` and `defaultTeam`; `oats soul teams` writes `souls.teams` and `souls.default`. A provider's setup records what it created by calling `oats teams add` and `oats teams default` through `OATS_CLI_BIN`. Joining a shared team's membership is a provider act; there is no kernel `oats teams join`.
@@ -0,0 +1,38 @@
1
+ # Hosts opt in to workspace automations (`automations.trust`)
2
+
3
+ Status: **DECIDED 2026-09-28 by Juan** (the automation trust decision, recommended by the leads on
4
+ 2026-09-27). Target: OATS 0.30.
5
+
6
+ ## Context
7
+ A workspace trigger or schedule runs on the host whose `host.name` is its `runsOn` and whose `gh`
8
+ account is its `owner` (docs/schedules.md "Who runs it"). Both facts can come from a commit. So
9
+ anyone who can commit to a member repo can make a machine that matches those names run an
10
+ automation. Its operator never said yes to that automation, only to a host name and a login.
11
+
12
+ ## Decision
13
+ **A host runs a workspace automation only when its operator has trusted it**, in the local file:
14
+ ```yaml
15
+ # oats-local.yaml (never in oats-workspace.yaml or a member file: the committed schemas refuse it)
16
+ automations:
17
+ trust:
18
+ - oats-knowledge/okf-review # <member>/<id>, as the automations list names it
19
+ # or: trust: "*" # every automation the workspace places on this host
20
+ ```
21
+ - **Runs only if** `runsOn` matches, `owner` matches, **and** `trust` admits it. `triggers.disabled` /
22
+ `schedules.disabled` still opt out on top.
23
+ - **Absent or empty `trust`:** nothing runs.
24
+ - **Matching but untrusted:** it never runs. It's listed with reason `untrusted` (after
25
+ `assigned-elsewhere`, `owner-mismatch` and `host-unnamed`). A readiness/status item says
26
+ "declared for this host, not trusted here", and its remedy names the exact `oats-local.yaml`
27
+ line to add. The automations status row carries the reason, so the Desktop can show it.
28
+ - **A trust entry that matches nothing** is a warning, not an error: a member may not have
29
+ synced yet.
30
+ - **Personal automations** (`oats trigger add` / `schedule add` in `oats-local.yaml`) are already
31
+ the operator's own choice and need no trust entry.
32
+
33
+ ## Behaviour change
34
+ Hosts that ran workspace automations before 0.30 must add their `trust` lines. The 0.30 release
35
+ notes say so. No host of ours runs one today, so there's nothing to migrate.
36
+
37
+ ## Unblocks
38
+ The okf review trigger on Juan's host: it runs once his host trusts it.
@@ -0,0 +1,63 @@
1
+ # Soul launch preferences: a harness and model per soul, overridable per machine
2
+
3
+ Status: **DECIDED 2026-09-28 by the human (Pepe)**: "per soul preference, but also allow the local
4
+ overrides". Target: OATS 0.30.
5
+
6
+ ## Context
7
+ Workspace-model v2 (0.25.0) removed `runtime`/`model` from `soul.yaml`, and 0.26.0 made a launch
8
+ configuration "a spawn-time host choice, never a soul field", for portability (not every machine has
9
+ every harness or model). The cost: there is no way to say "this role runs on Claude Code with Opus
10
+ 5.5" without passing `--launch-config` on every spawn, and the Desktop's soul pages show "No default
11
+ harness" for every soul.
12
+
13
+ ## Decision
14
+ 1. **A soul may declare a launch preference** in `soul.yaml`:
15
+ ```yaml
16
+ launch: { harness: claude, model: claude-opus-5-5 } # harness: pi|claude|codex; model optional
17
+ ```
18
+ It says only *what the role should run on*: no args, env, yolo or executable (those stay host
19
+ facts, in launch configurations). A package soul may declare one too (oats.engineering's
20
+ `code-reviewer`: Codex with Astra).
21
+ 2. **A machine may override it** in `oats-local.yaml`:
22
+ ```yaml
23
+ souls:
24
+ launch:
25
+ "*": <launch-config name> # every soul on this machine (optional)
26
+ oats-expert: opus # a launch configuration's name, or
27
+ oats.engineering/code-reviewer: { harness: codex, model: <model> } # an inline preference
28
+ ```
29
+ 3. **Precedence for a new selection** (a spawn, or a start/restart given `--launch-config`/`--harness`/`--model`/`--reselect-launch`): explicit flags (`--launch-config`, `--harness`,
30
+ `--model`) → the machine's `souls.launch.<soul>` → its `souls.launch."*"` → the soul's `launch:` →
31
+ today's host default. A launch configuration named by an override supplies its full recipe; an
32
+ inline or soul preference supplies harness and model on top of the host's baseline for that harness.
33
+ **A home's recorded launch stays frozen:** a plain start/restart runs it as recorded (`from:
34
+ recorded`). A preference is a default for new instances, not a live setting; a drifted
35
+ preference shows in `inspect --home` (`launch.current`), and a restart never changes it silently.
36
+ 4. **Unavailable harness:** if the chosen harness isn't installed on the machine, the spawn refuses
37
+ with a clear error naming the source (soul / local / flag) and the fix (install it, or override in
38
+ `oats-local.yaml`). No silent fallback to another harness.
39
+ 5. **Reported everywhere a launch is shown:** `spawn --preview`, `inspect --soul` and `oats souls`
40
+ carry the soul's declared `launch` and the effective one with its `from` (`flag` | `local` |
41
+ `local-default` | `soul` | `host` | `recorded`); `instance.json` records the effective one.
42
+
43
+ ## Migration (binding): the same hazard as the team model
44
+ 0.29.4's `soul.yaml` schema refuses unknown keys, and members are read at their latest commit.
45
+ - The kernel accepts `launch:` and `souls.launch` in 0.30.
46
+ - **Committed souls gain `launch:` only on the flag day** (every deployment of the workspace runs
47
+ 0.30), and `oats.engineering` ships its reviewer's `launch:` in a release with `compatibility:
48
+ oats >=0.30.0`.
49
+ - Until then, each machine sets its preferences with the local override (0.30), or with
50
+ `--launch-config` at spawn.
51
+
52
+ ## Consumers
53
+ - The **Desktop** already renders a soul's default harness and model on the soul page and the side
54
+ panel, but it reads fields v2 souls no longer have, so it shows "No default harness". It reads the new
55
+ `launch` (declared + effective + `from`) consumer-first, before the kernel emits it; the spawn dialog
56
+ shows the effective choice and where it came from.
57
+ - **`oats.developer`'s** `/run-the-review-loop` compares the developer's effective model with the
58
+ reviewer's effective one (from `spawn --preview`) and picks another model when they're the same.
59
+
60
+ ## The first preferences (at the flag day)
61
+ - All expert souls in the oats repo: Claude Code, Opus 5.5.
62
+ - `oats.engineering/code-reviewer`: Codex, Astra.
63
+ (Model ids are verified against each harness when they're written, not guessed.)
@@ -0,0 +1,65 @@
1
+ # Design history
2
+
3
+ The design records below were superseded and deleted. Each row keeps the
4
+ decision findable: what the record decided, what replaced it, and a link to its
5
+ full text at the last commit that carried it. The current behaviour is in the
6
+ reference pages; the records still in force are listed in the
7
+ [design index](README.md).
8
+
9
+ | record | date | decision | superseded by |
10
+ |---|---|---|---|
11
+ | [OATS Desktop — UX plan (phase 1)](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/desktop-ux-plan.md) | 2026-07-22 | Chose the Desktop's design language: a VS Code-style shell with command palette, semantic theme tokens and an agent-centred information architecture. | [Desktop design brief](../../packages/desktop/docs/design-brief.md) |
12
+ | [Architecture reassessment: usable agents with replaceable services](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-07-architecture-reassessment.md) | 2026-09-07 | Kept the package and capability-layer mechanism, fixed places where the CLI and Desktop bypassed it, and assigned separate ownership to kernel, backends, capabilities and Desktop. | [layers](../layers.md) |
13
+ | [Souls and capabilities in Desktop](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-07-desktop-souls-capabilities.md) | 2026-09-07 | Desktop inspects souls, capabilities and provider operations only through kernel JSON and changes them only through CLI verbs, never by editing YAML itself. | [Desktop CLI API](../desktop-cli-api.md) |
14
+ | [Proposal: manage server agents from an iPhone](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-07-mobile-agent-management-proposal.md) | 2026-09-07 | Proposed managing server agents from an iPhone through an installable mobile web app reached over Tailscale, reusing the existing control and session contracts. | none (proposal, never implemented) |
15
+ | [Launch configurations and launch recipes](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/launch-configurations.md) | 2026-09-07 | A launch configuration is a named host choice of harness, executable, args, env, model and yolo; a spawn records a launch recipe that every start renders. | [configuration](../configuration.md#launch-configurations) |
16
+ | [Provider operations and inspection contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/operations-contract.md) | 2026-09-07 | A capability declares named operations over its own commands; `oats operation run` resolves the slot's provider and relays one validated JSON answer. | [capabilities](../capabilities.md#operations-a-capability-declares) |
17
+ | [Expert-assisted deployment and an extensible OATS](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-08-expert-assisted-deployment-proposal.md) | 2026-09-08 | Proposed that an OATS expert sets up and verifies agents on other machines through reliable commands and skills, with multi-team membership and explicit knowledge destinations. | [capabilities](../capabilities.md#official-packages) (`oats.setup`), [workspaces](../workspaces.md#teams) |
18
+ | [Knowledge and memory in OATS: the central knowledge base and the expertise doctrine](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-13-knowledge-and-memory-direction.md) | 2026-09-13 | All knowledge leaves the soul for a central per-project base of owned nodes; working agents only read and capture, and a per-instance harvester is the sole writer. | [knowledge theory](../knowledge-theory.md), [knowledge](../knowledge.md) |
19
+ | [Knowledge implementation plan](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-13-knowledge-implementation.md) | 2026-09-13 | Planned the first OKF delivery: Git and directory bases configured by a bindings file, independent per-source harvest, PR-only Git delivery and explicit migration. | [knowledge](../knowledge.md), [OKF knowledge operations](2026-09-26-okf-knowledge-operations.md) |
20
+ | [Knowledge contracts, integrations, and storage](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-13-knowledge-location-contract.md) | 2026-09-13 | Proposed separating the knowledge model, the integration and storage custody, using bases, nodes and bindings with harvest independent of the source instance. | [knowledge](../knowledge.md#bindings-document), [knowledge capability contract](2026-09-16-knowledge-capability-contract.md) |
21
+ | [Finalizing the OKF mirror's source provenance](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/okf-mirror-provenance.md) | 2026-09-13 | The standalone oats-okf repository is authoritative; the mirror here is finalized only from a clean checkout at the published tag, verified against origin. | [release lane](../release-lane.md#mirroring-a-released-oatsokf) |
22
+ | [Retained capability artifacts and captured resolutions](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-artifact-retention-contract.md) | 2026-09-14 | Added primitives that retain verified, immutable capability trees addressed by digest, as the base for captured resolutions, separate approval and dispatch. | removed (no successor, 0.26.0) |
23
+ | [Portable souls and Git-backed organizational workspaces](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-portable-souls-and-git-workspaces.md) | 2026-09-14 | Souls declare their capability sources, a Git-hosted workspace declares reciprocal membership and defaults, and each local deployment resolves, installs and binds credentials. | [workspaces](../workspaces.md) |
24
+ | [Portable Souls — substantive contract amendment](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-portable-souls-contract-amendments.md) | 2026-09-14 | Amended Portable Souls with `requires` versus `defaults`, `repo:` source paths, external soul imports by reference and store-qualified knowledge nodes. | [workspaces](../workspaces.md) |
25
+ | [Portable Souls](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-portable-souls-explainer.md) | 2026-09-14 | Explained the Portable Souls model (soul, workspace and deployment responsibilities, reciprocal membership, private-first teams) through an illustrative multi-repository organisation. | [workspaces](../workspaces.md), [Desktop design brief](../../packages/desktop/docs/design-brief.md) |
26
+ | [Captured dispatch integration](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-captured-dispatch.md) | 2026-09-15 | Captured each selected manifest's setting defaults with provenance and dispatched commands only from the exact captured resolution, never from current configuration. | removed (no successor, 0.26.0) |
27
+ | [Captured resolution records — implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-captured-resolution-records.md) | 2026-09-15 | Defined content-addressed, immutable resolution records stored under the deployment, outside instance homes, with verification of every retained input. | removed (no successor, 0.26.0) |
28
+ | [Package preparation integration](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-package-preparation.md) | 2026-09-15 | Reused one shared capability materializer for acquisition, restore and portable package preparation instead of a separate portable installer. | [packages](../packages.md#materialization-from-a-package) |
29
+ | [Portable data and digest contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-data-contract.md) | 2026-09-15 | Made integrity an explicit `{format, value}` pair with a new executable-aware tree encoding and canonical JSON, so trust never transfers between formats. | [packages](../packages.md#lock-v3); captured formats removed in 0.26.0 |
30
+ | [Portable declaration codecs — implementation contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-declarations.md) | 2026-09-15 | Added one bounded YAML/JSON reader and parsers for soul v1, workspace, repository exports and external imports, feeding a single choice engine. | [workspaces](../workspaces.md#the-files), [souls and instances](../souls-and-instances.md#soulyaml-v2) |
31
+ | [Portable Souls infrastructure implementation handoff](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-souls-handoff.md) | 2026-09-15 | Recorded the fifteen binding Portable Souls decisions and a dependency-ordered delivery plan, with Desktop feature work deferred. | [workspaces](../workspaces.md); captured path removed in 0.26.0 |
32
+ | [Portable Souls infrastructure implementation](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-souls-implementation.md) | 2026-09-15 | Recorded a ledger mapping each binding Portable Souls decision to delivery steps and acceptance evidence. | [workspaces](../workspaces.md); captured path removed in 0.26.0 |
33
+ | [Selection lock and approval — implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-selection-lock-and-approval.md) | 2026-09-15 | Introduced a selection lock of artifact sets with current and available choices, and exact-artifact executable approval kept separate from the lock. | [lock v3](../packages.md#lock-v3), [package trust](../packages.md#trust) |
34
+ | [Repository observation and source custody](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-source-observation.md) | 2026-09-15 | Observed repositories through native Git and `gh` in one transaction, recording exact identity and commit without checking out or executing source. | [workspace module contracts](2026-09-23-workspace-module-contracts.md) |
35
+ | [Captured incarnation and admitted actions](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-captured-admission.md) | 2026-09-16 | Minted a stable incarnation ID per fresh home and indexed custody witnesses and admitted provider intents outside the home. | removed (no successor, 0.26.0) |
36
+ | [Retained helper selection — supported subset](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-captured-helper-dispatch.md) | 2026-09-16 | Resolved a capability's helper exactly from the source resolution's helper map, with no live soul, configuration or lock lookup. | removed (no successor, 0.26.0) |
37
+ | [Explicit retained launch inputs](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-captured-launch-inputs.md) | 2026-09-16 | Required explicit runtime, executable, arguments, environment, model and yolo inputs to compile a captured launch recipe, with no defaulting. | removed (no successor, 0.26.0) |
38
+ | [Command/curriculum preparation](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-command-profile-preparation.md) | 2026-09-16 | Added `oats prepare`, combining by-reference soul import, workspace choices and package preparation into captured records without launching. | removed in 0.26.0; replaced by [`oats sync`](../packages.md#oats-sync--the-one-command-for-the-common-path) |
39
+ | [Fresh-install-first Portable Souls rollout](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-fresh-install-first-rollout.md) | 2026-09-16 | Prioritised fresh installations over automatic in-place migration and historical reconstruction, keeping the architecture and custody rules unchanged. | none (fresh installs; no migration) |
40
+ | [Fresh operator walkthrough: working preparation versus pending launch](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-fresh-operator-walkthrough.md) | 2026-09-16 | Recorded a source-level walkthrough of fresh preparation versus the still-pending captured launch. | [workspace module contracts](2026-09-23-workspace-module-contracts.md), [workspaces](../workspaces.md) |
41
+ | [Messaging capability contract boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-messaging-capability-contract.md) | 2026-09-16 | OATS supplies generic messaging selection, lifecycle and outcome contracts; the messaging capability owns identity, teams, transport and access verification. | merged into the [knowledge and messaging capability contract](2026-09-16-knowledge-capability-contract.md) |
42
+ | [Portable migration evidence reader and planner](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-portable-migration-evidence.md) | 2026-09-16 | Added a read-only inventory and planner of legacy locks, homes and schedules as evidence for a later explicit migration. | removed (no successor, 0.25.0) |
43
+ | [Portable fresh onboarding and source discovery](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-portable-onboarding.md) | 2026-09-16 | Kept source, deployment, work target and membership context as independent facts in a fresh onboarding and discovery facade. | [Desktop CLI API](../desktop-cli-api.md#oats-onboard-onboardapi-2), [workspaces](../workspaces.md) |
44
+ | [Public preparation request-file transport](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-prepare-request-transport.md) | 2026-09-16 | Let `oats prepare --request` read the whole preparation input from one bounded JSON file, exclusive with every other input flag. | removed (no successor, 0.26.0) |
45
+ | [Provider-owned binding codecs — implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-provider-binding-codecs.md) | 2026-09-16 | A core capability may declare a versioned `binding` naming its own normalize, bind and check commands, so providers own their binding model. | [capabilities](../capabilities.md#readiness-check-bindingcheck) |
46
+ | [Provider binding wire v1](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-provider-binding-wire.md) | 2026-09-16 | Defined the bounded JSON stdin/stdout protocol for the normalize, bind and check binding phases. | [capabilities](../capabilities.md#readiness-check-bindingcheck) |
47
+ | [Capability-owned helper injection and lifecycle input contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-capability-helper-input-contract.md) | 2026-09-17 | Replaced kernel assumptions with an explicit `helperInjection` manifest field and a per-hook opt-in for source receipts. | removed (no successor, 0.26.0; the fields are accepted and ignored) |
48
+ | [Captured native backend parity: tmux and Herdr](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-captured-backend-parity.md) | 2026-09-17 | Supported captured start and restart on both tmux and Herdr through explicit backend endpoints recorded in receipts. | removed (no successor, 0.26.0) |
49
+ | [Captured native start through the existing session transaction](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-captured-native-start.md) | 2026-09-17 | Started captured instances through the existing native session transaction, from a retained entrypoint or an explicit host executable path. | removed (no successor, 0.26.0) |
50
+ | [Captured boundary resource hookup](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-portable-boundary-hookup.md) | 2026-09-17 | Wired the captured-only boundary injections into captured preparation, with unchanged labels and order. | removed (no successor, 0.26.0) |
51
+ | [Captured-only instance and directory boundaries](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-portable-boundary-resources.md) | 2026-09-17 | Added captured-only instance-boundary and work-directory injections that take authority from the captured resolution rather than the working directory. | removed (no successor, 0.26.0) |
52
+ | [Public captured start and retained helper dispatch](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-public-captured-start.md) | 2026-09-17 | Exposed captured start and restart, including retained helpers, through `oats session start\|restart --deployment --resolution`. | removed (no successor, 0.26.0) |
53
+ | [Public preparation request-file transport](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-public-prepare-request.md) | 2026-09-17 | Added a shared helper that reads a preparation request file intact, leaving validation to the one preparation entry point. | removed (no successor, 0.26.0) |
54
+ | [Captured Pi print host — kernel implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-18-captured-pi-host.md) | 2026-09-18 | Added an explicit Pi SDK print-mode host for captured launches, with kernel-controlled arguments, task and history. | removed (no successor, 0.26.0) |
55
+ | [First-cut retained execution: installation and release checklist](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-18-first-cut-release-checklist.md) | 2026-09-18 | Planned the installation, acceptance and publication checklist for the first runnable retained-execution release. | removed (no successor, 0.26.0) |
56
+ | [Explicit Herdr protocol20/22 adapter compatibility](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-18-herdr-protocol-compatibility.md) | 2026-09-18 | The Herdr adapter supports exactly protocols 20 and 22 by explicit selection, with no version negotiation. | [execution targets](../execution-targets.md) |
57
+ | [OATS redesign — program board](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-20-redesign-program-board.md) | 2026-09-20 | Recorded the state, owners and blockers of every redesign work stream. | none (status board) |
58
+ | [OATS adoption plan: workspace first, knowledge and experts second](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md) | 2026-09-20 | Planned moving OATS development onto a Git workspace, then central knowledge and expert souls, then Desktop parity, with official `oats.core` and `oats.setup` capabilities. | [workspaces](../workspaces.md), [official catalog](../official-catalog.md) |
59
+ | [Public source inspection for same-repository workspace onboarding](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-20-workspace-onboarding-public.md) | 2026-09-20 | Added read-only `oats inspect --request` to inspect onboarding sources and optionally emit a preparation request. | removed in 0.26.0; replaced by [`oats onboard`](../desktop-cli-api.md#oats-onboard-onboardapi-2) |
60
+ | [Desktop parity — slice plan and kernel/provider seams (S8)](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-22-desktop-parity-seams.md) | 2026-09-22 | Planned Desktop parity slices and the kernel and provider JSON seams they need, under shared rules for envelopes and targets. | [Desktop CLI API](../desktop-cli-api.md) |
61
+ | [A simpler multi-repo model for OATS — brainstorm with a worked example](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-23-simplified-workspace-model.md) | 2026-09-23 | Accepted workspace model v2: membership is trust, souls name where each capability comes from, only packages are versioned, capabilities are copied into instances. | [workspaces](../workspaces.md), [workspace module contracts](2026-09-23-workspace-module-contracts.md) |
62
+ | [Phase 4 — implementing workspace model v2: proposal for the human](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-23-workspace-v2-implementation-plan.md) | 2026-09-23 | Planned the workspace model v2 implementation as ordered work packages replacing canonical kernel code, with no migration and no feature flag. | [workspace module contracts](2026-09-23-workspace-module-contracts.md) |
63
+ | [Desktop Phase F — the Desktop is built FOR workspace model v2](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-24-desktop-phase-f-boundary.md) | 2026-09-24 | The Desktop is rebuilt natively for workspace model v2, reading every deployment fact and making every change through kernel JSON verbs. | [Desktop CLI API](../desktop-cli-api.md#workspace-model-workspaceapi-2), [Desktop design brief](../../packages/desktop/docs/design-brief.md) |
64
+ | [Phase D — the OATS project runs on the architecture it offers (plan)](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-24-phase-d-plan.md) | 2026-09-24 | Planned running the OATS project on workspace model v2, centralising its knowledge, and recorded removing per-version package approval. | [packages](../packages.md#trust), [official catalog](../official-catalog.md) |
65
+ | [Teams contract: several team labels per soul, per-team messaging, live reconciliation](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-25-teams-contract.md) | 2026-09-25 | A soul may carry several team labels, each with its own messaging payload, and the provider reconciles team membership live. | [team model v2](2026-09-27-team-model-v2.md) |
@@ -1,54 +1,23 @@
1
- # Design documents — navigation
2
-
3
- Dated design documents record how decisions were reached and what each implementation slice was bounded to. They are **history with current pointers**: the current architecture is explained in [workspaces](../workspaces.md), [packages](../packages.md), [configuration](../configuration.md), [souls and instances](../souls-and-instances.md), [contracts](../layers.md) and [knowledge theory](../knowledge-theory.md); readiness is stated in the [release notes](../release-notes/). When a dated document and a current page disagree, the current page wins.
4
-
5
- ## Current model — workspace v2 (0.25 line)
6
-
7
- - **[Workspace module contracts (2026-09-23)](2026-09-23-workspace-module-contracts.md) — NORMATIVE for implementation**: `lib/remote.mjs`, `lib/workspace.mjs`, `lib/resolve.mjs`, `lib/packages.mjs` (lock v3), `lib/materialize.mjs`, the CLI verbs and DTOs, the error codes, the Northwind fixture.
8
- - [Simplified workspace model — worked example (2026-09-23)](2026-09-23-simplified-workspace-model.md) — ACCEPTED: one workspace per org, membership = trust, `from:` as location, nothing installed, full per-instance copy, teams as labels, harnesses start normally. The Decision concept is `agents/oats-expert/soul/knowledge/decisions/workspace-model-v2.md`.
9
- - [Implementation plan (2026-09-23)](2026-09-23-workspace-v2-implementation-plan.md) — phases A/B/C, what each deletes.
10
- - Operator-facing: [workspace model](../workspaces.md), [Desktop CLI API — workspace model](../desktop-cli-api.md#workspace-model-workspaceapi-2).
11
- - Open threads (tracked here until closed): the `workspace` work mode still derives its `./work` boundary from the classic `team:` scope; the readiness `enrolled` producer still reads the 0.24 `oats.yaml` backlink; launch configurations / yolo / work-mode setup are still read from a classic config chain.
12
-
13
- ## Superseded by the workspace model
14
-
15
- Everything below this line that describes per-soul `source:` provenance, `oats.yaml` exports/imports, the installed-capability tier (`.agents/capabilities/installed/`), `oats-config.yaml` scopes, `oats init`/`use`/`install`/`restore`/`trust`/`migrate`, lock v1/v2 or ambient-skill exclusion at launch is **history**. In particular `package-engine-contract.md` and `package-runtime-api.md` (both deleted in 0.26) described the removed acquisition/materialization engine; the package tier is now [packages.md](../packages.md) + module contract §4. Capability **manifests**, hooks, the operations contract, provider binding wire/codecs and the knowledge/messaging capability contracts are unchanged.
16
-
17
- ## Earlier plan (0.24)
18
-
19
- - [Redesign program board](2026-09-20-redesign-program-board.md) — status of the 0.24 work streams (knowledge contract, workspace adoption, messaging readiness, official capabilities, marketplace, five souls, centralised knowledge, Desktop).
20
- - [Workspace-first adoption plan (2026-09-20)](2026-09-20-workspace-and-portable-adoption-plan.md) — the 0.24 phase order and distribution work packages (`oats.core`, `oats.setup`, official marketplace).
21
-
22
- ## Portable Souls and Git workspaces — the 0.24 architecture (superseded)
23
-
24
- - [Portable Souls explainer](2026-09-14-portable-souls-explainer.md) — the short version.
25
- - [Portable souls and Git-backed workspaces](2026-09-14-portable-souls-and-git-workspaces.md) — the accepted architecture.
26
- - [Contract amendments (14 Sep)](2026-09-14-portable-souls-contract-amendments.md) · [portable declarations](2026-09-15-portable-declarations.md) · [portable data/digest contract](2026-09-15-portable-data-contract.md) · [source observation](2026-09-15-source-observation.md).
27
- - [Fresh-install-first rollout](2026-09-16-fresh-install-first-rollout.md) · [fresh operator walkthrough](2026-09-16-fresh-operator-walkthrough.md) · [portable onboarding and discovery](2026-09-16-portable-onboarding.md) · [migration evidence](2026-09-16-portable-migration-evidence.md) — the `lib/portable-migration*`, `lib/portable-onboarding-acceptance.mjs` modules and the `portable-onboarding-public` acceptance driver these cite are deleted; each note carries a superseded banner pointing at the [simplified workspace model](2026-09-23-simplified-workspace-model.md).
28
-
29
- ## Retained execution — artifacts, approval, capture (0.24; artifact/approval parts superseded by lock v3)
30
-
31
- - [Artifact retention](2026-09-14-artifact-retention-contract.md) · [selection lock and approval](2026-09-15-selection-lock-and-approval.md) · [captured resolution records](2026-09-15-captured-resolution-records.md).
32
- - [Package preparation](2026-09-15-package-preparation.md) · [command/curriculum preparation](2026-09-16-command-profile-preparation.md) · [prepare request transport](2026-09-16-prepare-request-transport.md) · [public prepare request](2026-09-17-public-prepare-request.md).
33
- - [Captured dispatch](2026-09-15-captured-dispatch.md) · [captured admission](2026-09-16-captured-admission.md) · [retained helper dispatch](2026-09-16-captured-helper-dispatch.md) · [retained launch inputs](2026-09-16-captured-launch-inputs.md).
34
- - [Boundary resources](2026-09-17-portable-boundary-resources.md) · [boundary hookup](2026-09-17-portable-boundary-hookup.md) · [captured native start](2026-09-17-captured-native-start.md) · [public captured start](2026-09-17-public-captured-start.md).
35
- - [Backend parity: tmux and Herdr](2026-09-17-captured-backend-parity.md) · [Herdr protocol compatibility](2026-09-18-herdr-protocol-compatibility.md) · [captured Pi print host](2026-09-18-captured-pi-host.md).
36
- - [First-cut release checklist](2026-09-18-first-cut-release-checklist.md).
37
- - Implementation records: [implementation](2026-09-15-portable-souls-implementation.md) · [handoff](2026-09-15-portable-souls-handoff.md).
38
-
39
- ## Capabilities and providers
40
-
41
- - Package engine contract (`package-engine-contract.md`, removed in 0.26) · package-runtime API (`package-runtime-api.md`, removed in 0.26) — **superseded** (installed tier removed; see [packages](../packages.md)) · [operations contract](operations-contract.md) · [launch configurations](launch-configurations.md).
42
- - [Provider binding wire v1](2026-09-16-provider-binding-wire.md) · [provider binding codecs](2026-09-16-provider-binding-codecs.md) · [capability helper/input contract](2026-09-17-capability-helper-input-contract.md).
43
- - [Knowledge capability contract](2026-09-16-knowledge-capability-contract.md) · [messaging capability contract](2026-09-16-messaging-capability-contract.md).
44
-
45
- ## Knowledge and memory
46
-
47
- - [Knowledge and memory direction](2026-09-13-knowledge-and-memory-direction.md) · [knowledge location contract](2026-09-13-knowledge-location-contract.md) · [knowledge implementation plan](2026-09-13-knowledge-implementation.md) · [OKF mirror provenance](okf-mirror-provenance.md).
48
-
49
- ## Product direction and Desktop
50
-
51
- - [Architecture reassessment](2026-09-07-architecture-reassessment.md) · [expert-assisted deployment](2026-09-08-expert-assisted-deployment-proposal.md).
52
- - [Desktop UX plan](desktop-ux-plan.md) · [souls and capabilities in Desktop](2026-09-07-desktop-souls-capabilities.md) · [mobile management proposal](2026-09-07-mobile-agent-management-proposal.md).
53
-
54
- Adding a design doc: date-prefix it, state its status in the first lines, and add it here under the right theme.
1
+ # Design records
2
+
3
+ Dated records of decisions that are still in force: the context, the decision
4
+ and its consequences. The current behaviour is explained in the reference pages
5
+ ([workspaces](../workspaces.md), [packages](../packages.md),
6
+ [configuration](../configuration.md), [souls and instances](../souls-and-instances.md),
7
+ [capabilities](../capabilities.md), [knowledge](../knowledge.md)); when a record and
8
+ a reference page disagree, the reference page wins. Superseded records are
9
+ deleted; [HISTORY.md](HISTORY.md) lists each one, its decision and its
10
+ successor, with a link to its full text.
11
+
12
+ - [Workspace module contracts](2026-09-23-workspace-module-contracts.md): the
13
+ normative contracts of `lib/remote.mjs`, `lib/workspace.mjs`, `lib/resolve.mjs`,
14
+ `lib/packages.mjs`, `lib/materialize.mjs` and the CLI verbs built on them.
15
+ - [Knowledge and messaging capability contract](2026-09-16-knowledge-capability-contract.md):
16
+ the kernel supplies contracts; capabilities own knowledge and messaging behaviour.
17
+ - [OKF knowledge operations](2026-09-26-okf-knowledge-operations.md): package
18
+ souls, triggers and automations for harvest and maintenance.
19
+ - [Team model v2](2026-09-27-team-model-v2.md): shared teams in the workspace,
20
+ local teams, the default team and membership in each deployment.
21
+
22
+ The Desktop's design brief for designers is in
23
+ [packages/desktop/docs](../../packages/desktop/docs/design-brief.md).