@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
@@ -1,294 +1,82 @@
1
1
  # Implementation reference
2
2
 
3
- The reference implementation publishes two npm packages:
4
-
5
- - **`@awebai/oats`**: runtime-neutral kernel, universal `oats` CLI,
6
- bootstrap skills, instruction sources, and the official package catalog.
7
- - **`@awebai/oats-pi`**: minimal pi adapter for instance-local resource
8
- exposure and memory session events. It registers no agent tools.
9
-
10
- Claude instances consume the generated standard files directly through the
11
- instance home's `.claude/` and `CLAUDE.md` symlinks. OATS does **not** redirect
12
- Claude's config home: an isolated one cannot authenticate, and the operator's
13
- own Claude configuration is deliberately left enabled.
3
+ A map of this repository for contributors. What OATS does is in the
4
+ reference pages ([workspaces](workspaces.md), [souls and instances](souls-and-instances.md),
5
+ [capabilities](capabilities.md)); the normative module contracts are in
6
+ [the workspace module contracts](design/2026-09-23-workspace-module-contracts.md).
7
+
8
+ ## What is published
9
+
10
+ - **`@awebai/oats`**: the runtime-neutral kernel (`lib/`), the `oats` CLI
11
+ (`bin/oats.mjs`), the kernel and work-mode instruction sources
12
+ (`injects/`), the bootstrap skills, the docs and the official package
13
+ catalog (`package-catalog.json`). It has no runtime dependencies.
14
+ - **`@awebai/oats-pi`** (`packages/pi/`): a thin pi adapter that exposes an
15
+ instance's own resources. It registers no agent tools.
16
+ - **`oats.framework`** (`oats-package/`): the `oats.core`, `oats.setup` and
17
+ `oats.knowledge-theory` capabilities and the `knowledge-theory-expert` soul,
18
+ released as a package under its own `oats-framework/v<version>` tags.
19
+
20
+ The OATS Desktop (`packages/desktop/`) is an Electron app with a bundled,
21
+ dependency-free localhost server; it is released with the kernel but not
22
+ published to npm. Its developer docs are in
23
+ [`packages/desktop/README.md`](../packages/desktop/README.md).
14
24
 
15
25
  ## Repository layout
16
26
 
17
- | Path | Purpose |
27
+ | path | contents |
18
28
  |---|---|
19
- | `lib/core.mjs` | Souls, instances, config/target resolver, capability discovery, composition, locks/trust, hooks. |
20
- | `bin/oats.mjs` | Agent lifecycle, config, acquisition/trust/activation, doctor, and operational command dispatch. |
21
- | `capabilities/` | Bundled package copies — core capabilities and others — each with `oats.json`. |
22
- | `skills/` | Kernel/bootstrap and package-authoring skills. |
23
- | `injects/` | Kernel and work-mode instruction sources. |
24
- | `packages/pi/` | Thin pi adapter. |
25
- | `packages/desktop/` | OATS Desktop — the Electron control panel and its bundled zero-dependency backend server (private, not published). |
26
- | `test/` | Capability resolver/composition/security lifecycle tests. |
27
- | `agents/` | The framework's own portable expert souls. |
28
-
29
- Capabilities have two sources and one destination: a member repo's
30
- `capabilities/<name>/` (latest state, trusted by membership) or a package pinned
31
- in the workspace's `packages:` and locked in `oats-lock.json` (v3); at spawn each
32
- is copied whole into the instance's `.oats/modules/<name>/`. Nothing is
33
- installed at a deployment (`lib/remote.mjs`, `lib/workspace.mjs`,
34
- `lib/resolve.mjs`, `lib/packages.mjs`, `lib/materialize.mjs`).
35
-
36
- The live control panel is the OATS Desktop app (`packages/desktop/`): an
37
- Electron shell over a bundled zero-dependency localhost server that uses
38
- plain OATS metadata/files plus git and tmux; no pi APIs cross into the
39
- feature, so the same surface works for pi and Claude instances. (`oats pane`
40
- and the `oats.web` browser panel were retired in its favor.)
41
-
42
- ## Instance layout
43
-
44
- ```text
45
- <agents-root>/<agent>/
46
- soul/
47
- soul.yaml
48
- AGENTS.md # canonical role instructions
49
- CLAUDE.md -> AGENTS.md
50
- skills/ # soul-private skills
51
- instances/<instance>/
52
- AGENTS.md # generated composition (regular file)
53
- CLAUDE.md -> AGENTS.md
54
- .agents/skills/ # exact materialized set
55
- .claude/skills -> ../.agents/skills
56
- work/
57
- TASK.md
58
- instance.json # capabilities, skills, instruction sources, lifecycle metadata
59
- ```
60
-
61
- The knowledge capability's hooks may add memory files. The kernel does not assume
62
- their names.
63
-
64
- ## Resolution
65
-
66
- **Workspace model (0.25, current).** `lib/instance-resolution.mjs#prepareInstance(dir, soul)`
67
- loads `oats-local.yaml`, discovers the workspace over its Git remotes
68
- (`lib/workspace.mjs#discoverWorkspace`, or the standalone view), finds the
69
- soul among the confirmed members / external souls, and calls
70
- `lib/resolve.mjs#resolveSoul` → an immutable Resolution: `modules[]` (each
71
- `from: member|package` with commit and digest), `slots`, merged provider
72
- `payloads`, `skills`, `injects`, `revision`. Capability order is
73
- `defaults.<slot>` ⊕ `defaults.capabilities` ⊕ `defaults.byTeam[team]` ⊕
74
- `soul.capabilities` (soul wins; `off` removes; a soul's `<slot>: none` empties
75
- the slot). `lib/materialize.mjs` then copies every module whole into the home.
76
- The normative contract is
77
- [docs/design/2026-09-23-workspace-module-contracts.md](design/2026-09-23-workspace-module-contracts.md).
78
-
79
- **Classic 0.24 (removed in 0.26.0).** The `oats-config.yaml` chain and its
80
- resolvers are gone. A legacy `oats-config.yaml` between the invocation
81
- directory and the deployment is refused with `E_CONFIG_BROKEN`
82
- (`reason: "legacy-config"`), and the message names the files that replace it.
83
-
84
- ## Spawn composition
85
-
86
- `spawnInstance` resolves against the soul's repository and soul name. It:
87
-
88
- 0. resolves and validates WHERE the home will be created, before any side
89
- effect: the destination must be the agent directory's own `instances/`
90
- child, that agent directory must lie inside this deployment, and a linked
91
- worktree maps to the primary checkout — otherwise `E_NO_CANONICAL_ROOT` and
92
- nothing is created. The check is repeated on the created directory before
93
- anything is written into it. See
94
- [souls-and-instances.md](souls-and-instances.md#deployment-prerequisite-the-agents-directory-must-be-operator-owned)
95
- for the deployment prerequisite this rests on;
96
- 1. calls `composeInstanceAgentsMd` without writing the soul;
97
- 2. writes generated `AGENTS.md` and canonical compatibility symlinks;
98
- 3. copies kernel + soul + active package skill trees into real directories in
99
- one instance-local root, failing duplicate names unless `skill-overrides`
100
- chooses a source;
101
- 4. creates the selected work topology;
102
- 5. runs active hooks in deterministic order; and
103
- 6. records capabilities, settings, trust, skill names/sources, instruction
104
- files, hooks, capability metadata, and forward-only spawn lineage in
105
- `instance.json`.
106
-
107
- Pi launches with `--no-skills --skill <instance-home>/.agents/skills
108
- --no-context-files --no-prompt-templates --append-system-prompt
109
- <instance-home>/AGENTS.md`. The OATS-managed skill set is exactly the composed
110
- one: no user, project, ancestor or package skill catalogs. It is not a claim
111
- that nothing else can reach the session — extensions stay ambient (below), and
112
- what they contribute stays with them.
113
-
114
- After the canonical soul and kernel text, every generated `AGENTS.md` states the
115
- runtime-neutral **home/work boundary** (`injects/instance-boundary.md`) — for
116
- every work mode and for service souls (the post-commit reviewer) alike — immediately before the
117
- work-mode block it frames: `<instance-home>` (`$OATS_INSTANCE_HOME`) holds the
118
- brain, task, provenance and working state, and is where OATS operational/lifecycle
119
- commands are run from — together with the commands of whatever capabilities are
120
- active, `aw` among them when aweb messaging is — since they resolve scope from
121
- the working directory (`--dir <path>` reaches another deliberately); the home
122
- carries no soul link (the composed AGENTS.md holds the soul's instructions, and
123
- hooks receive the recorded soul directory as `OATS_SOUL`); and `<instance-home>/work` is the repository or workspace
124
- view where repository reading, editing, building, testing, git and commits
125
- happen. It bounds *repository* work rather than forbidding all output elsewhere —
126
- episodic state lives in the home, and a service agent's own artifacts (a report
127
- written to a temp file before mailing it) are its role's business. What each mode
128
- actually permits is the work-mode block's call, which follows immediately.
129
-
130
- `--no-context-files` also suppresses the instance's *own* composed `AGENTS.md`,
131
- so that is delivered explicitly; the work tree's `AGENTS.md` stays readable by
132
- the file tools — readable, not auto-injected.
133
-
134
- Pi **extensions stay ambient**: operators run cross-agent extensions (web
135
- search, output formatting) that every instance should keep, so OATS does not
136
- pass `--no-extensions`. The accepted residue is narrow but real — an
137
- extension's `resources_discover` hook can contribute skill paths that survive
138
- `--no-skills`. Today only the OATS bridge does that, and inside an instance it
139
- contributes that instance's own `.agents/skills`, leaving the composed set
140
- unchanged.
141
-
142
- Runtime packages that active capabilities declare (see
143
- [capabilities](capabilities.md)) are verified at spawn and recorded in
144
- `instance.json`; a missing one fails the spawn with the consent command to fix
145
- it, rather than starting an agent whose instructions promise a capability it
146
- does not have. OATS does not resolve their extension entry points — pi owns that
147
- resolution, including globs and conventional directories.
148
-
149
- Claude discovers the same set natively through the instance's `.claude/skills`
150
- symlink, and its composed instructions through `CLAUDE.md -> AGENTS.md`.
151
-
152
- Claude Code's **own configuration stays enabled**: user and project skills,
153
- plugins, settings and `CLAUDE.md` all resolve into an OATS session as they
154
- normally would. That is a deliberate product choice — those mechanisms are
155
- powerful and the operator decides whether to use them; a deployment that wants
156
- only the OATS-composed surface achieves it by configuring everything OATS-side.
157
- So OATS passes no `--setting-sources`, no exclusions, and no synthetic plugin.
158
-
159
- Measured behavior worth knowing when reasoning about an instance: project
160
- skills resolve from the working directory up to the **repository root**, so an
161
- instance homed inside a repository with its own `.claude/skills` sees those
162
- too. Project *settings* — hooks, plugins, permissions, custom agents — resolve
163
- from the instance home rather than from ancestors.
164
-
165
- Codex is available with `--harness codex`. It starts in the instance home,
166
- reads `AGENTS.md` and `.agents/skills` natively, and receives `TASK.md` as its
167
- initial prompt. User configuration, approval policy, ancestor instructions and
168
- ambient skill sources remain native. Worktrees are already below the instance
169
- home; checkout/attached paths outside it use Codex's normal approval handling
170
- and may require approval for writes, depending on the operator's policy.
171
- OATS does not pass `--add-dir`, which Codex refuses under some native policies.
172
- OpenAI-prefixed model preferences are translated to
173
- Codex ids; other provider preferences fall back to its configured default.
174
- The Desktop model field accepts a native id without using Pi's model catalog.
175
- This launch support does not supply an aweb channel for Codex: agents can use
176
- `aw` from their home, with automatic wake delivery tracked separately.
177
-
178
- All harnesses record what they actually expose in `instance.json` under
179
- `composition.materialized.harnessPosture`: the OATS-composed set, what is
180
- curtailed, and what remains ambient. The deviation from strict composition is
181
- auditable rather than implied.
182
-
183
- ## Instructions
184
-
185
- The generated order is:
186
-
187
- 1. canonical soul content;
188
- 2. kernel OATS block;
189
- 3. **home/work boundary block** — runtime-neutral, every mode and every kind;
190
- 4. actual spawn work-mode block;
191
- 5. active capability blocks in resolver order; and
192
- 6. unconditional config blocks outermost to innermost.
193
-
194
- Every generated block carries its source path. `oats doctor --soul <name>` uses
195
- the same composer and prints/returns the final text. Config-dependent prose is
196
- never reconciled into committed souls.
197
-
198
- ## Acquisition and trust
199
-
200
- **Workspace model (0.25, current).** Nothing is installed. `oats sync`
201
- (`lib/packages.mjs#resolvePackages`) resolves every `packages:` entry of
202
- `oats-workspace.yaml` to a commit, computes the package tree's integrity and
203
- writes `oats-lock.json` **lockfileVersion 3** (`packages.<id>: { source, url,
204
- path, version, commit, integrity, capabilities[] }`). A package is trusted by
205
- its declaration in `packages:` (human decision, 2026-09-24); member-tier
206
- capabilities are trusted by membership (decision 2). The lock is
207
- reproducibility: a moved tag or drifted content is `E_PACKAGE_INTEGRITY`, at
208
- spawn the lock's capability list must match what the package declares at the
209
- locked commit, and a spawn uses only packages the workspace still declares. The
210
- verbs `oats install|trust|list|restore|use|migrate` are removed
211
- (`E_UNKNOWN_COMMAND` naming the replacement).
212
-
213
- **Classic 0.24 (removed in 0.26).** The installed tier
214
- (`.agents/capabilities/installed/`, the `lockfileVersion: 2` lock, per-artifact
215
- approval) and its last writer went with the captured path; the
216
- [0.24 release notes](release-notes/v0.24.0.md) describe what it was.
217
-
218
- ## Hooks and scaffold ownership
219
-
220
- Only `soul-scaffold`, `spawn`, and `retire` manifest hooks are accepted. The
221
- kernel no longer runs `soul-scaffold`: it ran when `oats create` wrote a soul,
222
- and souls are now authored in member repositories.
223
- Spawn uses outer-scope then capability-ID order; retire reverses it.
224
- Each hook receives package identity/layer plus structured OATS environment and
225
- may emit a final JSON object containing `meta`, `brief`, `warning`, or `launch`.
226
- Only a spawn hook may add `env`; other lifecycle events reject it rather than
227
- silently discard it. Launch environment is string-only,
228
- size/control-character checked, owned by an unambiguous dotted capability
229
- vendor, and restricted to the manifest's exact trust-visible `environment`
230
- declaration. Capabilities that request this authority must use the stricter
231
- dotted ID form even though capabilities without environment authority retain
232
- the wider namespaced-ID compatibility contract. Explicit and automatic trust
233
- disclose the declaration before persisting authority. Known process-bootstrap
234
- names are denied in depth, not treated as an
235
- exhaustive authority list. Aggregation is deterministic, shell-quoted, and
236
- collision-fatal. It prefixes only the initial runtime command;
237
- values are persisted with that command, so the contract is for non-secret
238
- locators and broker endpoints, never bearer credentials or durable principal
239
- root keys. No restart/replay contract exists. A fatal environment contract error enters
240
- the required-spawn rollback transaction. It runs compensation in reverse,
241
- removes and verifies rollback-owned Git topology, and removes the home only
242
- when cleanup completed. Failed compensation or reported state with no retire
243
- hook uses the same retryable quarantine as every other incomplete spawn.
244
-
245
- ## Commands
246
-
247
- Kernel/package-management commands are always available. Operational
248
- namespaces are discovered from manifest `command`, but dispatch verifies that
249
- `instance.json` or current soul resolution contains the package and that its
250
- locked executable surface is trusted.
251
-
252
- ## Verification
253
-
254
- ```bash
255
- npm test
256
- npm run check
257
- npm run check:pi
258
- npm run validate
259
- npm run validate:okf
260
- npm run pack:check
261
- npm run smoke:tarball
262
- ```
263
-
264
- Pull-request CI runs this matrix on supported Node 22. `validate` compiles both
265
- public JSON schemas, validates clean-contract manifests, parses documented
266
- OATS config examples with the production parser, and checks maintainable public
267
- local links/anchors. `pack:check` dry-runs both npm packages and rejects missing
268
- runtime surfaces or leaked workspace/test state.
269
-
270
- The clean-room smoke test packs both packages, installs their tarballs outside
271
- the checkout, verifies the adapter resolves that installed kernel, runs
272
- `init`/`doctor`, and creates/retires a clean-contract scaffold while checking
273
- exact skills, generated instructions, canonical soul immutability, and
274
- metadata.
275
-
276
- One manual probe is required after every release and before 0.19.0 ships: from
277
- the **published** kernel (not a checkout), install `oats.authoring` into a fresh
278
- scope, activate it for a framework-author soul, and spawn that soul. The spawn
279
- must succeed with `integration-authoring`, `skill-craft`, and `soul-craft`
280
- materialized in the instance's `.agents/skills/`. Framework-hoisted resources
281
- are resolved by path arithmetic against the installed kernel's own layout, so a
282
- source-tree run can pass while every installed deployment fails.
283
-
284
- These deterministic checks deliberately do **not** contact real aweb, Jira, or
285
- Linear services, validate remote git hosting/auth flows, or publish npm
286
- artifacts. Adapter/discovery changes additionally require a disposable real pi
287
- session from the packed artifacts; external services remain credentialed,
288
- out-of-scope probes. Release CI publishes both
289
- packages from one tag; keep versions synchronized because exact pi isolation
290
- depends on both kernel launch and adapter discovery behavior.
291
-
292
- Runtime-neutral token/cost/model/tool telemetry for Control Pane remains a
293
- follow-up; it requires an adapter-neutral event contract rather than pi-specific
294
- inspection in the universal CLI.
29
+ | `bin/oats.mjs` | the CLI: argument parsing, JSON envelopes, the verbs |
30
+ | `lib/` | the kernel (below) |
31
+ | `injects/` | the kernel and work-mode instruction blocks composed into every instance |
32
+ | `skills/` | bootstrap skills shipped with the kernel |
33
+ | `capabilities/` | generated mirrors of released package capabilities (for example `oats-okf*`), checked by `scripts/check-okf-mirror.mjs` |
34
+ | `oats-package/` | the `oats.framework` package |
35
+ | `souls/` | this repository's own souls (a workspace member) |
36
+ | `docs/` | the reference pages, schemas, design records and release notes |
37
+ | `packages/` | the pi adapter, the Desktop, the turn-record package and experiments |
38
+ | `scripts/` | the test runner, validators, packaging checks and the release lane |
39
+ | `test/` | the kernel and CLI suites, with their fixtures |
40
+
41
+ ## Kernel modules
42
+
43
+ | module | owns |
44
+ |---|---|
45
+ | `remote.mjs` | repo refs, reading Git remotes, content digests |
46
+ | `workspace.mjs` | workspace, membership and soul files; discovery |
47
+ | `resolve.mjs` | a soul's resolution: capabilities, slots, provenance |
48
+ | `packages.mjs` | `packages:`, the catalog, `oats sync`, `oats-lock.json` |
49
+ | `materialize.mjs` | copying modules into a home and composing it |
50
+ | `core.mjs` | spawn, retire, sessions, hooks, launch recipes, instance metadata |
51
+ | `instruction-composition.mjs` | the generated `AGENTS.md` |
52
+ | `teams.mjs`, `teams-verbs.mjs` | the team model and the `oats teams` verbs |
53
+ | `schedule.mjs`, `schedule-host.mjs`, `triggers.mjs`, `automations.mjs` | schedules, triggers and the host timer |
54
+ | `operator-dispatch.mjs` | capability commands run from a deployment, and its module store |
55
+ | `instance-*.mjs` | inspection, lifecycle, events and Git views of an instance |
56
+ | `herdr.mjs`, `tmux-config.mjs`, `session-*.mjs` | session backends and terminal input |
57
+ | `capability-contract.mjs`, `provider-binding.mjs` | manifest validation, the hook environment rules, the readiness wire |
58
+ | `servers.mjs` | routing commands to a registered server |
59
+
60
+ The kernel is runtime-neutral: nothing in `lib/` depends on a harness or on
61
+ a provider. Provider behaviour lives in capabilities; the kernel supplies
62
+ their contracts ([layers](layers.md)).
63
+
64
+ ## Tests and gates
65
+
66
+ | command | what it checks |
67
+ |---|---|
68
+ | `npm test` | every suite under `test/` (`node --test`), through `scripts/run-tests.mjs` |
69
+ | `npm run check` | syntax of every shipped file |
70
+ | `npm run check:pi` | the pi adapter's TypeScript |
71
+ | `npm run validate` | the JSON schemas, the example manifests and configs, and every local link and anchor in the public docs |
72
+ | `npm run pack:check` | an `npm pack` dry run of both packages: nothing missing, nothing leaked |
73
+ | `npm run smoke:tarball` | installs the packed tarballs outside the checkout and exercises them |
74
+
75
+ Locally, run the suites your change affects, plus `validate` and `check`; run
76
+ `smoke:tarball` when you change the smoke script or packaging. Pull-request CI
77
+ runs the full suite (sharded), `check`, `validate`, `pack:check` and the smoke
78
+ test, and is the gate. Tests use local bare repositories and fakes; none
79
+ contacts GitHub, aweb, Jira or Linear.
80
+
81
+ Tests pin behaviour, so a change that alters behaviour changes its test in the
82
+ same commit. Never weaken an assertion to make a change pass.