@awebai/oats 0.25.9 → 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.
- package/README.md +8 -6
- package/bin/oats.mjs +576 -1714
- package/capabilities/oats-authoring/oats-package.json +2 -2
- package/capabilities/oats-authoring/oats.json +2 -2
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +46 -25
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +13 -6
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +279 -93
- package/capabilities/oats-aweb/injects/aweb.md +7 -2
- package/capabilities/oats-aweb/lib/binding-wire.mjs +89 -13
- package/capabilities/oats-aweb/lib/captured-native.mjs +1 -1
- package/capabilities/oats-aweb/lib/grant-custody.mjs +38 -0
- package/capabilities/oats-aweb/oats.json +8 -4
- package/capabilities/oats-jira/bin/oats-jira.mjs +4 -4
- package/capabilities/oats-jira/oats.json +2 -2
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +6 -3
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +6 -4
- package/capabilities/oats-linear/oats.json +2 -2
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +6 -0
- package/capabilities/oats-review/oats.json +3 -2
- package/docs/capabilities.md +218 -47
- package/docs/capability-manifest.schema.json +13 -4
- package/docs/configuration.md +17 -5
- package/docs/conventions.md +16 -26
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +1 -1
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +3 -3
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +2 -2
- package/docs/design/2026-09-15-portable-souls-handoff.md +2 -2
- package/docs/design/2026-09-15-portable-souls-implementation.md +1 -1
- package/docs/design/2026-09-20-redesign-program-board.md +2 -2
- package/docs/design/2026-09-23-workspace-module-contracts.md +1 -1
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +1 -1
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +34 -1
- package/docs/design/2026-09-24-phase-d-plan.md +57 -0
- package/docs/design/2026-09-25-teams-contract.md +226 -0
- package/docs/design/README.md +3 -3
- package/docs/design/launch-configurations.md +20 -16
- package/docs/design/operations-contract.md +27 -10
- package/docs/desktop-cli-api.md +537 -261
- package/docs/desktop-instance-start.md +1 -1
- package/docs/desktop.md +7 -13
- package/docs/execution-targets.md +16 -18
- package/docs/first-team.md +14 -17
- package/docs/implementation.md +28 -59
- package/docs/integrations.md +64 -33
- package/docs/knowledge-capability-authoring.md +1 -1
- package/docs/knowledge-reference/package-craft.md +10 -8
- package/docs/knowledge-theory.md +1 -1
- package/docs/knowledge.md +10 -11
- package/docs/layers.md +16 -17
- package/docs/oats-local.schema.json +29 -1
- package/docs/oats-membership.schema.json +5 -3
- package/docs/oats-package.schema.json +2 -2
- package/docs/oats-workspace.schema.json +1 -1
- package/docs/{official-marketplace.md → official-catalog.md} +15 -16
- package/docs/packages.md +75 -52
- package/docs/release-notes/v0.22.0.md +1 -1
- package/docs/release-notes/v0.23.1.md +1 -1
- package/docs/release-notes/v0.26.0.md +670 -0
- package/docs/schedules.md +48 -126
- package/docs/soul.schema.json +11 -4
- package/docs/souls-and-instances.md +56 -43
- package/docs/workspaces.md +80 -58
- package/injects/instance-boundary.md +1 -1
- package/injects/work-attached.md +1 -1
- package/injects/work-workspace.md +2 -2
- package/lib/{portable-files.mjs → bounded-read.mjs} +6 -6
- package/lib/{portable-values.mjs → canonical-json.mjs} +3 -12
- package/lib/capability-contract.mjs +110 -0
- package/lib/config-data.mjs +2 -2
- package/lib/core.mjs +700 -4824
- package/lib/digest.mjs +12 -0
- package/lib/instance-inspect.mjs +396 -0
- package/lib/instance-lifecycle.mjs +3 -4
- package/lib/instance-resolution.mjs +212 -26
- package/lib/instruction-composition.mjs +0 -20
- package/lib/materialize.mjs +6 -4
- package/lib/operator-dispatch.mjs +33 -13
- package/lib/packages.mjs +25 -190
- package/lib/provider-binding.mjs +4 -2
- package/lib/provider-reasons.mjs +3 -68
- package/lib/resolve.mjs +204 -68
- package/lib/schedule.mjs +97 -272
- package/lib/servers.mjs +13 -13
- package/lib/{portable-shape.mjs → shape.mjs} +4 -3
- package/lib/tree-copy.mjs +44 -0
- package/lib/workspace.mjs +125 -20
- package/package-catalog.json +6 -6
- package/package.json +1 -1
- package/skills/integration-authoring/SKILL.md +48 -40
- package/skills/oats-getting-started/SKILL.md +105 -110
- package/skills/oats-support/SKILL.md +2 -2
- package/skills/soul-craft/SKILL.md +13 -6
- package/bin/oats-pi-sdk-host.mjs +0 -17
- package/docs/2026-09-03-architecture-proposal.md +0 -642
- package/docs/artifact-approvals.schema.json +0 -7
- package/docs/captured-invocation-context.schema.json +0 -7
- package/docs/captured-resolution.schema.json +0 -7
- package/docs/design/package-engine-contract.md +0 -813
- package/docs/design/package-runtime-api.md +0 -588
- package/docs/desktop-succession.md +0 -57
- package/docs/execution-capsule.schema.json +0 -108
- package/docs/first-team-demo.md +0 -92
- package/docs/knowledge-migration.md +0 -147
- package/docs/migration-from-oas.md +0 -103
- package/docs/oats-config.schema.json +0 -172
- package/docs/oats-lock-v3.schema.json +0 -7
- package/docs/oats-lock.schema.json +0 -175
- package/docs/operating-team-migration.md +0 -470
- package/docs/portable.schema.json +0 -2512
- package/docs/provider-check-input.schema.json +0 -7
- package/docs/rebuild-to-v2.md +0 -511
- package/docs/workspace-adoption.md +0 -74
- package/injects/framework-workspace.md +0 -7
- package/injects/local-soul.md +0 -19
- package/injects/oats-portable.md +0 -20
- package/injects/oats.md +0 -11
- package/injects/portable-instance-boundary.md +0 -39
- package/injects/portable-work-directory.md +0 -29
- package/lib/artifact-approvals.mjs +0 -120
- package/lib/artifact-tree.mjs +0 -141
- package/lib/capability-artifacts.mjs +0 -179
- package/lib/capability-execution.mjs +0 -15
- package/lib/capability-inputs.mjs +0 -39
- package/lib/capability-provenance.mjs +0 -231
- package/lib/captured-action-shape.mjs +0 -21
- package/lib/captured-admission-shape.mjs +0 -20
- package/lib/captured-binding-file.mjs +0 -36
- package/lib/captured-dispatch.mjs +0 -66
- package/lib/captured-instance-index.mjs +0 -277
- package/lib/captured-invocation-context.mjs +0 -130
- package/lib/captured-launch-request.mjs +0 -66
- package/lib/captured-operation-process.mjs +0 -15
- package/lib/captured-pi-custody.mjs +0 -29
- package/lib/captured-pi-host.mjs +0 -167
- package/lib/captured-pi-outcome.mjs +0 -172
- package/lib/captured-resolutions.mjs +0 -275
- package/lib/captured-scaffold.mjs +0 -87
- package/lib/captured-selector.mjs +0 -28
- package/lib/captured-session-backend.mjs +0 -52
- package/lib/captured-source-receipt-file.mjs +0 -72
- package/lib/helper-injection-policy.mjs +0 -104
- package/lib/legacy-lock-codec.mjs +0 -106
- package/lib/manifest-settings.mjs +0 -84
- package/lib/package-closure.mjs +0 -48
- package/lib/package-materialization.mjs +0 -83
- package/lib/pi-sdk-host.mjs +0 -229
- package/lib/portable-artifacts.mjs +0 -115
- package/lib/portable-choices.mjs +0 -82
- package/lib/portable-composition.mjs +0 -136
- package/lib/portable-digest.mjs +0 -105
- package/lib/portable-identity.mjs +0 -40
- package/lib/portable-lock.mjs +0 -117
- package/lib/portable-onboarding-request.mjs +0 -49
- package/lib/portable-onboarding.mjs +0 -256
- package/lib/portable-package-preparation.mjs +0 -188
- package/lib/portable-policy.mjs +0 -44
- package/lib/portable-soul.mjs +0 -42
- package/lib/portable-state.mjs +0 -80
- package/lib/prepare-composition.mjs +0 -170
- package/lib/prepared-bindings.mjs +0 -92
- package/lib/prepared-resources.mjs +0 -127
- package/lib/provider-binding-broker.mjs +0 -65
- package/lib/provider-binding-wire.mjs +0 -116
- package/lib/readiness.mjs +0 -225
- package/lib/repository-observation.mjs +0 -226
- package/lib/resolution-shape.mjs +0 -393
- package/lib/schedule-capsule.mjs +0 -206
- package/lib/soul-constraints.mjs +0 -40
- package/lib/source-projection.mjs +0 -84
- package/lib/source-spec.mjs +0 -189
- package/lib/workspace-definition.mjs +0 -126
- package/lib/workspace-discovery.mjs +0 -146
- package/skills/oats/SKILL.md +0 -162
- package/skills/oats-config/SKILL.md +0 -164
- package/skills/oats-packages/SKILL.md +0 -184
- package/skills/oats-portable/SKILL.md +0 -115
- 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
|
|
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`
|
|
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,
|
|
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
|
|
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
|
|
184
|
-
|
|
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
|
|
189
|
-
|
|
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
|
|
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
|
-
└──
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
-
|
|
52
|
-
- Commands/hooks execute only
|
|
53
|
-
-
|
|
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)
|
|
56
|
+
Use [capability details](capabilities.md) and the [provider wire](design/2026-09-16-provider-binding-wire.md).
|
|
58
57
|
|
|
59
|
-
## The three
|
|
58
|
+
## The three core capabilities
|
|
60
59
|
|
|
61
|
-
Knowledge, messaging and tasks are
|
|
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,
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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),
|
|
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
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
1
|
+
# The official OATS catalog
|
|
2
2
|
|
|
3
|
-
The
|
|
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,
|
|
16
|
-
|
|
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
|
|
20
|
-
shipped by this policy
|
|
21
|
-
- **Discoverable ≠
|
|
22
|
-
`packages:` pin
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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`,
|
|
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), [
|
|
12
|
-
|
|
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
|
|
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
|
|
56
|
-
([official-
|
|
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 ✓ (
|
|
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) ·
|
|
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
|
-
|
|
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")
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
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`.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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).
|
|
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](
|
|
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](
|
|
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
|