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