@awebai/oats 0.29.4 → 0.30.1
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 +194 -50
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +6 -11
- 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 +97 -117
- 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 +77 -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 +83 -0
- package/docs/release-lane.md +82 -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.30.0.md +205 -0
- package/docs/release-notes/v0.30.1.md +123 -0
- package/docs/schedules.md +280 -363
- 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 +137 -215
- package/lib/automations.mjs +21 -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 +1 -1
- package/lib/resolve.mjs +30 -88
- package/lib/schedule.mjs +1 -1
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +2 -2
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +10 -16
- package/package.json +1 -3
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-authoring/LICENSE +0 -21
- package/capabilities/oats-authoring/oats-package.json +0 -11
- package/capabilities/oats-authoring/oats.json +0 -12
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +0 -84
- package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +0 -109
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +0 -116
- package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +0 -11
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +0 -1338
- package/capabilities/oats-aweb/injects/aweb.md +0 -47
- package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -356
- package/capabilities/oats-aweb/lib/captured-execution.mjs +0 -91
- package/capabilities/oats-aweb/lib/captured-native.mjs +0 -91
- package/capabilities/oats-aweb/lib/grant-custody.mjs +0 -38
- package/capabilities/oats-aweb/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-aweb/lib/portable-binding.mjs +0 -146
- package/capabilities/oats-aweb/lib/session-readiness.mjs +0 -56
- package/capabilities/oats-aweb/lib/wake-receive.mjs +0 -56
- package/capabilities/oats-aweb/oats.json +0 -208
- package/capabilities/oats-aweb/skills/LICENSE +0 -21
- package/capabilities/oats-aweb/skills/VENDORED.md +0 -31
- package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +0 -201
- package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +0 -161
- package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +0 -61
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +0 -116
- package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +0 -74
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +0 -216
- package/capabilities/oats-jira/bin/oats-jira.mjs +0 -40
- package/capabilities/oats-jira/injects/jira.md +0 -10
- package/capabilities/oats-jira/oats.json +0 -22
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +0 -179
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +0 -34
- package/capabilities/oats-linear/bin/oats-linear.mjs +0 -344
- package/capabilities/oats-linear/injects/linear.md +0 -8
- package/capabilities/oats-linear/oats.json +0 -24
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +0 -223
- package/capabilities/oats-okf/bin/oats-okf-binding.mjs +0 -14
- package/capabilities/oats-okf/bin/oats-okf.mjs +0 -209
- package/capabilities/oats-okf/injects/okf.md +0 -42
- package/capabilities/oats-okf/lib/binding-wire.mjs +0 -348
- package/capabilities/oats-okf/lib/captured-worker.mjs +0 -109
- package/capabilities/oats-okf/lib/config.mjs +0 -124
- package/capabilities/oats-okf/lib/consult.mjs +0 -518
- package/capabilities/oats-okf/lib/harvest-status.mjs +0 -88
- package/capabilities/oats-okf/lib/harvest-switch.mjs +0 -94
- package/capabilities/oats-okf/lib/inspection.mjs +0 -119
- package/capabilities/oats-okf/lib/invocation-context.mjs +0 -111
- package/capabilities/oats-okf/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-okf/lib/io.mjs +0 -118
- package/capabilities/oats-okf/lib/migration.mjs +0 -137
- package/capabilities/oats-okf/lib/okf-validate.mjs +0 -123
- package/capabilities/oats-okf/lib/portable-binding.mjs +0 -199
- package/capabilities/oats-okf/lib/source-contract.mjs +0 -46
- package/capabilities/oats-okf/lib/sources.mjs +0 -424
- package/capabilities/oats-okf/lib/stores.mjs +0 -473
- package/capabilities/oats-okf/lib/worker.mjs +0 -497
- package/capabilities/oats-okf/oats.json +0 -148
- package/capabilities/oats-okf/schemas/okf-base.schema.json +0 -46
- package/capabilities/oats-okf/schemas/okf-bindings.schema.json +0 -112
- package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +0 -87
- package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +0 -113
- package/capabilities/oats-okf/schemas/okf-soul.schema.json +0 -37
- package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +0 -144
- package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +0 -86
- package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +0 -104
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +0 -140
- package/capabilities/oats-okf-harvest/injects/harvester.md +0 -12
- package/capabilities/oats-okf-harvest/oats.json +0 -26
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +0 -168
- package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-harvest/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-harvest/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +0 -170
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +0 -12
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +0 -50
- package/capabilities/oats-okf-maintenance/oats.json +0 -21
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +0 -159
- package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +0 -146
- 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/capabilities.md
CHANGED
|
@@ -81,16 +81,15 @@ A self-contained package has an `oats.json`:
|
|
|
81
81
|
slot.
|
|
82
82
|
- `skills` entries can be skill directories or roots containing skills.
|
|
83
83
|
- `inject` is optional instance instruction Markdown.
|
|
84
|
-
-
|
|
84
|
+
- The hooks are `spawn`, `launch` and `retire`. A hook is a
|
|
85
85
|
command string, or `{ command, required }`. `required: true` is valid **only
|
|
86
86
|
on `spawn`**: the hook's failure then fails the spawn and rolls it back,
|
|
87
87
|
instead of producing an instance whose capability never configured itself —
|
|
88
88
|
an aweb identity that could not be minted leaves an agent believing it can be
|
|
89
89
|
woken by mail. Every other hook stays best-effort and only warns, so advisory
|
|
90
|
-
work never becomes a spawn blocker. `
|
|
90
|
+
work never becomes a spawn blocker. `launch` and `retire` cannot be
|
|
91
91
|
required: they run outside a spawn transaction, so there is no moment to
|
|
92
|
-
enforce them.
|
|
93
|
-
`oats create` wrote a soul); a manifest may still declare it.
|
|
92
|
+
enforce them. A `soul-scaffold` hook is tolerated and ignored.
|
|
94
93
|
- A capability declaring a **required** spawn hook should declare a `retire` hook
|
|
95
94
|
too. Without one, OATS has no way to undo what the spawn hook did and no way to
|
|
96
95
|
know whether it did anything, so a failure quarantines the home rather than
|
|
@@ -156,9 +155,7 @@ A self-contained package has an `oats.json`:
|
|
|
156
155
|
|
|
157
156
|
`capability` is the only manifest identity field; it may also carry
|
|
158
157
|
`private: true` (a **repo-owned** capability: listed, but usable only by souls
|
|
159
|
-
of its own repo)
|
|
160
|
-
(the one workspace team label it is listed under; without it, the primary of
|
|
161
|
-
its repository's default). The machine-readable contract is
|
|
158
|
+
of its own repo). The machine-readable contract is
|
|
162
159
|
[`capability-manifest.schema.json`](capability-manifest.schema.json).
|
|
163
160
|
|
|
164
161
|
## Who gets a capability
|
|
@@ -172,9 +169,6 @@ defaults:
|
|
|
172
169
|
knowledge: { oats.okf: { from: package } } # slot default: a layer capability
|
|
173
170
|
messaging: none
|
|
174
171
|
tasks: none
|
|
175
|
-
byTeam:
|
|
176
|
-
engineering:
|
|
177
|
-
capabilities: { acme-release-tooling: { from: github.com/acme/agents } }
|
|
178
172
|
|
|
179
173
|
# souls/release-manager/soul.yaml — the soul's own choices
|
|
180
174
|
capabilities:
|
|
@@ -182,110 +176,80 @@ capabilities:
|
|
|
182
176
|
acme-deploy: { from: package }
|
|
183
177
|
acme-house-style: off
|
|
184
178
|
knowledge:
|
|
185
|
-
|
|
179
|
+
harvest: off # this soul's knowledge-slot payload
|
|
186
180
|
```
|
|
187
181
|
|
|
188
182
|
Composition order: `defaults.<slot>` ⊕ `defaults.capabilities` ⊕
|
|
189
|
-
`defaults.byTeam[<label>]` for each of the soul's team labels, in order ⊕
|
|
190
183
|
`soul.capabilities` — later wins, `off` removes, a soul `<slot>: none` drops
|
|
191
|
-
the workspace's slot default.
|
|
192
|
-
|
|
193
|
-
and a capability the soul names itself settles it (the soul's entry wins). A resolved
|
|
194
|
-
capability whose manifest says `layer: X` fills slot X; two for one slot are
|
|
184
|
+
the workspace's slot default. Teams compose nothing, so a soul's composition
|
|
185
|
+
is the same for every person and machine. A resolved capability whose manifest says `layer: X` fills slot X; two for one slot are
|
|
195
186
|
`E_SLOT_CONFLICT`. Provider settings start from the manifest's own declared
|
|
196
187
|
defaults (`settings.<key>.default`, the lowest layer), then take the workspace's
|
|
197
|
-
`messaging` payload
|
|
198
|
-
amendment K) for the messaging slot, the soul's
|
|
188
|
+
`messaging` payload for the messaging slot, the soul's
|
|
199
189
|
slot payload, `oats-local.yaml` `settings.<cap>`, and `oats spawn --provider`,
|
|
200
190
|
deep-merged in that order. There are no agent types, no `global`, no
|
|
201
191
|
per-deployment activation or exclusion maps.
|
|
202
192
|
|
|
203
|
-
###
|
|
204
|
-
|
|
205
|
-
A soul's
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
team:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
- canonical soul skills;
|
|
259
|
-
- a **full copy** of every capability the soul resolved to, under
|
|
260
|
-
`<instance>/.oats/modules/<capability>/` (manifest, `bin/`, injects, skills);
|
|
261
|
-
- those capabilities' skills copied to `<instance>/.agents/skills/<capability>/<skill>/`.
|
|
262
|
-
|
|
263
|
-
`instance.json` records per module its source (`from`), commit and content
|
|
264
|
-
digest, and the composed skill names with their source. `.claude/skills` points
|
|
265
|
-
to the same canonical directory. **The harness starts normally**: pi, Claude
|
|
266
|
-
Code and Codex run their own skill discovery with cwd = the instance home;
|
|
267
|
-
ambient skills (user-level, the work tree's `.agents/skills/`) coexist with the
|
|
268
|
-
OATS-composed set. `instance.json` records what OATS composed, not everything
|
|
269
|
-
the harness may discover.
|
|
270
|
-
|
|
271
|
-
Duplicate skill names **within the composed set** fail the spawn naming both
|
|
272
|
-
capabilities (`E_SKILL_DUPLICATE`). A composed skill and an ambient skill with
|
|
273
|
-
one name is the harness's own precedence, not an error.
|
|
274
|
-
|
|
275
|
-
The instance's `AGENTS.md` is a generated regular file containing:
|
|
276
|
-
|
|
277
|
-
1. the canonical soul `AGENTS.md`;
|
|
278
|
-
2. the kernel and work-mode blocks;
|
|
279
|
-
3. each module's inject, in deterministic (name) order.
|
|
280
|
-
|
|
281
|
-
Its `CLAUDE.md` symlinks to `AGENTS.md`. The committed soul remains unchanged.
|
|
282
|
-
Edit the canonical soul or the capability's inject in its repo, then spawn a
|
|
283
|
-
new instance; do not edit generated blocks as source-of-truth changes.
|
|
193
|
+
### Teams in the provider environment
|
|
194
|
+
|
|
195
|
+
A soul's teams here (the committed shared teams, and the deployment's `oats-local.yaml` `teams`, `defaultTeam`, `souls.teams`,
|
|
196
|
+
`souls.default` — see [workspaces.md](workspaces.md#teams)) travel **beside** a
|
|
197
|
+
provider's settings, never inside them, in the environment of every hook, home
|
|
198
|
+
command and provider check:
|
|
199
|
+
|
|
200
|
+
- `OATS_DEFAULT_TEAM` — the soul's default label; `OATS_DEFAULT_TEAM_ID` — its
|
|
201
|
+
provider id; `OATS_DEFAULT_TEAM_FROM` — `deployment` (`defaultTeam`) or `soul`
|
|
202
|
+
(`souls.default`).
|
|
203
|
+
- No default configured: none of the three is set. An **unmapped** default (a
|
|
204
|
+
shared team declared without an id): `OATS_DEFAULT_TEAM` and
|
|
205
|
+
`OATS_DEFAULT_TEAM_FROM` are set and `OATS_DEFAULT_TEAM_ID` is not. What a
|
|
206
|
+
provider does then is its own contract; a messaging provider typically
|
|
207
|
+
refuses the spawn, naming the unmapped label, or saying no team is
|
|
208
|
+
configured.
|
|
209
|
+
- `OATS_TEAMS` — JSON `[{label, team, default, from: "shared"|"local"}]`: every
|
|
210
|
+
mapped team the soul may be in here, the default included (`default: true`),
|
|
211
|
+
default first, then by label. Eligible to join = the rows with `default: false`.
|
|
212
|
+
Unset when a home's teams are unknown (none recorded, and unreadable now).
|
|
213
|
+
- `OATS_TEAMS_SOURCE` — `live` (the workspace and `oats-local.yaml` read now, or
|
|
214
|
+
a fresh resolution) or `recorded` (the spawn-time record). **A provider leaves
|
|
215
|
+
a joined team only on a `live` list**: a recorded one lacks every change since
|
|
216
|
+
the spawn.
|
|
217
|
+
|
|
218
|
+
The environment is their only channel: a check's stdin request stays the
|
|
219
|
+
released binding wire, which providers decode strictly. Joining a team other
|
|
220
|
+
than the default is the provider's explicit act (a spawn choice or a command at
|
|
221
|
+
any time); the kernel never joins anything.
|
|
222
|
+
|
|
223
|
+
For an existing home the teams are **live** where they are acted on: its launch
|
|
224
|
+
hook (`oats session start|restart`), its messaging module's commands and
|
|
225
|
+
`messaging:` operations (`oats operation run --home`), and `oats inspect
|
|
226
|
+
--home` read the workspace host and the deployment's `oats-local.yaml` as they
|
|
227
|
+
stand now — one repository read, never a discovery; `oats readiness --home`
|
|
228
|
+
takes them from the discovery it already runs. The home's modules and skills
|
|
229
|
+
stay as spawned. Every other capability command and operation gets the teams
|
|
230
|
+
the spawn recorded in `instance.json` (`teams`, `defaultTeam`), marked
|
|
231
|
+
`recorded`, at no remote cost; so does any read where the workspace cannot be
|
|
232
|
+
reached. A scheduled wake's session start uses the recorded teams, so its
|
|
233
|
+
launch hook leaves nothing; the next operator start or messaging command is
|
|
234
|
+
live.
|
|
235
|
+
|
|
236
|
+
## What an instance receives
|
|
237
|
+
|
|
238
|
+
Every spawned instance gets a **full copy** of each capability its soul
|
|
239
|
+
resolved to, under `<home>/.oats/modules/<capability>/` (manifest, `bin/`,
|
|
240
|
+
injects, skills), and those skills under
|
|
241
|
+
`<home>/.agents/skills/<capability>/<skill>/`. Its generated `AGENTS.md` is the
|
|
242
|
+
soul's `AGENTS.md`, the kernel and work-mode blocks, then each module's inject
|
|
243
|
+
in name order. Two composed skills with one name fail the spawn
|
|
244
|
+
(`E_SKILL_DUPLICATE`). The harness then starts normally, with its own skill
|
|
245
|
+
discovery; the details are in [souls-and-instances.md](souls-and-instances.md).
|
|
246
|
+
Change a capability's inject or skills in its repository, then spawn a new
|
|
247
|
+
instance: the generated files are not a source.
|
|
284
248
|
|
|
285
249
|
Inspect a composition before it exists:
|
|
286
250
|
|
|
287
251
|
```bash
|
|
288
|
-
oats spawn release-manager --preview # modules (from / commit / changedSince),
|
|
252
|
+
oats spawn release-manager --preview # modules (from / commit / changedSince), teams + default, resolution revision
|
|
289
253
|
oats spawn release-manager --preview --json
|
|
290
254
|
```
|
|
291
255
|
|
|
@@ -302,7 +266,7 @@ packages is in [packages.md](packages.md). There is no installed
|
|
|
302
266
|
copy at a deployment and no `oats install`/`trust`/`update`/`remove`.
|
|
303
267
|
|
|
304
268
|
One package can carry capabilities meant for **different souls**. oats.okf
|
|
305
|
-
|
|
269
|
+
ships three:
|
|
306
270
|
|
|
307
271
|
- `oats.okf` fills every working soul's knowledge slot;
|
|
308
272
|
- `oats.okf-harvest` is composed only into its harvester soul;
|
|
@@ -328,22 +292,11 @@ reported as `publishes` and consumed only as a package.
|
|
|
328
292
|
|
|
329
293
|
## Agents a capability needs
|
|
330
294
|
|
|
331
|
-
A capability declares no agents
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
- a **package soul**: `souls/<name>/` beside the package's capabilities, listed
|
|
337
|
-
in `oats-package.json` `souls:`, spawned as `oats spawn <package>/<name>`
|
|
338
|
-
(or the bare name when unique), reading the package's capabilities with
|
|
339
|
-
`from: here` ([packages.md](packages.md#package-souls)). The post-commit
|
|
340
|
-
`reviewer` is one: oats.dev 1.1.0's `oats.dev/reviewer`, beside `oats.review`;
|
|
341
|
-
- or a **member soul**: `souls/<name>/` in a member repository, using a
|
|
342
|
-
member capability `from: here`.
|
|
343
|
-
|
|
344
|
-
A home an earlier kernel spawned from a manifest `agents:` soul (its agent
|
|
345
|
-
directory holds only `instances/`) is still listed by `oats status`, may anchor
|
|
346
|
-
a `--parent`, and retires; nothing creates one any more.
|
|
295
|
+
A capability declares no agents (a manifest `agents:` is refused with
|
|
296
|
+
`E_CAPABILITY_AGENTS_REMOVED`). Ship the agent as a soul: a **package soul**
|
|
297
|
+
beside the package's capabilities ([packages.md](packages.md#package-souls)),
|
|
298
|
+
such as oats.engineering's `code-reviewer` beside `oats.code-review`, or a **member soul** in a
|
|
299
|
+
member repository, using the capability `from: here`.
|
|
347
300
|
|
|
348
301
|
## Commands and hooks
|
|
349
302
|
|
|
@@ -352,23 +305,36 @@ instance's modules (or the soul's resolved set). Workspace commands (`sync`,
|
|
|
352
305
|
`package`, `workspace status`, `capabilities`, `souls`, `doctor`) are always
|
|
353
306
|
available.
|
|
354
307
|
|
|
355
|
-
A manifest's `helperInjection` and a hook's `inputs` are
|
|
356
|
-
|
|
357
|
-
|
|
308
|
+
A manifest's `helperInjection` and a hook's `inputs` are tolerated and ignored.
|
|
309
|
+
|
|
310
|
+
Hooks receive:
|
|
358
311
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
`
|
|
312
|
+
- `OATS_EVENT`, `OATS_CAPABILITY`, `OATS_LAYER`, `OATS_LEVEL`;
|
|
313
|
+
- `OATS_INSTANCE`, `OATS_INSTANCE_HOME` (the home, absolute; `OATS_HOME` is a
|
|
314
|
+
compatibility alias), `OATS_AGENT`, `OATS_SOUL`, `OATS_SOUL_ID`,
|
|
315
|
+
`OATS_CONTEXT`, `OATS_WORKSPACE`, `OATS_ROOT`;
|
|
316
|
+
- `OATS_CLI_BIN` (the running kernel's `bin/oats.mjs`);
|
|
317
|
+
- `OATS_SETTINGS`, `OATS_SETTINGS_ORIGINS`, `OATS_META`;
|
|
318
|
+
- the team and workspace variables of
|
|
319
|
+
[Teams in the provider environment](#teams-in-the-provider-environment),
|
|
320
|
+
plus `OATS_WORKSPACE_NAME`, `OATS_WORKSPACE_KEY` and `OATS_TEAM_SCOPE`
|
|
321
|
+
(the deployment directory). `OATS_TEAM_NAME` is always empty.
|
|
322
|
+
|
|
323
|
+
A spawn hook also gets `OATS_TASK`, `OATS_REPO`, `OATS_BRANCH`, `OATS_WORK`,
|
|
324
|
+
`OATS_HARNESS`, `OATS_KIND` and, for a spawn a trigger started,
|
|
325
|
+
`OATS_TRIGGER_EVENT_FILE`. A launch hook also gets `OATS_HARNESS` and
|
|
326
|
+
`OATS_PREVIOUS_HARNESS`.
|
|
327
|
+
|
|
328
|
+
`OATS_SETTINGS_ORIGINS` says where each leaf of
|
|
363
329
|
`OATS_SETTINGS` came from: a JSON object from a JSON pointer to `{ kind, at }`,
|
|
364
330
|
`kind` being `manifest-default`, `workspace`, `soul`, `host`, `spawn` or
|
|
365
331
|
`anchor` (the last layer that set it), e.g.
|
|
366
332
|
`{"/harvest":{"kind":"soul","at":"soul.yaml#/knowledge"}}`. A provider tells a
|
|
367
|
-
soul-set value from a host-set one there, and never reads `soul.yaml` for it
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
returning `env` from retire
|
|
333
|
+
soul-set value from a host-set one there, and never reads `soul.yaml` for it;
|
|
334
|
+
a home with none recorded gives `{}`. A final JSON line may return `meta`,
|
|
335
|
+
`brief`, `warning`, or harness-specific `launch` arguments. A **spawn or
|
|
336
|
+
launch hook** may also return an `env` object for the launched process;
|
|
337
|
+
returning `env` from a retire hook is an explicit contract error.
|
|
372
338
|
|
|
373
339
|
A **launch hook** runs at every start and restart of a home for each provider
|
|
374
340
|
recorded at spawn (under its recorded settings). Its `launch` arguments and
|
|
@@ -378,8 +344,7 @@ after the start succeeds — the same record the spawn hook wrote and the retire
|
|
|
378
344
|
hook later reads as `OATS_META` — so a provider that re-issues a credential at
|
|
379
345
|
start (a renewed session grant, for example) leaves the CURRENT one on record. A
|
|
380
346
|
launch hook that answers without `meta` keeps its previous entry; a start whose
|
|
381
|
-
preparation fails changes nothing.
|
|
382
|
-
launch `meta` and discarded it.)
|
|
347
|
+
preparation fails changes nothing.
|
|
383
348
|
|
|
384
349
|
Hook environment values are strings, at most 8192 UTF-8 bytes, with no NUL or
|
|
385
350
|
newlines. Names use the portable environment grammar and must belong to an
|
|
@@ -390,11 +355,10 @@ for this contract. Hyphenated vendors are also excluded because translating a
|
|
|
390
355
|
hyphen to `_` would let `aweb-evil.*` collide with names already inside
|
|
391
356
|
`aweb.*`'s `AWEB_*` namespace.
|
|
392
357
|
|
|
393
|
-
A manifest's `settings.<key>` may carry `hostOnly: true
|
|
358
|
+
A manifest's `settings.<key>` may carry `hostOnly: true`. Such a
|
|
394
359
|
key is a fact about the machine — a custody directory, a state root — and the
|
|
395
360
|
resolver accepts it only from the deployment's own `oats-local.yaml`
|
|
396
|
-
`settings.<capability>`; a committed workspace or soul file
|
|
397
|
-
`messaging.byTeam` entry of a label the soul carries included) or a
|
|
361
|
+
`settings.<capability>`; a committed workspace or soul file or a
|
|
398
362
|
`--provider` flag carrying it is refused (`E_WORKSPACE_SCHEMA`, reason
|
|
399
363
|
`host-only-key`).
|
|
400
364
|
Declare it for any key whose value points at something a committed file must
|
|
@@ -425,11 +389,11 @@ A failed compensation, unverifiable topology removal, or reported spawn state
|
|
|
425
389
|
without a retire hook uses the standard retryable quarantine instead. Ordinary
|
|
426
390
|
advisory hook execution failure itself contributes no environment.
|
|
427
391
|
|
|
428
|
-
The environment prefix applies to the
|
|
429
|
-
validates command preparation but launches no harness.
|
|
430
|
-
after that process exits does not inherit command-scoped
|
|
431
|
-
|
|
432
|
-
|
|
392
|
+
The environment prefix applies to the harness process (pi, Claude Code or
|
|
393
|
+
Codex). `--no-launch` validates command preparation but launches no harness.
|
|
394
|
+
The fallback shell after that process exits does not inherit command-scoped
|
|
395
|
+
assignments; `oats session start|restart` runs the launch hooks again. The
|
|
396
|
+
generated command is persisted; hooks must contribute locators, selectors, or broker endpoints—not
|
|
433
397
|
bearer tokens or private key material. An instance-lifetime local principal may
|
|
434
398
|
be selected by a home locator. A replaceable execution serving a durable global
|
|
435
399
|
identity must instead use a custody/action broker or equivalent narrow adapter;
|
|
@@ -443,28 +407,50 @@ spawn order. Hooks run from the instance's own copy
|
|
|
443
407
|
|
|
444
408
|
## Official packages
|
|
445
409
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
| `oats.jira` | tasks core capability | Jira task protocol via `acli` | `oats.jira` |
|
|
453
|
-
| `oats.linear` | tasks core capability | Linear GraphQL task commands and workflow | `oats.linear` |
|
|
454
|
-
| `oats.authoring` | additive | capability, skill, and soul authoring guidance | `oats.authoring` |
|
|
455
|
-
|
|
456
|
-
Each is pinned by a bare version in `packages:` and resolved through the
|
|
457
|
-
[official catalog](official-catalog.md); each package repo is also a member
|
|
458
|
-
of the OATS workspace carrying its expert soul (`okf-expert`, `aweb-expert`, …).
|
|
459
|
-
The framework's own souls say `oats.okf: { from: package }` — membership never
|
|
460
|
-
turns a package into a latest-state capability.
|
|
410
|
+
The official packages and the capabilities and souls each carries are listed
|
|
411
|
+
in the [official catalog](official-catalog.md#the-packages). Each is pinned by a bare version in
|
|
412
|
+
`packages:`; each package repository is also a member of the OATS workspace,
|
|
413
|
+
carrying its expert soul. The framework's own souls say
|
|
414
|
+
`oats.okf: { from: package }`: membership never turns a package into a
|
|
415
|
+
latest-state capability.
|
|
461
416
|
|
|
462
417
|
## Operations a capability declares
|
|
463
418
|
|
|
464
|
-
A manifest may declare `operations
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
419
|
+
A manifest may declare `operations`: named actions or views that a GUI, a
|
|
420
|
+
schedule or an operator invokes without knowing the provider.
|
|
421
|
+
|
|
422
|
+
```json
|
|
423
|
+
"operations": {
|
|
424
|
+
"harvest": { "kind": "action", "command": "harvest", "context": "home", "description": "Promote this instance's notes" },
|
|
425
|
+
"inspect": { "kind": "view", "command": "inspect", "context": "home", "description": "Show this instance's working knowledge" }
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
- `command` names one of the manifest's `commands`. `kind` is `action`
|
|
430
|
+
(default) or `view`; `context` is `home` (default: runs in an instance
|
|
431
|
+
home) or `scope`.
|
|
432
|
+
- Optional `args` declare `{ name, flag, required, description }`; the runner
|
|
433
|
+
passes `--arg name=value` as those flags and refuses unknown or missing
|
|
434
|
+
required ones.
|
|
435
|
+
- A view answers `{ documents: [{ label, kind: "markdown"|"text", path?, text? }], summary? }`;
|
|
436
|
+
the kernel validates that shape and relays it.
|
|
437
|
+
|
|
438
|
+
`oats inspect --json` lists each operation with its availability.
|
|
439
|
+
`oats operation run <layer>:<name> (--home <abs> | --soul <name>) [--arg k=v …] --json`
|
|
440
|
+
resolves the provider that fills `<layer>` for the subject and runs its
|
|
441
|
+
command exactly as `oats <namespace> <command>` would, with the hook
|
|
442
|
+
identity variables of that subject and the invoking process's own identity
|
|
443
|
+
removed. It refuses an undeclared operation (`E_OPERATION_UNKNOWN`), a slot
|
|
444
|
+
with no provider or a home operation without `--home`
|
|
445
|
+
(`E_OPERATION_UNAVAILABLE`), and a missing host command
|
|
446
|
+
(`E_CAPABILITY_REQUIRES`).
|
|
447
|
+
|
|
448
|
+
The provider must exit 0 with exactly one JSON envelope on stdout. Otherwise
|
|
449
|
+
the outcome is **unconfirmed**: `E_OPERATION_TIMEOUT` (after 240 s) or
|
|
450
|
+
`E_OPERATION_RESULT`, with `error.details { unconfirmed: true, exit, envelope?, stderr? }`.
|
|
451
|
+
A provider's own `ok: false` is relayed with its code. A schedule of kind
|
|
452
|
+
`operation` runs the same command ([schedules.md](schedules.md)). The JSON
|
|
453
|
+
shapes are in [desktop-cli-api.md](desktop-cli-api.md#inspect-readiness-and-operation-run-on-the-workspace-model-operationsapi-2-soulsapi-2-readinessapi-2-oats-0260).
|
|
468
454
|
|
|
469
455
|
## Readiness check (`binding.check`)
|
|
470
456
|
|
|
@@ -473,7 +459,7 @@ manifest is asked by `oats readiness` whether it is ready for the subject. The
|
|
|
473
459
|
subject is an instance home (`--home`) or a soul (`--soul`). The command named
|
|
474
460
|
by `binding.check` receives one request and answers once. The kernel relays
|
|
475
461
|
that answer to consumers as it came: readiness `providers` items. For the
|
|
476
|
-
consumer side, see [desktop-cli-api.md](desktop-cli-api.md#oats-readiness---home
|
|
462
|
+
consumer side, see [desktop-cli-api.md](desktop-cli-api.md#oats-readiness---home-----soul----dir----policy---json--readinessapi-2).
|
|
477
463
|
This check reads configuration only; it binds nothing and does not change a
|
|
478
464
|
spawn's fail-closed hooks.
|
|
479
465
|
|
|
@@ -492,9 +478,9 @@ passed as arguments; no shell is involved.
|
|
|
492
478
|
|
|
493
479
|
```json
|
|
494
480
|
{"schemaVersion":1,"phase":"check","slot":"messaging","capability":"my.provider",
|
|
495
|
-
"settings":{"
|
|
481
|
+
"settings":{"root":"/srv/aw"},
|
|
496
482
|
"input":{"context":{"kind":"workspace","workspace":"github.com/acme/agents","deployment":"/srv/acme",
|
|
497
|
-
"soul":"release-manager","
|
|
483
|
+
"soul":"release-manager","instance":"release-manager-1",
|
|
498
484
|
"home":"/srv/acme/agents/release-manager/instances/release-manager-1"},
|
|
499
485
|
"action":{"kind":"readiness"}}}
|
|
500
486
|
```
|
|
@@ -503,9 +489,9 @@ passed as arguments; no shell is involved.
|
|
|
503
489
|
- `settings` is the merged provider payload: the one the spawn recorded for a
|
|
504
490
|
home, or the one the resolution computes for a soul.
|
|
505
491
|
- The request has exactly these keys; a provider may decode it strictly. The
|
|
506
|
-
soul's
|
|
507
|
-
reads them from `
|
|
508
|
-
|
|
492
|
+
soul's teams (see [Teams in the provider environment](#teams-in-the-provider-environment))
|
|
493
|
+
are not on stdin: the check reads them from `OATS_DEFAULT_TEAM*`, `OATS_TEAMS`
|
|
494
|
+
and `OATS_TEAMS_SOURCE`.
|
|
509
495
|
- `instance` and `home` are `null` for a soul subject.
|
|
510
496
|
|
|
511
497
|
**Environment:**
|
|
@@ -516,16 +502,19 @@ passed as arguments; no shell is involved.
|
|
|
516
502
|
`OATS_SETTINGS_ORIGINS` (where each leaf came from, as hooks get it);
|
|
517
503
|
- `OATS_CLI_BIN`;
|
|
518
504
|
- `OATS_WORKSPACE` (the deployment);
|
|
519
|
-
- the team variables `
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
`
|
|
505
|
+
- the team variables `OATS_DEFAULT_TEAM`, `OATS_DEFAULT_TEAM_ID`,
|
|
506
|
+
`OATS_DEFAULT_TEAM_FROM`, `OATS_TEAMS`, `OATS_TEAMS_SOURCE` (see
|
|
507
|
+
[Teams in the provider environment](#teams-in-the-provider-environment)),
|
|
508
|
+
`OATS_TEAM_SCOPE`, `OATS_TEAM_NAME`, `OATS_WORKSPACE_NAME` and
|
|
523
509
|
`OATS_WORKSPACE_KEY`;
|
|
524
510
|
- `OATS_AGENT` (the soul);
|
|
525
|
-
- `OATS_SOUL
|
|
511
|
+
- `OATS_SOUL`, the soul directory: a home's recorded one, or for a soul
|
|
512
|
+
(`readiness --soul`, `inspect --soul`) its copy at the resolved commit,
|
|
513
|
+
which the kernel materialises first as a spawn would (0.30; a copy that
|
|
514
|
+
cannot be made fails readiness under `installed`, producer `soul copy`);
|
|
526
515
|
- for a home, `OATS_INSTANCE` and `OATS_INSTANCE_HOME`.
|
|
527
|
-
-
|
|
528
|
-
|
|
516
|
+
- `OATS_TEAM_SCOPE` is the deployment directory; `OATS_TEAM_NAME` is always
|
|
517
|
+
empty.
|
|
529
518
|
|
|
530
519
|
**Answer** — exit 0, and exactly one JSON document on stdout (whitespace
|
|
531
520
|
around it is fine; progress text is not):
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"$defs": {
|
|
12
12
|
"HelperInjection": {
|
|
13
13
|
"deprecated": true,
|
|
14
|
-
"description": "
|
|
14
|
+
"description": "Tolerated and ignored: accepted so existing manifests validate; it changes nothing. Omit it.",
|
|
15
15
|
"oneOf": [
|
|
16
16
|
{"type":"object","required":["version","mode"],"additionalProperties":false,"properties":{"version":{"const":1},"mode":{"enum":["inherit","omit"]}}},
|
|
17
17
|
{"type":"object","required":["version","mode","path"],"additionalProperties":false,"properties":{"version":{"const":1},"mode":{"const":"file"},"path":{"type":"string","minLength":1,"pattern":"^(?![A-Za-z]:)(?!.*(?:^|/)\\.{1,2}(?:/|$))[^/\\\\\u0000]+(?:/[^/\\\\\u0000]+)*$"}}}
|
|
@@ -61,11 +61,6 @@
|
|
|
61
61
|
"type": "boolean",
|
|
62
62
|
"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)."
|
|
63
63
|
},
|
|
64
|
-
"team": {
|
|
65
|
-
"type": "string",
|
|
66
|
-
"pattern": "^[a-z0-9][a-z0-9._-]*$",
|
|
67
|
-
"description": "Workspace discovery: the team label for this capability; else the repository's default from oats-membership.yaml."
|
|
68
|
-
},
|
|
69
64
|
"layer": {
|
|
70
65
|
"enum": [
|
|
71
66
|
"knowledge",
|
|
@@ -83,7 +78,7 @@
|
|
|
83
78
|
"inject": {
|
|
84
79
|
"type": "string"
|
|
85
80
|
},
|
|
86
|
-
"helperInjection": {"$ref":"#/$defs/HelperInjection","deprecated":true,"description":"
|
|
81
|
+
"helperInjection": {"$ref":"#/$defs/HelperInjection","deprecated":true,"description":"Tolerated and ignored (accepted so existing manifests validate; changes nothing). Omit it."},
|
|
87
82
|
"environment": {
|
|
88
83
|
"type": "array",
|
|
89
84
|
"items": {
|
|
@@ -120,7 +115,7 @@
|
|
|
120
115
|
},
|
|
121
116
|
{
|
|
122
117
|
"title": "harness package requirement",
|
|
123
|
-
"description": "A package that must be installed into a specific harness's own package manager. Raised only for deployments using that harness, satisfied by the harness's package list rather than by PATH, and installed only with explicit consent. The harness is named by `harness`
|
|
118
|
+
"description": "A package that must be installed into a specific harness's own package manager. Raised only for deployments using that harness, satisfied by the harness's package list rather than by PATH, and installed only with explicit consent. The harness is named by `harness` or by `runtime`, its old name that released manifests use: exactly one of the two.",
|
|
124
119
|
"type": "object",
|
|
125
120
|
"required": [
|
|
126
121
|
"package",
|
|
@@ -140,7 +135,7 @@
|
|
|
140
135
|
},
|
|
141
136
|
"runtime": {
|
|
142
137
|
"type": "string",
|
|
143
|
-
"description": "The
|
|
138
|
+
"description": "The old name of `harness`, accepted for released manifests.",
|
|
144
139
|
"enum": [
|
|
145
140
|
"pi",
|
|
146
141
|
"claude"
|
|
@@ -210,7 +205,7 @@
|
|
|
210
205
|
"items": { "type": "string", "minLength": 1, "maxLength": 200, "not": { "pattern": "[{}]|[^\\x20-\\x7e]" } }
|
|
211
206
|
},
|
|
212
207
|
"keys": {
|
|
213
|
-
"description": "Owned operator-key declarations: exact names or trailing-dot namespaces, no other pattern syntax.
|
|
208
|
+
"description": "Owned operator-key declarations: exact names or trailing-dot namespaces, no other pattern syntax. The kernel validates their shape only; providers must ignore foreign keys themselves.",
|
|
214
209
|
"type": "array",
|
|
215
210
|
"uniqueItems": true,
|
|
216
211
|
"items": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*\\.?$(?![\\s\\S])" }
|
|
@@ -281,7 +276,7 @@
|
|
|
281
276
|
},
|
|
282
277
|
"hostOnly": {
|
|
283
278
|
"type": "boolean",
|
|
284
|
-
"description": "When true, this key is a host fact (a custody path, a state directory): the resolver accepts it only from the deployment's oats-local.yaml settings.<capability> and refuses it in the workspace file,
|
|
279
|
+
"description": "When true, this key is a host fact (a custody path, a state directory): the resolver accepts it only from the deployment's oats-local.yaml settings.<capability> and refuses it in the workspace file, a soul's slot payload and --provider flags (E_WORKSPACE_SCHEMA reason host-only-key). Decision 27."
|
|
285
280
|
}
|
|
286
281
|
},
|
|
287
282
|
"additionalProperties": false
|