@awebai/oats 0.24.0 → 0.24.2

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 (43) hide show
  1. package/README.md +224 -394
  2. package/bin/oats.mjs +192 -13
  3. package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +11 -0
  4. package/capabilities/oats-aweb/bin/oats-aweb.mjs +26 -0
  5. package/capabilities/oats-aweb/lib/binding-wire.mjs +214 -0
  6. package/capabilities/oats-aweb/lib/captured-execution.mjs +91 -0
  7. package/capabilities/oats-aweb/lib/captured-native.mjs +91 -0
  8. package/capabilities/oats-aweb/lib/invocation-shape.mjs +135 -0
  9. package/capabilities/oats-aweb/lib/portable-binding.mjs +146 -0
  10. package/capabilities/oats-aweb/lib/session-readiness.mjs +56 -0
  11. package/capabilities/oats-aweb/oats.json +12 -3
  12. package/capabilities/oats-okf/lib/captured-worker.mjs +12 -4
  13. package/capabilities/oats-okf/oats.json +1 -1
  14. package/docs/capabilities.md +4 -0
  15. package/docs/design/2026-09-20-redesign-program-board.md +83 -0
  16. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +287 -0
  17. package/docs/design/2026-09-20-workspace-onboarding-public.md +124 -0
  18. package/docs/design/README.md +42 -0
  19. package/docs/first-team.md +43 -1
  20. package/docs/knowledge-theory.md +353 -111
  21. package/docs/knowledge.md +10 -1
  22. package/docs/layers.md +89 -354
  23. package/docs/official-marketplace.md +84 -0
  24. package/docs/packages.md +15 -7
  25. package/docs/release-notes/v0.24.1.md +17 -0
  26. package/docs/release-notes/v0.24.2.md +21 -0
  27. package/docs/souls-and-instances.md +45 -7
  28. package/docs/workspace-adoption.md +314 -0
  29. package/docs/workspaces.md +154 -0
  30. package/injects/oats-portable.md +8 -5
  31. package/lib/core.mjs +89 -17
  32. package/lib/portable-onboarding.mjs +19 -0
  33. package/lib/prepared-resources.mjs +1 -1
  34. package/lib/provider-binding-broker.mjs +6 -1
  35. package/lib/setup-expert-source.mjs +76 -0
  36. package/package-catalog.json +9 -5
  37. package/package.json +3 -1
  38. package/skills/oats-config/SKILL.md +4 -5
  39. package/skills/oats-portable/SKILL.md +1 -2
  40. package/skills/oats-portable-artifacts/SKILL.md +2 -2
  41. package/souls/oats-setup-expert/AGENTS.md +60 -0
  42. package/souls/oats-setup-expert/soul.yaml +14 -0
  43. package/skills/oats-portable-setup/SKILL.md +0 -69
package/docs/layers.md CHANGED
@@ -1,382 +1,117 @@
1
1
  # The OATS contracts
2
2
 
3
- Status: contracts on paper (migration step 2 of
4
- [the 2026-09-03 architecture proposal](2026-09-03-architecture-proposal.md)).
5
- Sections distinguish **shipped**, **prepared** and **proposed** behavior.
6
- The knowledge section describes the prepared OKF v2 integration; its release
7
- gates are explicit in [v0.23.1 notes](release-notes/v0.23.1.md). A
8
- proposed clause describes the contract the kernel will be refactored toward;
9
- it is not a claim about current behavior, and the shipped documents
10
- ([souls and instances](souls-and-instances.md),
11
- [capabilities](capabilities.md), [implementation](implementation.md)) remain
12
- authoritative for what the code does now.
3
+ OATS supplies common contracts; capabilities supply behavior. The current architecture combines [Git workspaces and portable sources](workspaces.md), retained instance execution and provider-owned knowledge, messaging and tasks.
13
4
 
14
- The rule the contracts serve:
15
-
16
- > Every main component is replaceable by another that offers the same
17
- > contract, with the exception of OATS itself. OATS knows only contracts.
18
-
19
- A contract is finished when two implementations satisfy it and a soul runs
20
- unchanged behind each. Each section ends with that test.
5
+ This page is the current conceptual map, not a replacement for the versioned schemas or a claim that every provider/profile is implemented. Use [release scope](release-notes/v0.24.0.md) and actual readiness results. Earlier contract inventories remain in [Git history](https://github.com/awebai/oats/blob/249899a9a1ae865cc640fbc52b3585765fba473f/docs/layers.md); dated designs are navigated through the [design index](design/README.md).
21
6
 
22
7
  ## How the pieces fit
23
8
 
24
9
  ```text
25
- soul ─────────── declares which contracts it needs, never which implementation
26
- │
27
- ├── soul type ── the policy unit: capabilities, knowledge scope, reach
28
- │
29
- └── capabilities ── implementations bound by configuration
30
- ├── knowledge (exclusive slot)
31
- ├── tasks (exclusive slot)
32
- ├── communication (exclusive slot; called "messaging" in config today)
33
- ├── capture (proposed slot)
34
- └── additive capabilities (any number)
35
-
36
- instance = (soul, runtime provider, work target?, task)
10
+ Git workspace definition
11
+ ├── admits repositories with reciprocal backlinks
12
+ ├── supplies bounded defaults and provider declarations
13
+ └── imports exported souls by source reference and revision
14
+ └── soul declares requirements, defaults and software sources
15
+ └── preparation resolves and retains an approved composition
16
+ └── instance runs against an independent work target
17
+ ├── knowledge capability
18
+ ├── messaging capability
19
+ ├── tasks capability
20
+ └── any additional capabilities
37
21
  ```
38
22
 
39
- The kernel owns the soul format, the soul type, the capability manifest and
40
- lifecycle events, and instantiation. Everything else is an implementation
41
- behind one of the contracts below.
23
+ The workspace definition, source repository, local deployment, work target and messaging team are different identities. They may share a repository or machine without becoming interchangeable authority.
42
24
 
43
25
  ## Soul format
44
26
 
45
- **Shipped.** A soul is a directory: `soul.yaml` (name, kind, description,
46
- repo, work, runtime, model, type), `AGENTS.md` (the operating definition),
47
- `skills/`, and whatever a knowledge implementation adds. It is committed and
48
- reviewed like code, and it never runs by itself.
27
+ Portable `soul.yaml` uses `schemaVersion: 1`, a name, optional role/runtime/work preferences and explicit requirements/defaults. Canonical `AGENTS.md`, its `CLAUDE.md` alias and the declared resources provide the operating curriculum. See the [schema](soul.schema.json).
49
28
 
50
- **Contract.** A soul declares *which contracts it needs*, not which
51
- implementation fills them. Its `AGENTS.md` speaks of "your knowledge", "your
52
- task layer", "your messaging"; the bound capability's injected block says
53
- what those are in this installation. A soul that names a tracker, a mail
54
- system, or a knowledge format in its own text is not portable and is
55
- malformed under this contract.
29
+ A soul can require a concrete implementation **and its source**, or require a provider by presence with supported defaults/operator choice. Naming OKF or a tracker does not make a soul malformed: it makes a particular source policy explicit. A source that genuinely promises interchangeable implementations must use compatible requirements and test that claim.
56
30
 
57
- A soul is runtime-neutral as an artifact. Anything derived from it for one
58
- runtime (a compiled native session, a finetune reference) is a realization
59
- artifact attached to the (soul, runtime) pair, never soul content.
31
+ Concrete capability selections carry `source`; software must not be inferred from an ambient installation or the publisher's unshared config. Imports retain source identity and revision rather than creating local forks. Source updates do not silently rewrite an existing instance's retained curriculum.
60
32
 
61
- **Test.** One packaged soul runs in an installation bound to Jira and in one
62
- bound to Linear with no change to its files.
33
+ Classic `kind`/`type`/`repo` declarations and config-targeted agent types are a compatibility model, not mandatory fields or a third policy tier in portable resolution. See [souls and instances](souls-and-instances.md) and [classic configuration](configuration.md).
63
34
 
64
- ## Soul type
35
+ ## Workspace, repository and adoption contracts
65
36
 
66
- **Shipped.** Config declares agent types by name under `agent-types:`; a soul
67
- opts in with `type: <name>` in `soul.yaml`; capability entries target
68
- `global`, `agent-types`, or `souls`, and settings resolve soul over type over
69
- global, then by config closeness.
37
+ - `oats-workspace.yaml` declares intended members, defaults, imports and optional provider-owned stores/team/catalog references.
38
+ - `oats.yaml` advertises a repository's actual soul/package/knowledge exports and, for membership, a workspace backlink.
39
+ - Membership requires compatible observations on both sides; folder adjacency or a copied declaration is not admission.
40
+ - External source import does not adopt the publisher's workspace. A framework repository may host its own development workspace without imposing it on consumers.
41
+ - Operator choices and workspace defaults must respect source requirements. Git read access is not write permission, executable approval or messaging enrollment.
70
42
 
71
- **Contract.** The soul type is the policy unit. It decides:
43
+ The [workspace guide](workspaces.md) explains these boundaries and the [declaration contract](design/2026-09-15-portable-declarations.md) defines their versioned forms.
72
44
 
73
- - which capabilities a soul of that type receives, and with which settings;
74
- - what knowledge it may read (custody scope) and whether it may write
75
- knowledge (a harvester is a type permitted to write);
76
- - its communication **reach**, in both directions.
45
+ ## Capability manifest and lifecycle events
77
46
 
78
- `reach` is one field with a monotone ladder, each level including the ones
79
- below:
47
+ A capability's `oats.json` declares its identity, optional fundamental `layer`, resources, host/runtime prerequisites, commands, operations and supported lifecycle contributions. A distribution package's `oats-package.json` exports one or more capabilities; a package is not itself an active integration or workspace.
80
48
 
81
- ```text
82
- reach: owner # only agents owned by the same human
83
- reach: team # any agent in the deployment's team
84
- reach: org # any team in the same organization
85
- reach: external # agents outside the organization
86
- ```
49
+ The current [manifest schema](capability-manifest.schema.json) includes the published binding interface and helper/input declarations. A manifest shape alone does not certify its implementation:
87
50
 
88
- "No communication" is not a level; it is the communication slot set to
89
- `none`. `reach` governs whom an instance may address and who may address it;
90
- the communication implementation enforces both sides.
51
+ - Captured fundamental providers expose their declared normalize/bind/check phases through the existing broker. The kernel resolves their fields without implementing their domain model.
52
+ - Commands/hooks execute only with the appropriate exact artifact approval and invocation authority.
53
+ - Helper behavior and optional source-receipt inputs are declared by their owner, not guessed from a layer name.
54
+ - Required setup/capture outcomes cannot be silently omitted to make a launch or cleanup appear successful.
55
+ - Legacy hook environment and captured binding/invocation inputs are distinct contracts. A legacy hook is not automatically safe for retained execution.
91
56
 
92
- **Proposed.** The type is exported to hooks and dispatched commands as
93
- `OATS_SOUL_TYPE`; packages may ship types; a type may declare `reach`.
57
+ Use [capability details](capabilities.md), the [provider wire](design/2026-09-16-provider-binding-wire.md), [helper/input contract](design/2026-09-17-capability-helper-input-contract.md) and [package runtime boundary](design/package-runtime-api.md).
94
58
 
95
- **Test.** Two souls of different types, spawned in one installation, receive
96
- different capability sets and different knowledge scopes with no per-soul
97
- configuration.
59
+ ## The three fundamental slots
98
60
 
99
- ## Capability manifest and lifecycle events
61
+ Knowledge, messaging and tasks are exclusive provider slots: zero or one selected implementation of each per composition. `none` is an explicit permitted choice only where requirements allow it. Additional capabilities are unlimited and nonexclusive; the three slots do not limit domain tools or workflows.
100
62
 
101
- **Shipped.** A capability is a set of scripts, skills, and docs with an
102
- `oats.json` manifest declaring: `capability` (id), optional `layer`,
103
- `skills`, `inject`, `commands`, `requires` (host commands and runtime
104
- packages), `environment` (launch variables it may contribute, vendor-prefixed),
105
- and `hooks`. Accepted events are `soul-scaffold`, `spawn`, and `retire`. Hooks
106
- receive `OATS_EVENT`, `OATS_CAPABILITY`, `OATS_LAYER`, `OATS_INSTANCE`,
107
- `OATS_HOME` (with `OATS_INSTANCE_HOME` as its alias), `OATS_AGENT`,
108
- `OATS_SOUL`, `OATS_CONTEXT`, `OATS_WORKSPACE`, `OATS_ROOT`, `OATS_LEVEL`,
109
- `OATS_SETTINGS`, `OATS_META`, and the team variables, and may return `meta`, `brief`, `warning`, runtime-specific
110
- `launch` arguments, and (spawn only) `env`. Only a spawn hook may be
111
- `required`. The full contract, including trust and rollback, is in
112
- [capabilities](capabilities.md) and is not restated here.
113
-
114
- **Contract.** The event list is the API that makes capabilities composable
115
- and changes rarely. An implementation of any slot below is a capability that
116
- declares that slot as its `layer`; two active capabilities cannot fill one
117
- slot for one soul. Packages talk to the kernel only through the structured
118
- CLI boundary (`oats ... --json`, `OATS_CLI_BIN`), never by importing kernel
119
- files; see [package-runtime-api](design/package-runtime-api.md).
120
-
121
- **Proposed.** A fourth event, `harvest`, run by `oats harvest` for every
122
- active capability that declares it, with the same environment as `spawn`
123
- plus the instance whose ephemeral state is to be promoted. The knowledge
124
- implementation's harvest hook is how promotion is triggered without the
125
- kernel knowing the knowledge format.
126
-
127
- **Test.** Two capabilities filling the same slot in two installations; the
128
- kernel's code has no branch that names either.
129
-
130
- ## The knowledge contract
131
-
132
- **Shipped kernel contract.** Zero or one knowledge capability per soul,
133
- selected under `capabilities.layers.knowledge`. `none` creates no
134
- provider memory or harvest flow and does not delete existing state. The kernel
135
- owns neither the format nor a mandatory promotion doctrine.
136
-
137
- **Prepared reference implementation: oats.okf 2.0.0 / framework v0.23.1.**
138
- All accepted knowledge is external. Explicit bindings name Git or non-Git
139
- bases; `soul/okf.json` declares stable ownership and read references, while
140
- `okf-base.json` identifies accepted nodes. Missing configuration or knowledge
141
- fails working-source spawn, never creates an empty substitute.
142
-
143
- *Read.* Sources consult immutable accepted views, index-first and selectively.
144
- Prior rationale should be consulted rather than re-derived. OKF's `owns` routes
145
- responsibility and `reads` chooses starting context: neither is an ACL, and all
146
- configured bases are discoverable/readable. Cannot-write is instruction, not an
147
- OS sandbox. A directory publication journal blocks fresh views; Git readers see
148
- only the accepted branch, not an open PR.
149
-
150
- *Capture and judgment.* Working agents capture state/log/notes; durable source
151
- custody also copies full native record windows through the public CLI. A separate
152
- worker judges from frozen input without needing the source home, worktree or
153
- model. Source retirement waits for certified capture, not a model or GitHub.
154
- Workers use independent `directory` execution and never edit source notes or
155
- soul skills. Existing hooks and per-source command schedules supply this flow;
156
- the proposed generic `harvest` event above is not implemented or required.
157
-
158
- *Delivery custody.* Knowledge placement, not soul residency or work mode,
159
- determines delivery. All Git bases use verified PR-only delivery with separate
160
- merge-visible acceptance. Genuine non-Git directories use cooperative locks,
161
- baseline comparison, journalled publication and validated receipts, without Git
162
- or gh. There is no direct Git fallback and no cross-base distributed transaction.
163
- Source descriptors, proposals and processing/delivery/acceptance receipts outlive
164
- source retirement. Inspection can show matching live Markdown plus durable
165
- receipts; missing/reused homes cannot supply live memory for an old source.
166
-
167
- *Reference promotion doctrine.* OKF accepts durable behavior-changing judgment
168
- that is not recoverable merely by reading code: rationale, rejected alternatives,
169
- discovered limits and maintained slow state. It rejects code descriptions, task
170
- residue, secrets and verbatim third-party messages. Human-accepted decisions keep
171
- acceptance evidence; maintained state needs an owner and freshness discipline.
172
- One canonical concept is preferable to copied claims. These are the default
173
- capability's choices, not a compulsory judge for every knowledge implementation.
174
-
175
- See [the runtime guide](knowledge.md) and [v1 migration](knowledge-migration.md)
176
- for current commands and constraints. The [reference theory](knowledge-theory.md)
177
- and [authoring curriculum](knowledge-capability-authoring.md) are optional;
178
- capabilities may adopt, adapt or replace them and own their complete runtime.
179
-
180
- **Test.** OKF's Git and directory providers exercise independent custody within
181
- one capability. A second knowledge capability with a different model remains a
182
- separate replaceability test; two OKF providers do not prove that test by
183
- renaming them as two integrations.
184
-
185
- ## The tasks contract
186
-
187
- **Shipped.** The `tasks` slot. Bundled implementations are `oats.jira`
188
- (the `jira-tasks` protocol via `acli`) and `oats.linear` (JSON-first
189
- `oats linear` commands and the `linear-tasks` skill). There is no default;
190
- `tasks: none` is valid.
191
-
192
- **Contract.** Where shared work state lives and how an instance claims,
193
- updates, blocks, hands off, and completes work, taught by the implementation's
194
- injected block and skill. An instance is identified to the tracker in a way
195
- that survives the instance (today a label, `agent-<instance-name>`). Task
196
- state, status, and outcomes live in the tracker; conversation lives in the
197
- communication slot; the two are not merged even when one tool offers both.
198
-
199
- Verdicts and review outcomes are task records. That is how verification
200
- enters the model without a component: a reviewer is a soul type, and what it
201
- concludes is written where work state lives.
202
-
203
- **Test.** Jira and Linear already satisfy it; a third (beads, GitHub Issues)
204
- is the proof that the contract is not a description of either.
205
-
206
- ## The communication contract
207
-
208
- **Shipped.** The `messaging` slot. The bundled implementation is `oats.aweb`:
209
- a team-scoped aweb identity minted per instance at spawn (alias = instance
210
- name) by a required spawn hook and deleted at retire, the `aweb-messaging`,
211
- `aweb-team-membership`, and `aweb-identity` skills, `oats aweb roster` and
212
- `oats aweb setup`, and channel-plugin launch arguments so a session is woken
213
- by incoming mail. `messaging: none` is valid.
214
-
215
- **Contract.** How an instance becomes reachable and reaches others. The
216
- implementation supplies:
217
-
218
- - an address for the instance, discoverable by teammates, and the roster
219
- that lists them across machines;
220
- - durable asynchronous mail and synchronous chat, with reply and
221
- acknowledgement state;
222
- - a wake-up signal when work arrives, with the decision to resume or launch
223
- left to the runtime owner;
224
- - enforcement of the soul type's `reach`, outbound by what the address can
225
- reach and inbound by who may deliver to it;
226
- - a statement of whether the address can outlive the instance. For a durable
227
- specialist the answer should be yes, realized however the implementation
228
- chooses (for aweb: a soul-level identity served through per-instance
229
- grants).
230
-
231
- Communication is only communication. Task coordination lives in the tasks
232
- slot.
233
-
234
- *Fully local.* It must remain possible to run everything filesystem-based and
235
- fully local, meaning with no dependency on a hosted service the operator
236
- cannot replace. Communication needs a server; a self-hosted one on localhost
237
- satisfies the constraint. What the implementation must hold on *its*
238
- servers, and the traffic that must pass through them, is minimized. For aweb
239
- today every delivery passes through an aweb server, hosted or self-hosted on
240
- localhost with the reserved `local` namespace (`aweb-abhw` records the open
241
- decision on a lighter local server). `reach: owner` maps to a contacts-only
242
- inbound mode that aweb does not ship yet (`aweb-abhx`).
243
-
244
- **Proposed.** The slot is renamed from `messaging` to `communication` in
245
- documentation first; the config key stays `messaging` until a release
246
- decides otherwise.
247
-
248
- **Test.** aweb and a second implementation (a Slack bridge, an A2A gateway)
249
- behind the same injected promises; a soul's `AGENTS.md` unchanged between
250
- them.
251
-
252
- ## The capture contract (proposed)
253
-
254
- **Shipped, outside the slot model.** On machines where `oats setup` has run,
255
- `packages/record` captures Claude Code, Pi, and Codex transcripts plus aw
256
- client logs. It skips sources matched by the local record's ignore list. It
257
- stores captured turns in an append-only, content-addressed record with a search
258
- index (`oats setup`, `oats capture`, `oats recall`). It is not a capability. A knowledge capability may consume source-targeted
259
- capture/recall through the supported CLI boundary, as OKF v2 does.
260
-
261
- **Contract.** The format of ephemeral state. Two kinds satisfy it: an agent's
262
- own notes (its report of what mattered, today created by the knowledge
263
- implementation) and a captured session (ground truth). The harvester may
264
- consume either or both. Clothes, the optional spawn-time selection of past
265
- conversation, are one consumer of the same contract and depend on nothing
266
- else in this document. Capture never mediates the harness and fails visibly;
267
- a silent capture gap is worse than none.
268
-
269
- **Proposed.** `capture` becomes a slot; `packages/record` is wrapped as a
270
- bundled, framework-trusted capability whose spawn hook records the
271
- instance-to-session mapping; `oats setup`, `oats capture`, and `oats recall`
272
- become kernel aliases resolving to the active capture implementation.
273
- Whether capture is exclusive or additive is open.
274
-
275
- **Test.** The record beside a notes-only implementation; the harvester reads
276
- both.
277
-
278
- ## The runtime provider contract (proposed)
279
-
280
- **Shipped.** Two runtimes, `pi` and `claude`, selected by `soul.yaml` or
281
- `--runtime`, launched in a local tmux window; the branching lives inside
282
- `spawnInstance`. The worked example in the
283
- [proposal](2026-09-03-architecture-proposal.md#worked-example-todays-pi-launch-as-bundle-and-handle)
284
- names today's launch in the contract's terms.
285
-
286
- **Contract.** OATS hands a provider a realization bundle and receives an
287
- instance handle:
63
+ ### The knowledge contract
288
64
 
289
- ```text
290
- bundle
291
- instructions the composed AGENTS.md
292
- skills the exact materialized tree
293
- environment, launch args what active capabilities contributed
294
- task TASK.md
295
- model preference resolved
296
- realization artifacts per (soul, runtime); empty by default
297
-
298
- handle
299
- observe is it running; where the session transcript is
300
- steer attach or send input, where supported
301
- stop
302
- ```
65
+ The kernel supplies selection, retained identity/resources, approval, invocation/lifecycle context, independent helper execution and truthful outcomes. It does not mandate OKF, memory filenames, a taxonomy, a harvester or external-only mutable placement.
66
+
67
+ The knowledge capability supplies organization, stores, readers, evidence capture, judgment, maintenance and delivery/acceptance policy. Mutable knowledge is never permission to alter immutable retained software/source artifacts.
68
+
69
+ The reference OKF model uses centralised per-soul knowledge, stable ownership/read routing, independent promotion and PR-only Git delivery. `owns` routes harvests; `reads` selects context; neither is an ACL. Directory publication, a proposed PR, an accepted merge and a fresh reader's observation are separate facts.
70
+
71
+ Alternatives may choose different placement or learning procedures. A supported co-located profile is not implied merely because the architecture allows one. See [knowledge theory](knowledge-theory.md), [version-scoped operations](knowledge.md) and [provider-neutral boundary](design/2026-09-16-knowledge-capability-contract.md).
72
+
73
+ ### The tasks contract
74
+
75
+ A task provider owns work assignment, claims, status, blockers, outcomes and handoff procedures. OATS supplies the selected capability/runtime boundary, not one mandatory tracker workflow. Jira and Linear are available integrations; no tasks provider is mandatory when source requirements permit none.
76
+
77
+ Messaging is conversation, not automatically task state. Accepted knowledge may explain a decision or important situation without duplicating the tracker.
78
+
79
+ ### The communication contract
80
+
81
+ The current slot name is **`messaging`**. The capability owns native identity, addressing, team membership, transport, wake delivery and qualification. A team alias in a workspace is a declaration, not proof that an actor is enrolled or a privacy property is enforced.
82
+
83
+ aweb 1.10.3 supports its legacy setup/lifecycle path but lacks the captured provider-binding interface. **aweb 1.11.0** (OATS >=0.24.2) adds it: `check` qualifies HOME-route operational custody for an input-capable Claude/Codex primary with an explicit private team and `delivery: session`; a strict-Pi print primary reports `needs-configuration` rather than dropping the requirement. Qualification is not account delegation, broker delivery or model consumption.
84
+
85
+ The earlier proposed `reach` ladder is **not an enforced universal field**. In particular, aweb's `team_and_contacts` includes verified same-team senders; the compatibility spellings `contacts-only` and `contacts_only` do not establish owner-only admission. A config command succeeding proves neither inbound/outbound restrictions nor knowledge visibility. See the [identity/membership amendment](design/2026-09-08-expert-assisted-deployment-proposal.md#membership-reach-and-visibility-are-separate) and [messaging boundary](design/2026-09-16-messaging-capability-contract.md).
86
+
87
+ Roster membership is not a live process or a responsive session. Retirement may leave provider-side records or incomplete cleanup; inspect the actual outcome rather than promising aliases disappear.
88
+
89
+ ## Runtime and work-target contracts
90
+
91
+ The selected runtime owns its normal model/authentication/profile mechanisms. OATS supplies complete composed resources, task, work selection and retained execution authority; it does not copy or repair credentials or enable permission bypass merely because a session is unattended.
92
+
93
+ Pi, Claude Code and Codex have version/profile-specific support. Claude Code and Codex retain normal native context and permissions; strict selected Pi execution has its own verified profile limits. Tmux and Herdr are backend choices, not soul identities. A source can support several realizations without every combination being qualified.
94
+
95
+ The work target is independent of source publication and knowledge placement. Preserve the selected work-mode discipline and ownership. Unsupported required lifecycle, wake, plugin or recovery behavior must remain explicit, not be replaced with an easier hidden profile. See [execution targets](execution-targets.md) and the [release notes](release-notes/v0.24.0.md).
96
+
97
+ ## Kernel briefings versus operational capabilities
98
+
99
+ The kernel owns only what describes the layout it creates: the `instance-boundary` briefing (home versus `work/`), the selected work-mode briefing and config-declared injections. Knowing how to *operate* OATS (status, spawn, retire, soul discovery) and how to *configure* it (workspaces, packages, trust) is capability content — accepted as the official capabilities `oats.core` (explicit default on every soul, removable) and `oats.setup` (held by the onboarding-created `oats-setup-expert`). At the0.24 baseline those skills are still kernel-shipped; see the [workspace guide](workspaces.md#how-a-soul-knows-oats-accepted-direction-not-yet-shipped) and the adoption plan's distribution packages.
100
+
101
+ ## Capture and knowledge are separate
102
+
103
+ The native turn record is an evidence substrate, not accepted knowledge or a compulsory fourth fundamental slot. A capability decides which evidence it consumes and how it judges it. Source attribution, before-read custody and incomplete-outcome handling remain necessary wherever those guarantees are promised.
104
+
105
+ A successful capture is not a completed judgment; completed judgment is not accepted Git knowledge. Source loss or retirement must not erase pending obligations or make an uncertain record complete. See [the record package](../packages/record/README.md) and the relevant versioned lifecycle contracts.
106
+
107
+ ## Replaceability without invented readiness
108
+
109
+ A capability boundary is useful when implementations can differ without a new kernel-owned version of their behavior. But:
110
+
111
+ - Two stores within OKF are not proof of a genuinely different knowledge model.
112
+ - Schema validation is not native authority, provider readiness or learning.
113
+ - A working old configuration does not prove compatibility with a new captured profile.
114
+ - Workspace membership does not select every capability a member exports.
115
+ - Published primitives and documentation do not constitute a completed deployment.
303
116
 
304
- The provider decides how the bundle becomes a running agent. It knows
305
- nothing of tmux; the **platform** (today tmux: session, window, working
306
- directory) is a separate module with launch, alive, stop, and list. The
307
- handle is recorded in `instance.json` with a kind; the existing `tmux` field
308
- is kept beside it.
309
-
310
- A provider declares which runtime packages the active capabilities require
311
- of it and verifies them before launch; it never installs them. A provider
312
- without a filesystem receives the bundle as a document rather than files;
313
- how is open.
314
-
315
- **Test.** Pi and Claude Code behind one interface with `spawnInstance` free of
316
- runtime names, proven by the golden fixtures (step 1). A hosted provider is
317
- the second real implementation and is not built until one asks.
318
-
319
- ## The soul store contract (proposed)
320
-
321
- **Shipped.** Souls live under `agents/` (committed) or `local-agents/`
322
- (never committed) at a scope, and capability packages may ship souls under
323
- `agents:` in their manifest. Three lookups find them; instance homes live in
324
- the soul-owning repository's primary checkout.
325
-
326
- **Contract.** A store lists souls, finds one by name, and says where its
327
- instances live. The filesystem is the single implementation; a package and a
328
- provider registry are the candidates that would prove the contract.
329
- Separating the store from the work target is what removes the repository
330
- from the architecture: today one path decides who the soul is, where its
331
- knowledge lives, and what it works on.
332
-
333
- **Test.** A soul found through a second store, instantiated with the same
334
- bundle.
335
-
336
- ## The work target contract
337
-
338
- **Shipped.** Five modes decide what `<instance-home>/work` is and what
339
- discipline the instance follows: `worktree` (an isolated branch), `checkout`
340
- (the shared current branch), `attached` (another instance's tree),
341
- `workspace` (the whole team scope, read-only), plus explicit `directory`
342
- (instance-owned non-Git execution for independent workers). A config may run a
343
- setup script inside each fresh worktree. Retirement preserves ordinary work,
344
- quarantines incomplete cleanup, and never removes a shared tree. The
345
- generated instructions state the home/work boundary before the mode block.
346
-
347
- **Contract.** The work target is a parameter of instantiation independent of
348
- where the soul is stored. Each mode is a module that prepares the view,
349
- states its discipline, and knows how to retire it safely, with the
350
- retirement baseline and inspection alongside. The four Git/context modes retain
351
- their existing semantics; directory execution never acts as an implicit fallback.
352
-
353
- **Proposed.** An additional target, `none`, for instances that operate on nothing
354
- (a mail-only agent). It replaces no mode.
355
-
356
- **Test.** An instance of one soul spawned with each target, the same soul
357
- files throughout.
358
-
359
- ## The package contract
360
-
361
- **Shipped, and not touched by the migration.** Acquisition, exact version and
362
- commit, payload and artifact integrity, dependency closure, executable trust,
363
- and transactional restore; see [packages](packages.md),
364
- [capabilities](capabilities.md), and the
365
- [package-engine contract](design/package-engine-contract.md).
366
-
367
- **Proposed.** A package may also ship soul types.
368
-
369
- ## The replaceability test, summarized
370
-
371
- | Contract | Implementations today | Second implementation |
372
- | --- | --- | --- |
373
- | Knowledge | `oats.okf` | plain Markdown or wiki |
374
- | Tasks | `oats.jira`, `oats.linear` | beads, GitHub Issues |
375
- | Communication | `oats.aweb` | Slack bridge, A2A gateway |
376
- | Capture | `packages/record`, OKF notes | either alone |
377
- | Runtime provider | Pi, Claude Code (entangled) | a hosted provider |
378
- | Soul store | filesystem | package, provider registry |
379
- | Work target | worktree, checkout, attached, workspace | `none` |
380
-
381
- Where only one implementation exists, the contract is still a description of
382
- that one; those rows are the work.
117
+ Use the same kernel contracts, preserve declared requirements and verify the specific supported profile. New generic authority or schema semantics require an explicit decision rather than an undocumented bypass.
@@ -0,0 +1,84 @@
1
+ # The official OATS marketplace
2
+
3
+ The marketplace is the reviewed [package-catalog.json](../package-catalog.json)
4
+ list in [awebai/oats](https://github.com/awebai/oats), not a separate registry
5
+ service. **A package listed there is official.** A name, logo, repository owner
6
+ or workspace membership alone does not make a package official.
7
+
8
+ ## Find and use packages
9
+
10
+ - Browse the catalog for the kernel/source version you use. Each package entry
11
+ identifies its repository, release ref and payload root; capability aliases
12
+ can point to the package that supplies them.
13
+ - Today, `oats install <capability-or-package-id>` resolves official short names
14
+ through the CLI's catalog. For example, `oats install oats.okf --dir /absolute/scope`
15
+ selects the listed package; it does not enroll a team or adopt
16
+ the publisher's workspace. See [package operations](packages.md).
17
+ - The Desktop marketplace view/search is **planned for the parity phase**, not
18
+ shipped by this policy or by OATS 0.24. There is no new marketplace CLI verb.
19
+ - **Discoverable ≠ installed ≠ approved.** Acquisition and exact locking are
20
+ separate from capability selection and per-capability executable approval.
21
+ Official status never grants trust, credentials or permission to run code.
22
+ - Listing also does not prove that every harness, provider combination or
23
+ deployment profile is supported. Check the package's declared compatibility,
24
+ requirements and current readiness limits.
25
+
26
+ ## How a package becomes official
27
+
28
+ 1. Publish a source-complete release and open a PR to `package-catalog.json` in
29
+ `awebai/oats`, giving the package's URL, immutable tag ref and payload path.
30
+ 2. Include evidence for the acceptance criteria below. External packages go
31
+ through the same process as packages maintained in the OATS repositories.
32
+ 3. An OATS maintainer reviews the entry, its exact release and trust posture.
33
+ Officialness follows the reviewed list change, not an unmerged proposal.
34
+
35
+ ### Acceptance criteria
36
+
37
+ - **Complete source:** a valid `oats-package.json` at the declared payload root,
38
+ with all exported capabilities, instructions, skills, references and required
39
+ runtime files contained in the supported package closure.
40
+ - **Immutable release:** a real published tag resolving to the reviewed commit,
41
+ with reproducible payload/integrity evidence. Do not list a floating branch,
42
+ invent a future ref or move an already published tag.
43
+ - **Valid declarations:** capability manifests validate against the supported
44
+ schema and state truthful identities, compatibility and requirements.
45
+ - **Honest execution surface:** commands, hooks, launch environment and other
46
+ executable contributions are declared accurately. Review their effects;
47
+ approval still binds to each capability's exact artifact, not its official name.
48
+ - **Maintainership:** a documented, reachable maintainer contact or maintained
49
+ issue/security-reporting route.
50
+ - **License:** clear redistribution terms for the package and its dependencies,
51
+ with required license notices included in the distributed payload.
52
+ - **No secrets:** no credentials, signing keys, tokens or private instance state;
53
+ only supported nonsecret configuration and credential references where needed.
54
+ - **No hidden prerequisites:** host/runtime requirements use the supported
55
+ manifest fields; external services, network access and operator setup/consent
56
+ are documented. Do not conceal an installation or host mutation in setup code.
57
+
58
+ Contact and license evidence may live in the package/repository documentation;
59
+ this policy does not invent new catalog or manifest fields.
60
+
61
+ ## Listed first set
62
+
63
+ - Listed capabilities: `oats.okf`, `oats.aweb`, `oats.authoring`, `oats.jira`,
64
+ `oats.linear`, `oats.dev`, `oats.knowledge-theory`, `oats.core` and `oats.setup`.
65
+ - **`oats.framework` 1.1.1** is listed at tag `oats-framework/v1.1.1` in
66
+ `awebai/oats`, payload root `oats-package`. The `oats.core`, `oats.setup` and
67
+ `oats.knowledge-theory` aliases select that distribution; package identity is
68
+ distinct from capability identity. Core supplies operation/soul guidance;
69
+ setup supplies OATS Soul Setup, configuration and package guidance.
70
+
71
+ These entries are in the current repository catalog. An older installed CLI keeps
72
+ its bundled catalog; publication here does not update that installation or rewrite
73
+ old source references, locks or tags. Follow that CLI's supported acquisition path.
74
+ The [workspace adoption guide](workspace-adoption.md) distinguishes the published
75
+ capabilities and five expert imports from the still-pending D3 setup-expert flow.
76
+ No package is silently added to an existing soul.
77
+
78
+ ## Updates, deprecation and removal
79
+
80
+ Use the same catalog PR and maintainer-review path to update, deprecate or remove
81
+ an entry. State the reason, affected releases and supported replacement or hold,
82
+ and assess existing locks/restores before changing discovery. Preserve immutable
83
+ release history. A list change is not permission to rewrite a deployment's locks,
84
+ revoke or grant local approvals, uninstall packages or delete retained resources.
package/docs/packages.md CHANGED
@@ -5,6 +5,10 @@ capabilities. It is *transport*, not the installed entity. A package is one
5
5
  `oats-package.json` at a package root that declares one or more **capabilities**
6
6
  and, optionally, one or more reference **config templates**.
7
7
 
8
+ The [official marketplace policy](official-marketplace.md) explains how packages
9
+ join the reviewed catalog and how entries are updated or removed. Discoverable,
10
+ installed and approved are separate states; a listing never grants executable trust.
11
+
8
12
  Acquisition stages the package in a temporary transaction directory, validates
9
13
  the whole selected payload, **materializes each declared capability** into
10
14
  `.agents/capabilities/installed/<id>/`, writes the exact lock, and discards the
@@ -398,7 +402,7 @@ sources; installing a kernel does not advance existing package locks:
398
402
  {
399
403
  "packages": {
400
404
  "oats.okf": { "url": "https://github.com/awebai/oats-okf.git", "ref": "v2.0.0", "path": "oats-package" },
401
- "oats.knowledge-theory": { "url": "https://github.com/awebai/oats.git", "ref": "v0.23.0", "path": "oats-package" },
405
+ "oats.framework": { "url": "https://github.com/awebai/oats.git", "ref": "oats-framework/v1.1.1", "path": "oats-package" },
402
406
  "oats.dev": { "url": "https://github.com/awebai/oats-dev.git", "ref": "v1.0.0", "path": "oats-package" }
403
407
  },
404
408
  "capabilities": { "oats.review": "oats.dev" }
@@ -423,13 +427,17 @@ npm drops the source worker soul's `CLAUDE.md -> AGENTS.md`. It must not be
423
427
  advertised as a complete local package or repaired after acquisition to evade
424
428
  integrity checks. Git transport preserves the canonical source alias.
425
429
 
426
- The optional `oats.knowledge-theory` package is a separate Git payload in this
430
+ The `oats.framework` distribution package is a separate Git payload in this
427
431
  repository's `oats-package/`, excluded from the kernel npm tarball. The catalog
428
- entry selects published framework v0.23.0, which contains package 1.0.0.
429
- The source reference patch 1.0.1 is separately available through an explicit
430
- v0.23.1 Git source after that framework tag is published. It supplies an authoring skill and
431
- `knowledge-theory-expert`, not a default knowledge-layer binding, runtime judge
432
- or OKF dependency. Acquiring it does not activate it.
432
+ entry selects the published `oats-framework/v1.1.1` tag, which exports three
433
+ capabilities: `oats.core` (day-to-day operation: `oats-operate`, `oats-souls`
434
+ and the "you run on OATS" briefing — declared explicitly on every soul by
435
+ default at creation and removable), `oats.setup` (OATS Soul Setup: `oats-config`,
436
+ `oats-packages`, `oats-workspace-setup`) and the optional `oats.knowledge-theory`
437
+ (authoring skill and `knowledge-theory-expert`). Acquire it with
438
+ `oats install oats.framework`; the capability ids also resolve through the
439
+ catalog aliases. Acquiring it does not activate anything, bind a knowledge
440
+ layer or add a runtime judge.
433
441
 
434
442
  Updating OKF v1 to v2 is a breaking capability change. Preserve existing
435
443
  knowledge and source state/cursors, explicitly bind/provision external owners,
@@ -0,0 +1,17 @@
1
+ # OATS v0.24.1 — workspace adoption, public inspection, captured custody on the home route
2
+
3
+ Kernel/Pi/Desktop **0.24.1**. Publication is not deployment; every operator still installs, approves and qualifies locally.
4
+
5
+ ## What changed
6
+
7
+ - **Framework repository joins the Git workspace model.** `oats-workspace.yaml` (workspace `oats-development`, seven intended members) and `oats.yaml` (exports: transitional `souls/oats-expert` edition, `oats-package`, `capabilities/oats-authoring`) are published at the repository root. Member indexes are on `main` in oats-okf, oats-aweb, oats-authoring and oats-jira. Membership is discovery, not activation; `imports` stay empty until sources are pinned at reviewed revisions.
8
+ - **`oats inspect --request <absolute-json> [--json]`** — read-only inspection of a source/workspace/member through the existing onboarding facade. Metadata only: provider payloads and adoption values are omitted, no deployment state or approval is touched, captured selectors are refused.
9
+ - **Captured custody on the home-only session route.** `oats session inspect|input --home H` now applies the existing captured incarnation/custody checks for captured homes and refuses before any transport when the home was replaced (integrity drift). Non-captured homes are unchanged. This is the route the aweb broker uses.
10
+ - **OKF 2.1.1 pairing.** The mirror, `package-catalog.json` ref and the transitional soul's source pin `oats.okf@v2.1.1`: ordinary Claude/Codex helpers with a complete approved capability closure are accepted by the OKF consumer; strict Pi still requires an explicit model and the sole-OKF profile.
11
+ - **Official marketplace policy** — `docs/official-marketplace.md`: the reviewed `package-catalog.json` list *is* the official marketplace; listing is by maintainer-reviewed PR; discoverable ≠ installed ≠ approved.
12
+ - **Kernel setup skill removed.** `skills/oats-portable-setup` is deleted on the human's instruction; setup guidance moves to the planned `oats.setup` capability (see the [decision](https://github.com/awebai/oats/blob/main/agents/oats-expert/soul/knowledge/decisions/official-capabilities-oats-core-setup-and-marketplace.md)).
13
+ - Docs: `docs/workspaces.md`, `docs/workspace-adoption.md`, condensed `docs/layers.md`, `docs/design/README.md` navigation, program board.
14
+
15
+ ## Not in this cut
16
+
17
+ `oats.core` / `oats.setup` capabilities, explicit default `oats.core` on soul creation, `oats-setup-expert` onboarding, the five expert soul editions, the aweb portable adapter (aweb 1.10.3 still has no binding interface) and Desktop marketplace views are in progress — see the [program board](../design/2026-09-20-redesign-program-board.md).