@awebai/oats 0.25.8 → 0.26.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 (185) hide show
  1. package/README.md +8 -6
  2. package/bin/oats.mjs +576 -1714
  3. package/capabilities/oats-authoring/oats-package.json +2 -2
  4. package/capabilities/oats-authoring/oats.json +2 -2
  5. package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +46 -25
  6. package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +13 -6
  7. package/capabilities/oats-aweb/bin/oats-aweb.mjs +334 -72
  8. package/capabilities/oats-aweb/injects/aweb.md +7 -2
  9. package/capabilities/oats-aweb/lib/binding-wire.mjs +107 -5
  10. package/capabilities/oats-aweb/lib/captured-native.mjs +1 -1
  11. package/capabilities/oats-aweb/lib/grant-custody.mjs +38 -0
  12. package/capabilities/oats-aweb/oats.json +14 -4
  13. package/capabilities/oats-jira/bin/oats-jira.mjs +4 -4
  14. package/capabilities/oats-jira/oats.json +2 -2
  15. package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +6 -3
  16. package/capabilities/oats-linear/bin/oats-linear-hook.mjs +6 -4
  17. package/capabilities/oats-linear/oats.json +2 -2
  18. package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +6 -0
  19. package/capabilities/oats-okf/bin/oats-okf.mjs +1 -1
  20. package/capabilities/oats-okf/lib/binding-wire.mjs +1 -1
  21. package/capabilities/oats-okf/lib/migration.mjs +2 -2
  22. package/capabilities/oats-okf/lib/sources.mjs +5 -4
  23. package/capabilities/oats-okf/lib/stores.mjs +40 -9
  24. package/capabilities/oats-okf/lib/worker.mjs +3 -3
  25. package/capabilities/oats-okf/oats.json +1 -1
  26. package/capabilities/oats-review/oats.json +3 -2
  27. package/docs/capabilities.md +218 -47
  28. package/docs/capability-manifest.schema.json +13 -4
  29. package/docs/configuration.md +17 -5
  30. package/docs/conventions.md +16 -26
  31. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +1 -1
  32. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +3 -3
  33. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +2 -2
  34. package/docs/design/2026-09-15-portable-souls-handoff.md +2 -2
  35. package/docs/design/2026-09-15-portable-souls-implementation.md +1 -1
  36. package/docs/design/2026-09-20-redesign-program-board.md +2 -2
  37. package/docs/design/2026-09-23-workspace-module-contracts.md +1 -1
  38. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +1 -1
  39. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +54 -10
  40. package/docs/design/2026-09-24-phase-d-plan.md +77 -0
  41. package/docs/design/2026-09-25-teams-contract.md +226 -0
  42. package/docs/design/README.md +3 -3
  43. package/docs/design/launch-configurations.md +20 -16
  44. package/docs/design/operations-contract.md +27 -10
  45. package/docs/desktop-cli-api.md +546 -264
  46. package/docs/desktop-instance-start.md +1 -1
  47. package/docs/desktop.md +7 -13
  48. package/docs/execution-targets.md +16 -18
  49. package/docs/first-team.md +14 -17
  50. package/docs/implementation.md +28 -59
  51. package/docs/integrations.md +88 -32
  52. package/docs/knowledge-capability-authoring.md +1 -1
  53. package/docs/knowledge-reference/package-craft.md +10 -8
  54. package/docs/knowledge-theory.md +1 -1
  55. package/docs/knowledge.md +10 -11
  56. package/docs/layers.md +16 -17
  57. package/docs/oats-local.schema.json +29 -1
  58. package/docs/oats-membership.schema.json +5 -3
  59. package/docs/oats-package.schema.json +2 -2
  60. package/docs/oats-workspace.schema.json +1 -1
  61. package/docs/{official-marketplace.md → official-catalog.md} +15 -16
  62. package/docs/packages.md +75 -52
  63. package/docs/release-notes/v0.22.0.md +1 -1
  64. package/docs/release-notes/v0.23.1.md +1 -1
  65. package/docs/release-notes/v0.25.9.md +23 -0
  66. package/docs/release-notes/v0.26.0.md +670 -0
  67. package/docs/schedules.md +48 -126
  68. package/docs/soul.schema.json +11 -4
  69. package/docs/souls-and-instances.md +56 -43
  70. package/docs/workspaces.md +80 -58
  71. package/injects/instance-boundary.md +1 -1
  72. package/injects/work-attached.md +1 -1
  73. package/injects/work-workspace.md +2 -2
  74. package/lib/{portable-files.mjs → bounded-read.mjs} +6 -6
  75. package/lib/{portable-values.mjs → canonical-json.mjs} +3 -12
  76. package/lib/capability-contract.mjs +110 -0
  77. package/lib/config-data.mjs +2 -2
  78. package/lib/core.mjs +700 -4824
  79. package/lib/digest.mjs +12 -0
  80. package/lib/instance-inspect.mjs +396 -0
  81. package/lib/instance-lifecycle.mjs +3 -4
  82. package/lib/instance-resolution.mjs +212 -26
  83. package/lib/instruction-composition.mjs +0 -20
  84. package/lib/materialize.mjs +6 -4
  85. package/lib/operator-dispatch.mjs +33 -13
  86. package/lib/packages.mjs +25 -190
  87. package/lib/provider-binding.mjs +4 -2
  88. package/lib/provider-reasons.mjs +3 -68
  89. package/lib/resolve.mjs +204 -68
  90. package/lib/schedule.mjs +97 -272
  91. package/lib/servers.mjs +13 -13
  92. package/lib/{portable-shape.mjs → shape.mjs} +4 -3
  93. package/lib/tree-copy.mjs +44 -0
  94. package/lib/workspace.mjs +125 -20
  95. package/package-catalog.json +7 -7
  96. package/package.json +1 -1
  97. package/skills/integration-authoring/SKILL.md +48 -40
  98. package/skills/oats-getting-started/SKILL.md +105 -110
  99. package/skills/oats-support/SKILL.md +2 -2
  100. package/skills/soul-craft/SKILL.md +13 -6
  101. package/bin/oats-pi-sdk-host.mjs +0 -17
  102. package/docs/2026-09-03-architecture-proposal.md +0 -642
  103. package/docs/artifact-approvals.schema.json +0 -7
  104. package/docs/captured-invocation-context.schema.json +0 -7
  105. package/docs/captured-resolution.schema.json +0 -7
  106. package/docs/design/package-engine-contract.md +0 -813
  107. package/docs/design/package-runtime-api.md +0 -588
  108. package/docs/desktop-succession.md +0 -57
  109. package/docs/execution-capsule.schema.json +0 -108
  110. package/docs/first-team-demo.md +0 -92
  111. package/docs/knowledge-migration.md +0 -147
  112. package/docs/migration-from-oas.md +0 -103
  113. package/docs/oats-config.schema.json +0 -172
  114. package/docs/oats-lock-v3.schema.json +0 -7
  115. package/docs/oats-lock.schema.json +0 -175
  116. package/docs/operating-team-migration.md +0 -470
  117. package/docs/portable.schema.json +0 -2512
  118. package/docs/provider-check-input.schema.json +0 -7
  119. package/docs/rebuild-to-v2.md +0 -511
  120. package/docs/workspace-adoption.md +0 -74
  121. package/injects/framework-workspace.md +0 -7
  122. package/injects/local-soul.md +0 -19
  123. package/injects/oats-portable.md +0 -20
  124. package/injects/oats.md +0 -11
  125. package/injects/portable-instance-boundary.md +0 -39
  126. package/injects/portable-work-directory.md +0 -29
  127. package/lib/artifact-approvals.mjs +0 -120
  128. package/lib/artifact-tree.mjs +0 -141
  129. package/lib/capability-artifacts.mjs +0 -179
  130. package/lib/capability-execution.mjs +0 -15
  131. package/lib/capability-inputs.mjs +0 -39
  132. package/lib/capability-provenance.mjs +0 -231
  133. package/lib/captured-action-shape.mjs +0 -21
  134. package/lib/captured-admission-shape.mjs +0 -20
  135. package/lib/captured-binding-file.mjs +0 -36
  136. package/lib/captured-dispatch.mjs +0 -66
  137. package/lib/captured-instance-index.mjs +0 -277
  138. package/lib/captured-invocation-context.mjs +0 -130
  139. package/lib/captured-launch-request.mjs +0 -66
  140. package/lib/captured-operation-process.mjs +0 -15
  141. package/lib/captured-pi-custody.mjs +0 -29
  142. package/lib/captured-pi-host.mjs +0 -167
  143. package/lib/captured-pi-outcome.mjs +0 -172
  144. package/lib/captured-resolutions.mjs +0 -275
  145. package/lib/captured-scaffold.mjs +0 -87
  146. package/lib/captured-selector.mjs +0 -28
  147. package/lib/captured-session-backend.mjs +0 -52
  148. package/lib/captured-source-receipt-file.mjs +0 -72
  149. package/lib/helper-injection-policy.mjs +0 -104
  150. package/lib/legacy-lock-codec.mjs +0 -106
  151. package/lib/manifest-settings.mjs +0 -84
  152. package/lib/package-closure.mjs +0 -48
  153. package/lib/package-materialization.mjs +0 -83
  154. package/lib/pi-sdk-host.mjs +0 -229
  155. package/lib/portable-artifacts.mjs +0 -115
  156. package/lib/portable-choices.mjs +0 -82
  157. package/lib/portable-composition.mjs +0 -136
  158. package/lib/portable-digest.mjs +0 -105
  159. package/lib/portable-identity.mjs +0 -40
  160. package/lib/portable-lock.mjs +0 -117
  161. package/lib/portable-onboarding-request.mjs +0 -49
  162. package/lib/portable-onboarding.mjs +0 -256
  163. package/lib/portable-package-preparation.mjs +0 -188
  164. package/lib/portable-policy.mjs +0 -44
  165. package/lib/portable-soul.mjs +0 -42
  166. package/lib/portable-state.mjs +0 -80
  167. package/lib/prepare-composition.mjs +0 -170
  168. package/lib/prepared-bindings.mjs +0 -92
  169. package/lib/prepared-resources.mjs +0 -127
  170. package/lib/provider-binding-broker.mjs +0 -65
  171. package/lib/provider-binding-wire.mjs +0 -116
  172. package/lib/readiness.mjs +0 -225
  173. package/lib/repository-observation.mjs +0 -226
  174. package/lib/resolution-shape.mjs +0 -393
  175. package/lib/schedule-capsule.mjs +0 -206
  176. package/lib/soul-constraints.mjs +0 -40
  177. package/lib/source-projection.mjs +0 -84
  178. package/lib/source-spec.mjs +0 -189
  179. package/lib/workspace-definition.mjs +0 -126
  180. package/lib/workspace-discovery.mjs +0 -146
  181. package/skills/oats/SKILL.md +0 -162
  182. package/skills/oats-config/SKILL.md +0 -164
  183. package/skills/oats-packages/SKILL.md +0 -184
  184. package/skills/oats-portable/SKILL.md +0 -115
  185. package/skills/oats-portable-artifacts/SKILL.md +0 -63
package/docs/knowledge.md CHANGED
@@ -5,8 +5,7 @@ For the canonical design, defaults and alternatives, start with
5
5
  an operational guide to the version-scoped OKF implementation below, not a universal
6
6
  knowledge layout or learning policy. The default direction is centralised per-soul
7
7
  knowledge; other capabilities may provide different procedures and placements,
8
- including co-location, without writing into immutable captured artifacts. For the
9
- newer captured path, also read the [0.24 release scope](release-notes/v0.24.0.md).
8
+ including co-location, without writing into a home's read-only module copies.
10
9
 
11
10
  Specialization is accumulated judgment: decisions and rationale, rejected
12
11
  alternatives, discovered limits, and maintained context that changes what a
@@ -22,7 +21,6 @@ are optional author resources, not mandatory runtime policy.
22
21
  > the published OATS >=0.23.0 kernel. Framework v0.23.1 integrates its catalog
23
22
  > and mirror; publishing packages does not activate or deploy them automatically.
24
23
  > See [release notes](release-notes/v0.23.1.md).
25
- > V1 soul-contained knowledge needs [explicit migration](knowledge-migration.md).
26
24
 
27
25
  ## What lives where
28
26
 
@@ -52,7 +50,7 @@ Acquire the catalog Git payload; do not install a copied npm mirror as a local
52
50
  package or repair missing aliases in installed artifacts.
53
51
 
54
52
  Under the 0.25 workspace model OKF is a **package**: pin it once in the
55
- workspace file, let `oats sync` lock and approve it, and let every soul that
53
+ workspace file, let `oats sync` resolve, verify and lock it, and let every soul that
56
54
  fills the knowledge slot say (or inherit) `oats.okf: { from: package }`.
57
55
  Operator-level `oats okf` commands run from the deployment directory with
58
56
  `--soul <name>` (an explicit `--soul` does not override an invoking instance's
@@ -80,7 +78,7 @@ settings:
80
78
  ```
81
79
 
82
80
  ```bash
83
- oats sync # resolves v2.1.3 to a commit, asks executable approval once
81
+ oats sync # resolves v2.1.3 to a commit, verifies its integrity, writes the lock
84
82
  oats spawn domain-expert --preview --json # the exact oats.okf module (package, version, commit) + settings.oats.okf (the merged payload)
85
83
  ```
86
84
 
@@ -90,7 +88,7 @@ bindable — it may carry **only** the four settings below (`bindings-file`,
90
88
  `state-dir`, `harvest-runtime`, `harvest-model`); `owns`/`reads`/`root` on the
91
89
  soul payload are refused by 2.1.3, not read. The lock stays exact until the
92
90
  workspace bumps `packages.oats.okf`; v1 operators must plan migration before
93
- that bump. Executable changes come with a new version and a new approval. A
91
+ that bump. Executable changes come with a new version, reviewed as a new pin. A
94
92
  service worker need not itself fill the knowledge slot (`knowledge: none`).
95
93
 
96
94
  ### Bindings document
@@ -180,13 +178,14 @@ oats okf init --base project --nodes /absolute/config/project-nodes.json --outpu
180
178
 
181
179
  These run **before any instance exists**. Outside an instance home the kernel
182
180
  resolves `oats okf … --soul <name>` exactly as `oats spawn <name>` would
183
- (discover → resolve → the soul's `oats.okf` module at its locked, approved
184
- commit), fetches that module into the deployment's module store
181
+ (discover → resolve → the soul's `oats.okf` module at its locked commit and
182
+ integrity), fetches that module into the deployment's module store
185
183
  (`<deployment>/.oats/modules/oats.okf@<commit12>/`) and dispatches to that copy
186
184
  with the soul's merged payload as `OATS_SETTINGS`; `--soul` is required
187
185
  (`E_BAD_ARGS` names it) unless the namespace's capability is a workspace
188
- default. It never runs "the newest instance's copy" and never an unapproved
189
- cache read (`E_PACKAGE_UNAPPROVED` until `oats sync` approves the version).
186
+ default. It never runs "the newest instance's copy" and never a cache read the
187
+ lock does not pin (`E_PACKAGE_MISSING` until `oats sync` locks the declared
188
+ version; drifted content is `E_PACKAGE_INTEGRITY`).
190
189
  *0.25.0 still answers `E_CAPABILITY_INACTIVE` here (the operator-level dispatch
191
190
  lands in 0.25.1); the interim is to run the module binary directly with
192
191
  `OATS_SETTINGS` and `OATS_CLI_BIN` set, as the tarball smoke does.*
@@ -375,7 +374,7 @@ is unknown, inspect the worker session before retrying. See the
375
374
  [standalone runtime guide](https://github.com/awebai/oats-okf#independent-worker-and-completion)
376
375
  for exact recovery, adoption and lock-release procedures.
377
376
 
378
- ## Without a knowledge integration
377
+ ## Without a knowledge capability
379
378
 
380
379
  `capabilities.layers.knowledge: none` is valid. The kernel creates no OKF state,
381
380
  notes, bundle or harvest flow. Other capabilities may adopt, adapt or replace
package/docs/layers.md CHANGED
@@ -12,7 +12,7 @@ Git workspace definition
12
12
  ├── supplies bounded defaults and provider declarations
13
13
  └── imports exported souls by source reference and revision
14
14
  └── soul declares requirements, defaults and software sources
15
- └── preparation resolves and retains an approved composition
15
+ └── resolution pins and records an exact composition
16
16
  └── instance runs against an independent work target
17
17
  ├── knowledge capability
18
18
  ├── messaging capability
@@ -38,31 +38,30 @@ Classic `kind`/`type`/`repo` declarations and config-targeted agent types are a
38
38
  - `oats-membership.yaml` is a repository's half of the handshake: the workspace backlink plus an optional default team label. Everything under `souls/` and `capabilities/` is discoverable by convention (`private: true` opts out); there are no export lists.
39
39
  - Membership requires compatible observations on both sides; folder adjacency or a copied declaration is not admission.
40
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.
41
+ - Operator choices and workspace defaults must respect source requirements. Git read access is not write permission, a trust declaration or messaging enrollment.
42
42
 
43
43
  The [workspace guide](workspaces.md) explains these boundaries and the [declaration contract](design/2026-09-15-portable-declarations.md) defines their versioned forms.
44
44
 
45
45
  ## Capability manifest and lifecycle events
46
46
 
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.
47
+ A capability's `oats.json` declares its identity, an optional `layer` field (which names the core capability it is, if any), 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 capability or workspace.
48
48
 
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:
49
+ The current [manifest schema](capability-manifest.schema.json) includes the published binding interface. A manifest shape alone does not certify its implementation:
50
50
 
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.
51
+ - A core capability declares normalize/bind/check binding phases; readiness runs its `check` (the kernel relays its answer without implementing its domain model).
52
+ - Commands/hooks execute only from a declared source (a member, or a package the workspace declares, at its locked commit and integrity).
53
+ - `helperInjection` and hook `inputs` are accepted and ignored since 0.26 (they served the removed captured path).
54
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.
56
55
 
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).
56
+ Use [capability details](capabilities.md) and the [provider wire](design/2026-09-16-provider-binding-wire.md).
58
57
 
59
- ## The three fundamental slots
58
+ ## The three core capabilities
60
59
 
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.
60
+ Knowledge, messaging and tasks are the **core capabilities**: at most one of each per soul, each filling its own slot. `none` is an explicit permitted choice only where requirements allow it; it empties that slot. Other capabilities are unlimited and nonexclusive; the three core capabilities do not limit domain tools or workflows.
62
61
 
63
62
  ### The knowledge contract
64
63
 
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.
64
+ The kernel supplies selection, retained identity/resources, exact locking, 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
65
 
67
66
  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
67
 
@@ -72,7 +71,7 @@ Alternatives may choose different placement or learning procedures. A supported
72
71
 
73
72
  ### The tasks contract
74
73
 
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.
74
+ The tasks core capability 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 tasks capabilities; none is mandatory when source requirements permit `none`.
76
75
 
77
76
  Messaging is conversation, not automatically task state. Accepted knowledge may explain a decision or important situation without duplicating the tracker.
78
77
 
@@ -80,7 +79,7 @@ Messaging is conversation, not automatically task state. Accepted knowledge may
80
79
 
81
80
  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
81
 
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 (1.11.2, OATS >=0.24.4, is code-identical and declares its fixed reasons and `helperInjection: omit`): `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.
82
+ aweb 1.10.3 supports its setup/lifecycle path but lacks the provider-binding interface. **aweb 1.11.0** (OATS >=0.24.2) adds it (1.11.2, OATS >=0.24.4, is code-identical and declares its fixed reasons and `helperInjection: omit`): `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
83
 
85
84
  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
85
 
@@ -96,11 +95,11 @@ The work target is independent of source publication and knowledge placement. Pr
96
95
 
97
96
  ## Kernel briefings versus operational capabilities
98
97
 
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, approval) is capability content — the official capabilities `oats.core` (a workspace default via `defaults.capabilities`, removable per soul with `off`) and `oats.setup` (held by an onboarding expert), both provided by the `oats.framework` package; see [souls and instances](souls-and-instances.md#oats-operational-knowledge-is-a-capability).
98
+ 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, the lock) is capability content — the official capabilities `oats.core` (a workspace default via `defaults.capabilities`, removable per soul with `off`) and `oats.setup` (held by an onboarding expert), both provided by the `oats.framework` package; see [souls and instances](souls-and-instances.md#oats-operational-knowledge-is-a-capability).
100
99
 
101
100
  ## Capture and knowledge are separate
102
101
 
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.
102
+ The native turn record is an evidence substrate, not accepted knowledge or a compulsory fourth core capability. 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
103
 
105
104
  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
105
 
@@ -110,7 +109,7 @@ A capability boundary is useful when implementations can differ without a new ke
110
109
 
111
110
  - Two stores within OKF are not proof of a genuinely different knowledge model.
112
111
  - Schema validation is not native authority, provider readiness or learning.
113
- - A working old configuration does not prove compatibility with a new captured profile.
112
+ - A working old configuration does not prove compatibility with a new profile.
114
113
  - Workspace membership does not select every capability a member exports.
115
114
  - Published primitives and documentation do not constitute a completed deployment.
116
115
 
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://oats.dev/schemas/local-v2.json",
4
4
  "title": "Deployment-local overrides v2 (oats-local.yaml)",
5
- "description": "The operator's side of a workspace: which workspace this machine realizes, where member clones live when not at the taught convention, host-owned capability settings (absolute paths belong HERE, never in the workspace file), and souls disabled on this machine. Never shared through Git.",
5
+ "description": "The operator's side of a workspace: which workspace this machine realizes, where member clones live when not at the taught convention, host-owned capability settings (absolute paths belong HERE, never in the workspace file), souls disabled on this machine, and the named launch configurations this host offers. Never shared through Git.",
6
6
  "type": "object",
7
7
  "required": ["schemaVersion", "workspace"],
8
8
  "additionalProperties": false,
@@ -35,6 +35,34 @@
35
35
  },
36
36
  "description": "<capability>: { <key>: <value> } host-owned values the manifests ask for."
37
37
  },
38
+ "launch-configs": {
39
+ "type": "object",
40
+ "description": "Named ways to start a harness on this host, independent of any soul (lead decision 2: a spawn-time host choice). Selected by name at spawn or session start/restart; explicit flags override its fields. Written by `oats launch-config set|remove`.",
41
+ "propertyNames": { "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$" },
42
+ "additionalProperties": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": ["runtime"],
46
+ "properties": {
47
+ "runtime": { "type": "string", "enum": ["pi", "claude", "codex"], "description": "The harness family this configuration starts; it decides the kernel's own baseline arguments (skills, instructions, task) and how model/yolo are expressed." },
48
+ "executable": { "type": "string", "minLength": 1, "description": "The program to run instead of the runtime's default binary: a bare name is looked up on PATH on the execution host; a path containing a slash is resolved against the deployment directory (where this oats-local.yaml lives) when relative. Checked to exist and be executable before any start; never executed just to probe it." },
49
+ "args": { "type": "array", "items": { "type": "string" }, "description": "Extra arguments, each passed literally (no shell interpretation): native configuration files or profiles go here as ordinary arguments." },
50
+ "env": {
51
+ "type": "object",
52
+ "propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" },
53
+ "additionalProperties": {
54
+ "oneOf": [
55
+ { "type": "string" },
56
+ { "type": "object", "additionalProperties": false, "required": ["fromEnv"], "properties": { "fromEnv": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" } } }
57
+ ]
58
+ },
59
+ "description": "Environment for the harness. A string is a literal (non-secret by contract; still redacted in every answer). {fromEnv: NAME} is resolved from the execution host's environment at start time; the reference, never the value, is recorded. A missing reference refuses the start before anything stops."
60
+ },
61
+ "model": { "type": "string", "minLength": 1, "description": "Model for this configuration's runtime; overrides the soul default when this configuration is selected." },
62
+ "yolo": { "type": "boolean", "description": "Permission bypass for this configuration; overrides scope and soul defaults when selected." }
63
+ }
64
+ }
65
+ },
38
66
  "souls": {
39
67
  "type": "object",
40
68
  "additionalProperties": false,
@@ -15,9 +15,11 @@
15
15
  "description": "Repo ref of the workspace host, without revision."
16
16
  },
17
17
  "team": {
18
- "type": "string",
19
- "pattern": "^[a-z0-9][a-z0-9._-]*$",
20
- "description": "Default team label for souls and capabilities in this repo that carry no `team:` of their own."
18
+ "anyOf": [
19
+ { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$" },
20
+ { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$" } }
21
+ ],
22
+ "description": "Default team label, or a non-empty list of distinct labels (the first is the primary), for souls in this repo that carry no `team:` of their own. A capability without its own `team:` is listed under the primary."
21
23
  }
22
24
  }
23
25
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://oats.dev/schemas/oats-package.schema.json",
4
4
  "title": "OATS distribution package manifest (oats-package.json)",
5
- "description": "Manifest at a distribution-package root. A package is the source, dependency, integrity, review and atomic-update unit — it is TRANSPORT, not the installed entity. Acquisition stages the package in a temporary transaction directory, validates the whole selected payload, MATERIALIZES each declared capability into .agents/capabilities/installed/<id>/, writes the exact lock, and discards staging; there is no persistent package store. Every package must therefore export at least one capability, and each capability entry must name a DEDICATED capability root whose declared paths and symlinks all resolve inside it, so the materialized artifact is self-contained, independently hashable and independently trustable. Config templates are optional package SOURCE MATERIAL, never installed behavior: `oats install` applies none of them. Install never ambiently loads undeclared files.",
5
+ "description": "Manifest at a distribution-package root. A package is the source, dependency, integrity, review and atomic-update unit — it is TRANSPORT, not the installed entity. A workspace declares it in `packages:`; `oats sync` resolves it to a commit, verifies its integrity and locks it, and each spawn copies the capabilities a soul selects into that instance's home; there is no persistent package store. Every package must therefore export at least one capability, and each capability entry must name a DEDICATED capability root whose declared paths and symlinks all resolve inside it, so the copied artifact is self-contained and independently hashable. Config templates are optional package SOURCE MATERIAL, never applied behavior; nothing ambiently loads undeclared files.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "package",
@@ -54,7 +54,7 @@
54
54
  "uniqueItems": true
55
55
  },
56
56
  "configTemplates": {
57
- "description": "Named config TEMPLATES: complete reference oats-config.yaml files an adopter may explicitly adopt with `oats init --package`. A template is a recommended starting point that becomes ordinary local policy on adoption — adopters may change every copied setting, and package updates never rewrite an adopted config. Templates must stay portable: no secret, credential, account, machine path or provider-local ID. Installation applies none of them. This is the canonical spelling; a manifest may not carry both this and the legacy `configs`.",
57
+ "description": "Named config TEMPLATES: complete reference oats-config.yaml files of the classic line, whose adoption verb is removed under the workspace model. A template is a recommended starting point that becomes ordinary local policy on adoption — adopters may change every copied setting, and package updates never rewrite an adopted config. Templates must stay portable: no secret, credential, account, machine path or provider-local ID. Installation applies none of them. This is the canonical spelling; a manifest may not carry both this and the legacy `configs`.",
58
58
  "type": "object",
59
59
  "propertyNames": {
60
60
  "pattern": "^[a-z0-9][a-z0-9._-]*$"
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "messaging": {
38
38
  "type": "object",
39
- "description": "Opaque provider payload consumed by the messaging-slot capability. May carry byTeam: { <team label>: <payload> } — the kernel merges base ⊕ byTeam[soul.team] and strips byTeam before the provider sees it (decision 23).",
39
+ "description": "Opaque provider payload consumed by the messaging core capability. May carry byTeam: { <team label>: <payload> } — the kernel merges base ⊕ byTeam[soul.team] and strips byTeam before the provider sees it (decision 23).",
40
40
  "properties": {
41
41
  "byTeam": {
42
42
  "type": "object",
@@ -1,6 +1,6 @@
1
- # The official OATS marketplace
1
+ # The official OATS catalog
2
2
 
3
- The marketplace is the reviewed [package-catalog.json](../package-catalog.json)
3
+ The official catalog is the reviewed [package-catalog.json](../package-catalog.json)
4
4
  list in [awebai/oats](https://github.com/awebai/oats), not a separate registry
5
5
  service. **A package listed there is official.** A name, logo, repository owner
6
6
  or workspace membership alone does not make a package official.
@@ -12,15 +12,16 @@ or workspace membership alone does not make a package official.
12
12
  can point to the package that supplies them.
13
13
  - A workspace pins an official package by **bare version** in its
14
14
  `packages:` map (`oats.okf: v2.1.3`); `oats sync` resolves it through the
15
- catalog to an exact commit, locks it and asks for executable approval once
16
- per version. A package outside the catalog is written `git:<repo>@<ref>`.
15
+ catalog to an exact commit, fetches it, verifies its integrity and locks it.
16
+ A package outside the catalog is written `git:<repo>@<ref>`.
17
17
  Pinning does not enroll a team or adopt the publisher's workspace. See
18
18
  [packages](packages.md).
19
- - The Desktop marketplace view/search is **planned for the parity phase**, not
20
- shipped by this policy or by OATS 0.24. There is no new marketplace CLI verb.
21
- - **Discoverable ≠ pinned ≠ approved.** A catalog listing grants nothing; a
22
- `packages:` pin selects a version; the lock's per-version approval is what
23
- lets its executables run. Nothing is installed.
19
+ - The Desktop catalog view/search is **planned for the parity phase**, not
20
+ shipped by this policy. There is no catalog CLI verb.
21
+ - **Discoverable ≠ declared.** A catalog listing grants nothing; a
22
+ `packages:` pin is the workspace's decision to trust that package at that
23
+ version, and the lock pins it to an exact commit and integrity. Nothing is
24
+ installed.
24
25
  Official status never grants trust, credentials or permission to run code.
25
26
  - Listing also does not prove that every harness, provider combination or
26
27
  deployment profile is supported. Check the package's declared compatibility,
@@ -46,8 +47,9 @@ or workspace membership alone does not make a package official.
46
47
  - **Valid declarations:** capability manifests validate against the supported
47
48
  schema and state truthful identities, compatibility and requirements.
48
49
  - **Honest execution surface:** commands, hooks, launch environment and other
49
- executable contributions are declared accurately. Review their effects;
50
- approval still binds to each capability's exact artifact, not its official name.
50
+ executable contributions are declared accurately. Review their effects: a
51
+ workspace that declares the package trusts exactly the locked version, not
52
+ its official name.
51
53
  - **Maintainership:** a documented, reachable maintainer contact or maintained
52
54
  issue/security-reporting route.
53
55
  - **License:** clear redistribution terms for the package and its dependencies,
@@ -73,10 +75,7 @@ this policy does not invent new catalog or manifest fields.
73
75
 
74
76
  These entries are in the current repository catalog. An older installed CLI keeps
75
77
  its bundled catalog; publication here does not update that installation or rewrite
76
- old source references, locks or tags. Follow that CLI's supported acquisition path.
77
- The [workspace adoption guide](workspace-adoption.md) distinguishes the published
78
- capabilities and five expert imports from the still-pending D3 setup-expert flow.
79
- No package is silently added to an existing soul.
78
+ locks or tags. No package is silently added to an existing workspace.
80
79
 
81
80
  ## Updates, deprecation and removal
82
81
 
@@ -84,4 +83,4 @@ Use the same catalog PR and maintainer-review path to update, deprecate or remov
84
83
  an entry. State the reason, affected releases and supported replacement or hold,
85
84
  and assess existing locks/restores before changing discovery. Preserve immutable
86
85
  release history. A list change is not permission to rewrite a deployment's locks,
87
- revoke or grant local approvals, uninstall packages or delete retained resources.
86
+ change what a workspace declares, uninstall packages or delete retained resources.
package/docs/packages.md CHANGED
@@ -4,12 +4,11 @@ A **package** is a place to fetch capabilities from *with a version attached*.
4
4
  It is one of the two kinds of capability source in the
5
5
  [workspace model](workspaces.md); the other — a member repo — is never
6
6
  versioned. Nothing is installed: a package is resolved to an exact commit by
7
- `oats sync`, recorded in `oats-lock.json`, approved once per version, and
8
- **copied whole into each instance at spawn** (`<home>/.oats/modules/<cap>/`).
7
+ `oats sync`, recorded in `oats-lock.json`, and **copied whole into each instance at spawn** (`<home>/.oats/modules/<cap>/`).
9
8
 
10
9
  Ground truth: [`oats-package.schema.json`](oats-package.schema.json) (the
11
- package manifest), [`oats-lock-v3.schema.json`](oats-lock-v3.schema.json) (the
12
- lock), and the module contract
10
+ package manifest), the [lock v3 format](#lock-v3) below (`validateLock` in
11
+ `lib/packages.mjs` is its authority; it has no JSON schema), and the module contract
13
12
  [design/2026-09-23-workspace-module-contracts.md §4](design/2026-09-23-workspace-module-contracts.md).
14
13
 
15
14
  ## What a package is
@@ -24,7 +23,7 @@ A Git repository **contains** a package at `oats-package/`:
24
23
  ├── acme-lint/oats.json # ordinary capability manifests (docs/capabilities.md)
25
24
  └── acme-deploy/
26
25
  ├── oats.json
27
- └── bin/acme-deploy.mjs # an executable → approved once per version
26
+ └── bin/acme-deploy.mjs # an executable — trusted by declaring the package
28
27
  ```
29
28
 
30
29
  `oats-package.json` must declare `package` and `capabilities` (a list of
@@ -52,14 +51,44 @@ packages:
52
51
  named by `OATS_PACKAGE_CATALOG` — which supplies the repo url, the tag
53
52
  convention (`v2.1.3` or `oats-framework/v1.1.3`) and the payload path. An id
54
53
  the catalog does not know is `E_PACKAGE_MISSING` ("use `git:<repo>@<ref>` for
55
- a package outside the catalog"). The catalog is the reviewed marketplace
56
- ([official-marketplace.md](official-marketplace.md)) and the only way a
54
+ a package outside the catalog"). The catalog is the reviewed official list
55
+ ([official-catalog.md](official-catalog.md)) and the only way a
57
56
  package becomes pinnable *by id*.
58
57
  - **`git:<repo>@<ref>`**: `<repo>` is any repo ref the kernel understands
59
58
  (`github.com/org/repo`, `https://…`, `git@host:…`, `/abs/bare.git`,
60
59
  `file:///…`); `<ref>` is a tag name or a full 40-hex commit. The package is
61
60
  read at `oats-package/`.
62
61
 
62
+ A whole workspace file pinning the current official packages — its bare
63
+ versions are kept equal to `package-catalog.json` by
64
+ `test/docs-catalog-pins.test.mjs`, so a catalog pin round updates this example
65
+ in the same change:
66
+
67
+ <!-- catalog-pins -->
68
+ ```yaml
69
+ schemaVersion: 2
70
+ name: acme
71
+ members:
72
+ - git:github.com/acme/agents
73
+ - git:github.com/acme/platform
74
+ packages:
75
+ oats.framework: v1.1.3
76
+ oats.okf: v2.1.5
77
+ oats.aweb: v1.13.1
78
+ teams:
79
+ global: { description: Org-wide }
80
+ engineering: { description: Platform }
81
+ defaults:
82
+ capabilities: { oats.core: { from: package } }
83
+ knowledge: { oats.okf: { from: package } }
84
+ messaging: { oats.aweb: { from: package } }
85
+ tasks: none
86
+ stores:
87
+ org: git:github.com/acme/knowledge
88
+ messaging:
89
+ private: per-human
90
+ ```
91
+
63
92
  There is no third form; `lib/packages.mjs#classifyPackageValue` is the one
64
93
  grammar, used by workspace validation and by `sync`. A `<ref>` (or catalog ref)
65
94
  that resolves to a **branch** is refused: `E_PACKAGE_INTEGRITY { why: "branch" }`
@@ -75,15 +104,12 @@ decision recorded in the lock.
75
104
  $ oats sync
76
105
  workspace acme (github.com/acme/agents @ 3f2a9c1e)
77
106
  members agents ✓↔ (@ 3f2a9c1e) platform ✓↔ (@ 77c0a1b2) tools ✓↔ (@ 47f4b816) billing ✗ (no-backlink)
78
- packages acme.tools 0.4.0 ✓ (approval needed) oats.framework 1.1.3 ✓ (approved) oats.okf 2.1.3 ✓ (approved)
107
+ packages acme.tools 0.4.0 ✓ (@ 47f4b816) oats.framework 1.1.3 ✓ (@ 9c3e27aa) oats.okf 2.1.3 ✓ (@ b2e16f2e)
79
108
  changed acme.tools — → 0.4.0 (@ 47f4b816)
80
- souls 7 discovered (6 members, 1 external, 0 disabled here) · 1 private (platform-reviewer, platform only)
109
+ souls 7 discovered (6 members, 1 external, 0 disabled here) · 0 private capabilities
81
110
  teams engineering 4 souls, 3 capabilities · global 2 souls, 2 capabilities · unassigned 1 soul
82
111
 
83
- acme.tools 0.4.0 @ 47f4b816 needs executable approval (2 executables, digest sha256-7923…):
84
- acme-deploy: command apply → bin/acme-deploy.mjs
85
- acme-deploy: command plan → bin/acme-deploy.mjs
86
- approve acme.tools 0.4.0? [y/N]
112
+ lock oats-lock.json
87
113
  ```
88
114
 
89
115
  `sync` (run from the deployment — where `oats-local.yaml` is, or `--dir`):
@@ -94,19 +120,15 @@ approve acme.tools 0.4.0? [y/N]
94
120
  and records `url`, `path`, `version`, `commit`, `integrity`, `capabilities`;
95
121
  3. for an entry already locked at the same version/source/path: the commit must
96
122
  be unchanged (else `E_PACKAGE_INTEGRITY` — "the tag moved; a version string
97
- must change when its content does"), the integrity must match, and a
98
- recorded approval must still describe the package's executables (else
99
- `E_PACKAGE_UNAPPROVED` — approve again);
100
- 4. for every unapproved entry, prints the exact executables (every `commands.*`
101
- target and every `hooks.*.command` target of every capability manifest —
102
- hooks run unattended at spawn/retire) and asks **once** on a terminal;
103
- 5. writes `oats-lock.json` and reports the diff. Entries dropped from
123
+ must change when its content does") and the integrity must match
124
+ (`E_PACKAGE_INTEGRITY`);
125
+ 4. writes `oats-lock.json` and reports the diff. Entries dropped from
104
126
  `packages:` are dropped from the lock.
105
127
 
106
- Exit status `2` means the lock is written but approvals are pending
107
- (non-interactive, or declined). Spawns of souls using an unapproved package are
108
- refused (`E_PACKAGE_UNAPPROVED`) until `oats sync` is run in a terminal and the
109
- approval given. `--json` emits the `syncApi: 1` envelope documented in
128
+ There is **no approval step** (human decision, 2026-09-24): declaring a package
129
+ in the workspace's `packages:` is the trust decision, so `sync` asks nothing,
130
+ exits `0` on success, and `--approve` is `E_BAD_ARGS`. `--json` emits the
131
+ `syncApi: 1` envelope documented in
110
132
  [desktop-cli-api.md](desktop-cli-api.md#workspace-model-workspaceapi-2).
111
133
 
112
134
  ## `oats package add | remove`
@@ -128,7 +150,7 @@ machine. Nothing network-bound happens in `package add`; `sync` resolves.
128
150
  ## Lock v3
129
151
 
130
152
  `oats-lock.json` lives beside `oats-local.yaml`. Two operators who synced the
131
- same workspace commit and approved the same versions hold identical locks.
153
+ same workspace commit hold identical locks.
132
154
 
133
155
  ```json
134
156
  {
@@ -141,8 +163,7 @@ same workspace commit and approved the same versions hold identical locks.
141
163
  "version": "2.1.3",
142
164
  "commit": "b2e16f2ea1555be519db76fda30cd0bea06f8609",
143
165
  "integrity": "sha256-1c34dbe9c1cc3826dbe6ecbafbd9a1e189ed36a74bfb2ba8fb6f46a382e95c2d",
144
- "capabilities": ["oats.okf"],
145
- "approved": { "executables": "sha256-0d7615fa…", "at": "2026-09-24T09:02:11.000Z" }
166
+ "capabilities": ["oats.okf"]
146
167
  },
147
168
  "acme.tools": {
148
169
  "source": "git:github.com/acme/tools@v0.4.0",
@@ -151,8 +172,7 @@ same workspace commit and approved the same versions hold identical locks.
151
172
  "version": "0.4.0",
152
173
  "commit": "47f4b81660e4cc9701d373088de52462762585a3",
153
174
  "integrity": "sha256-4cd126a7…",
154
- "capabilities": ["acme-deploy", "acme-lint"],
155
- "approved": null
175
+ "capabilities": ["acme-deploy", "acme-lint"]
156
176
  }
157
177
  }
158
178
  }
@@ -167,28 +187,27 @@ same workspace commit and approved the same versions hold identical locks.
167
187
  | `commit` | full 40-hex OID the version resolved to |
168
188
  | `integrity` | `sha256-<hex>` content digest of the package tree at `path` |
169
189
  | `capabilities` | the capability names the package provides (sorted) — what `from: package` looks up |
170
- | `approved` | `{ executables: "sha256-<hex>", at }` — the digest of the approved executables — or `null` |
171
190
 
172
191
  A capability provided by **two** locked packages is ambiguous and fails
173
192
  closed (`E_PACKAGE_MISSING { ambiguous: [ids] }`): keep one of them in
174
193
  `packages:`. A lock that is not v3 (a 0.24 lock, an unreadable file) is
175
- `E_LOCK_SCHEMA`; it is never auto-repaired — delete it and `oats sync`. Agents
176
- never hand-edit the lock.
177
-
178
- ## Approval
179
-
180
- Member capabilities are trusted by membership; **package executables are
181
- approved once per version**, and every instance that materializes that version
182
- inherits the approval. What is approved is a digest over the bytes of every
183
- executable a manifest can make the kernel run — `commands.*` targets and
184
- `hooks.*.command` targets — in canonical order; a hook object without
185
- `command` is `E_PACKAGE_MANIFEST`, never an invisible no-op. Skills, injects
186
- and other files are covered by `integrity`, not by the approval.
187
-
188
- The approval lives next to the commit it approved. A new version starts
189
- unapproved; a moved tag fails integrity and asks again; an approval whose digest
190
- no longer matches the tree is refused. `oats spawn` re-checks `approved` on the
191
- way to `from: package`: reaching materialization means approved.
194
+ `E_LOCK_SCHEMA`; it is never auto-repaired — delete it and `oats sync`. A v3
195
+ lock written before 0.26.0 may carry an `approved` record per entry: it is read
196
+ with the field ignored, and the next write drops it. The reverse does not hold:
197
+ a kernel before 0.26.0 refuses a lock 0.26.0 wrote (`E_LOCK_SCHEMA "approved:
198
+ must be null or { executables, at }"`) — keep every kernel that reads one
199
+ deployment on 0.26.0 or later. Agents never hand-edit the lock.
200
+
201
+ ## Trust
202
+
203
+ Member capabilities are trusted by membership; **a package is trusted by its
204
+ declaration in the workspace's `packages:`** (human decision, 2026-09-24) —
205
+ people install a package only when they trust it, so there is no second,
206
+ per-version approval step. The lock is reproducibility, not approval: it pins
207
+ the exact commit and the content integrity, a moved tag or drifted content is
208
+ `E_PACKAGE_INTEGRITY`, and at spawn the lock's capability list must match what
209
+ the package declares at the locked commit (`E_PACKAGE_INTEGRITY { why:
210
+ "capabilities" }`).
192
211
 
193
212
  ## Materialization from a package
194
213
 
@@ -214,6 +233,10 @@ Checked at resolution against the locked version (`E_COMPATIBILITY`,
214
233
  naming capability, package, version and range). A package pinned by OID has no
215
234
  version to check (`why: "unversioned"`): pin a tagged version.
216
235
 
236
+ Separately, each capability's own `compatibility.oats` (its manifest's kernel
237
+ range) must admit the running kernel, for package and member capabilities
238
+ alike (`E_CAPABILITY_INCOMPATIBLE`); see [capabilities.md](capabilities.md).
239
+
217
240
  ## Publishing a package from a member repo
218
241
 
219
242
  A repo can be a **member** of the workspace **and** publish a package; the two
@@ -230,10 +253,10 @@ roles never collapse (see [workspaces.md](workspaces.md#member-tier-vs-package-t
230
253
  plus `acme-tools-dev: { from: here }`.
231
254
  3. Tag a release (`v0.4.0`). Tags are immutable: a new content needs a new tag.
232
255
  4. Consumers pin it: `oats package add acme.tools git:github.com/acme/tools@v0.4.0`
233
- → commit → `oats sync` → approve once. Discovery shows the member row with
256
+ → commit → `oats sync`. Discovery shows the member row with
234
257
  `publishes: { package: "acme.tools", version: "0.4.0" }`.
235
258
  5. To become pinnable by id, open a PR adding the package to
236
- `package-catalog.json` in the `oats` repo ([official-marketplace.md](official-marketplace.md)).
259
+ `package-catalog.json` in the `oats` repo ([official-catalog.md](official-catalog.md)).
237
260
 
238
261
  A soul that names one of the package's capabilities with
239
262
  `from: github.com/acme/tools` fails: `E_CAPABILITY_MISSING` with the hint
@@ -243,7 +266,7 @@ A soul that names one of the package's capabilities with
243
266
 
244
267
  ```json
245
268
  {
246
- "policy": "docs/official-marketplace.md",
269
+ "policy": "docs/official-catalog.md",
247
270
  "packages": {
248
271
  "oats.okf": { "url": "https://github.com/awebai/oats-okf.git", "ref": "v2.1.3", "path": "oats-package" },
249
272
  "oats.framework": { "url": "https://github.com/awebai/oats.git", "ref": "oats-framework/v1.1.3", "path": "oats-package" }
@@ -253,7 +276,7 @@ A soul that names one of the package's capabilities with
253
276
 
254
277
  `ref` carries the tag convention: a workspace's `oats.framework: v1.2.0`
255
278
  resolves to tag `oats-framework/v1.2.0`. Resolving through the catalog never
256
- grants approval and never advances a lock by itself — `oats sync` does, and
279
+ advances a lock by itself — `oats sync` does, and
257
280
  says so.
258
281
 
259
282
  ## Removed verbs
@@ -264,4 +287,4 @@ replacement (`details.removed` / `details.replacement` in `--json`). There is
264
287
  no installed-capability directory, no config template adoption, no host
265
288
  requirement installer. A manifest's `requires` still describes what must exist
266
289
  on the host (runtime packages are verified at spawn; host commands are the
267
- operator's to install). See [rebuild-to-v2.md](rebuild-to-v2.md).
290
+ operator's to install).
@@ -31,7 +31,7 @@ files), the `oas:` config key, and capability ids, then the guided package
31
31
  conversion, so the scope ends on `lockfileVersion: 2` official packages.
32
32
  Any failure restores the original OAS bytes; a second run is a no-op.
33
33
  Executable trust is re-earned after conversion. See
34
- [docs/migration-from-oas.md](../migration-from-oas.md).
34
+ [docs/migration-from-oas.md](https://github.com/awebai/oats/blob/v0.22.0/docs/migration-from-oas.md).
35
35
 
36
36
  Un-migrated OAS scopes are also **loud** now: `oats doctor` names them with
37
37
  the remedy, and every `oats migrate` form exits nonzero instead of
@@ -74,7 +74,7 @@ must stay synchronized. Acquisition alone activates nothing.
74
74
 
75
75
  ## Migration and verification
76
76
 
77
- Follow [the v1 preservation and cutover guide](../knowledge-migration.md):
77
+ Follow [the v1 preservation and cutover guide](https://github.com/awebai/oats/blob/v0.23.1/docs/knowledge-migration.md):
78
78
  inventory active writers, preserve legacy knowledge/state/cursors, provision
79
79
  empty owned nodes, stage and deliver through the provider, confirm acceptance,
80
80
  then deliberately cut over owner declarations and existing sources. Old
@@ -0,0 +1,23 @@
1
+ # OATS 0.25.9
2
+
3
+ A pins-only patch: the kernel is unchanged since 0.25.8.
4
+
5
+ ## Updated
6
+
7
+ - **`oats.aweb` 1.12.1** (catalog pin + bundled copy; #145). The messaging
8
+ root is explicit: `settings.oats.aweb.root` / `roots[team]` in
9
+ `oats-local.yaml`. On a workspace-model deployment it defaults to the
10
+ deployment directory and is never searched for upward. Error texts name the
11
+ workspace-model remedies. In local mode an instance gets `AWEB_IDENTITY_HOME`,
12
+ so `aw` works from any directory. `binding-check` answers
13
+ `needs-configuration` before spawn, with one problem per missing item (no
14
+ messaging root; no team), and an unmapped workspace team label fails the spawn
15
+ closed instead of inheriting the root's active team.
16
+ - **`oats.okf` 2.1.5** (catalog pin + bundled copy; #148).
17
+ - Every configured base must be usable at spawn. A shallow base is refused
18
+ with `E_BASE_SHALLOW`; clone, fetch and checkout failures are
19
+ `E_BASE_UNAVAILABLE` naming the alias, repository, step and reason, never a
20
+ raw `ETIMEDOUT`.
21
+ - A missing `OATS_SOUL` is `E_OATS_SOUL_MISSING`; there's no fallback to the
22
+ home's soul link.
23
+ - Refusing an owner rename names both souls and both remedies.