@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.
@@ -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 published 0.22.1 release supports useful Pi/Claude worker work and
35
- notes-based harvest. Its observed qualifications included operator-assisted
36
- retirement. Standing-agent adoption, automatic service retirement and
37
- record-fed learning remain work, not shipped guarantees.
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` | Knowledge/config preparation landed at `5afb3e8b`; managed developer pilot running; legacy Merlin and Minerva observed live | Merlin owns pilot and safe handovers; preserve his DID and address; harvest acceptance remains pending |
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 | Lead coordinates with Zeus; cross-team handoff currently rejected by local identity routing; establish a supported route, then prepare souls/knowledge and safe handovers |
51
- | `~/prj/beadhub-all` | Live Codex session, despite stale offline roster | Lead sent handover request to Beadhub; preserve its established identity and current work; no billing/production changes |
52
- | `~/prj/docflow` | Live Claude session; credential workspace alias `alice` on `docflow:juan.aweb.ai` | Lead and Merlin establish responsible owner and handover; that alias is not proof of a globally routable address |
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. Old aweb presence timestamps
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). Self-retirement merged at 568eeae; record-fed learning is implemented
78
- and under independent review, with package publication pending. Lead owns
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 is the exception. Oats owns the explicit source-authority binding in the
91
- messaging capability; aweb supplied this supported handover:
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
- Kernel issue `aweb-abep` is real in 0.22.1: bare `retire --self` is refused,
112
- while the harvester's instructions tell it to use that command. Oats owns
113
- the supported service-exit path, with lead review. A deferred external
114
- retirement is a candidate; the live agent must not inspect and delete its
115
- own working state. Completion requires an actual harvester to finish,
116
- report and clean up without operator retirement, with visible recoverable
117
- failure rather than silent loss. Do not release capabilities while the
118
- runtime can still act, or make the read-only status command delete homes.
119
-
120
- Review cjr's local `memory-harvest` override before the pilot: selected
121
- implementation, required skill, authenticated model, source worktree,
122
- promotion destination and self-harvest exclusion. The configured model is
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 five leaked release
130
- identities are a reproduction. Independently verify coordination cleanup,
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. That capability binding is not built
143
- yet; until qualified, rebooted standing seats remain down. A terminal-only
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` is the open record-fed learning epic. Its bounded acceptance is
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. Main now includes reviewed native Codex launch (b7d4159), alongside Pi
162
- and Claude; released Codex launch/status/stop/composition support is required
163
- unless a seat's owner explicitly chooses a runtime change. No silent fallback
164
- to Pi. Test channel delivery with the installed runtime and selected config;
165
- manual polling is not wake-up. Establish any actual machine-policy change
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. The
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 or later
81
- server, `session inspect` (the execution host's envelope, relayed; a Desktop
82
- preflight before attaching) and `session attach`. Session input runs on the
83
- execution host, where the wake broker calls it.
84
- Desktop projection of remote instances and remote viewer attachment are in
85
- progress on the execution-targets work.
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, and 0.22.2 for the session routes; the record commands
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
- - After a remote spawn the Desktop reports the server and remote home; the
93
- instance does not appear in the local roster (projection of remote instances
94
- is the next step of the execution-targets work).
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.