@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
|
@@ -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
|
-
}
|
package/docs/first-team-demo.md
DELETED
|
@@ -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
|
-
}
|