@awebai/oats 0.22.1 → 0.22.3
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 +10 -3
- package/bin/oats.mjs +302 -19
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +211 -6
- package/capabilities/oats-aweb/injects/aweb.md +10 -3
- package/capabilities/oats-aweb/oats.json +40 -7
- package/capabilities/oats-okf/agents/memory-harvest/AGENTS.md +3 -1
- package/capabilities/oats-okf/bin/oats-okf.mjs +125 -9
- package/capabilities/oats-okf/injects/okf.md +7 -0
- package/capabilities/oats-okf/oats.json +2 -2
- package/capabilities/oats-okf/skills/memory-harvest/SKILL.md +42 -1
- package/docs/capability-manifest.schema.json +41 -0
- package/docs/execution-targets.md +210 -0
- package/docs/implementation.md +14 -1
- package/docs/integrations.md +36 -0
- package/docs/migration-from-oas.md +1 -1
- package/docs/oats-config.schema.json +1 -0
- package/docs/operating-team-migration.md +269 -0
- package/docs/release-notes/v0.22.2.md +69 -0
- package/docs/release-notes/v0.22.3.md +80 -0
- package/docs/servers.md +145 -0
- package/docs/souls-and-instances.md +30 -3
- package/lib/core.mjs +528 -78
- package/lib/herdr.mjs +95 -0
- package/lib/servers.mjs +623 -0
- package/lib/session-input.mjs +78 -0
- package/lib/session-viewer.mjs +51 -0
- package/package-catalog.json +2 -2
- package/package.json +1 -1
- package/packages/record/bin/capture.mjs +59 -3
- package/packages/record/bin/recall.mjs +67 -1
- package/packages/record/lib/sessions-for-home.mjs +130 -0
- package/skills/oats/SKILL.md +6 -2
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Full operating-team migration
|
|
2
|
+
|
|
3
|
+
Planning record, 2026-09-05. Juan asked lead to discuss the migration with
|
|
4
|
+
Merlin and plan for all teams on this machine to be managed by OATS, with
|
|
5
|
+
harvesting fully working. This expands the earlier release/configuration
|
|
6
|
+
rollout. It does not describe an already completed migration.
|
|
7
|
+
|
|
8
|
+
The cjr runbook is owned by Merlin at
|
|
9
|
+
`~/cjr/agents/docs/2026-09-05-oats-migration.md`. This document records the
|
|
10
|
+
shared framework work and the wider rollout.
|
|
11
|
+
|
|
12
|
+
Fresh identities are authorized for specialists and reviewers. Merlin retains
|
|
13
|
+
both `cjr.aweb.ai/merlin` and his existing durable DID. Aweb clarified that
|
|
14
|
+
re-minting the same address changes identity and breaks continuity; the supported
|
|
15
|
+
path is an explicit transfer of his existing authority with one live process.
|
|
16
|
+
Other teams' retained identities follow the same requirement where applicable.
|
|
17
|
+
|
|
18
|
+
An isolated check against installed 0.22.1 confirmed that an explicit
|
|
19
|
+
existing spawn destination is refused without changing its instructions or
|
|
20
|
+
uncommitted notes. Purpose-based naming chooses an unused suffix. The old
|
|
21
|
+
cjr respawn-clobber report therefore is not reproduced by this journey;
|
|
22
|
+
identity adoption and concurrent handover still need their own tests.
|
|
23
|
+
|
|
24
|
+
## Completion means operating teams
|
|
25
|
+
|
|
26
|
+
Every continuing seat must have a supported OATS launch, composition,
|
|
27
|
+
status, handover and retirement path. Its outstanding work, knowledge and
|
|
28
|
+
required skills must survive a change of runtime session; identity/address
|
|
29
|
+
continuity follows the explicit policy for that seat.
|
|
30
|
+
Every remembering role must have a tested learning path; reviewers retain
|
|
31
|
+
their explicit exclusion from accumulated memory. Config discovery alone
|
|
32
|
+
establishes none of this.
|
|
33
|
+
|
|
34
|
+
The installed baseline is OATS 0.22.2, including native Pi/Claude/Codex,
|
|
35
|
+
tmux/Herdr, shared `yolo`, remote CLI launch/terminals and deferred retirement.
|
|
36
|
+
The Mac Desktop app is installed and passed packaged renderer/PTY launch checks.
|
|
37
|
+
Official oats.okf 1.5.0 provides record-fed harvesting. A source candidate for
|
|
38
|
+
0.22.3 adds the retained-authority binding, remote Desktop roster/actions and
|
|
39
|
+
retirement corrections; that candidate is not yet a published release.
|
|
40
|
+
|
|
41
|
+
No standing seat has transferred yet. Cjr's worker pilot has landed reviewed
|
|
42
|
+
code and knowledge; ordinary retirement passed using the next-patch candidate.
|
|
43
|
+
A real harvester's automatic deferred completion, successor knowledge use and
|
|
44
|
+
session-broker delivery remain explicit acceptance checks.
|
|
45
|
+
|
|
46
|
+
## Scope inventory
|
|
47
|
+
|
|
48
|
+
Reconfirm the live inventory with each owner at handover; process presence
|
|
49
|
+
and old directories are evidence to investigate, not the authoritative list
|
|
50
|
+
of continuing seats.
|
|
51
|
+
|
|
52
|
+
| Scope | Starting point | Required disposition |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `~/awebai/oats` | Live Claude coordinator and Codex lead; managed review workers also running | Oats owns coordinator handover; lead owns lead handover; preserve established identities |
|
|
55
|
+
| `~/cjr` | Preparation `5afb3e8b`; developer pilot landed on master `062e2c75`; legacy Merlin and Minerva live | Merlin owns safe handovers; preserve his DID/address; prove automatic harvest completion and successor use |
|
|
56
|
+
| `~/awebai/aweb` | Live Claude coordinator and frontend in legacy homes | Oats owns coordinator handover; lead coordinates frontend with aweb after its current work; preserve identities and cover child repositories |
|
|
57
|
+
| `~/tsm` | Five live seats: Zeus, Prometeo, Argos, Themis on Claude; Hermes on Codex. No OATS config/souls found | Zeus prepared the five-seat handover plan; begin with Themis at a safe boundary, Zeus last; preserve session-local schedules and production authority |
|
|
58
|
+
| `~/prj/beadhub-all` | Live Codex session, despite stale offline roster | Beadhub accepted preparation and is at a safe boundary; retain its global identity, native Codex and separate canonical code roots under `~/awebai/beadhub`; billing remains separately gated |
|
|
59
|
+
| `~/prj/docflow` | Live Claude seat identified itself as local `juan.aweb.ai/alice` on `docflow:juan.aweb.ai` | Owner Juan; finish running mail backfill and register checks before transfer; retain identity, memory and Minerva route; accountant-sync remains deliberately unloaded |
|
|
60
|
+
| `ai.aweb` on `aweb-agents` | Athena last seen 53 days ago; remote legacy home exists in inventory | Aweb and oats own archival inspection; do not resurrect as a continuing seat |
|
|
61
|
+
| `~/awebai/demo-aweb/bob` | Live Pi demo | Aweb owns safe stop and archival disposition; it is not an operating-team migration |
|
|
62
|
+
| `~/.turn-record` | Live Pi capture service under launchd | Retain as infrastructure; qualify record capture separately from standing seats |
|
|
63
|
+
|
|
64
|
+
The live inventory above was checked on 2026-09-05 using harness process
|
|
65
|
+
working directories and exact custom tmux sockets, without interrupting them.
|
|
66
|
+
TSM uses its aweb tmux socket, BeadHub the awebai socket, and Docflow the
|
|
67
|
+
main socket. Lead delivered explicitly attributed coordination messages to
|
|
68
|
+
those identified harnesses and read their replies; no coordination command
|
|
69
|
+
was run as another seat. Old aweb presence timestamps
|
|
70
|
+
are insufficient to decide whether a harness is alive. A migration plan or
|
|
71
|
+
new soul directory does not establish that the corresponding seat moved.
|
|
72
|
+
|
|
73
|
+
Grace's missing old local path and the offline retirement, docs, bertha,
|
|
74
|
+
cowork, federation, membership-review, aazb-reviewer, id-bugs, billing and
|
|
75
|
+
claweb entries are archival investigations, not launch requests. Preserve
|
|
76
|
+
homes until their work and authority have a recorded disposition. Do not
|
|
77
|
+
bulk-delete aliases based on roster age; certificate cleanup belongs to the
|
|
78
|
+
aweb lifecycle fix and its verified recovery procedure.
|
|
79
|
+
|
|
80
|
+
## Shared prerequisites and owners
|
|
81
|
+
|
|
82
|
+
Oats coordinates framework/package work and the machine-wide inventory.
|
|
83
|
+
Lead independently reviews the design and concrete journey evidence. Merlin
|
|
84
|
+
owns cjr's repository changes, task selection and eventual handovers. Other
|
|
85
|
+
teams' owners control their work and handover sequence; oats records those
|
|
86
|
+
owners before scheduling each migration. Oats accepted ownership of
|
|
87
|
+
`aweb-abep` (service self-retirement), followed by `aweb-abfz` (record-fed
|
|
88
|
+
learning). Deferred retirement shipped in 0.22.2; record-fed learning shipped
|
|
89
|
+
in oats.okf 1.5.0. Their presence does not replace the end-to-end acceptance
|
|
90
|
+
checks below. Lead owns
|
|
91
|
+
the full-machine plan and runtime/wake qualification, including the Codex
|
|
92
|
+
support requirement. The aweb coordinator owns identity continuity and route
|
|
93
|
+
semantics, with oats coordinating the rehearsal and package changes.
|
|
94
|
+
|
|
95
|
+
### Recreate or retain identities according to the actual requirement
|
|
96
|
+
|
|
97
|
+
Cjr's default is a new OATS-minted identity and an explicit handover of
|
|
98
|
+
outstanding work, knowledge, contacts and task responsibility. Old identities
|
|
99
|
+
are retired only after that handover is accepted. Pilot identities remain
|
|
100
|
+
uniquely named so no existing address has to be removed for the experiment.
|
|
101
|
+
|
|
102
|
+
Merlin retains his identity; other continuing seats follow their accepted
|
|
103
|
+
policy. Oats implemented explicit source-authority binding in oats.aweb 1.10.0,
|
|
104
|
+
reviewed and pinned for the next kernel patch. A disposable rehearsal verified
|
|
105
|
+
stable identity/address, existing conversations, heartbeat, exclusive holder
|
|
106
|
+
refusal, rollback and authority-preserving retirement. Aweb supplied this
|
|
107
|
+
supported handover:
|
|
108
|
+
|
|
109
|
+
1. Rehearse using a disposable self-custodial global identity and a second-team
|
|
110
|
+
contact, checking DID, address, conversations and write attribution.
|
|
111
|
+
2. Stop the old process. Copy authority only: signing.key, identity.yaml,
|
|
112
|
+
teams.yaml, team certificates, encryption.yaml and encryption keys. Keep
|
|
113
|
+
private files owner-only; exclude workspace.yaml and caches.
|
|
114
|
+
3. In the new home run `aw workspace connect --service <url> --team <team>` to
|
|
115
|
+
rebind the existing identity. Do not mint or join as a new identity.
|
|
116
|
+
4. Verify the same DID/address, host/path binding, heartbeat, message routes and
|
|
117
|
+
task writes. Preserve the old home for rollback until acceptance, then remove
|
|
118
|
+
its old credential copy. Never have two processes using the identity.
|
|
119
|
+
|
|
120
|
+
Do not delete Merlin's global workspace as part of handover: aweb reports that
|
|
121
|
+
this is unsupported and can release claims. Retiring a managed execution with
|
|
122
|
+
retained authority must release the execution without destroying the identity.
|
|
123
|
+
Never put credentials in Git or manufacture instance.json for adoption.
|
|
124
|
+
|
|
125
|
+
### Make harvest finish without an operator
|
|
126
|
+
|
|
127
|
+
The deferred external retirement mechanism shipped in 0.22.2. Completion
|
|
128
|
+
still requires an actual harvester to finish, report and clean up without
|
|
129
|
+
operator retirement, with visible recoverable failure. The detached worker
|
|
130
|
+
stops the runtime before releasing capabilities; status remains read-only.
|
|
131
|
+
|
|
132
|
+
Cjr archived its local harvester override and uses official oats.okf 1.5.0.
|
|
133
|
+
Its authenticated Pi model is `openai-codex/gpt-5.5`. The remote qualification
|
|
134
|
+
host's equivalent provider login fails refresh with `invalid_refresh_token`;
|
|
135
|
+
spawning that harvester is not successful learning. Both failed test sessions
|
|
136
|
+
were retired normally. Do not copy rotating login tokens from another host.
|
|
137
|
+
An explicit `harvest-runtime` setting is planned in oats.okf 1.5.1 so an
|
|
138
|
+
already authenticated Claude or Codex runtime can do the same work.
|
|
139
|
+
|
|
140
|
+
### Finish temporary identity retirement
|
|
141
|
+
|
|
142
|
+
The aweb owner must resolve the remote lifecycle defect tracked under
|
|
143
|
+
`aweb-aaum.6`; oats coordinates package integration. The leaked release identities are a reproduction; reconcile the exact
|
|
144
|
+
owner-side list before naming or deleting them. Alias-release fixes are in
|
|
145
|
+
aweb source; production same-alias join/delete/rejoin acceptance is pending. Independently verify coordination cleanup,
|
|
146
|
+
claims and certificate state. Admin cleanup is a recovery procedure, not
|
|
147
|
+
proof of automatic retirement. This gates temporary-worker completion;
|
|
148
|
+
adopted standing executions instead must preserve their durable identity.
|
|
149
|
+
|
|
150
|
+
### Recover standing executions after reboot
|
|
151
|
+
|
|
152
|
+
Tmux and Herdr keep agents alive when a viewer disconnects; a machine reboot
|
|
153
|
+
ends those executions. Replaying `instance.json.command` manually does not
|
|
154
|
+
refresh OATS's independent session receipt and is not a supported recovery.
|
|
155
|
+
The first planned recovery reuses the tested retained-authority handover:
|
|
156
|
+
preserve the stopped home, knowledge and identity, then create its replacement
|
|
157
|
+
with a new receipt and one active holder. The retained-binding rehearsal
|
|
158
|
+
passed, but the installed standing-seat recovery journey remains to qualify. A terminal-only
|
|
159
|
+
restart operation may follow; it must refresh the receipt without rerunning
|
|
160
|
+
resource-provisioning hooks. No automatic supervisor is required for the first
|
|
161
|
+
supported manual recovery.
|
|
162
|
+
|
|
163
|
+
### Include noncoding learning and all actual runtimes
|
|
164
|
+
|
|
165
|
+
`aweb-abfz` tracks record-fed learning; oats.okf 1.5.0 ships its record path. Its bounded acceptance is
|
|
166
|
+
a standing session that wrote no notes and made no code commit producing a
|
|
167
|
+
reviewed knowledge proposal with provenance to exact recorded turns, then a
|
|
168
|
+
successor reading that knowledge. Notes-based harvest must continue working.
|
|
169
|
+
Oats owns this after service self-retirement: select the source instance's
|
|
170
|
+
own recorded turns through a record helper, feed them to existing OKF
|
|
171
|
+
judgment, and deliver proposals through the same review path. Verify exact
|
|
172
|
+
source provenance, correct soul destination and safe repeat processing.
|
|
173
|
+
Storing transcripts or running the mind daemon alone does not satisfy this
|
|
174
|
+
gate.
|
|
175
|
+
|
|
176
|
+
The inventory includes Codex sessions. Native Codex launch/status/stop shipped
|
|
177
|
+
in 0.22.2 alongside Pi and Claude; preserve each seat's selected runtime.
|
|
178
|
+
The shared `yolo` default is enabled on this machine and maps to the runtime's
|
|
179
|
+
permission flag. Aweb owns the per-host `aw wake` service; OATS supplies
|
|
180
|
+
session inspection/input and capability registration, while Desktop is a
|
|
181
|
+
client. Installing the broker service and proving mail/chat delivery after
|
|
182
|
+
GUI closure is required before channel-free standing-seat adoption. Manual
|
|
183
|
+
polling and successful terminal submission are not consumption evidence. Establish any actual machine-policy change
|
|
184
|
+
needed before making it. Include daemon health and restart/recovery behavior
|
|
185
|
+
in the operating instructions.
|
|
186
|
+
|
|
187
|
+
## Rollout sequence
|
|
188
|
+
|
|
189
|
+
1. **Prepare without disturbing sessions.** Record each seat's identity,
|
|
190
|
+
home, work path/branch, outstanding tasks/messages, notes, skills and
|
|
191
|
+
launch mechanism. Review/commit the isolated config changes. Give every
|
|
192
|
+
knowledge store a disposition, preserving source material; migrate needed
|
|
193
|
+
context into indexed soul knowledge and team rules. Materialize required
|
|
194
|
+
skills explicitly instead of depending on a user's Claude skill links.
|
|
195
|
+
2. **Rehearse required identity transitions on test identities.** Prove
|
|
196
|
+
temporary retirement and Merlin-style retained-authority handover, including
|
|
197
|
+
cross-team routing. If another team requires retained-key adoption, test
|
|
198
|
+
its write binding, exclusivity, failure recovery and retained-identity
|
|
199
|
+
retirement separately. Do not use the active Codex lead or a standing
|
|
200
|
+
coordinator as the initial experiment.
|
|
201
|
+
3. **Run cjr's useful worker pilot.** Merlin selected extending
|
|
202
|
+
`kb/tools/kb-jobs-check.py` to cover the machine's launchd jobs. Limit the
|
|
203
|
+
task to health reporting; do not enable/disable jobs. Use a fresh named
|
|
204
|
+
developer in a worktree and a fresh code reviewer. Verify required skills,
|
|
205
|
+
aw communication, a reviewed task commit, a real harvested promotion on
|
|
206
|
+
the correct branch, and a second developer reading the promoted lesson
|
|
207
|
+
through the soul's index. Verify harvester and worker retirement. A
|
|
208
|
+
workaround-assisted run is recorded as partial, not automatic completion.
|
|
209
|
+
4. **Transfer cjr seats at agreed safe boundaries.** Prove the never-run
|
|
210
|
+
roles with new managed workers. Then hand Hermione's and Dumbledore's work
|
|
211
|
+
to fresh identities, followed by Minerva's work; Merlin goes last using the
|
|
212
|
+
verified address-continuity procedure. Checkpoint work/mail/notes and
|
|
213
|
+
explicitly transfer responsibilities. Avoid duplicate owners of the same
|
|
214
|
+
task. Preserve old homes until successor acceptance; retire old identities
|
|
215
|
+
through the supported remote path. Every remembering role gets the learning
|
|
216
|
+
check; reviewers get the exclusion check.
|
|
217
|
+
5. **Repeat across the inventory.** Prepare other scopes in parallel with
|
|
218
|
+
framework work; apply the proven handover with each team owner. Oats/aweb,
|
|
219
|
+
tsm, beadhub and docflow all need explicit outcomes. Offline homes receive
|
|
220
|
+
an explicit disposition. Retire old launch scripts only after no continuing
|
|
221
|
+
seat depends on them.
|
|
222
|
+
6. **Qualify continuous operation.** Prove record-fed promotion for noncoding
|
|
223
|
+
sessions, successor knowledge use, wake-up and recovery, and working health
|
|
224
|
+
checks. Document one supported operator path to start, inspect, hand over,
|
|
225
|
+
harvest and retire each role. Close the full migration only then.
|
|
226
|
+
|
|
227
|
+
## Evidence and progress
|
|
228
|
+
|
|
229
|
+
Keep separate milestones per team: config ready; skills/knowledge ready;
|
|
230
|
+
new workers qualified; standing seats transferred; learning qualified;
|
|
231
|
+
retirement/recovery verified. Record exact published versions and relevant
|
|
232
|
+
commits. Preserve failed-step evidence and outstanding limitations; do not
|
|
233
|
+
substitute a green `doctor`, a roster row or a successful hook report for
|
|
234
|
+
the corresponding live check. Keep credentials and private case data out of
|
|
235
|
+
the shared rollout record.
|
|
236
|
+
|
|
237
|
+
## Latest operating evidence (2026-09-05)
|
|
238
|
+
|
|
239
|
+
- Cjr's pilot landed five useful task commits and eleven promoted concepts
|
|
240
|
+
from four harvests, with independent code and knowledge reviews. Ordinary
|
|
241
|
+
retirement using candidate `b73918f` exited successfully in four seconds:
|
|
242
|
+
changed home bytes preserved, no redundant repository clone, worktree/home
|
|
243
|
+
removed, merged branch retained and temporary aweb alias retired. The
|
|
244
|
+
prior large-index failure led to the batch restore and home-only fixes.
|
|
245
|
+
Redundant failed repository copies were removed only after every file and
|
|
246
|
+
object was proven recoverable elsewhere; all home snapshots remain.
|
|
247
|
+
- TSM's owner plan is `~/tsm/history/2026-09-06-tsm-oats-handover-plan.md`.
|
|
248
|
+
Preserve the five seats' worktrees, skills and knowledge; re-arm Zeus's
|
|
249
|
+
session-local schedules. Production credentials remain solely with the
|
|
250
|
+
authorized production operator. His plan reserves Zeus's final cutover
|
|
251
|
+
for Juan's presence; the other seats can prepare in the meantime.
|
|
252
|
+
- BeadHub supplied its retained-identity and source-root brief through aweb
|
|
253
|
+
mail. It awaits the reviewed declarative binding and cutover recipe.
|
|
254
|
+
Its Stripe-account dependency and production cutover gates remain separate.
|
|
255
|
+
- Docflow supplied its own identity and handover through its terminal. Its
|
|
256
|
+
backfill and register verification define the safe boundary. Preserve its
|
|
257
|
+
Claude memory and existing credentials in place; verify filesystem/TCC
|
|
258
|
+
access and the Minerva conversation before accepting the successor. Stop
|
|
259
|
+
the old harness before activating retained authority in the successor.
|
|
260
|
+
- Local-scope aweb identities on different teams cannot contact one another
|
|
261
|
+
directly. Contacts require a globally resolvable target; the failed
|
|
262
|
+
lead/Zeus and lead/Docflow exchanges expose that intentional boundary.
|
|
263
|
+
Preparation proceeded through identified terminal coordination. Establish
|
|
264
|
+
the cross-team coordinator identity/contact policy explicitly before
|
|
265
|
+
relying on those routes; do not silently replace retained identities.
|
|
266
|
+
- Real remote Claude launch, terminal input and detach survival passed.
|
|
267
|
+
Remote Desktop projection and exact-home lifecycle are under independent
|
|
268
|
+
review for the next patch. Remote harvester completion remains blocked by
|
|
269
|
+
provider authentication, and no standing remote seat is declared migrated.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# OATS v0.22.2
|
|
2
|
+
|
|
3
|
+
OATS now launches native Codex, supports Herdr alongside tmux, and routes
|
|
4
|
+
agent lifecycle commands to registered SSH servers. This release also adds
|
|
5
|
+
record-fed harvesting and lets agents finish their own retirement.
|
|
6
|
+
|
|
7
|
+
## Native runtimes and one permission setting
|
|
8
|
+
|
|
9
|
+
Choose Pi, Claude Code or Codex when creating or spawning an agent. Codex
|
|
10
|
+
uses its native CLI, instructions and skill discovery. Unknown runtimes are
|
|
11
|
+
rejected before provisioning.
|
|
12
|
+
|
|
13
|
+
Set `yolo: true` in a scope's `oats-config.yaml`, override it in a soul, or
|
|
14
|
+
use `oats spawn --yolo` / `--no-yolo`. Desktop offers the same launch choice.
|
|
15
|
+
Codex receives `--yolo` and a launch-local trust setting for the generated
|
|
16
|
+
home; Claude receives `--dangerously-skip-permissions`. Pi is unchanged.
|
|
17
|
+
With no setting, OATS leaves native permission policy in place.
|
|
18
|
+
|
|
19
|
+
## Persistent terminals and SSH execution
|
|
20
|
+
|
|
21
|
+
Use `--backend tmux|herdr` at spawn. The instance's saved session receipt
|
|
22
|
+
identifies its execution; inspect, input, attach and retirement use that
|
|
23
|
+
original target. Closing a viewer leaves the agent running.
|
|
24
|
+
|
|
25
|
+
`oats session inspect|input|attach --home <absolute-home>` provides the
|
|
26
|
+
harness-neutral terminal interface. Input sends literal text and Enter;
|
|
27
|
+
submission is not proof that the agent processed a message.
|
|
28
|
+
|
|
29
|
+
Register an existing SSH host with `oats server add`, then use `--server`
|
|
30
|
+
on spawn, status, retire and session inspect/attach. Saved routes keep
|
|
31
|
+
retirement and attachment available if a registration changes. SSH retains
|
|
32
|
+
responsibility for keys and host verification. Desktop includes a server
|
|
33
|
+
selector and the remote terminal adapter; remote roster projection remains
|
|
34
|
+
a follow-up, so use the CLI to attach to a remote instance in this release.
|
|
35
|
+
|
|
36
|
+
Live checks covered native Codex launch and subsequent terminal input on
|
|
37
|
+
both local backends. A real remote Claude session accepted input through
|
|
38
|
+
the Desktop terminal helper, survived viewer closure, and ended its viewer
|
|
39
|
+
on retirement. Herdr roster checks include public IDs beyond the ninth
|
|
40
|
+
workspace. These checks do not establish reboot recovery.
|
|
41
|
+
|
|
42
|
+
## Learning and retirement
|
|
43
|
+
|
|
44
|
+
The official `oats.okf` 1.5.0 capability can feed harvest from an instance's
|
|
45
|
+
captured turns even when it wrote no notes. It selects that home's sessions,
|
|
46
|
+
reads bounded windows, and advances its watermark over the supplied record.
|
|
47
|
+
Notes-based harvesting remains supported. Record commands require Node 22.5
|
|
48
|
+
or later on the execution host.
|
|
49
|
+
|
|
50
|
+
`oats retire --self` records retirement intent and starts detached completion.
|
|
51
|
+
Completion stops the runtime before releasing capability resources and
|
|
52
|
+
removing the home. Failed cleanup remains visible and recoverable through
|
|
53
|
+
status. The roster also stops treating retirement bookkeeping directories
|
|
54
|
+
as instances. Retiring an instance whose work tree is large no longer fails with
|
|
55
|
+
`git ENOBUFS` during work preservation: every git call on the retirement path
|
|
56
|
+
now runs with a buffer far above Node's 1 MiB default (found on a real
|
|
57
|
+
~9,500-file tree).
|
|
58
|
+
|
|
59
|
+
## Package versions and remaining work
|
|
60
|
+
|
|
61
|
+
The catalog pins `oats.okf` v1.5.0 and `oats.aweb` v1.9.0. The latter updates
|
|
62
|
+
native Codex's messaging instructions; its Pi and Claude channel delivery
|
|
63
|
+
is unchanged. Native Codex has no automatic aweb delivery in this release.
|
|
64
|
+
|
|
65
|
+
The aweb host wake broker, session-delivery capability glue, retained-identity
|
|
66
|
+
handover and supported standing-seat reboot recovery are still being
|
|
67
|
+
completed. Hosted temporary aliases also remain non-reusable until aweb's
|
|
68
|
+
certificate-retirement fix ships; use fresh purpose names. A configured
|
|
69
|
+
team or successful spawn does not mean its standing agents have migrated.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# OATS v0.22.3
|
|
2
|
+
|
|
3
|
+
OATS now shows every registered server's roster in one place, runs the
|
|
4
|
+
knowledge harvest on a remote instance from here, retires exactly the home
|
|
5
|
+
you name, and recovers large worktrees on retirement without copying what
|
|
6
|
+
the clone already holds. The bundled aweb capability keeps an existing
|
|
7
|
+
identity across a re-spawn.
|
|
8
|
+
|
|
9
|
+
## Remote roster and remote harvest
|
|
10
|
+
|
|
11
|
+
`oats server roster [--server <id>] [--json]` groups every registered server
|
|
12
|
+
and saved route by host and workspace, pulls each group's status once within
|
|
13
|
+
a total budget (45 s, 20 s per target; `--budget`, `--per-target`), and
|
|
14
|
+
reports what it could not reach instead of waiting for it. Rows carry the
|
|
15
|
+
saved route, the running state (true, false, or unknown), pending or failed
|
|
16
|
+
retirements, quarantined homes, and routes the host no longer lists.
|
|
17
|
+
|
|
18
|
+
`oats okf harvest --server <id> --instance <name>` runs the knowledge
|
|
19
|
+
package's harvest in that instance's saved home on the host and relays the
|
|
20
|
+
package's answer. A registration edited to another target while saved routes
|
|
21
|
+
still point at the old one is refused at spawn; `oats server forget` drops a
|
|
22
|
+
route whose instance is gone on the host. A routed spawn never overwrites
|
|
23
|
+
an existing saved route: an explicit name that has one is refused, and a
|
|
24
|
+
generated name that collides reports the new instance without a route.
|
|
25
|
+
|
|
26
|
+
## Retire the home you mean
|
|
27
|
+
|
|
28
|
+
Instance names are unique per agent only, so two agents can own an instance
|
|
29
|
+
of the same name. `oats retire <name>` now refuses such a name and
|
|
30
|
+
`oats retire <name> --home <path>` retires exactly that home. Self-retire and
|
|
31
|
+
its deferred completion carry the calling instance's own home. A retire
|
|
32
|
+
routed to a server sends the saved route's home when that server's kernel
|
|
33
|
+
advertises `retire-home` in its version probe; against an older kernel the
|
|
34
|
+
route refuses to retire a name that has twins there.
|
|
35
|
+
|
|
36
|
+
## Retirement recovery at scale
|
|
37
|
+
|
|
38
|
+
Recovering an uncommitted worktree used to copy every staged object into
|
|
39
|
+
the recovery clone one Git process at a time; a clean 9,500-file tree took
|
|
40
|
+
about 19,000 launches and looked hung. Recovery now asks the clone once
|
|
41
|
+
which staged objects it lacks and copies only those, and proves at the end
|
|
42
|
+
that nothing staged is missing. When independent inspection finds that only
|
|
43
|
+
instance-home bytes changed and the worktree carries no work state, the home
|
|
44
|
+
is preserved without a repository clone, and the report says so
|
|
45
|
+
(`repoCopy.copied: false` with the reason).
|
|
46
|
+
|
|
47
|
+
## Desktop
|
|
48
|
+
|
|
49
|
+
Registered servers appear as remote workspaces, projected from the CLI
|
|
50
|
+
roster: their souls and instances, spawn with a per-host handoff, terminals
|
|
51
|
+
addressed by the exact remote home, and harvest and retire only for
|
|
52
|
+
instances with a saved route from this machine. Unknown runtime state is
|
|
53
|
+
shown as unknown everywhere it is counted. Retirement reports every
|
|
54
|
+
preserved-work path and class, and a spawn whose name collided with an
|
|
55
|
+
existing saved route is shown as launched without a route, with the
|
|
56
|
+
host-side remedy. The Desktop requires the CLI's `retire-home` feature for
|
|
57
|
+
every retirement and never admits a remote home into its local file roots.
|
|
58
|
+
|
|
59
|
+
## oats.aweb 1.10.0
|
|
60
|
+
|
|
61
|
+
A soul can declare `identity: { source, takeOver }` and its spawned instance
|
|
62
|
+
becomes the retained seat of an existing aweb identity (same did and
|
|
63
|
+
address); the legacy home's binding is restored on failure and released on
|
|
64
|
+
retirement. The `delivery` setting chooses channel or session wake delivery.
|
|
65
|
+
Capability manifests can declare settings with defaults, environment
|
|
66
|
+
namespaces, and conditional requirements (`when`, `minVersion`,
|
|
67
|
+
`ifInstalled`). The retire report says honestly that a retired alias is not
|
|
68
|
+
reusable yet.
|
|
69
|
+
|
|
70
|
+
## Also
|
|
71
|
+
|
|
72
|
+
- The version probe's `remote` list gains `roster` and `harvest`; a new
|
|
73
|
+
`features` list carries `retire-home`.
|
|
74
|
+
- `oats retire --json` keeps stdout to the envelope (the cross-repo note goes
|
|
75
|
+
to stderr).
|
|
76
|
+
- Goldens carry `environmentNamespaces` in the resolved capability projection.
|
|
77
|
+
- Viewers for remote instances resolve by home: `session inspect|attach
|
|
78
|
+
--server <id> --home <remote home>` uses the saved route that owns the home
|
|
79
|
+
and refuses a name paired with a different one.
|
|
80
|
+
- Deferred retirement retry hints name the exact home.
|
package/docs/servers.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Servers: running instances on another machine
|
|
2
|
+
|
|
3
|
+
A **server** is another machine with its own installed OATS, reached over an
|
|
4
|
+
OpenSSH host alias. Registering one lets `oats spawn`, `oats retire` and
|
|
5
|
+
`oats status` run there with the same flags and the same JSON envelope as
|
|
6
|
+
locally, and lets the Desktop offer it at spawn time. The contract behind
|
|
7
|
+
this is the execution-targets contract (`docs/execution-targets.md`, landing
|
|
8
|
+
with the transport work).
|
|
9
|
+
|
|
10
|
+
## Register
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
oats server add build --ssh build-host --workspace /srv/team --oats /usr/local/bin/oats
|
|
14
|
+
oats server check build # ssh reachability, remote oats version, workspace roster; no mutation
|
|
15
|
+
oats server list
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- `--ssh` is an OpenSSH host alias or host name. Keys, users, ports and host
|
|
19
|
+
verification live in your `~/.ssh/config`; the registry stores none of it and
|
|
20
|
+
refuses `user@host` or option-shaped values. Connections are non-interactive
|
|
21
|
+
(`BatchMode=yes`): a host that would prompt fails fast with ssh's message.
|
|
22
|
+
- `--workspace` is the absolute path of an OATS workspace on the server: the
|
|
23
|
+
same team repository checked out there, with its own `agents/`.
|
|
24
|
+
- `--oats` is the remote executable (default `oats` on the login shell's PATH).
|
|
25
|
+
- `--path` names directories to prepend to the remote PATH for every routed
|
|
26
|
+
command (`~/.local/bin:/opt/pi/bin`). A non-interactive ssh command runs in
|
|
27
|
+
the login shell's minimal PATH, and the remote kernel's spawn preflight looks
|
|
28
|
+
for the runtime binary (`claude`, `pi`, `codex`) there; without this, a
|
|
29
|
+
runtime installed under the user's home is "not found" even though it runs
|
|
30
|
+
fine in an interactive shell on that host.
|
|
31
|
+
- Registrations live in `~/.oats/servers.json` on this machine, never in a
|
|
32
|
+
repository scope.
|
|
33
|
+
|
|
34
|
+
## Run there
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
oats spawn dev --server build --purpose fix-123 --task-file task.md
|
|
38
|
+
oats status --server build
|
|
39
|
+
oats retire dev-fix-123 --server build
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The remote kernel does the work in its registered workspace: composition,
|
|
43
|
+
worktree, identity, launch, retirement. The local side only routes: a local
|
|
44
|
+
`--task-file` travels as text, every argument is quoted for the remote login
|
|
45
|
+
shell, and the remote's version and envelope are checked before either
|
|
46
|
+
mutation (spawn and retire). A spawn is also held to what the remote
|
|
47
|
+
advertises: a runtime it does not list (including the soul's own default as
|
|
48
|
+
the remote roster reports it), a session backend it lacks, or a launch option
|
|
49
|
+
such as `--yolo` it does not know is refused with `E_REMOTE_INCOMPATIBLE`
|
|
50
|
+
saying what was established. A remote that advertises nothing (any kernel
|
|
51
|
+
before 0.22.2) is assumed to run pi and claude on tmux with no options, and
|
|
52
|
+
the refusal says so rather than claiming the remote lacks the feature; a soul
|
|
53
|
+
the remote roster does not list with a runtime is validated by the remote
|
|
54
|
+
kernel itself at spawn. `--dir` and `--server` do not combine; the remote
|
|
55
|
+
workspace comes from the registration.
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
oats session attach --server build --instance dev-fix-123 # viewer through an ssh PTY
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The viewer runs the execution host's own `oats session attach` (Herdr terminal
|
|
62
|
+
or an isolated tmux linked viewer) over `ssh -t`, addressed by the saved route:
|
|
63
|
+
the remote binary and path come from the snapshot, never from the caller.
|
|
64
|
+
Address the home rather than the name (`--home </remote/home>`) when two
|
|
65
|
+
souls on the host own an instance of the same name: the home is the identity,
|
|
66
|
+
the saved route that owns it supplies the target, and a name given together
|
|
67
|
+
with a home that is not its saved route is refused. The
|
|
68
|
+
`oats session` commands ship in kernel 0.22.2: against an older server both
|
|
69
|
+
session routes refuse with `E_REMOTE_INCOMPATIBLE` before connecting a viewer,
|
|
70
|
+
and `ssh -t <host> tmux attach -t oats` remains the way in.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
oats server roster --json # every remote group, one status pull each
|
|
74
|
+
oats okf harvest --server build --instance dev-fix-123 # the knowledge harvest, run in the saved home
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The **roster** is what the Desktop projects: one group per server id and
|
|
78
|
+
route target (host and workspace), each with the registration (present or
|
|
79
|
+
not), the probe (`ok`, or the error that stopped it), the souls the remote
|
|
80
|
+
reports with their `agentsRoot`, the instances joined with this machine's
|
|
81
|
+
saved routes (`savedRoute`; `running` true/false, or `null` when the remote
|
|
82
|
+
could not be asked; `retirePending`; `rollbackIncomplete` for a quarantined
|
|
83
|
+
home; `missingRemotely` when a saved route names an instance the reachable
|
|
84
|
+
remote no longer lists), and `retireFailures` (deferred self-retirements
|
|
85
|
+
that failed there and need `oats retire` again). A registration that was
|
|
86
|
+
removed or edited keeps its group from the saved routes alone, so nothing
|
|
87
|
+
spawned through it disappears from view. Remote state is pulled every time,
|
|
88
|
+
never cached, within a budget: each group gets at most `--per-target` (20 s)
|
|
89
|
+
of a `--budget` (45 s) total, and groups the budget cannot reach are reported
|
|
90
|
+
with `E_ROSTER_BUDGET` rather than dropped or waited for. **Harvest** runs
|
|
91
|
+
the knowledge package's own `okf harvest --json` in the instance's saved home
|
|
92
|
+
on the host (a route that outlives the registration, like retire): the home
|
|
93
|
+
comes from the route saved at spawn, never from the caller, the remote must
|
|
94
|
+
advertise `harvest` in its version probe (0.22.3), and the package's envelope
|
|
95
|
+
is relayed as is. **Retire** through a saved route sends that route's home as
|
|
96
|
+
`--home` when the remote advertises `retire-home` in its probe `features`, so
|
|
97
|
+
a same-named twin under another agent on the host is never the one retired;
|
|
98
|
+
locally, `oats retire <name> --home <path>` does the same and a bare name that
|
|
99
|
+
resolves to several homes is refused.
|
|
100
|
+
|
|
101
|
+
## What this machine keeps
|
|
102
|
+
|
|
103
|
+
A **route snapshot** per remote instance under `~/.oats/remote/<server>/`,
|
|
104
|
+
taken at spawn: the ssh host, workspace and oats path the instance was spawned
|
|
105
|
+
through, plus the remote home. Later `retire --server` uses the snapshot, not
|
|
106
|
+
today's registry, so editing or removing a registration never orphans a remote
|
|
107
|
+
home; the snapshot is removed only when the remote kernel reports the home
|
|
108
|
+
gone. Remote state is never cached: `status --server` pulls it every time and
|
|
109
|
+
appends this machine's snapshots for that server.
|
|
110
|
+
|
|
111
|
+
A registration edited to a different host or workspace (`server add
|
|
112
|
+
--replace`) while saved routes still point at the old target is refused at
|
|
113
|
+
the next `spawn --server` with `E_ROUTE_CHANGED`: a new snapshot under the
|
|
114
|
+
same server id would silently retarget them. Register the new target under a
|
|
115
|
+
new id, or retire the old instances first; the roster shows both targets
|
|
116
|
+
until then. A saved route whose instance is gone on the host (the roster
|
|
117
|
+
shows it `missingRemotely`) cannot be retired away: drop it on purpose with
|
|
118
|
+
`oats server forget <id> --instance <name>`. Saved routes are keyed by name
|
|
119
|
+
under their server id: spawning an explicit `--instance` name that already
|
|
120
|
+
has a route there is refused (`E_ROUTE_EXISTS`), and a generated name that
|
|
121
|
+
collides with another soul's route on the same host leaves the new instance
|
|
122
|
+
without a saved route (`routeConflict` in the result, a warning naming the
|
|
123
|
+
host-side retire), never overwriting the existing one. The roster gives a
|
|
124
|
+
route to the remote row with the same name and home only; a same-named twin
|
|
125
|
+
under another soul is observed only.
|
|
126
|
+
|
|
127
|
+
## Limits
|
|
128
|
+
|
|
129
|
+
- Routed: `spawn`, `retire`, `status`, `okf harvest`, and, against a 0.22.2
|
|
130
|
+
or later server, `session inspect` (the execution host's envelope, relayed;
|
|
131
|
+
a Desktop preflight before attaching) and `session attach`. Session input
|
|
132
|
+
runs on the execution host, where the wake broker calls it. `server roster`
|
|
133
|
+
is local (registrations and saved routes, one status pull per group). The
|
|
134
|
+
version probe's `remote` list names this kernel's remote-side surface
|
|
135
|
+
(`roster` and `harvest` from 0.22.3).
|
|
136
|
+
- No Git over SSH: repository operations always run on the server, by its
|
|
137
|
+
kernel, in its workspace.
|
|
138
|
+
- A remote needs an OATS at least 0.22.1 (`MIN_REMOTE_VERSION`) for spawn,
|
|
139
|
+
retire and status, 0.22.2 for the session routes, and 0.22.3 for harvest
|
|
140
|
+
and for the exact-home retire; the record commands
|
|
141
|
+
(`capture`, `recall`) need Node 22.5+ there for `node:sqlite`, which
|
|
142
|
+
lifecycle routing does not.
|
|
143
|
+
- Lifecycle actions on a remote instance need a saved route from this
|
|
144
|
+
machine; an instance the remote reports that was spawned elsewhere shows in
|
|
145
|
+
the roster without one (`savedRoute: false`) and is read-only here.
|
|
@@ -108,6 +108,24 @@ the same work tree. The harvester promotes, merges, or drops notes, commits a
|
|
|
108
108
|
`memory-harvest:` change, deletes processed notes, and retires itself. This is
|
|
109
109
|
how long-lived instances feed their souls while still alive.
|
|
110
110
|
|
|
111
|
+
Instances that write few notes still feed their souls. With no notes pending,
|
|
112
|
+
`oats okf harvest` asks the turn record for the instance's own captured
|
|
113
|
+
sessions (the transcripts whose working directory is the instance home), and
|
|
114
|
+
spawns the harvester on the turns captured since the last harvest, bounded by
|
|
115
|
+
exact turn ids. The harvester extracts candidates from them, judges each under
|
|
116
|
+
the same promotion bar as a note, and once its judgement is complete writes the
|
|
117
|
+
watermark `.okf-harvest-record.json` in the instance home, whether or not it
|
|
118
|
+
promoted anything; only a failed harvest leaves the watermark alone, so the same
|
|
119
|
+
window is read again. `oats okf harvest --from-record` consults the record even
|
|
120
|
+
when notes are pending. Windows are sized to one tool-output read (60 turns
|
|
121
|
+
or 96 KB of JSON by default; okf settings `record-window-turns` and
|
|
122
|
+
`record-window-bytes`), so a long backlog drains over several harvests, each
|
|
123
|
+
advancing the watermark only over what was read; the package prepares the next
|
|
124
|
+
watermark as `.okf-harvest-record.next.json` and the harvester's delivery is
|
|
125
|
+
one rename, so an abandoned harvest leaves that file beside the current one.
|
|
126
|
+
oats.okf 1.5.0 requires kernel 0.22.2 (the `capture --home` and `recall --json`
|
|
127
|
+
surfaces); the compatibility floor refuses to activate it on an older kernel.
|
|
128
|
+
|
|
111
129
|
### Spawning and coordinating with other agents
|
|
112
130
|
|
|
113
131
|
OATS agents can run `oats spawn` when their instructions or the
|
|
@@ -156,9 +174,18 @@ integration self-deletes the instance identity here. For oats-okf, retirement
|
|
|
156
174
|
is a knowledge no-op because harvest already happens after commits.
|
|
157
175
|
|
|
158
176
|
`oats retire <instance> --self` lets an instance retire itself when the human
|
|
159
|
-
or briefing says it is done.
|
|
160
|
-
|
|
161
|
-
|
|
177
|
+
or briefing says it is done. A live runtime cannot give a stable final
|
|
178
|
+
inspection of its own work, so the calling process inspects, runs, and removes
|
|
179
|
+
nothing: it records the intent beside its home as
|
|
180
|
+
`.oats-retire-pending-<instance>.json` and starts a detached completion, then returns so the instance can report final
|
|
181
|
+
status before its tmux window dies a few seconds later. The completion then
|
|
182
|
+
retires the instance exactly as an external `oats retire` would: quiesce the
|
|
183
|
+
runtime, preserve uncommitted work, run retire hooks, repair lineage, remove
|
|
184
|
+
the worktree and the home. Success leaves nothing behind: the home and the
|
|
185
|
+
marker are gone. A failure writes `.oats-retired-<instance>.json` beside the
|
|
186
|
+
retained home (plus the usual quarantine marker when hooks reported incomplete
|
|
187
|
+
cleanup), shows in `oats status` and the Desktop as a failed deferred
|
|
188
|
+
retirement, and is retried and cleared with `oats retire <instance>`.
|
|
162
189
|
|
|
163
190
|
## Work modes
|
|
164
191
|
|