@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.
- package/README.md +8 -6
- package/bin/oats.mjs +576 -1714
- package/capabilities/oats-authoring/oats-package.json +2 -2
- package/capabilities/oats-authoring/oats.json +2 -2
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +46 -25
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +13 -6
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +279 -93
- package/capabilities/oats-aweb/injects/aweb.md +7 -2
- package/capabilities/oats-aweb/lib/binding-wire.mjs +89 -13
- package/capabilities/oats-aweb/lib/captured-native.mjs +1 -1
- package/capabilities/oats-aweb/lib/grant-custody.mjs +38 -0
- package/capabilities/oats-aweb/oats.json +8 -4
- package/capabilities/oats-jira/bin/oats-jira.mjs +4 -4
- package/capabilities/oats-jira/oats.json +2 -2
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +6 -3
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +6 -4
- package/capabilities/oats-linear/oats.json +2 -2
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +6 -0
- package/capabilities/oats-review/oats.json +3 -2
- package/docs/capabilities.md +218 -47
- package/docs/capability-manifest.schema.json +13 -4
- package/docs/configuration.md +17 -5
- package/docs/conventions.md +16 -26
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +1 -1
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +3 -3
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +2 -2
- package/docs/design/2026-09-15-portable-souls-handoff.md +2 -2
- package/docs/design/2026-09-15-portable-souls-implementation.md +1 -1
- package/docs/design/2026-09-20-redesign-program-board.md +2 -2
- package/docs/design/2026-09-23-workspace-module-contracts.md +1 -1
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +1 -1
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +34 -1
- package/docs/design/2026-09-24-phase-d-plan.md +57 -0
- package/docs/design/2026-09-25-teams-contract.md +226 -0
- package/docs/design/README.md +3 -3
- package/docs/design/launch-configurations.md +20 -16
- package/docs/design/operations-contract.md +27 -10
- package/docs/desktop-cli-api.md +537 -261
- package/docs/desktop-instance-start.md +1 -1
- package/docs/desktop.md +7 -13
- package/docs/execution-targets.md +16 -18
- package/docs/first-team.md +14 -17
- package/docs/implementation.md +28 -59
- package/docs/integrations.md +64 -33
- package/docs/knowledge-capability-authoring.md +1 -1
- package/docs/knowledge-reference/package-craft.md +10 -8
- package/docs/knowledge-theory.md +1 -1
- package/docs/knowledge.md +10 -11
- package/docs/layers.md +16 -17
- package/docs/oats-local.schema.json +29 -1
- package/docs/oats-membership.schema.json +5 -3
- package/docs/oats-package.schema.json +2 -2
- package/docs/oats-workspace.schema.json +1 -1
- package/docs/{official-marketplace.md → official-catalog.md} +15 -16
- package/docs/packages.md +75 -52
- package/docs/release-notes/v0.22.0.md +1 -1
- package/docs/release-notes/v0.23.1.md +1 -1
- package/docs/release-notes/v0.26.0.md +670 -0
- package/docs/schedules.md +48 -126
- package/docs/soul.schema.json +11 -4
- package/docs/souls-and-instances.md +56 -43
- package/docs/workspaces.md +80 -58
- package/injects/instance-boundary.md +1 -1
- package/injects/work-attached.md +1 -1
- package/injects/work-workspace.md +2 -2
- package/lib/{portable-files.mjs → bounded-read.mjs} +6 -6
- package/lib/{portable-values.mjs → canonical-json.mjs} +3 -12
- package/lib/capability-contract.mjs +110 -0
- package/lib/config-data.mjs +2 -2
- package/lib/core.mjs +700 -4824
- package/lib/digest.mjs +12 -0
- package/lib/instance-inspect.mjs +396 -0
- package/lib/instance-lifecycle.mjs +3 -4
- package/lib/instance-resolution.mjs +212 -26
- package/lib/instruction-composition.mjs +0 -20
- package/lib/materialize.mjs +6 -4
- package/lib/operator-dispatch.mjs +33 -13
- package/lib/packages.mjs +25 -190
- package/lib/provider-binding.mjs +4 -2
- package/lib/provider-reasons.mjs +3 -68
- package/lib/resolve.mjs +204 -68
- package/lib/schedule.mjs +97 -272
- package/lib/servers.mjs +13 -13
- package/lib/{portable-shape.mjs → shape.mjs} +4 -3
- package/lib/tree-copy.mjs +44 -0
- package/lib/workspace.mjs +125 -20
- package/package-catalog.json +6 -6
- package/package.json +1 -1
- package/skills/integration-authoring/SKILL.md +48 -40
- package/skills/oats-getting-started/SKILL.md +105 -110
- package/skills/oats-support/SKILL.md +2 -2
- package/skills/soul-craft/SKILL.md +13 -6
- package/bin/oats-pi-sdk-host.mjs +0 -17
- package/docs/2026-09-03-architecture-proposal.md +0 -642
- package/docs/artifact-approvals.schema.json +0 -7
- package/docs/captured-invocation-context.schema.json +0 -7
- package/docs/captured-resolution.schema.json +0 -7
- package/docs/design/package-engine-contract.md +0 -813
- package/docs/design/package-runtime-api.md +0 -588
- package/docs/desktop-succession.md +0 -57
- package/docs/execution-capsule.schema.json +0 -108
- package/docs/first-team-demo.md +0 -92
- package/docs/knowledge-migration.md +0 -147
- package/docs/migration-from-oas.md +0 -103
- package/docs/oats-config.schema.json +0 -172
- package/docs/oats-lock-v3.schema.json +0 -7
- package/docs/oats-lock.schema.json +0 -175
- package/docs/operating-team-migration.md +0 -470
- package/docs/portable.schema.json +0 -2512
- package/docs/provider-check-input.schema.json +0 -7
- package/docs/rebuild-to-v2.md +0 -511
- package/docs/workspace-adoption.md +0 -74
- package/injects/framework-workspace.md +0 -7
- package/injects/local-soul.md +0 -19
- package/injects/oats-portable.md +0 -20
- package/injects/oats.md +0 -11
- package/injects/portable-instance-boundary.md +0 -39
- package/injects/portable-work-directory.md +0 -29
- package/lib/artifact-approvals.mjs +0 -120
- package/lib/artifact-tree.mjs +0 -141
- package/lib/capability-artifacts.mjs +0 -179
- package/lib/capability-execution.mjs +0 -15
- package/lib/capability-inputs.mjs +0 -39
- package/lib/capability-provenance.mjs +0 -231
- package/lib/captured-action-shape.mjs +0 -21
- package/lib/captured-admission-shape.mjs +0 -20
- package/lib/captured-binding-file.mjs +0 -36
- package/lib/captured-dispatch.mjs +0 -66
- package/lib/captured-instance-index.mjs +0 -277
- package/lib/captured-invocation-context.mjs +0 -130
- package/lib/captured-launch-request.mjs +0 -66
- package/lib/captured-operation-process.mjs +0 -15
- package/lib/captured-pi-custody.mjs +0 -29
- package/lib/captured-pi-host.mjs +0 -167
- package/lib/captured-pi-outcome.mjs +0 -172
- package/lib/captured-resolutions.mjs +0 -275
- package/lib/captured-scaffold.mjs +0 -87
- package/lib/captured-selector.mjs +0 -28
- package/lib/captured-session-backend.mjs +0 -52
- package/lib/captured-source-receipt-file.mjs +0 -72
- package/lib/helper-injection-policy.mjs +0 -104
- package/lib/legacy-lock-codec.mjs +0 -106
- package/lib/manifest-settings.mjs +0 -84
- package/lib/package-closure.mjs +0 -48
- package/lib/package-materialization.mjs +0 -83
- package/lib/pi-sdk-host.mjs +0 -229
- package/lib/portable-artifacts.mjs +0 -115
- package/lib/portable-choices.mjs +0 -82
- package/lib/portable-composition.mjs +0 -136
- package/lib/portable-digest.mjs +0 -105
- package/lib/portable-identity.mjs +0 -40
- package/lib/portable-lock.mjs +0 -117
- package/lib/portable-onboarding-request.mjs +0 -49
- package/lib/portable-onboarding.mjs +0 -256
- package/lib/portable-package-preparation.mjs +0 -188
- package/lib/portable-policy.mjs +0 -44
- package/lib/portable-soul.mjs +0 -42
- package/lib/portable-state.mjs +0 -80
- package/lib/prepare-composition.mjs +0 -170
- package/lib/prepared-bindings.mjs +0 -92
- package/lib/prepared-resources.mjs +0 -127
- package/lib/provider-binding-broker.mjs +0 -65
- package/lib/provider-binding-wire.mjs +0 -116
- package/lib/readiness.mjs +0 -225
- package/lib/repository-observation.mjs +0 -226
- package/lib/resolution-shape.mjs +0 -393
- package/lib/schedule-capsule.mjs +0 -206
- package/lib/soul-constraints.mjs +0 -40
- package/lib/source-projection.mjs +0 -84
- package/lib/source-spec.mjs +0 -189
- package/lib/workspace-definition.mjs +0 -126
- package/lib/workspace-discovery.mjs +0 -146
- package/skills/oats/SKILL.md +0 -162
- package/skills/oats-config/SKILL.md +0 -164
- package/skills/oats-packages/SKILL.md +0 -184
- package/skills/oats-portable/SKILL.md +0 -115
- package/skills/oats-portable-artifacts/SKILL.md +0 -63
package/docs/capabilities.md
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
# Capability packages
|
|
2
2
|
|
|
3
3
|
A **capability** is OATS's reusable unit of behaviour. It can contribute
|
|
4
|
-
skills, instance instructions, requirements, namespaced commands, and
|
|
4
|
+
skills, instance instructions, requirements, namespaced commands, and declared
|
|
5
5
|
lifecycle hooks. A soul — not the capability — decides which souls receive it,
|
|
6
6
|
by naming it with where it comes from (`from:`; see [workspaces](workspaces.md)).
|
|
7
7
|
|
|
8
|
-
The [official
|
|
8
|
+
The [official catalog policy](official-catalog.md) defines the reviewed
|
|
9
9
|
package list and its acceptance criteria. Finding an official package does not
|
|
10
|
-
|
|
10
|
+
declare it or give it to any soul; declaring it in `packages:` is the
|
|
11
|
+
workspace's trust decision, and giving it to a soul is a separate choice.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
A **core capability** fills one of the three positions a soul has: knowledge,
|
|
14
|
+
messaging or tasks, at most one of each per soul. The manifest's `layer` field
|
|
15
|
+
names which core capability it is. Other capabilities claim no `layer` and
|
|
16
|
+
compose additively.
|
|
15
17
|
|
|
16
18
|
## Mental model
|
|
17
19
|
|
|
@@ -20,8 +22,8 @@ A capability lives in one of two kinds of source:
|
|
|
20
22
|
1. a **member repo** of the workspace, at `capabilities/<name>/oats.json` —
|
|
21
23
|
unversioned, always the member's latest state, trusted by membership;
|
|
22
24
|
2. a **package** (`oats-package/` in a repo, pinned by version in the
|
|
23
|
-
workspace's `packages
|
|
24
|
-
[packages.md](packages.md)).
|
|
25
|
+
workspace's `packages:` — the declaration is the trust — and locked to a
|
|
26
|
+
commit and integrity; [packages.md](packages.md)).
|
|
25
27
|
|
|
26
28
|
A soul says `capabilities: { <name>: { from: here | <repo key> | package } }`
|
|
27
29
|
(or `off`); the workspace supplies defaults. At spawn every resolved
|
|
@@ -67,8 +69,16 @@ A self-contained package has an `oats.json`:
|
|
|
67
69
|
namespace.
|
|
68
70
|
- `command` is an optional, unique CLI namespace. The example exposes
|
|
69
71
|
`oats team-chat auth`.
|
|
70
|
-
- `
|
|
71
|
-
|
|
72
|
+
- `compatibility.oats` is the kernel range the capability runs on. The kernel
|
|
73
|
+
refuses to compose a capability whose range does not admit it
|
|
74
|
+
(`E_CAPABILITY_INCOMPATIBLE`, naming capability, range and kernel) wherever a
|
|
75
|
+
soul or capability agent resolves (spawn, `spawn --preview`, `inspect
|
|
76
|
+
--soul`, operator commands). `oats inspect` shows each module's
|
|
77
|
+
`compatibility: { ok, range, kernel }`; a home whose spawned module no longer
|
|
78
|
+
admits the running kernel reports a `capability-incompatible` problem.
|
|
79
|
+
- `layer` is optional; when present it names which core capability this is
|
|
80
|
+
(`knowledge`, `messaging` or `tasks`). A soul has at most one capability per
|
|
81
|
+
slot.
|
|
72
82
|
- `skills` entries can be skill directories or roots containing skills.
|
|
73
83
|
- `inject` is optional instance instruction Markdown.
|
|
74
84
|
- Only `soul-scaffold`, `spawn`, and `retire` hooks are accepted. A hook is a
|
|
@@ -79,15 +89,16 @@ A self-contained package has an `oats.json`:
|
|
|
79
89
|
woken by mail. Every other hook stays best-effort and only warns, so advisory
|
|
80
90
|
work never becomes a spawn blocker. `retire` and `soul-scaffold` cannot be
|
|
81
91
|
required: they run outside a spawn transaction, so there is no moment to
|
|
82
|
-
enforce them.
|
|
92
|
+
enforce them. The kernel no longer runs `soul-scaffold` (it ran when
|
|
93
|
+
`oats create` wrote a soul); a manifest may still declare it.
|
|
83
94
|
- A capability declaring a **required** spawn hook should declare a `retire` hook
|
|
84
95
|
too. Without one, OATS has no way to undo what the spawn hook did and no way to
|
|
85
96
|
know whether it did anything, so a failure quarantines the home rather than
|
|
86
97
|
rolling it back — the operator cleans up by hand and removes it with `--force`.
|
|
87
|
-
- A required hook must also be **able** to run: a package capability
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
silently fails to configure an instance.
|
|
98
|
+
- A required hook must also be **able** to run: a package capability the lock
|
|
99
|
+
does not pin is refused at resolution (`E_PACKAGE_MISSING`, remedy `oats
|
|
100
|
+
sync`), and drifted content is `E_PACKAGE_INTEGRITY`, so a required hook
|
|
101
|
+
never silently fails to configure an instance.
|
|
91
102
|
- When a required hook fails and its compensation cannot finish, the instance
|
|
92
103
|
home is **retained**, not deleted — it holds the credentials and metadata a
|
|
93
104
|
retry needs, and removing it would turn a transient cleanup failure into
|
|
@@ -136,14 +147,16 @@ A self-contained package has an `oats.json`:
|
|
|
136
147
|
with the consent command that fixes it.
|
|
137
148
|
- OATS never installs a host requirement silently. A missing host command is
|
|
138
149
|
the operator's to install; `oats doctor` reports it. Consent to install is
|
|
139
|
-
separate from package
|
|
140
|
-
- `environment` lists the exact launch variables
|
|
150
|
+
separate from declaring the package.
|
|
151
|
+
- `environment` lists the exact launch variables the capability may set;
|
|
141
152
|
spawn hook output must be a subset and use the capability vendor prefix.
|
|
142
153
|
- Target names never appear in a package manifest.
|
|
143
154
|
|
|
144
155
|
`capability` is the only manifest identity field; it may also carry
|
|
145
|
-
`private: true` (
|
|
146
|
-
|
|
156
|
+
`private: true` (a **repo-owned** capability: listed, but usable only by souls
|
|
157
|
+
of its own repo) and `team: <label>`
|
|
158
|
+
(the one workspace team label it is listed under; without it, the primary of
|
|
159
|
+
its repository's default). The machine-readable contract is
|
|
147
160
|
[`capability-manifest.schema.json`](capability-manifest.schema.json).
|
|
148
161
|
|
|
149
162
|
## Who gets a capability
|
|
@@ -171,14 +184,72 @@ knowledge:
|
|
|
171
184
|
```
|
|
172
185
|
|
|
173
186
|
Composition order: `defaults.<slot>` ⊕ `defaults.capabilities` ⊕
|
|
174
|
-
`defaults.byTeam[<
|
|
175
|
-
removes, a soul `<slot>: none` drops
|
|
187
|
+
`defaults.byTeam[<label>]` for each of the soul's team labels, in order ⊕
|
|
188
|
+
`soul.capabilities` — later wins, `off` removes, a soul `<slot>: none` drops
|
|
189
|
+
the workspace's slot default. Two labels that give one capability different
|
|
190
|
+
entries are `E_TEAM_CONFLICT`, naming both labels; identical entries are fine,
|
|
191
|
+
and a capability the soul names itself settles it (the soul's entry wins). A resolved
|
|
176
192
|
capability whose manifest says `layer: X` fills slot X; two for one slot are
|
|
177
|
-
`E_SLOT_CONFLICT`. Provider settings
|
|
178
|
-
|
|
179
|
-
|
|
193
|
+
`E_SLOT_CONFLICT`. Provider settings start from the manifest's own declared
|
|
194
|
+
defaults (`settings.<key>.default`, the lowest layer), then take the workspace's
|
|
195
|
+
`messaging` payload (its base: no `byTeam` entry is merged, per teams
|
|
196
|
+
amendment K) for the messaging slot, the soul's
|
|
197
|
+
slot payload, `oats-local.yaml` `settings.<cap>`, and `oats spawn --provider`,
|
|
198
|
+
deep-merged in that order. There are no agent types, no `global`, no
|
|
180
199
|
per-deployment activation or exclusion maps.
|
|
181
200
|
|
|
201
|
+
### Several team labels
|
|
202
|
+
|
|
203
|
+
A soul's `team` (or its repository's default in `oats-membership.yaml`) is a
|
|
204
|
+
label or a non-empty list of distinct labels; the first is the **primary**:
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
# souls/release-manager/soul.yaml
|
|
208
|
+
schemaVersion: 2
|
|
209
|
+
name: release-manager
|
|
210
|
+
description: Cuts and ships releases.
|
|
211
|
+
work: worktree
|
|
212
|
+
team: [engineering, reviewers]
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
- `OATS_TEAM_LABEL` is the primary label. The merged messaging payload takes
|
|
216
|
+
**no** label's `byTeam` entry, the primary's included (teams amendment K), so
|
|
217
|
+
`OATS_TEAM_ID` (the payload's `team`) is the personal team a host, soul or
|
|
218
|
+
spawn set; empty means the provider's default.
|
|
219
|
+
- Every label is an **eligible team**: the kernel hands the messaging provider
|
|
220
|
+
`teams`, one `{ label, team, mapped, payload }` per label in order. `payload`
|
|
221
|
+
is `workspace.messaging` ⊕ `byTeam[<label>]` when the workspace maps the
|
|
222
|
+
label (`team` is then its team id), else the base alone with `mapped: false`
|
|
223
|
+
and `team: null`. A soul with no label gets `[]` (personal only).
|
|
224
|
+
- `teams` travels **beside** a provider's settings, never inside them:
|
|
225
|
+
`OATS_TEAMS` (the JSON), `OATS_TEAM_LABELS` (comma-joined) and
|
|
226
|
+
`OATS_TEAMS_SOURCE` in the environment of every hook, home command and
|
|
227
|
+
provider check. The environment is their only channel: a check's stdin
|
|
228
|
+
request stays the released binding wire, which providers decode strictly.
|
|
229
|
+
The variables are empty (not `[]`) when a home's teams are unknown.
|
|
230
|
+
- `OATS_TEAMS_SOURCE` is `live` (read from the workspace now, or a fresh
|
|
231
|
+
resolution) or `recorded` (the spawn-time list). **A provider leaves a joined
|
|
232
|
+
team only on a `live` list**: a recorded one lacks every team mapped since
|
|
233
|
+
the spawn, so acting on it could drop a valid membership.
|
|
234
|
+
- Joining an eligible team is the provider's explicit act (a spawn choice or a
|
|
235
|
+
command at any time); the kernel never joins anything.
|
|
236
|
+
- For an existing home the teams are **live** where they are acted on: its
|
|
237
|
+
launch hook (`oats session start|restart`), its messaging module's commands
|
|
238
|
+
and `messaging:` operations (`oats operation run --home`), and `oats inspect
|
|
239
|
+
--home` read the soul's labels and the workspace's `messaging` as they stand
|
|
240
|
+
now — two repository reads (the workspace host, the soul's own repo), never a
|
|
241
|
+
discovery; `oats readiness --home` takes them from the discovery it already
|
|
242
|
+
runs. The home's modules and skills stay as spawned. Every other capability
|
|
243
|
+
command and operation gets the teams the spawn recorded in `instance.json`
|
|
244
|
+
(`teams`), marked `recorded`, at no remote cost; so does any read where the
|
|
245
|
+
workspace cannot be reached.
|
|
246
|
+
- **Known limitation (0.26.0):** a scheduled wake's session start uses the
|
|
247
|
+
recorded teams (`OATS_TEAMS_SOURCE=recorded`), so its launch hook leaves
|
|
248
|
+
nothing; the next operator start or messaging command is live.
|
|
249
|
+
- A label in the workspace's `teams:` but not in `messaging.byTeam` is a
|
|
250
|
+
discovery warning (`unmapped-team-label`, one per label naming its souls); a
|
|
251
|
+
label not in `teams:` at all is the `E_TEAM_UNKNOWN` problem.
|
|
252
|
+
|
|
182
253
|
## Exact runtime composition
|
|
183
254
|
|
|
184
255
|
Every spawned instance receives:
|
|
@@ -223,10 +294,10 @@ A **package** is the versioned tier: a directory with an `oats-package.json`
|
|
|
223
294
|
that enumerates one or more capabilities (schema
|
|
224
295
|
[`oats-package.schema.json`](oats-package.schema.json)). It is pinned once in
|
|
225
296
|
the workspace's `packages:`, resolved to an exact commit + integrity by
|
|
226
|
-
`oats sync` into `oats-lock.json` (lockfileVersion 3)
|
|
227
|
-
|
|
228
|
-
`from: package`. Everything about declaring, syncing, locking
|
|
229
|
-
|
|
297
|
+
`oats sync` into `oats-lock.json` (lockfileVersion 3); declaring it is the
|
|
298
|
+
workspace's decision to trust it. A soul names a package capability with
|
|
299
|
+
`from: package`. Everything about declaring, syncing, locking and publishing
|
|
300
|
+
packages is in [packages.md](packages.md). There is no installed
|
|
230
301
|
copy at a deployment and no `oats install`/`trust`/`update`/`remove`.
|
|
231
302
|
|
|
232
303
|
## Member capabilities
|
|
@@ -236,8 +307,9 @@ by every soul in the workspace (`oats capabilities` lists it with origin
|
|
|
236
307
|
`member <repo key> @ <commit>`) and is named with `from: <repo key>` — or
|
|
237
308
|
`from: here` by souls of the same repo. It is trusted by **membership**: the
|
|
238
309
|
repo's access control is the boundary and its latest default-branch state is
|
|
239
|
-
what is copied. `private: true` in the manifest
|
|
240
|
-
|
|
310
|
+
what is copied. `private: true` in the manifest makes it **repo-owned**: still
|
|
311
|
+
listed (`private: true`, marked "(repo-owned)"), but usable only from its own
|
|
312
|
+
repo (`E_CAPABILITY_PRIVATE` elsewhere). A member's `oats-package/` is **not** a member capability: it is
|
|
241
313
|
reported as `publishes` and consumed only as a package.
|
|
242
314
|
|
|
243
315
|
## Capability-defined agents
|
|
@@ -255,6 +327,10 @@ instance's modules (or the soul's resolved set). Workspace commands (`sync`,
|
|
|
255
327
|
`package`, `workspace status`, `capabilities`, `souls`, `doctor`) are always
|
|
256
328
|
available.
|
|
257
329
|
|
|
330
|
+
A manifest's `helperInjection` and a hook's `inputs` are **ignored since 0.26**:
|
|
331
|
+
they served the captured path (removed in 0.26), are still accepted so that
|
|
332
|
+
existing manifests load, and change nothing.
|
|
333
|
+
|
|
258
334
|
Hooks receive `OATS_EVENT`, `OATS_CAPABILITY`, `OATS_LAYER`, `OATS_INSTANCE`,
|
|
259
335
|
`OATS_HOME`, `OATS_AGENT`, `OATS_SOUL`, `OATS_CONTEXT`, `OATS_WORKSPACE`,
|
|
260
336
|
`OATS_ROOT`, `OATS_LEVEL`, `OATS_SETTINGS`, and `OATS_META`. A final JSON line may
|
|
@@ -263,7 +339,7 @@ return `meta`, `brief`, `warning`, or runtime-specific `launch` arguments. A
|
|
|
263
339
|
returning `env` from retire or soul-scaffold is an explicit contract error.
|
|
264
340
|
|
|
265
341
|
A **launch hook** runs at every start and restart of a home for each provider
|
|
266
|
-
|
|
342
|
+
recorded at spawn (under its recorded settings). Its `launch` arguments and
|
|
267
343
|
`env` replace that provider's previous contribution whole. Its `meta`, when
|
|
268
344
|
returned, replaces that provider's entry in `instance.json.capabilityMeta`
|
|
269
345
|
after the start succeeds — the same record the spawn hook wrote and the retire
|
|
@@ -285,17 +361,19 @@ hyphen to `_` would let `aweb-evil.*` collide with names already inside
|
|
|
285
361
|
A manifest's `settings.<key>` may carry `hostOnly: true` (decision 27). Such a
|
|
286
362
|
key is a fact about the machine — a custody directory, a state root — and the
|
|
287
363
|
resolver accepts it only from the deployment's own `oats-local.yaml`
|
|
288
|
-
`settings.<capability>`; a committed workspace or soul file
|
|
289
|
-
|
|
364
|
+
`settings.<capability>`; a committed workspace or soul file (every
|
|
365
|
+
`messaging.byTeam` entry of a label the soul carries included) or a
|
|
366
|
+
`--provider` flag carrying it is refused (`E_WORKSPACE_SCHEMA`, reason
|
|
367
|
+
`host-only-key`).
|
|
290
368
|
Declare it for any key whose value points at something a committed file must
|
|
291
369
|
never be able to choose.
|
|
292
370
|
|
|
293
371
|
A hook may return only names in its manifest's exact `environment` declaration.
|
|
294
372
|
For package capabilities that declaration is part of the integrity-locked tree
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
373
|
+
the workspace declared; for member capabilities it is part of what membership
|
|
374
|
+
trusts. Undeclared output is fatal. This positive authority is the contract
|
|
375
|
+
boundary — adding a new launch variable requires a visible manifest change
|
|
376
|
+
(and, for a package, a new version, reviewed as a new pin).
|
|
299
377
|
|
|
300
378
|
`OATS_*`, `PI_AGENT_*`, kernel launch variables, and known shell/bootstrap/loader
|
|
301
379
|
names are also rejected as defense in depth. The denylist includes current Node,
|
|
@@ -327,12 +405,9 @@ this mechanism must never copy or expose that global identity's root keys to the
|
|
|
327
405
|
worker process. Session-scoped execution credentials need a separate lifecycle
|
|
328
406
|
and must not be encoded into this persisted spawn command.
|
|
329
407
|
|
|
330
|
-
Spawn
|
|
408
|
+
Spawn order is by capability name; retirement reverses successful
|
|
331
409
|
spawn order. Hooks run from the instance's own copy
|
|
332
|
-
(`<home>/.oats/modules/<cap>/`).
|
|
333
|
-
canonical or another capability's files. OATS records ownership, restores the
|
|
334
|
-
pre-hook snapshot, and raises a conflict instead of accepting destructive or
|
|
335
|
-
last-writer-wins behavior.
|
|
410
|
+
(`<home>/.oats/modules/<cap>/`).
|
|
336
411
|
|
|
337
412
|
## Official packages
|
|
338
413
|
|
|
@@ -340,14 +415,14 @@ last-writer-wins behavior.
|
|
|
340
415
|
|---|---|---|---|
|
|
341
416
|
| `oats.core` | additive | day-to-day OATS operation for an instance | `oats.framework` |
|
|
342
417
|
| `oats.setup` | additive | whole-architecture knowledge for an onboarding expert | `oats.framework` |
|
|
343
|
-
| `oats.okf` | knowledge
|
|
344
|
-
| `oats.aweb` | messaging
|
|
345
|
-
| `oats.jira` | tasks
|
|
346
|
-
| `oats.linear` | tasks
|
|
418
|
+
| `oats.okf` | knowledge core capability | External owned OKF bases, durable notes/record custody, independent judgment and inspection | `oats.okf` |
|
|
419
|
+
| `oats.aweb` | messaging core capability | aweb identity lifecycle and messaging skills | `oats.aweb` |
|
|
420
|
+
| `oats.jira` | tasks core capability | Jira task protocol via `acli` | `oats.jira` |
|
|
421
|
+
| `oats.linear` | tasks core capability | Linear GraphQL task commands and workflow | `oats.linear` |
|
|
347
422
|
| `oats.authoring` | additive | capability, skill, and soul authoring guidance | `oats.authoring` |
|
|
348
423
|
|
|
349
424
|
Each is pinned by a bare version in `packages:` and resolved through the
|
|
350
|
-
[official catalog](official-
|
|
425
|
+
[official catalog](official-catalog.md); each package repo is also a member
|
|
351
426
|
of the OATS workspace carrying its expert soul (`okf-expert`, `aweb-expert`, …).
|
|
352
427
|
The framework's own souls say `oats.okf: { from: package }` — membership never
|
|
353
428
|
turns a package into a latest-state capability.
|
|
@@ -358,3 +433,99 @@ A manifest may declare `operations` (named actions or views delegating to
|
|
|
358
433
|
its own commands) that a GUI or a schedule invokes through `oats operation
|
|
359
434
|
run <layer>:<name>`; `oats inspect --json` reports them with availability.
|
|
360
435
|
See [docs/design/operations-contract.md](design/operations-contract.md).
|
|
436
|
+
|
|
437
|
+
## Readiness check (`binding.check`)
|
|
438
|
+
|
|
439
|
+
A slot provider (knowledge, messaging, tasks) that declares `binding` in its
|
|
440
|
+
manifest is asked by `oats readiness` whether it is ready for the subject. The
|
|
441
|
+
subject is an instance home (`--home`) or a soul (`--soul`). The command named
|
|
442
|
+
by `binding.check` receives one request and answers once. The kernel relays
|
|
443
|
+
that answer to consumers as it came: readiness `providers` items. For the
|
|
444
|
+
consumer side, see [desktop-cli-api.md](desktop-cli-api.md#oats-readiness---home---soul---dir---policy---json-readinessapi-2).
|
|
445
|
+
This check reads configuration only; it binds nothing and does not change a
|
|
446
|
+
spawn's fail-closed hooks.
|
|
447
|
+
|
|
448
|
+
```json
|
|
449
|
+
"commands": { "binding-check": "bin/my-provider.mjs binding-check" },
|
|
450
|
+
"binding": { "version": 1, "normalize": "binding-normalize", "bind": "binding-bind", "check": "binding-check" }
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
**Invocation.** The kernel runs the command's script with `node`, from the
|
|
454
|
+
module directory. That is the home's module copy for `--home`, or the
|
|
455
|
+
deployment's verified module store for `--soul`. The script must resolve inside
|
|
456
|
+
the module and be a regular file. The command's words after the script are
|
|
457
|
+
passed as arguments; no shell is involved.
|
|
458
|
+
|
|
459
|
+
**Request** — one JSON document on stdin:
|
|
460
|
+
|
|
461
|
+
```json
|
|
462
|
+
{"schemaVersion":1,"phase":"check","slot":"messaging","capability":"my.provider",
|
|
463
|
+
"settings":{"team":"acme:eng","root":"/srv/aw"},
|
|
464
|
+
"input":{"context":{"kind":"workspace","workspace":"github.com/acme/agents","deployment":"/srv/acme",
|
|
465
|
+
"soul":"release-manager","team":"engineering","instance":"release-manager-1",
|
|
466
|
+
"home":"/srv/acme/agents/release-manager/instances/release-manager-1"},
|
|
467
|
+
"action":{"kind":"readiness"}}}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
- `slot` is the manifest's `layer`.
|
|
471
|
+
- `settings` is the merged provider payload: the one the spawn recorded for a
|
|
472
|
+
home, or the one the resolution computes for a soul.
|
|
473
|
+
- The request has exactly these keys; a provider may decode it strictly. The
|
|
474
|
+
soul's eligible teams (see *Several team labels*) are not on stdin: the check
|
|
475
|
+
reads them from `OATS_TEAMS` / `OATS_TEAMS_SOURCE` / `OATS_TEAM_LABELS`.
|
|
476
|
+
- `context.team` is the soul's primary team label, or `null`.
|
|
477
|
+
- `instance` and `home` are `null` for a soul subject.
|
|
478
|
+
|
|
479
|
+
**Environment:**
|
|
480
|
+
- Every ambient `OATS_*`, `OAS_*` and `PI_*` variable is removed. Other
|
|
481
|
+
variables pass through.
|
|
482
|
+
- The kernel sets:
|
|
483
|
+
- `OATS_CAPABILITY` and `OATS_SETTINGS` (the payload as JSON);
|
|
484
|
+
- `OATS_CLI_BIN`;
|
|
485
|
+
- `OATS_WORKSPACE` (the deployment);
|
|
486
|
+
- the team variables `OATS_TEAM_ID` (the messaging payload's `team`: the
|
|
487
|
+
personal team if one is set; empty = the provider's default),
|
|
488
|
+
`OATS_TEAM_SCOPE`, `OATS_TEAM_LABEL`, `OATS_TEAM_NAME`,
|
|
489
|
+
`OATS_TEAM_LABELS`, `OATS_TEAMS`, `OATS_TEAMS_SOURCE`, `OATS_WORKSPACE_NAME` and
|
|
490
|
+
`OATS_WORKSPACE_KEY`;
|
|
491
|
+
- `OATS_AGENT` (the soul);
|
|
492
|
+
- `OATS_SOUL` when the soul directory is known;
|
|
493
|
+
- for a home, `OATS_INSTANCE` and `OATS_INSTANCE_HOME`.
|
|
494
|
+
- A home's `OATS_WORKSPACE_NAME` is `""` until spawn records the workspace
|
|
495
|
+
name.
|
|
496
|
+
|
|
497
|
+
**Answer** — exit 0, and exactly one JSON document on stdout (whitespace
|
|
498
|
+
around it is fine; progress text is not):
|
|
499
|
+
|
|
500
|
+
```json
|
|
501
|
+
{"schemaVersion":1,"phase":"check","slot":"messaging","capability":"my.provider","ok":true,
|
|
502
|
+
"result":{"status":"ready","problems":[],"warnings":[{"code":"e2ee-disabled","message":"end-to-end encryption is off for this team"}]}}
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
- **The envelope** has exactly these keys. `schemaVersion`, `phase`, `slot`
|
|
506
|
+
and `capability` echo the request.
|
|
507
|
+
- **A refusal** is `{…, "ok": false, "error": {"code", "message"?}}`.
|
|
508
|
+
Readiness shows it as `unknown`, with your code.
|
|
509
|
+
- **`status`** is one of four values, and maps to the readiness item as
|
|
510
|
+
follows:
|
|
511
|
+
|
|
512
|
+
| `status` | readiness item | use it when |
|
|
513
|
+
|---|---|---|
|
|
514
|
+
| `ready` | `pass` | nothing is missing; `problems` must be `[]` |
|
|
515
|
+
| `needs-configuration` | `fail` | a setting or host resource is missing |
|
|
516
|
+
| `authorization-required` | `fail` | the operator must log in or grant access |
|
|
517
|
+
| `unavailable` | `unknown` | you cannot tell right now (a service is down) |
|
|
518
|
+
|
|
519
|
+
- **`problems`** is a list of `{code, message}` strings. The codes are yours;
|
|
520
|
+
they are not matched against `binding.reasons`. The first message becomes
|
|
521
|
+
the item's reason.
|
|
522
|
+
- **`warnings`** is optional: `{code, message}` strings, relayed as they come.
|
|
523
|
+
A warning never changes the status or the readiness summary.
|
|
524
|
+
- **Anything else is `unknown`** (`provider-unavailable`): a nonzero exit, two
|
|
525
|
+
documents, unknown keys, a wrong echo, or `ready` with problems.
|
|
526
|
+
|
|
527
|
+
**Time.** Each check gets at most 30 s and is killed after that. All provider
|
|
528
|
+
checks in one readiness read share 60 s, and checks the budget does not reach
|
|
529
|
+
are not run (`unknown`, `time-budget-exhausted`). Answer from configuration
|
|
530
|
+
and local state. A provider that must call a remote service should bound that
|
|
531
|
+
call well inside the 30 s.
|
|
@@ -55,6 +55,15 @@
|
|
|
55
55
|
"type": "string",
|
|
56
56
|
"minLength": 1
|
|
57
57
|
},
|
|
58
|
+
"private": {
|
|
59
|
+
"type": "boolean",
|
|
60
|
+
"description": "Workspace discovery: true makes this member capability repo-owned — listed (private: true) but usable only by souls of its own repository (E_CAPABILITY_PRIVATE elsewhere)."
|
|
61
|
+
},
|
|
62
|
+
"team": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"pattern": "^[a-z0-9][a-z0-9._-]*$",
|
|
65
|
+
"description": "Workspace discovery: the team label for this capability; else the repository's default from oats-membership.yaml."
|
|
66
|
+
},
|
|
58
67
|
"layer": {
|
|
59
68
|
"enum": [
|
|
60
69
|
"knowledge",
|
|
@@ -170,7 +179,7 @@
|
|
|
170
179
|
}
|
|
171
180
|
},
|
|
172
181
|
"binding": {
|
|
173
|
-
"description": "Versioned provider-owned normalize/bind/check phases, each naming an existing command in this manifest. Runtime validation enforces
|
|
182
|
+
"description": "Versioned provider-owned normalize/bind/check phases, each naming an existing command in this manifest. Runtime validation enforces that the phases belong to a core capability (a manifest with `layer`) and command references; presence is not approval or provider readiness.",
|
|
174
183
|
"type": "object",
|
|
175
184
|
"required": ["version", "normalize", "bind", "check"],
|
|
176
185
|
"additionalProperties": false,
|
|
@@ -247,11 +256,11 @@
|
|
|
247
256
|
"items": {
|
|
248
257
|
"type": "string"
|
|
249
258
|
},
|
|
250
|
-
"description": "Package-relative soul directories (soul.yaml + AGENTS.md) \u2014 capability-defined agents; they resolve
|
|
259
|
+
"description": "Package-relative soul directories (soul.yaml + AGENTS.md) \u2014 capability-defined agents; they resolve where the capability is active, souls stay read-only in the package, instances home under <deployment>/agents/<agent>/instances/."
|
|
251
260
|
},
|
|
252
261
|
"settings": {
|
|
253
262
|
"type": "object",
|
|
254
|
-
"description": "Declared capability settings: name to { default, values?, description }. Documentation for `oats
|
|
263
|
+
"description": "Declared capability settings: name to { default, values?, description }. Documentation for the values a soul, oats-local.yaml or `oats spawn --provider` supplies; undeclared settings are still accepted.",
|
|
255
264
|
"additionalProperties": {
|
|
256
265
|
"type": "object",
|
|
257
266
|
"properties": {
|
|
@@ -274,7 +283,7 @@
|
|
|
274
283
|
},
|
|
275
284
|
"environmentNamespaces": {
|
|
276
285
|
"type": "array",
|
|
277
|
-
"description": "Additional environment-name prefixes this capability may declare besides its vendor's own (e.g. AWEB_ for the official oats.aweb
|
|
286
|
+
"description": "Additional environment-name prefixes this capability may declare besides its vendor's own (e.g. AWEB_ for the official oats.aweb messaging capability). Each is an uppercase prefix ending in an underscore; the reserved core (OATS_, PI_AGENT_) and process bootstrap namespaces cannot be claimed. Disclosed at trust time with the environment list.",
|
|
278
287
|
"items": {
|
|
279
288
|
"type": "string",
|
|
280
289
|
"pattern": "^[A-Z][A-Z0-9]*_$"
|
package/docs/configuration.md
CHANGED
|
@@ -13,7 +13,8 @@ derived from workspace defaults plus each soul's `capabilities:` — and its
|
|
|
13
13
|
`souls:` blocks are gone — per-instance provider content moved to
|
|
14
14
|
`oats spawn … --provider`. There is no `oats init`, no `oats use`, no config
|
|
15
15
|
scope chain, no adopted config templates. A 0.24.x deployment is rebuilt, not
|
|
16
|
-
converted:
|
|
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`.
|
|
17
18
|
|
|
18
19
|
## The file
|
|
19
20
|
|
|
@@ -33,6 +34,16 @@ settings: # optional — host-owned values pe
|
|
|
33
34
|
|
|
34
35
|
souls: # optional — souls this machine does not run
|
|
35
36
|
disabled: [data-analyst]
|
|
37
|
+
|
|
38
|
+
launch-configs: # optional — named ways this host starts a harness
|
|
39
|
+
personal:
|
|
40
|
+
runtime: claude
|
|
41
|
+
executable: "./bin/claude-wrapper.sh" # relative → against this deployment directory
|
|
42
|
+
args: ["--verbose"]
|
|
43
|
+
env:
|
|
44
|
+
CLAUDE_CONFIG_DIR: { fromEnv: PERSONAL_CLAUDE_DIR }
|
|
45
|
+
model: opus
|
|
46
|
+
yolo: false
|
|
36
47
|
```
|
|
37
48
|
|
|
38
49
|
Schema: [`oats-local.schema.json`](oats-local.schema.json). Unknown keys are
|
|
@@ -44,6 +55,7 @@ refused (`E_WORKSPACE_SCHEMA`).
|
|
|
44
55
|
| `clones` | `<canonical repo key>: <absolute path>` — where a member's clone lives when it is not at `<deployment>/<member name>/`. Only a soul's **work target** (`work: worktree \| checkout`) needs a clone. Lookup order: `spawn --repo`, then this map (keys normalised through `parseRepoRef`, so any ref spelling of the same repo matches), then `<deployment>/<member name>` (a member named `agents` → `<deployment>/agents-repo`, since `agents/` is the instance root); none → `E_CLONE_MISSING`; a directory whose `origin` is another repo → `E_CLONE_MISMATCH`. |
|
|
45
56
|
| `settings.<cap>.<key>` | Host-owned provider values the capability's manifest asks for — absolute paths, state roots, delivery modes. The workspace file **refuses** absolute paths; this is where they go. Merged into the capability's provider payload after the soul's own payload and before any `--provider` flag (see [three homes](workspaces.md#provider-payloads-have-three-homes)). |
|
|
46
57
|
| `souls.disabled` | Soul names not run on this machine; reported by `oats sync` ("disabled here"). |
|
|
58
|
+
| `launch-configs.<name>` | A named way to start a harness on this host (0.26.0; lead decision 2 — a spawn-time host choice, never a soul field): `runtime` (`pi` \| `claude` \| `codex`, required), `executable` (a bare name looked up on `PATH`, or a path — relative to this deployment directory), `args` (literal, no shell), `env` (a literal string, non-secret by contract and always redacted, or `{ fromEnv: NAME }` resolved on the host at start), `model`, `yolo`. Selected with `--launch-config <name>` on `oats spawn` and `oats session start \| restart`; explicit flags override its fields. Written by `oats launch-config set <name> --file <json>` / `remove <name>`, which rewrite only this block. Earlier kernels read `launch-configs:` from a scope's `oats-config.yaml`; 0.26.0 refuses it there with a message naming this move. |
|
|
47
59
|
|
|
48
60
|
## Where it sits and how it is found
|
|
49
61
|
|
|
@@ -76,8 +88,8 @@ nothing else.
|
|
|
76
88
|
activation or targeting.
|
|
77
89
|
- **Versions** — `packages:` in the workspace file; exact commits in
|
|
78
90
|
`oats-lock.json`.
|
|
79
|
-
- **Trust** — membership for members;
|
|
80
|
-
packages. No per-operator trust list.
|
|
91
|
+
- **Trust** — membership for members; the declaration in the workspace's
|
|
92
|
+
`packages:` for packages (no approval step). No per-operator trust list.
|
|
81
93
|
- **Per-instance provider facts** (a retained messaging seat, a one-off state
|
|
82
94
|
root) — `oats spawn <soul> --provider <cap> key=value`, recorded in
|
|
83
95
|
`instance.json.providers`.
|
|
@@ -86,8 +98,8 @@ nothing else.
|
|
|
86
98
|
## Inspecting the effective configuration
|
|
87
99
|
|
|
88
100
|
```bash
|
|
89
|
-
oats workspace status # membership table, locked packages,
|
|
90
|
-
oats sync # confirm, resolve,
|
|
101
|
+
oats workspace status # membership table, locked packages, external souls
|
|
102
|
+
oats sync # confirm, resolve, lock, report the diff
|
|
91
103
|
oats capabilities | oats souls # everything a soul may name, with origin and team
|
|
92
104
|
oats spawn <soul> --preview # the exact modules (from/commit/changedSince), team, resolution revision
|
|
93
105
|
oats doctor # this deployment's oats-local.yaml and lock, plus kernel diagnostics
|
package/docs/conventions.md
CHANGED
|
@@ -6,8 +6,8 @@ instance-local views for deployment composition.
|
|
|
6
6
|
## Operating documents
|
|
7
7
|
|
|
8
8
|
```text
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
souls/<name>/AGENTS.md # canonical role instructions (in the member repo)
|
|
10
|
+
souls/<name>/CLAUDE.md -> AGENTS.md
|
|
11
11
|
instance/AGENTS.md # generated regular file
|
|
12
12
|
instance/CLAUDE.md -> AGENTS.md
|
|
13
13
|
```
|
|
@@ -66,35 +66,25 @@ where its owner keeps it and is copied whole into each instance at spawn:
|
|
|
66
66
|
```text
|
|
67
67
|
<member repo>/capabilities/<name>/oats.json # member-tier capability, latest state (membership is the trust)
|
|
68
68
|
<package repo>/oats-package/oats-package.json # package-tier: versioned via oats-workspace.yaml packages:
|
|
69
|
-
<deployment>/oats-lock.json # lockfileVersion 3: package commit
|
|
69
|
+
<deployment>/oats-lock.json # lockfileVersion 3: package commit and integrity
|
|
70
70
|
<instance>/.oats/modules/<capability>/ # the copy this instance runs
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
**Classic 0.24 layout** (still launched by the 0.24 kernel; a 0.25 kernel
|
|
74
|
-
reads none of it as configuration — see [rebuild-to-v2.md](rebuild-to-v2.md)):
|
|
75
|
-
|
|
76
|
-
```text
|
|
77
|
-
<package>/capabilities/<name>/oats.json # the official marketplace (install source, not ambient)
|
|
78
|
-
<level>/.agents/capabilities/installed/<name>/oats.json # acquired (gitignored, restorable)
|
|
79
|
-
<level>/.agents/capabilities/owned/<name>/oats.json # authored at this scope (source; committed where the scope is a repo)
|
|
80
|
-
<level>/oats-lock.json # lockfileVersion 2: external source/integrity/trust
|
|
81
|
-
```
|
|
82
|
-
|
|
83
73
|
## Quick map
|
|
84
74
|
|
|
85
|
-
| Thing | Canonical location
|
|
86
|
-
|
|
87
|
-
| Shared declaration | `oats-workspace.yaml` in the host repo; `oats-membership.yaml` in every member |
|
|
88
|
-
| Per-machine config | `<deployment>/oats-local.yaml` (uncommitted) |
|
|
89
|
-
| Acquisition lock | `<deployment>/oats-lock.json` (v3) |
|
|
90
|
-
| Soul source | `<member repo>/souls/<name>/` |
|
|
91
|
-
| Soul operating doc | `souls/<name>/AGENTS.md` |
|
|
92
|
-
| Soul Claude view | `souls/<name>/CLAUDE.md -> AGENTS.md` |
|
|
93
|
-
| Soul-private skills | `souls/<name>/skills/` |
|
|
94
|
-
| Instance operating doc | `instance/AGENTS.md` (generated) |
|
|
95
|
-
| Instance skill set | `instance/.agents/skills/` |
|
|
96
|
-
| Instance modules | `instance/.oats/modules/<capability>/` |
|
|
97
|
-
| Instance metadata | `instance/instance.json` (`modules{}`, `providers{}`, `workspace{}`) |
|
|
75
|
+
| Thing | Canonical location |
|
|
76
|
+
|---|---|
|
|
77
|
+
| Shared declaration | `oats-workspace.yaml` in the host repo; `oats-membership.yaml` in every member |
|
|
78
|
+
| Per-machine config | `<deployment>/oats-local.yaml` (uncommitted) |
|
|
79
|
+
| Acquisition lock | `<deployment>/oats-lock.json` (v3) |
|
|
80
|
+
| Soul source | `<member repo>/souls/<name>/` |
|
|
81
|
+
| Soul operating doc | `souls/<name>/AGENTS.md` |
|
|
82
|
+
| Soul Claude view | `souls/<name>/CLAUDE.md -> AGENTS.md` |
|
|
83
|
+
| Soul-private skills | `souls/<name>/skills/` |
|
|
84
|
+
| Instance operating doc | `instance/AGENTS.md` (generated) |
|
|
85
|
+
| Instance skill set | `instance/.agents/skills/` |
|
|
86
|
+
| Instance modules | `instance/.oats/modules/<capability>/` |
|
|
87
|
+
| Instance metadata | `instance/instance.json` (`modules{}`, `providers{}`, `workspace{}`) |
|
|
98
88
|
|
|
99
89
|
Symlinks prevent compatibility paths from drifting. Generated regular files
|
|
100
90
|
separate canonical portable identity from scope-dependent runtime policy.
|
|
@@ -32,7 +32,7 @@ how to choose and combine them. A working installation must remain operable
|
|
|
32
32
|
without the expert running or the original setup conversation being available.
|
|
33
33
|
|
|
34
34
|
The architecture principle is already in the
|
|
35
|
-
|
|
35
|
+
September 3 architecture proposal (removed in 0.26.0; it is in the v0.25.x tags):
|
|
36
36
|
|
|
37
37
|
> Contracts and bootstrap skills in OATS; implementations in packages.
|
|
38
38
|
|
|
@@ -85,8 +85,8 @@ code already says**.
|
|
|
85
85
|
## 2. Vocabulary
|
|
86
86
|
|
|
87
87
|
These terms are used precisely throughout. Most are already OATS vocabulary
|
|
88
|
-
(`docs/knowledge.md`, `docs/knowledge-theory.md`,
|
|
89
|
-
|
|
88
|
+
(`docs/knowledge.md`, `docs/knowledge-theory.md`, the September 3
|
|
89
|
+
architecture proposal); the new ones are marked.
|
|
90
90
|
|
|
91
91
|
| Term | Meaning |
|
|
92
92
|
|---|---|
|
|
@@ -721,7 +721,7 @@ repository is named.
|
|
|
721
721
|
| 2026-07-26 | Provider-agnostic specialization: compounding expertise across sessions, models, and runtimes; memory outside any one harness. | `decisions/provider-agnostic-specialization-and-curated-context.md`. |
|
|
722
722
|
| 2026-08-27 | Investigation of the public auto-memory audit: governed memory must survive that audit; developer souls must not mirror code; harness-agnostic knowledge enables mixed-runtime teams. | `lessons/governed-memory-survives-auto-memory-audit.md`, `lessons/developer-souls-should-not-mirror-code.md`, `lessons/harness-agnostic-knowledge-enables-mixed-runtime-teams.md`; the video "Turn off Claude Code's Memory" (Theo, t3.gg, YouTube id Jf54k7tFeEc). |
|
|
723
723
|
| 2026-08-27 | Founder correction: developer and UX souls hold decisions, rejected alternatives, inspiration genealogy, and typed slow state; the bias is against descriptions, not decisions. Decision-vs-description; one home per decision; freshness discipline. | Steward note `decision-vs-description-and-knowledge-homing.md` (instance notes, pending harvest); relayed to the OATS coordinator on 2026-09-04. |
|
|
724
|
-
| 2026-09-03/04 | OATS architecture proposal: knowledge is a contract with a read side and a write side; a harvester is a soul type permitted to write knowledge; the write side's doctrine is decision versus description; non-coding specialists are almost pure knowledge; custody scoping belongs to the contract. |
|
|
724
|
+
| 2026-09-03/04 | OATS architecture proposal: knowledge is a contract with a read side and a write side; a harvester is a soul type permitted to write knowledge; the write side's doctrine is decision versus description; non-coding specialists are almost pure knowledge; custody scoping belongs to the contract. | the September 3 architecture proposal (this repository until 0.26.0; in the v0.25.x tags), sections "Soul type", "The slot contracts", "Three simplifications". |
|
|
725
725
|
| 2026-09-05 to 09-08 | Record-fed harvest shipped: `oats.okf` 1.5.0 to 1.6.1 (record windows, watermark, replan detection, exclusions, harvest runtime and model settings, non-zero exit on failure, inspect view and harvest action). | `capabilities/oats-okf/` at 1.6.1 (this repository); `docs/design/operations-contract.md`. |
|
|
726
726
|
| 2026-09-07 | Founder: the OATS team holds the agreed architecture vision; OAS-side review is advisory. | Steward note `oats-vision-delegated-to-juan.md`. |
|
|
727
727
|
| 2026-09-08 | Expert-assisted deployment proposal: shared knowledge collections with explicit promotion destinations; pending-for-owner for ambiguous material; the expert must not become the deployment's database; acceptance is knowledge output, not harvester activity. | `docs/design/2026-09-08-expert-assisted-deployment-proposal.md` (this repository), "Shared knowledge and promotion destinations"; steward note `deployment-as-capability-not-a-layer.md`. |
|
|
@@ -700,8 +700,8 @@ feature work forward.
|
|
|
700
700
|
## Current implementation references
|
|
701
701
|
|
|
702
702
|
These provide baseline context, not proof that this proposal is implemented:
|
|
703
|
-
-
|
|
704
|
-
-
|
|
703
|
+
- Package engine (`package-engine-contract.md`, removed in 0.26)
|
|
704
|
+
- Package runtime API (`package-runtime-api.md`, removed in 0.26)
|
|
705
705
|
- [Configuration](../configuration.md)
|
|
706
706
|
- [Souls and instances](../souls-and-instances.md)
|
|
707
707
|
- [Multi-team/deployment proposal](2026-09-08-expert-assisted-deployment-proposal.md)
|
|
@@ -33,8 +33,8 @@ instance review file or original conversation is an acceptance dependency.
|
|
|
33
33
|
| 4 | [Retention contract](2026-09-14-artifact-retention-contract.md) | Landed and binding: store semantics, captured resolution and consumer migration. |
|
|
34
34
|
| 5 | [Implementation checklist/ledger](2026-09-15-portable-souls-implementation.md) | Clause-by-clause mapping, dependency order, evidence and pending gates. |
|
|
35
35
|
| 6 | [Knowledge direction](2026-09-13-knowledge-and-memory-direction.md) and [current knowledge runtime](../knowledge.md) | Doctrine/context; the older brief's §4.9 automatic skill-delivery account is superseded by OKF v2 (no automatic soul-skill edits). Its older location/type mechanisms are not a second Portable Souls authority. |
|
|
36
|
-
| 7 |
|
|
37
|
-
| 8 |
|
|
36
|
+
| 7 | Package engine (`package-engine-contract.md`, removed in 0.26) and runtime API (`package-runtime-api.md`, removed in 0.26) | Existing acquisition/trust/runtime invariants; explicit Portable Souls migration changes store/resolution semantics, not silently these contracts. |
|
|
37
|
+
| 8 | Retention source `lib/capability-artifacts.mjs` and its tests (removed in 0.26 with the captured path) | Storage prerequisite; not complete instance/job dispatch. |
|
|
38
38
|
|
|
39
39
|
Implementation baseline: `428cd9af615652c4a93d754c1106674abd18545b` on the isolated
|
|
40
40
|
`feat/portable-souls-infrastructure` worktree. There is no instruction to merge,
|
|
@@ -29,7 +29,7 @@ Binding inputs, all portable repository paths:
|
|
|
29
29
|
integration requirements are binding despite the historical heading.
|
|
30
30
|
- [Reconciled explainer](2026-09-14-portable-souls-explainer.md); LFX examples are
|
|
31
31
|
hypothetical illustrations, not actual repositories, team setups or credentials.
|
|
32
|
-
-
|
|
32
|
+
- Package engine (`package-engine-contract.md`, removed in 0.26), runtime API (`package-runtime-api.md`, removed in 0.26)
|
|
33
33
|
and [current knowledge runtime](../knowledge.md) for preserved contracts.
|
|
34
34
|
The [older knowledge brief](2026-09-13-knowledge-and-memory-direction.md) provides
|
|
35
35
|
doctrine, not a competing source/default schema or permission to auto-edit skills.
|