@awebai/oats 0.23.2 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/README.md +224 -391
  2. package/bin/oats-pi-sdk-host.mjs +17 -0
  3. package/bin/oats.mjs +470 -51
  4. package/capabilities/oats-okf/bin/oats-okf-binding.mjs +14 -0
  5. package/capabilities/oats-okf/bin/oats-okf.mjs +79 -11
  6. package/capabilities/oats-okf/lib/binding-wire.mjs +268 -0
  7. package/capabilities/oats-okf/lib/captured-worker.mjs +109 -0
  8. package/capabilities/oats-okf/lib/config.mjs +2 -1
  9. package/capabilities/oats-okf/lib/inspection.mjs +16 -1
  10. package/capabilities/oats-okf/lib/invocation-context.mjs +111 -0
  11. package/capabilities/oats-okf/lib/invocation-shape.mjs +135 -0
  12. package/capabilities/oats-okf/lib/io.mjs +1 -1
  13. package/capabilities/oats-okf/lib/portable-binding.mjs +199 -0
  14. package/capabilities/oats-okf/lib/source-contract.mjs +46 -0
  15. package/capabilities/oats-okf/lib/sources.mjs +123 -3
  16. package/capabilities/oats-okf/lib/stores.mjs +104 -25
  17. package/capabilities/oats-okf/lib/worker.mjs +69 -10
  18. package/capabilities/oats-okf/oats.json +35 -7
  19. package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +87 -0
  20. package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +113 -0
  21. package/capabilities/oats-okf/skills/memory-harvest/SKILL.md +23 -5
  22. package/capabilities/oats-okf/skills/okf/SKILL.md +42 -1
  23. package/docs/artifact-approvals.schema.json +7 -0
  24. package/docs/capabilities.md +4 -0
  25. package/docs/capability-manifest.schema.json +37 -66
  26. package/docs/captured-invocation-context.schema.json +7 -0
  27. package/docs/captured-resolution.schema.json +7 -0
  28. package/docs/design/2026-09-14-artifact-retention-contract.md +190 -0
  29. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +708 -0
  30. package/docs/design/2026-09-14-portable-souls-contract-amendments.md +85 -0
  31. package/docs/design/2026-09-14-portable-souls-explainer.md +750 -0
  32. package/docs/design/2026-09-15-captured-dispatch.md +127 -0
  33. package/docs/design/2026-09-15-captured-resolution-records.md +143 -0
  34. package/docs/design/2026-09-15-package-preparation.md +100 -0
  35. package/docs/design/2026-09-15-portable-data-contract.md +121 -0
  36. package/docs/design/2026-09-15-portable-declarations.md +189 -0
  37. package/docs/design/2026-09-15-portable-souls-handoff.md +150 -0
  38. package/docs/design/2026-09-15-portable-souls-implementation.md +417 -0
  39. package/docs/design/2026-09-15-selection-lock-and-approval.md +122 -0
  40. package/docs/design/2026-09-15-source-observation.md +119 -0
  41. package/docs/design/2026-09-16-captured-admission.md +77 -0
  42. package/docs/design/2026-09-16-captured-helper-dispatch.md +105 -0
  43. package/docs/design/2026-09-16-captured-launch-inputs.md +42 -0
  44. package/docs/design/2026-09-16-command-profile-preparation.md +86 -0
  45. package/docs/design/2026-09-16-fresh-install-first-rollout.md +47 -0
  46. package/docs/design/2026-09-16-fresh-operator-walkthrough.md +277 -0
  47. package/docs/design/2026-09-16-knowledge-capability-contract.md +61 -0
  48. package/docs/design/2026-09-16-messaging-capability-contract.md +59 -0
  49. package/docs/design/2026-09-16-portable-migration-evidence.md +156 -0
  50. package/docs/design/2026-09-16-portable-onboarding.md +177 -0
  51. package/docs/design/2026-09-16-prepare-request-transport.md +26 -0
  52. package/docs/design/2026-09-16-provider-binding-codecs.md +98 -0
  53. package/docs/design/2026-09-16-provider-binding-wire.md +247 -0
  54. package/docs/design/2026-09-17-capability-helper-input-contract.md +95 -0
  55. package/docs/design/2026-09-17-captured-backend-parity.md +53 -0
  56. package/docs/design/2026-09-17-captured-native-start.md +58 -0
  57. package/docs/design/2026-09-17-portable-boundary-hookup.md +19 -0
  58. package/docs/design/2026-09-17-portable-boundary-resources.md +52 -0
  59. package/docs/design/2026-09-17-public-captured-start.md +108 -0
  60. package/docs/design/2026-09-17-public-prepare-request.md +90 -0
  61. package/docs/design/2026-09-18-captured-pi-host.md +205 -0
  62. package/docs/design/2026-09-18-first-cut-release-checklist.md +131 -0
  63. package/docs/design/2026-09-18-herdr-protocol-compatibility.md +60 -0
  64. package/docs/design/2026-09-20-redesign-program-board.md +70 -0
  65. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +287 -0
  66. package/docs/design/2026-09-20-workspace-onboarding-public.md +124 -0
  67. package/docs/design/README.md +42 -0
  68. package/docs/desktop-cli-api.md +5 -2
  69. package/docs/execution-capsule.schema.json +108 -0
  70. package/docs/execution-targets.md +20 -7
  71. package/docs/first-team.md +1 -1
  72. package/docs/knowledge-theory.md +353 -111
  73. package/docs/knowledge.md +10 -1
  74. package/docs/layers.md +89 -354
  75. package/docs/oats-lock-v3.schema.json +7 -0
  76. package/docs/oats-member.schema.json +38 -0
  77. package/docs/oats-workspace.schema.json +68 -0
  78. package/docs/official-marketplace.md +79 -0
  79. package/docs/packages.md +4 -0
  80. package/docs/portable.schema.json +2512 -0
  81. package/docs/provider-check-input.schema.json +7 -0
  82. package/docs/release-notes/v0.24.0.md +104 -0
  83. package/docs/release-notes/v0.24.1.md +17 -0
  84. package/docs/schedules.md +126 -14
  85. package/docs/soul.schema.json +82 -0
  86. package/docs/souls-and-instances.md +20 -7
  87. package/docs/workspace-adoption.md +285 -0
  88. package/docs/workspaces.md +154 -0
  89. package/injects/oats-portable.md +16 -0
  90. package/injects/portable-instance-boundary.md +39 -0
  91. package/injects/portable-work-directory.md +29 -0
  92. package/lib/artifact-approvals.mjs +120 -0
  93. package/lib/artifact-tree.mjs +141 -0
  94. package/lib/capability-artifacts.mjs +179 -0
  95. package/lib/capability-execution.mjs +15 -0
  96. package/lib/capability-inputs.mjs +39 -0
  97. package/lib/capability-provenance.mjs +231 -0
  98. package/lib/captured-action-shape.mjs +21 -0
  99. package/lib/captured-admission-shape.mjs +20 -0
  100. package/lib/captured-binding-file.mjs +36 -0
  101. package/lib/captured-dispatch.mjs +66 -0
  102. package/lib/captured-instance-index.mjs +277 -0
  103. package/lib/captured-invocation-context.mjs +130 -0
  104. package/lib/captured-launch-request.mjs +46 -0
  105. package/lib/captured-operation-process.mjs +15 -0
  106. package/lib/captured-pi-custody.mjs +29 -0
  107. package/lib/captured-pi-host.mjs +167 -0
  108. package/lib/captured-pi-outcome.mjs +172 -0
  109. package/lib/captured-resolutions.mjs +275 -0
  110. package/lib/captured-scaffold.mjs +87 -0
  111. package/lib/captured-selector.mjs +28 -0
  112. package/lib/captured-session-backend.mjs +52 -0
  113. package/lib/captured-source-receipt-file.mjs +72 -0
  114. package/lib/config-data.mjs +104 -0
  115. package/lib/core.mjs +961 -566
  116. package/lib/errors.mjs +7 -0
  117. package/lib/helper-injection-policy.mjs +98 -0
  118. package/lib/herdr.mjs +18 -7
  119. package/lib/instruction-composition.mjs +31 -0
  120. package/lib/legacy-lock-codec.mjs +106 -0
  121. package/lib/manifest-settings.mjs +84 -0
  122. package/lib/package-closure.mjs +48 -0
  123. package/lib/package-materialization.mjs +83 -0
  124. package/lib/pi-sdk-host.mjs +229 -0
  125. package/lib/portable-artifacts.mjs +115 -0
  126. package/lib/portable-choices.mjs +82 -0
  127. package/lib/portable-composition.mjs +136 -0
  128. package/lib/portable-digest.mjs +105 -0
  129. package/lib/portable-files.mjs +26 -0
  130. package/lib/portable-identity.mjs +40 -0
  131. package/lib/portable-lock.mjs +117 -0
  132. package/lib/portable-migration-artifacts.mjs +135 -0
  133. package/lib/portable-migration-evidence.mjs +305 -0
  134. package/lib/portable-migration-store.mjs +199 -0
  135. package/lib/portable-migration.mjs +104 -0
  136. package/lib/portable-onboarding-acceptance.mjs +66 -0
  137. package/lib/portable-onboarding-request.mjs +49 -0
  138. package/lib/portable-onboarding.mjs +249 -0
  139. package/lib/portable-package-preparation.mjs +188 -0
  140. package/lib/portable-policy.mjs +44 -0
  141. package/lib/portable-shape.mjs +35 -0
  142. package/lib/portable-soul.mjs +38 -0
  143. package/lib/portable-state.mjs +80 -0
  144. package/lib/portable-values.mjs +181 -0
  145. package/lib/prepare-composition.mjs +151 -0
  146. package/lib/prepared-bindings.mjs +78 -0
  147. package/lib/prepared-resources.mjs +127 -0
  148. package/lib/provider-binding-broker.mjs +59 -0
  149. package/lib/provider-binding-wire.mjs +110 -0
  150. package/lib/provider-binding.mjs +22 -0
  151. package/lib/repository-observation.mjs +226 -0
  152. package/lib/resolution-shape.mjs +393 -0
  153. package/lib/schedule-capsule.mjs +206 -0
  154. package/lib/schedule.mjs +259 -38
  155. package/lib/servers.mjs +15 -0
  156. package/lib/soul-constraints.mjs +40 -0
  157. package/lib/source-projection.mjs +84 -0
  158. package/lib/source-spec.mjs +189 -0
  159. package/lib/workspace-definition.mjs +126 -0
  160. package/lib/workspace-discovery.mjs +146 -0
  161. package/package-catalog.json +2 -1
  162. package/package.json +3 -2
  163. package/packages/record/lib/capture-cc.mjs +14 -6
  164. package/packages/record/lib/formats.mjs +14 -3
  165. package/packages/record/lib/native-history.mjs +277 -7
  166. package/packages/record/lib/session-snapshot.mjs +25 -5
  167. package/packages/record/lib/sessions-for-home.mjs +30 -13
  168. package/skills/oats/SKILL.md +12 -7
  169. package/skills/oats-config/SKILL.md +11 -9
  170. package/skills/oats-packages/SKILL.md +12 -8
  171. package/skills/oats-portable/SKILL.md +115 -0
  172. package/skills/oats-portable-artifacts/SKILL.md +63 -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.
@@ -0,0 +1,70 @@
1
+ # OATS redesign — program board
2
+
3
+ **Purpose:** the one accurate view of every work stream in the redesign, what is on main, what is in flight, who owns it, and what blocks it. Lead: `oats-expert` (redesign lead). Updated whenever anything merges, is returned, or reality changes. Older per-lane boards are superseded by this file.
4
+
5
+ **Last update:** 2026-09-20 17:40Z · main `87292f40` · OKF `v2.1.1`
6
+
7
+ Legend: ✅ on main/published · 🔄 in flight (PR/branch) · 🟡 preserved, not adopted · ⬜ not started · ⛔ blocked
8
+
9
+ ## Streams at a glance
10
+
11
+ | # | Stream | State | Owner | Next action |
12
+ |---|---|---|---|---|
13
+ | S1 | Knowledge capability contract rework (kernel↔provider boundary, OKF 2.x) | ✅ shipped 0.24 / **OKF 2.1.1 released** (PR4 merged; mirror, catalog ref, soul source bumped) | P | done for this phase; OATS 0.24.1 cut after L's custody fix |
14
+ | S2 | Workspace/Portable Souls adoption of the OATS repos | ✅ PR23 + PR24 merged · ✅ member `oats.yaml` on main in oats-okf/aweb/authoring/jira · ⛔ oats-dev, oats-linear (no push access, human) | M, L, lead | human grants access → push 0434f4ef/8c183c37; then pin imports; then fresh deployment gate |
15
+ | S3 | Messaging capability readiness on the new infrastructure (aweb) | 🔄 codec PR2 + custody WIP · needs profile pin | P | lead pins pilot profile + answers authority question |
16
+ | S4 | Official capabilities `oats.core` / `oats.setup` + explicit default + onboarding `oats-setup-expert` | 🔄 D1 in progress (P, `feat/d1-oats-core-setup`, package → `oats.framework` 1.1.0) · 🔄 D2 in progress (L) · ⬜ D3 | P (D1), L (D2, D3) | review D1/D2 PRs; assign D3 after D2 |
17
+ | S5 | Official marketplace = reviewed list in oats repo | ✅ D4 merged PR26 (`docs/official-marketplace.md`, policy pointer) · ⬜ `oats.core`/`oats.setup` entries after D1 release | M | add entries at D1 release |
18
+ | S6 | Five expert souls created in the oats repo (`souls/<name>/`) | 🔄 assigned to M (`feat/s6-expert-soul-editions`) from the reviewed candidate; `souls/oats-expert` on main | M | review PR; `oats.core` follow-up after D1 |
19
+ | S7 | Centralised per-soul knowledge in `oats-knowledge` (migration + PR-only learning) | 🟡 35 curated concepts uncommitted on local `curation/expert-knowledge`; bootstrap proven on personal repo; `awebai/oats-knowledge` EMPTY, private | lead + human (visibility) | decide visibility; publish curation as PR; point souls' `stores.oats` at it |
20
+ | S8 | Desktop parity (marketplace view, soul creation with `oats.core`, onboarding flow) | ⬜ after S4/S5 | fresh Desktop engineer (blocked: `claude` absent) | pick runtime; spawn |
21
+
22
+ ## S1 — Knowledge capability contract rework
23
+ - ✅ Provider-neutral contract, binding wire v1, helper/input contract, retained execution: OATS 0.24.0 + OKF 2.1.0 (f20f8e57) published.
24
+ - ✅ **oats-okf PR4 merged (9f90ee9) → OKF v2.1.1 (01b48dfc)**: Claude/Codex helpers with complete approved closure accepted; strict-Pi unchanged. Framework mirror/inventory finalized, catalog ref and `souls/oats-expert` source → v2.1.1 (16c5c939, 87292f40).
25
+ - Open: strict-Pi "enriched profile" remains unqualified (documented, not hidden).
26
+
27
+ ## S2 — Workspace adoption of the OATS repos
28
+ - ✅ **PR23 merged f6d5a89b**: `oats-workspace.yaml` (7 members, `imports: []`), `oats.yaml` (exports souls/oats-expert, oats-package, capabilities/oats-authoring), transitional `souls/oats-expert/` edition, `docs/workspace-adoption.md`, layout tests.
29
+ - ✅ **PR24 merged da38e5a9**: deletion of `skills/oats-portable-setup` + `oats inspect --request` read-only seam (ACCEPTED as the public inspection route); full gate 1621/0.
30
+ - ✅ Member `oats.yaml` merged to main: oats-okf #3 (fec78a20), oats-aweb #1 (069ea2f6), oats-authoring #1 (54183a6a), oats-jira #1 (2f855daf).
31
+ - ⛔ oats-dev (0434f4ef) and oats-linear (8c183c37): neither M nor the lead's GitHub account has push — **human must grant access or push**.
32
+ - ⬜ `imports:` pin of `souls/oats-expert` at its published revision (after member indexes).
33
+ - ⬜ Fresh local deployment from the shared definition (P1.5) — the real acceptance gate.
34
+
35
+ ## S3 — Messaging (aweb) on the new infrastructure
36
+ - Facts: released aweb 1.10.3 has no binding interface; broker refuses. aw 1.36.1 broker calls `oats session inspect/input --home H`; never restarts stopped runtime; strict-Pi print mode can't take session input.
37
+ - 🔄 oats-aweb **PR2** codec (165b20e) + uncommitted `lib/captured-execution.mjs` (6/6).
38
+ - ✅ Lead answered (d9d912a4): pilot primary = Pi strict print host explicit model; helper = Pi sole-OKF (Claude/Codex allowed by 2.1.1); authority = existing HOME route + L's custody fix, gated on `oats >=0.24.1`; no new grant mechanism. P delivers aweb 1.11.0 PR.
39
+ - 🔄 L finding c21e36ff accepted; fix assigned (L, `fix/home-route-captured-custody`): reuse `readCapturedInstanceAuthority` on the HOME-only route, refuse before transport.
40
+
41
+ ## S4 — `oats.core` / `oats.setup` / onboarding
42
+ - ✅ Decision + plan D1–D4 on main 18af53be; docs reference as accepted-not-shipped.
43
+ - 🔄 **D1** (P, started 16:29Z; package identity confirmed: rename distribution package to `oats.framework` 1.1.0, capabilities 1.0.0, `oats.knowledge-theory` unchanged) package `oats.core` (`oats-operate`, `oats-souls`, oats.md injection) and `oats.setup` (oats-config, oats-packages, adoption guidance) under `oats-package/capabilities/`. Owner P.
44
+ - 🔄 **D2** (L, after custody fix) soul creation writes explicit `requires.capabilities.oats.core`; kernel skill list de-ambiented (one-release coexistence); checked-in souls updated. Owner L.
45
+ - ⬜ **D3** onboarding creates + instantiates `oats-setup-expert` (edition in `souls/`). Owner L (+M edition).
46
+ - Exit: fresh onboarding → running setup expert; created soul shows `oats.core`; kernel ships no ambient operational skill.
47
+
48
+ ## S5 — Official marketplace
49
+ - ✅ Mechanism exists (`package-catalog.json`, `officialPackageCatalog()`); decision names it the official list.
50
+ - ✅ **D4 merged PR26 (786490ae)**: `docs/official-marketplace.md`, `package-catalog.json` policy pointer (inert to the reader), README/packages/capabilities links, D3 sketch in adoption guide. ⬜ entries for `oats.core`/`oats.setup` at D1 release. Desktop view → S8.
51
+
52
+ ## S6 — Five expert souls in the oats repo
53
+ - Roster (decided): `oats-expert`, `oats-kernel-expert`, `oats-desktop-expert`, `market-research-expert`, `oats-assistant`.
54
+ - 🟡 Candidate: `expert-roster` worktree (b5e233b9 + 519 uncommitted changes: five `agents/<name>/soul/` + legacy roster deletions). Reviewed earlier; NOT committed.
55
+ - ✅ `souls/oats-expert` transitional edition on main already declares owns/reads for the five nodes.
56
+ - 🔄 Assigned to M (17:05Z): create `souls/<name>/` editions for the other four from the candidate; each declares `oats.core` explicitly (S4 rule) + `oats.okf`/`oats.aweb` sources; export in `oats.yaml`. Legacy `agents/` roster retirement is a separate, later cutover.
57
+
58
+ ## S7 — Centralised knowledge in `oats-knowledge`
59
+ - 🟡 Curated corpus: 35 concepts (five nodes) on local `curation/expert-knowledge` in `/Users/pepe-reyero/OATS-workspace/oats-knowledge`, **uncommitted**. Bootstrap + one PR-only harvest already proven on `josep-reyero/oats-knowledge` (3 commits).
60
+ - ⛔ Target `awebai/oats-knowledge` is EMPTY and PRIVATE; **visibility undecided** (stated requirement: public). Human decision needed before publishing.
61
+ - ⬜ Then: push bootstrap + curation as PR to awebai; bind `stores.oats` in the pilot deployment; prove fresh-reader + Git-PR learning with the new souls; retire old in-soul knowledge (`agents/*/soul/knowledge`) as a final cutover.
62
+
63
+ ## S8 — Desktop parity
64
+ - ⬜ After S4/S5: official marketplace view/search; soul creation showing `oats.core`; onboarding flow; redesign parity vs `Oats UX Redesign and Desktop Discovery (1)`.
65
+ - ⛔ Fresh `oats-desktop-engineer` not spawned: `claude` not on PATH → choose Pi/Codex or install (human).
66
+
67
+ ## Blockers needing the human
68
+ 1. `awebai/oats-knowledge` visibility (public vs private) — gates S7 publication.
69
+ 2. Push access to `awebai/oats-dev` and `awebai/oats-linear` for `josep-reyero` (or human pushes M's exact commits 0434f4ef / 8c183c37 as `oats.yaml`) — gates S2 completion.
70
+ 3. Desktop engineer runtime (Claude absent) — gates S8.