@awebai/oats 0.29.4 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -6
- package/bin/oats.mjs +194 -50
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
- package/capabilities/oats-aweb/injects/aweb.md +1 -1
- package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
- package/capabilities/oats-aweb/oats.json +5 -12
- package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
- package/capabilities/oats-code-review/injects/reviewer.md +26 -0
- package/capabilities/oats-code-review/oats.json +16 -0
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
- package/capabilities/oats-developer/injects/developer.md +38 -0
- package/capabilities/oats-developer/oats.json +17 -0
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
- package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
- package/capabilities/oats-engineering-expert/oats.json +17 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
- package/capabilities/oats-okf/bin/oats-okf.mjs +8 -4
- package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
- package/capabilities/oats-okf/lib/inspection.mjs +26 -7
- package/capabilities/oats-okf/lib/sources.mjs +16 -2
- package/capabilities/oats-okf/lib/worker.mjs +5 -16
- package/capabilities/oats-okf/oats.json +6 -3
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
- package/capabilities/oats-okf-harvest/oats.json +3 -3
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +2 -2
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
- package/capabilities/oats-okf-maintenance/oats.json +2 -2
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +1 -1
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
- package/capabilities/oats-workspace-experts/oats.json +9 -0
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +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 +76 -288
- package/docs/integrations.md +118 -320
- package/docs/knowledge-capability-authoring.md +25 -52
- package/docs/knowledge-reference/acceptance.md +3 -3
- package/docs/knowledge-reference/adoption.md +1 -1
- package/docs/knowledge-reference/harvester.md +2 -2
- package/docs/knowledge-reference/package-craft.md +3 -3
- package/docs/knowledge-reference/provider-mapping.md +3 -6
- package/docs/knowledge-reference/reader-capture.md +3 -3
- package/docs/knowledge-theory.md +62 -166
- package/docs/knowledge.md +225 -404
- package/docs/layers.md +42 -97
- package/docs/oats-local.schema.json +58 -5
- package/docs/oats-membership.schema.json +1 -8
- package/docs/oats-package.schema.json +5 -5
- package/docs/oats-workspace.schema.json +8 -22
- package/docs/official-catalog.md +25 -28
- package/docs/packages.md +45 -63
- package/docs/plans/0.30-close-out.md +61 -0
- package/docs/release-lane.md +77 -0
- package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
- package/docs/release-notes/v0.19.0.md +48 -147
- package/docs/release-notes/v0.19.1.md +2 -3
- package/docs/release-notes/v0.19.3.md +2 -15
- package/docs/release-notes/v0.20.0.md +0 -15
- package/docs/release-notes/v0.22.0.md +71 -138
- package/docs/release-notes/v0.22.1.md +42 -90
- package/docs/release-notes/v0.22.10.md +1 -1
- package/docs/release-notes/v0.22.11.md +1 -47
- package/docs/release-notes/v0.22.12.md +4 -13
- package/docs/release-notes/v0.22.13.md +1 -42
- package/docs/release-notes/v0.22.14.md +3 -11
- package/docs/release-notes/v0.22.15.md +1 -46
- package/docs/release-notes/v0.22.16.md +6 -8
- package/docs/release-notes/v0.22.18.md +1 -99
- package/docs/release-notes/v0.22.19.md +3 -14
- package/docs/release-notes/v0.22.2.md +6 -15
- package/docs/release-notes/v0.22.3.md +0 -1
- package/docs/release-notes/v0.22.4.md +1 -14
- package/docs/release-notes/v0.22.5.md +2 -12
- package/docs/release-notes/v0.22.6.md +0 -3
- package/docs/release-notes/v0.23.0.md +9 -25
- package/docs/release-notes/v0.23.1.md +9 -25
- package/docs/release-notes/v0.23.2.md +2 -4
- package/docs/release-notes/v0.24.0.md +56 -97
- package/docs/release-notes/v0.24.1.md +7 -11
- package/docs/release-notes/v0.24.10.md +34 -45
- package/docs/release-notes/v0.24.11.md +12 -20
- package/docs/release-notes/v0.24.12.md +35 -48
- package/docs/release-notes/v0.24.13.md +34 -41
- package/docs/release-notes/v0.24.2.md +9 -13
- package/docs/release-notes/v0.24.3.md +7 -11
- package/docs/release-notes/v0.24.4.md +6 -6
- package/docs/release-notes/v0.24.5.md +6 -10
- package/docs/release-notes/v0.24.6.md +2 -5
- package/docs/release-notes/v0.24.7.md +46 -75
- package/docs/release-notes/v0.24.8.md +58 -96
- package/docs/release-notes/v0.24.9.md +38 -54
- package/docs/release-notes/v0.25.0.md +59 -76
- package/docs/release-notes/v0.25.1.md +57 -81
- package/docs/release-notes/v0.25.2.md +51 -70
- package/docs/release-notes/v0.25.3.md +11 -13
- package/docs/release-notes/v0.25.4.md +9 -13
- package/docs/release-notes/v0.25.5.md +3 -5
- package/docs/release-notes/v0.25.6.md +20 -29
- package/docs/release-notes/v0.25.7.md +5 -7
- package/docs/release-notes/v0.25.8.md +26 -39
- package/docs/release-notes/v0.26.0.md +175 -646
- package/docs/release-notes/v0.27.0.md +4 -5
- package/docs/release-notes/v0.27.1.md +4 -6
- package/docs/release-notes/v0.27.2.md +1 -1
- package/docs/release-notes/v0.28.0.md +57 -124
- package/docs/release-notes/v0.29.0.md +89 -208
- package/docs/release-notes/v0.29.1.md +1 -1
- package/docs/release-notes/v0.29.2.md +3 -4
- package/docs/release-notes/v0.30.0.md +205 -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 +132 -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/resolve.mjs +29 -87
- 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 +9 -15
- package/package.json +1 -1
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-review/injects/review.md +0 -69
- package/capabilities/oats-review/oats.json +0 -10
- package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
- package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
- package/docs/conventions.md +0 -90
- package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
- package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
- package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
- package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
- package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
- package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
- package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
- package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
- package/docs/design/2026-09-15-captured-dispatch.md +0 -127
- package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
- package/docs/design/2026-09-15-package-preparation.md +0 -100
- package/docs/design/2026-09-15-portable-data-contract.md +0 -121
- package/docs/design/2026-09-15-portable-declarations.md +0 -189
- package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
- package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
- package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
- package/docs/design/2026-09-15-source-observation.md +0 -119
- package/docs/design/2026-09-16-captured-admission.md +0 -77
- package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
- package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
- package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
- package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
- package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
- package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
- package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
- package/docs/design/2026-09-16-portable-onboarding.md +0 -179
- package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
- package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
- package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
- package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
- package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
- package/docs/design/2026-09-17-captured-native-start.md +0 -58
- package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
- package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
- package/docs/design/2026-09-17-public-captured-start.md +0 -108
- package/docs/design/2026-09-17-public-prepare-request.md +0 -90
- package/docs/design/2026-09-18-captured-pi-host.md +0 -205
- package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
- package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
- package/docs/design/2026-09-20-redesign-program-board.md +0 -142
- package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
- package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
- package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
- package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
- package/docs/design/2026-09-24-phase-d-plan.md +0 -305
- package/docs/design/2026-09-25-teams-contract.md +0 -258
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
- package/docs/design/desktop-ux-plan.md +0 -362
- package/docs/design/launch-configurations.md +0 -168
- package/docs/design/okf-mirror-provenance.md +0 -105
- package/docs/design/operations-contract.md +0 -141
- package/docs/oats-member.schema.json +0 -38
- package/skills/integration-authoring/SKILL.md +0 -84
- package/skills/oats-support/SKILL.md +0 -79
- package/skills/skill-craft/SKILL.md +0 -109
- package/skills/soul-craft/SKILL.md +0 -116
|
@@ -1,670 +1,199 @@
|
|
|
1
1
|
# OATS 0.26.0
|
|
2
2
|
|
|
3
|
-
The workspace model is the only model the kernel knows
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
[Upgrading from 0.25](#upgrading-from-025)).
|
|
3
|
+
The workspace model is the only model the kernel knows. The 0.24-era classic
|
|
4
|
+
path is removed, not flagged: a 0.24.x kernel keeps running 0.24.x
|
|
5
|
+
deployments, and a 0.25.x deployment is already on the workspace model. See
|
|
6
|
+
[Upgrading from 0.25](#upgrading-from-025).
|
|
8
7
|
|
|
9
8
|
## Removed
|
|
10
9
|
|
|
11
|
-
- **The captured/portable path** (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
`
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
captured/portable export (`startCapturedInstanceSession`,
|
|
57
|
-
`prepareCapturedComposition`, `loadCapturedDispatch`, …).
|
|
58
|
-
- **Schemas removed:** `portable`, `captured-resolution`,
|
|
59
|
-
`captured-invocation-context`, `execution-capsule`, `artifact-approvals`,
|
|
60
|
-
`oats-lock-v3` (the captured *selection* lock, never the workspace lock) and
|
|
61
|
-
`oats-lock` (lockfileVersion 2), plus `provider-check-input` (the captured
|
|
62
|
-
check request; the workspace readiness request is documented in
|
|
63
|
-
[capabilities](../capabilities.md#readiness-check-bindingcheck)). The design
|
|
64
|
-
notes `package-engine-contract.md` and `package-runtime-api.md` are deleted.
|
|
65
|
-
- Errors from kernel metadata reads say "metadata file", not "portable
|
|
66
|
-
metadata".
|
|
67
|
-
- **Kernel skills and injects** (human decision on D7): `oats-portable`,
|
|
68
|
-
`oats-portable-artifacts` and the injects `oats-portable`,
|
|
69
|
-
`portable-instance-boundary` and `portable-work-directory` are deleted, and so
|
|
70
|
-
are the kernel's own **`oats` skill** and **`injects/oats.md`** ("You run on
|
|
71
|
-
OATS"): the `oats.core` capability (`oats.framework` package, the workspace
|
|
72
|
-
default) ships the operating skills (`oats-operate`, `oats-souls`) and that
|
|
73
|
-
briefing, and the workspace path already composed only its copy. A soul
|
|
74
|
-
without `oats.core` gets no OATS operating instructions; `oats doctor --soul`
|
|
75
|
-
says so. The kernel keeps `instance-boundary`, the `work-*` briefings and the
|
|
76
|
-
ambient `oats-getting-started`.
|
|
77
|
-
|
|
78
|
-
- **Package approval** (human decision, 2026-09-24). People install a package
|
|
79
|
-
only when they trust it: declaring it in the workspace's `packages:` IS the
|
|
80
|
-
trust decision, so there is no second, per-version approval step.
|
|
81
|
-
- `oats sync` resolves, fetches, verifies integrity, writes the lock and exits
|
|
82
|
-
`0` on success. No exit `2` for pending approvals, no interactive prompt, no
|
|
83
|
-
`approvalNeeded` in the report and none on `changes[]` rows.
|
|
84
|
-
`oats sync --approve …` is `E_BAD_ARGS` naming the decision.
|
|
85
|
-
- `oats onboard` has no approval-pending outcome and no "approve first" hint.
|
|
86
|
-
- The lock (v3) drops the per-entry `approved` record. A lock that still
|
|
87
|
-
carries it is read with the field ignored, and the next write drops it.
|
|
88
|
-
**A kernel before 0.26.0 cannot read a lock 0.26.0 wrote** (`E_LOCK_SCHEMA`
|
|
89
|
-
on the missing `approved`): keep every kernel that reads one deployment on
|
|
90
|
-
0.26.0 or later.
|
|
91
|
-
- The lock still pins each package to its exact commit and content integrity.
|
|
92
|
-
`oats sync` refuses a moved tag, drifted content and a lock whose capability
|
|
93
|
-
list no longer matches the package (`E_PACKAGE_INTEGRITY`) —
|
|
94
|
-
reproducibility, not approval.
|
|
95
|
-
**Where integrity is checked:** `oats sync` recomputes each package's
|
|
96
|
-
content digest and refuses drift. At spawn, the kernel checks the lock's
|
|
97
|
-
capability list against the package and trusts the locked commit plus
|
|
98
|
-
materialize's fetch-versus-copy self-check. The lock's integrity is
|
|
99
|
-
recorded in each module's `from`, not recomputed per spawn. (The removed
|
|
100
|
-
per-spawn executables-digest check was an approval binding, not an
|
|
101
|
-
integrity guarantee.)
|
|
102
|
-
- Spawn, `--preview` and operator dispatch never raise `E_PACKAGE_UNAPPROVED`;
|
|
103
|
-
the executables-digest gate is gone. At spawn a package capability must come
|
|
104
|
-
from a package the workspace **still declares** (a stale lock entry for a
|
|
105
|
-
package removed from `packages:` is `E_PACKAGE_MISSING { reason:
|
|
106
|
-
"undeclared" }` until `oats sync`), and the lock's capability list must match
|
|
107
|
-
what the package declares at the locked commit (`E_PACKAGE_INTEGRITY { why:
|
|
108
|
-
"capabilities" }`). A package capability agent is found only in a declared
|
|
109
|
-
package.
|
|
110
|
-
- `oats workspace status` loses its `approval` object and column; `oats
|
|
111
|
-
capabilities` package rows lose `approved`; `oats doctor` prints each locked
|
|
112
|
-
package's integrity instead of its approval.
|
|
113
|
-
- `oats version --json` advertises `packages-no-approval`. `syncApi`,
|
|
114
|
-
`workspaceStatusApi` and `capabilitiesApi` are NOT bumped: a consumer that
|
|
115
|
-
reads the removed fields gates on this feature string.
|
|
116
|
-
- **The `soul` link in instance homes.** A home no longer carries
|
|
117
|
-
`<home>/soul`: its composed `AGENTS.md` already holds the soul's
|
|
118
|
-
instructions. The soul directory an instance incarnates is recorded as
|
|
119
|
-
`instance.json` `soulDir` (a workspace soul's per-commit copy
|
|
120
|
-
`<deployment>/agents/<soul>/souls/<commit12>`, or the read-only soul inside a
|
|
121
|
-
capability package) and is handed to every classic lifecycle hook — spawn,
|
|
122
|
-
launch, retire — and to every capability command dispatched inside a home as
|
|
123
|
-
`OATS_SOUL`. Launch
|
|
124
|
-
and retire hooks, and in-home commands such as `oats okf harvest`, previously
|
|
125
|
-
received no `OATS_SOUL`; `oats operation run`
|
|
126
|
-
previously handed the swappable `agents/<soul>/soul` pointer. `oats session
|
|
127
|
-
recompose` reads the recorded `soulDir`. A spawn that is rolled back into
|
|
128
|
-
quarantine records the soul in its cleanup descriptor, so a retried retire
|
|
129
|
-
hook sees the spawn's soul. A capability command dispatched with no recorded
|
|
130
|
-
soul gets no `OATS_SOUL`, never one inherited from the invoking process.
|
|
131
|
-
- **Homes spawned before 0.26.0** record no `soulDir`. They keep their
|
|
132
|
-
existing `soul` link (0.26.0 neither reads nor removes it). Their retire
|
|
133
|
-
hooks get the soul pointer `agents/<soul>/soul` (today's soul, not
|
|
134
|
-
necessarily the spawn's commit). They are degraded: their launch hooks and
|
|
135
|
-
in-home commands get no `OATS_SOUL` (a provider that requires it, such as
|
|
136
|
-
oats.okf 2.1.5, refuses with `E_OATS_SOUL_MISSING`), and `oats session
|
|
137
|
-
recompose` refuses them (`E_SOUL_UNKNOWN`). Re-spawn to get a recorded
|
|
138
|
-
`soulDir`.
|
|
139
|
-
|
|
10
|
+
- **The captured/portable path** (`oats prepare`, captured resolutions,
|
|
11
|
+
`--deployment --resolution` dispatch, the pi SDK host, versioned schedules).
|
|
12
|
+
What is left are typed refusals:
|
|
13
|
+
- The selectors `--deployment`, `--resolution`, `--artifact-set` and an
|
|
14
|
+
inherited `OATS_DEPLOYMENT` / `OATS_RESOLUTION` are `E_UNSUPPORTED_MODE`
|
|
15
|
+
for every command but `version`. `oats prepare` and `oats inspect
|
|
16
|
+
--request` are `E_UNKNOWN_COMMAND`, naming `oats onboard` / `oats sync` and
|
|
17
|
+
`oats spawn <soul> --preview`.
|
|
18
|
+
- **Captured homes** are reported as the problem `legacy-captured-home` and
|
|
19
|
+
refused by start, restart, `--home` reads and in-home commands. `oats
|
|
20
|
+
retire` works but runs no captured retire hook; its `warnings[]` name the
|
|
21
|
+
capabilities whose identities to revoke with the provider's tooling.
|
|
22
|
+
- **Captured schedule keys** are refused by `schedule add|update`
|
|
23
|
+
(`E_SCHEDULE_INVALID`); a stored captured job or lock never runs until
|
|
24
|
+
`oats schedule remove --force <id>` clears it.
|
|
25
|
+
- Manifest keys `helperInjection` and hook `inputs` are accepted and
|
|
26
|
+
ignored. `oats version --json` drops `capturedDispatchApi` and
|
|
27
|
+
`capturedDispatchActions`. The captured/portable core exports, the
|
|
28
|
+
installed-tier and lock v2 helpers, and their schemas (including
|
|
29
|
+
`oats-lock` lockfileVersion 2 and `provider-check-input`) are removed.
|
|
30
|
+
- **Kernel skills, injects and the operational block.** The kernel's `oats`,
|
|
31
|
+
`oats-config`, `oats-packages` and portable skills, and its "You run on
|
|
32
|
+
OATS" and portable injects, are deleted. `oats.core` (the `oats.framework`
|
|
33
|
+
package, the workspace default) ships the operating skills and briefing,
|
|
34
|
+
`oats.setup` the setup skills. A soul without them gets no OATS operating
|
|
35
|
+
instructions (`oats doctor --soul` says so). The kernel keeps
|
|
36
|
+
`instance-boundary`, the `work-*` briefings and `oats-getting-started`.
|
|
37
|
+
- **Package approval.** Declaring a package in `packages:` is the trust
|
|
38
|
+
decision. `oats sync` exits `0` on success (no exit `2`, prompt or
|
|
39
|
+
`approvalNeeded`; `--approve` is `E_BAD_ARGS`), and `oats onboard` has no
|
|
40
|
+
approval step. `E_PACKAGE_UNAPPROVED` is gone. Lock v3 drops `approved`
|
|
41
|
+
(ignored on read, dropped on write). **A kernel before 0.26.0 cannot read a
|
|
42
|
+
lock 0.26.0 wrote** (`E_LOCK_SCHEMA`): keep every kernel of a deployment on
|
|
43
|
+
0.26.0 or later. The lock still pins commit and content integrity
|
|
44
|
+
(`E_PACKAGE_INTEGRITY`); a package no longer declared is `E_PACKAGE_MISSING`
|
|
45
|
+
at spawn until `oats sync`. The `approval`/`approved` fields leave `oats
|
|
46
|
+
workspace status` and `oats capabilities`. Gate on the feature
|
|
47
|
+
`packages-no-approval`; the API integers are not bumped.
|
|
48
|
+
- **The `soul` link in instance homes.** `instance.json` records `soulDir`,
|
|
49
|
+
handed as `OATS_SOUL` to every spawn, launch and retire hook and to in-home
|
|
50
|
+
capability commands (launch and retire hooks and in-home commands had none
|
|
51
|
+
before). A command with no recorded soul gets no `OATS_SOUL`. Homes spawned
|
|
52
|
+
before 0.26.0 keep their link; their launch hooks and in-home commands get no
|
|
53
|
+
`OATS_SOUL` (oats.okf 2.1.5 refuses with `E_OATS_SOUL_MISSING`): re-spawn
|
|
54
|
+
them.
|
|
140
55
|
- **Local souls and `local-agents/`.** A soul is a member repository's
|
|
141
|
-
`souls/<name
|
|
142
|
-
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
- `
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
- **`capabilities:`** (`layers:`, `additive:`, targets, `from:`,
|
|
192
|
-
`injection-override:`) and **`agent-types:`**: a soul's capabilities are
|
|
193
|
-
the workspace's resolution — `oats-workspace.yaml` `defaults:` and each
|
|
194
|
-
soul's `soul.yaml` `capabilities:` / slot keys, then `oats sync`.
|
|
195
|
-
- **`team:`**: teams are `oats-workspace.yaml` `teams:` and a soul's
|
|
196
|
-
`team:`. Hooks get the workspace facts only: `OATS_TEAM_SCOPE` (the
|
|
197
|
-
deployment), `OATS_TEAM_ID` (the messaging payload's `team`),
|
|
198
|
-
`OATS_TEAM_LABEL`, `OATS_WORKSPACE_NAME`, `OATS_WORKSPACE_KEY`;
|
|
199
|
-
`OATS_TEAM_NAME` is always empty. Operator-level capability commands get
|
|
200
|
-
the same five.
|
|
201
|
-
- **`work-modes:`**: a soul's `work:` and the spawn flags decide the mode. A
|
|
202
|
-
worktree `setup:` script no longer runs (run it yourself, or from a
|
|
203
|
-
capability's spawn hook); `retirement-disposable:` is gone with it (a
|
|
204
|
-
capability's manifest `retirement.disposable` still applies).
|
|
205
|
-
- **`agents-md-injection:`**: removed. Instructions come from the soul and
|
|
206
|
-
its modules' injects.
|
|
207
|
-
- **`skill-overrides:`**: removed. A duplicate skill name is
|
|
208
|
-
`E_SKILL_DUPLICATE`; there is no override.
|
|
209
|
-
- **Scope `yolo:`**: removed. Yolo is `--yolo` on `oats spawn`, `session
|
|
210
|
-
start` and `session restart`, or a launch configuration's `yolo`.
|
|
211
|
-
- **`launch-configs:`**: moved to `oats-local.yaml` (see Changed).
|
|
212
|
-
- **`oats:` `injection-override:`**: removed with the kernel's operational
|
|
213
|
-
block (below).
|
|
214
|
-
- **Scheduling a capability agent by name.** A `kind: "spawn"` schedule's
|
|
215
|
-
`agent` is a soul under the deployment's `agents/` root only; the fallback
|
|
216
|
-
to a capability-defined agent (a harvester, a reviewer) is gone with the
|
|
217
|
-
config chain (`E_SCHEDULE_INVALID`, `agent: no soul named …`). Schedule what
|
|
218
|
-
spawns it instead: a `kind: "command"` job running the capability's own
|
|
219
|
-
command (for example `oats okf harvest --soul <soul>`), or a
|
|
220
|
-
`kind: "operation"` job running the provider operation on the anchor home.
|
|
221
|
-
- **Spawning without a workspace deployment.** `oats spawn` with no
|
|
222
|
-
`oats-local.yaml` in reach is `E_LOCAL_MISSING` naming `oats onboard`
|
|
223
|
-
(0.25 answered `E_NO_DEPLOYMENT`, which now means only a deployment whose
|
|
224
|
-
`agents/` root is missing); the kernel's `spawnInstance` without a prepared resolution refuses the same
|
|
225
|
-
way (`spawnInstanceAsync` with `prepared` is the one spawn).
|
|
226
|
-
- **v1 soul fields.** A soul's `runtime`, `model`, `backend`, `repo`, `yolo`,
|
|
227
|
-
`launch-config`, `children` and `requires:` are not read (the v2 soul schema
|
|
228
|
-
already refuses them at discovery; lead decision c3 Q6). They are spawn and
|
|
229
|
-
host choices: `--runtime`, `--model`, `--backend`, `--repo`, `--yolo`,
|
|
230
|
-
`--launch-config` / `oats-local.yaml` `launch-configs:`, and
|
|
231
|
-
`--allow-child-spawns` / `--no-child-spawns` (a recorded child-spawn policy's
|
|
232
|
-
origin is `spawn-option` or `default`, never `soul`). An attached instance
|
|
233
|
-
works in its work tree owner's recorded repository. A capability agent's own
|
|
234
|
-
`soul.yaml` (for example `oats.review`'s reviewer) still names its default
|
|
235
|
-
`runtime`, `model` and `work`.
|
|
236
|
-
- **The kernel's operational block and bundled skills** (lead decision c3 9).
|
|
237
|
-
A soul whose resolution has no `oats.core` or `oats.setup` module no longer
|
|
238
|
-
gets the kernel's "You run on OATS" block or the `oats`, `oats-config` and
|
|
239
|
-
`oats-packages` skills copied into its home; operational knowledge is the
|
|
240
|
-
`oats.core` / `oats.setup` capabilities'. The `skills/oats-config` and
|
|
241
|
-
`skills/oats-packages` directories are deleted.
|
|
242
|
-
- **Session start, restart and capability commands on homes from an earlier
|
|
243
|
-
kernel** (lead decision c3 Q2). A home whose `instance.json` records no
|
|
244
|
-
`modules` answers `E_UNSUPPORTED_MODE` ("re-spawn it from the deployment").
|
|
245
|
-
**`oats retire` still works on it**: no retire hook runs (the home records
|
|
246
|
-
none), and the result's `warnings` says so.
|
|
247
|
-
- **The conversion of a home that predates launch recipes** (lead decision
|
|
248
|
-
c3c). `oats launch-config preview --home` still describes such a home as
|
|
249
|
-
recorded (`selection.source: "frozen-command"`). Under a selection
|
|
250
|
-
(`--runtime`, `--launch-config`, `--model`, `--yolo`/`--no-yolo`) it answers
|
|
251
|
-
`E_LAUNCH_LEGACY` ("re-spawn it from the deployment; nothing was changed")
|
|
252
|
-
instead of converting the recorded command.
|
|
253
|
-
- **Classic `oats doctor`, schedule scope and team roots.** `oats doctor` is
|
|
254
|
-
the workspace-model doctor only (`E_LOCAL_MISSING` with no deployment in
|
|
255
|
-
reach; `--dir` is honoured). A schedule belongs to the deployment directory:
|
|
256
|
-
with none in reach, `oats schedule` is `E_LOCAL_MISSING`, never an ambient
|
|
257
|
-
`OATS_ROOT` / `PI_AGENTS_ROOT` scope. A deployment has one agents root; the
|
|
258
|
-
cross-repository team roots (and `--parent` across them) are gone.
|
|
259
|
-
- **The framework repository's root `oats-config.yaml`** and its only reader,
|
|
260
|
-
`injects/framework-workspace.md`. The kernel refuses an `oats-config.yaml`
|
|
261
|
-
between a command's directory and its deployment, so every instance whose
|
|
262
|
-
work tree is a checkout of this repository failed every `oats` command; the
|
|
263
|
-
root `oats-workspace.yaml` and `oats-membership.yaml` are the repository's
|
|
264
|
-
config, and `scripts/validate-project.mjs` refuses a root `oats-config.yaml`.
|
|
265
|
-
**Consequence:** a classic deployment rooted at a checkout of this repository
|
|
266
|
-
(its root holds `agents/` and a 0.24/0.25 kernel reads the root
|
|
267
|
-
`oats-config.yaml`) can spawn no new instance from that root once it pulls
|
|
268
|
-
this change. Existing homes keep running and retire normally; the rebuild is
|
|
269
|
-
`oats-local.yaml` + `oats onboard` on 0.26.0.
|
|
270
|
-
- **The classic-era guides:** `docs/rebuild-to-v2.md` (the 0.24 → 0.25 rebuild
|
|
271
|
-
guide) and its skill form, `oats.setup`'s `oats-rebuild`;
|
|
272
|
-
`docs/operating-team-migration.md`; `docs/knowledge-migration.md` (OKF v1 →
|
|
273
|
-
v2 for 0.23); `docs/workspace-adoption.md`; `docs/first-team-demo.md`;
|
|
274
|
-
`docs/2026-09-03-architecture-proposal.md`. The catalog-pinned workspace
|
|
275
|
-
example moved to [packages.md](../packages.md#declaring-packages-two-forms-in-one-place),
|
|
276
|
-
where a test keeps its pins equal to `package-catalog.json`.
|
|
277
|
-
- **`docs/oats-config.schema.json`**, the record of what 0.25 read.
|
|
278
|
-
- **Kernel helpers of the v1 catalog migration:** `describeOfficialCatalog`
|
|
279
|
-
(with its `oats install` acquire argv and approval notes) and
|
|
280
|
-
`officialCapabilityPackage` (the `marketplace:` → package mapping);
|
|
281
|
-
`officialCatalogFile` names the effective catalog file. `findRoot` no longer
|
|
282
|
-
treats an `oats-config.yaml` without `agents/` as a package-only deployment
|
|
283
|
-
root; a deployment without `agents/` gets `ensureRoot`'s `oats-local.yaml`
|
|
284
|
-
remedy.
|
|
285
|
-
- **The repository's root `log.md`** (the stale 0.24.2 working log).
|
|
286
|
-
- **The "marketplace" name** for the official list: `docs/official-marketplace.md`
|
|
287
|
-
is [official-catalog.md](../official-catalog.md), and the catalog's `policy`
|
|
288
|
-
field points there.
|
|
56
|
+
`souls/<name>`. `oats create` is `E_UNKNOWN_COMMAND`, and `oats spawn
|
|
57
|
+
--instructions-file` / `--def-file` are `E_BAD_ARGS`, naming the
|
|
58
|
+
replacement (author the soul in a member repository, then `oats sync`).
|
|
59
|
+
`soul-scaffold` hooks no longer run. Capability-defined agents home at
|
|
60
|
+
`<deployment>/agents/<agent>/instances/<name>`; the agents root is the
|
|
61
|
+
closest `agents/` (or `PI_AGENTS_ROOT`).
|
|
62
|
+
- **Classic verbs.** `oats type`, `oats soul set` and `oats session recompose`
|
|
63
|
+
are `E_UNKNOWN_COMMAND` (edit the soul in its repository; re-spawn to
|
|
64
|
+
refresh). `oats status --team` is `E_BAD_ARGS`.
|
|
65
|
+
- **`oats-config.yaml` and the scope configuration chain.** One found between
|
|
66
|
+
a command's directory and its deployment is `E_CONFIG_BROKEN` (`reason:
|
|
67
|
+
"legacy-config"`); with no `oats-local.yaml` in reach, `E_LOCAL_MISSING`
|
|
68
|
+
names it. Where each key went:
|
|
69
|
+
|
|
70
|
+
| 0.25 key | 0.26.0 |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `capabilities:`, `agent-types:` | `oats-workspace.yaml` `defaults:` and `soul.yaml`, then `oats sync` |
|
|
73
|
+
| `team:` | `oats-workspace.yaml` `teams:` and a soul's `team:` |
|
|
74
|
+
| `work-modes:` | a soul's `work:` and spawn flags; a worktree `setup:` script no longer runs |
|
|
75
|
+
| `yolo:` | `--yolo`, or a launch configuration's `yolo` |
|
|
76
|
+
| `launch-configs:` | `oats-local.yaml` (see Changed) |
|
|
77
|
+
| `agents-md-injection:`, `skill-overrides:`, `injection-override:` | removed; a duplicate skill is `E_SKILL_DUPLICATE` |
|
|
78
|
+
|
|
79
|
+
Hooks get the team facts `OATS_TEAM_SCOPE`, `OATS_TEAM_ID`,
|
|
80
|
+
`OATS_TEAM_LABEL`, `OATS_WORKSPACE_NAME` and `OATS_WORKSPACE_KEY`
|
|
81
|
+
(`OATS_TEAM_NAME` is always empty). A classic deployment rooted at a checkout
|
|
82
|
+
of the OATS repository can spawn nothing from that root once it pulls this
|
|
83
|
+
release (its root `oats-config.yaml` is gone); rebuild it with `oats
|
|
84
|
+
onboard`.
|
|
85
|
+
- **v1 soul fields** (`runtime`, `model`, `backend`, `repo`, `yolo`,
|
|
86
|
+
`launch-config`, `children`, `requires:`) are not read; use spawn flags,
|
|
87
|
+
launch configurations and `--allow-child-spawns` / `--no-child-spawns`.
|
|
88
|
+
- **Classic answers and scopes.** With no `oats-local.yaml` and no `--home`,
|
|
89
|
+
`oats inspect`, `readiness`, `operation run`, `doctor`, `spawn` and
|
|
90
|
+
`schedule` answer `E_LOCAL_MISSING` (`E_NO_DEPLOYMENT` now means only a
|
|
91
|
+
missing `agents/` root); an unreadable `--home` is `E_SESSION_UNKNOWN`.
|
|
92
|
+
`--verify-signatures` is always `E_BAD_ARGS`. A
|
|
93
|
+
deployment has one agents root; cross-repository team roots are gone.
|
|
94
|
+
- **Homes from an earlier kernel** (no `modules` in `instance.json`) answer
|
|
95
|
+
`E_UNSUPPORTED_MODE` to start, restart, `--home` reads and capability
|
|
96
|
+
commands; `oats retire` still works, runs no retire hook and says so. `oats
|
|
97
|
+
launch-config preview --home` under a selection answers `E_LAUNCH_LEGACY`.
|
|
98
|
+
- **Scheduling a capability agent by name.** A `kind: "spawn"` schedule names
|
|
99
|
+
a soul; schedule the capability's command (`kind: "command"`, for example
|
|
100
|
+
`oats okf harvest --soul <soul>`) or operation instead.
|
|
101
|
+
- **Leftovers:** the OAS scope probes, the installed tier, the v1 catalog
|
|
102
|
+
migration helpers, and the classic-era guides (including the 0.24 → 0.25
|
|
103
|
+
rebuild guide). The catalog-pinned workspace example is in
|
|
104
|
+
[packages.md](../packages.md#declaring-packages); the official list is the
|
|
105
|
+
[official catalog](../official-catalog.md), no longer "marketplace".
|
|
289
106
|
|
|
290
107
|
## Known limitations
|
|
291
108
|
|
|
292
109
|
- **A scheduled wake's session start uses the spawn-time teams**
|
|
293
|
-
(`OATS_TEAMS_SOURCE=recorded`),
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
`settings.oats.aweb.team`; see teams amendment K under Changed), and the
|
|
301
|
-
kernel hands the provider `OATS_TEAMS`, but 1.13.1 joins no further team.
|
|
302
|
-
The team verbs (`messaging:teams|join|leave`, and `join=` at spawn) arrive
|
|
303
|
-
with oats.aweb 1.14.x, pinned in a 0.26.x patch. There, joined teams **poll**
|
|
304
|
-
(their mail is read between tasks); live receive for joined teams is planned
|
|
305
|
-
for oats.aweb 1.15.
|
|
306
|
-
- **A per-workspace personal team** (one personal team per person per
|
|
307
|
-
workspace) needs aweb server support that is not yet deployed. Until then,
|
|
308
|
-
"personal" is the person's active aweb team, shared across that person's
|
|
309
|
-
workspaces.
|
|
110
|
+
(`OATS_TEAMS_SOURCE=recorded`), so its launch hook leaves no team. The next
|
|
111
|
+
operator start, restart or messaging command is live.
|
|
112
|
+
- **The bundled oats.aweb 1.13.1 joins no team beyond the personal one** (the
|
|
113
|
+
aweb root's active team, or `settings.oats.aweb.team`), though the kernel
|
|
114
|
+
hands it `OATS_TEAMS`.
|
|
115
|
+
- **"Personal" is the person's active aweb team,** shared across that
|
|
116
|
+
person's workspaces.
|
|
310
117
|
|
|
311
118
|
## Upgrading from 0.25
|
|
312
119
|
|
|
313
|
-
- **Retire classic instances with 0.25, then onboard
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
from that directory, and only detects it (onboarding refuses into a
|
|
328
|
-
directory that holds one). Retire them with the 0.25 kernel first, or accept that
|
|
329
|
-
they are orphaned. While the directory exists, `oats status` and
|
|
330
|
-
`oats doctor` report it once as the problem **`legacy-local-agents`** (JSON
|
|
331
|
-
`problems[]`), naming the instances found there. Delete the directory once
|
|
332
|
-
they are stopped.
|
|
333
|
-
|
|
334
|
-
- **Wake needs aw 1.36.5 or later, and a daemon restart.** Scheduled and
|
|
335
|
-
mail-driven wakes were verified end to end on aw 1.36.8 for session-delivery
|
|
336
|
-
homes. After upgrading aw, restart the host's wake daemon so it re-registers.
|
|
337
|
-
|
|
338
|
-
- **Captured homes and captured schedules** (from 0.24–0.25's captured path):
|
|
339
|
-
retire each captured home — 0.26.0 retires it, but none of its captured
|
|
340
|
-
retire hooks runs, so revoke the messaging identities and memberships named
|
|
341
|
-
in the retire warnings with the provider's own tooling — and re-spawn the soul
|
|
342
|
-
from the deployment. Remove each captured schedule job
|
|
343
|
-
(`oats schedule remove --force <id>`) and re-add it without the captured keys.
|
|
120
|
+
- **Retire classic instances with 0.25, then onboard with 0.26.** With 0.26.0,
|
|
121
|
+
write `oats-local.yaml` (`oats onboard`), move what `oats-config.yaml`
|
|
122
|
+
declared into `oats-workspace.yaml` and each `soul.yaml`, delete it, and run
|
|
123
|
+
`oats sync`. Homes left behind retire under 0.26.0 with no retire hook, so
|
|
124
|
+
revoke their messaging identities by hand.
|
|
125
|
+
- **Retire instances under `local-agents/` first.** 0.26.0 does not manage
|
|
126
|
+
them; `oats status` and `oats doctor` report the problem
|
|
127
|
+
`legacy-local-agents` until the directory is deleted.
|
|
128
|
+
- **Wake needs aw 1.36.5 or later** (verified on 1.36.8), and a restart of the
|
|
129
|
+
host's wake daemon.
|
|
130
|
+
- **Captured homes and schedules:** retire each home, revoke the identities
|
|
131
|
+
its retire warnings name, and re-spawn the soul. Remove each captured
|
|
132
|
+
schedule (`oats schedule remove --force <id>`) and re-add it without the
|
|
133
|
+
captured keys.
|
|
344
134
|
|
|
345
135
|
## Added
|
|
346
136
|
|
|
347
|
-
- **Private capabilities are listed as repo-owned** (
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
- `--name` and `--purpose` are mutually exclusive (`E_BAD_ARGS`).
|
|
360
|
-
- The name is never rewritten: a non-slug, or a soul name of the deployment,
|
|
361
|
-
is `E_INSTANCE_NAME_INVALID`.
|
|
362
|
-
- A name that any soul of the deployment already holds, or that a live tmux
|
|
363
|
-
window carries, is `E_INSTANCE_NAME_TAKEN`; never a silent `-2`.
|
|
364
|
-
- `--preview` reports the final name and the same refusals, and
|
|
365
|
-
`--expect-decision` binds the name.
|
|
366
|
-
- Feature `spawn-name`.
|
|
367
|
-
- **Instance names are at most 64 characters**, explicit and derived (the
|
|
368
|
-
messaging alias allows 1–64). A longer name is `E_INSTANCE_NAME_INVALID` in
|
|
369
|
-
preview and apply, and is never truncated. A derived name that would exceed
|
|
370
|
-
64 (a long purpose, or the `-2` suffix on a long one) is refused, naming the
|
|
371
|
-
purpose to shorten. A spawn schedule whose run names
|
|
372
|
-
(`<agent>-<purpose|id>-<YYYYMMDDHHMM>`) would exceed 64 is refused when it is
|
|
373
|
-
saved (`E_SCHEDULE_INVALID`). Previously such a name passed the kernel and
|
|
374
|
-
failed only at the messaging join.
|
|
375
|
-
- **The retire summary names what a recovery copied and what it cost.** A
|
|
376
|
-
workspace-model worktree has no disposable declaration, so its ignored build
|
|
377
|
-
outputs (`node_modules/`, `build/` …) are copied to recovery with the
|
|
378
|
-
uncommitted work: safe, not clean. A recovery (`workRecovery` /
|
|
379
|
-
`workRecoveries[]` under `--json`, and its `recovery.json`) now carries
|
|
380
|
-
`outputs: { paths: [{ path, bytes }], bytes }` (the untracked and ignored
|
|
381
|
-
paths, or a directory's work entries, grouped by top-level entry, largest
|
|
382
|
-
first) and its own `bytes`; the text summary prints the recovery's size and
|
|
383
|
-
`copied outputs: node_modules/ (412.0 MiB), … — <total> in total`.
|
|
384
|
-
- **`oats inspect --json` says where each layer's capability came from.**
|
|
385
|
-
Each `layers.<layer>` row gains `from`: `"soul"`, `"workspace"` (a slot
|
|
386
|
-
default or `defaults.capabilities`) or `"team:<label>"`
|
|
387
|
-
(`defaults.byTeam.<label>`). It is `null` for an empty slot. A spawn records
|
|
388
|
-
the rows in `instance.json` (`workspace.layers`), so `inspect --home`
|
|
389
|
-
reports the spawn-time origin. A home spawned earlier reports `null`.
|
|
390
|
-
Neither revision changes. Feature `layers-from`.
|
|
137
|
+
- **Private capabilities are listed as repo-owned** (`private: true` rows,
|
|
138
|
+
still usable only by their own repository's souls). Feature
|
|
139
|
+
`capabilities-private`.
|
|
140
|
+
- **`oats spawn <soul> --name <slug>`**: an explicit, unprefixed instance
|
|
141
|
+
name, never rewritten; exclusive with `--purpose`. Refusals:
|
|
142
|
+
`E_INSTANCE_NAME_INVALID`, `E_INSTANCE_NAME_TAKEN`. Feature `spawn-name`.
|
|
143
|
+
- **Instance names are at most 64 characters**, never truncated; a spawn
|
|
144
|
+
schedule whose run names would exceed 64 is refused when saved.
|
|
145
|
+
- **The retire summary names what a recovery copied** (`outputs`, `bytes`).
|
|
146
|
+
- **`oats inspect --json` says where each layer's capability came from**
|
|
147
|
+
(`layers.<layer>.from`: `soul`, `workspace` or `team:<label>`). Feature
|
|
148
|
+
`layers-from`.
|
|
391
149
|
|
|
392
150
|
## Changed
|
|
393
151
|
|
|
394
|
-
- **Souls have no private mode
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
key). Each now requires OATS >=0.26.0 and names only the workspace-model
|
|
418
|
-
homes for its settings:
|
|
419
|
-
- the soul's `tasks:` payload;
|
|
420
|
-
- `settings.<cap>` in the deployment's `oats-local.yaml`;
|
|
421
|
-
- `--provider` at spawn.
|
|
422
|
-
|
|
423
|
-
oats.dev drops its `oats-config.yaml` config template and its package
|
|
424
|
-
dependencies; oats.review is 1.2.1.
|
|
425
|
-
|
|
426
|
-
- **A soul may name several team labels** (teams contract,
|
|
427
|
-
[docs/design/2026-09-25-teams-contract.md](../design/2026-09-25-teams-contract.md)).
|
|
428
|
-
The kernel passes each label's messaging payload to the provider as
|
|
429
|
-
`OATS_TEAMS` (the eligible teams). Joining them is the messaging provider's
|
|
430
|
-
job: oats.aweb 1.14.0 joins the default personal team only, and any other
|
|
431
|
-
team on an explicit join.
|
|
432
|
-
- `soul.yaml` `team` and `oats-membership.yaml`'s `team` take a label or a
|
|
433
|
-
non-empty list of distinct labels; the first is the **primary**. A
|
|
434
|
-
one-label soul composes exactly as before (same modules, skills, injects
|
|
435
|
-
and `declRevision`); its messaging payload changes only by amendment K
|
|
436
|
-
(below).
|
|
437
|
-
- `defaults.byTeam[<label>].capabilities` applies for every label, in order.
|
|
438
|
-
Two labels that give one capability different entries are
|
|
439
|
-
`E_TEAM_CONFLICT` (naming both), unless the soul names that capability
|
|
440
|
-
itself.
|
|
441
|
-
- **The messaging provider no longer receives `byTeam[<label>]` merged into
|
|
442
|
-
its settings** (teams amendment K, co-lead ruling), the primary's included:
|
|
443
|
-
the settings are `base ⊕ soul ⊕ host ⊕ spawn`, and the per-label payloads
|
|
444
|
-
are in `OATS_TEAMS`. `OATS_TEAM_ID` (the settings' `team`) is therefore the
|
|
445
|
-
personal team a host, soul or spawn set; empty means the provider's
|
|
446
|
-
default. With oats.aweb 1.13.1 the primary identity mints into the
|
|
447
|
-
personal (root-active) team. The preview's `settingsOrigins` no longer
|
|
448
|
-
shows a `workspace-team` origin.
|
|
449
|
-
- **Revision change:** a soul whose primary label is mapped in
|
|
450
|
-
`messaging.byTeam` gets a new `payloadRevision` and `revision` (its
|
|
451
|
-
`declRevision` is unchanged), so a preview reports a payload change
|
|
452
|
-
against instances spawned before this.
|
|
453
|
-
- `OATS_TEAM_LABEL` stays the primary label. New: `OATS_TEAM_LABELS` (comma-joined), `OATS_TEAMS`
|
|
454
|
-
(`[{ label, team, mapped, payload }]`, `[]` with no label) and
|
|
455
|
-
`OATS_TEAMS_SOURCE` (`live` | `recorded`). All three are set in the
|
|
456
|
-
environment of every hook, home command and provider check, and only
|
|
457
|
-
there: a check's stdin request is unchanged, so providers that decode it
|
|
458
|
-
strictly (oats.aweb 1.13.1) keep working. They are empty when a home's
|
|
459
|
-
teams are unknown. A provider leaves a joined team only when the source is
|
|
460
|
-
`live`.
|
|
461
|
-
- A home's teams are **live** where they are acted on: the launch hook, the
|
|
462
|
-
messaging module's commands and `messaging:` operations, and `inspect
|
|
463
|
-
--home` read the workspace's current mappings in two repository reads (no
|
|
464
|
-
discovery); `readiness --home` uses the discovery it already runs. Other
|
|
465
|
-
capability commands and operations get the spawn-time list
|
|
466
|
-
(`instance.json` `teams`, `recorded`) at no remote cost. The home's modules
|
|
467
|
-
are unchanged.
|
|
468
|
-
- `oats spawn --preview` and `oats inspect` show `teams`. A label with no
|
|
469
|
-
`messaging.byTeam` entry is one `unmapped-team-label` warning, naming its
|
|
470
|
-
souls, in `oats workspace status` / `oats sync`. Feature `teams`.
|
|
471
|
-
- oats.aweb 1.13.1 ignores the new variables and keeps working.
|
|
472
|
-
|
|
473
|
-
- **Declared setting keys.** The spawn preview's `modules[]` and `oats inspect`'s
|
|
474
|
-
`capabilities[]` carry `declares`: the setting keys each manifest declares,
|
|
475
|
-
sorted, names only (`[]` when none). Feature `settings-declared`.
|
|
476
|
-
|
|
477
|
-
- **A home records its module skills.** `instance.json` `skills` lists each
|
|
478
|
-
module skill as `{ name, source: "module:<capability>" }` beside the soul's
|
|
479
|
-
own (`source: "soul"`), and `composition.materialized.skills` adds `from`:
|
|
480
|
-
the home's module copy (`.oats/modules/<capability>/…`) the skill was copied
|
|
481
|
-
from. Module skills sit under `.agents/skills/<capability>/<skill>/`.
|
|
482
|
-
- **`oats launch-config list` with only a 0.25 `oats-config.yaml` in reach**
|
|
483
|
-
answers `E_LOCAL_MISSING` naming the file instead of an empty list; inside a
|
|
484
|
-
deployment the file is `E_CONFIG_BROKEN` with `details.reason:
|
|
485
|
-
"legacy-config"`, as for every command.
|
|
486
|
-
- **Launch configurations move to `oats-local.yaml`** (lead decision 2: a
|
|
487
|
-
spawn-time host choice). The deployment's `oats-local.yaml` gains a
|
|
488
|
-
`launch-configs:` key with the same entries (`runtime`, `executable`, `args`,
|
|
489
|
-
`env`, `model`, `yolo`); `oats launch-config set | remove` rewrite only that
|
|
490
|
-
block, and `list` / `preview`, `--launch-config` on `oats spawn` and on
|
|
491
|
-
`oats session start | restart`, and the `launch-config` feature are unchanged.
|
|
492
|
-
There is one host file and no scope chain: `list` rows keep `source` (the
|
|
493
|
-
deployment directory) and an always-empty `shadows`. A relative `executable`
|
|
494
|
-
resolves against the deployment directory. A home's launch configurations
|
|
495
|
-
are its deployment's, found walking up from the home.
|
|
496
|
-
- **Upgrading:** a scope's `oats-config.yaml` that still declares
|
|
497
|
-
`launch-configs:` is refused (its readers, and the `launch-config`
|
|
498
|
-
commands, name the move). Move the block into `oats-local.yaml`, or
|
|
499
|
-
re-declare each entry with `oats launch-config set <name> --file <json>`
|
|
500
|
-
from the deployment. `set` with no `oats-local.yaml` in reach is
|
|
501
|
-
`E_LOCAL_MISSING`.
|
|
502
|
-
- **The capability manifest contract is checked where a workspace reads the
|
|
503
|
-
manifest.** The rules the kernel enforced only on classic capabilities now
|
|
504
|
-
apply to member and package capabilities too, before anything runs:
|
|
505
|
-
- a launch `environment` name inside the capability's vendor namespace (or an
|
|
506
|
-
`environmentNamespaces` prefix that is not reserved), never a core or
|
|
507
|
-
process bootstrap variable;
|
|
508
|
-
- hooks: an approved event, a command string or `{ command, required,
|
|
509
|
-
inputs }`, `required: true` only on the spawn hook, and a script path inside
|
|
510
|
-
the capability directory;
|
|
511
|
-
- hooks and launch environment only on a dotted id (`acme.tool`): an
|
|
512
|
-
undotted id has no vendor namespace to claim.
|
|
513
|
-
|
|
514
|
-
A member capability that breaks one is a discovery problem
|
|
515
|
-
(`E_WORKSPACE_SCHEMA` at `capabilities/<dir>/oats.json#<pointer>`, shown by
|
|
516
|
-
`oats workspace status`) and is not listed; a soul that declares it is
|
|
517
|
-
refused with that problem (`reason: "manifest-contract"`), not "missing". A
|
|
518
|
-
package capability that breaks one is `E_PACKAGE_MANIFEST` at `oats sync`.
|
|
519
|
-
- **A provider payload value outside the manifest's `settings.<key>.values`
|
|
520
|
-
is refused** (`E_WORKSPACE_SCHEMA`, `reason: "setting-value"`, naming where
|
|
521
|
-
it was set: a `--provider` flag, `oats-local.yaml` settings, the soul or the
|
|
522
|
-
workspace). A misspelled value used to be recorded and skip every
|
|
523
|
-
conditional `requires` row that reads it.
|
|
524
|
-
- **A capability agent is a workspace-model spawn of its providing module
|
|
525
|
-
only** (lead decision c3 Q1). `oats spawn <agent>` for a capability's
|
|
526
|
-
`agents:` soul (OKF's `memory-harvest`, `oats.review`'s `reviewer`) records
|
|
527
|
-
`modules`/`providers`/`workspace` like any v2 home, and composes exactly one
|
|
528
|
-
module: the capability that declares the agent. The module comes from the
|
|
529
|
-
`--parent`/`--relative-to` instance's verified copy (pinned to its recorded
|
|
530
|
-
digest, with its recorded payload), else from a home that carries it, else
|
|
531
|
-
from a confirmed member capability or a locked package that declares the
|
|
532
|
-
agent (the source instance may be gone). A capability agent gets no
|
|
533
|
-
knowledge, messaging or tasks module and runs no provider hook, its providing
|
|
534
|
-
module's included: a harvester never registers as a knowledge source or gets
|
|
535
|
-
a messaging identity. A knowledge-layer provider's inject is left out.
|
|
536
|
-
- **`instance.json` records `workspace.name` and `workspace.deployment`**
|
|
537
|
-
(M5/3a). `oats inspect --home` reports the recorded workspace name without
|
|
538
|
-
discovery, and `oats operation run --home` hands it to the provider as
|
|
539
|
-
`OATS_WORKSPACE_NAME`. Homes spawned before 0.26.0 have neither.
|
|
540
|
-
|
|
152
|
+
- **Souls have no private mode.** `private:` in `soul.yaml` is accepted but
|
|
153
|
+
ignored, with a `soul-private-ignored` warning.
|
|
154
|
+
- **A capability whose `compatibility.oats` the kernel does not satisfy is
|
|
155
|
+
refused** (`E_CAPABILITY_INCOMPATIBLE`); an existing home reports
|
|
156
|
+
`capability-incompatible` instead.
|
|
157
|
+
- **Catalog:** oats.authoring 1.0.3; oats.jira, oats.linear and oats.dev
|
|
158
|
+
1.0.1 (require OATS >=0.26.0, settings only from the workspace model);
|
|
159
|
+
oats.review 1.2.1.
|
|
160
|
+
- **A soul may name several team labels**; the first is the primary. Each
|
|
161
|
+
label's `defaults.byTeam` applies (`E_TEAM_CONFLICT` on a clash). The
|
|
162
|
+
messaging provider's settings no longer merge `byTeam[<label>]`; the
|
|
163
|
+
per-label payloads travel in `OATS_TEAMS`, beside `OATS_TEAM_LABELS` and
|
|
164
|
+
`OATS_TEAMS_SOURCE`, and a soul whose primary label is mapped gets a new
|
|
165
|
+
`payloadRevision`. Feature `teams`. See the
|
|
166
|
+
[teams contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-25-teams-contract.md).
|
|
167
|
+
- **Launch configurations move to `oats-local.yaml`** (`launch-configs:`).
|
|
168
|
+
Move the block, or re-declare each entry with `oats launch-config set`. See
|
|
169
|
+
[configuration.md](../configuration.md#launch-configurations).
|
|
170
|
+
- **The capability manifest contract applies to member and package
|
|
171
|
+
capabilities** (`E_WORKSPACE_SCHEMA` / `E_PACKAGE_MANIFEST`), and a payload
|
|
172
|
+
value outside `settings.<key>.values` is refused.
|
|
173
|
+
- **A capability agent composes only its providing module**, with no
|
|
174
|
+
knowledge, messaging or tasks module.
|
|
541
175
|
- **`oats inspect`, `oats readiness` and `oats operation run` read the
|
|
542
|
-
workspace model**
|
|
543
|
-
|
|
544
|
-
The probe integers are the gate: `operationsApi: 2`, `soulsApi: 2` (the
|
|
545
|
-
inspect soul rows) and `readinessApi: 2`. `oats souls --json` keeps
|
|
546
|
-
`soulsApi: 1`, since its shape is unchanged. Shapes and examples are in
|
|
176
|
+
workspace model** (`operationsApi: 2`, `soulsApi: 2`, `readinessApi: 2`).
|
|
177
|
+
Readiness checks are `installed | configured | member | providers`. See
|
|
547
178
|
[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).
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
portable `sources`. A capability's origin is its module's `from`; its
|
|
555
|
-
settings are the merged provider payload.
|
|
556
|
-
- Readiness checks are `installed | configured | member | providers`:
|
|
557
|
-
- `trusted` is removed, and `--verify-signatures` is `E_BAD_ARGS`.
|
|
558
|
-
- `enrolled` is now `member`: the soul's member repository confirmed in
|
|
559
|
-
the workspace (`oats-membership.yaml`), never `oats.yaml`.
|
|
560
|
-
- `providers` is new: each bound provider's own binding check, relayed
|
|
561
|
-
verbatim as `{status, problems, warnings}`. The status maps to the item:
|
|
562
|
-
- `ready` → pass;
|
|
563
|
-
- `needs-configuration` or `authorization-required` → fail;
|
|
564
|
-
- `unavailable` → unknown.
|
|
565
|
-
|
|
566
|
-
`warnings` is optional in the provider's answer and always present in
|
|
567
|
-
the relay (`[]` when absent). It never changes the status: a ready
|
|
568
|
-
binding with a warning still passes. The answer is decoded by the
|
|
569
|
-
binding wire's rules (exit 0, one strict JSON document, the envelope
|
|
570
|
-
echo, no problems on `ready`); anything else is `unknown`. All provider
|
|
571
|
-
checks share one 60 s budget per read. Provider authors: the request,
|
|
572
|
-
environment and answer are specified in
|
|
573
|
-
[capabilities.md](../capabilities.md#readiness-check-bindingcheck).
|
|
574
|
-
- A soul whose packages the lock does not provide fails `installed` with
|
|
575
|
-
the typed code and an `oats sync` remedy.
|
|
576
|
-
- The probe's integers say the kernel can answer the v2 shapes. Dispatch
|
|
577
|
-
on each payload's own integer; the v1 shapes are removed (see Removed).
|
|
578
|
-
- The `readiness-verify` feature is no longer advertised.
|
|
579
|
-
- A v2 home's deployment is derived from its path
|
|
580
|
-
(`<deployment>/agents/<soul>/instances/<name>`), and
|
|
581
|
-
`<deployment>/oats-local.yaml` must exist exactly there (`E_HOME_MISMATCH`
|
|
582
|
-
otherwise). A v2 spawn ignores an ambient `PI_AGENTS_ROOT` / `OATS_ROOT`.
|
|
583
|
-
- A module tree in the deployment's store (used by readiness `--soul`,
|
|
584
|
-
`operation run --soul` and `oats <ns>` dispatch) runs only while it
|
|
585
|
-
matches the digest verified when it was fetched at the locked commit. A
|
|
586
|
-
drifted tree is fetched again; a fetch that does not verify is
|
|
587
|
-
`E_PACKAGE_INTEGRITY`.
|
|
588
|
-
- `readiness --policy` is kept, with the same shape. The selector echo moves
|
|
589
|
-
from `subject.selector` to a top-level `selector`.
|
|
590
|
-
- `oats operation run` runs the module that fills the layer for the home or
|
|
591
|
-
the soul. There is no trust gate, and the result carries
|
|
592
|
-
`operationsApi: 2`. Remote routing accepts a destination advertising
|
|
593
|
-
`operationsApi` 1 or 2.
|
|
594
|
-
|
|
595
|
-
- **Manifest setting defaults reach workspace spawns** (addendum 5). A
|
|
596
|
-
capability's declared `settings.<key>.default` (for example oats.aweb's
|
|
597
|
-
`identity: { mode: local }`) is now the lowest layer of the merged provider
|
|
598
|
-
payload on `oats spawn`, `--preview` and `oats inspect --soul`, below the
|
|
599
|
-
workspace, team, soul, host and `--provider` layers. The provider receives it
|
|
600
|
-
in `OATS_SETTINGS` and `instance.json` `providers.<cap>` records it. The
|
|
601
|
-
preview's new `settingsOrigins.<cap>` says where each leaf came from
|
|
602
|
-
(`manifest-default`, `workspace`, `workspace-team`, `soul`, `host`,
|
|
603
|
-
`spawn`; feature `settings-origins`), so a Desktop shows "Default" without
|
|
604
|
-
hardcoding it. The decision
|
|
605
|
-
binds the payload by value, defaults included. An instance spawned before
|
|
606
|
-
0.26.0 keeps the payload it recorded, without the defaults.
|
|
179
|
+
- **Manifest setting defaults reach workspace spawns** as the lowest payload
|
|
180
|
+
layer; the preview's `settingsOrigins` says where each value came from
|
|
181
|
+
(feature `settings-origins`).
|
|
182
|
+
- Spawn previews and `oats inspect` report each module's declared setting keys
|
|
183
|
+
(feature `settings-declared`); `instance.json` records module skills and
|
|
184
|
+
`workspace.name` / `workspace.deployment`.
|
|
607
185
|
|
|
608
186
|
## Fixed
|
|
609
187
|
|
|
610
|
-
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
- **Session start and restart of a workspace-model home.** Every start or
|
|
623
|
-
restart of a home that records `modules` and a launch recipe refused with
|
|
624
|
-
`E_LAUNCH_PREPARATION` ("… is no longer installed in the scope"): the
|
|
625
|
-
launch providers' manifests were looked up from the home's recorded work
|
|
626
|
-
repository instead of the home's own module copies. A module home now reads
|
|
627
|
-
them from `<home>/.oats/modules`, and is never re-resolved against the scope;
|
|
628
|
-
a module copy that is missing is its own refusal naming the directory.
|
|
629
|
-
|
|
630
|
-
- **A spawn preview writes nothing, the first one included.** The first
|
|
631
|
-
`oats spawn <soul> --preview` of a workspace soul (or of a new member commit)
|
|
632
|
-
used to fill the deployment's soul cache (`agents/<soul>/souls/<commit>/`)
|
|
633
|
-
and move the `agents/<soul>/soul` pointer. A preview now reads the cache when
|
|
634
|
-
a spawn already filled it, else fetches the soul to a temporary copy outside
|
|
635
|
-
the deployment and removes it; `soulFetched: true` still says it fetched. The
|
|
636
|
-
deployment is byte-identical after any preview, as `spawnPreviewApi 2`
|
|
637
|
-
promises (docs/desktop-cli-api.md).
|
|
638
|
-
|
|
639
|
-
- **`oats retire <unknown>` is a typed refusal.** An instance name with no home
|
|
640
|
-
under the agents root used to escape as an untyped error with a stack trace
|
|
641
|
-
(no `--json` envelope). It is now `E_SESSION_UNKNOWN` (`no instance named
|
|
642
|
-
"<name>"`), the code every lookup by instance name answers, exit 1, one
|
|
643
|
-
envelope under `--json`.
|
|
644
|
-
|
|
645
|
-
- **Instance names are unique across the deployment.** A derived name used to
|
|
646
|
-
de-duplicate only within its own soul's `instances/`, so soul `a` with
|
|
647
|
-
`--purpose b-c` and soul `a-b` with `--purpose c` both got `a-b-c`. Derived
|
|
648
|
-
names now skip every instance and soul name in the deployment (`-2`, `-3`, …).
|
|
649
|
-
|
|
650
|
-
- **`oats status` shows a workspace soul as it is written.** A soul row read a
|
|
651
|
-
`schemaVersion: 2` soul.yaml with the classic flat reader: a nested map
|
|
652
|
-
(`capabilities`, `knowledge` …) came out as `""` and `schemaVersion` as the
|
|
653
|
-
string `"2"`. Such a soul.yaml is now read with the YAML parser: the row
|
|
654
|
-
carries the maps as maps, `schemaVersion: 2` and booleans as booleans.
|
|
655
|
-
|
|
656
|
-
- **`oats doctor --soul <name>` includes module injects.** On a workspace
|
|
657
|
-
deployment it composed through the classic config chain, so the capability
|
|
658
|
-
injects a spawned home carries were missing. It now resolves the soul over
|
|
659
|
-
the workspace remotes as a spawn preview does and composes the full text
|
|
660
|
-
(module inject blocks are named home-relative, `.oats/modules/<cap>/…`). It
|
|
661
|
-
writes nothing in the deployment; an unknown soul is `E_SOUL_UNKNOWN`.
|
|
662
|
-
Without `--soul`, doctor stays offline.
|
|
663
|
-
|
|
664
|
-
- **Capability commands recognise `OATS_INSTANCE_HOME`.** Dispatch found the
|
|
665
|
-
instance home only from `PI_AGENT_HOME` / `OATS_HOME`; the canonical
|
|
666
|
-
`OATS_INSTANCE_HOME` now counts, and wins when several are set.
|
|
667
|
-
|
|
668
|
-
- **Launch-preparation refusals name no removed verb.** The classic
|
|
669
|
-
`E_LAUNCH_PREPARATION` remedies said "reinstall it (oats install)" and
|
|
670
|
-
"re-trust it (oats trust)"; the remedy is now "respawn the instance".
|
|
188
|
+
- Every team label's messaging payload is validated, not only the primary's.
|
|
189
|
+
- Launch and retire hooks get the primary `OATS_TEAM_LABEL` and
|
|
190
|
+
`OATS_TEAM_ID` (they were empty).
|
|
191
|
+
- Session start and restart of a workspace-model home no longer refuse with
|
|
192
|
+
`E_LAUNCH_PREPARATION`.
|
|
193
|
+
- A spawn preview writes nothing to the deployment, the first one included.
|
|
194
|
+
- `oats retire <unknown>` is `E_SESSION_UNKNOWN`.
|
|
195
|
+
- Derived instance names are unique across the deployment.
|
|
196
|
+
- `oats status` reads a `schemaVersion: 2` soul.yaml correctly.
|
|
197
|
+
- `oats doctor --soul <name>` includes module injects.
|
|
198
|
+
- Capability commands recognise `OATS_INSTANCE_HOME`.
|
|
199
|
+
- `E_LAUNCH_PREPARATION` remedies no longer name removed verbs.
|