@awebai/oats 0.29.3 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -6
- package/bin/oats.mjs +203 -54
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
- package/capabilities/oats-aweb/injects/aweb.md +1 -1
- package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
- package/capabilities/oats-aweb/oats.json +5 -12
- package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
- package/capabilities/oats-code-review/injects/reviewer.md +26 -0
- package/capabilities/oats-code-review/oats.json +16 -0
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
- package/capabilities/oats-developer/injects/developer.md +38 -0
- package/capabilities/oats-developer/oats.json +17 -0
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
- package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
- package/capabilities/oats-engineering-expert/oats.json +17 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
- package/capabilities/oats-okf/bin/oats-okf.mjs +16 -9
- package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
- package/capabilities/oats-okf/lib/config.mjs +2 -1
- package/capabilities/oats-okf/lib/consult.mjs +26 -4
- package/capabilities/oats-okf/lib/harvest-switch.mjs +16 -3
- package/capabilities/oats-okf/lib/inspection.mjs +26 -7
- package/capabilities/oats-okf/lib/io.mjs +9 -1
- package/capabilities/oats-okf/lib/sources.mjs +34 -3
- package/capabilities/oats-okf/lib/stores.mjs +8 -6
- package/capabilities/oats-okf/lib/worker.mjs +7 -17
- package/capabilities/oats-okf/oats.json +6 -3
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
- package/capabilities/oats-okf-harvest/oats.json +3 -3
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +37 -16
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +6 -1
- package/capabilities/oats-okf-maintenance/oats.json +2 -2
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +17 -2
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
- package/capabilities/oats-workspace-experts/oats.json +9 -0
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +7 -10
- package/docs/configuration.md +213 -64
- package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
- package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
- package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
- package/docs/design/2026-09-27-team-model-v2.md +116 -0
- package/docs/design/2026-09-28-automations-trust.md +38 -0
- package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
- package/docs/design/HISTORY.md +65 -0
- package/docs/design/README.md +23 -54
- package/docs/desktop-cli-api.md +1787 -1777
- package/docs/desktop.md +30 -91
- package/docs/execution-targets.md +146 -292
- package/docs/first-team.md +31 -17
- package/docs/implementation.md +76 -288
- package/docs/integrations.md +118 -320
- package/docs/knowledge-capability-authoring.md +25 -52
- package/docs/knowledge-reference/acceptance.md +3 -3
- package/docs/knowledge-reference/adoption.md +1 -1
- package/docs/knowledge-reference/harvester.md +2 -2
- package/docs/knowledge-reference/package-craft.md +3 -3
- package/docs/knowledge-reference/provider-mapping.md +3 -6
- package/docs/knowledge-reference/reader-capture.md +3 -3
- package/docs/knowledge-theory.md +62 -166
- package/docs/knowledge.md +225 -404
- package/docs/layers.md +42 -97
- package/docs/oats-local.schema.json +58 -5
- package/docs/oats-membership.schema.json +1 -8
- package/docs/oats-package.schema.json +5 -5
- package/docs/oats-workspace.schema.json +8 -22
- package/docs/official-catalog.md +25 -28
- package/docs/packages.md +45 -63
- package/docs/plans/0.30-close-out.md +61 -0
- package/docs/release-lane.md +77 -0
- package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
- package/docs/release-notes/v0.19.0.md +48 -147
- package/docs/release-notes/v0.19.1.md +2 -3
- package/docs/release-notes/v0.19.3.md +2 -15
- package/docs/release-notes/v0.20.0.md +0 -15
- package/docs/release-notes/v0.22.0.md +71 -138
- package/docs/release-notes/v0.22.1.md +42 -90
- package/docs/release-notes/v0.22.10.md +1 -1
- package/docs/release-notes/v0.22.11.md +1 -47
- package/docs/release-notes/v0.22.12.md +4 -13
- package/docs/release-notes/v0.22.13.md +1 -42
- package/docs/release-notes/v0.22.14.md +3 -11
- package/docs/release-notes/v0.22.15.md +1 -46
- package/docs/release-notes/v0.22.16.md +6 -8
- package/docs/release-notes/v0.22.18.md +1 -99
- package/docs/release-notes/v0.22.19.md +3 -14
- package/docs/release-notes/v0.22.2.md +6 -15
- package/docs/release-notes/v0.22.3.md +0 -1
- package/docs/release-notes/v0.22.4.md +1 -14
- package/docs/release-notes/v0.22.5.md +2 -12
- package/docs/release-notes/v0.22.6.md +0 -3
- package/docs/release-notes/v0.23.0.md +9 -25
- package/docs/release-notes/v0.23.1.md +9 -25
- package/docs/release-notes/v0.23.2.md +2 -4
- package/docs/release-notes/v0.24.0.md +56 -97
- package/docs/release-notes/v0.24.1.md +7 -11
- package/docs/release-notes/v0.24.10.md +34 -45
- package/docs/release-notes/v0.24.11.md +12 -20
- package/docs/release-notes/v0.24.12.md +35 -48
- package/docs/release-notes/v0.24.13.md +34 -41
- package/docs/release-notes/v0.24.2.md +9 -13
- package/docs/release-notes/v0.24.3.md +7 -11
- package/docs/release-notes/v0.24.4.md +6 -6
- package/docs/release-notes/v0.24.5.md +6 -10
- package/docs/release-notes/v0.24.6.md +2 -5
- package/docs/release-notes/v0.24.7.md +46 -75
- package/docs/release-notes/v0.24.8.md +58 -96
- package/docs/release-notes/v0.24.9.md +38 -54
- package/docs/release-notes/v0.25.0.md +59 -76
- package/docs/release-notes/v0.25.1.md +57 -81
- package/docs/release-notes/v0.25.2.md +51 -70
- package/docs/release-notes/v0.25.3.md +11 -13
- package/docs/release-notes/v0.25.4.md +9 -13
- package/docs/release-notes/v0.25.5.md +3 -5
- package/docs/release-notes/v0.25.6.md +20 -29
- package/docs/release-notes/v0.25.7.md +5 -7
- package/docs/release-notes/v0.25.8.md +26 -39
- package/docs/release-notes/v0.26.0.md +175 -646
- package/docs/release-notes/v0.27.0.md +4 -5
- package/docs/release-notes/v0.27.1.md +4 -6
- package/docs/release-notes/v0.27.2.md +1 -1
- package/docs/release-notes/v0.28.0.md +57 -124
- package/docs/release-notes/v0.29.0.md +89 -208
- package/docs/release-notes/v0.29.1.md +1 -1
- package/docs/release-notes/v0.29.2.md +3 -4
- package/docs/release-notes/v0.29.4.md +90 -0
- package/docs/release-notes/v0.30.0.md +205 -0
- package/docs/schedules.md +280 -349
- package/docs/servers.md +99 -117
- package/docs/soul.schema.json +2 -9
- package/docs/souls-and-instances.md +145 -158
- package/docs/workspaces.md +132 -215
- package/lib/automations.mjs +28 -6
- package/lib/core.mjs +226 -74
- package/lib/instance-events.mjs +1 -1
- package/lib/instance-inspect.mjs +109 -34
- package/lib/instance-lifecycle.mjs +14 -1
- package/lib/instance-resolution.mjs +26 -27
- package/lib/launch-preference.mjs +87 -0
- package/lib/materialize.mjs +3 -3
- package/lib/packages.mjs +2 -5
- package/lib/resolve.mjs +29 -87
- package/lib/schedule.mjs +32 -18
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +53 -17
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +9 -15
- package/package.json +1 -1
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-review/injects/review.md +0 -69
- package/capabilities/oats-review/oats.json +0 -10
- package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
- package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
- package/docs/conventions.md +0 -90
- package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
- package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
- package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
- package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
- package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
- package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
- package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
- package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
- package/docs/design/2026-09-15-captured-dispatch.md +0 -127
- package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
- package/docs/design/2026-09-15-package-preparation.md +0 -100
- package/docs/design/2026-09-15-portable-data-contract.md +0 -121
- package/docs/design/2026-09-15-portable-declarations.md +0 -189
- package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
- package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
- package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
- package/docs/design/2026-09-15-source-observation.md +0 -119
- package/docs/design/2026-09-16-captured-admission.md +0 -77
- package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
- package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
- package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
- package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
- package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
- package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
- package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
- package/docs/design/2026-09-16-portable-onboarding.md +0 -179
- package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
- package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
- package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
- package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
- package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
- package/docs/design/2026-09-17-captured-native-start.md +0 -58
- package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
- package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
- package/docs/design/2026-09-17-public-captured-start.md +0 -108
- package/docs/design/2026-09-17-public-prepare-request.md +0 -90
- package/docs/design/2026-09-18-captured-pi-host.md +0 -205
- package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
- package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
- package/docs/design/2026-09-20-redesign-program-board.md +0 -142
- package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
- package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
- package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
- package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
- package/docs/design/2026-09-24-phase-d-plan.md +0 -305
- package/docs/design/2026-09-25-teams-contract.md +0 -258
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
- package/docs/design/desktop-ux-plan.md +0 -362
- package/docs/design/launch-configurations.md +0 -168
- package/docs/design/okf-mirror-provenance.md +0 -105
- package/docs/design/operations-contract.md +0 -141
- package/docs/oats-member.schema.json +0 -38
- package/skills/integration-authoring/SKILL.md +0 -84
- package/skills/oats-support/SKILL.md +0 -79
- package/skills/skill-craft/SKILL.md +0 -109
- package/skills/soul-craft/SKILL.md +0 -116
package/docs/implementation.md
CHANGED
|
@@ -1,294 +1,82 @@
|
|
|
1
1
|
# Implementation reference
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
A map of this repository for contributors. What OATS does is in the
|
|
4
|
+
reference pages ([workspaces](workspaces.md), [souls and instances](souls-and-instances.md),
|
|
5
|
+
[capabilities](capabilities.md)); the normative module contracts are in
|
|
6
|
+
[the workspace module contracts](design/2026-09-23-workspace-module-contracts.md).
|
|
7
|
+
|
|
8
|
+
## What is published
|
|
9
|
+
|
|
10
|
+
- **`@awebai/oats`**: the runtime-neutral kernel (`lib/`), the `oats` CLI
|
|
11
|
+
(`bin/oats.mjs`), the kernel and work-mode instruction sources
|
|
12
|
+
(`injects/`), the bootstrap skills, the docs and the official package
|
|
13
|
+
catalog (`package-catalog.json`). It has no runtime dependencies.
|
|
14
|
+
- **`@awebai/oats-pi`** (`packages/pi/`): a thin pi adapter that exposes an
|
|
15
|
+
instance's own resources. It registers no agent tools.
|
|
16
|
+
- **`oats.framework`** (`oats-package/`): the `oats.core`, `oats.setup` and
|
|
17
|
+
`oats.knowledge-theory` capabilities and the `knowledge-theory-expert` soul,
|
|
18
|
+
released as a package under its own `oats-framework/v<version>` tags.
|
|
19
|
+
|
|
20
|
+
The OATS Desktop (`packages/desktop/`) is an Electron app with a bundled,
|
|
21
|
+
dependency-free localhost server; it is released with the kernel but not
|
|
22
|
+
published to npm. Its developer docs are in
|
|
23
|
+
[`packages/desktop/README.md`](../packages/desktop/README.md).
|
|
14
24
|
|
|
15
25
|
## Repository layout
|
|
16
26
|
|
|
17
|
-
|
|
|
27
|
+
| path | contents |
|
|
18
28
|
|---|---|
|
|
19
|
-
| `
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `skills/` |
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
`defaults.<slot>` ⊕ `defaults.capabilities` ⊕ `defaults.byTeam[team]` ⊕
|
|
74
|
-
`soul.capabilities` (soul wins; `off` removes; a soul's `<slot>: none` empties
|
|
75
|
-
the slot). `lib/materialize.mjs` then copies every module whole into the home.
|
|
76
|
-
The normative contract is
|
|
77
|
-
[docs/design/2026-09-23-workspace-module-contracts.md](design/2026-09-23-workspace-module-contracts.md).
|
|
78
|
-
|
|
79
|
-
**Classic 0.24 (removed in 0.26.0).** The `oats-config.yaml` chain and its
|
|
80
|
-
resolvers are gone. A legacy `oats-config.yaml` between the invocation
|
|
81
|
-
directory and the deployment is refused with `E_CONFIG_BROKEN`
|
|
82
|
-
(`reason: "legacy-config"`), and the message names the files that replace it.
|
|
83
|
-
|
|
84
|
-
## Spawn composition
|
|
85
|
-
|
|
86
|
-
`spawnInstance` resolves against the soul's repository and soul name. It:
|
|
87
|
-
|
|
88
|
-
0. resolves and validates WHERE the home will be created, before any side
|
|
89
|
-
effect: the destination must be the agent directory's own `instances/`
|
|
90
|
-
child, that agent directory must lie inside this deployment, and a linked
|
|
91
|
-
worktree maps to the primary checkout — otherwise `E_NO_CANONICAL_ROOT` and
|
|
92
|
-
nothing is created. The check is repeated on the created directory before
|
|
93
|
-
anything is written into it. See
|
|
94
|
-
[souls-and-instances.md](souls-and-instances.md#deployment-prerequisite-the-agents-directory-must-be-operator-owned)
|
|
95
|
-
for the deployment prerequisite this rests on;
|
|
96
|
-
1. calls `composeInstanceAgentsMd` without writing the soul;
|
|
97
|
-
2. writes generated `AGENTS.md` and canonical compatibility symlinks;
|
|
98
|
-
3. copies kernel + soul + active package skill trees into real directories in
|
|
99
|
-
one instance-local root, failing duplicate names unless `skill-overrides`
|
|
100
|
-
chooses a source;
|
|
101
|
-
4. creates the selected work topology;
|
|
102
|
-
5. runs active hooks in deterministic order; and
|
|
103
|
-
6. records capabilities, settings, trust, skill names/sources, instruction
|
|
104
|
-
files, hooks, capability metadata, and forward-only spawn lineage in
|
|
105
|
-
`instance.json`.
|
|
106
|
-
|
|
107
|
-
Pi launches with `--no-skills --skill <instance-home>/.agents/skills
|
|
108
|
-
--no-context-files --no-prompt-templates --append-system-prompt
|
|
109
|
-
<instance-home>/AGENTS.md`. The OATS-managed skill set is exactly the composed
|
|
110
|
-
one: no user, project, ancestor or package skill catalogs. It is not a claim
|
|
111
|
-
that nothing else can reach the session — extensions stay ambient (below), and
|
|
112
|
-
what they contribute stays with them.
|
|
113
|
-
|
|
114
|
-
After the canonical soul and kernel text, every generated `AGENTS.md` states the
|
|
115
|
-
runtime-neutral **home/work boundary** (`injects/instance-boundary.md`) — for
|
|
116
|
-
every work mode and for service souls (the post-commit reviewer) alike — immediately before the
|
|
117
|
-
work-mode block it frames: `<instance-home>` (`$OATS_INSTANCE_HOME`) holds the
|
|
118
|
-
brain, task, provenance and working state, and is where OATS operational/lifecycle
|
|
119
|
-
commands are run from — together with the commands of whatever capabilities are
|
|
120
|
-
active, `aw` among them when aweb messaging is — since they resolve scope from
|
|
121
|
-
the working directory (`--dir <path>` reaches another deliberately); the home
|
|
122
|
-
carries no soul link (the composed AGENTS.md holds the soul's instructions, and
|
|
123
|
-
hooks receive the recorded soul directory as `OATS_SOUL`); and `<instance-home>/work` is the repository or workspace
|
|
124
|
-
view where repository reading, editing, building, testing, git and commits
|
|
125
|
-
happen. It bounds *repository* work rather than forbidding all output elsewhere —
|
|
126
|
-
episodic state lives in the home, and a service agent's own artifacts (a report
|
|
127
|
-
written to a temp file before mailing it) are its role's business. What each mode
|
|
128
|
-
actually permits is the work-mode block's call, which follows immediately.
|
|
129
|
-
|
|
130
|
-
`--no-context-files` also suppresses the instance's *own* composed `AGENTS.md`,
|
|
131
|
-
so that is delivered explicitly; the work tree's `AGENTS.md` stays readable by
|
|
132
|
-
the file tools — readable, not auto-injected.
|
|
133
|
-
|
|
134
|
-
Pi **extensions stay ambient**: operators run cross-agent extensions (web
|
|
135
|
-
search, output formatting) that every instance should keep, so OATS does not
|
|
136
|
-
pass `--no-extensions`. The accepted residue is narrow but real — an
|
|
137
|
-
extension's `resources_discover` hook can contribute skill paths that survive
|
|
138
|
-
`--no-skills`. Today only the OATS bridge does that, and inside an instance it
|
|
139
|
-
contributes that instance's own `.agents/skills`, leaving the composed set
|
|
140
|
-
unchanged.
|
|
141
|
-
|
|
142
|
-
Runtime packages that active capabilities declare (see
|
|
143
|
-
[capabilities](capabilities.md)) are verified at spawn and recorded in
|
|
144
|
-
`instance.json`; a missing one fails the spawn with the consent command to fix
|
|
145
|
-
it, rather than starting an agent whose instructions promise a capability it
|
|
146
|
-
does not have. OATS does not resolve their extension entry points — pi owns that
|
|
147
|
-
resolution, including globs and conventional directories.
|
|
148
|
-
|
|
149
|
-
Claude discovers the same set natively through the instance's `.claude/skills`
|
|
150
|
-
symlink, and its composed instructions through `CLAUDE.md -> AGENTS.md`.
|
|
151
|
-
|
|
152
|
-
Claude Code's **own configuration stays enabled**: user and project skills,
|
|
153
|
-
plugins, settings and `CLAUDE.md` all resolve into an OATS session as they
|
|
154
|
-
normally would. That is a deliberate product choice — those mechanisms are
|
|
155
|
-
powerful and the operator decides whether to use them; a deployment that wants
|
|
156
|
-
only the OATS-composed surface achieves it by configuring everything OATS-side.
|
|
157
|
-
So OATS passes no `--setting-sources`, no exclusions, and no synthetic plugin.
|
|
158
|
-
|
|
159
|
-
Measured behavior worth knowing when reasoning about an instance: project
|
|
160
|
-
skills resolve from the working directory up to the **repository root**, so an
|
|
161
|
-
instance homed inside a repository with its own `.claude/skills` sees those
|
|
162
|
-
too. Project *settings* — hooks, plugins, permissions, custom agents — resolve
|
|
163
|
-
from the instance home rather than from ancestors.
|
|
164
|
-
|
|
165
|
-
Codex is available with `--harness codex`. It starts in the instance home,
|
|
166
|
-
reads `AGENTS.md` and `.agents/skills` natively, and receives `TASK.md` as its
|
|
167
|
-
initial prompt. User configuration, approval policy, ancestor instructions and
|
|
168
|
-
ambient skill sources remain native. Worktrees are already below the instance
|
|
169
|
-
home; checkout/attached paths outside it use Codex's normal approval handling
|
|
170
|
-
and may require approval for writes, depending on the operator's policy.
|
|
171
|
-
OATS does not pass `--add-dir`, which Codex refuses under some native policies.
|
|
172
|
-
OpenAI-prefixed model preferences are translated to
|
|
173
|
-
Codex ids; other provider preferences fall back to its configured default.
|
|
174
|
-
The Desktop model field accepts a native id without using Pi's model catalog.
|
|
175
|
-
This launch support does not supply an aweb channel for Codex: agents can use
|
|
176
|
-
`aw` from their home, with automatic wake delivery tracked separately.
|
|
177
|
-
|
|
178
|
-
All harnesses record what they actually expose in `instance.json` under
|
|
179
|
-
`composition.materialized.harnessPosture`: the OATS-composed set, what is
|
|
180
|
-
curtailed, and what remains ambient. The deviation from strict composition is
|
|
181
|
-
auditable rather than implied.
|
|
182
|
-
|
|
183
|
-
## Instructions
|
|
184
|
-
|
|
185
|
-
The generated order is:
|
|
186
|
-
|
|
187
|
-
1. canonical soul content;
|
|
188
|
-
2. kernel OATS block;
|
|
189
|
-
3. **home/work boundary block** — runtime-neutral, every mode and every kind;
|
|
190
|
-
4. actual spawn work-mode block;
|
|
191
|
-
5. active capability blocks in resolver order; and
|
|
192
|
-
6. unconditional config blocks outermost to innermost.
|
|
193
|
-
|
|
194
|
-
Every generated block carries its source path. `oats doctor --soul <name>` uses
|
|
195
|
-
the same composer and prints/returns the final text. Config-dependent prose is
|
|
196
|
-
never reconciled into committed souls.
|
|
197
|
-
|
|
198
|
-
## Acquisition and trust
|
|
199
|
-
|
|
200
|
-
**Workspace model (0.25, current).** Nothing is installed. `oats sync`
|
|
201
|
-
(`lib/packages.mjs#resolvePackages`) resolves every `packages:` entry of
|
|
202
|
-
`oats-workspace.yaml` to a commit, computes the package tree's integrity and
|
|
203
|
-
writes `oats-lock.json` **lockfileVersion 3** (`packages.<id>: { source, url,
|
|
204
|
-
path, version, commit, integrity, capabilities[] }`). A package is trusted by
|
|
205
|
-
its declaration in `packages:` (human decision, 2026-09-24); member-tier
|
|
206
|
-
capabilities are trusted by membership (decision 2). The lock is
|
|
207
|
-
reproducibility: a moved tag or drifted content is `E_PACKAGE_INTEGRITY`, at
|
|
208
|
-
spawn the lock's capability list must match what the package declares at the
|
|
209
|
-
locked commit, and a spawn uses only packages the workspace still declares. The
|
|
210
|
-
verbs `oats install|trust|list|restore|use|migrate` are removed
|
|
211
|
-
(`E_UNKNOWN_COMMAND` naming the replacement).
|
|
212
|
-
|
|
213
|
-
**Classic 0.24 (removed in 0.26).** The installed tier
|
|
214
|
-
(`.agents/capabilities/installed/`, the `lockfileVersion: 2` lock, per-artifact
|
|
215
|
-
approval) and its last writer went with the captured path; the
|
|
216
|
-
[0.24 release notes](release-notes/v0.24.0.md) describe what it was.
|
|
217
|
-
|
|
218
|
-
## Hooks and scaffold ownership
|
|
219
|
-
|
|
220
|
-
Only `soul-scaffold`, `spawn`, and `retire` manifest hooks are accepted. The
|
|
221
|
-
kernel no longer runs `soul-scaffold`: it ran when `oats create` wrote a soul,
|
|
222
|
-
and souls are now authored in member repositories.
|
|
223
|
-
Spawn uses outer-scope then capability-ID order; retire reverses it.
|
|
224
|
-
Each hook receives package identity/layer plus structured OATS environment and
|
|
225
|
-
may emit a final JSON object containing `meta`, `brief`, `warning`, or `launch`.
|
|
226
|
-
Only a spawn hook may add `env`; other lifecycle events reject it rather than
|
|
227
|
-
silently discard it. Launch environment is string-only,
|
|
228
|
-
size/control-character checked, owned by an unambiguous dotted capability
|
|
229
|
-
vendor, and restricted to the manifest's exact trust-visible `environment`
|
|
230
|
-
declaration. Capabilities that request this authority must use the stricter
|
|
231
|
-
dotted ID form even though capabilities without environment authority retain
|
|
232
|
-
the wider namespaced-ID compatibility contract. Explicit and automatic trust
|
|
233
|
-
disclose the declaration before persisting authority. Known process-bootstrap
|
|
234
|
-
names are denied in depth, not treated as an
|
|
235
|
-
exhaustive authority list. Aggregation is deterministic, shell-quoted, and
|
|
236
|
-
collision-fatal. It prefixes only the initial runtime command;
|
|
237
|
-
values are persisted with that command, so the contract is for non-secret
|
|
238
|
-
locators and broker endpoints, never bearer credentials or durable principal
|
|
239
|
-
root keys. No restart/replay contract exists. A fatal environment contract error enters
|
|
240
|
-
the required-spawn rollback transaction. It runs compensation in reverse,
|
|
241
|
-
removes and verifies rollback-owned Git topology, and removes the home only
|
|
242
|
-
when cleanup completed. Failed compensation or reported state with no retire
|
|
243
|
-
hook uses the same retryable quarantine as every other incomplete spawn.
|
|
244
|
-
|
|
245
|
-
## Commands
|
|
246
|
-
|
|
247
|
-
Kernel/package-management commands are always available. Operational
|
|
248
|
-
namespaces are discovered from manifest `command`, but dispatch verifies that
|
|
249
|
-
`instance.json` or current soul resolution contains the package and that its
|
|
250
|
-
locked executable surface is trusted.
|
|
251
|
-
|
|
252
|
-
## Verification
|
|
253
|
-
|
|
254
|
-
```bash
|
|
255
|
-
npm test
|
|
256
|
-
npm run check
|
|
257
|
-
npm run check:pi
|
|
258
|
-
npm run validate
|
|
259
|
-
npm run validate:okf
|
|
260
|
-
npm run pack:check
|
|
261
|
-
npm run smoke:tarball
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
Pull-request CI runs this matrix on supported Node 22. `validate` compiles both
|
|
265
|
-
public JSON schemas, validates clean-contract manifests, parses documented
|
|
266
|
-
OATS config examples with the production parser, and checks maintainable public
|
|
267
|
-
local links/anchors. `pack:check` dry-runs both npm packages and rejects missing
|
|
268
|
-
runtime surfaces or leaked workspace/test state.
|
|
269
|
-
|
|
270
|
-
The clean-room smoke test packs both packages, installs their tarballs outside
|
|
271
|
-
the checkout, verifies the adapter resolves that installed kernel, runs
|
|
272
|
-
`init`/`doctor`, and creates/retires a clean-contract scaffold while checking
|
|
273
|
-
exact skills, generated instructions, canonical soul immutability, and
|
|
274
|
-
metadata.
|
|
275
|
-
|
|
276
|
-
One manual probe is required after every release and before 0.19.0 ships: from
|
|
277
|
-
the **published** kernel (not a checkout), install `oats.authoring` into a fresh
|
|
278
|
-
scope, activate it for a framework-author soul, and spawn that soul. The spawn
|
|
279
|
-
must succeed with `integration-authoring`, `skill-craft`, and `soul-craft`
|
|
280
|
-
materialized in the instance's `.agents/skills/`. Framework-hoisted resources
|
|
281
|
-
are resolved by path arithmetic against the installed kernel's own layout, so a
|
|
282
|
-
source-tree run can pass while every installed deployment fails.
|
|
283
|
-
|
|
284
|
-
These deterministic checks deliberately do **not** contact real aweb, Jira, or
|
|
285
|
-
Linear services, validate remote git hosting/auth flows, or publish npm
|
|
286
|
-
artifacts. Adapter/discovery changes additionally require a disposable real pi
|
|
287
|
-
session from the packed artifacts; external services remain credentialed,
|
|
288
|
-
out-of-scope probes. Release CI publishes both
|
|
289
|
-
packages from one tag; keep versions synchronized because exact pi isolation
|
|
290
|
-
depends on both kernel launch and adapter discovery behavior.
|
|
291
|
-
|
|
292
|
-
Runtime-neutral token/cost/model/tool telemetry for Control Pane remains a
|
|
293
|
-
follow-up; it requires an adapter-neutral event contract rather than pi-specific
|
|
294
|
-
inspection in the universal CLI.
|
|
29
|
+
| `bin/oats.mjs` | the CLI: argument parsing, JSON envelopes, the verbs |
|
|
30
|
+
| `lib/` | the kernel (below) |
|
|
31
|
+
| `injects/` | the kernel and work-mode instruction blocks composed into every instance |
|
|
32
|
+
| `skills/` | bootstrap skills shipped with the kernel |
|
|
33
|
+
| `capabilities/` | generated mirrors of released package capabilities (for example `oats-okf*`), checked by `scripts/check-okf-mirror.mjs` |
|
|
34
|
+
| `oats-package/` | the `oats.framework` package |
|
|
35
|
+
| `souls/` | this repository's own souls (a workspace member) |
|
|
36
|
+
| `docs/` | the reference pages, schemas, design records and release notes |
|
|
37
|
+
| `packages/` | the pi adapter, the Desktop, the turn-record package and experiments |
|
|
38
|
+
| `scripts/` | the test runner, validators, packaging checks and the release lane |
|
|
39
|
+
| `test/` | the kernel and CLI suites, with their fixtures |
|
|
40
|
+
|
|
41
|
+
## Kernel modules
|
|
42
|
+
|
|
43
|
+
| module | owns |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `remote.mjs` | repo refs, reading Git remotes, content digests |
|
|
46
|
+
| `workspace.mjs` | workspace, membership and soul files; discovery |
|
|
47
|
+
| `resolve.mjs` | a soul's resolution: capabilities, slots, provenance |
|
|
48
|
+
| `packages.mjs` | `packages:`, the catalog, `oats sync`, `oats-lock.json` |
|
|
49
|
+
| `materialize.mjs` | copying modules into a home and composing it |
|
|
50
|
+
| `core.mjs` | spawn, retire, sessions, hooks, launch recipes, instance metadata |
|
|
51
|
+
| `instruction-composition.mjs` | the generated `AGENTS.md` |
|
|
52
|
+
| `teams.mjs`, `teams-verbs.mjs` | the team model and the `oats teams` verbs |
|
|
53
|
+
| `schedule.mjs`, `schedule-host.mjs`, `triggers.mjs`, `automations.mjs` | schedules, triggers and the host timer |
|
|
54
|
+
| `operator-dispatch.mjs` | capability commands run from a deployment, and its module store |
|
|
55
|
+
| `instance-*.mjs` | inspection, lifecycle, events and Git views of an instance |
|
|
56
|
+
| `herdr.mjs`, `tmux-config.mjs`, `session-*.mjs` | session backends and terminal input |
|
|
57
|
+
| `capability-contract.mjs`, `provider-binding.mjs` | manifest validation, the hook environment rules, the readiness wire |
|
|
58
|
+
| `servers.mjs` | routing commands to a registered server |
|
|
59
|
+
|
|
60
|
+
The kernel is runtime-neutral: nothing in `lib/` depends on a harness or on
|
|
61
|
+
a provider. Provider behaviour lives in capabilities; the kernel supplies
|
|
62
|
+
their contracts ([layers](layers.md)).
|
|
63
|
+
|
|
64
|
+
## Tests and gates
|
|
65
|
+
|
|
66
|
+
| command | what it checks |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `npm test` | every suite under `test/` (`node --test`), through `scripts/run-tests.mjs` |
|
|
69
|
+
| `npm run check` | syntax of every shipped file |
|
|
70
|
+
| `npm run check:pi` | the pi adapter's TypeScript |
|
|
71
|
+
| `npm run validate` | the JSON schemas, the example manifests and configs, and every local link and anchor in the public docs |
|
|
72
|
+
| `npm run pack:check` | an `npm pack` dry run of both packages: nothing missing, nothing leaked |
|
|
73
|
+
| `npm run smoke:tarball` | installs the packed tarballs outside the checkout and exercises them |
|
|
74
|
+
|
|
75
|
+
Locally, run the suites your change affects, plus `validate` and `check`; run
|
|
76
|
+
`smoke:tarball` when you change the smoke script or packaging. Pull-request CI
|
|
77
|
+
runs the full suite (sharded), `check`, `validate`, `pack:check` and the smoke
|
|
78
|
+
test, and is the gate. Tests use local bare repositories and fakes; none
|
|
79
|
+
contacts GitHub, aweb, Jira or Linear.
|
|
80
|
+
|
|
81
|
+
Tests pin behaviour, so a change that alters behaviour changes its test in the
|
|
82
|
+
same commit. Never weaken an assertion to make a change pass.
|