@awebai/oats 0.22.2 → 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/bin/oats.mjs +80 -12
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +211 -6
- package/capabilities/oats-aweb/injects/aweb.md +6 -0
- package/capabilities/oats-aweb/oats.json +40 -7
- package/docs/capability-manifest.schema.json +41 -0
- package/docs/execution-targets.md +29 -0
- package/docs/integrations.md +36 -0
- package/docs/operating-team-migration.md +89 -37
- package/docs/release-notes/v0.22.3.md +80 -0
- package/docs/servers.md +62 -11
- package/lib/core.mjs +157 -26
- package/lib/servers.mjs +195 -8
- package/package-catalog.json +1 -1
- package/package.json +1 -1
package/docs/integrations.md
CHANGED
|
@@ -139,3 +139,39 @@ contract design, and the `integration-authoring` skill routes work to it.
|
|
|
139
139
|
Test an integration as a capability package: acquire, lock, trust, activate,
|
|
140
140
|
spawn, retire, with the golden fixtures as the behavior oracle for the kernel
|
|
141
141
|
side.
|
|
142
|
+
|
|
143
|
+
## oats.aweb settings (1.10.0)
|
|
144
|
+
|
|
145
|
+
Set with `oats use oats.aweb --settings <key>=<value>` at a scope, or per
|
|
146
|
+
soul through the binding's `settings:` map.
|
|
147
|
+
|
|
148
|
+
- `delivery: channel | session` (default `channel`). `session` hands
|
|
149
|
+
notification delivery to the host wake broker: `AWEB_DELIVERY=session` in
|
|
150
|
+
the launch environment (declared by the manifest), no Claude channel flag,
|
|
151
|
+
a pi extension that honours the opt-out (`@awebai/pi` 0.3.10 or later,
|
|
152
|
+
enforced as a conditional requirement with a version floor), and a briefing
|
|
153
|
+
and registration of the home with the host wake broker (`aw wake register`).
|
|
154
|
+
Until an aw that ships `aw wake` exists (aweb-abil), session mode REFUSES
|
|
155
|
+
to spawn rather than leave an instance that nothing wakes: it is for broker
|
|
156
|
+
qualification only; leave the default otherwise.
|
|
157
|
+
- `identity: { source: "/abs/path/to/legacy/.aw" }`, per soul, explicit and
|
|
158
|
+
never inferred. The spawned instance becomes the retained seat of that
|
|
159
|
+
existing identity (same did:aw and address). The aweb service URL comes
|
|
160
|
+
from the source's `workspace.yaml` (`aweb_url`); a hosted-init source has
|
|
161
|
+
none, so set `OATS_AWEB_URL` (for example `https://app.aweb.ai/api`) in
|
|
162
|
+
the spawn environment when the source lacks it: the identity-authority files
|
|
163
|
+
are copied into the home's `.aw` (never `workspace.yaml` or caches), the
|
|
164
|
+
coordination binding is reconnected with `aw workspace connect`, and the
|
|
165
|
+
seat is verified online before the instance is briefed. A lock beside the
|
|
166
|
+
source (`.aw-retained-seat.json`) refuses a second seat while a holder is
|
|
167
|
+
live. Retire releases the lock and touches neither the identity nor the
|
|
168
|
+
source; removing the legacy `.aw` is a human step. Rehearse on a disposable
|
|
169
|
+
global identity first: a send, a claim and a heartbeat from the new home
|
|
170
|
+
must all work before any real seat moves.
|
|
171
|
+
|
|
172
|
+
Requirement rows in a manifest may carry `when: { <setting>: <value> }` (the
|
|
173
|
+
row applies only when the capability's effective setting matches) and
|
|
174
|
+
`minVersion` (the version is read from the package.json under the install
|
|
175
|
+
directory the runtime's listing names; an older or absent manifest fails the
|
|
176
|
+
requirement with the install remedy). `ifInstalled: true` makes an absent
|
|
177
|
+
package satisfy the row, so the floor applies only to an ambient extension.
|
|
@@ -31,10 +31,17 @@ Every remembering role must have a tested learning path; reviewers retain
|
|
|
31
31
|
their explicit exclusion from accumulated memory. Config discovery alone
|
|
32
32
|
establishes none of this.
|
|
33
33
|
|
|
34
|
-
The
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
record-fed
|
|
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.
|
|
38
45
|
|
|
39
46
|
## Scope inventory
|
|
40
47
|
|
|
@@ -45,17 +52,21 @@ of continuing seats.
|
|
|
45
52
|
| Scope | Starting point | Required disposition |
|
|
46
53
|
| --- | --- | --- |
|
|
47
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 |
|
|
48
|
-
| `~/cjr` |
|
|
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 |
|
|
49
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 |
|
|
50
|
-
| `~/tsm` | Five live seats: Zeus, Prometeo, Argos, Themis on Claude; Hermes on Codex. No OATS config/souls found |
|
|
51
|
-
| `~/prj/beadhub-all` | Live Codex session, despite stale offline roster |
|
|
52
|
-
| `~/prj/docflow` | Live Claude
|
|
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 |
|
|
53
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 |
|
|
54
61
|
| `~/awebai/demo-aweb/bob` | Live Pi demo | Aweb owns safe stop and archival disposition; it is not an operating-team migration |
|
|
55
62
|
| `~/.turn-record` | Live Pi capture service under launchd | Retain as infrastructure; qualify record capture separately from standing seats |
|
|
56
63
|
|
|
57
64
|
The live inventory above was checked on 2026-09-05 using harness process
|
|
58
|
-
working directories, without interrupting them.
|
|
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
|
|
59
70
|
are insufficient to decide whether a harness is alive. A migration plan or
|
|
60
71
|
new soul directory does not establish that the corresponding seat moved.
|
|
61
72
|
|
|
@@ -74,8 +85,9 @@ owns cjr's repository changes, task selection and eventual handovers. Other
|
|
|
74
85
|
teams' owners control their work and handover sequence; oats records those
|
|
75
86
|
owners before scheduling each migration. Oats accepted ownership of
|
|
76
87
|
`aweb-abep` (service self-retirement), followed by `aweb-abfz` (record-fed
|
|
77
|
-
learning).
|
|
78
|
-
|
|
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
|
|
79
91
|
the full-machine plan and runtime/wake qualification, including the Codex
|
|
80
92
|
support requirement. The aweb coordinator owns identity continuity and route
|
|
81
93
|
semantics, with oats coordinating the rehearsal and package changes.
|
|
@@ -87,8 +99,12 @@ outstanding work, knowledge, contacts and task responsibility. Old identities
|
|
|
87
99
|
are retired only after that handover is accepted. Pilot identities remain
|
|
88
100
|
uniquely named so no existing address has to be removed for the experiment.
|
|
89
101
|
|
|
90
|
-
Merlin
|
|
91
|
-
|
|
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:
|
|
92
108
|
|
|
93
109
|
1. Rehearse using a disposable self-custodial global identity and a second-team
|
|
94
110
|
contact, checking DID, address, conversations and write attribution.
|
|
@@ -108,26 +124,25 @@ Never put credentials in Git or manufacture instance.json for adoption.
|
|
|
108
124
|
|
|
109
125
|
### Make harvest finish without an operator
|
|
110
126
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
OpenAI via `openai-codex/gpt-5.5`, already used by the local record/mind setup.
|
|
124
|
-
Pi is needed even for Claude workers. A model setting is not proof of a run.
|
|
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.
|
|
125
139
|
|
|
126
140
|
### Finish temporary identity retirement
|
|
127
141
|
|
|
128
142
|
The aweb owner must resolve the remote lifecycle defect tracked under
|
|
129
|
-
`aweb-aaum.6`; oats coordinates package integration. The
|
|
130
|
-
|
|
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,
|
|
131
146
|
claims and certificate state. Admin cleanup is a recovery procedure, not
|
|
132
147
|
proof of automatic retirement. This gates temporary-worker completion;
|
|
133
148
|
adopted standing executions instead must preserve their durable identity.
|
|
@@ -139,15 +154,15 @@ ends those executions. Replaying `instance.json.command` manually does not
|
|
|
139
154
|
refresh OATS's independent session receipt and is not a supported recovery.
|
|
140
155
|
The first planned recovery reuses the tested retained-authority handover:
|
|
141
156
|
preserve the stopped home, knowledge and identity, then create its replacement
|
|
142
|
-
with a new receipt and one active holder.
|
|
143
|
-
|
|
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
|
|
144
159
|
restart operation may follow; it must refresh the receipt without rerunning
|
|
145
160
|
resource-provisioning hooks. No automatic supervisor is required for the first
|
|
146
161
|
supported manual recovery.
|
|
147
162
|
|
|
148
163
|
### Include noncoding learning and all actual runtimes
|
|
149
164
|
|
|
150
|
-
`aweb-abfz`
|
|
165
|
+
`aweb-abfz` tracks record-fed learning; oats.okf 1.5.0 ships its record path. Its bounded acceptance is
|
|
151
166
|
a standing session that wrote no notes and made no code commit producing a
|
|
152
167
|
reviewed knowledge proposal with provenance to exact recorded turns, then a
|
|
153
168
|
successor reading that knowledge. Notes-based harvest must continue working.
|
|
@@ -158,11 +173,14 @@ source provenance, correct soul destination and safe repeat processing.
|
|
|
158
173
|
Storing transcripts or running the mind daemon alone does not satisfy this
|
|
159
174
|
gate.
|
|
160
175
|
|
|
161
|
-
The inventory includes Codex sessions.
|
|
162
|
-
and Claude;
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
|
166
184
|
needed before making it. Include daemon health and restart/recovery behavior
|
|
167
185
|
in the operating instructions.
|
|
168
186
|
|
|
@@ -215,3 +233,37 @@ commits. Preserve failed-step evidence and outstanding limitations; do not
|
|
|
215
233
|
substitute a green `doctor`, a roster row or a successful hook report for
|
|
216
234
|
the corresponding live check. Keep credentials and private case data out of
|
|
217
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,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
CHANGED
|
@@ -60,11 +60,44 @@ oats session attach --server build --instance dev-fix-123 # viewer through an
|
|
|
60
60
|
|
|
61
61
|
The viewer runs the execution host's own `oats session attach` (Herdr terminal
|
|
62
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.
|
|
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
|
|
64
68
|
`oats session` commands ship in kernel 0.22.2: against an older server both
|
|
65
69
|
session routes refuse with `E_REMOTE_INCOMPATIBLE` before connecting a viewer,
|
|
66
70
|
and `ssh -t <host> tmux attach -t oats` remains the way in.
|
|
67
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
|
+
|
|
68
101
|
## What this machine keeps
|
|
69
102
|
|
|
70
103
|
A **route snapshot** per remote instance under `~/.oats/remote/<server>/`,
|
|
@@ -75,20 +108,38 @@ home; the snapshot is removed only when the remote kernel reports the home
|
|
|
75
108
|
gone. Remote state is never cached: `status --server` pulls it every time and
|
|
76
109
|
appends this machine's snapshots for that server.
|
|
77
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
|
+
|
|
78
127
|
## Limits
|
|
79
128
|
|
|
80
|
-
- Routed: `spawn`, `retire`, `status`, and, against a 0.22.2
|
|
81
|
-
server, `session inspect` (the execution host's envelope, relayed;
|
|
82
|
-
preflight before attaching) and `session attach`. Session input
|
|
83
|
-
execution host, where the wake broker calls it.
|
|
84
|
-
|
|
85
|
-
|
|
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).
|
|
86
136
|
- No Git over SSH: repository operations always run on the server, by its
|
|
87
137
|
kernel, in its workspace.
|
|
88
138
|
- A remote needs an OATS at least 0.22.1 (`MIN_REMOTE_VERSION`) for spawn,
|
|
89
|
-
retire and status,
|
|
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
|
|
90
141
|
(`capture`, `recall`) need Node 22.5+ there for `node:sqlite`, which
|
|
91
142
|
lifecycle routing does not.
|
|
92
|
-
-
|
|
93
|
-
|
|
94
|
-
|
|
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.
|