@awebai/oats 0.29.3 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +12 -6
  2. package/bin/oats.mjs +203 -54
  3. package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
  4. package/capabilities/oats-aweb/injects/aweb.md +1 -1
  5. package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
  6. package/capabilities/oats-aweb/oats.json +5 -12
  7. package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
  8. package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
  9. package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
  10. package/capabilities/oats-code-review/injects/reviewer.md +26 -0
  11. package/capabilities/oats-code-review/oats.json +16 -0
  12. package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
  13. package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
  14. package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
  15. package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
  16. package/capabilities/oats-developer/injects/developer.md +38 -0
  17. package/capabilities/oats-developer/oats.json +17 -0
  18. package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
  19. package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
  20. package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
  21. package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
  22. package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
  23. package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
  24. package/capabilities/oats-engineering-expert/oats.json +17 -0
  25. package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
  26. package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
  27. package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
  28. package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
  29. package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
  30. package/capabilities/oats-okf/bin/oats-okf.mjs +16 -9
  31. package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
  32. package/capabilities/oats-okf/lib/config.mjs +2 -1
  33. package/capabilities/oats-okf/lib/consult.mjs +26 -4
  34. package/capabilities/oats-okf/lib/harvest-switch.mjs +16 -3
  35. package/capabilities/oats-okf/lib/inspection.mjs +26 -7
  36. package/capabilities/oats-okf/lib/io.mjs +9 -1
  37. package/capabilities/oats-okf/lib/sources.mjs +34 -3
  38. package/capabilities/oats-okf/lib/stores.mjs +8 -6
  39. package/capabilities/oats-okf/lib/worker.mjs +7 -17
  40. package/capabilities/oats-okf/oats.json +6 -3
  41. package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
  42. package/capabilities/oats-okf-harvest/oats.json +3 -3
  43. package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
  44. package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +37 -16
  45. package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
  46. package/capabilities/oats-okf-maintenance/lib/provenance.mjs +6 -1
  47. package/capabilities/oats-okf-maintenance/oats.json +2 -2
  48. package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +17 -2
  49. package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
  50. package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
  51. package/capabilities/oats-workspace-experts/oats.json +9 -0
  52. package/docs/capabilities.md +160 -171
  53. package/docs/capability-manifest.schema.json +7 -10
  54. package/docs/configuration.md +213 -64
  55. package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
  56. package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
  57. package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
  58. package/docs/design/2026-09-27-team-model-v2.md +116 -0
  59. package/docs/design/2026-09-28-automations-trust.md +38 -0
  60. package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
  61. package/docs/design/HISTORY.md +65 -0
  62. package/docs/design/README.md +23 -54
  63. package/docs/desktop-cli-api.md +1787 -1777
  64. package/docs/desktop.md +30 -91
  65. package/docs/execution-targets.md +146 -292
  66. package/docs/first-team.md +31 -17
  67. package/docs/implementation.md +76 -288
  68. package/docs/integrations.md +118 -320
  69. package/docs/knowledge-capability-authoring.md +25 -52
  70. package/docs/knowledge-reference/acceptance.md +3 -3
  71. package/docs/knowledge-reference/adoption.md +1 -1
  72. package/docs/knowledge-reference/harvester.md +2 -2
  73. package/docs/knowledge-reference/package-craft.md +3 -3
  74. package/docs/knowledge-reference/provider-mapping.md +3 -6
  75. package/docs/knowledge-reference/reader-capture.md +3 -3
  76. package/docs/knowledge-theory.md +62 -166
  77. package/docs/knowledge.md +225 -404
  78. package/docs/layers.md +42 -97
  79. package/docs/oats-local.schema.json +58 -5
  80. package/docs/oats-membership.schema.json +1 -8
  81. package/docs/oats-package.schema.json +5 -5
  82. package/docs/oats-workspace.schema.json +8 -22
  83. package/docs/official-catalog.md +25 -28
  84. package/docs/packages.md +45 -63
  85. package/docs/plans/0.30-close-out.md +61 -0
  86. package/docs/release-lane.md +77 -0
  87. package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
  88. package/docs/release-notes/v0.19.0.md +48 -147
  89. package/docs/release-notes/v0.19.1.md +2 -3
  90. package/docs/release-notes/v0.19.3.md +2 -15
  91. package/docs/release-notes/v0.20.0.md +0 -15
  92. package/docs/release-notes/v0.22.0.md +71 -138
  93. package/docs/release-notes/v0.22.1.md +42 -90
  94. package/docs/release-notes/v0.22.10.md +1 -1
  95. package/docs/release-notes/v0.22.11.md +1 -47
  96. package/docs/release-notes/v0.22.12.md +4 -13
  97. package/docs/release-notes/v0.22.13.md +1 -42
  98. package/docs/release-notes/v0.22.14.md +3 -11
  99. package/docs/release-notes/v0.22.15.md +1 -46
  100. package/docs/release-notes/v0.22.16.md +6 -8
  101. package/docs/release-notes/v0.22.18.md +1 -99
  102. package/docs/release-notes/v0.22.19.md +3 -14
  103. package/docs/release-notes/v0.22.2.md +6 -15
  104. package/docs/release-notes/v0.22.3.md +0 -1
  105. package/docs/release-notes/v0.22.4.md +1 -14
  106. package/docs/release-notes/v0.22.5.md +2 -12
  107. package/docs/release-notes/v0.22.6.md +0 -3
  108. package/docs/release-notes/v0.23.0.md +9 -25
  109. package/docs/release-notes/v0.23.1.md +9 -25
  110. package/docs/release-notes/v0.23.2.md +2 -4
  111. package/docs/release-notes/v0.24.0.md +56 -97
  112. package/docs/release-notes/v0.24.1.md +7 -11
  113. package/docs/release-notes/v0.24.10.md +34 -45
  114. package/docs/release-notes/v0.24.11.md +12 -20
  115. package/docs/release-notes/v0.24.12.md +35 -48
  116. package/docs/release-notes/v0.24.13.md +34 -41
  117. package/docs/release-notes/v0.24.2.md +9 -13
  118. package/docs/release-notes/v0.24.3.md +7 -11
  119. package/docs/release-notes/v0.24.4.md +6 -6
  120. package/docs/release-notes/v0.24.5.md +6 -10
  121. package/docs/release-notes/v0.24.6.md +2 -5
  122. package/docs/release-notes/v0.24.7.md +46 -75
  123. package/docs/release-notes/v0.24.8.md +58 -96
  124. package/docs/release-notes/v0.24.9.md +38 -54
  125. package/docs/release-notes/v0.25.0.md +59 -76
  126. package/docs/release-notes/v0.25.1.md +57 -81
  127. package/docs/release-notes/v0.25.2.md +51 -70
  128. package/docs/release-notes/v0.25.3.md +11 -13
  129. package/docs/release-notes/v0.25.4.md +9 -13
  130. package/docs/release-notes/v0.25.5.md +3 -5
  131. package/docs/release-notes/v0.25.6.md +20 -29
  132. package/docs/release-notes/v0.25.7.md +5 -7
  133. package/docs/release-notes/v0.25.8.md +26 -39
  134. package/docs/release-notes/v0.26.0.md +175 -646
  135. package/docs/release-notes/v0.27.0.md +4 -5
  136. package/docs/release-notes/v0.27.1.md +4 -6
  137. package/docs/release-notes/v0.27.2.md +1 -1
  138. package/docs/release-notes/v0.28.0.md +57 -124
  139. package/docs/release-notes/v0.29.0.md +89 -208
  140. package/docs/release-notes/v0.29.1.md +1 -1
  141. package/docs/release-notes/v0.29.2.md +3 -4
  142. package/docs/release-notes/v0.29.4.md +90 -0
  143. package/docs/release-notes/v0.30.0.md +205 -0
  144. package/docs/schedules.md +280 -349
  145. package/docs/servers.md +99 -117
  146. package/docs/soul.schema.json +2 -9
  147. package/docs/souls-and-instances.md +145 -158
  148. package/docs/workspaces.md +132 -215
  149. package/lib/automations.mjs +28 -6
  150. package/lib/core.mjs +226 -74
  151. package/lib/instance-events.mjs +1 -1
  152. package/lib/instance-inspect.mjs +109 -34
  153. package/lib/instance-lifecycle.mjs +14 -1
  154. package/lib/instance-resolution.mjs +26 -27
  155. package/lib/launch-preference.mjs +87 -0
  156. package/lib/materialize.mjs +3 -3
  157. package/lib/packages.mjs +2 -5
  158. package/lib/resolve.mjs +29 -87
  159. package/lib/schedule.mjs +32 -18
  160. package/lib/teams-verbs.mjs +195 -0
  161. package/lib/teams.mjs +190 -0
  162. package/lib/triggers.mjs +53 -17
  163. package/lib/workspace.mjs +54 -147
  164. package/package-catalog.json +9 -15
  165. package/package.json +1 -1
  166. package/skills/oats-getting-started/SKILL.md +25 -13
  167. package/capabilities/oats-review/injects/review.md +0 -69
  168. package/capabilities/oats-review/oats.json +0 -10
  169. package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
  170. package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
  171. package/docs/conventions.md +0 -90
  172. package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
  173. package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
  174. package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
  175. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
  176. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
  177. package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
  178. package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
  179. package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
  180. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
  181. package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
  182. package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
  183. package/docs/design/2026-09-15-captured-dispatch.md +0 -127
  184. package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
  185. package/docs/design/2026-09-15-package-preparation.md +0 -100
  186. package/docs/design/2026-09-15-portable-data-contract.md +0 -121
  187. package/docs/design/2026-09-15-portable-declarations.md +0 -189
  188. package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
  189. package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
  190. package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
  191. package/docs/design/2026-09-15-source-observation.md +0 -119
  192. package/docs/design/2026-09-16-captured-admission.md +0 -77
  193. package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
  194. package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
  195. package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
  196. package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
  197. package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
  198. package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
  199. package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
  200. package/docs/design/2026-09-16-portable-onboarding.md +0 -179
  201. package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
  202. package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
  203. package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
  204. package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
  205. package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
  206. package/docs/design/2026-09-17-captured-native-start.md +0 -58
  207. package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
  208. package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
  209. package/docs/design/2026-09-17-public-captured-start.md +0 -108
  210. package/docs/design/2026-09-17-public-prepare-request.md +0 -90
  211. package/docs/design/2026-09-18-captured-pi-host.md +0 -205
  212. package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
  213. package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
  214. package/docs/design/2026-09-20-redesign-program-board.md +0 -142
  215. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
  216. package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
  217. package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
  218. package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
  219. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
  220. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
  221. package/docs/design/2026-09-24-phase-d-plan.md +0 -305
  222. package/docs/design/2026-09-25-teams-contract.md +0 -258
  223. package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
  224. package/docs/design/desktop-ux-plan.md +0 -362
  225. package/docs/design/launch-configurations.md +0 -168
  226. package/docs/design/okf-mirror-provenance.md +0 -105
  227. package/docs/design/operations-contract.md +0 -141
  228. package/docs/oats-member.schema.json +0 -38
  229. package/skills/integration-authoring/SKILL.md +0 -84
  230. package/skills/oats-support/SKILL.md +0 -79
  231. package/skills/skill-craft/SKILL.md +0 -109
  232. package/skills/soul-craft/SKILL.md +0 -116
@@ -0,0 +1,116 @@
1
+ # Team model v2: shared and local teams, the default team, and membership per deployment
2
+
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
+
5
+ ## Why
6
+
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.
8
+
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.
10
+
11
+ ## The model (option B)
12
+
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.
14
+
15
+ ### Where it lives
16
+
17
+ Committed `oats-workspace.yaml` (shared teams only; edited by PR):
18
+
19
+ ```yaml
20
+ teams:
21
+ oats: { team: oats:example.aweb.ai } # a shared team: the same provider id for everyone
22
+ ```
23
+
24
+ Local `oats-local.yaml` (the deployment's per-machine file, never committed):
25
+
26
+ ```yaml
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
37
+ ```
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.
63
+
64
+ ### At spawn, and live
65
+
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
+
74
+ ```
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]
80
+ ```
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).