@awebai/oats 0.25.9 → 0.26.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 (177) hide show
  1. package/README.md +8 -6
  2. package/bin/oats.mjs +576 -1714
  3. package/capabilities/oats-authoring/oats-package.json +2 -2
  4. package/capabilities/oats-authoring/oats.json +2 -2
  5. package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +46 -25
  6. package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +13 -6
  7. package/capabilities/oats-aweb/bin/oats-aweb.mjs +279 -93
  8. package/capabilities/oats-aweb/injects/aweb.md +7 -2
  9. package/capabilities/oats-aweb/lib/binding-wire.mjs +89 -13
  10. package/capabilities/oats-aweb/lib/captured-native.mjs +1 -1
  11. package/capabilities/oats-aweb/lib/grant-custody.mjs +38 -0
  12. package/capabilities/oats-aweb/oats.json +8 -4
  13. package/capabilities/oats-jira/bin/oats-jira.mjs +4 -4
  14. package/capabilities/oats-jira/oats.json +2 -2
  15. package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +6 -3
  16. package/capabilities/oats-linear/bin/oats-linear-hook.mjs +6 -4
  17. package/capabilities/oats-linear/oats.json +2 -2
  18. package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +6 -0
  19. package/capabilities/oats-review/oats.json +3 -2
  20. package/docs/capabilities.md +218 -47
  21. package/docs/capability-manifest.schema.json +13 -4
  22. package/docs/configuration.md +17 -5
  23. package/docs/conventions.md +16 -26
  24. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +1 -1
  25. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +3 -3
  26. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +2 -2
  27. package/docs/design/2026-09-15-portable-souls-handoff.md +2 -2
  28. package/docs/design/2026-09-15-portable-souls-implementation.md +1 -1
  29. package/docs/design/2026-09-20-redesign-program-board.md +2 -2
  30. package/docs/design/2026-09-23-workspace-module-contracts.md +1 -1
  31. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +1 -1
  32. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +34 -1
  33. package/docs/design/2026-09-24-phase-d-plan.md +57 -0
  34. package/docs/design/2026-09-25-teams-contract.md +226 -0
  35. package/docs/design/README.md +3 -3
  36. package/docs/design/launch-configurations.md +20 -16
  37. package/docs/design/operations-contract.md +27 -10
  38. package/docs/desktop-cli-api.md +537 -261
  39. package/docs/desktop-instance-start.md +1 -1
  40. package/docs/desktop.md +7 -13
  41. package/docs/execution-targets.md +16 -18
  42. package/docs/first-team.md +14 -17
  43. package/docs/implementation.md +28 -59
  44. package/docs/integrations.md +64 -33
  45. package/docs/knowledge-capability-authoring.md +1 -1
  46. package/docs/knowledge-reference/package-craft.md +10 -8
  47. package/docs/knowledge-theory.md +1 -1
  48. package/docs/knowledge.md +10 -11
  49. package/docs/layers.md +16 -17
  50. package/docs/oats-local.schema.json +29 -1
  51. package/docs/oats-membership.schema.json +5 -3
  52. package/docs/oats-package.schema.json +2 -2
  53. package/docs/oats-workspace.schema.json +1 -1
  54. package/docs/{official-marketplace.md → official-catalog.md} +15 -16
  55. package/docs/packages.md +75 -52
  56. package/docs/release-notes/v0.22.0.md +1 -1
  57. package/docs/release-notes/v0.23.1.md +1 -1
  58. package/docs/release-notes/v0.26.0.md +670 -0
  59. package/docs/schedules.md +48 -126
  60. package/docs/soul.schema.json +11 -4
  61. package/docs/souls-and-instances.md +56 -43
  62. package/docs/workspaces.md +80 -58
  63. package/injects/instance-boundary.md +1 -1
  64. package/injects/work-attached.md +1 -1
  65. package/injects/work-workspace.md +2 -2
  66. package/lib/{portable-files.mjs → bounded-read.mjs} +6 -6
  67. package/lib/{portable-values.mjs → canonical-json.mjs} +3 -12
  68. package/lib/capability-contract.mjs +110 -0
  69. package/lib/config-data.mjs +2 -2
  70. package/lib/core.mjs +700 -4824
  71. package/lib/digest.mjs +12 -0
  72. package/lib/instance-inspect.mjs +396 -0
  73. package/lib/instance-lifecycle.mjs +3 -4
  74. package/lib/instance-resolution.mjs +212 -26
  75. package/lib/instruction-composition.mjs +0 -20
  76. package/lib/materialize.mjs +6 -4
  77. package/lib/operator-dispatch.mjs +33 -13
  78. package/lib/packages.mjs +25 -190
  79. package/lib/provider-binding.mjs +4 -2
  80. package/lib/provider-reasons.mjs +3 -68
  81. package/lib/resolve.mjs +204 -68
  82. package/lib/schedule.mjs +97 -272
  83. package/lib/servers.mjs +13 -13
  84. package/lib/{portable-shape.mjs → shape.mjs} +4 -3
  85. package/lib/tree-copy.mjs +44 -0
  86. package/lib/workspace.mjs +125 -20
  87. package/package-catalog.json +6 -6
  88. package/package.json +1 -1
  89. package/skills/integration-authoring/SKILL.md +48 -40
  90. package/skills/oats-getting-started/SKILL.md +105 -110
  91. package/skills/oats-support/SKILL.md +2 -2
  92. package/skills/soul-craft/SKILL.md +13 -6
  93. package/bin/oats-pi-sdk-host.mjs +0 -17
  94. package/docs/2026-09-03-architecture-proposal.md +0 -642
  95. package/docs/artifact-approvals.schema.json +0 -7
  96. package/docs/captured-invocation-context.schema.json +0 -7
  97. package/docs/captured-resolution.schema.json +0 -7
  98. package/docs/design/package-engine-contract.md +0 -813
  99. package/docs/design/package-runtime-api.md +0 -588
  100. package/docs/desktop-succession.md +0 -57
  101. package/docs/execution-capsule.schema.json +0 -108
  102. package/docs/first-team-demo.md +0 -92
  103. package/docs/knowledge-migration.md +0 -147
  104. package/docs/migration-from-oas.md +0 -103
  105. package/docs/oats-config.schema.json +0 -172
  106. package/docs/oats-lock-v3.schema.json +0 -7
  107. package/docs/oats-lock.schema.json +0 -175
  108. package/docs/operating-team-migration.md +0 -470
  109. package/docs/portable.schema.json +0 -2512
  110. package/docs/provider-check-input.schema.json +0 -7
  111. package/docs/rebuild-to-v2.md +0 -511
  112. package/docs/workspace-adoption.md +0 -74
  113. package/injects/framework-workspace.md +0 -7
  114. package/injects/local-soul.md +0 -19
  115. package/injects/oats-portable.md +0 -20
  116. package/injects/oats.md +0 -11
  117. package/injects/portable-instance-boundary.md +0 -39
  118. package/injects/portable-work-directory.md +0 -29
  119. package/lib/artifact-approvals.mjs +0 -120
  120. package/lib/artifact-tree.mjs +0 -141
  121. package/lib/capability-artifacts.mjs +0 -179
  122. package/lib/capability-execution.mjs +0 -15
  123. package/lib/capability-inputs.mjs +0 -39
  124. package/lib/capability-provenance.mjs +0 -231
  125. package/lib/captured-action-shape.mjs +0 -21
  126. package/lib/captured-admission-shape.mjs +0 -20
  127. package/lib/captured-binding-file.mjs +0 -36
  128. package/lib/captured-dispatch.mjs +0 -66
  129. package/lib/captured-instance-index.mjs +0 -277
  130. package/lib/captured-invocation-context.mjs +0 -130
  131. package/lib/captured-launch-request.mjs +0 -66
  132. package/lib/captured-operation-process.mjs +0 -15
  133. package/lib/captured-pi-custody.mjs +0 -29
  134. package/lib/captured-pi-host.mjs +0 -167
  135. package/lib/captured-pi-outcome.mjs +0 -172
  136. package/lib/captured-resolutions.mjs +0 -275
  137. package/lib/captured-scaffold.mjs +0 -87
  138. package/lib/captured-selector.mjs +0 -28
  139. package/lib/captured-session-backend.mjs +0 -52
  140. package/lib/captured-source-receipt-file.mjs +0 -72
  141. package/lib/helper-injection-policy.mjs +0 -104
  142. package/lib/legacy-lock-codec.mjs +0 -106
  143. package/lib/manifest-settings.mjs +0 -84
  144. package/lib/package-closure.mjs +0 -48
  145. package/lib/package-materialization.mjs +0 -83
  146. package/lib/pi-sdk-host.mjs +0 -229
  147. package/lib/portable-artifacts.mjs +0 -115
  148. package/lib/portable-choices.mjs +0 -82
  149. package/lib/portable-composition.mjs +0 -136
  150. package/lib/portable-digest.mjs +0 -105
  151. package/lib/portable-identity.mjs +0 -40
  152. package/lib/portable-lock.mjs +0 -117
  153. package/lib/portable-onboarding-request.mjs +0 -49
  154. package/lib/portable-onboarding.mjs +0 -256
  155. package/lib/portable-package-preparation.mjs +0 -188
  156. package/lib/portable-policy.mjs +0 -44
  157. package/lib/portable-soul.mjs +0 -42
  158. package/lib/portable-state.mjs +0 -80
  159. package/lib/prepare-composition.mjs +0 -170
  160. package/lib/prepared-bindings.mjs +0 -92
  161. package/lib/prepared-resources.mjs +0 -127
  162. package/lib/provider-binding-broker.mjs +0 -65
  163. package/lib/provider-binding-wire.mjs +0 -116
  164. package/lib/readiness.mjs +0 -225
  165. package/lib/repository-observation.mjs +0 -226
  166. package/lib/resolution-shape.mjs +0 -393
  167. package/lib/schedule-capsule.mjs +0 -206
  168. package/lib/soul-constraints.mjs +0 -40
  169. package/lib/source-projection.mjs +0 -84
  170. package/lib/source-spec.mjs +0 -189
  171. package/lib/workspace-definition.mjs +0 -126
  172. package/lib/workspace-discovery.mjs +0 -146
  173. package/skills/oats/SKILL.md +0 -162
  174. package/skills/oats-config/SKILL.md +0 -164
  175. package/skills/oats-packages/SKILL.md +0 -184
  176. package/skills/oats-portable/SKILL.md +0 -115
  177. package/skills/oats-portable-artifacts/SKILL.md +0 -63
@@ -1,18 +1,27 @@
1
1
  ---
2
2
  name: oats-getting-started
3
3
  description: >-
4
- How to set up OATS (Open Agent Team Specification) in a workspace from scratch —
5
- install the CLI/pi adapter, choose fundamental-layer integrations and shared
6
- capabilities, create oats-config.yaml, and create/spawn the first specialized
7
- agent. Use for "get started with OATS", "set up/install/adopt OATS", "create
8
- my first agent", or "how do I start using OATS".
4
+ How to start with OATS (Open Agent Team Specification) from nothing — install
5
+ the CLI and pi adapter, decide which repository hosts the organisation's
6
+ workspace, write the three shared declarations (oats-workspace.yaml,
7
+ oats-membership.yaml, souls/<name>/soul.yaml), realize the workspace on this
8
+ machine with `oats onboard` and spawn the first soul. Use
9
+ for "get started with OATS", "set up/install/adopt OATS", "create my first
10
+ agent", or "how do I start using OATS".
9
11
  ---
10
12
 
11
13
  # Getting started with OATS
12
14
 
13
- OATS gives a workspace durable specialized **souls**, disposable **instances**,
14
- and targetable **capability packages**. Do not run setup blindly: present each
15
- default and ask the user before writing config or spawning agents.
15
+ OATS gives an organisation durable **souls** (role definitions kept in Git),
16
+ disposable **instances** (a soul at work, in its own home) and **capabilities**
17
+ (skills, instructions and hooks copied whole into each instance at spawn). One
18
+ **workspace** per organisation lists the repositories that belong to it. Do not
19
+ run setup blindly: explain each decision and ask before writing a file,
20
+ declaring a package or spawning.
21
+
22
+ This skill is the one pre-workspace bootstrap. Once the first instance exists,
23
+ the `oats.setup` capability's skills (and the `oats-operator-expert` soul, where
24
+ the workspace offers it) carry the rest; spawned instances get their own skills.
16
25
 
17
26
  ## 1. Install
18
27
 
@@ -21,139 +30,125 @@ npm install -g @awebai/oats
21
30
  pi install npm:@awebai/oats-pi
22
31
  ```
23
32
 
24
- The CLI/kernel is runtime-neutral. The pi adapter supplies only minimal runtime
25
- glue. Install matching versions and upgrade both packages together. Exact pi
26
- isolation needs the kernel's launch flags and the changed adapter's
27
- instance-only discovery. Reload pi after installing or upgrading the adapter.
28
-
29
- This skill is the one pre-workspace ambient bootstrap. Spawned instances
30
- receive exact local skills.
31
-
32
- ## 2. Choose scope
33
-
34
- `oats-config.yaml` can live at:
33
+ Install matching versions and upgrade both together (`oats update`). Reload pi
34
+ after installing or upgrading the adapter. Check with `oats version`.
35
35
 
36
- - laptop (`~/oats-config.yaml`): defaults for governed workspaces;
37
- - workspace: shared multi-repo policy; or
38
- - repository: repo-specific policy.
36
+ ## 2. Decide where the workspace is hosted — first
39
37
 
40
- Ask which scope the user intends. `oats init` detects home as laptop, a `.git`
41
- root as repository, and another directory as workspace.
38
+ The workspace file names every member repository, so whoever can read it sees
39
+ the member list. Ask:
42
40
 
43
- ## 3. Present fundamental-layer defaults
41
+ - **Does the organisation already have an OATS workspace?** Then skip to step 4
42
+ with its repository reference.
43
+ - **Is any repository that will join private?** Then the workspace file lives
44
+ in a private repository that is not itself a public member (a dedicated
45
+ `<org>/workspace` repository is the honest shape). Otherwise any member,
46
+ often a dedicated `agents` repository, can host it.
44
47
 
45
- Knowledge, messaging, and tasks remain formal, exclusive slots. Their
46
- implementations are capability packages called integrations.
48
+ Every member runs its capabilities' hooks on every operator's machine, gated
49
+ only by membership. In a mixed public/private organisation keep executable
50
+ capabilities in packages or private members, and only souls in public members.
47
51
 
48
- | Layer | Default | Gives | Needs |
49
- |---|---|---|---|
50
- | knowledge | `oats.okf` | soul OKF bundle, instance memory, harvest | nothing |
51
- | messaging | `oats.aweb` | instance identity and team messaging | `aw` CLI |
52
- | tasks | none | choose Jira, Linear, or another integration | provider-specific |
52
+ ## 3. Write the shared declarations (in Git, reviewed like code)
53
53
 
54
- Present these defaults to the user and ask before creating config. Common
55
- choices: disable messaging for a solo repo; choose `oats.linear`/`oats.jira` for
56
- tasks; use `--raw` for all layers off. Official integrations are acquired like
57
- any other package; `oats init` acquires the selected ones into this scope's
58
- installed/ store (locked). Executable surfaces (like OKF's harvest) need
59
- `oats trust` before use — acquisition never grants executable trust. In an
60
- interactive terminal with no layer flags, bare `oats init` prompts per layer;
61
- through an agent, always pass explicit flags.
54
+ In the host repository, `oats-workspace.yaml`:
62
55
 
63
- If the user keeps aweb messaging: declare the team in the deployment scope's
64
- config (`team:` with a name; see the oats-config skill), then run
65
- `oats aweb setup` — it checks the `aw` CLI, the aweb workspace at the team
66
- scope, and team membership, and prints exactly the one next step each time
67
- (including first-ever aweb account creation via `aw init`). Users who have
68
- never used aweb just follow its prompts; nothing else is required.
69
-
70
- Also ask whether they want normal mouse/trackpad scrolling in tmux agent
71
- windows. Pass the answer explicitly when commands run through an agent, because
72
- that shell is non-interactive:
73
-
74
- ```bash
75
- oats init --tmux-mouse
76
- oats init --messaging none --tmux-mouse
77
- oats init --raw --knowledge oats.okf --no-tmux-mouse
78
- oats init --tasks oats.linear --tmux-mouse
56
+ ```yaml
57
+ schemaVersion: 2
58
+ name: acme
59
+ members:
60
+ - git:github.com/acme/agents # the host is a member too
61
+ - git:github.com/acme/platform
62
+ packages:
63
+ oats.framework: v1.1.3 # bare versions resolve through the official catalog
64
+ oats.okf: v2.1.5
65
+ teams:
66
+ global: { description: Org-wide souls }
67
+ defaults:
68
+ capabilities: { oats.core: { from: package } }
69
+ knowledge: { oats.okf: { from: package } }
79
70
  ```
80
71
 
81
- The scrolling option appends `set -g mouse on` to the existing `~/.tmux.conf`
82
- or XDG tmux config and reloads a running server; it never changes terminal
83
- keyboard mappings. An interactive terminal prompts when neither tmux flag is
84
- provided.
72
+ Take the current package versions from the official catalog
73
+ (`package-catalog.json` in the OATS repository); ask which slots the user wants
74
+ filled (knowledge, messaging, tasks) instead of copying the example. No absolute
75
+ paths, accounts or team ids go in this file.
85
76
 
86
- `init` activates only packages explicitly represented by the layer choices;
87
- it acquires the chosen layer capabilities into this scope's installed/ store, and does not activate anything else.
77
+ Declaring a package in `packages:` is the decision to trust it: its commands
78
+ and hooks run on every machine that spawns a soul using it. Show the user what
79
+ each package runs (its capability manifests' `commands` and `hooks`) before
80
+ adding its pin.
88
81
 
89
- ## 4. Decide shared capability targets
82
+ In **every** member repository, including the host, `oats-membership.yaml`:
90
83
 
91
- Ask whether reusable non-layer capabilities should apply to:
84
+ ```yaml
85
+ schemaVersion: 2
86
+ workspace: git:github.com/acme/agents
87
+ team: global
88
+ ```
92
89
 
93
- - every soul governed by this config (`global`);
94
- - an explicit agent type (family — souls opt in via `type:` in soul.yaml); or
95
- - one soul.
90
+ Membership is reciprocal: the workspace lists the repository and the
91
+ repository names the workspace back. Neither alone is membership.
96
92
 
97
- Do not invent agent types before the souls are known. Example after agents exist:
93
+ A soul lives at `souls/<name>/` in a member repository: `soul.yaml`,
94
+ `AGENTS.md` (its canonical instructions) and `CLAUDE.md -> AGENTS.md`.
98
95
 
99
96
  ```yaml
100
- agent-types:
101
- developers:
102
- description: Agents that build the product
103
- capabilities:
104
- additive:
105
- vendor.code-review:
106
- from: installed
107
- agent-types:
108
- developers: true
97
+ schemaVersion: 2
98
+ name: backend-expert
99
+ description: Owns backend architecture and implementation.
100
+ work: worktree # worktree | checkout | directory | workspace
109
101
  ```
110
102
 
111
- External packages must be acquired/locked before activation; executable
112
- commands, hooks, and launch-environment authority need explicit trust. The
113
- minimal first-time sequence — this skill is the only one available before the
114
- first spawn, so it carries the bootstrap commands directly:
103
+ A soul says where each extra capability comes from (`{ from: package }`,
104
+ `{ from: here }` or `{ from: <member repo key> }`), never a version. A soul
105
+ whose knowledge slot is filled by `oats.okf` also needs `okf.json` beside
106
+ `soul.yaml`; `docs/knowledge.md` in the OATS repository shows its shape.
107
+ Commit and push; OATS reads members over their remotes, not from local clones.
108
+
109
+ ## 4. Realize the workspace on this machine
110
+
111
+ Ask the user **which directory** holds this machine's deployment — usually the
112
+ folder that already holds their clones. There is no required name.
115
113
 
116
114
  ```bash
117
- oats install <git-url|path> --dir /path/to/workspace # acquire + exact-lock; inactive
118
- oats trust vendor.code-review --dir /path/to/workspace # approve executable surfaces
119
- oats use vendor.code-review --type developers --dir /path/to/workspace
115
+ oats onboard <dir> --workspace git:github.com/acme/agents
120
116
  ```
121
117
 
122
- Acquisition never means activation and never silently updates a lock. Never
123
- hand-edit `oats-lock.json` or installed stores — the CLI owns them. Anything
124
- beyond this bootstrap (updates, removal, lock restore/migration,
125
- requirements, package diagnosis) belongs to the `oats-packages` skill — part
126
- of the kernel baseline inside spawned instances; in this pre-workspace
127
- context use docs/packages.md and the top-level `oats help` output.
118
+ It writes `<dir>/oats-local.yaml` (the one per-machine file, never committed)
119
+ and `agents/`, confirms each member, resolves and locks the packages, and prints
120
+ the next steps. Fix any member that is not confirmed (`oats workspace status` says why) before going on.
128
121
 
129
- ## 5. Verify
122
+ Host-owned settings a package asks for (absolute paths, state directories) go
123
+ under `settings:` in `oats-local.yaml`, never in the workspace file. For
124
+ `oats.okf` that is `bindings-file` and `state-dir`; its own skill explains the
125
+ bindings file.
126
+
127
+ ## 5. Sync after any change
130
128
 
131
129
  ```bash
132
- oats doctor /path/to/context --json
130
+ oats sync --dir <dir> # resolve every pin to a commit, fetch, verify integrity, write oats-lock.json
133
131
  ```
134
132
 
135
- After creating a soul, use `--soul <name>` to inspect its exact capabilities,
136
- skills, trust, and final generated `AGENTS.md` before spawn.
133
+ Run it after any change to the workspace file. It asks nothing; the lock pins
134
+ each package to an exact commit and integrity, and content that no longer
135
+ matches is refused (`E_PACKAGE_INTEGRITY`). Member capabilities come from
136
+ membership.
137
+
138
+ ## 6. Spawn the first soul
137
139
 
138
- ## 6. Create and spawn the first specialist
140
+ A soul with `work: worktree | checkout` needs a clone of its repository at
141
+ `<dir>/<repo name>` (or named in `oats-local.yaml` `clones:`).
139
142
 
140
143
  ```bash
141
- mkdir -p agents
142
- oats create backend-expert --description "Owns backend architecture and implementation" --work worktree
143
- # Optional: --type <agent-type> joins a declared family so typed config targets apply.
144
- # Edit agents/backend-expert/soul/AGENTS.md: durable role, boundaries, workflow.
145
- oats doctor . --soul backend-expert
144
+ oats souls --dir <dir> # what the workspace offers, with origin and team
145
+ oats spawn backend-expert --preview # modules, commits, merged provider settings — nothing created
146
146
  oats spawn backend-expert --task "First concrete task"
147
147
  oats status
148
148
  ```
149
149
 
150
- The committed soul stays config-independent. Spawn generates instance
151
- instructions and materializes only kernel + soul + active capability skills in
152
- that instance. Do not put deployment-specific package prose into the soul.
153
-
154
- Create/spawn only when asked. Suggest a team shape, then let the user decide.
155
- For operations load the `oats` skill; for local deployment policy and
156
- config-template adoption use `oats-config`; package acquisition/locks/trust beyond the
157
- bootstrap above belong to `oats-packages` (kernel baseline inside spawned
158
- instances); for custom layer/package work use `integration-authoring`; for
159
- deep architecture or bugs use `oats-support`.
150
+ Create and spawn only when asked. After the first spawn, load the `oats.setup`
151
+ skills for the rest of the deployment (messaging, more souls, rebuilds). For
152
+ custom capabilities and integrations, use `integration-authoring`; for deep
153
+ architecture questions or bugs, use `oats-support`. The model in full is
154
+ `docs/workspaces.md` in the OATS repository.
@@ -2,7 +2,7 @@
2
2
  name: oats-support
3
3
  description: >-
4
4
  Route deep OATS framework questions to the framework's own expert agent.
5
- Use when a user asks how OATS works beyond the basics in the oats skill, why
5
+ Use when a user asks how OATS works beyond the basics in the oats-operate skill, why
6
6
  the framework behaves a certain way, wants framework changes or roadmap
7
7
  context, or hits framework bugs — the answer is to instantiate the
8
8
  oats-expert soul from the OATS framework repo and delegate. Triggers: "ask
@@ -74,6 +74,6 @@ harvests the instance's notes back into the expert's soul.
74
74
  ## Scope note
75
75
 
76
76
  Quick questions (home layout, roster, lifecycle, doctor) are already
77
- answered by the **oats** skill — use that first. Delegate to the expert for
77
+ answered by the **oats-operate** skill (the `oats.core` capability) — use that first. Delegate to the expert for
78
78
  architecture, design rationale, roadmap, and anything you would otherwise
79
79
  guess about.
@@ -28,7 +28,7 @@ real CLAUDE.md file diverging from AGENTS.md, that's a defect: merge and relink)
28
28
  |---|---|---|
29
29
  | **AGENTS.md** | always | Role, boundaries, the default workflow, memory pointers — only what applies to *every* session |
30
30
  | **skills/** | on demand (description match) | Domain workflows, repeatable procedures ("how") — see `skill-craft` |
31
- | **knowledge/** | on demand (index-first) | Facts, decisions, lessons ("what/why") — format per the knowledge integration (default okf) |
31
+ | **knowledge/** | on demand (index-first) | Facts, decisions, lessons ("what/why") — format per the knowledge capability (default okf) |
32
32
 
33
33
  The test for every AGENTS.md line: **"would removing this cause mistakes in
34
34
  most sessions?"** No → move it to a skill or a knowledge concept, or cut it.
@@ -53,7 +53,7 @@ Structure that works (keep the whole thing short — a screen or two):
53
53
  "run the tests").
54
54
  4. **Memory pointers.** Where its knowledge and state live (knowledge base
55
55
  index, STATE.md discipline). Point, don't duplicate — the protocol lives
56
- with your knowledge integration (default okf: the memory-harvest skill).
56
+ with your knowledge capability (default okf: the memory-harvest skill).
57
57
  5. **Escalation.** When to stop and ask the human or coordinator: the
58
58
  human-gate triggers (security, authz, migrations, contract breaks),
59
59
  plus "report to your spawner, don't self-fix" for infrastructure faults.
@@ -73,10 +73,17 @@ Style rules (from the agents.md standard + field experience):
73
73
 
74
74
  ## soul.yaml
75
75
 
76
- Keep honest: `repo` (what it works on), `work` (worktree for builders,
77
- checkout for reviewers/coordinators), `runtime`, `model` (only pin when the
78
- role needs a specific one — reviewers on a different model than authors),
79
- `description` (one line; shows in rosters and pickers).
76
+ Keep honest: `description` (one line; shows in rosters and pickers), `work`
77
+ (`worktree` for builders, `checkout` for reviewers/coordinators, `directory`
78
+ or `workspace` where the role needs them), and the capabilities the role
79
+ actually uses (`capabilities: { <cap>: { from: package | here | <repo key> } }`,
80
+ plus `knowledge` / `messaging` / `tasks` slots; `none` empties one). The
81
+ soul lives in its member repository, which is also what it works on.
82
+
83
+ Runtime, model and permission bypass are not soul fields: they are chosen at
84
+ spawn (`--runtime`, `--model`, `--yolo`) or by a host's named launch
85
+ configuration, so the same soul runs on any harness a host provides. Check a
86
+ soul with `oats spawn <soul> --preview` before committing it.
80
87
 
81
88
  ## Maintaining a soul
82
89
 
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env node
2
- /** Explicit kernel-owned print adapter; not an alternate interpretation of Pi CLI. */
3
- import { recordCapturedPiExit, runCapturedPiSdkHost } from "../lib/captured-pi-host.mjs";
4
-
5
- try {
6
- const argv = process.argv.slice(2);
7
- process.exitCode = argv[0] === "--oats-pi-record-exit" ? recordCapturedPiExit(argv) : await runCapturedPiSdkHost(argv);
8
- } catch (error) {
9
- // Never echo arbitrary SDK/helper/provider error objects: those can contain
10
- // native auth material. Native print mode owns its ordinary safe diagnostics.
11
- const known = new Set(["E_PI_HOST_ARGS", "E_PI_HOST_SELECTION", "E_PI_HOST_MODEL", "E_PI_HOST_TASK", "E_PI_HOST_SDK", "E_PI_HOST_CURRICULUM", "E_PI_HOST_HISTORY", "E_PI_HOST_CUSTODY", "E_PI_HOST_RECORD_UNAVAILABLE", "E_PI_HOST_OUTCOME"]);
12
- const code = known.has(error?.code) ? error.code : "E_PI_HOST_FAILED";
13
- console.error(process.argv[2] === "--oats-pi-record-exit"
14
- ? `${code}: captured Pi process observation refused or failed; completion evidence remains held`
15
- : `${code}: captured Pi host refused or failed; use the selected harness's native setup for model/auth prerequisites`);
16
- process.exitCode = 1;
17
- }