@awebai/oats 0.25.9 → 0.27.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 (183) hide show
  1. package/README.md +8 -6
  2. package/bin/oats.mjs +648 -1755
  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 +229 -58
  21. package/docs/capability-manifest.schema.json +29 -9
  22. package/docs/configuration.md +17 -5
  23. package/docs/conventions.md +18 -28
  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 +604 -271
  39. package/docs/desktop-instance-start.md +3 -3
  40. package/docs/desktop.md +7 -13
  41. package/docs/execution-targets.md +16 -18
  42. package/docs/first-team.md +15 -18
  43. package/docs/implementation.md +31 -62
  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 +30 -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 +76 -53
  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/release-notes/v0.27.0.md +100 -0
  60. package/docs/schedules.md +54 -132
  61. package/docs/servers.md +4 -4
  62. package/docs/soul.schema.json +11 -4
  63. package/docs/souls-and-instances.md +60 -47
  64. package/docs/workspaces.md +80 -58
  65. package/injects/instance-boundary.md +2 -2
  66. package/injects/work-attached.md +1 -1
  67. package/injects/work-workspace.md +2 -2
  68. package/lib/{portable-files.mjs → bounded-read.mjs} +6 -6
  69. package/lib/{portable-values.mjs → canonical-json.mjs} +3 -12
  70. package/lib/capability-contract.mjs +110 -0
  71. package/lib/config-data.mjs +2 -2
  72. package/lib/core.mjs +947 -5023
  73. package/lib/deprecation.mjs +24 -0
  74. package/lib/digest.mjs +12 -0
  75. package/lib/instance-inspect.mjs +397 -0
  76. package/lib/instance-lifecycle.mjs +3 -4
  77. package/lib/instance-resolution.mjs +212 -26
  78. package/lib/instruction-composition.mjs +0 -20
  79. package/lib/materialize.mjs +6 -4
  80. package/lib/operator-dispatch.mjs +33 -13
  81. package/lib/packages.mjs +25 -190
  82. package/lib/process-group.mjs +1 -1
  83. package/lib/provider-binding.mjs +4 -2
  84. package/lib/provider-reasons.mjs +3 -68
  85. package/lib/remote.mjs +1 -1
  86. package/lib/resolve.mjs +204 -68
  87. package/lib/schedule.mjs +136 -292
  88. package/lib/servers.mjs +70 -38
  89. package/lib/{portable-shape.mjs → shape.mjs} +4 -3
  90. package/lib/tree-copy.mjs +44 -0
  91. package/lib/workspace.mjs +132 -20
  92. package/package-catalog.json +6 -6
  93. package/package.json +1 -1
  94. package/packages/record/lib/session-roots.mjs +8 -6
  95. package/skills/integration-authoring/SKILL.md +48 -40
  96. package/skills/oats-getting-started/SKILL.md +105 -110
  97. package/skills/oats-support/SKILL.md +2 -2
  98. package/skills/soul-craft/SKILL.md +13 -6
  99. package/bin/oats-pi-sdk-host.mjs +0 -17
  100. package/docs/2026-09-03-architecture-proposal.md +0 -642
  101. package/docs/artifact-approvals.schema.json +0 -7
  102. package/docs/captured-invocation-context.schema.json +0 -7
  103. package/docs/captured-resolution.schema.json +0 -7
  104. package/docs/design/package-engine-contract.md +0 -813
  105. package/docs/design/package-runtime-api.md +0 -588
  106. package/docs/desktop-succession.md +0 -57
  107. package/docs/execution-capsule.schema.json +0 -108
  108. package/docs/first-team-demo.md +0 -92
  109. package/docs/knowledge-migration.md +0 -147
  110. package/docs/migration-from-oas.md +0 -103
  111. package/docs/oats-config.schema.json +0 -172
  112. package/docs/oats-lock-v3.schema.json +0 -7
  113. package/docs/oats-lock.schema.json +0 -175
  114. package/docs/operating-team-migration.md +0 -470
  115. package/docs/portable.schema.json +0 -2512
  116. package/docs/provider-check-input.schema.json +0 -7
  117. package/docs/rebuild-to-v2.md +0 -511
  118. package/docs/workspace-adoption.md +0 -74
  119. package/injects/framework-workspace.md +0 -7
  120. package/injects/local-soul.md +0 -19
  121. package/injects/oats-portable.md +0 -20
  122. package/injects/oats.md +0 -11
  123. package/injects/portable-instance-boundary.md +0 -39
  124. package/injects/portable-work-directory.md +0 -29
  125. package/lib/artifact-approvals.mjs +0 -120
  126. package/lib/artifact-tree.mjs +0 -141
  127. package/lib/capability-artifacts.mjs +0 -179
  128. package/lib/capability-execution.mjs +0 -15
  129. package/lib/capability-inputs.mjs +0 -39
  130. package/lib/capability-provenance.mjs +0 -231
  131. package/lib/captured-action-shape.mjs +0 -21
  132. package/lib/captured-admission-shape.mjs +0 -20
  133. package/lib/captured-binding-file.mjs +0 -36
  134. package/lib/captured-dispatch.mjs +0 -66
  135. package/lib/captured-instance-index.mjs +0 -277
  136. package/lib/captured-invocation-context.mjs +0 -130
  137. package/lib/captured-launch-request.mjs +0 -66
  138. package/lib/captured-operation-process.mjs +0 -15
  139. package/lib/captured-pi-custody.mjs +0 -29
  140. package/lib/captured-pi-host.mjs +0 -167
  141. package/lib/captured-pi-outcome.mjs +0 -172
  142. package/lib/captured-resolutions.mjs +0 -275
  143. package/lib/captured-scaffold.mjs +0 -87
  144. package/lib/captured-selector.mjs +0 -28
  145. package/lib/captured-session-backend.mjs +0 -52
  146. package/lib/captured-source-receipt-file.mjs +0 -72
  147. package/lib/helper-injection-policy.mjs +0 -104
  148. package/lib/legacy-lock-codec.mjs +0 -106
  149. package/lib/manifest-settings.mjs +0 -84
  150. package/lib/package-closure.mjs +0 -48
  151. package/lib/package-materialization.mjs +0 -83
  152. package/lib/pi-sdk-host.mjs +0 -229
  153. package/lib/portable-artifacts.mjs +0 -115
  154. package/lib/portable-choices.mjs +0 -82
  155. package/lib/portable-composition.mjs +0 -136
  156. package/lib/portable-digest.mjs +0 -105
  157. package/lib/portable-identity.mjs +0 -40
  158. package/lib/portable-lock.mjs +0 -117
  159. package/lib/portable-onboarding-request.mjs +0 -49
  160. package/lib/portable-onboarding.mjs +0 -256
  161. package/lib/portable-package-preparation.mjs +0 -188
  162. package/lib/portable-policy.mjs +0 -44
  163. package/lib/portable-soul.mjs +0 -42
  164. package/lib/portable-state.mjs +0 -80
  165. package/lib/prepare-composition.mjs +0 -170
  166. package/lib/prepared-bindings.mjs +0 -92
  167. package/lib/prepared-resources.mjs +0 -127
  168. package/lib/provider-binding-broker.mjs +0 -65
  169. package/lib/provider-binding-wire.mjs +0 -116
  170. package/lib/readiness.mjs +0 -225
  171. package/lib/repository-observation.mjs +0 -226
  172. package/lib/resolution-shape.mjs +0 -393
  173. package/lib/schedule-capsule.mjs +0 -206
  174. package/lib/soul-constraints.mjs +0 -40
  175. package/lib/source-projection.mjs +0 -84
  176. package/lib/source-spec.mjs +0 -189
  177. package/lib/workspace-definition.mjs +0 -126
  178. package/lib/workspace-discovery.mjs +0 -146
  179. package/skills/oats/SKILL.md +0 -162
  180. package/skills/oats-config/SKILL.md +0 -164
  181. package/skills/oats-packages/SKILL.md +0 -184
  182. package/skills/oats-portable/SKILL.md +0 -115
  183. package/skills/oats-portable-artifacts/SKILL.md +0 -63
@@ -1,5 +1,5 @@
1
1
  {
2
- "policy": "docs/official-marketplace.md",
2
+ "policy": "docs/official-catalog.md",
3
3
  "packages": {
4
4
  "oats.okf": {
5
5
  "url": "https://github.com/awebai/oats-okf.git",
@@ -8,27 +8,27 @@
8
8
  },
9
9
  "oats.aweb": {
10
10
  "url": "https://github.com/awebai/oats-aweb.git",
11
- "ref": "v1.12.1",
11
+ "ref": "v1.13.1",
12
12
  "path": "oats-package"
13
13
  },
14
14
  "oats.jira": {
15
15
  "url": "https://github.com/awebai/oats-jira.git",
16
- "ref": "v1.0.0",
16
+ "ref": "v1.0.1",
17
17
  "path": "oats-package"
18
18
  },
19
19
  "oats.linear": {
20
20
  "url": "https://github.com/awebai/oats-linear.git",
21
- "ref": "v1.0.0",
21
+ "ref": "v1.0.1",
22
22
  "path": "oats-package"
23
23
  },
24
24
  "oats.authoring": {
25
25
  "url": "https://github.com/awebai/oats-authoring.git",
26
- "ref": "v1.0.0",
26
+ "ref": "v1.0.3",
27
27
  "path": "oats-package"
28
28
  },
29
29
  "oats.dev": {
30
30
  "url": "https://github.com/awebai/oats-dev.git",
31
- "ref": "v1.0.0",
31
+ "ref": "v1.0.1",
32
32
  "path": "oats-package"
33
33
  },
34
34
  "oats.framework": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awebai/oats",
3
- "version": "0.25.9",
3
+ "version": "0.27.0",
4
4
  "description": "OATS (Open Agent Team Specification) — durable souls, disposable instances, targetable capability packages, and the runtime-neutral oats CLI/kernel.",
5
5
  "keywords": [
6
6
  "agents",
@@ -16,7 +16,9 @@ export function sourceSessionEnvironment(home, base = process.env) {
16
16
  }
17
17
  const recipe = meta?.launch;
18
18
  if (recipe !== undefined) {
19
- if (!recipe || recipe.version !== 1 || !["claude", "pi", "codex"].includes(recipe.runtime)) {
19
+ // Version 1 (a 0.26.0 home) names the harness `runtime`; version 2 `harness`.
20
+ const harness = recipe?.version === 2 ? recipe.harness : recipe?.version === 1 ? recipe.runtime : undefined;
21
+ if (!recipe || !["claude", "pi", "codex"].includes(harness)) {
20
22
  throw new Error("cannot resolve source transcript roots: unsupported recorded launch recipe");
21
23
  }
22
24
  for (const layer of [recipe.hooks?.env, recipe.env]) {
@@ -32,7 +34,7 @@ export function sourceSessionEnvironment(home, base = process.env) {
32
34
  }
33
35
  // Pi also supports a direct session-directory override. Do not certify
34
36
  // default roots when native options direct evidence somewhere else.
35
- if (recipe.runtime === "pi") {
37
+ if (harness === "pi") {
36
38
  const args = recipe.args ?? [];
37
39
  if (!Array.isArray(args) || args.some((a) => typeof a !== "string")) throw new Error("cannot resolve source transcript roots: invalid launch arguments");
38
40
  for (let i = 0; i < args.length; i++) {
@@ -69,13 +71,13 @@ export function nativeDirectory(value, { home = homedir(), cwd = process.cwd(),
69
71
  /** Native execution-side locations, without existence filtering. Unlike a
70
72
  * background observer scan, Claude's native default is exactly ~/.claude,
71
73
  * not every .claude* profile found under an observer's HOME. */
72
- export function nativeLaunchLocations(runtime, { cwd, env = process.env, args = [] } = {}) {
74
+ export function nativeLaunchLocations(harness, { cwd, env = process.env, args = [] } = {}) {
73
75
  const home = env.HOME || homedir();
74
76
  if (!isAbsolute(home)) throw new Error("native launch HOME must be absolute");
75
77
  if (!Array.isArray(args) || args.some(a => typeof a !== "string")) throw new Error("invalid native launch arguments");
76
- if (runtime === "claude") return [join(nativeDirectory(env.CLAUDE_CONFIG_DIR || join(home, ".claude"), { home, cwd }), "projects")];
77
- if (runtime === "codex") return [join(nativeDirectory(env.CODEX_HOME || join(home, ".codex"), { home, cwd }), "sessions")];
78
- if (runtime !== "pi") throw new Error("unsupported native record runtime");
78
+ if (harness === "claude") return [join(nativeDirectory(env.CLAUDE_CONFIG_DIR || join(home, ".claude"), { home, cwd }), "projects")];
79
+ if (harness === "codex") return [join(nativeDirectory(env.CODEX_HOME || join(home, ".codex"), { home, cwd }), "sessions")];
80
+ if (harness !== "pi") throw new Error("unsupported native record harness");
79
81
  let sessionDir = env.PI_CODING_AGENT_SESSION_DIR;
80
82
  for (let i = 0; i < args.length; i++) {
81
83
  const arg = args[i];
@@ -3,7 +3,7 @@ name: integration-authoring
3
3
  description: >-
4
4
  Route custom OATS capability-package and integration work to the framework's
5
5
  integrations expert. Use when building, adapting, or debugging a reusable
6
- capability, new task/messaging/knowledge integration, oats.json manifest,
6
+ capability, new tasks/messaging/knowledge core capability, oats.json manifest,
7
7
  lifecycle hook, or operational command—not merely activating an existing
8
8
  package. Triggers: "custom integration", "capability package", "integrate
9
9
  our tracker", "new messaging integration", "write an oats.json".
@@ -12,65 +12,73 @@ description: >-
12
12
  # Capability and integration authoring — delegate
13
13
 
14
14
  A capability package may ship skills, instance instructions, requirements,
15
- namespaced commands, and approved hooks. An integration is the constrained
16
- subtype implementing exactly one fundamental layer. Building either requires
15
+ namespaced commands, and declared hooks. A core capability is the constrained
16
+ kind that fills one of the knowledge, messaging or tasks positions (its
17
+ manifest's `layer` field names which). Building either requires
17
18
  manifest, security, targeting-boundary, collision, and probe discipline; use
18
19
  the framework's **integrations-expert** soul rather than improvising.
19
20
 
20
- If the user only wants an existing package, use:
21
+ If the user only wants an existing package, declare it and give it to souls;
22
+ no build is needed:
21
23
 
22
- ```bash
23
- oats install <source> # external acquisition + exact lock; inactive
24
- oats trust <id> # only if commands/hooks exist
25
- oats use <id> --global|--type <t>|--soul <s>
24
+ ```yaml
25
+ # oats-workspace.yaml (host repository): declaring the package is the trust decision
26
+ packages:
27
+ vendor.review: git:github.com/vendor/review@v1.0.0
28
+ # a soul's soul.yaml, or the workspace defaults: a capability the package exports
29
+ # (a package may export several; the soul names each one it wants)
30
+ capabilities:
31
+ vendor.review: { from: package }
26
32
  ```
27
33
 
28
- ## 1. Locate the OATS framework repository
34
+ Then run `oats sync` (fetch, verify integrity, lock). The oats.setup
35
+ capability's **oats-package-pins** skill has the procedure.
36
+
37
+ ## 1. Verify the expert is available
38
+
39
+ Run `oats souls` in the deployment and confirm it resolves the
40
+ `integrations-expert` soul (a member repository or package provides it). If it
41
+ is absent, ask the human which OATS deployment owns reusable package work;
42
+ never locate or import private kernel files.
29
43
 
30
- Check a local pi package path, then likely locations such as
31
- `~/oats`; verify with `git -C <dir> remote get-url origin`. Avoid
32
- pi-managed git clones because updates reset them. If absent, ask where to
33
- clone `https://github.com/awebai/oats`.
44
+ ## 2. Spawn the expert against the package's repository
34
45
 
35
- ## 2. Spawn the expert against the user's repository
46
+ The package lives in its own repository. Make that repository a member of the
47
+ workspace (or use the member that already holds it), then spawn the expert on
48
+ it:
36
49
 
37
50
  ```bash
38
- node -e "
39
- import('<framework-repo>/lib/core.mjs').then(m => {
40
- const root = '<framework-repo>/agents';
41
- const a = m.findAgent(root, 'integrations-expert');
42
- const r = m.spawnInstance(root, a, {
43
- purpose: '<package-slug>',
44
- repo: '<users-workspace-or-repo>',
45
- work: 'checkout',
46
- task: '<capability intent; layer if any; skills/instructions/commands/hooks; external tools; desired global/group/soul targets; distribution path>',
47
- });
48
- console.log('window:', r.tmux.window, '| attach:', r.attach);
49
- })"
51
+ oats spawn integrations-expert --preview \
52
+ --purpose <package-slug> \
53
+ --repo <member clone of the package repository> \
54
+ --work worktree \
55
+ --task '<capability intent; layer if any; skills/instructions/commands/hooks; external tools; which souls should get it; distribution path>'
56
+ # review the preview, then run the same command without --preview
50
57
  ```
51
58
 
52
- The work tree is the user's repository, where a local package belongs under
53
- `.agents/capabilities/<name>/`. A framework contribution belongs under
54
- `capabilities/<name>/` in the framework worktree; an independently published
55
- package uses its own repository.
59
+ Use `--relation child --relative-to <your-instance>` only when the documented
60
+ workflow makes the expert your child; otherwise leave the spawn unrelated. A
61
+ package is distributed from its own repository as `oats-package/` with a
62
+ version tag; a framework contribution belongs in the framework's repository.
56
63
 
57
64
  ## 3. Brief the design boundary
58
65
 
59
66
  Tell the expert:
60
67
 
61
68
  - whether it is additive or implements exactly one of knowledge/messaging/tasks;
62
- - external requirements and executable surfaces;
69
+ - external requirements and executable surfaces (commands, hooks);
63
70
  - intended distribution and version/compatibility;
64
- - desired config-owned targets and settings; and
65
- - expected skill/instruction/scaffold collisions.
71
+ - which souls or workspace defaults should receive it, and its settings; and
72
+ - expected skill/instruction collisions (a duplicate skill name fails the spawn).
66
73
 
67
- Targets never belong in the manifest. The expert must test exact pi/Claude
68
- instance materialization, generated instructions, lock/trust behavior,
69
- command gating, deterministic hooks, and scaffold ownership as applicable.
74
+ Which souls get a capability is declared by the workspace (`defaults`) and the
75
+ souls (`soul.yaml` `capabilities`), never in the manifest. The expert must
76
+ test exact pi/Claude/Codex instance materialization, generated instructions,
77
+ command gating, deterministic hooks, and the lock's integrity check as
78
+ applicable.
70
79
 
71
80
  ## 4. Hand off
72
81
 
73
- Report the tmux window (`tmux attach -t pi-agents`). The expert follows its
74
- package/integration craft, runs a scaffold-only probe, and leaves acquisition
75
- and activation commands for the user. Its durable lessons harvest back into
76
- its soul.
82
+ Report the new instance (`oats status`). The expert follows its
83
+ package/integration craft, runs a preview-only probe, and leaves the
84
+ `packages:` pin and the `oats sync` for the user.
@@ -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 (`--harness`, `--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
- }