@awebai/oats 0.22.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -47
- package/bin/oats.mjs +11 -6
- package/capabilities/oats-authoring/LICENSE +21 -0
- package/capabilities/oats-authoring/oats-package.json +11 -0
- package/capabilities/oats-authoring/oats.json +4 -4
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +63 -0
- package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +109 -0
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +109 -0
- package/capabilities/oats-aweb/oats.json +6 -6
- package/capabilities/oats-aweb/skills/LICENSE +21 -0
- package/capabilities/oats-aweb/skills/VENDORED.md +26 -0
- package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +201 -0
- package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +161 -0
- package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +61 -0
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +328 -0
- package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +74 -0
- package/capabilities/oats-jira/oats.json +1 -1
- package/capabilities/oats-linear/oats.json +1 -1
- package/capabilities/oats-okf/agents/memory-harvest/soul.yaml +6 -0
- package/capabilities/oats-okf/bin/oats-okf.mjs +82 -51
- package/capabilities/oats-okf/oats.json +4 -1
- package/capabilities/oats-review/oats.json +1 -1
- package/docs/2026-09-03-architecture-proposal.md +642 -0
- package/docs/first-team-demo.md +87 -0
- package/docs/first-team.md +179 -0
- package/docs/integrations.md +83 -65
- package/docs/layers.md +356 -80
- package/docs/migration-from-oas.md +80 -116
- package/docs/release-notes/v0.22.1.md +106 -0
- package/lib/core.mjs +255 -363
- package/package.json +1 -1
- package/packages/record/README.md +76 -16
- package/packages/record/docs/turn-record-sot.md +1 -1
- package/packages/record/lib/store.mjs +207 -43
- package/capabilities/oats-aweb/package.json +0 -20
- package/capabilities/oats-jira/package.json +0 -25
- package/capabilities/oats-linear/README.md +0 -234
- package/capabilities/oats-linear/package.json +0 -29
- package/capabilities/oats-linear/test/oats-linear.test.mjs +0 -168
- package/capabilities/oats-okf/package.json +0 -22
- /package/capabilities/oats-okf/agents/{memory-harvest.md → memory-harvest/AGENTS.md} +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# First-team example: OATS working on OATS
|
|
2
|
+
|
|
3
|
+
On 2026-09-05 we installed the published OATS artifacts and used Pi and
|
|
4
|
+
Claude Code workers to fix issues found during a fresh review. The first
|
|
5
|
+
team's work was release preparation in this repository.
|
|
6
|
+
|
|
7
|
+
## The setup
|
|
8
|
+
|
|
9
|
+
| Component | Qualified value |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Kernel and Pi adapter | 0.22.0, installed from npm |
|
|
12
|
+
| Workspace config | `oats.dev` 1.0.0 default, adopted at the common workspace root |
|
|
13
|
+
| Knowledge | `oats.okf` 1.4.1 |
|
|
14
|
+
| Messaging | `oats.aweb` 1.8.0, bound to our existing team |
|
|
15
|
+
| Authoring | `oats.authoring` 1.0.0 |
|
|
16
|
+
| Worker scope | The child OATS Git repository, selected explicitly |
|
|
17
|
+
| Harvester runtime/model | Pi, `openai-codex/gpt-5.5`, configured for this machine |
|
|
18
|
+
|
|
19
|
+
Package acquisition used the published kernel's catalog and exact locks.
|
|
20
|
+
The executable OKF and aweb capabilities were explicitly trusted.
|
|
21
|
+
`oats doctor` passed. A separate published-authoring probe confirmed that
|
|
22
|
+
`integration-authoring`, `skill-craft`, and `soul-craft` materialized for an
|
|
23
|
+
authoring soul.
|
|
24
|
+
|
|
25
|
+
## Two useful tasks
|
|
26
|
+
|
|
27
|
+
The **Pi documentation worker**, `docs-expert-readme-claims`, corrected a
|
|
28
|
+
claim that all captured conversations were signed. Native transcript turns
|
|
29
|
+
have content hashes; signed aweb messages preserve their original
|
|
30
|
+
signatures. Its code-review handoff led to the
|
|
31
|
+
[documentation correction](https://github.com/awebai/oats/commit/ef4a1a6599da88e213b2a6a8f3918099aa5ba984).
|
|
32
|
+
|
|
33
|
+
The **Claude Code worker**, `cli-dev-lock-fix`, fixed a stream-lock race.
|
|
34
|
+
A late contender could classify a live holder's lock as stale and enter the
|
|
35
|
+
same critical section. The fix uses holder liveness and an ownership token;
|
|
36
|
+
review also caught an acquisition loop that could retry filesystem errors
|
|
37
|
+
forever. See the [initial fix](https://github.com/awebai/oats/commit/1036381)
|
|
38
|
+
and [review correction](https://github.com/awebai/oats/commit/81735f6e936d1b6aa0a3ad62d12953d494851cc8).
|
|
39
|
+
|
|
40
|
+
Both workers used isolated worktrees, committed changes, and reported
|
|
41
|
+
through aw. Review happened before integration. Claude needed its initial
|
|
42
|
+
folder-trust and development-channels confirmations; Pi started directly.
|
|
43
|
+
|
|
44
|
+
## What carried forward
|
|
45
|
+
|
|
46
|
+
Each worker invoked OKF harvest. Its temporary harvester promoted a lesson
|
|
47
|
+
into the source soul and committed it on the worker's branch:
|
|
48
|
+
|
|
49
|
+
- [Content-addressed turn IDs do not authenticate native capture](https://github.com/awebai/oats/commit/91993a0b85db132c59c32d43ee2c90ec5569bd50).
|
|
50
|
+
- [Lock ownership and the limits of comparing timeout thresholds](https://github.com/awebai/oats/commit/120e3474b93efc0d37f94c426327f802e27893ea).
|
|
51
|
+
|
|
52
|
+
After the documentation promotion landed, the predecessor retired locally:
|
|
53
|
+
its worktree, branch, and home were removed. Its aweb alias remained on the
|
|
54
|
+
server despite the hook reporting success. A new Pi instance of the same
|
|
55
|
+
soul with a different name, `docs-expert-capture-contract-check`, started a real
|
|
56
|
+
follow-up task checking the capture contract documentation.
|
|
57
|
+
|
|
58
|
+
Its first report named the promoted file:
|
|
59
|
+
`soul/knowledge/lessons/content-addressed-turn-ids-not-authentication.md`.
|
|
60
|
+
The worker said the lesson reinforced the distinction between unsigned
|
|
61
|
+
native turns and preserved source signatures, and explicitly said it did
|
|
62
|
+
not change what it was already about to do.
|
|
63
|
+
|
|
64
|
+
That verifies useful work, reviewed promotion, local retirement, and a
|
|
65
|
+
successor reading the updated soul. Remote identity retirement remains
|
|
66
|
+
incomplete. The example does not establish a measured productivity
|
|
67
|
+
improvement.
|
|
68
|
+
|
|
69
|
+
## What the run exposed
|
|
70
|
+
|
|
71
|
+
The run found first-use problems that unit tests alone had not resolved:
|
|
72
|
+
|
|
73
|
+
- A fresh scope needed `mkdir -p agents` before `oats create`; the fix is in
|
|
74
|
+
the 0.22.1 changes.
|
|
75
|
+
- The default harvester model assumed a provider absent on this machine.
|
|
76
|
+
The workspace now selects an authenticated model explicitly.
|
|
77
|
+
- All four initial worker and harvester retirements reported successful
|
|
78
|
+
identity deletion but left their aweb aliases on the server. Local
|
|
79
|
+
cleanup completed; remote cleanup requires a team administrator, and
|
|
80
|
+
names cannot be reused until it succeeds. Temporary harvesters are now
|
|
81
|
+
excluded from messaging to avoid adding aliases while this is fixed.
|
|
82
|
+
- A combined workspace roster did not make the workspace a spawn scope for
|
|
83
|
+
every child repository. Commands select the owning repository explicitly.
|
|
84
|
+
|
|
85
|
+
The [first-team guide](first-team.md) includes these setup details. The
|
|
86
|
+
package owners are responsible for improving their defaults; the kernel
|
|
87
|
+
continues to resolve capabilities through the same replaceable contracts.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Run your first OATS team
|
|
2
|
+
|
|
3
|
+
Start with one repository and one small, real task. An OATS soul keeps the
|
|
4
|
+
role and knowledge; an instance gets a working session and a Git worktree.
|
|
5
|
+
Review its work, let it promote useful notes, then retire the instance.
|
|
6
|
+
|
|
7
|
+
This guide follows the published **0.22.0** path exercised on 2026-09-05
|
|
8
|
+
with `oats.dev` 1.0.0, `oats.okf` 1.4.1, `oats.aweb` 1.8.0, and
|
|
9
|
+
`oats.authoring` 1.0.0. The [qualification example](first-team-demo.md)
|
|
10
|
+
records the actual tasks and outcomes. Existing OAS users should follow
|
|
11
|
+
[the migration guide](migration-from-oas.md) first.
|
|
12
|
+
|
|
13
|
+
## Install and choose a scope
|
|
14
|
+
|
|
15
|
+
Have Node.js 22+, Git, tmux, and an authenticated agent runtime available.
|
|
16
|
+
Launch Pi or Claude Code once yourself to confirm that your chosen model
|
|
17
|
+
works. The current OKF package runs its harvester in **Pi**, including when
|
|
18
|
+
its working agent uses Claude Code, so this configuration needs Pi too.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g @awebai/oats@latest
|
|
22
|
+
pi install npm:@awebai/oats-pi@latest
|
|
23
|
+
node --version
|
|
24
|
+
tmux -V
|
|
25
|
+
oats version
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Install matching kernel and adapter versions from the same release.
|
|
29
|
+
|
|
30
|
+
Use a repository with an initial Git commit. Keep your normal working
|
|
31
|
+
changes committed or otherwise accounted for before giving an agent work.
|
|
32
|
+
The commands below run from that repository:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
cd /path/to/project
|
|
36
|
+
oats init --package oats.dev --config default
|
|
37
|
+
oats list
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Initialization acquires the package closure and writes an editable
|
|
41
|
+
`oats-config.yaml` plus an exact lock. It does not create a team account or
|
|
42
|
+
approve executable hooks. `oats.dev` is our reference development policy;
|
|
43
|
+
edit its team name and provider choices for your own project.
|
|
44
|
+
|
|
45
|
+
For several repositories, initialize their common workspace directory
|
|
46
|
+
instead. Run create/spawn/retire with `--dir /path/to/workspace/project` for
|
|
47
|
+
the repository that owns the soul. `oats status --team` at the workspace
|
|
48
|
+
shows the combined roster, but that does not select a repository for spawn.
|
|
49
|
+
|
|
50
|
+
## Set the model and connect messaging
|
|
51
|
+
|
|
52
|
+
Edit the existing entries in `oats-config.yaml`; do not append a second
|
|
53
|
+
`capabilities` block. Set `team.name` to your own team. If you already use
|
|
54
|
+
aw, set `team.id` to its exact existing ID so instances join that team.
|
|
55
|
+
|
|
56
|
+
Under `capabilities.layers`, configure the model your Pi installation can
|
|
57
|
+
actually use. This example was used in our qualification; replace the
|
|
58
|
+
model if you authenticate through another provider:
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
knowledge:
|
|
62
|
+
capability: oats.okf
|
|
63
|
+
from: installed
|
|
64
|
+
settings:
|
|
65
|
+
harvest-model: openai-codex/gpt-5.5
|
|
66
|
+
messaging:
|
|
67
|
+
capability: oats.aweb
|
|
68
|
+
from: installed
|
|
69
|
+
global: true
|
|
70
|
+
souls:
|
|
71
|
+
memory-harvest: false
|
|
72
|
+
tasks: none
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The `oats.okf` 1.4.1 default harvester model is
|
|
76
|
+
`github-copilot/gpt-5.5`; it will not work without that provider. The
|
|
77
|
+
messaging exclusion above keeps temporary harvesters from creating aliases
|
|
78
|
+
while an identity-retirement issue is being corrected. Workers still get
|
|
79
|
+
messaging identities. With a `souls` exclusion, state `global: true`
|
|
80
|
+
explicitly so scope-level commands such as `oats aweb setup` stay active.
|
|
81
|
+
|
|
82
|
+
Review and approve the executable capabilities, then check onboarding:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
oats trust oats.okf
|
|
86
|
+
oats trust oats.aweb
|
|
87
|
+
oats aweb setup
|
|
88
|
+
oats doctor
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`oats aweb setup` prints the next step: install the `aw` CLI if needed,
|
|
92
|
+
initialize an identity with `aw init`, then create or join your team. Follow
|
|
93
|
+
that output and rerun setup until it confirms membership. For an existing
|
|
94
|
+
team, join it rather than creating another with the same name. Setup's exit
|
|
95
|
+
status alone does not establish that onboarding finished.
|
|
96
|
+
|
|
97
|
+
Messaging is optional. To work without it, set `messaging: none`, omit the
|
|
98
|
+
aweb trust/setup commands, and keep the knowledge configuration above.
|
|
99
|
+
Packages, souls, Git worktrees, and local knowledge do not require hosted
|
|
100
|
+
messaging. See [configuration](configuration.md) for other providers.
|
|
101
|
+
|
|
102
|
+
## Give an instance a real task
|
|
103
|
+
|
|
104
|
+
On 0.22.0, create the roster directory first; a fresh-scope creation fix is
|
|
105
|
+
included in 0.22.1.
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
mkdir -p agents
|
|
109
|
+
oats create backend-expert --type developers --repo . --work worktree --runtime pi
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Edit `agents/backend-expert/soul/AGENTS.md` to describe the role, repository
|
|
113
|
+
conventions, and the checks that matter. Review and commit the new soul,
|
|
114
|
+
configuration, lock, generated ignore rules, and adopted template base under
|
|
115
|
+
`.agents/config-templates/adopted/`. A worktree starts from a Git commit;
|
|
116
|
+
uncommitted soul changes are not present on the worker's branch. Keep aw
|
|
117
|
+
credentials out of Git.
|
|
118
|
+
|
|
119
|
+
Then launch one bounded task:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
oats spawn backend-expert --purpose first-fix --task "Fix one small issue, run the relevant checks, commit the change, and report what changed. Capture any reusable lesson and harvest it before finishing."
|
|
123
|
+
oats status --team
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Choose `--runtime claude` at creation for a Claude Code worker. Today its
|
|
127
|
+
first session can require **two interactive confirmations**: folder trust
|
|
128
|
+
and the development-channels confirmation used by the aweb integration.
|
|
129
|
+
Attach to the tmux session printed by spawn and answer them. A created
|
|
130
|
+
window is not evidence that the agent has started working.
|
|
131
|
+
|
|
132
|
+
Each instance has a home under `agents/<soul>/instances/<instance>/`; its
|
|
133
|
+
`work/` directory is the repository worktree. Read the instance's report
|
|
134
|
+
and review its commits there. Agents using aw run coordination commands
|
|
135
|
+
from their own home, which holds their identity.
|
|
136
|
+
|
|
137
|
+
## Harvest, review, and retire
|
|
138
|
+
|
|
139
|
+
With OKF active, the worker keeps state and notes in its home. After a
|
|
140
|
+
commit it can run `oats okf harvest` there. If it reports pending notes but
|
|
141
|
+
has not harvested, ask it to do so, or run the command from that instance's
|
|
142
|
+
home yourself. Retirement does not initiate knowledge promotion.
|
|
143
|
+
|
|
144
|
+
The harvester reviews notes, updates the soul's knowledge, and commits the
|
|
145
|
+
promotion into the worker's branch. Let it finish before final review or
|
|
146
|
+
retirement. Review **all** commits, including the promotion, and merge the
|
|
147
|
+
accepted work into the repository's main branch through your normal
|
|
148
|
+
workflow. Then, from the repository scope:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
oats retire backend-expert-first-fix
|
|
152
|
+
oats status --team
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Read the retirement result, including any retained home or recovery path.
|
|
156
|
+
With aweb enabled, also inspect `oats aweb roster`: local retirement alone
|
|
157
|
+
is not proof that a remote alias was removed. During the current hosted
|
|
158
|
+
alias-retirement issue, use a fresh purpose for the next instance and have
|
|
159
|
+
the team administrator clear any stale alias before reusing its name.
|
|
160
|
+
|
|
161
|
+
Start the same soul on the next useful task after its knowledge commit is
|
|
162
|
+
on main. Check that the new instance can find and use the promoted lesson.
|
|
163
|
+
That completes the first lifecycle: useful work, reviewed learning, clean
|
|
164
|
+
local retirement, and a successor with the updated soul.
|
|
165
|
+
|
|
166
|
+
## Optional conversation record
|
|
167
|
+
|
|
168
|
+
Knowledge promotion and conversation capture are separate. To enable the
|
|
169
|
+
local transcript record and query it:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
oats setup
|
|
173
|
+
oats capture --status
|
|
174
|
+
oats recall "a phrase from your completed task"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Capture reads supported transcripts and aweb logs after setup, subject to
|
|
178
|
+
ignore rules. Native turns are content-addressed; signed aweb messages
|
|
179
|
+
retain their source signatures. See [the turn record](../README.md#the-turn-record).
|
package/docs/integrations.md
CHANGED
|
@@ -1,39 +1,42 @@
|
|
|
1
|
-
# Integrations
|
|
1
|
+
# Integrations: binding an implementation to a contract
|
|
2
2
|
|
|
3
|
-
An **integration is a capability package selected to
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
An **integration** is a capability package selected to fill one exclusive
|
|
4
|
+
slot: `knowledge`, `messaging` (the communication contract), or `tasks`.
|
|
5
|
+
The contracts themselves are in [the OATS contracts](layers.md); this
|
|
6
|
+
document is about choosing an implementation, and about building one.
|
|
7
7
|
|
|
8
|
-
Read [
|
|
8
|
+
Read [capability packages](capabilities.md) first for manifests, acquisition,
|
|
9
9
|
targeting, instance-local composition, locks, trust, hooks, and commands.
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## The slots
|
|
12
12
|
|
|
13
|
-
For each soul, OATS resolves zero or one implementation
|
|
14
|
-
layer:
|
|
13
|
+
For each soul, OATS resolves zero or one implementation per slot:
|
|
15
14
|
|
|
16
|
-
|
|
|
17
|
-
|
|
18
|
-
| knowledge |
|
|
19
|
-
| messaging |
|
|
20
|
-
| tasks |
|
|
15
|
+
| Slot | Contract | Bundled implementations |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `knowledge` | [knowledge](layers.md#the-knowledge-contract) | `oats.okf` |
|
|
18
|
+
| `messaging` | [communication](layers.md#the-communication-contract) | `oats.aweb` |
|
|
19
|
+
| `tasks` | [tasks](layers.md#the-tasks-contract) | `oats.jira`, `oats.linear` |
|
|
21
20
|
|
|
22
|
-
A capability manifest becomes an integration by declaring one `layer`. It
|
|
23
|
-
not declare several
|
|
24
|
-
configuration error;
|
|
21
|
+
A capability manifest becomes an integration by declaring one `layer`. It
|
|
22
|
+
may not declare several. Two active packages for one slot and one soul are a
|
|
23
|
+
configuration error; capabilities without `layer` compose additively.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
Exclusivity is the point. Task state belongs to the selected tasks
|
|
26
|
+
implementation even when a messaging tool also offers task features, and
|
|
27
|
+
conversation belongs to the messaging implementation even when a tracker
|
|
28
|
+
offers comments.
|
|
28
29
|
|
|
29
30
|
## Selecting an integration
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
Configuration activates the package for the intended target; the manifest
|
|
33
|
+
already declares the slot, so `oats use` writes the entry under
|
|
34
|
+
`capabilities.layers.<slot>`:
|
|
32
35
|
|
|
33
36
|
```yaml
|
|
34
37
|
agent-types:
|
|
35
38
|
product-agents:
|
|
36
|
-
description: Planner
|
|
39
|
+
description: Planner, developer, and reviewer souls (they declare `type: product-agents`)
|
|
37
40
|
|
|
38
41
|
capabilities:
|
|
39
42
|
layers:
|
|
@@ -59,65 +62,80 @@ capabilities:
|
|
|
59
62
|
project: Agent Platform
|
|
60
63
|
```
|
|
61
64
|
|
|
62
|
-
Every matching soul gets one knowledge, messaging, and tasks implementation.
|
|
63
|
-
A non-matching soul can resolve a different integration or leave a layer
|
|
64
|
-
unresolved.
|
|
65
|
-
|
|
66
65
|
CLI equivalents:
|
|
67
66
|
|
|
68
67
|
```bash
|
|
69
68
|
oats use oats.okf --global
|
|
70
69
|
oats use oats.aweb --type product-agents
|
|
71
70
|
oats use oats.linear --type product-agents
|
|
71
|
+
oats use none --layer tasks # leave an inherited slot deliberately unfilled
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
Every matching soul gets one implementation per slot. A non-matching soul can
|
|
75
|
+
resolve a different one or leave a slot unfilled. `none` is a layer
|
|
76
|
+
selection, not a policy: a soul with `messaging: none` has no address, which
|
|
77
|
+
is different from a soul whose type restricts its reach.
|
|
78
78
|
|
|
79
79
|
## Bundled integrations
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
commit. Its scaffold/spawn hooks own memory mechanics; the kernel remains
|
|
87
|
-
knowledge-format agnostic.
|
|
88
|
-
|
|
89
|
-
### `oats.aweb`
|
|
90
|
-
|
|
91
|
-
The messaging integration mints an instance identity at spawn, removes it at
|
|
92
|
-
retire, and contributes official aweb messaging/team skills. It requires the
|
|
93
|
-
`aw` CLI. Messaging does not become the task system.
|
|
81
|
+
**`oats.okf`** fills `knowledge`: OKF soul bundles, instance `STATE.md`,
|
|
82
|
+
`log.md`, and `notes/`, the `okf` and `memory-harvest` skills, and
|
|
83
|
+
`oats okf harvest`, which promotes pending notes after a commit through the
|
|
84
|
+
capability-defined `memory-harvest` soul. Its scaffold and spawn hooks own
|
|
85
|
+
memory mechanics; the kernel stays knowledge-format agnostic.
|
|
94
86
|
|
|
95
|
-
|
|
87
|
+
**`oats.aweb`** fills `messaging`: mints an instance identity at spawn,
|
|
88
|
+
removes it at retire, contributes the aweb messaging and team skills, wires
|
|
89
|
+
the channel plugin so sessions are woken by mail, and exposes
|
|
90
|
+
`oats aweb roster` and `oats aweb setup`. Requires the `aw` CLI.
|
|
96
91
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
`project`.
|
|
92
|
+
**`oats.jira`** fills `tasks`: the `jira-tasks` protocol and an advisory
|
|
93
|
+
spawn hook. Requires `acli`; settings commonly include `site` and `project`.
|
|
100
94
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
the `linear-tasks` skill, and an advisory spawn hook. It uses
|
|
105
|
-
`LINEAR_API_KEY`; secrets never belong in OATS config. See
|
|
95
|
+
**`oats.linear`** fills `tasks`: JSON-first `oats linear` commands, the
|
|
96
|
+
`linear-tasks` skill, and an advisory spawn hook. Uses `LINEAR_API_KEY`;
|
|
97
|
+
secrets never belong in OATS config. See
|
|
106
98
|
`capabilities/oats-linear/README.md` for its support boundary.
|
|
107
99
|
|
|
108
100
|
> **Removed: `oats.web`.** The browser web-panel capability was retired in
|
|
109
101
|
> favor of the OATS Desktop app (`packages/desktop/`), which bundles the same
|
|
110
|
-
> zero-dependency loopback server. If an `oats-lock.json` or
|
|
111
|
-
> still names `oats.web`, remove that entry
|
|
112
|
-
>
|
|
113
|
-
|
|
114
|
-
##
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
102
|
+
> zero-dependency loopback server. If an `oats-lock.json` or
|
|
103
|
+
> `oats-config.yaml` still names `oats.web`, remove that entry. Full
|
|
104
|
+
> migration steps: [desktop-succession](desktop-succession.md).
|
|
105
|
+
|
|
106
|
+
## Building an integration
|
|
107
|
+
|
|
108
|
+
Building an integration is implementing a contract. The checklist per slot:
|
|
109
|
+
|
|
110
|
+
**Any slot.** A namespaced capability manifest with exactly one `layer`; an
|
|
111
|
+
`inject` block that tells the instance what this implementation is and which
|
|
112
|
+
skill to load before first use; skills that carry the craft; commands that
|
|
113
|
+
support `--json`; hooks only on the accepted events; `requires` for every
|
|
114
|
+
host command and runtime package; `environment` for every launch variable
|
|
115
|
+
contributed, under the vendor prefix. Package commands and hooks reach the
|
|
116
|
+
kernel only through `OATS_CLI_BIN` and the JSON envelope, never by importing
|
|
117
|
+
kernel files. Never name target souls in the manifest; targeting belongs to
|
|
118
|
+
configuration.
|
|
119
|
+
|
|
120
|
+
**Knowledge.** Scaffold the soul's store on `soul-scaffold`; create instance
|
|
121
|
+
ephemeral state on `spawn`; teach the read side (index-first, selective,
|
|
122
|
+
binding) in the inject and skill; ship a harvester as a capability-defined
|
|
123
|
+
soul and a command that spawns it attached to the source instance's tree;
|
|
124
|
+
route promotions by custody (commit, pull request, or direct edit); apply the
|
|
125
|
+
promotion doctrine in the contract; and, once the `harvest` event exists,
|
|
126
|
+
declare it instead of relying on the instance to call the command.
|
|
127
|
+
|
|
128
|
+
**Communication.** Mint an address on `spawn` with a `required` hook and
|
|
129
|
+
remove it on `retire`; supply the roster; teach send, reply, chat, and "read
|
|
130
|
+
the event first" in the inject and skill; contribute launch arguments so the
|
|
131
|
+
session is woken; enforce the soul type's `reach` on both sides; state
|
|
132
|
+
whether the address outlives the instance; and keep task coordination out.
|
|
133
|
+
|
|
134
|
+
**Tasks.** Teach claim, update, block, hand off, and complete; identify the
|
|
135
|
+
instance to the tracker in a way that survives it; keep conversation out.
|
|
136
|
+
|
|
137
|
+
The framework's `integrations-expert` soul remains the specialist for
|
|
138
|
+
contract design, and the `integration-authoring` skill routes work to it.
|
|
139
|
+
Test an integration as a capability package: acquire, lock, trust, activate,
|
|
140
|
+
spawn, retire, with the golden fixtures as the behavior oracle for the kernel
|
|
141
|
+
side.
|