@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.
- package/README.md +12 -6
- package/bin/oats.mjs +203 -54
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
- package/capabilities/oats-aweb/injects/aweb.md +1 -1
- package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
- package/capabilities/oats-aweb/oats.json +5 -12
- package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
- package/capabilities/oats-code-review/injects/reviewer.md +26 -0
- package/capabilities/oats-code-review/oats.json +16 -0
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
- package/capabilities/oats-developer/injects/developer.md +38 -0
- package/capabilities/oats-developer/oats.json +17 -0
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
- package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
- package/capabilities/oats-engineering-expert/oats.json +17 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
- package/capabilities/oats-okf/bin/oats-okf.mjs +16 -9
- package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
- package/capabilities/oats-okf/lib/config.mjs +2 -1
- package/capabilities/oats-okf/lib/consult.mjs +26 -4
- package/capabilities/oats-okf/lib/harvest-switch.mjs +16 -3
- package/capabilities/oats-okf/lib/inspection.mjs +26 -7
- package/capabilities/oats-okf/lib/io.mjs +9 -1
- package/capabilities/oats-okf/lib/sources.mjs +34 -3
- package/capabilities/oats-okf/lib/stores.mjs +8 -6
- package/capabilities/oats-okf/lib/worker.mjs +7 -17
- package/capabilities/oats-okf/oats.json +6 -3
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
- package/capabilities/oats-okf-harvest/oats.json +3 -3
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +37 -16
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +6 -1
- package/capabilities/oats-okf-maintenance/oats.json +2 -2
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +17 -2
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
- package/capabilities/oats-workspace-experts/oats.json +9 -0
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +7 -10
- package/docs/configuration.md +213 -64
- package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
- package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
- package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
- package/docs/design/2026-09-27-team-model-v2.md +116 -0
- package/docs/design/2026-09-28-automations-trust.md +38 -0
- package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
- package/docs/design/HISTORY.md +65 -0
- package/docs/design/README.md +23 -54
- package/docs/desktop-cli-api.md +1787 -1777
- package/docs/desktop.md +30 -91
- package/docs/execution-targets.md +146 -292
- package/docs/first-team.md +31 -17
- package/docs/implementation.md +76 -288
- package/docs/integrations.md +118 -320
- package/docs/knowledge-capability-authoring.md +25 -52
- package/docs/knowledge-reference/acceptance.md +3 -3
- package/docs/knowledge-reference/adoption.md +1 -1
- package/docs/knowledge-reference/harvester.md +2 -2
- package/docs/knowledge-reference/package-craft.md +3 -3
- package/docs/knowledge-reference/provider-mapping.md +3 -6
- package/docs/knowledge-reference/reader-capture.md +3 -3
- package/docs/knowledge-theory.md +62 -166
- package/docs/knowledge.md +225 -404
- package/docs/layers.md +42 -97
- package/docs/oats-local.schema.json +58 -5
- package/docs/oats-membership.schema.json +1 -8
- package/docs/oats-package.schema.json +5 -5
- package/docs/oats-workspace.schema.json +8 -22
- package/docs/official-catalog.md +25 -28
- package/docs/packages.md +45 -63
- package/docs/plans/0.30-close-out.md +61 -0
- package/docs/release-lane.md +77 -0
- package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
- package/docs/release-notes/v0.19.0.md +48 -147
- package/docs/release-notes/v0.19.1.md +2 -3
- package/docs/release-notes/v0.19.3.md +2 -15
- package/docs/release-notes/v0.20.0.md +0 -15
- package/docs/release-notes/v0.22.0.md +71 -138
- package/docs/release-notes/v0.22.1.md +42 -90
- package/docs/release-notes/v0.22.10.md +1 -1
- package/docs/release-notes/v0.22.11.md +1 -47
- package/docs/release-notes/v0.22.12.md +4 -13
- package/docs/release-notes/v0.22.13.md +1 -42
- package/docs/release-notes/v0.22.14.md +3 -11
- package/docs/release-notes/v0.22.15.md +1 -46
- package/docs/release-notes/v0.22.16.md +6 -8
- package/docs/release-notes/v0.22.18.md +1 -99
- package/docs/release-notes/v0.22.19.md +3 -14
- package/docs/release-notes/v0.22.2.md +6 -15
- package/docs/release-notes/v0.22.3.md +0 -1
- package/docs/release-notes/v0.22.4.md +1 -14
- package/docs/release-notes/v0.22.5.md +2 -12
- package/docs/release-notes/v0.22.6.md +0 -3
- package/docs/release-notes/v0.23.0.md +9 -25
- package/docs/release-notes/v0.23.1.md +9 -25
- package/docs/release-notes/v0.23.2.md +2 -4
- package/docs/release-notes/v0.24.0.md +56 -97
- package/docs/release-notes/v0.24.1.md +7 -11
- package/docs/release-notes/v0.24.10.md +34 -45
- package/docs/release-notes/v0.24.11.md +12 -20
- package/docs/release-notes/v0.24.12.md +35 -48
- package/docs/release-notes/v0.24.13.md +34 -41
- package/docs/release-notes/v0.24.2.md +9 -13
- package/docs/release-notes/v0.24.3.md +7 -11
- package/docs/release-notes/v0.24.4.md +6 -6
- package/docs/release-notes/v0.24.5.md +6 -10
- package/docs/release-notes/v0.24.6.md +2 -5
- package/docs/release-notes/v0.24.7.md +46 -75
- package/docs/release-notes/v0.24.8.md +58 -96
- package/docs/release-notes/v0.24.9.md +38 -54
- package/docs/release-notes/v0.25.0.md +59 -76
- package/docs/release-notes/v0.25.1.md +57 -81
- package/docs/release-notes/v0.25.2.md +51 -70
- package/docs/release-notes/v0.25.3.md +11 -13
- package/docs/release-notes/v0.25.4.md +9 -13
- package/docs/release-notes/v0.25.5.md +3 -5
- package/docs/release-notes/v0.25.6.md +20 -29
- package/docs/release-notes/v0.25.7.md +5 -7
- package/docs/release-notes/v0.25.8.md +26 -39
- package/docs/release-notes/v0.26.0.md +175 -646
- package/docs/release-notes/v0.27.0.md +4 -5
- package/docs/release-notes/v0.27.1.md +4 -6
- package/docs/release-notes/v0.27.2.md +1 -1
- package/docs/release-notes/v0.28.0.md +57 -124
- package/docs/release-notes/v0.29.0.md +89 -208
- package/docs/release-notes/v0.29.1.md +1 -1
- package/docs/release-notes/v0.29.2.md +3 -4
- package/docs/release-notes/v0.29.4.md +90 -0
- package/docs/release-notes/v0.30.0.md +205 -0
- package/docs/schedules.md +280 -349
- package/docs/servers.md +99 -117
- package/docs/soul.schema.json +2 -9
- package/docs/souls-and-instances.md +145 -158
- package/docs/workspaces.md +132 -215
- package/lib/automations.mjs +28 -6
- package/lib/core.mjs +226 -74
- package/lib/instance-events.mjs +1 -1
- package/lib/instance-inspect.mjs +109 -34
- package/lib/instance-lifecycle.mjs +14 -1
- package/lib/instance-resolution.mjs +26 -27
- package/lib/launch-preference.mjs +87 -0
- package/lib/materialize.mjs +3 -3
- package/lib/packages.mjs +2 -5
- package/lib/resolve.mjs +29 -87
- package/lib/schedule.mjs +32 -18
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +53 -17
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +9 -15
- package/package.json +1 -1
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-review/injects/review.md +0 -69
- package/capabilities/oats-review/oats.json +0 -10
- package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
- package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
- package/docs/conventions.md +0 -90
- package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
- package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
- package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
- package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
- package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
- package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
- package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
- package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
- package/docs/design/2026-09-15-captured-dispatch.md +0 -127
- package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
- package/docs/design/2026-09-15-package-preparation.md +0 -100
- package/docs/design/2026-09-15-portable-data-contract.md +0 -121
- package/docs/design/2026-09-15-portable-declarations.md +0 -189
- package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
- package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
- package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
- package/docs/design/2026-09-15-source-observation.md +0 -119
- package/docs/design/2026-09-16-captured-admission.md +0 -77
- package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
- package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
- package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
- package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
- package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
- package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
- package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
- package/docs/design/2026-09-16-portable-onboarding.md +0 -179
- package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
- package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
- package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
- package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
- package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
- package/docs/design/2026-09-17-captured-native-start.md +0 -58
- package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
- package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
- package/docs/design/2026-09-17-public-captured-start.md +0 -108
- package/docs/design/2026-09-17-public-prepare-request.md +0 -90
- package/docs/design/2026-09-18-captured-pi-host.md +0 -205
- package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
- package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
- package/docs/design/2026-09-20-redesign-program-board.md +0 -142
- package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
- package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
- package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
- package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
- package/docs/design/2026-09-24-phase-d-plan.md +0 -305
- package/docs/design/2026-09-25-teams-contract.md +0 -258
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
- package/docs/design/desktop-ux-plan.md +0 -362
- package/docs/design/launch-configurations.md +0 -168
- package/docs/design/okf-mirror-provenance.md +0 -105
- package/docs/design/operations-contract.md +0 -141
- package/docs/oats-member.schema.json +0 -38
- package/skills/integration-authoring/SKILL.md +0 -84
- package/skills/oats-support/SKILL.md +0 -79
- package/skills/skill-craft/SKILL.md +0 -109
- package/skills/soul-craft/SKILL.md +0 -116
package/docs/configuration.md
CHANGED
|
@@ -1,41 +1,45 @@
|
|
|
1
|
-
# Configuration
|
|
2
|
-
|
|
3
|
-
A deployment has **one** per-machine file
|
|
4
|
-
workspace this machine realizes and holds the
|
|
5
|
-
|
|
6
|
-
defaults, stores
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
**`oats-config.yaml` no longer exists.** Its `capabilities.layers` /
|
|
11
|
-
`additive` / `from:` / `global` / `agent-types` blocks are gone — activation is
|
|
12
|
-
derived from workspace defaults plus each soul's `capabilities:` — and its
|
|
13
|
-
`souls:` blocks are gone — per-instance provider content moved to
|
|
14
|
-
`oats spawn … --provider`. There is no `oats init`, no `oats use`, no config
|
|
15
|
-
scope chain, no adopted config templates. A 0.24.x deployment is rebuilt, not
|
|
16
|
-
converted: write `oats-local.yaml` with `oats onboard` and move what the old
|
|
17
|
-
file declared into `oats-workspace.yaml` and each soul's `soul.yaml`.
|
|
1
|
+
# Configuration: `oats-local.yaml`
|
|
2
|
+
|
|
3
|
+
A deployment has **one** per-machine file, `oats-local.yaml`. It names the
|
|
4
|
+
workspace this machine realizes and holds the facts that are true of this host
|
|
5
|
+
only. Everything shared (members, packages and their versions, shared teams,
|
|
6
|
+
defaults, stores) lives in the workspace repository's `oats-workspace.yaml`,
|
|
7
|
+
and everything about a soul lives in its `soul.yaml` ([workspaces.md](workspaces.md)).
|
|
8
|
+
Write the first version with `oats onboard`; never commit it to a shared
|
|
9
|
+
repository.
|
|
18
10
|
|
|
19
11
|
## The file
|
|
20
12
|
|
|
21
13
|
```yaml
|
|
22
14
|
schemaVersion: 2
|
|
23
|
-
workspace: git:github.com/acme/agents # REQUIRED
|
|
15
|
+
workspace: git:github.com/acme/agents # REQUIRED: the workspace host, read over the remote
|
|
24
16
|
|
|
25
|
-
clones: #
|
|
17
|
+
clones: # member clones not beside this file under their repo name
|
|
26
18
|
github.com/acme/platform: /Users/ana/src/acme-platform
|
|
27
19
|
|
|
28
|
-
settings: #
|
|
20
|
+
settings: # host-owned values per capability
|
|
29
21
|
oats.okf:
|
|
30
22
|
bindings-file: /Users/ana/.oats/okf-bindings.json
|
|
31
|
-
state-dir: /Users/ana/.oats/okf
|
|
32
|
-
oats.aweb:
|
|
33
|
-
delivery: channel
|
|
34
23
|
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
teams: # LOCAL teams: only this deployment uses them
|
|
25
|
+
ana-research: { team: "ana-research:acme.aweb.ai", description: Ana's research }
|
|
26
|
+
defaultTeam: ana-research # the team every instance lives in
|
|
27
|
+
souls:
|
|
28
|
+
teams:
|
|
29
|
+
"*": [ana-research] # every soul is in these teams here
|
|
30
|
+
data-analyst: [platform] # and this one also joins a shared team
|
|
31
|
+
default:
|
|
32
|
+
data-analyst: platform # per-soul override of defaultTeam
|
|
33
|
+
disabled: [legacy-bot] # souls not run on this machine
|
|
34
|
+
|
|
35
|
+
host:
|
|
36
|
+
name: ana-laptop # which workspace triggers and schedules run here
|
|
37
|
+
triggers:
|
|
38
|
+
disabled: [platform/nightly-review]
|
|
39
|
+
schedules:
|
|
40
|
+
disabled: [platform/weekly-digest]
|
|
37
41
|
|
|
38
|
-
launch-configs: #
|
|
42
|
+
launch-configs: # named ways this host starts a harness
|
|
39
43
|
personal:
|
|
40
44
|
harness: claude
|
|
41
45
|
executable: "./bin/claude-wrapper.sh" # relative → against this deployment directory
|
|
@@ -51,59 +55,204 @@ refused (`E_WORKSPACE_SCHEMA`).
|
|
|
51
55
|
|
|
52
56
|
| key | meaning |
|
|
53
57
|
|---|---|
|
|
54
|
-
| `workspace` | Repo ref of the workspace host (`git:host/org/repo`, `https://…`, `git@host:…`, `file:///…`, `/abs/bare.git`). Read with your own Git credentials;
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
58
|
+
| `workspace` | Repo ref of the workspace host (`git:host/org/repo`, `https://…`, `git@host:…`, `file:///…`, `/abs/bare.git`). Read with your own Git credentials; it need not be cloned. |
|
|
59
|
+
| `standalone` | A repo ref to realize on its own: its souls and `from: here` capabilities plus `oats.core`, with no workspace lookup. For a repository whose workspace this machine cannot read ([workspaces.md](workspaces.md#the-standalone-case)). |
|
|
60
|
+
| `clones` | `<repo key>: <absolute path>` for a member clone that is not at `<deployment>/<member name>/`. Only a soul whose work target needs a clone (`work: worktree \| checkout`) uses it. Lookup order: `spawn --repo`, then this map, then `<deployment>/<member name>` (a member named `agents` → `<deployment>/agents-repo`). None → `E_CLONE_MISSING`; a directory whose `origin` is another repository → `E_CLONE_MISMATCH`. |
|
|
61
|
+
| `settings.<cap>.<key>` | Host-owned values a capability's manifest asks for: absolute paths, state roots, delivery modes. The workspace file refuses absolute paths; they go here. Merged into the capability's provider payload after the soul's own and before any `--provider` flag ([three homes](workspaces.md#provider-payloads-have-three-homes)). |
|
|
62
|
+
| `teams.<label>` | A **local** team: `{ team: <provider team id>, description? }`. Shared teams are committed in `oats-workspace.yaml`; a label in both is refused. Written by `oats teams add <label> --team <id>` and `oats teams remove <label>`. |
|
|
63
|
+
| `defaultTeam` | The team every instance of this deployment lives in: a label of a local or shared team. The first `oats teams add` sets it; `oats teams default <label>` changes it. |
|
|
64
|
+
| `souls.teams` | Which teams each soul joins here: `"*"` applies to every soul; a soul's own entry (its name, or `<package>/<soul>`) adds to it. Every soul is also in its default team. Written by `oats soul teams <soul>\|'*' --add … --remove …`. |
|
|
65
|
+
| `souls.default` | A per-soul override of `defaultTeam`; it must be one of that soul's teams here (`E_TEAM_NOT_ELIGIBLE`). Written by `oats soul teams <soul> --default <label>`. |
|
|
66
|
+
| `souls.disabled` | Souls not run on this machine; a spawn is refused with `E_SOUL_DISABLED`. A bare name disables every soul of that name; `<package>/<soul>` or `<member>/<soul>` disables one. |
|
|
67
|
+
| `host.name` | This machine's name. A workspace trigger or schedule runs only on the host named by its `runsOn` ([schedules.md](schedules.md)). |
|
|
68
|
+
| `automations.trust` | The workspace triggers and schedules (`<member>/<id>`) this host agrees to run, or `"*"` for every one the workspace places here (0.30). Absent or empty: none runs. See [Who runs workspace automations](#who-runs-workspace-automations). |
|
|
69
|
+
| `triggers.disabled`, `schedules.disabled` | Workspace triggers and schedules (`<member>/<id>`) this host does not run, without a commit. Written by `oats trigger disable` / `oats schedule disable`. |
|
|
70
|
+
| `launch-configs.<name>` | A named way to start a harness on this host, chosen at spawn or session start, never by the soul. See [Launch configurations](#launch-configurations). |
|
|
71
|
+
| `souls.launch` | This machine's launch preference per soul (0.30): `"*"` for every soul, a soul's own entry (its name, or `<package>/<soul>`) over it. A value is a `launch-configs` name or an inline `{ harness, model? }`. It overrides the soul's own `launch:`; explicit spawn flags win over both. See [Launch preferences](#launch-preferences). |
|
|
72
|
+
|
|
73
|
+
How teams are resolved, and what a messaging provider does with them, is in
|
|
74
|
+
[workspaces.md](workspaces.md#teams).
|
|
75
|
+
|
|
76
|
+
## Launch configurations
|
|
77
|
+
|
|
78
|
+
An entry has `harness` (`pi` \| `claude` \| `codex`, required), `executable`
|
|
79
|
+
(a bare name looked up on `PATH`, or a path relative to this deployment
|
|
80
|
+
directory), `args` (literal, no shell), `env` (a literal string, or
|
|
81
|
+
`{ fromEnv: NAME }` resolved on the host at start), `model` and `yolo`. A
|
|
82
|
+
launch configuration is a host choice: a soul never names one.
|
|
83
|
+
|
|
84
|
+
- Select one with `--launch-config <name>` on `oats spawn`,
|
|
85
|
+
`oats session start` and `oats session restart`. A named configuration is
|
|
86
|
+
a unit: a `--harness` that disagrees with it is refused
|
|
87
|
+
(`E_LAUNCH_CONFIG_MISMATCH`); `--model` and `--yolo` override its fields.
|
|
88
|
+
- Without `--launch-config` or `--harness`, a spawn follows the soul's
|
|
89
|
+
[launch preference](#launch-preferences) (else `pi` with its defaults), and
|
|
90
|
+
an existing home keeps what it recorded. `--harness` alone leaves the recorded
|
|
91
|
+
configuration behind and uses the new harness's defaults. A model never
|
|
92
|
+
crosses harnesses.
|
|
93
|
+
- The executable must be a regular executable file; it is never run to probe
|
|
94
|
+
it.
|
|
95
|
+
- `oats launch-config list` shows the effective entries;
|
|
96
|
+
`oats launch-config set <name> --file <json>` and
|
|
97
|
+
`oats launch-config remove <name>` rewrite only this block;
|
|
98
|
+
`oats launch-config preview (--home <abs> | --soul <name>) --json` shows
|
|
99
|
+
what a start would run (harness, model, executable, argv, redacted
|
|
100
|
+
environment, command and preflight checks) and starts nothing.
|
|
101
|
+
- The old key `runtime` is still read as `harness`, with a
|
|
102
|
+
`deprecated-runtime-name` warning.
|
|
103
|
+
|
|
104
|
+
### Launch preferences
|
|
105
|
+
|
|
106
|
+
A soul says what its role should run on, and each machine may override it
|
|
107
|
+
(0.30; the design is
|
|
108
|
+
[soul launch preferences](design/2026-09-28-soul-launch-preference.md)):
|
|
109
|
+
|
|
110
|
+
```yaml
|
|
111
|
+
# souls/<soul>/soul.yaml — only a harness and a model
|
|
112
|
+
launch: { harness: claude, model: claude-opus-5-5 }
|
|
113
|
+
|
|
114
|
+
# oats-local.yaml
|
|
115
|
+
souls:
|
|
116
|
+
launch:
|
|
117
|
+
"*": personal # a launch configuration, for every soul here
|
|
118
|
+
oats-expert: { harness: claude, model: claude-opus-5-5 }
|
|
119
|
+
oats.engineering/code-reviewer: { harness: codex } # a package soul
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
- **Precedence for a new launch:** `--launch-config` or `--harness`, then
|
|
123
|
+
`souls.launch.<soul>`, then `souls.launch."*"`, then the soul's `launch:`,
|
|
124
|
+
then `pi` with its defaults. `--model` alone keeps the deciding layer's
|
|
125
|
+
harness and replaces only its model.
|
|
126
|
+
- A **launch configuration** name runs that configuration's full recipe. An
|
|
127
|
+
**inline or soul preference** runs its harness the way this host starts it
|
|
128
|
+
without a configuration (the executable on `PATH`, no args, no env), with
|
|
129
|
+
its `model`. A preference without `model` uses the harness's own model; it
|
|
130
|
+
never borrows a lower layer's.
|
|
131
|
+
- **A missing harness is refused**, never replaced: `E_HARNESS_UNAVAILABLE`
|
|
132
|
+
names the layer that chose it and the fix (install the harness, or override
|
|
133
|
+
it here in `souls.launch`). `oats souls` still lists the soul, with the
|
|
134
|
+
problem.
|
|
135
|
+
- **Existing homes keep their launch.** A changed preference does not affect
|
|
136
|
+
a running or stopped home until `oats session restart --reselect-launch`
|
|
137
|
+
(or `start --reselect-launch`) or a respawn. `session start|restart --model`
|
|
138
|
+
keeps the recorded harness and replaces only the model. `oats readiness --home` shows
|
|
139
|
+
the drift as the `launch-changed` warning; `oats inspect --home` shows
|
|
140
|
+
`launch` (the record) beside `launchCurrent`.
|
|
141
|
+
- `oats souls`, `oats inspect --soul` and `oats spawn … --preview` show each
|
|
142
|
+
soul's `launch`: its own preference, the effective launch, and which layer
|
|
143
|
+
decided (`from`) and where (`at`).
|
|
144
|
+
- **Migration.** 0.29 refuses a soul.yaml it does not know, so a committed
|
|
145
|
+
soul gains `launch:` only once every deployment of the workspace runs 0.30.
|
|
146
|
+
Until then, set the preference in `souls.launch` on each machine.
|
|
147
|
+
|
|
148
|
+
**Environment references.** `{ fromEnv: SRC }` is rendered as a reference,
|
|
149
|
+
never a value, in the recorded command and in every answer. At start each
|
|
150
|
+
source variable must be set on the host (`E_LAUNCH_ENV_MISSING`, before
|
|
151
|
+
anything is created or stopped), and only the harness's pane receives it.
|
|
152
|
+
`list` and `preview` redact every environment value, literals included.
|
|
153
|
+
|
|
154
|
+
**The launch recipe.** A spawn records what a start is made of in
|
|
155
|
+
`instance.json` under `launch`: the harness, the configuration and where it
|
|
156
|
+
came from, the executable, args, env, model, yolo, and each capability's
|
|
157
|
+
launch contribution with its settings and trust. One renderer turns it into
|
|
158
|
+
the `command`. Configuration `args` go after the harness's own options and
|
|
159
|
+
before capability arguments; every argument is single-quoted.
|
|
160
|
+
|
|
161
|
+
**Starting and restarting a home.** `oats session start --home <abs>` runs
|
|
162
|
+
the recorded recipe. With `--launch-config`, `--harness` or `--yolo`, the
|
|
163
|
+
recipe is resolved again against the home's recorded context and every check
|
|
164
|
+
runs first. With `--reselect-launch`, the launch preferences decide again
|
|
165
|
+
(the home's recorded soul and this deployment's `souls.launch`). A capability that contributed harness-specific arguments must
|
|
166
|
+
declare a `launch` hook to follow a harness change; otherwise the start is
|
|
167
|
+
refused (`E_LAUNCH_PREPARATION`). A launch hook's warnings do not stop
|
|
168
|
+
the start: `session start|restart` print them (and answer them as
|
|
169
|
+
`warnings` under `--json`), as spawn does, and each is kept as a
|
|
170
|
+
`launch-warning` instance event (`oats instance events`).
|
|
171
|
+
`oats session restart` runs the same
|
|
172
|
+
checks, then sends SIGTERM to the harness and what it started, waits
|
|
173
|
+
(`--stop-grace <seconds>`, default 20) for them to exit, and starts again in
|
|
174
|
+
place. It never escalates: a harness still running is reported
|
|
175
|
+
(`E_SESSION_STOP_FAILED`) and nothing is launched. What a harness saves on
|
|
176
|
+
SIGTERM is its own; a wrapper script should `exec` the harness or forward
|
|
177
|
+
signals.
|
|
178
|
+
|
|
179
|
+
## Who runs workspace automations
|
|
180
|
+
|
|
181
|
+
A workspace trigger or schedule names the host that runs it (`runsOn`) and
|
|
182
|
+
the GitHub account it acts as (`owner`). Both come from a commit, so a host
|
|
183
|
+
also has to say yes itself (0.30):
|
|
184
|
+
|
|
185
|
+
```yaml
|
|
186
|
+
automations:
|
|
187
|
+
trust:
|
|
188
|
+
- agents/pr-review # <member>/<id>
|
|
189
|
+
- agents/nightly-digest
|
|
190
|
+
# or: trust: "*" # every automation the workspace places on this host
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
- It runs only if `runsOn` is this host's `host.name`, its `owner` is this
|
|
194
|
+
host's `gh` account, **and** `trust` admits it. `triggers.disabled` and
|
|
195
|
+
`schedules.disabled` still opt out on top.
|
|
196
|
+
- A placed but untrusted one never runs. Its row has reason `untrusted`, and
|
|
197
|
+
`oats workspace status` warns with the line to add.
|
|
198
|
+
- An entry that names nothing is a warning, not an error.
|
|
199
|
+
- `automations` is a host key: the committed `oats-workspace.yaml` refuses
|
|
200
|
+
it.
|
|
201
|
+
- **Upgrading to 0.30:** a host that ran workspace automations must add its
|
|
202
|
+
`trust` lines; until then they do not run there.
|
|
203
|
+
- Your own triggers and schedules (`oats trigger add`, `oats schedule add`)
|
|
204
|
+
need no trust. Details: [schedules.md](schedules.md#workspace-triggers-and-schedules).
|
|
59
205
|
|
|
60
|
-
##
|
|
206
|
+
## The deployment directory
|
|
61
207
|
|
|
62
|
-
Every `oats` command that needs the workspace
|
|
63
|
-
`capabilities`, `souls`, `spawn`, `status` drift) walks **up** from the current
|
|
208
|
+
Every `oats` command that needs the workspace walks **up** from the current
|
|
64
209
|
directory (or `--dir`) to the nearest `oats-local.yaml`; its directory is the
|
|
65
|
-
deployment. Not found → `E_LOCAL_MISSING`.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
scope — a scratch deployment under a repository, a fixture under an operator
|
|
69
|
-
workspace — sees only its own files; `oats inspect` reports it, not the outer
|
|
70
|
-
scope, as the workspace). Beside it:
|
|
210
|
+
deployment. Not found → `E_LOCAL_MISSING`. Nothing above that directory
|
|
211
|
+
composes into it: a deployment created inside another one sees only its own
|
|
212
|
+
files.
|
|
71
213
|
|
|
72
214
|
```
|
|
73
|
-
~/acme
|
|
215
|
+
~/acme/
|
|
74
216
|
├── oats-local.yaml
|
|
75
|
-
├── oats-lock.json # written by `oats sync` (
|
|
76
|
-
├──
|
|
77
|
-
|
|
217
|
+
├── oats-lock.json # written by `oats sync` (packages.md)
|
|
218
|
+
├── oats-schedules.json # this host's local schedules and triggers (schedules.md)
|
|
219
|
+
├── agents/ # instance homes and the fetched soul copies
|
|
220
|
+
├── .oats/modules/ # the capability store for operator-level commands
|
|
221
|
+
└── <member clones>/ # only where someone works IN a repository
|
|
78
222
|
```
|
|
79
223
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
224
|
+
**The capability store.** A capability command run from the deployment for a
|
|
225
|
+
soul (`oats <namespace> <command> --soul <soul>`) fetches that capability at
|
|
226
|
+
its locked commit into `.oats/modules/<capability>@<commit12>/`, verifies its
|
|
227
|
+
content digest against the lock (recorded beside it as
|
|
228
|
+
`.<capability>@<commit12>.digest`) and runs that copy. A tree that no longer
|
|
229
|
+
matches its record is fetched again. An instance never uses the store: each
|
|
230
|
+
home has its own copy under `<home>/.oats/modules/<capability>/`
|
|
231
|
+
([souls-and-instances.md](souls-and-instances.md)). The store is a cache; it
|
|
232
|
+
is safe to delete.
|
|
83
233
|
|
|
84
|
-
## What is
|
|
234
|
+
## What is not in it
|
|
85
235
|
|
|
86
|
-
- **Which capabilities a soul gets
|
|
87
|
-
workspace `defaults
|
|
88
|
-
|
|
89
|
-
- **Versions** — `packages:` in the workspace file; exact commits in
|
|
236
|
+
- **Which capabilities a soul gets:** the soul's `capabilities:` plus the
|
|
237
|
+
workspace `defaults`.
|
|
238
|
+
- **Versions:** `packages:` in the workspace file; exact commits in
|
|
90
239
|
`oats-lock.json`.
|
|
91
|
-
- **Trust
|
|
92
|
-
|
|
93
|
-
- **Per-instance provider facts
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
- **Team labels, stores, messaging policy** — the workspace file.
|
|
240
|
+
- **Trust:** membership for members, the workspace's `packages:` declaration
|
|
241
|
+
for packages ([packages.md](packages.md#trust)).
|
|
242
|
+
- **Per-instance provider facts:** `oats spawn <soul> --provider <cap> key=value`,
|
|
243
|
+
recorded in the instance's `instance.json`.
|
|
244
|
+
- **Shared teams, stores and defaults:** the workspace file.
|
|
97
245
|
|
|
98
246
|
## Inspecting the effective configuration
|
|
99
247
|
|
|
100
248
|
```bash
|
|
101
|
-
oats workspace status #
|
|
249
|
+
oats workspace status # members, locked packages, external souls
|
|
102
250
|
oats sync # confirm, resolve, lock, report the diff
|
|
103
|
-
oats
|
|
104
|
-
oats
|
|
105
|
-
oats
|
|
251
|
+
oats teams # shared and local teams, and the default
|
|
252
|
+
oats soul teams <soul> # the teams one soul joins here
|
|
253
|
+
oats spawn <soul> --preview # the exact modules, teams and provider payloads
|
|
254
|
+
oats doctor # this deployment's files and the lock
|
|
106
255
|
```
|
|
107
256
|
|
|
108
|
-
Environment
|
|
109
|
-
|
|
257
|
+
Environment: `OATS_REMOTE_CACHE` relocates the fetch cache;
|
|
258
|
+
`OATS_PACKAGE_CATALOG` names an alternative package catalog file.
|
|
@@ -1,61 +1,47 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: Decision
|
|
3
3
|
status: accepted-boundary
|
|
4
|
-
title: Knowledge and
|
|
5
|
-
description: OATS provides generic
|
|
4
|
+
title: Knowledge and messaging capability contract boundary
|
|
5
|
+
description: OATS provides generic selection, lifecycle and execution contracts; knowledge and messaging capabilities implement their own behaviour.
|
|
6
6
|
timestamp: 2026-09-16
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Knowledge and
|
|
9
|
+
# Knowledge and messaging capability contract boundary
|
|
10
10
|
|
|
11
|
-
**OATS provides contracts; capabilities provide functionality.**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
runtime model or a kernel-owned harvester.
|
|
11
|
+
**OATS provides contracts; capabilities provide functionality.** The kernel
|
|
12
|
+
has no knowledge model, harvester, messaging backend or identity system of its
|
|
13
|
+
own. The official providers are `oats.okf` (knowledge) and `oats.aweb`
|
|
14
|
+
(messaging); any other capability may fill either slot with a different model.
|
|
16
15
|
|
|
17
16
|
## Responsibilities
|
|
18
17
|
|
|
19
|
-
| Kernel
|
|
18
|
+
| Kernel supplies | The capability owns |
|
|
20
19
|
|---|---|
|
|
21
|
-
| Selection,
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
accidental kernel-owned knowledge policy. Move new behavior behind neutral
|
|
50
|
-
contracts or capability declarations as appropriate; do not blindly enable
|
|
51
|
-
recursive harvesting or weaken existing fail-closed guards.
|
|
52
|
-
- A knowledge-specific source receipt may remain a compatibility input for a
|
|
53
|
-
provider, but must not become the mandatory shape for every alternative.
|
|
54
|
-
- Retirement must honor required capture/handoff outcomes before deleting their
|
|
55
|
-
source. The capability supplies the evidence and outcome; the kernel does not
|
|
56
|
-
implement the provider's memory/promotion algorithm.
|
|
57
|
-
- Independent work must retain everything it needs through the existing execution
|
|
58
|
-
and provider custody contracts, without a live source/config fallback.
|
|
59
|
-
|
|
60
|
-
This records the boundary and remaining audit, not a claim that every consumer is
|
|
61
|
-
already refactored or that a fresh deployment/live harvester is qualified.
|
|
20
|
+
| Selection: one provider per slot, resolved from the soul and the workspace defaults, copied into the home at its locked commit | Interpreting its own settings and declarations; the kernel treats them as opaque |
|
|
21
|
+
| Lifecycle hooks (`spawn`, `launch`, `retire`) with the hook environment: settings and their origins, the home, the soul, the teams | What happens at each event: registering a source, minting an identity, joining a team, handing off at retirement |
|
|
22
|
+
| A required spawn hook's failure rolls the spawn back; every other hook is advisory | Reporting its own outcome truthfully in the hook answer |
|
|
23
|
+
| Command and operation dispatch from the copied module, and the readiness relay (`binding.check`) | Its commands, operations and readiness answer |
|
|
24
|
+
| The soul's teams, as declarations | Enrolment, membership, transport and wake delivery; a declared team is not proof of enrolment |
|
|
25
|
+
|
|
26
|
+
The contracts themselves are in [capabilities.md](../capabilities.md): hooks
|
|
27
|
+
and their environment, commands, operations and the readiness check.
|
|
28
|
+
|
|
29
|
+
## Rules
|
|
30
|
+
|
|
31
|
+
- **No second engine.** A capability does not get its own resolver, config
|
|
32
|
+
parser or command registry in the kernel; a missing generic field is added
|
|
33
|
+
once, to the shared contract, and versioned.
|
|
34
|
+
- **Knowledge.** The provider decides where knowledge lives, who reads and
|
|
35
|
+
owns what, how evidence is captured and judged, and how accepted knowledge
|
|
36
|
+
is delivered. `oats.okf`'s model (owned nodes in central bases, independent
|
|
37
|
+
harvest, PR-only Git delivery) is the reference, not a requirement for
|
|
38
|
+
alternatives ([knowledge theory](../knowledge-theory.md)).
|
|
39
|
+
- **Messaging.** The provider owns identity, addressing, teams and delivery,
|
|
40
|
+
using only the authority it is given. Configuration never implies privacy or
|
|
41
|
+
access: contact, delivery and history are verified through the provider's
|
|
42
|
+
own mechanisms.
|
|
43
|
+
- **No secrets in the contract.** Hooks contribute locators and endpoints,
|
|
44
|
+
never credentials, and nothing credential-bearing is recorded in
|
|
45
|
+
`instance.json` or logs.
|
|
46
|
+
- Capability ownership does not waive repository governance, work
|
|
47
|
+
boundaries or truthful lifecycle reporting.
|