@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
package/docs/packages.md CHANGED
@@ -1,10 +1,11 @@
1
- # Packages — the versioned tier
1
+ # Packages: the versioned tier
2
2
 
3
3
  A **package** is a place to fetch capabilities from *with a version attached*.
4
4
  It is one of the two kinds of capability source in the
5
5
  [workspace model](workspaces.md); the other — a member repo — is never
6
6
  versioned. Nothing is installed: a package is resolved to an exact commit by
7
- `oats sync`, recorded in `oats-lock.json`, and **copied whole into each instance at spawn** (`<home>/.oats/modules/<cap>/`).
7
+ `oats sync`, recorded in `oats-lock.json`, and **copied whole into each
8
+ instance at spawn** (`<home>/.oats/modules/<cap>/`).
8
9
 
9
10
  Ground truth: [`oats-package.schema.json`](oats-package.schema.json) (the
10
11
  package manifest), the [lock v3 format](#lock-v3) below (`validateLock` in
@@ -28,7 +29,7 @@ A Git repository **contains** a package at `oats-package/`:
28
29
 
29
30
  `oats-package.json` must declare `package` and `capabilities` (a list of
30
31
  directories relative to the package root, each holding an `oats.json`). It may
31
- also declare `souls` (0.28.0): soul directories the package ships, see
32
+ also declare `souls`: soul directories the package ships, see
32
33
  [Package souls](#package-souls). A
33
34
  directory entry need not equal the capability's name
34
35
  (`capabilities/oats-okf` → capability `oats.okf`). A package declaring one
@@ -36,22 +37,21 @@ capability name twice, a listed directory without a manifest, or a manifest
36
37
  without `capability` is `E_PACKAGE_MANIFEST`. Catalog entries may name another
37
38
  `path` than `oats-package`; a `git:` ref always reads `oats-package/`.
38
39
 
39
- ## Declaring packages — two forms, in one place
40
+ ## Declaring packages
40
41
 
41
42
  The workspace file's `packages:` map is the **only** list of versions in the
42
43
  whole organisation:
43
44
 
44
45
  ```yaml
45
46
  packages:
46
- oats.framework: v1.1.3 # bare version → the official catalog
47
- oats.okf: v2.1.3
47
+ oats.okf: v4.0.4 # bare version → the official catalog
48
48
  acme.tools: git:github.com/acme/tools@v0.4.0 # direct ref: git:<repo>@<tag or full OID>
49
49
  ```
50
50
 
51
- - **Bare version** (`v2.1.3`, `2.1.3`, `1.0.0-rc.1`): the id is looked up in
51
+ - **Bare version** (`v4.0.4`, `4.0.4`, `1.0.0-rc.1`): the id is looked up in
52
52
  the official catalog — `package-catalog.json` in the `oats` repo, or the file
53
53
  named by `OATS_PACKAGE_CATALOG` — which supplies the repo url, the tag
54
- convention (`v2.1.3` or `oats-framework/v1.1.3`) and the payload path. An id
54
+ convention (`v4.0.4` or `oats-framework/v1.4.0`) and the payload path. An id
55
55
  the catalog does not know is `E_PACKAGE_MISSING` ("use `git:<repo>@<ref>` for
56
56
  a package outside the catalog"). The catalog is the reviewed official list
57
57
  ([official-catalog.md](official-catalog.md)) and the only way a
@@ -74,12 +74,11 @@ members:
74
74
  - git:github.com/acme/agents
75
75
  - git:github.com/acme/platform
76
76
  packages:
77
- oats.framework: v1.3.1
78
- oats.okf: v4.0.0
79
- oats.aweb: v1.16.0
77
+ oats.framework: v1.4.0
78
+ oats.okf: v4.0.4
79
+ oats.aweb: v1.17.1
80
80
  teams:
81
- global: { description: Org-wide }
82
- engineering: { description: Platform }
81
+ platform: { team: "platform:acme.aweb.ai", description: Platform engineering }
83
82
  defaults:
84
83
  capabilities: { oats.core: { from: package } }
85
84
  knowledge: { oats.okf: { from: package } }
@@ -105,11 +104,11 @@ decision recorded in the lock.
105
104
  ```
106
105
  $ oats sync
107
106
  workspace acme (github.com/acme/agents @ 3f2a9c1e)
108
- members agents ✓↔ (@ 3f2a9c1e) platform ✓↔ (@ 77c0a1b2) tools ✓↔ (@ 47f4b816) billing ✗ (no-backlink)
109
- packages acme.tools 0.4.0 ✓ (@ 47f4b816) oats.framework 1.1.3 ✓ (@ 9c3e27aa) oats.okf 2.1.3 ✓ (@ b2e16f2e)
107
+ members agents ✓↔ (@ 3f2a9c1e) platform ✓↔ (@ 77c0a1b2) billing ✗ (no-backlink)
108
+ packages acme.tools 0.4.0 ✓ (@ 47f4b816) oats.okf 4.0.4 ✓ (@ a4ccca02)
110
109
  changed acme.tools — → 0.4.0 (@ 47f4b816)
111
- souls 7 discovered (6 members, 1 external, 0 disabled here) · 0 private capabilities
112
- teams engineering 4 souls, 3 capabilities · global 2 souls, 2 capabilities · unassigned 1 soul
110
+ souls 9 discovered (6 members, 1 external, 2 package, 0 disabled here) · 0 private capabilities
111
+ teams platform (shared) · this deployment's: oats teams
113
112
 
114
113
  lock oats-lock.json
115
114
  ```
@@ -127,16 +126,15 @@ lock oats-lock.json
127
126
  4. writes `oats-lock.json` and reports the diff. Entries dropped from
128
127
  `packages:` are dropped from the lock.
129
128
 
130
- There is **no approval step** (human decision, 2026-09-24): declaring a package
131
- in the workspace's `packages:` is the trust decision, so `sync` asks nothing,
132
- exits `0` on success, and `--approve` is `E_BAD_ARGS`. `--json` emits the
129
+ Declaring a package in the workspace's `packages:` is the trust decision
130
+ ([Trust](#trust)): `sync` asks nothing and exits `0` on success. `--json` emits the
133
131
  `syncApi: 1` envelope documented in
134
132
  [desktop-cli-api.md](desktop-cli-api.md#workspace-model-workspaceapi-2).
135
133
 
136
134
  ## `oats package add | remove`
137
135
 
138
136
  ```bash
139
- oats package add oats.aweb v1.11.2 # a catalog version
137
+ oats package add oats.aweb v1.17.1 # a catalog version
140
138
  oats package add acme.tools git:github.com/acme/tools@v0.4.0
141
139
  oats package remove acme.tools
142
140
  ```
@@ -144,8 +142,8 @@ oats package remove acme.tools
144
142
  Both edit `packages:` in `oats-workspace.yaml` **when the file is tracked by
145
143
  the Git checkout the command runs in** (the workspace host repo); the edit is
146
144
  validated against the full workspace schema before it is written, and the
147
- receipt tells you to commit and `oats sync`. Anywhere else — a deployment folder,
148
- a member clone — the command prints the line to add (`--json`: `edited: false`,
145
+ receipt tells you to commit and `oats sync`. Anywhere else (a deployment folder,
146
+ a member clone) the command prints the line to add (`--json`: `edited: false`,
149
147
  `line`) because the workspace file is shared through Git, not through this
150
148
  machine. Nothing network-bound happens in `package add`; `sync` resolves.
151
149
 
@@ -162,10 +160,10 @@ same workspace commit hold identical locks.
162
160
  "source": "catalog:oats.okf",
163
161
  "url": "https://github.com/awebai/oats-okf.git",
164
162
  "path": "oats-package",
165
- "version": "2.1.3",
166
- "commit": "b2e16f2ea1555be519db76fda30cd0bea06f8609",
167
- "integrity": "sha256-1c34dbe9c1cc3826dbe6ecbafbd9a1e189ed36a74bfb2ba8fb6f46a382e95c2d",
168
- "capabilities": ["oats.okf"]
163
+ "version": "4.0.4",
164
+ "commit": "a4ccca0230b75961daa00f59f29b8264be6fb5e8",
165
+ "integrity": "sha256-…",
166
+ "capabilities": ["oats.okf", "oats.okf-harvest", "oats.okf-maintenance"]
169
167
  },
170
168
  "acme.tools": {
171
169
  "source": "git:github.com/acme/tools@v0.4.0",
@@ -183,31 +181,26 @@ same workspace commit hold identical locks.
183
181
 
184
182
  | field | meaning |
185
183
  |---|---|
186
- | `source` | `catalog:<id>` or `git:<repo key>@<ref>` — how the workspace asked for it |
184
+ | `source` | `catalog:<id>` or `git:<repo key>@<ref>`: how the workspace asked for it |
187
185
  | `url` | the repo url the package was read from; travels in the lock so spawn needs no catalog |
188
186
  | `path` | the package root inside the repo |
189
187
  | `version` | the version string without a leading `v` (a `git:…@<OID>` pin records the OID) |
190
188
  | `commit` | full 40-hex OID the version resolved to |
191
189
  | `integrity` | `sha256-<hex>` content digest of the package tree at `path` |
192
- | `capabilities` | the capability names the package provides (sorted) — what `from: package` looks up |
193
- | `souls` | the package souls (0.28.0), sorted by name: `name`, `path` (inside the package) and `digest` (`sha256-<hex>` of the soul directory); absent when the package ships none |
190
+ | `capabilities` | the capability names the package provides (sorted): what `from: package` looks up |
191
+ | `souls` | the package souls, sorted by name: `name`, `path` (inside the package) and `digest` (`sha256-<hex>` of the soul directory); absent when the package ships none |
194
192
 
195
193
  A capability provided by **two** locked packages is ambiguous and fails
196
194
  closed (`E_PACKAGE_MISSING { ambiguous: [ids] }`): keep one of them in
197
- `packages:`. A lock that is not v3 (a 0.24 lock, an unreadable file) is
198
- `E_LOCK_SCHEMA`; it is never auto-repaired — delete it and `oats sync`. A v3
199
- lock written before 0.26.0 may carry an `approved` record per entry: it is read
200
- with the field ignored, and the next write drops it. The reverse does not hold:
201
- a kernel before 0.26.0 refuses a lock 0.26.0 wrote (`E_LOCK_SCHEMA "approved:
202
- must be null or { executables, at }"`) — keep every kernel that reads one
203
- deployment on 0.26.0 or later. Agents never hand-edit the lock.
195
+ `packages:`. A lock that is not v3, or cannot be read, is `E_LOCK_SCHEMA`; it
196
+ is never repaired automatically: delete it and `oats sync`. Agents never
197
+ hand-edit the lock.
204
198
 
205
199
  ## Trust
206
200
 
207
201
  Member capabilities are trusted by membership; **a package is trusted by its
208
- declaration in the workspace's `packages:`** (human decision, 2026-09-24) —
209
- people install a package only when they trust it, so there is no second,
210
- per-version approval step. The lock is reproducibility, not approval: it pins
202
+ declaration in the workspace's `packages:`**. People declare a package only
203
+ when they trust it, so there is no second, per-version approval step. The lock is reproducibility, not approval: it pins
211
204
  the exact commit and the content integrity, a moved tag or drifted content is
212
205
  `E_PACKAGE_INTEGRITY`, and at spawn the lock's capability list must match what
213
206
  the package declares at the locked commit (`E_PACKAGE_INTEGRITY { why:
@@ -226,7 +219,7 @@ running instance's package module as `moved` once the lock points elsewhere.
226
219
 
227
220
  ## Package souls
228
221
 
229
- A package may ship **souls** as well as capabilities (0.28.0). One pin in
222
+ A package may ship **souls** as well as capabilities. One pin in
230
223
  `packages:` then versions both: nothing drifts, unlike an `external:` soul's
231
224
  commit pin.
232
225
 
@@ -244,7 +237,7 @@ oats-package/
244
237
  the lock entry. A soul without `soul.yaml` or `AGENTS.md`, or whose
245
238
  directory is not a soul name, is `E_PACKAGE_MANIFEST`. On a later sync at
246
239
  the same version the souls must still match (`E_PACKAGE_INTEGRITY { why:
247
- "souls" }`); a lock written before 0.28.0 has its `souls` filled in.
240
+ "souls" }`).
248
241
  - **Listed.** `oats souls` lists a package soul with `kind: "package"`,
249
242
  `package`, `version`, `qualifiedName` and `origin: "package <id>
250
243
  v<version>"`; `oats sync` / `oats workspace status` list each package's
@@ -253,9 +246,9 @@ oats-package/
253
246
  A bare name works when it is unique across member, external and package
254
247
  souls; otherwise `E_SOUL_AMBIGUOUS` names each qualified form
255
248
  (`details.qualified`). A member soul's qualified form is `<member name>/<soul>`.
256
- - **Resolved** like any soul: the workspace and team defaults apply, `off` and
257
- `<slot>: none` work, every `team:` label must be declared (`E_TEAM_UNKNOWN`
258
- in discovery), and `from: here` means **this package** at the locked commit
249
+ - **Resolved** like any soul: the workspace defaults apply, `off` and
250
+ `<slot>: none` work, its teams here are keyed `<package>/<soul>` in
251
+ `oats-local.yaml` `souls.teams`, and `from: here` means **this package** at the locked commit
259
252
  (a capability it does not provide is `E_CAPABILITY_MISSING`).
260
253
  - **Spawned** at the locked commit: the soul is fetched into the per-commit
261
254
  soul cache and its digest must equal the lock's (`E_PACKAGE_INTEGRITY
@@ -285,7 +278,7 @@ oats-package/
285
278
 
286
279
  ## Trigger templates
287
280
 
288
- A package may also ship **trigger templates** (0.28.0): `triggers: [{ id,
281
+ A package may also ship **trigger templates**: `triggers: [{ id,
289
282
  file }]` in `oats-package.json`, each file `{ parameters, definition }`.
290
283
  `oats trigger add --from <package>:<id> --set <name>=<value>` instantiates one
291
284
  at the locked commit; see [schedules.md#triggers](schedules.md#triggers).
@@ -296,7 +289,7 @@ A soul may state floors on package versions — constraints, not sources:
296
289
 
297
290
  ```yaml
298
291
  compatibility:
299
- oats.okf: ">=2.1"
292
+ oats.okf: ">=4.0"
300
293
  ```
301
294
 
302
295
  Checked at resolution against the locked version (`E_COMPATIBILITY`,
@@ -338,23 +331,12 @@ A soul that names one of the package's capabilities with
338
331
  {
339
332
  "policy": "docs/official-catalog.md",
340
333
  "packages": {
341
- "oats.okf": { "url": "https://github.com/awebai/oats-okf.git", "ref": "v2.1.3", "path": "oats-package" },
342
- "oats.framework": { "url": "https://github.com/awebai/oats.git", "ref": "oats-framework/v1.1.3", "path": "oats-package" }
334
+ "oats.okf": { "url": "https://github.com/awebai/oats-okf.git", "ref": "v4.0.4", "path": "oats-package" },
335
+ "oats.framework": { "url": "https://github.com/awebai/oats.git", "ref": "oats-framework/v1.4.0", "path": "oats-package" }
343
336
  }
344
337
  }
345
338
  ```
346
339
 
347
- `ref` carries the tag convention: a workspace's `oats.framework: v1.3.1`
348
- resolves to tag `oats-framework/v1.3.1`. Resolving through the catalog never
349
- advances a lock by itself — `oats sync` does, and
350
- says so.
351
-
352
- ## Removed verbs
353
-
354
- `oats install`, `restore`, `init`, `use`, `trust`, `list`, `catalog`, `remove`,
355
- `migrate`, `config` are gone; each answers `E_UNKNOWN_COMMAND` naming its
356
- replacement (`details.removed` / `details.replacement` in `--json`). There is
357
- no installed-capability directory, no config template adoption, no host
358
- requirement installer. A manifest's `requires` still describes what must exist
359
- on the host (harness packages are verified at spawn; host commands are the
360
- operator's to install).
340
+ `ref` carries the tag convention: a workspace's `oats.framework: v1.4.0`
341
+ resolves to tag `oats-framework/v1.4.0`. Resolving through the catalog never
342
+ advances a lock by itself: `oats sync` does, and says so.
@@ -0,0 +1,61 @@
1
+ # OATS 0.30 close-out: the shared plan
2
+
3
+ The single source of truth for the rest of 0.30, owned by BOTH leads (oats-expert-knowledge-reworks
4
+ and oats-expert-antares; Juan asked for joint work on 2026-09-28). Whoever changes the state updates
5
+ this file.
6
+
7
+ ## Rules
8
+ - One driver per item; the other lead reviews every PR in it.
9
+ - Every developer brief is cc'd to the other lead. No objection within the hour and it stands.
10
+ - Idle agent sessions don't wake on mail: nudge them by tmux when they stall.
11
+
12
+ ## Items
13
+
14
+ | # | Item | Driver | Developer | State |
15
+ |---|---|---|---|---|
16
+ | 1 | oats.aweb 1.17.1: a newcomer's first `--join` (service source, resume, `--name`); `--soul` on operator commands; the `aweb-team-leave-failed` event | Antares | Antares' aweb developer | TAGGED v1.17.1 → 9254e385 (tag object 899408a6); reviewed by the lead; proven in the final rehearsal |
17
+ | 2 | oats.okf 4.0.4: answer the kernel's documented readiness request, from the real host settings; recaptured with the real package | Antares | Antares' okf developer | TAGGED v4.0.4 → a4ccca02 (tag object e1c3827f); rehearsal case 10 PASS 5/5 with the kernel #298 fix |
18
+ | 3 | Kernel: `session start`/`restart` return, print and record the launch hooks' warnings | lead | cli-dev-okf-ops | MERGED #295 → 2049adda |
19
+ | 4 | Desktop #292: `launch-changed` decoding scoped to its code; `at: null`; real captures incl. `default-team-changed` | lead | ux-designer-desktop-redesign | MERGED #292 → 39a03379 |
20
+ | 5 | The 0.30.0 release PR (brief below) | lead | cli-dev-v2-native | briefed |
21
+ | 6 | Full rehearsal re-run on the final heads (all cases, incl. 5 and 10); close-out; retire case 9; the 0.30 runbook for Juan and Pepe | Antares | — | DONE on the final heads (main kernel stamped 0.30.0 + aweb v1.17.1 + okf v4.0.4): all cases PASS (1–8, 10, onboarding (a)–(e) + resume, the BYOT leave/retire owner commands actually run → revoked, 22 clean retires). Known: 8 (E_SPAWN_FAILED), the BYOT membership limit. Runbook for Juan and Pepe: next |
22
+ | 7a | automations.trust (#300, ACKed a0562b9f) + the Desktop grouping of `untrusted` with owner-mismatch (not here, with the remedy; a real-capture test): the Desktop PR merges BEFORE #300. Both land before the tag, or both go to 0.30.1 together | lead | cli-dev-okf-ops + ux-designer-desktop-redesign | routed |
23
+ | 7 | Tag v0.30.0 after green main CI on the exact release SHA | Antares | — | after 5 and 6 |
24
+
25
+ **Sequence:** 1–4 in parallel → 6 on the final heads → 5 with the final pins → 7.
26
+
27
+ ## The release PR (item 5)
28
+ 1. Version 0.30.0 in EVERY package that carries it (root, pi, desktop).
29
+ 2. The `oats.core` / `oats.setup` compat floors AND the check-knowledge-theory floor at `>=0.30.0`,
30
+ in the same commit as the bump.
31
+ 3. The framework v1.4.0 pins (the tag is cut at release).
32
+ 4. The oats.aweb 1.17.1 and oats.okf 4.0.4 mirrors (trees == the tags) and pins. Until those tags
33
+ exist, use placeholders; the PR stays a draft.
34
+ 5. Re-pin the REAL bundled binding-check test to 1.17.1's actual answer (no hand-written payload).
35
+ 6. The Desktop's supported band: `<0.31`.
36
+ 7. Release notes:
37
+ - the team model v2 migration and the flag day, with every setup step as
38
+ `oats aweb setup --soul <soul>`;
39
+ - the teams you control (BYOT) line: a lost team is left automatically on hosted teams; on a team
40
+ you control, the leave is reported with an `aweb-team-leave-failed` event, and the owner
41
+ removes the member;
42
+ - launch preferences (soul `launch:`, `souls.launch`, the frozen record, `--reselect-launch`);
43
+ - automations.trust, if it merged in time: a behaviour change for hosts that ran automations;
44
+ - fixed: second-team joins usable, okf readiness answered, launch warnings shown;
45
+ - the 0.29.4 catalog note (`OATS_PACKAGE_CATALOG`).
46
+ - **Known in 0.30.0** (so nobody is surprised): with no teams configured, spawn refuses through
47
+ the provider (`E_SPAWN_FAILED`), not `E_TEAM_UNCONFIGURED`; capability operator commands run
48
+ from a deployment need `--soul <soul>`; retire of homes whose session is gone (if it misses the
49
+ tag). Each is fixed in 0.30.1.
50
+ 8. A check of the PACKED tarball: its `package-catalog.json` carries oats.engineering 1.1.0,
51
+ oats.aweb 1.17.1 and oats.okf 4.0.4.
52
+
53
+ ## After the tag
54
+ - **Flag day:** the oats.engineering release with the souls' `launch:` (experts on Claude Code +
55
+ Opus 5.5; `code-reviewer` on Codex + Astra; compat `>=0.30.0`), and committing the shared team id.
56
+ - **0.30.1:**
57
+ - the kernel items that miss the tag: retire of homes whose session is gone, automations.trust;
58
+ - deployment-scope capability commands without `--soul`;
59
+ - the case-8 pre-check (`E_TEAM_UNCONFIGURED`).
60
+ - **Parked:** item L (`git rm agents/`, cli-dev-v2-native). It needs the GitHub `workflow` token
61
+ scope from the human on the lead's machine.
@@ -9,6 +9,9 @@ The policy it satisfies: no release capability may permanently depend on
9
9
  GitHub or GitHub Actions. Registry publish works on its own; tags and hosted
10
10
  release assets can follow later.
11
11
 
12
+ The last two sections cover the post-publish Desktop check and mirroring a
13
+ released `oats.okf`.
14
+
12
15
  ## When to use it
13
16
 
14
17
  - **Runner outage.** GitHub Actions is down, queued, or a runner image has
@@ -130,3 +133,77 @@ contract; `test/release-lane.test.mjs` covers the lane's gates and phase
130
133
  logic against fixtures, with `npm` stubbed. The two can run in either order:
131
134
  a lane release followed by a workflow run, or a broken workflow run finished
132
135
  by the lane, and neither republishes what the other already did.
136
+
137
+ ## Desktop release verification
138
+
139
+ Installer CI gates what headless runners can prove reliably for every
140
+ published platform/architecture: electron-builder completes, the expected
141
+ DMG/ZIP/AppImage/DEB artifacts exist, both packaged macOS `.app` bundles
142
+ pass strict deep codesign verification of their complete ad-hoc signatures
143
+ (`codesign --verify --deep --strict`), node-pty's packaged `spawn-helper` is
144
+ executable, and node-pty loads and spawns under the packaged Electron ABI.
145
+ The macOS x64 leg cross-builds on macos-14 and installs Rosetta 2 so that its
146
+ x64 Electron + node-pty ABI probe really executes; a wrong-architecture
147
+ native module fails that leg.
148
+
149
+ CI does **not** gate the packaged GUI launch: ad-hoc-signed, non-notarized
150
+ Electron apps do not
151
+ have a reliable interactive windowserver in headless CI. Post-publish launch
152
+ acceptance is therefore owned by the operator/maintainer, using the actual
153
+ released installers (not a source checkout):
154
+
155
+ 1. Verify the asset checksum/attestation, install it outside the source tree,
156
+ and on macOS use right-click → **Open** for the Gatekeeper step (ad-hoc
157
+ signatures carry no identified-developer identity).
158
+ 2. Launch OATS Desktop and open a real deployment; verify roster, brain and
159
+ Markdown reads.
160
+ 3. Attach an existing tmux terminal, confirm input/output, and close the tab
161
+ (the durable tmux window must survive).
162
+ 4. Verify the released global CLI is detected and Spawn is enabled; hide or
163
+ mismatch the CLI and confirm reads/terminal still work while Spawn disables
164
+ with recovery guidance.
165
+ 5. Repeat per published architecture where hardware is available. In
166
+ particular, launch-check macOS x64 on an Intel Mac if one is available;
167
+ CI's Rosetta ABI probe is the native-module proof, while this is the actual
168
+ shipped-installer/user-launch proof.
169
+
170
+ Record the installed version, platform/architecture and outcome in the
171
+ release verification notes. This post-publish check is acceptance — it does
172
+ not weaken the pre-publish build/inventory/ABI gates.
173
+
174
+ ## Mirroring a released `oats.okf`
175
+
176
+ The standalone `awebai/oats-okf` repository is authoritative. This repository
177
+ carries a generated mirror of its capabilities under `capabilities/oats-okf*/`
178
+ and the inventory `scripts/okf-source-inventory.json`; neither is edited by
179
+ hand. After an okf release is tagged:
180
+
181
+ 1. Check out the release in a clean clone of `awebai/oats-okf` at the tagged
182
+ commit, with the tag present locally and `origin` pointing at the official
183
+ repository.
184
+ 2. From this repository:
185
+
186
+ ```bash
187
+ node scripts/check-okf-mirror.mjs --finalize --source <clone> \
188
+ --final-tag v<version> --final-commit <full merged commit id>
189
+ node scripts/check-okf-mirror.mjs --verify
190
+ node scripts/check-okf-mirror.mjs --verify-source --source <clone>
191
+ ```
192
+
193
+ 3. Pin the same version in `package-catalog.json` and `oats-workspace.yaml`,
194
+ update the version literals the tests and smoke script carry, and review
195
+ the diff as one PR.
196
+
197
+ `--finalize` stamps `release.status: published` only when every check passes:
198
+ the tag is exactly `v<package version>` and resolves to the given commit; the
199
+ source tree is clean, with no masked index entries; the exported files, modes
200
+ and symlink targets equal the raw objects at that commit; `origin` is the
201
+ official repository, and a fresh `ls-remote` advertises the same tag object
202
+ and commit. A failed check leaves the mirror and inventory untouched.
203
+
204
+ `--verify` needs no network: it checks the checked-in mirror against the
205
+ inventory (file set, bytes, modes, symlinks, wrapper hashes). `--verify-source`
206
+ re-checks a published inventory against the source and its origin; it attests
207
+ what the remote advertised when queried, so released tags must never move.
208
+ `--generate --source <clone>` captures a working tree for development and
209
+ always records `release.status: pending`.
@@ -1,11 +1,13 @@
1
1
  # oats.framework 1.1.3 · aweb 1.11.2 — helper composition for every edition
2
2
 
3
- Packaging fix found by the independent second operator on the 0.24.4 wave: behind the operator's `responsibleHuman` requirement, preparation refused with `needs-configuration: new helper injection requires an explicit capability policy`. `oats.okf` had adopted the helper-injection contract (`omit`); its siblings **`oats.core`** and **`oats.aweb`** shipped an `inject` without a `helperInjection` policy, so no edition's OKF harvest helper could compose and **no edition could publish a resolution**. Both remaining blockers were packaging, not operator input.
3
+ Packaging fix: `oats.core` and `oats.aweb` shipped an `inject` without a
4
+ `helperInjection` policy, so preparation refused with `needs-configuration: new
5
+ helper injection requires an explicit capability policy`, no edition's OKF
6
+ harvest helper could compose, and no edition could publish a resolution.
4
7
 
5
- - **`oats.core` 1.0.1** (in oats.framework 1.1.3): `helperInjection: {version: 1, mode: inherit}` — a helper is still an OATS instance and keeps the "you run on OATS" briefing.
6
- - **aweb 1.11.2**: `helperInjection: {version: 1, mode: omit}` — a harvest helper has no messaging identity. Manifest-only; code identical to 1.11.0.
7
- - **Release check**: `test/release-packaging.test.mjs` now asserts every framework-shipped capability with an `inject` declares a `helperInjection` policy; the theory-package check pins core's `inherit`. The framework's own packages must pass the contracts the kernel imposes.
8
- - Catalog: `oats.aweb` → `v1.11.2`, `oats.framework` → `oats-framework/v1.1.3`; six editions and workspace imports repinned.
9
- - Still open (kernel, 0.25 unless a 0.24.5 is cut): this early refusal is a bare top-level error with no `details`/attribution — it must route through the same problem shape as every other preparation problem. Also noted: `responsibleHuman` is a captured accountability claim the code validates only by shape.
10
-
11
- Decision: `agents/oats-expert/soul/knowledge/decisions/helper-injection-policy-on-every-injecting-capability.md`.
8
+ - **`oats.core` 1.0.1** (in oats.framework 1.1.3): `helperInjection: {version:
9
+ 1, mode: inherit}`; a helper keeps the "you run on OATS" briefing.
10
+ - **aweb 1.11.2**: `helperInjection: {version: 1, mode: omit}`; a harvest
11
+ helper has no messaging identity. Manifest-only.
12
+ - Catalog: `oats.aweb` → `v1.11.2`, `oats.framework` →
13
+ `oats-framework/v1.1.3`; six editions and workspace imports repinned.