@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.
Files changed (177) hide show
  1. package/README.md +8 -6
  2. package/bin/oats.mjs +576 -1714
  3. package/capabilities/oats-authoring/oats-package.json +2 -2
  4. package/capabilities/oats-authoring/oats.json +2 -2
  5. package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +46 -25
  6. package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +13 -6
  7. package/capabilities/oats-aweb/bin/oats-aweb.mjs +279 -93
  8. package/capabilities/oats-aweb/injects/aweb.md +7 -2
  9. package/capabilities/oats-aweb/lib/binding-wire.mjs +89 -13
  10. package/capabilities/oats-aweb/lib/captured-native.mjs +1 -1
  11. package/capabilities/oats-aweb/lib/grant-custody.mjs +38 -0
  12. package/capabilities/oats-aweb/oats.json +8 -4
  13. package/capabilities/oats-jira/bin/oats-jira.mjs +4 -4
  14. package/capabilities/oats-jira/oats.json +2 -2
  15. package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +6 -3
  16. package/capabilities/oats-linear/bin/oats-linear-hook.mjs +6 -4
  17. package/capabilities/oats-linear/oats.json +2 -2
  18. package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +6 -0
  19. package/capabilities/oats-review/oats.json +3 -2
  20. package/docs/capabilities.md +218 -47
  21. package/docs/capability-manifest.schema.json +13 -4
  22. package/docs/configuration.md +17 -5
  23. package/docs/conventions.md +16 -26
  24. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +1 -1
  25. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +3 -3
  26. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +2 -2
  27. package/docs/design/2026-09-15-portable-souls-handoff.md +2 -2
  28. package/docs/design/2026-09-15-portable-souls-implementation.md +1 -1
  29. package/docs/design/2026-09-20-redesign-program-board.md +2 -2
  30. package/docs/design/2026-09-23-workspace-module-contracts.md +1 -1
  31. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +1 -1
  32. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +34 -1
  33. package/docs/design/2026-09-24-phase-d-plan.md +57 -0
  34. package/docs/design/2026-09-25-teams-contract.md +226 -0
  35. package/docs/design/README.md +3 -3
  36. package/docs/design/launch-configurations.md +20 -16
  37. package/docs/design/operations-contract.md +27 -10
  38. package/docs/desktop-cli-api.md +537 -261
  39. package/docs/desktop-instance-start.md +1 -1
  40. package/docs/desktop.md +7 -13
  41. package/docs/execution-targets.md +16 -18
  42. package/docs/first-team.md +14 -17
  43. package/docs/implementation.md +28 -59
  44. package/docs/integrations.md +64 -33
  45. package/docs/knowledge-capability-authoring.md +1 -1
  46. package/docs/knowledge-reference/package-craft.md +10 -8
  47. package/docs/knowledge-theory.md +1 -1
  48. package/docs/knowledge.md +10 -11
  49. package/docs/layers.md +16 -17
  50. package/docs/oats-local.schema.json +29 -1
  51. package/docs/oats-membership.schema.json +5 -3
  52. package/docs/oats-package.schema.json +2 -2
  53. package/docs/oats-workspace.schema.json +1 -1
  54. package/docs/{official-marketplace.md → official-catalog.md} +15 -16
  55. package/docs/packages.md +75 -52
  56. package/docs/release-notes/v0.22.0.md +1 -1
  57. package/docs/release-notes/v0.23.1.md +1 -1
  58. package/docs/release-notes/v0.26.0.md +670 -0
  59. package/docs/schedules.md +48 -126
  60. package/docs/soul.schema.json +11 -4
  61. package/docs/souls-and-instances.md +56 -43
  62. package/docs/workspaces.md +80 -58
  63. package/injects/instance-boundary.md +1 -1
  64. package/injects/work-attached.md +1 -1
  65. package/injects/work-workspace.md +2 -2
  66. package/lib/{portable-files.mjs → bounded-read.mjs} +6 -6
  67. package/lib/{portable-values.mjs → canonical-json.mjs} +3 -12
  68. package/lib/capability-contract.mjs +110 -0
  69. package/lib/config-data.mjs +2 -2
  70. package/lib/core.mjs +700 -4824
  71. package/lib/digest.mjs +12 -0
  72. package/lib/instance-inspect.mjs +396 -0
  73. package/lib/instance-lifecycle.mjs +3 -4
  74. package/lib/instance-resolution.mjs +212 -26
  75. package/lib/instruction-composition.mjs +0 -20
  76. package/lib/materialize.mjs +6 -4
  77. package/lib/operator-dispatch.mjs +33 -13
  78. package/lib/packages.mjs +25 -190
  79. package/lib/provider-binding.mjs +4 -2
  80. package/lib/provider-reasons.mjs +3 -68
  81. package/lib/resolve.mjs +204 -68
  82. package/lib/schedule.mjs +97 -272
  83. package/lib/servers.mjs +13 -13
  84. package/lib/{portable-shape.mjs → shape.mjs} +4 -3
  85. package/lib/tree-copy.mjs +44 -0
  86. package/lib/workspace.mjs +125 -20
  87. package/package-catalog.json +6 -6
  88. package/package.json +1 -1
  89. package/skills/integration-authoring/SKILL.md +48 -40
  90. package/skills/oats-getting-started/SKILL.md +105 -110
  91. package/skills/oats-support/SKILL.md +2 -2
  92. package/skills/soul-craft/SKILL.md +13 -6
  93. package/bin/oats-pi-sdk-host.mjs +0 -17
  94. package/docs/2026-09-03-architecture-proposal.md +0 -642
  95. package/docs/artifact-approvals.schema.json +0 -7
  96. package/docs/captured-invocation-context.schema.json +0 -7
  97. package/docs/captured-resolution.schema.json +0 -7
  98. package/docs/design/package-engine-contract.md +0 -813
  99. package/docs/design/package-runtime-api.md +0 -588
  100. package/docs/desktop-succession.md +0 -57
  101. package/docs/execution-capsule.schema.json +0 -108
  102. package/docs/first-team-demo.md +0 -92
  103. package/docs/knowledge-migration.md +0 -147
  104. package/docs/migration-from-oas.md +0 -103
  105. package/docs/oats-config.schema.json +0 -172
  106. package/docs/oats-lock-v3.schema.json +0 -7
  107. package/docs/oats-lock.schema.json +0 -175
  108. package/docs/operating-team-migration.md +0 -470
  109. package/docs/portable.schema.json +0 -2512
  110. package/docs/provider-check-input.schema.json +0 -7
  111. package/docs/rebuild-to-v2.md +0 -511
  112. package/docs/workspace-adoption.md +0 -74
  113. package/injects/framework-workspace.md +0 -7
  114. package/injects/local-soul.md +0 -19
  115. package/injects/oats-portable.md +0 -20
  116. package/injects/oats.md +0 -11
  117. package/injects/portable-instance-boundary.md +0 -39
  118. package/injects/portable-work-directory.md +0 -29
  119. package/lib/artifact-approvals.mjs +0 -120
  120. package/lib/artifact-tree.mjs +0 -141
  121. package/lib/capability-artifacts.mjs +0 -179
  122. package/lib/capability-execution.mjs +0 -15
  123. package/lib/capability-inputs.mjs +0 -39
  124. package/lib/capability-provenance.mjs +0 -231
  125. package/lib/captured-action-shape.mjs +0 -21
  126. package/lib/captured-admission-shape.mjs +0 -20
  127. package/lib/captured-binding-file.mjs +0 -36
  128. package/lib/captured-dispatch.mjs +0 -66
  129. package/lib/captured-instance-index.mjs +0 -277
  130. package/lib/captured-invocation-context.mjs +0 -130
  131. package/lib/captured-launch-request.mjs +0 -66
  132. package/lib/captured-operation-process.mjs +0 -15
  133. package/lib/captured-pi-custody.mjs +0 -29
  134. package/lib/captured-pi-host.mjs +0 -167
  135. package/lib/captured-pi-outcome.mjs +0 -172
  136. package/lib/captured-resolutions.mjs +0 -275
  137. package/lib/captured-scaffold.mjs +0 -87
  138. package/lib/captured-selector.mjs +0 -28
  139. package/lib/captured-session-backend.mjs +0 -52
  140. package/lib/captured-source-receipt-file.mjs +0 -72
  141. package/lib/helper-injection-policy.mjs +0 -104
  142. package/lib/legacy-lock-codec.mjs +0 -106
  143. package/lib/manifest-settings.mjs +0 -84
  144. package/lib/package-closure.mjs +0 -48
  145. package/lib/package-materialization.mjs +0 -83
  146. package/lib/pi-sdk-host.mjs +0 -229
  147. package/lib/portable-artifacts.mjs +0 -115
  148. package/lib/portable-choices.mjs +0 -82
  149. package/lib/portable-composition.mjs +0 -136
  150. package/lib/portable-digest.mjs +0 -105
  151. package/lib/portable-identity.mjs +0 -40
  152. package/lib/portable-lock.mjs +0 -117
  153. package/lib/portable-onboarding-request.mjs +0 -49
  154. package/lib/portable-onboarding.mjs +0 -256
  155. package/lib/portable-package-preparation.mjs +0 -188
  156. package/lib/portable-policy.mjs +0 -44
  157. package/lib/portable-soul.mjs +0 -42
  158. package/lib/portable-state.mjs +0 -80
  159. package/lib/prepare-composition.mjs +0 -170
  160. package/lib/prepared-bindings.mjs +0 -92
  161. package/lib/prepared-resources.mjs +0 -127
  162. package/lib/provider-binding-broker.mjs +0 -65
  163. package/lib/provider-binding-wire.mjs +0 -116
  164. package/lib/readiness.mjs +0 -225
  165. package/lib/repository-observation.mjs +0 -226
  166. package/lib/resolution-shape.mjs +0 -393
  167. package/lib/schedule-capsule.mjs +0 -206
  168. package/lib/soul-constraints.mjs +0 -40
  169. package/lib/source-projection.mjs +0 -84
  170. package/lib/source-spec.mjs +0 -189
  171. package/lib/workspace-definition.mjs +0 -126
  172. package/lib/workspace-discovery.mjs +0 -146
  173. package/skills/oats/SKILL.md +0 -162
  174. package/skills/oats-config/SKILL.md +0 -164
  175. package/skills/oats-packages/SKILL.md +0 -184
  176. package/skills/oats-portable/SKILL.md +0 -115
  177. package/skills/oats-portable-artifacts/SKILL.md +0 -63
@@ -1,108 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://oats.dev/schemas/execution-capsule-v1.json",
4
- "title": "Scheduled execution capsule v1",
5
- "description": "Immutable local authority for one admitted scheduled execution. executionId identifies this intent; a canonical oats.json.v1 digest of the remaining fields separately identifies content. Structural validation does not verify freshness, the retained resolution, approval, host readiness or provider state.",
6
- "type": "object",
7
- "additionalProperties": false,
8
- "required": [
9
- "schemaVersion",
10
- "executionId",
11
- "resolution",
12
- "deployment",
13
- "action",
14
- "target",
15
- "inputRefs",
16
- "responsibleHuman"
17
- ],
18
- "properties": {
19
- "schemaVersion": {
20
- "const": 1
21
- },
22
- "executionId": {
23
- "type": "string",
24
- "minLength": 1,
25
- "maxLength": 128,
26
- "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
27
- },
28
- "resolution": {
29
- "$ref": "https://oats.dev/schemas/portable-v1.json#/$defs/ResolutionRef"
30
- },
31
- "deployment": {
32
- "type": "string",
33
- "minLength": 1
34
- },
35
- "action": {
36
- "oneOf": [
37
- {
38
- "type": "object",
39
- "additionalProperties": false,
40
- "required": ["kind", "name"],
41
- "properties": {
42
- "kind": { "const": "command" },
43
- "name": { "type": "string", "pattern": "^[^:\\s]+:[^:\\s]+$" }
44
- }
45
- },
46
- {
47
- "type": "object",
48
- "additionalProperties": false,
49
- "required": ["kind", "name"],
50
- "properties": {
51
- "kind": { "const": "wake" },
52
- "name": { "const": "session" }
53
- }
54
- }
55
- ]
56
- },
57
- "target": {
58
- "oneOf": [
59
- {
60
- "type": "object",
61
- "additionalProperties": false,
62
- "required": ["cwd", "argv"],
63
- "properties": {
64
- "cwd": { "type": "string", "minLength": 1 },
65
- "argv": {
66
- "type": "array",
67
- "minItems": 3,
68
- "items": { "type": "string" }
69
- }
70
- }
71
- },
72
- {
73
- "type": "object",
74
- "additionalProperties": false,
75
- "required": ["home", "message"],
76
- "properties": {
77
- "home": { "type": "string", "minLength": 1 },
78
- "message": { "type": "string", "minLength": 1 }
79
- }
80
- }
81
- ]
82
- },
83
- "inputRefs": {
84
- "type": "object"
85
- },
86
- "responsibleHuman": {
87
- "type": ["object", "null"]
88
- }
89
- },
90
- "allOf": [
91
- {
92
- "if": {
93
- "properties": { "action": { "type": "object", "properties": { "kind": { "const": "command" } } } }
94
- },
95
- "then": {
96
- "properties": { "target": { "type": "object", "required": ["cwd", "argv"], "properties": { "cwd": {}, "argv": {} } } }
97
- }
98
- },
99
- {
100
- "if": {
101
- "properties": { "action": { "type": "object", "properties": { "kind": { "const": "wake" } } } }
102
- },
103
- "then": {
104
- "properties": { "target": { "type": "object", "required": ["home", "message"], "properties": { "home": {}, "message": {} } } }
105
- }
106
- }
107
- ]
108
- }
@@ -1,92 +0,0 @@
1
- # First-team example: OATS working on OATS
2
-
3
- On 2026-09-05 we installed the published OATS artifacts and used Pi and
4
- Claude Code workers to fix issues found during a fresh review. The first
5
- team's work was release preparation in this repository.
6
-
7
- > **Historical v1 qualification.** The results below remain evidence for the
8
- > named versions, not the prepared v2 runtime. Current setup, external ownership
9
- > and independent delivery are in [the first-team guide](first-team.md).
10
-
11
- ## The setup
12
-
13
- | Component | Qualified value |
14
- | --- | --- |
15
- | Kernel and Pi adapter | 0.22.0, installed from npm |
16
- | Workspace config | `oats.dev` 1.0.0 default, adopted at the common workspace root |
17
- | Knowledge | `oats.okf` 1.4.1 |
18
- | Messaging | `oats.aweb` 1.8.0, bound to our existing team |
19
- | Authoring | `oats.authoring` 1.0.0 |
20
- | Worker scope | The child OATS Git repository, selected explicitly |
21
- | Harvester runtime/model | Pi, `openai-codex/gpt-5.5`, configured for this machine |
22
-
23
- Package acquisition used the published kernel's catalog and exact locks.
24
- The executable OKF and aweb capabilities were explicitly trusted.
25
- `oats doctor` passed. A separate published-authoring probe confirmed that
26
- `integration-authoring`, `skill-craft`, and `soul-craft` materialized for an
27
- authoring soul.
28
-
29
- ## Two useful tasks
30
-
31
- The **Pi documentation worker**, `docs-expert-readme-claims`, corrected a
32
- claim that all captured conversations were signed. Native transcript turns
33
- have content hashes; signed aweb messages preserve their original
34
- signatures. Its code-review handoff led to the
35
- [documentation correction](https://github.com/awebai/oats/commit/ef4a1a6599da88e213b2a6a8f3918099aa5ba984).
36
-
37
- The **Claude Code worker**, `cli-dev-lock-fix`, fixed a stream-lock race.
38
- A late contender could classify a live holder's lock as stale and enter the
39
- same critical section. The fix uses holder liveness and an ownership token;
40
- review also caught an acquisition loop that could retry filesystem errors
41
- forever. See the [initial fix](https://github.com/awebai/oats/commit/1036381)
42
- and [review correction](https://github.com/awebai/oats/commit/81735f6e936d1b6aa0a3ad62d12953d494851cc8).
43
-
44
- Both workers used isolated worktrees, committed changes, and reported
45
- through aw. Review happened before integration. Claude needed its initial
46
- folder-trust and development-channels confirmations; Pi started directly.
47
-
48
- ## What carried forward
49
-
50
- Each worker invoked OKF harvest. Its temporary harvester promoted a lesson
51
- into the source soul and committed it on the worker's branch:
52
-
53
- - [Content-addressed turn IDs do not authenticate native capture](https://github.com/awebai/oats/commit/91993a0b85db132c59c32d43ee2c90ec5569bd50).
54
- - [Lock ownership and the limits of comparing timeout thresholds](https://github.com/awebai/oats/commit/120e3474b93efc0d37f94c426327f802e27893ea).
55
-
56
- After the documentation promotion landed, the predecessor retired locally:
57
- its worktree, branch, and home were removed. Its aweb alias remained on the
58
- server despite the hook reporting success. A new Pi instance of the same
59
- soul with a different name, `docs-expert-capture-contract-check`, started a real
60
- follow-up task checking the capture contract documentation.
61
-
62
- Its first report named the promoted file:
63
- `soul/knowledge/lessons/content-addressed-turn-ids-not-authentication.md`.
64
- The worker said the lesson reinforced the distinction between unsigned
65
- native turns and preserved source signatures, and explicitly said it did
66
- not change what it was already about to do.
67
-
68
- That verifies useful work, reviewed promotion, local retirement, and a
69
- successor reading the updated soul. Remote identity retirement remains
70
- incomplete. The example does not establish a measured productivity
71
- improvement.
72
-
73
- ## What the run exposed
74
-
75
- The run found first-use problems that unit tests alone had not resolved:
76
-
77
- - A fresh scope needed `mkdir -p agents` before `oats create`; the fix is in
78
- the 0.22.1 changes.
79
- - The default harvester model assumed a provider absent on this machine.
80
- The workspace now selects an authenticated model explicitly.
81
- - All four initial worker and harvester retirements reported successful
82
- identity deletion but left their aweb aliases on the server. Local
83
- cleanup completed; remote cleanup requires a team administrator, and
84
- names cannot be reused until it succeeds. Temporary harvesters are now
85
- excluded from messaging to avoid adding aliases while this is fixed.
86
- - A combined workspace roster did not make the workspace a spawn scope for
87
- every child repository. Commands select the owning repository explicitly.
88
-
89
- The [first-team guide](first-team.md) now describes the prepared v2 setup;
90
- these historical v1 outcomes are not v2 acceptance evidence. The
91
- package owners are responsible for improving their defaults; the kernel
92
- continues to resolve capabilities through the same replaceable contracts.
@@ -1,147 +0,0 @@
1
- # Migrating OKF v1 knowledge to v2
2
-
3
- > **Prepared, not a live migration.** These instructions target oats.okf 2.0.0
4
- > with OATS >=0.23.0 and the prepared framework v0.23.1 integration. Confirm the
5
- > final standalone source tag and dependencies are published before following
6
- > the acquisition path. See [release gates](release-notes/v0.23.1.md).
7
-
8
- This is **not** `oats migrate`: kernel lock/package migration and
9
- [OAS name migration](migration-from-oas.md) do not relocate knowledge, establish
10
- v2 ownership or preserve source cursors. Nor does upgrading npm activate a new
11
- knowledge layer. V2 uses external accepted bases and independent workers, not
12
- `soul/knowledge/`, attached harvest commits or source-home watermarks.
13
-
14
- ## 1. Inventory and preserve before changing activation
15
-
16
- - Record each scope's package lock, active knowledge binding, effective settings,
17
- soul instructions/skills and current knowledge bytes. Do not hand-edit locks.
18
- - Inventory live source homes, state/log/notes, v1 current/prepared watermark
19
- files, active harvesters, unpublished commits and open PRs. Resolve or preserve
20
- in-flight work deliberately; do not run old and new writers concurrently.
21
- - Back up source material outside disposable homes/worktrees. Keep v1 artifacts
22
- available until accepted delivery, owner cutover and fresh-reader verification
23
- have succeeded. A successful scaffold or command exit is not learned expertise.
24
- - Plan the deployment interruption and test the migration on isolated copies.
25
- The required v2 spawn hook refuses a legacy `soul/knowledge/`; it never silently
26
- substitutes an empty bundle.
27
-
28
- After publication, bump `packages.oats.okf` in the workspace file and run
29
- `oats sync`: the new version resolves to a commit and its executables are
30
- approved once. An existing lock never advances by itself. Package content is
31
- read from the catalog **Git** repository, never from an npm mirror (npm drops
32
- the source worker's canonical `CLAUDE.md` symlink).
33
-
34
- ## 2. Bind and provision external destinations
35
-
36
- Follow [bindings and owner descriptors](knowledge.md#acquire-bind-and-provision-explicitly).
37
- Choose stable base IDs, stable owner IDs, nonoverlapping node paths and durable
38
- `stateDir`. `owns` routes responsibility; `reads` chooses starting context, not
39
- permissions. Confirm aliases and owners explicitly, rather than deriving them
40
- from an instance branch or name.
41
-
42
- Configure the absolute `bindings-file` **and** `state-dir` for each source soul
43
- — the oats.okf 2.1.x binding requires both as normalized absolute host paths
44
- (`setting state-dir is required (absolute host path)` is a refusal, not a
45
- default). Remove obsolete v1 settings such as `record-window-turns` and
46
- `record-window-bytes`; v2 accepts exactly `bindings-file`, `state-dir`,
47
- `harvest-runtime` and `harvest-model`. Under the 0.25 workspace model these live
48
- in `oats-local.yaml` `settings.oats.okf` ([configuration.md](configuration.md));
49
- a rebuilt deployment gets a **fresh** `state-dir`
50
- ([rebuild-to-v2.md §7b](rebuild-to-v2.md#7b-okf-2-start-a-fresh-state-dir-do-not-re-point-the-old-one)).
51
- Provision **empty owned nodes** using `oats okf init`. Accept Git initialization
52
- through a reviewed PR before migration delivery; directory provisioning requires
53
- explicit confirmation and a genuinely non-Git location.
54
-
55
- ## 3. Stage and deliver each legacy bundle
56
-
57
- From the deployment directory (the one holding `oats-local.yaml`) in an operator
58
- shell without inherited instance identity, selecting the source soul with
59
- `--soul` — the kernel resolves the command exactly as `oats spawn --soul <x>`
60
- would ([knowledge.md](knowledge.md#inspection-and-operator-commands)):
61
-
62
- ```bash
63
- oats okf migrate --legacy /absolute/soul/knowledge --base project --node expert --output /absolute/empty-migration-stage --soul domain-expert --json
64
- # Use the exact migration.json path returned above:
65
- oats okf migrate --deliver /absolute/state/migrations/UUID/migration.json --soul domain-expert --json
66
- ```
67
-
68
- Staging preserves the full original in migration custody, rewrites bundle-root
69
- Markdown links into the external node namespace and validates the whole base.
70
- The output must be disjoint from **every** configured accepted base and directory
71
- coordination artifact. The destination node must be empty; migration refuses
72
- ambiguous automatic merges.
73
-
74
- Delivery follows the actual provider protocol:
75
-
76
- - **Git:** a real PR, never a direct push to the accepted branch. Review and merge
77
- it, then repeat `migrate --deliver` to confirm merge-visible acceptance.
78
- - **Directory:** recoverable publication with a cooperative lock, baseline check,
79
- journal and validated acceptance receipt. Resolve any journal before proceeding.
80
-
81
- A staged bundle, delivered PR or proposed owner mapping is not cutover.
82
-
83
- ## 4. Deliberate owner cutover
84
-
85
- ```bash
86
- oats okf migrate --cutover /absolute/state/migrations/UUID/migration.json --soul-dir /absolute/soul --soul domain-expert --json
87
- ```
88
-
89
- Cutover requires accepted delivery, unchanged legacy bytes and current bindings
90
- still pointing to the frozen delivered base. It verifies accepted readiness,
91
- node owner/path and delivered content, then renames the old bundle into durable
92
- custody and updates `soul/okf.json`. It changes no skills and leaves no permanent
93
- knowledge symlink in the soul. Cross-device rename fails safely: arrange an
94
- explicit operator cutover rather than deleting originals to force it. An
95
- incomplete cutover marker blocks new source registration until that recorded
96
- cutover is retried.
97
-
98
- Explicitly review old soul instruction references to `soul/knowledge/`, direct
99
- promotion and after-commit harvest. Point readers to the capability-provided
100
- accepted views; ordinary agents capture but never edit accepted knowledge. This
101
- instruction review is not an automatic rewrite performed by migration.
102
-
103
- ## 5. Preserve and re-register existing sources
104
-
105
- For every surviving v1 source home:
106
-
107
- ```bash
108
- oats okf migrate --source-home /absolute/legacy-instance-home --soul domain-expert --json
109
- ```
110
-
111
- This copies allowlisted state/log/notes and old cursors into migration custody,
112
- **deleting nothing**. Old watermarks are retained as evidence, not trusted as v2
113
- processing proof. After soul migration, explicit `harvest` from that clean deployment context
114
- re-registers a source,
115
- captures visible notes and record, and idempotently verifies its per-source job:
116
-
117
- ```bash
118
- oats okf harvest --home /absolute/legacy-instance-home --no-launch --soul domain-expert --json
119
- ```
120
-
121
- `--no-launch` is a scaffold-only worker request, not a read-only operation: it
122
- captures and writes durable state/schedule definitions, but starts no model and
123
- installs no timer. Existing homes retain their composed capability snapshot;
124
- plan refresh/replacement or dispatch through the deliberately selected v2
125
- configuration context. Do not assume updating a package rewrites a running
126
- home's curriculum, trust or native session. Preserve evidence before retiring
127
- or replacing any old home. Replay may legitimately produce merge/drop judgments.
128
-
129
- ## 6. Verify before retiring old custody
130
-
131
- Inspect the durable source descriptor and its receipts. Confirm frozen owners,
132
- accepted view paths, captured notes **and full record windows**, processing and
133
- provider acceptance separately. Verify live inspection only shows the matching
134
- source's state/log/notes. After safe source retirement, `--source` inspection and
135
- read/refresh must still work from durable context; new views belong in state,
136
- not the deleted home or invoking repository.
137
-
138
- Enable a host timer only with explicit operator consent after reviewing source
139
- jobs and available worker runtimes. Existing no-launch sources cannot cause
140
- scheduled model launches; do not turn an isolated rehearsal into a deployment.
141
- A source whose final capture is incomplete must retain its home for retry.
142
-
143
- Finally start a fresh, deliberately selected runtime instance and verify it can
144
- find **and use** the accepted lesson without the original source. A no-launch
145
- reader verifies layout and links, not model learning. Only then consider old
146
- custody cleanup under an explicit retention decision; v2 does not automatically
147
- remove preserved evidence, old views, migration archives or unresolved runs.
@@ -1,103 +0,0 @@
1
- # Migrating from OAS to OATS
2
-
3
- > **0.25 status — this is a 0.22–0.24 procedure.** `oats migrate` and
4
- > `oats trust` are **removed verbs** in the 0.25 kernel (`E_UNKNOWN_COMMAND`
5
- > naming the replacement), and 0.25 reads none of the files this page
6
- > converts to (`oats-config.yaml`, `oats-lock.json` v2, the `installed/` tier).
7
- > An OAS deployment reaches 0.25 in two steps: run this page's commands with a
8
- > **0.24.x** kernel (`npm install -g @awebai/oats@0.24`), then rebuild for the
9
- > workspace model with [rebuild-to-v2.md](rebuild-to-v2.md) — which is a rewrite
10
- > of three shared files, not a conversion, so an operator comfortable with the
11
- > v2 declarations may skip straight to it and let the old files go.
12
-
13
- OATS is the successor to OAS. **OATS 0.22.0 was published on 2026-09-03**:
14
- the kernel, Pi adapter, and Desktop assets are available. The published
15
- kernel acquired the official OKF, aweb, authoring, and development packages
16
- from its catalog during the 2026-09-05 qualification. You no longer need a
17
- framework checkout to migrate.
18
-
19
- Use the migration command rather than renaming files by hand. The OATS
20
- kernel does not read `oas-*` configuration names or `oas.*` capability IDs.
21
- An unchanged agent-directory layout can make an old scope look familiar
22
- while its knowledge and messaging configuration remains unmigrated.
23
-
24
- > **Separate knowledge cutover:** OAS/package name migration does not migrate
25
- > soul knowledge, source memory or v1 watermarks to OKF v2. If the selected
26
- > catalog update acquires OKF 2.0.0, plan [knowledge preservation and cutover](knowledge-migration.md)
27
- > before activation/spawn. The v2 integration is [prepared](release-notes/v0.23.1.md),
28
- > not a claim that those dependencies or any deployment have already changed.
29
-
30
- ## Upgrade one scope (0.24.x kernel)
31
-
32
- Finish or preserve active work before changing a daily-use deployment.
33
- Install OATS **0.24.x** alongside the old CLI (the 0.25 line has no `oats
34
- migrate`), then inspect the plan for the exact scope you intend to convert:
35
-
36
- ```bash
37
- npm install -g @awebai/oats@0.24
38
- pi install npm:@awebai/oats-pi@0.24
39
- oats migrate --from-oas --dry-run --dir /path/to/scope
40
- ```
41
-
42
- Read any held or unmapped package rows before applying. A dry run reports
43
- what can be converted; it is not a guarantee that every historical package
44
- version has a supported replacement. When the plan is correct:
45
-
46
- ```bash
47
- oats migrate --from-oas --dir /path/to/scope
48
- oats doctor /path/to/scope
49
- ```
50
-
51
- Run the exact `oats trust <capability> --dir <scope>` commands printed by
52
- migration for the executable capabilities you approve (0.24: per-artifact
53
- trust; under 0.25 approval is per package version through `oats sync`). Trust
54
- does not transfer automatically. Verify the team ID and messaging membership
55
- with `oats aweb setup --dir /path/to/scope`, then exercise a real task,
56
- harvest, and retirement as described in [Run your first team](first-team.md).
57
-
58
- For a multi-repository deployment, start with one scope. The explicit
59
- `--recursive --dir /path/to/workspace` form converts every discovered OAS
60
- scope, with a separate transaction for each; it is not one transaction for
61
- the whole workspace.
62
-
63
- If you use Desktop, install [OATS Desktop](desktop.md) too. The old OAS
64
- Desktop discovers the old package name and cannot operate the new CLI.
65
- OATS Desktop 0.22.0 accepts kernel versions `>=0.22.0 <0.23.0`.
66
-
67
- ## What the command converts
68
-
69
- One transaction covers two phases within a scope:
70
-
71
- 1. Rename `oas-config.yaml` and `oas-lock.json` to their `oats-` names;
72
- convert the `oas:` defaults key and catalog-mapped capability IDs;
73
- rename installed `oas.json` manifests and soul scaffold-owner files.
74
- 2. Convert the old lock to official package lockfile version 2, acquiring
75
- the replacement artifacts and removing superseded installed directories.
76
-
77
- The catalog includes aliases for the seven OAS 0.20 capability IDs, mapping
78
- `oas.*` names to the corresponding `oats.*` packages and capabilities.
79
- Aliases guide migration; they are not runtime compatibility shims.
80
- Comments and unrelated configuration text are preserved, including old
81
- names in comments. Those comments can be updated separately.
82
-
83
- A failure in either phase restores that scope's original OAS bytes. A
84
- second successful run finds nothing to convert. `oats doctor` and migration
85
- commands identify visible OAS-named scopes and give a remedy rather than
86
- silently declaring an unmigrated deployment ready.
87
-
88
- ## Compatibility and remaining transition work
89
-
90
- The migration fixtures were built from an OAS 0.20.x deployment. OAS
91
- 0.21.x uses the same file names and configuration keys, but may lock package
92
- versions outside the OATS catalog's mapped line. Inspect the dry run before
93
- converting those scopes; do not replace an unmapped version by guessing.
94
-
95
- The old `@oas-framework/*` packages have not been deprecated as part of
96
- this rollout. Their update checks therefore do not announce the OATS
97
- rename; deprecation belongs to their maintainer. An existing OAS deployment
98
- can keep running until its own migration plan is ready. This is no longer a
99
- requirement to wait for OATS publication.
100
-
101
- See the [0.22.0 release notes](release-notes/v0.22.0.md) for the rename,
102
- package versions, and compatibility changes, and the
103
- [first-team qualification](first-team-demo.md) for historical v1 operating evidence.
@@ -1,172 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://oats.dev/schemas/oats-config.schema.json",
4
- "title": "OATS scoped configuration",
5
- "$defs": {
6
- "settings": { "type": "object", "additionalProperties": true },
7
- "binding": {
8
- "oneOf": [
9
- { "type": "boolean" },
10
- {
11
- "type": "object",
12
- "properties": {
13
- "enabled": { "type": "boolean" },
14
- "settings": { "$ref": "#/$defs/settings" }
15
- },
16
- "additionalProperties": false
17
- }
18
- ]
19
- },
20
- "injection-override": { "type": "string", "description": "Override an instruction injection: a config-relative path, none, or default. Convention: .agents/injections/…" },
21
- "capabilityTargets": {
22
- "type": "object",
23
- "properties": {
24
- "from": { "type": "string", "description": "Enforced provenance: installed | owned | path:<dir>." },
25
- "global": { "$ref": "#/$defs/binding" },
26
- "agent-types": {
27
- "oneOf": [
28
- { "type": "array", "items": { "type": "string" }, "uniqueItems": true },
29
- { "type": "object", "additionalProperties": { "$ref": "#/$defs/binding" } }
30
- ]
31
- },
32
- "souls": { "type": "object", "additionalProperties": { "$ref": "#/$defs/binding" } },
33
- "settings": { "$ref": "#/$defs/settings" },
34
- "injection-override": { "$ref": "#/$defs/injection-override" }
35
- }
36
- },
37
- "layerEntry": {
38
- "oneOf": [
39
- { "const": "none" },
40
- {
41
- "allOf": [{ "$ref": "#/$defs/capabilityTargets" }],
42
- "type": "object",
43
- "required": ["capability"],
44
- "properties": {
45
- "capability": { "type": "string" },
46
- "from": true, "global": true, "agent-types": true, "souls": true, "settings": true, "injection-override": true
47
- },
48
- "additionalProperties": false
49
- }
50
- ]
51
- },
52
- "additiveEntry": {
53
- "allOf": [{ "$ref": "#/$defs/capabilityTargets" }],
54
- "type": "object",
55
- "properties": {
56
- "from": true, "global": true, "agent-types": true, "souls": true, "settings": true, "injection-override": true
57
- },
58
- "additionalProperties": false
59
- },
60
- "workMode": {
61
- "oneOf": [
62
- { "type": "null" },
63
- {
64
- "type": "object",
65
- "properties": {
66
- "setup": { "type": "string", "description": "Env-bootstrap command run inside each new worktree after creation (path relative to this config's directory). Only worktree mode runs setup." },
67
- "retirement-disposable": { "type": "array", "items": { "type": "string" }, "description": "Relative disposable roots for worktree retirement. Directory mode has no disposable exemptions." }
68
- },
69
- "additionalProperties": false
70
- }
71
- ]
72
- }
73
- },
74
- "type": "object",
75
- "properties": {
76
- "yolo": { "type": "boolean", "description": "Skip Codex/Claude permission prompts. Closest scope wins; soul and launch overrides take precedence." },
77
- "name": { "type": "string" },
78
- "team": {
79
- "type": "object",
80
- "description": "The deployment/team boundary. Closest scope declaring team: wins; used for identity, cross-repo agent discovery (oats status --team), and messaging providers.",
81
- "properties": {
82
- "name": { "type": "string" },
83
- "id": { "type": "string", "description": "Explicit provider team id (e.g. aweb <name>:<namespace>)." }
84
- },
85
- "required": ["name"],
86
- "additionalProperties": false
87
- },
88
- "launch-configs": {
89
- "type": "object",
90
- "description": "Named ways to start a harness, independent of any soul. The closest scope declaring a name provides the whole entry (no merging between scopes). Selected by name at spawn or session start/restart; explicit flags override its fields.",
91
- "propertyNames": { "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$" },
92
- "additionalProperties": {
93
- "type": "object",
94
- "additionalProperties": false,
95
- "required": ["runtime"],
96
- "properties": {
97
- "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." },
98
- "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 declaring scope's directory when relative. Checked to exist and be executable before any start; never executed just to probe it." },
99
- "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." },
100
- "env": {
101
- "type": "object",
102
- "propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" },
103
- "additionalProperties": {
104
- "oneOf": [
105
- { "type": "string" },
106
- { "type": "object", "additionalProperties": false, "required": ["fromEnv"], "properties": { "fromEnv": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" } } }
107
- ]
108
- },
109
- "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."
110
- },
111
- "model": { "type": "string", "minLength": 1, "description": "Model for this configuration's runtime; overrides the soul default when this configuration is selected." },
112
- "yolo": { "type": "boolean", "description": "Permission bypass for this configuration; overrides scope and soul defaults when selected." }
113
- }
114
- }
115
- },
116
- "agent-types": {
117
- "type": "object",
118
- "description": "Agent families declared by name; membership is `type: <name>` in each soul.yaml.",
119
- "additionalProperties": {
120
- "oneOf": [
121
- { "type": "null" },
122
- {
123
- "type": "object",
124
- "properties": { "description": { "type": "string" } },
125
- "additionalProperties": false
126
- }
127
- ]
128
- }
129
- },
130
- "capabilities": {
131
- "type": "object",
132
- "properties": {
133
- "layers": {
134
- "type": "object",
135
- "description": "The three exclusive fundamental slots: a capability entry or an explicit none.",
136
- "properties": {
137
- "knowledge": { "$ref": "#/$defs/layerEntry" },
138
- "messaging": { "$ref": "#/$defs/layerEntry" },
139
- "tasks": { "$ref": "#/$defs/layerEntry" }
140
- },
141
- "additionalProperties": false
142
- },
143
- "additive": {
144
- "type": "object",
145
- "propertyNames": { "pattern": "^(?:@?[a-z0-9][a-z0-9._-]*[./])[a-z0-9][a-z0-9._/-]*$" },
146
- "additionalProperties": { "$ref": "#/$defs/additiveEntry" }
147
- }
148
- },
149
- "additionalProperties": false
150
- },
151
- "skill-overrides": { "type": "object", "additionalProperties": { "type": "string" } },
152
- "templates": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Named oats init templates: local config paths or git URLs whose main branch carries an oats-config.yaml." },
153
- "agents-md-injection": { "oneOf": [{ "type": "string" }, { "type": "object", "additionalProperties": { "type": "string" } }], "description": "Extra unconditional instruction blocks (adds content; does not override packaged defaults)." },
154
- "oats": {
155
- "type": "object",
156
- "properties": { "injection-override": { "$ref": "#/$defs/injection-override" } },
157
- "additionalProperties": false
158
- },
159
- "work-modes": {
160
- "type": "object",
161
- "properties": {
162
- "worktree": { "$ref": "#/$defs/workMode" },
163
- "checkout": { "$ref": "#/$defs/workMode" },
164
- "attached": { "$ref": "#/$defs/workMode" },
165
- "workspace": { "$ref": "#/$defs/workMode" },
166
- "directory": { "$ref": "#/$defs/workMode" }
167
- },
168
- "additionalProperties": false
169
- }
170
- },
171
- "additionalProperties": false
172
- }
@@ -1,7 +0,0 @@
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
- }