@awebai/oats 0.23.2 → 0.24.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 +7 -4
- package/bin/oats-pi-sdk-host.mjs +17 -0
- package/bin/oats.mjs +442 -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 +101 -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/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/desktop-cli-api.md +5 -2
- package/docs/execution-capsule.schema.json +108 -0
- package/docs/execution-targets.md +20 -7
- 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/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/schedules.md +126 -14
- package/docs/soul.schema.json +82 -0
- package/injects/oats-portable.md +17 -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 +918 -562
- 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 +230 -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 +1 -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 +12 -9
- package/skills/oats-packages/SKILL.md +12 -8
- package/skills/oats-portable/SKILL.md +116 -0
- package/skills/oats-portable-artifacts/SKILL.md +63 -0
- package/skills/oats-portable-setup/SKILL.md +69 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Captured Pi print host — kernel implementation boundary
|
|
2
|
+
|
|
3
|
+
This increment implements an explicit SDK host, not a reinterpretation of a Pi
|
|
4
|
+
CLI executable. It is not interactive/plugin/private-provider qualification.
|
|
5
|
+
The host is packaged by the existing `bin/` and `lib/` file inclusion; no new
|
|
6
|
+
package metadata or mandatory model capability is introduced.
|
|
7
|
+
|
|
8
|
+
## Selection and native behavior
|
|
9
|
+
|
|
10
|
+
Choose the physical installed `bin/oats-pi-sdk-host.mjs` path as an explicit
|
|
11
|
+
captured Pi executable. Operator args are exactly:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
--oats-pi-host 1 --mode print --thinking medium --sdk-root /physical/pi/package --sdk-version 0.85.1
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Launch env is empty (no additional OATS contribution, NOT an empty inherited
|
|
18
|
+
process environment); yolo is false; model is an exact `provider/id`. The kernel
|
|
19
|
+
alone prefixes `--home H --session-dir S --model M --task-file H/TASK.md`.
|
|
20
|
+
There is exactly one session-dir flag at prefix indices2/3. Unknown/duplicate
|
|
21
|
+
args, arbitrary task/history/model flags and empty tasks refuse.
|
|
22
|
+
|
|
23
|
+
The public SDK export is resolved from the exact selected package name/version
|
|
24
|
+
and public export map without PATH/package acquisition or private imports.
|
|
25
|
+
ModelRuntime.create() uses its normal native defaults. Native getAgentDir and
|
|
26
|
+
SettingsManager.create preserve the user's ordinary profile/auth/helpers/OAuth,
|
|
27
|
+
model config and persistence. There is no OATS credential selector/parser/store,
|
|
28
|
+
no copied auth, and no null/empty/no-refresh production fixture configuration.
|
|
29
|
+
|
|
30
|
+
The public ResourceLoader consumes only reverified retained instructions and
|
|
31
|
+
exact skill files (`includeDefaults:false`). It has zero extensions and refuses
|
|
32
|
+
resource additions. Public services, createAgentSessionFromServices,
|
|
33
|
+
AgentSessionRuntime and runPrintMode remain the actual engine. The print host
|
|
34
|
+
rejects session switch/import/fork/new operations before delegation. Native
|
|
35
|
+
compaction/retry are not disabled. The captured exact model must exist; no
|
|
36
|
+
first-available/default substitution occurs.
|
|
37
|
+
|
|
38
|
+
## Admission, history and activation hold
|
|
39
|
+
|
|
40
|
+
The execution-side host verifies the original index/incarnation/intent, native
|
|
41
|
+
pending receipt/target, task input digest, capability approvals, selected launch,
|
|
42
|
+
zero-plugin eligibility and projected curriculum. It revalidates for resource
|
|
43
|
+
reload and startup; it does not admit another action or create an identity.
|
|
44
|
+
|
|
45
|
+
S is `nativeHistoryPath(H)`'s sibling named `<history-basename>.pi`, never inside
|
|
46
|
+
the native UUID-receipt directory and never the native auth/profile directory.
|
|
47
|
+
Core hooks the EXISTING native transaction's record preparation point, preserving
|
|
48
|
+
its record-ID/pending/target/replay/uncertainty logic. Legacy noncaptured renderers
|
|
49
|
+
are unchanged. A captured Pi CLI recipe is held rather than silently converted
|
|
50
|
+
or launched with unqualified ambient extension behavior.
|
|
51
|
+
|
|
52
|
+
**Fail-closed dependency:** the record library must provide the complete v2 root
|
|
53
|
+
witness AND discovery/read/each-append guard implementation. This kernel checks
|
|
54
|
+
`CAPTURED_PI_RECORD_VERSION === 2` and these synchronous native-history APIs:
|
|
55
|
+
|
|
56
|
+
- `inspectCapturedPiRoot(home, { incarnationId, sessionDir })`: read-only original
|
|
57
|
+
proof validation or truly absent fresh root; missing/ambiguous evidence holds.
|
|
58
|
+
- `prepareCapturedPiStart(home, { incarnationId, intent, sessionDir, assertAuthority })`:
|
|
59
|
+
pending-v2 before exclusive creation; kernel-authority checks around effects;
|
|
60
|
+
durable witness outside S before dependent execution; original witness on reuse;
|
|
61
|
+
returns the existing native record ID, never a replacement action identity.
|
|
62
|
+
- `assertCapturedPiStart(home, id, { incarnationId, intent, sessionDir })`: validate
|
|
63
|
+
the execution-side started-v2 receipt, original associations and root identity.
|
|
64
|
+
|
|
65
|
+
The record owner's approved `history.json` v2 expected-ID claim is mutable
|
|
66
|
+
record custody. For the exact strict Pi profile, Core's authority callback keeps
|
|
67
|
+
index/incarnation/lifecycle/home/native-directory/baseline/target checks but does
|
|
68
|
+
not duplicate that private codec or freeze its bytes to v1. The pinned read-only
|
|
69
|
+
inspection, guarded preparation and started-v2 assertion own that validation.
|
|
70
|
+
Re-entering inspection during a pending publication would incorrectly reject the
|
|
71
|
+
record owner's own transition. Non-Pi retains literal v1 manifest equality.
|
|
72
|
+
This narrow consumer correction was demonstrated by the combined package fixture;
|
|
73
|
+
it is not acceptance of a path/self-marker or a weaker record implementation.
|
|
74
|
+
|
|
75
|
+
The existing recordNativeStart execution must understand/check v2 before exec;
|
|
76
|
+
all downstream guards must be present before the version advertises support.
|
|
77
|
+
Until then, this increment refuses ZP1 BEFORE admission/backend effects. It does
|
|
78
|
+
not fake a complete runnable path or bypass the separate record source exception.
|
|
79
|
+
The API seam is subject to the parent-owned combined code review and coordinated
|
|
80
|
+
record implementation; no record lib/bin edits occur in this increment.
|
|
81
|
+
|
|
82
|
+
## Non-authorizing print-completion observation (version 1)
|
|
83
|
+
|
|
84
|
+
The dispatch ID marker and native SDK return value answer different questions.
|
|
85
|
+
Neither proves that the native process terminated successfully AND produced an
|
|
86
|
+
attributable final turn. The small observation increment uses the existing
|
|
87
|
+
native ID, original pending/index/started-v2 custody and witnessed S, not another
|
|
88
|
+
resolver, admission, identity, transcript parser or observation service.
|
|
89
|
+
|
|
90
|
+
Two exclusive 0600 JSON files live in S:
|
|
91
|
+
|
|
92
|
+
- `.oats-pi-sdk-<nativeRecordId>.json`: `kind: oats.pi-sdk-outcome`;
|
|
93
|
+
- `.oats-pi-process-<nativeRecordId>.json`: `kind: oats.pi-process-outcome`.
|
|
94
|
+
|
|
95
|
+
Both have `schemaVersion: 1`, `authority` and `observed`. Authority contains the
|
|
96
|
+
original home/sessionDir/incarnation/IntentRef/nativeRecordId/executionBinding,
|
|
97
|
+
target/admitted input integrity and expected `{runtime: pi, provider, id,
|
|
98
|
+
sdkVersion}` selection. It is attribution, NOT an additional authorization.
|
|
99
|
+
The original attempt remains original even when same-ID reconciliation advances
|
|
100
|
+
the index counter (PH1). Existing/partial/conflicting receipt files are not
|
|
101
|
+
rewritten, adopted or cleaned up. File and directory sync plus custody checks
|
|
102
|
+
surround publication. Before ANY content read, and again before every bounded
|
|
103
|
+
read, the opened outcome descriptor must match the CURRENT physically named
|
|
104
|
+
regular file under original-root proof. An earlier stat can itself come from a
|
|
105
|
+
redirected ancestor; a restored root or a post-read exception is not FD authority.
|
|
106
|
+
Size/version stability checks remain, with no bytes read to discover a mismatch.
|
|
107
|
+
These files are neither root witnesses nor native JSONL;
|
|
108
|
+
the record3API, native inventory, S formula, v1 readers and capture parsing are
|
|
109
|
+
unchanged. Their presence never establishes root ownership.
|
|
110
|
+
|
|
111
|
+
SDK `observed` is `{exitCode, observation}`. `exitCode` is the actual numeric
|
|
112
|
+
return from native `runPrintMode`, never a default. The public runtime's
|
|
113
|
+
synchronous `setBeforeSessionInvalidate` hook snapshots actual public session
|
|
114
|
+
metadata after shutdown handlers and BEFORE native disposal. It copies only
|
|
115
|
+
SDK VERSION, SessionManager header/id/file, session.model, and the final native
|
|
116
|
+
branch assistant entry's id/provider/model/optional responseModel/stopReason/
|
|
117
|
+
timestamp. That entry must agree with the last state message; an earlier
|
|
118
|
+
assistant followed by another message is not a final assistant. No prompt,
|
|
119
|
+
content/nonce, raw error, profile, credential or request-as-response is copied.
|
|
120
|
+
Unavailable observation stays null; it does not prevent native disposal or
|
|
121
|
+
manufacture a successful turn. The host publishes only after native print mode
|
|
122
|
+
returns and original custody is reverified. Native print output is unchanged.
|
|
123
|
+
|
|
124
|
+
Process `observed` is `{exitCode, source: launcher-wait-status}`. The COMMON
|
|
125
|
+
captured Pi completion wrapper used by tmux AND Herdr saves the native execution
|
|
126
|
+
chain's actual shell `$?`, then invokes the existing host executable's PRIVATE
|
|
127
|
+
`--oats-pi-record-exit 1 --home H --native-record UUID --exit-status N` mode under
|
|
128
|
+
the ORIGINAL kernel command environment. The native recorder execs the original
|
|
129
|
+
host, so this is post-process wait status, not a sidecar's intent or the SDK
|
|
130
|
+
return value. Nonzero/signaled shell status is retained literally; no signal
|
|
131
|
+
number is guessed. The observer imports/creates no SDK/model/auth services and
|
|
132
|
+
cannot change the enclosing shell's saved native status. This private mode is
|
|
133
|
+
NOT accepted by the launch recipe grammar. Ordinary/Claude/Codex paths are
|
|
134
|
+
unchanged, including explicit permission settings and native defaults.
|
|
135
|
+
|
|
136
|
+
Only after guarded process-receipt publication does the observer atomically
|
|
137
|
+
publish the EXISTING `.oats-start-exited` with its unchanged dispatch-ID-only
|
|
138
|
+
contents. Legacy readers remain correlation-only. If custody or publication is
|
|
139
|
+
uncertain, missing evidence is held; there is no success fallback, repair or
|
|
140
|
+
new native attempt. A failed process can have a process-only observation; a
|
|
141
|
+
successful-looking SDK receipt without process observation is incomplete.
|
|
142
|
+
|
|
143
|
+
### Public read-only query
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
oats session inspect --deployment /deployment --resolution <retained-id> \
|
|
147
|
+
--home /original/home --native-record <native-UUID> --json
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
For a helper, use the SOURCE resolution plus `--helper <exact-source-map-key>`.
|
|
151
|
+
There is no current-context lookup. Inspect accepts only home/helper/native-record
|
|
152
|
+
and json after the captured selectors; request/retry/model overrides are refused.
|
|
153
|
+
It admits/provisions nothing, calls no backend/model, and does not forge process
|
|
154
|
+
environment to inspect evidence. Existing source/helper and physical custody
|
|
155
|
+
checks plus pinned `assertCapturedPiStart` surround every receipt read and
|
|
156
|
+
native session-path check. The narrow query requires the ORIGINAL current
|
|
157
|
+
pending dispatch; an old ID after another dispatch replaces pending, a deleted
|
|
158
|
+
incarnation, changed curriculum/input or uncertain root remains held. Files in
|
|
159
|
+
S remain retained; this is not a new historical-incarnation recovery API.
|
|
160
|
+
|
|
161
|
+
The normal JSON envelope's `result.outcome` has `schemaVersion: 1`,
|
|
162
|
+
`contract: oats.pi-print-completion`, `nonAuthorizing: true`, `authority`,
|
|
163
|
+
`status: succeeded|failed|incomplete`, `qualified`, `processExitCode`,
|
|
164
|
+
`sdkExitCode`, `finalObserved`, nullable `sdk`, and evidence-presence flags.
|
|
165
|
+
Envelope `ok: true` means the QUERY succeeded, not that execution did.
|
|
166
|
+
|
|
167
|
+
`qualified: true` requires BOTH actual exit codes0, the observed selected SDK
|
|
168
|
+
version/header-v3/home/session-id/file, observed session and final assistant model
|
|
169
|
+
tuples equal to the retained selection, and final `stopReason: stop`. Missing
|
|
170
|
+
facts, mismatches, truncation/tool-use/error/aborted or nonzero status never pass.
|
|
171
|
+
This qualifies only **native-print completion**, NOT meaningful task completion,
|
|
172
|
+
automatic SOURCE helper execution, learning/privacy/capture correctness,
|
|
173
|
+
installation or release. A gate must still compare the expected original IDs,
|
|
174
|
+
consume protected native capture, and establish its domain-specific result.
|
|
175
|
+
Optional native `responseModel` is reported literally, not substituted for a
|
|
176
|
+
missing value or treated as cryptographic provider-side model attestation.
|
|
177
|
+
Receipts share the existing trusted execution-host/filesystem boundary; they do
|
|
178
|
+
not introduce signatures or promise detection of coherent privileged tampering.
|
|
179
|
+
|
|
180
|
+
Packaging needs the new `lib/captured-pi-outcome.mjs` alongside the existing
|
|
181
|
+
host/custody/SDK modules and bin. Existing lib inclusion already ships it; no
|
|
182
|
+
package/version metadata changes are needed.
|
|
183
|
+
|
|
184
|
+
## Evidence and honest results
|
|
185
|
+
|
|
186
|
+
Targeted unit tests use explicit SDK doubles to check parser/assembly argument
|
|
187
|
+
flow, normal native service initialization, loader and before-delegation guards.
|
|
188
|
+
They are NOT another SDK-consumer/model proof. Real retained preparation/scaffold
|
|
189
|
+
checks establish missing-record-support refusal before native effects. Existing
|
|
190
|
+
inert native regression checks cover unchanged custody/replay/placement behavior.
|
|
191
|
+
The previously completed public SDK consumer proof remains separate and closed.
|
|
192
|
+
|
|
193
|
+
`dispatchAccepted` proves native dispatch acceptance, not a model response.
|
|
194
|
+
The existing `.oats-start-exited` ID marker still does not contain a success code.
|
|
195
|
+
The new completion receipts/query are implemented as bounded kernel consumers;
|
|
196
|
+
unit doubles and inert shells are not actual SDK/model/backend qualification.
|
|
197
|
+
The coupled integration fixture REQUIRES actual complete record-v2 source (no
|
|
198
|
+
skip/stub of record support), exercising kernel/record/CLI wiring on both backend
|
|
199
|
+
paths with an explicitly FAKE SDK and inert transport. The bounded negative case
|
|
200
|
+
uses an existing unwitnessed S and retains legacy CLI refusal, rather than an
|
|
201
|
+
obsolete assumption that record support is absent. Neither fixture is actual
|
|
202
|
+
native SDK/model/backend qualification.
|
|
203
|
+
Real acceptance must observe SDK-created native session/assistant turns and
|
|
204
|
+
actual capture/recall under the completed witness guards, on BOTH selected native
|
|
205
|
+
backends. Do not fabricate process names, sessions, worker runs or learning.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# First-cut retained execution: installation and release checklist
|
|
2
|
+
|
|
3
|
+
This is an execution checklist for the release owner, **not a completed-release or
|
|
4
|
+
runtime-readiness claim**. The first-cut goal is an actual runnable packaged retained
|
|
5
|
+
path. A narrowly working profile does not establish full Desktop/plugin/lifecycle or
|
|
6
|
+
private-provider parity. Developers deliver code; the parent reviews combined code,
|
|
7
|
+
integrates, runs real acceptance and is the sole publisher. No independent-reviewer
|
|
8
|
+
wait is required by the current human workflow.
|
|
9
|
+
|
|
10
|
+
## 1. Freeze what is actually being shipped
|
|
11
|
+
|
|
12
|
+
- Record exact framework commit/tree, provider commit/manifest and runtime-consumer
|
|
13
|
+
revision; retained resolutions, source/helper bindings, protocol selection and
|
|
14
|
+
emitted witnesses must agree with that combination. Prior closed source gates are
|
|
15
|
+
evidence at their old pins, not qualification of the new SDK host or protocol22.
|
|
16
|
+
- Include the explicit print-mode SDK host/parser/native-services assembly only when
|
|
17
|
+
its complete retained eligibility/curriculum, kernel-owned task/args/thinking/history
|
|
18
|
+
controls and approved external session-directory identity witness are implemented.
|
|
19
|
+
Path-only history attribution is not an original-root identity witness.
|
|
20
|
+
- Launch the user's already-authenticated harness through its normal native profile,
|
|
21
|
+
auth/helpers/OAuth/model configuration. **No auth-file selector, CredentialStore,
|
|
22
|
+
key/provider allowlist, empty production store, profile substitution, credential
|
|
23
|
+
inspection/copy or new login questionnaire.** Strict selected curriculum/history is
|
|
24
|
+
a separate boundary, not a reason to replace native authentication.
|
|
25
|
+
- Preserve selected hard runtime/bridge/plugin requirements. If the first supported
|
|
26
|
+
host is zero-plugin, a profile selecting an unqualified plugin/bridge remains held;
|
|
27
|
+
do not remove that requirement to advertise default-OKF success.
|
|
28
|
+
- Record-runtime changes remain limited to the exact additional boundary explicitly
|
|
29
|
+
assigned by the parent after resolving its scope. Do not import held patches or
|
|
30
|
+
bypass the guard. No general record-package rewrite, bootstrap grammar, role-source
|
|
31
|
+
adoption or proposed retirement semantics is part of this checklist.
|
|
32
|
+
|
|
33
|
+
## 2. Metadata and package surfaces (parent-controlled)
|
|
34
|
+
|
|
35
|
+
Choose an actual unused release version **V** after the final code/pin selection;
|
|
36
|
+
verify it against existing published artifacts. Do not invent a tag or claim that
|
|
37
|
+
source/API2/protocol22 alone establishes a package compatibility floor.
|
|
38
|
+
|
|
39
|
+
| Surface | Required check/update |
|
|
40
|
+
|---|---|
|
|
41
|
+
| `package.json`, `package-lock.json` | Kernel version/root lock agree; SDK host's real runtime dependencies/import resolution are declared and available after installation, not accidentally from a development/global checkout. Keep manifest exports usable. |
|
|
42
|
+
| `packages/pi/package.json` | Version agrees with kernel; actual supported SDK/native package dependency contract and extension resource paths are truthful. |
|
|
43
|
+
| `packages/desktop/package.json`, `packages/desktop/package-lock.json` | All three release manifests and lock root entries use V. This metadata alignment does not mean complete Desktop behavior is qualified. |
|
|
44
|
+
| Provider distribution/capability manifests | Selected provider version and minimum OATS floor must include its actual supported wire/input/runtime requirements. Source-main with old metadata is not a released compatibility claim. |
|
|
45
|
+
| `scripts/okf-source-inventory.json`, `capabilities/oats-okf/`, `package-catalog.json` | If shipping an updated default provider, use the authoritative provider source and existing mirror/finalization tooling, then verify exact retained closure/canonical aliases and real published refs. Never hand-edit the mirror or point a catalog at an invented tag. |
|
|
46
|
+
| `docs/release-notes/<actual-tag>.md` | Exact tag-matching filename exists before build/tag. List implemented profile/actual gates and every remaining refusal; no real-worker/learning or model-health claim from inert output. |
|
|
47
|
+
|
|
48
|
+
The existing `.github/workflows/release.yml` and `scripts/release-lane.mjs` derive V
|
|
49
|
+
for **root, Pi and Desktop**, using `--allow-same-version`. The older release skill's
|
|
50
|
+
blanket two-package/no-same-version description is not the current implementation.
|
|
51
|
+
No developer package/version edits are authorized by this checklist alone.
|
|
52
|
+
|
|
53
|
+
## 3. Artifact/install boundary
|
|
54
|
+
|
|
55
|
+
Release owner uses the existing release tooling; this lane performs no pack/install/
|
|
56
|
+
publish operation. Build from the exact reviewed commit, not moving HEAD.
|
|
57
|
+
|
|
58
|
+
1. Run the applicable syntax/project/package gates on that assembled tree. Confirm
|
|
59
|
+
the new SDK host/bin, parser, native adapter and all runtime dependencies are in the
|
|
60
|
+
**actual** kernel tarball; Pi bridge resources must also be in its tarball. Verify
|
|
61
|
+
no deployment config/lock, agents/instances, credentials, private KB or scratch leaks.
|
|
62
|
+
2. Keep canonical Git payload aliases intact for selected capabilities. npm's omission
|
|
63
|
+
of source symlinks does not make its copied provider subtree a self-contained Git
|
|
64
|
+
distribution; use the supported complete provider acquisition path.
|
|
65
|
+
3. Pack kernel and Pi bridge once and record hashes. Install those exact tarballs in a
|
|
66
|
+
clean external location, outside the source checkout. Confirm installed CLI/core/
|
|
67
|
+
SDK-host dependency resolution with no repository-module or unselected resource
|
|
68
|
+
fallback. A checkout scaffold is not an installed-artifact test.
|
|
69
|
+
4. Use existing public `prepare --request` with an explicit valid source export,
|
|
70
|
+
deployment and workspace-or-standalone context. Approval/reprepare is explicit;
|
|
71
|
+
no private scratch input/current-config hole filling. Do not assume the parked five
|
|
72
|
+
roles or public bootstrap package have been adopted/published.
|
|
73
|
+
5. Inspect retained instructions/skills/launch inputs and preserve unsupported-profile
|
|
74
|
+
refusals. Create only a new owned home; do not overwrite old instances/state. A
|
|
75
|
+
source-complete helper is selected by its **SOURCE edge**, not a bare helper-ID
|
|
76
|
+
start. No-launch can still run admitted hooks and is not a real session gate.
|
|
77
|
+
|
|
78
|
+
## 4. Parent-run real first-cut acceptance
|
|
79
|
+
|
|
80
|
+
Use the already assigned single provider/native path rather than inventing a second
|
|
81
|
+
matrix. Pin and retain its real results separately from old inert/seeded evidence.
|
|
82
|
+
|
|
83
|
+
- Both tmux and Herdr are required, not a deferred optional backend. For Herdr select
|
|
84
|
+
the exact supported protocol and explicit operator-managed executable/socket; the
|
|
85
|
+
server snapshot must match it. IDs are observed receipts. No automatic daemon start,
|
|
86
|
+
tmux fallback, fabricated caller context or focused user session.
|
|
87
|
+
- Run an actual retained primary and exact SOURCE-helper through the new host, using
|
|
88
|
+
normal authenticated native harness operation. Verify an actual turn/task result,
|
|
89
|
+
selected curriculum and original session-directory identity/history continuity.
|
|
90
|
+
Source deletion/current-config poison must not redirect the retained selection.
|
|
91
|
+
- Record dispatch acceptance separately from model health, task completion, capture,
|
|
92
|
+
judged knowledge delivery, acceptance and fresh-reader learning. With default OKF,
|
|
93
|
+
use the provider's explicit private owned directory-store path and required selected
|
|
94
|
+
launcher/bridge; do not fake a worker/process/transcript or convert seed data into
|
|
95
|
+
learning evidence. If a required bridge is unqualified, report the exact hold.
|
|
96
|
+
- Preserve source versus helper execution authority and original incarnation/intent/
|
|
97
|
+
pending/history receipts across replay/restart/failure. Same-ID ambiguity never
|
|
98
|
+
authorizes redispatch. Missing public retirement/recovery remains a documented hold,
|
|
99
|
+
not permission to call a legacy/private fallback or delete an uncertain home.
|
|
100
|
+
- Credential/account/private-messaging authority is not granted by backend/model success.
|
|
101
|
+
External human/admin private-aweb evidence cannot be manufactured by this gate.
|
|
102
|
+
|
|
103
|
+
## 5. Publication and honest first-cut status
|
|
104
|
+
|
|
105
|
+
The existing tag workflow publishes only after build/test/smoke **and Desktop matrix**
|
|
106
|
+
jobs are green; npm kernel then Pi, GitHub release/assets last. The existing runnerless
|
|
107
|
+
lane can stage exact artifacts and publish its two staged npm tarballs; the parent owns
|
|
108
|
+
whether/how to use that documented route. Do not edit away gates to meet a clock.
|
|
109
|
+
|
|
110
|
+
Before publication retain exact source/tag ancestry, version probes, package checksums,
|
|
111
|
+
provider provenance and completed gate receipts. Verify published versions, package
|
|
112
|
+
integrities/source identity and installed behavior afterward. Do not move a tag after
|
|
113
|
+
any publication; distinguish partial npm publication, GitHub assets and bump-PR results
|
|
114
|
+
before retrying the appropriate existing phase. No force-push or credential repair here.
|
|
115
|
+
|
|
116
|
+
If packaging or a required real gate is incomplete at the first-cut deadline, deliver
|
|
117
|
+
its exact candidate artifacts plus named hold; label it **candidate**, not published or
|
|
118
|
+
usable for the blocked profile. Do not reset the agreed clock or conflate npm readiness
|
|
119
|
+
with all-platform Desktop delivery.
|
|
120
|
+
|
|
121
|
+
### Explicit limitations to carry into release notes unless genuinely closed
|
|
122
|
+
|
|
123
|
+
- Adapter20/22 unit support is not public caller/schema22 or real-server readiness.
|
|
124
|
+
- SDK feasibility/inert dispatch is not an actual normal-auth model turn.
|
|
125
|
+
- Zero-plugin success is not eligibility for a selected plugin/bridge/managed profile.
|
|
126
|
+
- Directory/history custody is not completed public retirement, wake or recovery.
|
|
127
|
+
- Source/provider gates are not actual worker/capture/learning/private-aweb proof.
|
|
128
|
+
- A packaged CLI/Pi path is not complete Desktop/platform behavior or rollout parity.
|
|
129
|
+
|
|
130
|
+
Every open item retains its existing refusal and owner. This checklist changes no
|
|
131
|
+
runtime semantics, metadata, release automation, live state or production authority.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Explicit Herdr protocol20/22 adapter compatibility
|
|
2
|
+
|
|
3
|
+
The host-local adapter in `lib/herdr.mjs` supports exactly numeric protocols **20**
|
|
4
|
+
(documented0.8 baseline) and **22** (documented0.9.0 native schema). This is explicit
|
|
5
|
+
selection, not version negotiation or proof of an installed/running backend.
|
|
6
|
+
|
|
7
|
+
## Shared adapter interface
|
|
8
|
+
|
|
9
|
+
- `HERDR_PROTOCOL` remains20 for existing legacy/default behavior. In particular,
|
|
10
|
+
the unchanged legacy `ensureHerdr` path is not silently switched to22.
|
|
11
|
+
- `HERDR_SUPPORTED_PROTOCOLS` is the frozen `[20,22]` set.
|
|
12
|
+
- `isSupportedHerdrProtocol(value)` accepts only those numbers; no strings,
|
|
13
|
+
omitted/null value, protocol21, future number or range is accepted.
|
|
14
|
+
- `herdrSnapshot(target, io)` requires a supported explicit target protocol before
|
|
15
|
+
issuing a command, then requires **snapshot.protocol === target.protocol** and a
|
|
16
|
+
pane inventory. A20 target cannot accept a22 snapshot, or vice versa. Missing or
|
|
17
|
+
malformed observations refuse; saved target metadata is not upgraded/downgraded.
|
|
18
|
+
- `allocateHerdr` also validates the selected protocol before workspace creation,
|
|
19
|
+
preserving it alongside the actual returned workspace/pane/terminal identifiers.
|
|
20
|
+
As before, callers own preflight/admission and the pending/observed-target ledger;
|
|
21
|
+
allocation is not a new independent lifecycle transaction.
|
|
22
|
+
- `validHerdrTarget` recognizes both explicit protocols with its existing target
|
|
23
|
+
checks. Delivered strict workspace/pane/terminal uniqueness, explicit socket
|
|
24
|
+
transport, replacement refusal, run/input/stop behavior and server-error handling
|
|
25
|
+
are retained. No daemon, focused target or alternate-backend fallback is added.
|
|
26
|
+
|
|
27
|
+
The captured caller and generated request/target schema must use the same set and
|
|
28
|
+
retain selected/admitted/observed target equality. That integration belongs to the
|
|
29
|
+
lifecycle owner (`lib/captured-session-backend.mjs`, core and shared schema generator),
|
|
30
|
+
not this adapter-only change. A current const20 caller still correctly refuses22 until
|
|
31
|
+
that separate integration lands. API availability is not protocol/host/model readiness.
|
|
32
|
+
|
|
33
|
+
## Documented native0.9 subset
|
|
34
|
+
|
|
35
|
+
The bundled protocol22 schema retains `.result.snapshot`, panes/agents and their
|
|
36
|
+
workspace/pane/terminal identifiers, `.result.root_pane` allocation identifiers,
|
|
37
|
+
agent status values and process-info fields used by the existing adapter. The CLI
|
|
38
|
+
spellings remain `api snapshot`, `workspace create --cwd ... --label ... --no-focus`,
|
|
39
|
+
`pane run <id> <command>`, `pane process-info --pane <id>` and `pane close <id>`.
|
|
40
|
+
|
|
41
|
+
These observations justify reusing the adapter, not treating arbitrary later protocol
|
|
42
|
+
numbers as compatible. Client version, server version, endpoint-protocol generation,
|
|
43
|
+
OATS API version and native request version remain distinct facts. Explicit existing
|
|
44
|
+
operator-managed executable/socket and actual server protocol must be qualified by the
|
|
45
|
+
real acceptance gate. No `HERDR_ENV` value is fabricated or focused user session used.
|
|
46
|
+
|
|
47
|
+
## Evidence boundary
|
|
48
|
+
|
|
49
|
+
`test/herdr-protocol.test.mjs` uses injected inert command responses, not a live
|
|
50
|
+
server or process:20/22 preservation, unknown/missing refusal before commands, exact
|
|
51
|
+
snapshot mismatches, actual-ID projection, explicit command/socket transport, strict
|
|
52
|
+
ambiguous/foreign/replaced targets and stop/input behavior. Existing adapter tests
|
|
53
|
+
remain applicable. The controlled scaffold probe composes resources and normally
|
|
54
|
+
retires without invoking a backend.
|
|
55
|
+
|
|
56
|
+
This slice does not qualify public native protocol22 integration, real model health,
|
|
57
|
+
Pi managed-resource eligibility, worker completion, public retirement/recovery, private
|
|
58
|
+
messaging, release floors or production. None of those guards is removed. Ordinary
|
|
59
|
+
already-authenticated harness operation remains separate from this backend adapter;
|
|
60
|
+
no auth-file selector, credential copy or production profile substitution is introduced.
|
package/docs/desktop-cli-api.md
CHANGED
|
@@ -18,8 +18,11 @@ prints exactly one JSON object on stdout:
|
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
`version` is the installed package's exact semver (e.g. `0.20.0`).
|
|
21
|
-
Desktop 0.
|
|
22
|
-
(the earlier Desktop 0.
|
|
21
|
+
Desktop 0.24 accepts `desktopApi === 1` and semver `>=0.22.0 <0.25.0`
|
|
22
|
+
(the earlier Desktop 0.23 band was `>=0.22.0 <0.24.0`). This admits the paired
|
|
23
|
+
0.24 CLI without changing Desktop API v1. It does not establish complete captured
|
|
24
|
+
UI, backend, plugin, retirement or recovery parity; capability checks and explicit
|
|
25
|
+
refusals below remain authoritative.
|
|
23
26
|
|
|
24
27
|
Optional features are negotiated from the probe's `features` array. Starting
|
|
25
28
|
an existing home requires `session-start`; named launch configurations and
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
}
|
|
@@ -235,13 +235,26 @@ Set `yolo: true` in an `oats-config.yaml` to apply it to that scope. The closest
|
|
|
235
235
|
scope wins; an optional `yolo` in soul.yaml overrides it; `oats spawn --yolo` or
|
|
236
236
|
`--no-yolo` overrides both. `oats create` accepts those flags too. Desktop offers
|
|
237
237
|
the same per-launch choice. With no setting, native policy is retained.
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
238
|
+
Autonomous or unattended execution is not permission to synthesize `yolo: true`.
|
|
239
|
+
Explicit user CLI/UI input or a user-selected configuration is the opt-in; explicit
|
|
240
|
+
`false` remains false.
|
|
241
|
+
|
|
242
|
+
Only for an explicitly resolved true setting does OATS add Codex `--yolo` plus
|
|
243
|
+
launch-local project trust, or Claude `--dangerously-skip-permissions`. `--no-yolo` removes the
|
|
244
|
+
OATS-added bypass flags while native settings stay in force. Instance metadata
|
|
245
|
+
records the resolved choice; this policy does not rewrite frozen recipes, live
|
|
246
|
+
configuration or already-running sessions.
|
|
247
|
+
|
|
248
|
+
Claude Code and Codex use their ordinary native context, skills, settings, plugins,
|
|
249
|
+
profile and authentication. OATS still builds the complete ordinary instance home:
|
|
250
|
+
resolved skills, capabilities and resources, canonical AGENTS plus its CLAUDE alias,
|
|
251
|
+
task, metadata and normal work placement. Resolution, approvals and lifecycle hooks
|
|
252
|
+
are not skipped; normal native launch is not an empty/no-capability mode. Only outside
|
|
253
|
+
native context/skill coexistence is relaxed: OATS does not impose an OATS-only ambient
|
|
254
|
+
view or route these runtimes through the Pi SDK. Pi's selected strict SDK profile is unchanged. OATS
|
|
255
|
+
composition integrity/provenance, source/helper authority, record attribution and
|
|
256
|
+
guards, and admission/retry obligations remain separate and required; normal native
|
|
257
|
+
context alone is not a Claude/Codex qualification failure.
|
|
245
258
|
|
|
246
259
|
Desktop remote terminal requests contain only the server id and instance name.
|
|
247
260
|
The selected installed CLI resolves the saved route and performs remote
|
|
@@ -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
|
+
}
|