@awebai/oats 0.24.12 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/bin/oats.mjs +936 -2822
  2. package/docs/capabilities.md +136 -323
  3. package/docs/configuration.md +68 -533
  4. package/docs/design/2026-09-16-fresh-operator-walkthrough.md +19 -14
  5. package/docs/design/2026-09-16-portable-migration-evidence.md +2 -0
  6. package/docs/design/2026-09-16-portable-onboarding.md +4 -2
  7. package/docs/design/2026-09-20-redesign-program-board.md +1 -1
  8. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +2 -0
  9. package/docs/design/2026-09-23-simplified-workspace-model.md +711 -0
  10. package/docs/design/2026-09-23-workspace-module-contracts.md +309 -0
  11. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +65 -0
  12. package/docs/design/README.md +20 -8
  13. package/docs/design/operations-contract.md +1 -0
  14. package/docs/design/package-engine-contract.md +1 -1
  15. package/docs/design/package-runtime-api.md +1 -1
  16. package/docs/desktop-cli-api.md +386 -6
  17. package/docs/desktop-succession.md +3 -4
  18. package/docs/first-team.md +107 -224
  19. package/docs/implementation.md +6 -4
  20. package/docs/integrations.md +45 -44
  21. package/docs/knowledge-capability-authoring.md +10 -4
  22. package/docs/knowledge-migration.md +5 -4
  23. package/docs/knowledge-reference/package-craft.md +11 -3
  24. package/docs/knowledge.md +24 -8
  25. package/docs/layers.md +3 -3
  26. package/docs/oats-local.schema.json +50 -0
  27. package/docs/oats-membership.schema.json +23 -0
  28. package/docs/oats-workspace.schema.json +133 -48
  29. package/docs/official-marketplace.md +9 -6
  30. package/docs/packages.md +229 -440
  31. package/docs/rebuild-to-v2.md +233 -0
  32. package/docs/release-notes/v0.24.13.md +51 -0
  33. package/docs/release-notes/v0.25.0.md +99 -0
  34. package/docs/soul.schema.json +41 -68
  35. package/docs/souls-and-instances.md +175 -108
  36. package/docs/workspace-adoption.md +70 -345
  37. package/docs/workspaces.md +429 -119
  38. package/lib/core.mjs +419 -55
  39. package/lib/instance-resolution.mjs +312 -0
  40. package/lib/materialize.mjs +580 -0
  41. package/lib/packages.mjs +501 -1273
  42. package/lib/remote.mjs +639 -0
  43. package/lib/resolve.mjs +576 -0
  44. package/lib/schedule.mjs +194 -34
  45. package/lib/workspace.mjs +635 -0
  46. package/package.json +1 -1
  47. package/lib/portable-migration-artifacts.mjs +0 -135
  48. package/lib/portable-migration-evidence.mjs +0 -305
  49. package/lib/portable-migration-store.mjs +0 -199
  50. package/lib/portable-migration.mjs +0 -104
  51. package/lib/portable-onboarding-acceptance.mjs +0 -66
  52. package/lib/setup-expert-source.mjs +0 -100
@@ -1,349 +1,74 @@
1
1
  # Adopt the OATS development workspace
2
2
 
3
- OATS hosts the shared `oats-workspace.yaml`. Its separate `oats.yaml` advertises
4
- source-complete exports and declares its own reciprocal membership. `oats-dev`
5
- remains a development-capability repository, including `oats.review`; membership
6
- neither activates that package nor replaces its existing configuration templates.
7
-
8
- This guide covers the shared repository graph and portable expert source editions,
9
- beginning with **the existing oats-expert**. Source publication is not a live
10
- five-role roster or curated knowledge cutover, a shared runtime, private-team
11
- enrollment or Desktop feature parity.
12
- The [phase plan](design/2026-09-20-workspace-and-portable-adoption-plan.md) and
13
- [knowledge model](knowledge-theory.md) retain those separate boundaries.
14
-
15
- ## The five framework experts
16
-
17
- The indexed source editions are `oats-expert`, `oats-kernel-expert`,
18
- `oats-desktop-expert`, `market-research-expert` and `oats-assistant`. Each declares
19
- `owns` for its own same-named node and `reads` for the other four through logical
20
- store `oats`, preserving the reviewed owner UUIDs. These are knowledge-routing and
21
- context declarations, not access grants or proof of accepted knowledge. The parallel
22
- `souls/` editions neither replace the legacy `agents/` roster nor adopt the curated
23
- KB or change live instances; actual adoption still needs compatible providers and
24
- explicit bindings. All five now explicitly declare `oats.core` under
25
- `requires.capabilities`, with `source: repo:oats-package`. This retains the complete
26
- package from the same reviewed source revision.
27
-
28
- The dependency is visible and removable in the authored definition, not a change
29
- to existing captured records. An edited edition needs its own reviewed publication
30
- and import update; changing today's source does not rewrite an older pinned import.
31
-
32
- ## Shared versus local
33
-
34
- | Git-shared declaration | Operator-local input or evidence |
35
- | --- | --- |
36
- | Workspace membership candidates and reviewed source import pins | Local source access and qualified repository observations |
37
- | A repository's backlink and real package/soul export paths | Working checkout mappings and the explicitly chosen work target |
38
- | Intrinsic capability requirements and logical knowledge interests | Provider settings, explicit store binding, private human/team choices |
39
- | Complete immutable instructions and skill resources | Native harness/model/auth, backend endpoint, home and durable state |
40
- | A reviewed source revision | Exact executable approval, current readiness and deployment acceptance |
41
-
42
- No machine paths, credentials, private team identifiers, accepted-store locator or
43
- owner registry belongs in the public workspace. Knowledge publication and acceptance
44
- (S7) remain separate; no ready knowledge export is advertised. Preserve the parked
45
- roster/curation and every old home, lock, source, pending job, history and worktree.
46
-
47
- ## Onboard with OATS Soul Setup (0.24.2+)
48
-
49
- With operator approval, [OATS 0.24.2](release-notes/v0.24.2.md) and later provide:
50
-
51
- ```sh
52
- oats onboard --dir /absolute/context --json
3
+ > **Superseded (workspace model, 0.25).** The 0.24 narrative this page carried
4
+ > — `oats.yaml` exports, `imports:` of pinned source editions, "classic local
5
+ > bootstrap" with `oats onboard --dir`, source-edition inspection and
6
+ > `oats prepare` pilots — is history: none of those files or verbs exist under
7
+ > the workspace model (decision 5 of `workspace-model-v2`: no migration, v1
8
+ > declaration files are schema errors). What replaces it is short and is
9
+ > written once: **[rebuild-to-v2.md](rebuild-to-v2.md)** (§5 for the
10
+ > deployment layout `oats onboard` creates) and [workspaces.md](workspaces.md)
11
+ > for the model. This page only says what the framework's own workspace looks
12
+ > like under v2 and how to join it.
13
+
14
+ ## The framework's own workspace (decisions 18–21)
15
+
16
+ Decision 18 (W9) converts every repository of the OATS organisation to a v2
17
+ member: `oats-membership.yaml` naming the host, v2 `souls/*/soul.yaml`, and
18
+ `capabilities/*/oats.json` for what it exports at latest state. The `oats`
19
+ repository hosts `oats-workspace.yaml` and the official
20
+ `package-catalog.json`. Until that conversion has landed on `main`, the
21
+ repository's checked-in `oats-workspace.yaml` is still `schemaVersion: 1` and a
22
+ 0.25 kernel refuses it by name (`E_WORKSPACE_SCHEMA`) — the commands below
23
+ describe the target, not a workspace you can join today.
24
+
25
+ A framework repository is a **member and a package publisher at once**, and the
26
+ two roles never collapse: `oats-okf`, `oats-aweb`, `oats-jira`, `oats-linear`,
27
+ `oats-authoring`, `oats-dev` are members (their `souls/` — `okf-expert`,
28
+ `aweb-expert`, … — are discoverable at latest state, team `global`) **and**
29
+ their `oats-package/` is consumed only as a package: `from: package`, pinned
30
+ in the workspace's `packages:`, locked and approved per version. The framework's
31
+ own souls therefore say `oats.okf: { from: package }` even though `oats-okf` is
32
+ a member. A bare version in `packages:` (`oats.okf: v2.1.3`) resolves through
33
+ the catalog; a package outside it is written `git:<repo>@<ref>`.
34
+
35
+ ## Join it on your machine
36
+
37
+ ```bash
38
+ oats onboard ~/oats-workspace --workspace git:github.com/awebai/oats
53
39
  ```
54
40
 
55
- This is **classic local bootstrap**, not captured preparation or workspace
56
- enrollment; the command is absent from 0.24.0/0.24.1. Classic root resolution
57
- selects an enclosing roster, otherwise the enclosing Git root/context. Supplying
58
- `--dir` does **not** promise that a literal nested subdirectory becomes a new
59
- physical deployment; choose an independent context when that is intended.
60
-
61
- Onboarding acquires the catalog's official `oats.framework` package through the
62
- ordinary acquisition/lock engine and creates a local `oats-setup-expert`, selecting
63
- only `oats.core` and `oats.setup` for it. Both local capability requirements name
64
- the **actually acquired immutable commit**, not orphan `repo:` paths in the new
65
- deployment. Knowledge, messaging and tasks default to none, with no knowledge
66
- owner or payload. Unexpected executable surfaces refuse rather than gaining trust
67
- from catalog membership. Review the resolved deployment and returned
68
- `result.next.command`: it uses the same kernel for the next spawn, and onboarding
69
- **never executes it or launches a model**.
70
-
71
- Optional `--workspace git:host/org/repository[@revision]` selects the workspace's
72
- pinned setup-expert import, or that explicit repository's advertised setup edition
73
- at its observed revision. Its source-package bytes must match the official
74
- acquisition. Failed explicit inputs never fall back to the packaged default, and
75
- workspace policy, teams and provider adoption values are not silently adopted.
76
-
77
- An **existing roster** requires `--force-existing` (the guard is the agent list,
78
- not merely any existing configuration). The flag cannot replace an existing or
79
- incomplete setup soul or disable providers/additives for other souls; exclusions
80
- apply only to the new setup expert. Failures report partial acquisition/creation,
81
- not atomic captured preparation. Preserve that evidence before retrying.
82
- **`oats setup` remains record capture setup**, unchanged. Native authentication
83
- and permission boundaries remain.
84
-
85
- The expert can then guide deliberate configuration and the normal retained
86
- prepare/approve/scaffold/start stages. A created soul or printed spawn command is
87
- not a running session, provider qualification or accepted learning. Desktop
88
- onboarding and legacy roster/knowledge cutover remain separate.
89
-
90
- ## Stage two: published experts and pinned imports
91
-
92
- - `oats-workspace.yaml` explicitly admits `oats` and the six intended capability
93
- repositories: `oats-dev`, `oats-okf`, `oats-aweb`, `oats-authoring`, `oats-jira`
94
- and `oats-linear`. It activates no additional capability; tasks default to none.
95
- - `oats.yaml` exports the five knowledge-owning editions above plus the separate
96
- `souls/oats-setup-expert` bootstrap edition, and the actual package roots
97
- `oats-package` (`oats.framework`) and `capabilities/oats-authoring`, not
98
- the npm root as a fictitious OATS distribution. Its workspace backlink names
99
- the same framework repository.
100
- - The editions are parallel to, not replacements for, the live `agents/` roster.
101
- Each contains canonical instructions, `CLAUDE.md -> AGENTS.md`, and its reviewed
102
- private procedures where applicable. No durable KB is copied into them; legacy
103
- roster/knowledge cutover remains deferred until the fresh-reader proof against
104
- the accepted public knowledge base.
105
- - Each of the five expertise editions preserves its owner, node and four cross-reads.
106
- Store `oats` requires the explicit `stores.oats` binding; no publisher writer,
107
- production store or grants are supplied. An acceptance fixture is parent-owned
108
- and cannot be counted as production knowledge adoption.
109
- - Current authored expert editions require knowledge **oats.okf@2.1.2** and
110
- messaging **oats.aweb@1.11.2** (both OATS >=0.24.4), not optional defaults.
111
- The official catalog now offers **oats.okf 2.1.3** (per-cause `check` reasons,
112
- a named remedy for a soul without `okf.json`, retired sources switch their
113
- job off); editions move to it when their owner re-reviews them. These published revisions
114
- are **not proof that their combined bindings/runtime profile is ready**. The provider
115
- owner supplies that evidence and any subsequently reviewed compatible revision.
116
- Do not replace either requirement with none or erase a read edge to launch.
117
-
118
- At those authored revisions, the provider boundary is concrete:
119
-
120
- - Published OKF 2.1.2 supports `inherit: stores.oats`, normalized to
121
- `/bindings/knowledge/stores/oats`. The explicit `destination: oats` preserves
122
- routing; omitting it would instead require `write.default`. No new schema,
123
- owner or production locator is needed for this declaration.
124
- - aweb 1.10.3 (`24efa6f9`) has no portable binding interface; **aweb 1.11.0**
125
- (`v1.11.0`, OATS >=0.24.2) adds it; **1.11.1/1.11.2** (OATS >=0.24.4) are code-identical and declare its fixed reasons, owned operator keys and `helperInjection: omit` (a harvest helper has no messaging identity); the five editions pin 1.11.2. Its `check`
126
- qualifies only an input-capable Claude/Codex primary with an explicit private team
127
- and `delivery: session`; strict-Pi print reports `needs-configuration`. Status is on
128
- the [program board](design/2026-09-20-redesign-program-board.md). Qualification
129
- is HOME-route operational custody only: not human/native-principal delegation,
130
- private grants, broker delivery or model consumption.
131
- - Published OKF 2.1.2 accepts retained Claude/Codex helpers with the complete approved
132
- capability closure and native-default model intent. Strict Pi still requires an
133
- explicit model and the sole-OKF profile; Pi plus messaging remains unqualified.
134
- This provider release alone is not combined-profile acceptance. Do not silently
135
- switch runtimes, force a model, or drop capabilities.
136
-
137
- These are explicit readiness holds, not reasons to weaken the source. Parent must
138
- select reviewed compatible provider revisions and update the source pin deliberately
139
- before claiming an operational pilot; metadata-only repository indexes change none
140
- of these runtime facts.
141
-
142
- Stage one used an empty imports list until source publication. All six imports
143
- now pin **`906b1558633766cf489451f9b68016216acaa63b`** (after
144
- [OATS v0.24.3](release-notes/v0.24.3.md)), the reviewed revision at which the
145
- workspace declares the per-human private team policy (`teams: {private: per-human}`)
146
- and every messaging edition carries its `teams: []` declaration — without them the
147
- aweb provider cannot normalize in workspace context, as the second operator found.
148
- Workspace update `f3ee31e0`. The five knowledge-owning experts therefore select
149
- OKF 2.1.2 and aweb 1.11.2 with explicit core; setup remains provider-independent,
150
- requiring core/setup and defaulting all three fundamental layers to none. It is
151
- not a sixth knowledge owner. This deliberate repin, not a catalog/kernel upgrade
152
- alone, advances the selected source requirements. Successful source inspection,
153
- including `ready-for-preparation`, is still metadata readiness—not binding,
154
- approval, enrollment or a running pilot.
155
-
156
- ## Preserve source-before-import publication order
157
-
158
- 1. Publish complete, reviewed source editions before pinning them. All six imports
159
- use `906b1558633766cf489451f9b68016216acaa63b`. Future revisions must
160
- likewise exist before their import update.
161
- Never use an invented SHA, a mutable branch or an unreviewed local candidate
162
- as the accepted source.
163
- 2. In each of the six repositories, review a root `oats.yaml` against its actual
164
- source head and actual `oats-package/oats-package.json`. The declaration is:
165
-
166
- ```yaml
167
- schemaVersion: 1
168
- workspace:
169
- source: git:github.com/awebai/oats
170
- exports:
171
- packages:
172
- - path: oats-package
173
- ```
174
-
175
- Preserve payloads, versions, old tags and legacy templates. This does not
176
- activate oats.dev, messaging or either optional task integration. Indexes are
177
- published on `main` in all six capability repositories (oats-okf, oats-aweb,
178
- oats-authoring, oats-jira, oats-dev, oats-linear); their publication proceeded
179
- separately from the framework's own source imports.
180
- 3. A subsequent workspace commit pins the published source, never itself or a
181
- future commit. The current first import is:
182
-
183
- ```yaml
184
- imports:
185
- - source: git:github.com/awebai/oats
186
- soul: souls/oats-expert
187
- revision: 906b1558633766cf489451f9b68016216acaa63b
188
- alias: oats-expert
189
- ```
190
-
191
- The [actual workspace](../oats-workspace.yaml) contains all six imports at that
192
- same revision; this excerpt is not the full list.
193
- The layout test checks all six imports and source-document declarations. Do not
194
- change stable export paths or owners merely because the workspace advances.
195
- 4. Qualify reciprocal admission at the now-published observations. A missing
196
- backlink, a fork's copied file or a stale workspace observation is not membership.
197
- Cross-repository indexes may land separately; until both sides exist, report the
198
- specific unqualified member rather than claim the whole graph is ready.
199
-
200
- Membership selectors and backlinks omit `revision` deliberately: the repository
201
- adapter observes the hosting provider's actual default branch, not a guessed
202
- `main`. Within one preparation, observations are frozen. In particular, the
203
- framework's self-member and workspace backlink must resolve to the **same commit**.
204
- A separately pinned older workspace with backlinks resolving to a later head is
205
- correctly stale; choose a fresh coherent observation, never rewrite an old retained
206
- record. Imports have their own immutable source revision and need not track each
207
- new workspace metadata commit.
208
-
209
- Importing the exported soul directly does **not** follow the publisher's workspace
210
- as adopter policy. A different workspace, or an explicitly standalone operator,
211
- may consume it without membership in the OATS development workspace.
212
-
213
- ## Inspect source metadata before preparation
214
-
215
- The public source inspector ships in [OATS 0.24.1](release-notes/v0.24.1.md),
216
- following PR24 integration. Use an installed CLI containing that implementation.
217
- It is **not supported by the original 0.24.0 release**: that older inspect route
218
- can ignore the request flag and consult ambient classic configuration. Do not
219
- infer command availability from a capability's version floor or today's catalog.
220
-
221
- ```sh
222
- oats inspect --request /absolute/inspection.json --json
223
- ```
224
-
225
- With the stage-two imports published, the authored inspection input can use the
226
- same repository for workspace, member and source:
227
-
228
- ```json
229
- {
230
- "deployment": "/operator/deployments/oats-pilot",
231
- "workTarget": "/operator/projects/oats",
232
- "source": "oats-expert",
233
- "origin": {
234
- "kind": "operator",
235
- "document": {"kind": "operator", "id": "workspace-adoption"},
236
- "pointer": "/source"
237
- },
238
- "workspace": {
239
- "source": "git:github.com/awebai/oats",
240
- "origin": {
241
- "kind": "operator",
242
- "document": {"kind": "operator", "id": "workspace-adoption"},
243
- "pointer": "/workspace"
244
- }
245
- },
246
- "member": {
247
- "source": "git:github.com/awebai/oats",
248
- "origin": {
249
- "kind": "operator",
250
- "document": {"kind": "operator", "id": "workspace-adoption"},
251
- "pointer": "/member"
252
- }
253
- }
254
- }
255
- ```
256
-
257
- The paths are operator-selected examples, not host defaults or new grants.
258
- Independent adoption uses the full source/soul/revision/alias reference and an
259
- explicit standalone context instead of workspace/member. Do not mix this inspect
260
- mode with current-context flags or captured deployment/resolution selectors.
261
-
262
- The result is **non-authorizing metadata**, not provider readiness: even `ok:true`
263
- may carry `needs-configuration` or `separate-deployment-required`. A
264
- `ready-for-preparation` observation still has no approval or enrollment effect.
265
- Provider payloads and opaque adoption values are deliberately omitted. Preserve
266
- the original authored inputs; neither the result nor its inspection request is a
267
- preparation request or an issued mutation witness. In particular, `workTarget`
268
- and inspection catalog wrappers are not accepted preparation fields.
269
-
270
- The inspector owns transient repository scratch but writes no deployment state.
271
- Missing paths need explicit operator provisioning and reinspection, not automatic
272
- repair. Observing a project work target does not change the separate captured H/work
273
- placement. Existing retained inspect remains the later exact-record inspection.
274
-
275
- ## Prepare a fresh local pilot only after the profile is qualified
276
-
277
- Use the selected installed compatible CLI. Do not turn this source check into a
278
- global install, a daemon start or a model/GUI test on another operator's machine.
279
- Keep native HOME/profile/auth and explicit permission choices; no credential copy
280
- or empty profile. Knowledge, messaging and tasks have distinct authority contracts.
281
-
282
- Before preparing, the integration lead must supply:
283
-
284
- - The published workspace/source observations and an explicit fresh physical
285
- deployment/home placement. Do not copy old locks, retained records or identities.
286
- - An operator-owned nonsecret request with `workspace` (its source and origin),
287
- `source: "oats-expert"` (or another published expert alias), and `mode: "directory"`.
288
- Standalone callers instead give the complete `{source,soul,revision,alias}`
289
- reference and an explicit standalone context; they do not inherit this workspace.
290
- - Explicit provider-specific settings and bindings. OKF preparation needs selected
291
- absolute `bindings-file` and `state-dir`, `harvest-runtime`, and the `stores.oats`
292
- binding; an omitted `harvest-model` preserves native-default intent. The parent-owned
293
- acceptance fixture must supply an accepted node registry supporting the preserved
294
- owner **and all four read nodes**. This is not accepted production KB publication;
295
- Git destinations remain PR-only.
296
- - Actual messaging human/context inputs and the pilot's explicit **`delivery: session`**
297
- setting (aweb's default is channel). Supply it in the complete supported
298
- `operator.policy.messaging` selection: capability, matching selected source and
299
- `settings: {delivery: session}`. Retain host requirements, session `ifInstalled`
300
- minimums and any selected authoring requirements. Selecting session delivery neither
301
- makes a strict-Pi print primary input-capable nor supplies captured wake authority.
302
- - A qualified primary/helper runtime/model/resource profile. Capture the intended
303
- helper selection in `helperLaunches["oats.okf:memory-harvest"]`, not the legacy
304
- `souls.memory-harvest` configuration. Do not replace retained intent to fit an easier
305
- runtime profile. An old default-OKF-only learning gate does not qualify a combined
306
- aweb profile. If provider or kernel support is missing, stop at that typed result;
307
- do not bypass it with a legacy route, a dropped capability or a fabricated identity.
308
-
309
- The existing public routes are stepwise (D/R/H are returned or explicitly approved
310
- values, not names inferred from cwd):
311
-
312
- ```sh
313
- oats prepare --request /absolute/operator-preparation.json --json
314
- # Review returned exact artifacts/problems; approve only explicitly authorized code.
315
- oats trust <capability-id> --deployment "$D" --artifact-set "$ARTIFACT_SET" --json
316
- oats prepare --request /absolute/operator-preparation.json --json
317
- oats inspect --deployment "$D" --resolution "$R" --composition --json
318
- oats spawn oats-expert --deployment "$D" --resolution "$R" --home "$H" --no-launch --json
319
- oats session start --deployment "$D" --resolution "$R" --home "$H" \
320
- --request /absolute/approved-native-request.json --json
321
- ```
322
-
323
- Do not mix other preparation flags into request-file mode. A needs-configuration or
324
- approval result is not a ready instance. A scaffold materializes resources and may
325
- run approved hooks; it is not a message exchange or model session. Actual dispatch,
326
- continuation, native capture, messaging and learning require the integration owner's
327
- qualified profile and receipts. OATS 0.24.1 adds captured custody checks to the
328
- existing HOME-only session inspect/input route; it does not supply the missing
329
- messaging adapter or qualify every lifecycle route. Verify wake/input/retirement
330
- support for the exact route and runtime. A stopped-home observation is not delivery
331
- or retirement authority, and a messaging profile cannot pass on start-only evidence.
332
- Do not bypass custody with a legacy fallback or remove the messaging requirement.
333
- Consult the current installed public help and the provider's supported commands;
334
- this guide introduces no new CLI grammar. The source inspector above is a separate
335
- implementation dependency, not a change to the existing prepare request contract.
336
-
337
- ## Local checks and limits
338
-
339
- `node --test test/workspace-repository-layout.test.mjs` checks the actual declarations
340
- against the shipped codecs/schemas, required providers and owner/read mapping, and
341
- contained source resources. An isolated native-Git fixture exercises source-before-
342
- import publication, host-default observations, reciprocal/self admission, refusal of
343
- missing/stale backlinks, and independent public source projection. Fixture member
344
- indexes are not evidence that the six real repositories are already published.
345
-
346
- Source and metadata checks do not enroll users, initialize the phase-2 store, register
347
- production writers or qualify private messaging. Parent alone coordinates publication,
348
- local operator approval and actual adoption. Full Desktop parity follows usable
349
- infrastructure adoption, not merely source metadata passing validation.
41
+ This writes `oats-local.yaml`, creates `agents/`, runs the first `sync`
42
+ (membership table, `packages:` resolved into `oats-lock.json`, approval asked
43
+ once per package version — exit `2` until approved in a terminal), and prints
44
+ which members to clone beside it. Read `oats souls` / `oats capabilities`,
45
+ then `oats spawn oats-setup-expert` for the guided rest. Exact shapes and
46
+ errors (`E_ALREADY_ONBOARDED`, `E_REPO_REF`, `details.rolledBack`):
47
+ [desktop-cli-api.md](desktop-cli-api.md#oats-onboard-onboardapi-2).
48
+
49
+ Shared vs local is now one rule: **what is true of the workspace lives in the
50
+ host repo and the members (Git); what is true of this machine lives in
51
+ `oats-local.yaml` (`settings:`, `clones:`, `souls.disabled`, never committed);
52
+ what is true of one instance is given at spawn (`--provider <cap> k=v`)**. No
53
+ machine path, credential, private team identifier or store locator belongs in
54
+ the workspace file — its schema refuses absolute paths.
55
+
56
+ ## Public contributors: the standalone view
57
+
58
+ The workspace file names every member, so a mixed public/private organisation
59
+ hosts it in a private repo that is not a public member (decision 26). A
60
+ contributor who can read a public member but not the host points
61
+ `oats-local.yaml` at the member and gets the **standalone view**: the member's
62
+ own souls with `from: here` capabilities plus `oats.core` (decision 25), marked
63
+ `standalone: true` in `oats sync --json` and in
64
+ `instance.json.workspace.standalone`. The view exists only for a repo that *is*
65
+ a member (it has `oats-membership.yaml`) whose host is unreadable for
66
+ access reasons; a repo without a backlink is `E_WORKSPACE_SCHEMA`, and a network
67
+ or timeout failure reading the host is `E_REMOTE_UNREADABLE`, never a silent
68
+ fallback.
69
+
70
+ ## History
71
+
72
+ The 0.24 adoption record (PR23 and the portable-souls program) is kept in
73
+ [design/2026-09-20-redesign-program-board.md](design/2026-09-20-redesign-program-board.md)
74
+ and the superseded design notes under [design/](design/README.md).