@awebai/oats 0.29.3 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +12 -6
  2. package/bin/oats.mjs +203 -54
  3. package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
  4. package/capabilities/oats-aweb/injects/aweb.md +1 -1
  5. package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
  6. package/capabilities/oats-aweb/oats.json +5 -12
  7. package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
  8. package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
  9. package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
  10. package/capabilities/oats-code-review/injects/reviewer.md +26 -0
  11. package/capabilities/oats-code-review/oats.json +16 -0
  12. package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
  13. package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
  14. package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
  15. package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
  16. package/capabilities/oats-developer/injects/developer.md +38 -0
  17. package/capabilities/oats-developer/oats.json +17 -0
  18. package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
  19. package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
  20. package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
  21. package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
  22. package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
  23. package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
  24. package/capabilities/oats-engineering-expert/oats.json +17 -0
  25. package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
  26. package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
  27. package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
  28. package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
  29. package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
  30. package/capabilities/oats-okf/bin/oats-okf.mjs +16 -9
  31. package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
  32. package/capabilities/oats-okf/lib/config.mjs +2 -1
  33. package/capabilities/oats-okf/lib/consult.mjs +26 -4
  34. package/capabilities/oats-okf/lib/harvest-switch.mjs +16 -3
  35. package/capabilities/oats-okf/lib/inspection.mjs +26 -7
  36. package/capabilities/oats-okf/lib/io.mjs +9 -1
  37. package/capabilities/oats-okf/lib/sources.mjs +34 -3
  38. package/capabilities/oats-okf/lib/stores.mjs +8 -6
  39. package/capabilities/oats-okf/lib/worker.mjs +7 -17
  40. package/capabilities/oats-okf/oats.json +6 -3
  41. package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
  42. package/capabilities/oats-okf-harvest/oats.json +3 -3
  43. package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
  44. package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +37 -16
  45. package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
  46. package/capabilities/oats-okf-maintenance/lib/provenance.mjs +6 -1
  47. package/capabilities/oats-okf-maintenance/oats.json +2 -2
  48. package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +17 -2
  49. package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
  50. package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
  51. package/capabilities/oats-workspace-experts/oats.json +9 -0
  52. package/docs/capabilities.md +160 -171
  53. package/docs/capability-manifest.schema.json +7 -10
  54. package/docs/configuration.md +213 -64
  55. package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
  56. package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
  57. package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
  58. package/docs/design/2026-09-27-team-model-v2.md +116 -0
  59. package/docs/design/2026-09-28-automations-trust.md +38 -0
  60. package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
  61. package/docs/design/HISTORY.md +65 -0
  62. package/docs/design/README.md +23 -54
  63. package/docs/desktop-cli-api.md +1787 -1777
  64. package/docs/desktop.md +30 -91
  65. package/docs/execution-targets.md +146 -292
  66. package/docs/first-team.md +31 -17
  67. package/docs/implementation.md +76 -288
  68. package/docs/integrations.md +118 -320
  69. package/docs/knowledge-capability-authoring.md +25 -52
  70. package/docs/knowledge-reference/acceptance.md +3 -3
  71. package/docs/knowledge-reference/adoption.md +1 -1
  72. package/docs/knowledge-reference/harvester.md +2 -2
  73. package/docs/knowledge-reference/package-craft.md +3 -3
  74. package/docs/knowledge-reference/provider-mapping.md +3 -6
  75. package/docs/knowledge-reference/reader-capture.md +3 -3
  76. package/docs/knowledge-theory.md +62 -166
  77. package/docs/knowledge.md +225 -404
  78. package/docs/layers.md +42 -97
  79. package/docs/oats-local.schema.json +58 -5
  80. package/docs/oats-membership.schema.json +1 -8
  81. package/docs/oats-package.schema.json +5 -5
  82. package/docs/oats-workspace.schema.json +8 -22
  83. package/docs/official-catalog.md +25 -28
  84. package/docs/packages.md +45 -63
  85. package/docs/plans/0.30-close-out.md +61 -0
  86. package/docs/release-lane.md +77 -0
  87. package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
  88. package/docs/release-notes/v0.19.0.md +48 -147
  89. package/docs/release-notes/v0.19.1.md +2 -3
  90. package/docs/release-notes/v0.19.3.md +2 -15
  91. package/docs/release-notes/v0.20.0.md +0 -15
  92. package/docs/release-notes/v0.22.0.md +71 -138
  93. package/docs/release-notes/v0.22.1.md +42 -90
  94. package/docs/release-notes/v0.22.10.md +1 -1
  95. package/docs/release-notes/v0.22.11.md +1 -47
  96. package/docs/release-notes/v0.22.12.md +4 -13
  97. package/docs/release-notes/v0.22.13.md +1 -42
  98. package/docs/release-notes/v0.22.14.md +3 -11
  99. package/docs/release-notes/v0.22.15.md +1 -46
  100. package/docs/release-notes/v0.22.16.md +6 -8
  101. package/docs/release-notes/v0.22.18.md +1 -99
  102. package/docs/release-notes/v0.22.19.md +3 -14
  103. package/docs/release-notes/v0.22.2.md +6 -15
  104. package/docs/release-notes/v0.22.3.md +0 -1
  105. package/docs/release-notes/v0.22.4.md +1 -14
  106. package/docs/release-notes/v0.22.5.md +2 -12
  107. package/docs/release-notes/v0.22.6.md +0 -3
  108. package/docs/release-notes/v0.23.0.md +9 -25
  109. package/docs/release-notes/v0.23.1.md +9 -25
  110. package/docs/release-notes/v0.23.2.md +2 -4
  111. package/docs/release-notes/v0.24.0.md +56 -97
  112. package/docs/release-notes/v0.24.1.md +7 -11
  113. package/docs/release-notes/v0.24.10.md +34 -45
  114. package/docs/release-notes/v0.24.11.md +12 -20
  115. package/docs/release-notes/v0.24.12.md +35 -48
  116. package/docs/release-notes/v0.24.13.md +34 -41
  117. package/docs/release-notes/v0.24.2.md +9 -13
  118. package/docs/release-notes/v0.24.3.md +7 -11
  119. package/docs/release-notes/v0.24.4.md +6 -6
  120. package/docs/release-notes/v0.24.5.md +6 -10
  121. package/docs/release-notes/v0.24.6.md +2 -5
  122. package/docs/release-notes/v0.24.7.md +46 -75
  123. package/docs/release-notes/v0.24.8.md +58 -96
  124. package/docs/release-notes/v0.24.9.md +38 -54
  125. package/docs/release-notes/v0.25.0.md +59 -76
  126. package/docs/release-notes/v0.25.1.md +57 -81
  127. package/docs/release-notes/v0.25.2.md +51 -70
  128. package/docs/release-notes/v0.25.3.md +11 -13
  129. package/docs/release-notes/v0.25.4.md +9 -13
  130. package/docs/release-notes/v0.25.5.md +3 -5
  131. package/docs/release-notes/v0.25.6.md +20 -29
  132. package/docs/release-notes/v0.25.7.md +5 -7
  133. package/docs/release-notes/v0.25.8.md +26 -39
  134. package/docs/release-notes/v0.26.0.md +175 -646
  135. package/docs/release-notes/v0.27.0.md +4 -5
  136. package/docs/release-notes/v0.27.1.md +4 -6
  137. package/docs/release-notes/v0.27.2.md +1 -1
  138. package/docs/release-notes/v0.28.0.md +57 -124
  139. package/docs/release-notes/v0.29.0.md +89 -208
  140. package/docs/release-notes/v0.29.1.md +1 -1
  141. package/docs/release-notes/v0.29.2.md +3 -4
  142. package/docs/release-notes/v0.29.4.md +90 -0
  143. package/docs/release-notes/v0.30.0.md +205 -0
  144. package/docs/schedules.md +280 -349
  145. package/docs/servers.md +99 -117
  146. package/docs/soul.schema.json +2 -9
  147. package/docs/souls-and-instances.md +145 -158
  148. package/docs/workspaces.md +132 -215
  149. package/lib/automations.mjs +28 -6
  150. package/lib/core.mjs +226 -74
  151. package/lib/instance-events.mjs +1 -1
  152. package/lib/instance-inspect.mjs +109 -34
  153. package/lib/instance-lifecycle.mjs +14 -1
  154. package/lib/instance-resolution.mjs +26 -27
  155. package/lib/launch-preference.mjs +87 -0
  156. package/lib/materialize.mjs +3 -3
  157. package/lib/packages.mjs +2 -5
  158. package/lib/resolve.mjs +29 -87
  159. package/lib/schedule.mjs +32 -18
  160. package/lib/teams-verbs.mjs +195 -0
  161. package/lib/teams.mjs +190 -0
  162. package/lib/triggers.mjs +53 -17
  163. package/lib/workspace.mjs +54 -147
  164. package/package-catalog.json +9 -15
  165. package/package.json +1 -1
  166. package/skills/oats-getting-started/SKILL.md +25 -13
  167. package/capabilities/oats-review/injects/review.md +0 -69
  168. package/capabilities/oats-review/oats.json +0 -10
  169. package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
  170. package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
  171. package/docs/conventions.md +0 -90
  172. package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
  173. package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
  174. package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
  175. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
  176. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
  177. package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
  178. package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
  179. package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
  180. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
  181. package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
  182. package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
  183. package/docs/design/2026-09-15-captured-dispatch.md +0 -127
  184. package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
  185. package/docs/design/2026-09-15-package-preparation.md +0 -100
  186. package/docs/design/2026-09-15-portable-data-contract.md +0 -121
  187. package/docs/design/2026-09-15-portable-declarations.md +0 -189
  188. package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
  189. package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
  190. package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
  191. package/docs/design/2026-09-15-source-observation.md +0 -119
  192. package/docs/design/2026-09-16-captured-admission.md +0 -77
  193. package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
  194. package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
  195. package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
  196. package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
  197. package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
  198. package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
  199. package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
  200. package/docs/design/2026-09-16-portable-onboarding.md +0 -179
  201. package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
  202. package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
  203. package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
  204. package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
  205. package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
  206. package/docs/design/2026-09-17-captured-native-start.md +0 -58
  207. package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
  208. package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
  209. package/docs/design/2026-09-17-public-captured-start.md +0 -108
  210. package/docs/design/2026-09-17-public-prepare-request.md +0 -90
  211. package/docs/design/2026-09-18-captured-pi-host.md +0 -205
  212. package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
  213. package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
  214. package/docs/design/2026-09-20-redesign-program-board.md +0 -142
  215. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
  216. package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
  217. package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
  218. package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
  219. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
  220. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
  221. package/docs/design/2026-09-24-phase-d-plan.md +0 -305
  222. package/docs/design/2026-09-25-teams-contract.md +0 -258
  223. package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
  224. package/docs/design/desktop-ux-plan.md +0 -362
  225. package/docs/design/launch-configurations.md +0 -168
  226. package/docs/design/okf-mirror-provenance.md +0 -105
  227. package/docs/design/operations-contract.md +0 -141
  228. package/docs/oats-member.schema.json +0 -38
  229. package/skills/integration-authoring/SKILL.md +0 -84
  230. package/skills/oats-support/SKILL.md +0 -79
  231. package/skills/skill-craft/SKILL.md +0 -109
  232. package/skills/soul-craft/SKILL.md +0 -116
@@ -1,179 +0,0 @@
1
- # Portable fresh onboarding and source discovery
2
-
3
- > **Superseded (2026-09-23).** The 0.24 onboarding facade this note describes (`lib/portable-onboarding-acceptance.mjs`, `test/portable-onboarding-public.acceptance.mjs`, source editions, exports) was deleted with the workspace model v2; the 0.25 bootstrap is `oats onboard [<dir>] --workspace <ref>` (contract §6, `docs/desktop-cli-api.md`). Read [2026-09-23-simplified-workspace-model.md](2026-09-23-simplified-workspace-model.md) (worked example) and [2026-09-23-workspace-module-contracts.md](2026-09-23-workspace-module-contracts.md) (normative) instead; kept as history.
4
-
5
- 16 September 2026. This module supports a controlled fresh setup path while
6
- historical in-place migration is deferred. It does not alter the Portable Souls
7
- architecture or weaken the existing partial/unknown evidence safeguards.
8
-
9
- ## Responsibilities remain separate
10
-
11
- A fresh setup request carries four independent facts:
12
-
13
- 1. **Source location** — an explicit four-field soul reference, or an alias from
14
- one explicit workspace observation.
15
- 2. **Deployment/install location** — an explicit absolute path that passes fresh
16
- state preflight.
17
- 3. **Work target** — an explicit existing directory, independently reported as a
18
- Git or non-Git target. It never identifies the soul or deployment.
19
- 4. **Context/membership** — an explicit workspace plus optional reciprocal member
20
- request, or an explicit standalone context key. Declared messaging teams are
21
- reported separately; inspection performs no enrollment and makes no privacy
22
- claim.
23
-
24
- `lib/portable-onboarding.mjs` reuses `createWorkspaceDiscovery`, the repository
25
- transaction issued by the caller, and the existing workspace/member/soul parsers.
26
- It contains no source/config parser, resolver, network adapter, package installer,
27
- provider codec, credential handler or team operation.
28
-
29
- ## Fresh deployment preflight
30
-
31
- `preflightFreshDeployment({deployment,maxEntries?})` is read-only. A missing child
32
- of one real canonical parent is a valid fresh destination. An existing directory
33
- may contain arbitrary project files, a Git repository, authored souls, and authored
34
- capability source. Those do not make it dirty.
35
-
36
- The preflight reports `separate-deployment-required` for fixed deployment-owned
37
- state: configuration or selection locks, schedules, portable state, captured
38
- resolutions or migration evidence, retained/installed artifacts, installed package
39
- state, native history, and bounded discovered instance/retirement directories.
40
- The scan is shallow and incrementally bounded. It never recursively inventories
41
- project contents and never deletes, moves, repairs or rewrites a conflict. Advice
42
- is always to preserve the existing path and choose a separate fresh deployment.
43
-
44
- Issued inspections also keep ephemeral directory identity witnesses in memory:
45
- the existing deployment, or the parent of an absent deployment, and the work
46
- target. `recheckFreshOnboarding` rechecks those selected roots and managed state
47
- after source inspection and immediately before the fresh mutation adapter. Root
48
- replacement, disappearance or provisioning after an absent-path inspection
49
- requires a new inspection (`selection-changed`); ordinary project-file edits are
50
- allowed. No witness is added to public preparation JSON, written to disk or made
51
- into an identity registry. This is a local point-in-time check, not a lock against
52
- hostile concurrent writers; core retains its own action-boundary custody checks.
53
-
54
- ## Explicit source/workspace/export/catalog inspection
55
-
56
- `inspectPortableOnboarding` requires an explicit deployment, work target, source
57
- and origin. A string source is accepted only as an alias in an explicit workspace;
58
- otherwise the caller supplies the ordinary four-field source reference. Workspace
59
- and `standaloneContextKey` are mutually exclusive. Presence means an own field:
60
- any supplied workspace value must pass the existing workspace discovery/schema
61
- validator; `null`, `false`, `0` and empty text are not omission or a standalone
62
- shortcut. Without a workspace, the key
63
- must be explicitly supplied as opaque text of at most 256 UTF-8 bytes or explicit
64
- `null`; it is never
65
- derived from source/work paths, OS identity or repository metadata. `null` records
66
- an explicit lack of standalone private context and is suitable only when later
67
- preparation resolves messaging disabled. The
68
- existing discovery adapter qualifies source identity, observes exact revisions,
69
- validates the advertised export and parses the exported soul.
70
-
71
- An optional explicit member request performs the existing reciprocal membership
72
- check. Without it, repository membership is `not-requested`; import does not follow
73
- the publisher's workspace backlink. Messaging team declarations are data only and
74
- always report `enrollment:"not-performed"` and
75
- `privateTeamQualification:"not-evaluated"`.
76
-
77
- Catalog inspection is opt-in by unique declared workspace indexes. It observes the
78
- catalog source/revision and exact explicit descriptor path through the same
79
- repository transaction, returning only the source and document witnesses. There is
80
- no guessed catalog filename and no kernel-owned catalog payload parser.
81
-
82
- The result is `ready-for-preparation`, `needs-configuration`, or
83
- `separate-deployment-required`, with all four responsibilities represented in
84
- separate fields. `effects` reports no deployment writes, installs, activation,
85
- credential, team or job operations while honestly recording repository reads and
86
- caller-owned repository-transaction scratch use.
87
-
88
- ## Preparation handoff
89
-
90
- `buildFreshPreparationRequest` accepts only an inspection object issued by this
91
- module and only when its status is `ready-for-preparation`. It accepts public
92
- operator/mode/local-input choices only; the public preparation wrapper owns its
93
- private scratch directory, so `directory` is rejected rather than leaked from the
94
- private `prepareComposition` contract. It returns:
95
-
96
- ```text
97
- { schemaVersion: 1, operation: "prepare", persisted: false,
98
- preparation: <existing prepareCapturedComposition input>,
99
- workTarget: <the separately inspected target>,
100
- effects: {writes:false, installs:false, activation:false, enrollment:false} }
101
- ```
102
-
103
- It does not invoke preparation. A thin core/CLI adapter may pass `preparation`
104
- unchanged to public `prepareCapturedComposition` only at an explicit mutating
105
- boundary. The handoff forwards the exact standalone key for standalone contexts;
106
- core at `c5c6a3c9171e424a36a1bdbf3932b9319a3c6c72` now admits and stores that field.
107
- No adapter may rediscover targets, infer the key, read ambient config to fill
108
- omissions, adopt a publisher workspace, or reinterpret work and team fields.
109
- The public JavaScript bridge is implemented at that source pin; a complete fresh
110
- onboarding CLI is still separate integration work.
111
-
112
- ## Fresh acceptance driver
113
-
114
- `lib/portable-onboarding-acceptance.mjs` (deleted with v2) kept acceptance above the same facade:
115
-
116
- - `compareFreshSourceAcceptance({organization,standalone})` accepts only issued,
117
- ready inspections and proves qualified identity, exact commit, export and
118
- definition equality. The organization side must have workspace context; the
119
- standalone side must have standalone context and an explicit non-Git work target.
120
- - `prepareFreshOnboarding(inspection, options, adapters)` builds the exact public
121
- request, rechecks the issued deployment/work-root witnesses and fresh managed
122
- state immediately before any mutation, and
123
- calls only an explicitly supplied `prepareCapturedComposition` adapter. An
124
- absent deployment returns `fresh-deployment-provisioning-required`; a missing
125
- core bridge returns `onboarding-integration-required`; both are `pending` with
126
- `mutationAttempted:false`.
127
- - A supplied preparation result exposes explicit requested write bindings and
128
- exact artifact approval requests. The driver never approves them or converts an
129
- approval-required result into success.
130
-
131
- The deterministic fixture uses one unchanged source in an explicit organization
132
- workspace/member context and a standalone non-Git target. It verifies explicit
133
- bindings and approval requests, publisher-backlink non-follow, and a positive
134
- control where newly appeared managed state refuses before the mutating adapter.
135
- That deterministic fixture uses no production provider, install, team, identity,
136
- timer or job operation.
137
-
138
- ## Request-file transport
139
-
140
- `readPortablePreparationRequest` in `lib/portable-onboarding-request.mjs` is the
141
- thin bounded file reader for the proposed lifecycle-owned `prepare --request`
142
- route. It accepts parsed transport forms, uses shared no-follow/strict JSON
143
- readers and returns the entire public request unchanged. It rejects competing
144
- input flags and explicit captured selectors before file access, does not inherit
145
- old resolution authority, and adds no preparation schema/resolver/defaults.
146
- Unknown fields remain present for public core to reject. See the
147
- [request transport contract](2026-09-17-public-prepare-request.md); implementing
148
- the helper does not claim CLI router availability.
149
-
150
- ## Pinned real public consumer
151
-
152
- `test/portable-onboarding-public.acceptance.mjs` (deleted with v2) additionally executed the real
153
- public preparation/approval/retained-inspection APIs archived from exact core
154
- `c5c6a3c9171e424a36a1bdbf3932b9319a3c6c72`, without merging its branch. It uses
155
- isolated local Git transport, temporary deployments and a declared inert fixture
156
- knowledge capability—not OKF or a live service. The unchanged builder output
157
- crosses the public boundary with no added private `directory` and no stripped
158
- standalone/operator fields. Source identity, exact revision, explicit destinations,
159
- string/null contexts, approval-before-code and retained full-subject authority are
160
- checked. A newly appeared legacy lock still refuses before preparation.
161
-
162
- A separate case in the same explicit driver pins
163
- `257c4b96b67001fa2bcf38436e57106c44aa797b` for the actual public CLI
164
- `spawn --no-launch`. It uses the real producer, not hand-written instance metadata,
165
- to mint distinct incarnations and index admitted/completed fixture spawn-hook
166
- intents. It verifies exact retained subject/context/binding, private snapshot
167
- cleanup, and refusal of both repeated and occupied homes without overwrite.
168
- The result is still `launched:false`, `launchPending:true`; actual runtime launch
169
- and live provider behavior are not qualified.
170
-
171
- See the [fresh operator walkthrough](2026-09-16-fresh-operator-walkthrough.md) for
172
- exact reproduction, implemented public no-launch steps and the pending lifecycle-
173
- owned request-file router versus actual launch/provider qualification. The earlier standalone key limit mismatch is corrected: onboarding
174
- uses core's 256 UTF-8-byte bound, with no silent conversion. The pinned public
175
- consumer checks preservation of a non-ASCII key exactly at that boundary.
176
-
177
- Fresh setup is not permission to remove existing work, knowledge, native history,
178
- identities or credentials. It is also not release, provider/privacy qualification,
179
- instance launch, team creation or schedule activation.
@@ -1,26 +0,0 @@
1
- # Public preparation request-file transport
2
-
3
- ```
4
- oats prepare --request <absolute-regular-json-file> [--json]
5
- ```
6
-
7
- The JSON file is the **whole public `prepareCapturedComposition` input**—for fresh onboarding, only `buildFreshPreparationRequest(...).preparation`. It is not the onboarding result/ready-inspection wrapper, captured resolution/execution binding, private preparation scratch `directory`, or instance/work placement. No fields are filtered or inferred: the existing closed public validator rejects unknown fields. Preparation distinguishes workspace field presence from truthiness: every supplied workspace is validated, including null/false/zero/empty-string values, and it conflicts with any explicit standalone key. An absent workspace plus an explicit standalone null remains valid.
8
-
9
- The CLI delegates to `readPortablePreparationRequest` in `lib/portable-onboarding-request.mjs`, the same leaf used by onboarding consumers. It uses `readPortableBytes` and `parseStrictJson` once, with their existing bounds: regular/no-follow descriptor read, at most 8 MiB, strict UTF-8/JSON, duplicate-key rejection, depth 64 and 100000 entries. The full decoded object is frozen without filtering/defaulting. There is no new JSON/global argument parser, resolver, recursive include syntax, stdin/eval mode or private scratch API. Diagnostic errors are sanitized and do not echo raw provider values. Requests must contain nonsecret declarations and credential references, never credential values.
10
-
11
- `--request` is mutually exclusive with all other preparation input flags. Exclusivity and normalized absolute-path checks precede opening the file. Missing/nonregular/symlink files and invalid path arguments report `E_BAD_ARGS`; malformed UTF-8/JSON reports `invalid-declaration`, while byte/depth/entry excess remains `resource-limit` and observed read drift remains `integrity-drift`. This aligns the unreleased inline CLI prototype with the shared helper rather than maintaining competing error contracts. Explicit captured `--deployment`, `--resolution`, or `--artifact-set` selectors—including equals spelling and selectors before the command—are rejected before reading/preparing a request. Partial/malformed selectors retain the existing typed refusal.
12
-
13
- The shared routing boundary first uses `capturedSelector(args,{})` to inspect explicit selectors without inherited authority. Prepare then handles explicit new work; even malformed inherited OATS deployment/resolution/instance variables cannot select its source or context. Other commands retain their existing explicit/inherited capture rules. No global environment reset is performed.
14
-
15
- Existing forms remain supported:
16
-
17
- ```
18
- oats prepare --dir ABS --source GIT --revision REF --export PATH --alias NAME [--work MODE] [--json]
19
- oats prepare --dir ABS --workspace GIT [--workspace-revision REF] --alias NAME [--work MODE] [--json]
20
- ```
21
-
22
- All forms share the existing result renderer. Incomplete preparation preserves problems and exact approval requests in error details. A returned resolution is not enrollment, privacy, executable approval or actual launch success.
23
-
24
- This transport represents explicit **new-work input**, not a reusable ready-inspection permission. Fresh onboarding must still enforce its own preflight at the mutation boundary. After a first prepare writes managed state, explicit approved continuation uses ordinary public preparation; the CLI neither deletes that state nor imposes fresh-only restrictions on legitimate continuation.
25
-
26
- Focused tests cover complete native-transport requests with provider-owned operator bindings and explicit standalone string/null contexts; exact 256-byte Unicode key preservation; poisoned inherited selectors; source/workspace flag compatibility; mixed/duplicate/relative/malformed/symlink/oversized/unknown-field refusals; and before/after-command explicit selector refusal. These are isolated fixture preparation tests, not real provider privacy or managed-runtime launch qualification.
@@ -1,98 +0,0 @@
1
- # Provider-owned binding codecs — implementation boundary
2
-
3
- This implements the accepted provider-neutral binding direction, not a new policy
4
- engine or an OKF data model in the kernel. Current preparation deliberately returns
5
- `provider-not-qualified`; the following handshake is the next integration step.
6
-
7
- ## One provider, three bounded commands
8
-
9
- A fundamental capability may declare an optional versioned `binding` interface:
10
-
11
- ```json
12
- {
13
- "binding": {
14
- "version": 1,
15
- "normalize": "binding-normalize",
16
- "bind": "binding-bind",
17
- "check": "binding-check"
18
- }
19
- }
20
- ```
21
-
22
- Each value names an EXISTING command in that same capability manifest. It is not a
23
- second script/operation table. Those commands therefore already participate in
24
- self-containment, exact executable approval and retained resource inventory.
25
- Missing/unknown versions or references refuse. The interface belongs only to the
26
- manifest's fundamental slot.
27
-
28
- 1. **normalize** receives already parsed source/workspace/operator inputs with their
29
- origins and captured effective capability settings. It emits equality/presence
30
- requirements and bounded candidates for its own `/bindings/<slot>/…` fields.
31
- It must not select capability sources or rewrite another provider's fields.
32
- 2. The kernel combines these with existing requirements/candidates through the SAME
33
- `resolveChoices` engine. A conflict/incomplete result is not a usable binding.
34
- 3. **bind** receives the selected field values and emits the effective, NONSECRET
35
- ProviderBinding envelope plus credential references. Messaging additionally emits
36
- the responsible-human/private/wider choice envelope. Output does not certify
37
- membership, authorization or privacy. It cannot change the selected software.
38
- 4. **check** receives a captured binding at the requested action boundary and checks
39
- mutable credentials/host/provider readiness using native facilities. It does not
40
- rewrite the immutable binding or silently enroll/create a replacement team.
41
-
42
- Separating normalization from binding avoids constructing a payload before operator
43
- choices have passed the common resolver, or letting a provider carry its own hidden
44
- precedence implementation. The default OKF provider owns its node/store/schema rules;
45
- an alternate provider need not contain OKF reads/owns/stateDir fields.
46
-
47
- ## Execution and custody
48
-
49
- No codec executes merely because it was downloaded. Preparation reads current exact
50
- artifact approval first; missing approval exposes the prospective artifact set for
51
- explicit `oats trust --artifact-set`, not a fabricated partial resolution. Commands
52
- run from their verified retained root with bounded JSON stdin/stdout and duration,
53
- not imports from a current source directory. Errors handling malformed provider
54
- output must not quote possibly sensitive raw stdout/stderr.
55
-
56
- Preparation commands are normalization/rendering, not enrollment or lifecycle hooks.
57
- Approved provider implementations must keep those phases free of external mutations.
58
- Actual setup/identity/team lifecycle occurs only at its explicit later action boundary.
59
- This is a provider contract, not a claimed filesystem/network sandbox.
60
-
61
- Provider output is structurally validated, field ownership checked, and no complete
62
- record is published until binding/resource/helper preparation succeeds. Credential
63
- values are never copied into a record or notes; only supported lookup references are
64
- retained. A check's current result is not cached as permanent authority in the record.
65
-
66
- ## Delivery status
67
-
68
- The optional manifest field has a shared validator wired into the complete kernel
69
- manifest loader and its public structural schema. The [wire v1](2026-09-16-provider-binding-wire.md)
70
- now has a bounded codec and native invocation broker, exposed through core
71
- `runCapturedProviderBinding({deployment,artifacts,capability,phase,settings,input})`.
72
- It loads the complete retained manifest, verifies artifact/provenance, checks current
73
- exact approval before execution, and validates/sanitizes provider output. Shared
74
- ProviderBinding, MessagingChoice and captured-choice codecs are reused, not copied.
75
- A native fixture proves no unapproved child runs and all phases work after source
76
- deletion/current-config poison; that is transport evidence, not provider qualification.
77
-
78
- Preparation now supplies frozen decoded declarations/origins to the broker, merges
79
- provider-owned fields through the same resolver, and captures complete nonsecret
80
- bindings only after conflicts and provenance checks pass. Missing approval/interface
81
- or unresolved fields still expose prospective software without a fabricated record.
82
- Operator preparation input may include a provider-owned `bindings` map alongside its
83
- existing software `policy`; it does not introduce another precedence engine. Adoption
84
- origin-map keys are made subtree-relative while original document pointers/spans stay
85
- intact. A real standalone-OKF consumer probe at a pinned source commit verifies the
86
- cross-repository payload and source-deleted, non-ready check (an absent base is not ready).
87
-
88
- Captured action loading now runs read-only provider readiness against its exact
89
- binding; non-ready refuses before execution and is not cached in the immutable record.
90
- Synchronous captured CLI commands receive a private `OATS_BINDING_FILE` snapshot,
91
- not live configuration, with owned cleanup after success/failure. A real pinned OKF
92
- consumer fixture verifies its native snapshot loader against an initialized temporary
93
- base after source/config deletion. That is integration evidence, not production
94
- provider or privacy qualification.
95
-
96
- Captured lifecycle/registration consumers and full helper policy remain unfinished.
97
- Default-provider work remains in its own source repository. No live provider,
98
- private-team behavior, new release or deployment was qualified here.
@@ -1,274 +0,0 @@
1
- # Provider binding wire v1
2
-
3
- Concrete child/parent integration contract for [provider-owned codecs](2026-09-16-provider-binding-codecs.md).
4
- This is a bounded JSON protocol, not a second resolver or sandbox. Source commands
5
- must already have exact artifact approval before any phase runs.
6
-
7
- ## Transport
8
-
9
- Invoke the manifest-owned phase command with its declared arguments, no shell and
10
- no extra implicit flags. Write ONE UTF-8 JSON request to stdin and close stdin.
11
- Stdout is ONE JSON response; logs belong on stderr. Maximum request/response size
12
- is 1 MiB, depth 32, 16384 entries; execution timeout is at most 30 seconds. The
13
- native broker may accept a shorter explicit `timeoutMs` (1–30000). Timeout terminates
14
- only the spawned codec process with SIGKILL, not an ignorable SIGTERM; no existing
15
- session or unrelated process is targeted. Duplicate keys,
16
- trailing output, malformed UTF-8 and unknown envelope fields/versions refuse.
17
- Kernel diagnostics never echo provider stdout/stderr or free-form error messages.
18
- The command runs from its verified retained capability root. Ambient OATS/PI
19
- instance identity is scrubbed; kernel supplies only this capability's identity,
20
- root and effective settings. Native host facilities remain host-owned. This is
21
- not filesystem/network isolation, and normalization/binding must not enroll,
22
- write stores, publish knowledge or start workers.
23
-
24
- Every request has exactly:
25
-
26
- ```json
27
- {"schemaVersion":1,"phase":"normalize","slot":"knowledge","capability":"oats.okf","settings":{},"input":{}}
28
- ```
29
-
30
- `phase` is normalize/bind/check; slot is knowledge/messaging/tasks. Both must match
31
- the retained manifest. Settings are already selected and schema-validated.
32
-
33
- Success echoes the identity fields and contains `ok:true,result:{...}`. Failure
34
- echoes them and contains `ok:false,error:{code:"needs-configuration"}`. It has no
35
- result. All structured responses exit 0: transport completed, while `ok` is the
36
- semantic outcome. Nonzero exit/signal/timeout is transport failure. Allowed error/problem codes are needs-configuration, requirement-conflict,
37
- invalid-binding, authorization-required, host-requirement-missing,
38
- provider-unavailable and provider-not-qualified. Optional provider error/problem
39
- `message` is permitted. The 0.24.4 follow-up retains it ONLY when it exactly
40
- matches a fixed nonsecret reason in the VERIFIED selected capability manifest's
41
- optional `binding.reasons` array: **1–64 unique strings**, each **1–200 printable
42
- ASCII characters**, with no braces/interpolation markers. If the field is absent,
43
- the kernel's reviewed per-capability compatibility list applies; a present invalid
44
- or empty declaration refuses, never falls back. No trimming, Unicode normalization,
45
- interpolation, prefix matching, operator values, paths, or unlisted provider output
46
- cross this boundary. Code-only replies
47
- and unknown/unlisted messages keep the existing kernel template fallback.
48
-
49
- The allowlist is out-of-band kernel input, never declared by a provider response.
50
- Exact artifact approval is still required BEFORE invoking the codec. The broker
51
- preserves the vetted message and preparation rechecks it against the same selected
52
- manifest, retaining slot/capability/origins. JSON and human CLI diagnostics surface
53
- the reason; human output also shows an existing choice `key` when provided. This
54
- changes no readiness status, launch authority, credential contract or wire version.
55
- Older kernels reject the new optional manifest fields; providers declaring them
56
- must floor on the reasons-capable **0.24.4** kernel. The compatibility list serves
57
- older manifests, not a way around declaration validation. It includes the complete
58
- 30-message aweb1.11.0 codec vocabulary (including non-ready check reasons) and the
59
- seven OKF2.1.2 setting messages; it invents none for code-only OKF2.1.1.
60
-
61
- `binding.keys` is also accepted with **shape validation only** in0.24.4: a unique
62
- array of exact names or trailing-dot namespaces (`wider`, `stores.`), each matching
63
- `^[A-Za-z][A-Za-z0-9_-]*\\.?$` over the WHOLE string (no trailing newline). There
64
- is no filtering, overlapping-ownership check or owned/unowned-key attribution yet;
65
- those are deferred to0.25. Providers still receive the complete map and MUST ignore
66
- foreign keys themselves. Declaring keys does not authorize diagnostic text.
67
-
68
- Knowledge providers and harvesters follow the same separation: the
69
- [knowledge capability boundary](2026-09-16-knowledge-capability-contract.md) keeps
70
- models, retrieval, evidence selection, judgment and delivery in the capability.
71
- Shared invocation/evidence/helper execution is infrastructure, not a kernel harvester.
72
-
73
- ## Normalize
74
-
75
- `input` is `{declarations,context}`. Context is the captured workspace/standalone
76
- context, not a cwd to inspect. Each declaration has exactly
77
- `{kind,value,origin,origins}`:
78
-
79
- - kind: soul/workspace/adoption/operator;
80
- - value: the already-decoded soul declaration, workspace declaration, adoption
81
- object, or operator input respectively (not YAML bytes or a filename);
82
- - origin: its root Origin1; origins: JSON-pointer map of supplied Origin1 locators.
83
-
84
- The provider interprets only its domain. It must not reread live source/config.
85
- Returned origins must refer to supplied document/pointer witnesses. Soul hard
86
- constraints use soul-requirement, soul defaults use soul-default; candidates from
87
- other inputs use workspace-default/import-adoption/operator respectively. The
88
- kernel checks origin authority as well as its structure; a source cannot mint an
89
- operator candidate.
90
-
91
- Result is exactly `{requirements,candidates,model}`. Requirements/candidates use
92
- the existing resolveChoices wire entries. Every key must be a canonical JSON
93
- pointer strictly below `/bindings/<slot>/`. Only the kernel selects winners by
94
- combining these with the existing plan in the SAME resolver. Model is bounded
95
- opaque nonsecret provider data, passed unchanged into bind in this transaction.
96
-
97
- For default OKF, source `value.knowledge` is oats.okf.locations@1 with its existing
98
- owner/stores/reads/owns payload. A workspace `knowledge.stores[]` entry for that
99
- contract has `payload:{bindings:{"write.default":<portable locator>,...}}`.
100
- Adoption/operator `value.bindings` is the already-authored provider binding map.
101
- Several workspace envelopes remain separate same-authority inputs, not a merge
102
- that silently chooses a winner. Explicit selected settings may supply host-owned
103
- state placement; no stateDir or publication destination is inferred from a home.
104
- Other providers own their payload contracts; the kernel does not parse these OKF
105
- fields. Unknown/incompatible payload contracts must be reported, not reinterpreted.
106
-
107
- ## Bind
108
-
109
- `input` is exactly `{model,choices,context}`. Choices contains ONLY this provider's
110
- resolved `/bindings/<slot>/...` choices, including selectedBy/constraints/considered.
111
- Result is `{payloadContract,payloadVersion,payload,credentialRefs,provenance}` plus
112
- `messagingChoice` ONLY for messaging. Kernel adds schemaVersion/capability to form
113
- ProviderBinding1. Credential references use the EXISTING env or provider-reference
114
- shapes; values, keys and tokens are never copied. Payload is opaque NONSECRET data;
115
- providers are responsible for their domain's nonsecret validation.
116
-
117
- Messaging must return the existing enabled MessagingChoice1 with provider-resolvable
118
- responsible human and exact context, plus explicit wider-team consent. A populated
119
- binding is not evidence of enrollment/privacy/readiness. Non-messaging providers
120
- cannot set messagingChoice. Disabled messaging is represented by no messaging
121
- provider and `{schemaVersion:1,enabled:false}`, not an invented private team.
122
-
123
- For messaging lifecycle integration, the [capability contract boundary](2026-09-16-messaging-capability-contract.md)
124
- assigns generic intent/invocation to the kernel and native identity/team/transport
125
- behavior to the capability. Missing additional invocation fields need one reviewed
126
- versioned projection, not aweb-specific kernel behavior.
127
-
128
- ## Check
129
-
130
- `input` is `{binding,context,action,invocation?}` with no other fields. Binding is
131
- the complete immutable ProviderBinding1. Action is the requested captured action,
132
- not a new launch recipe. Optional `invocation` is the same bounded
133
- CapturedInvocationContext1 projected for execution below; if present, its capability,
134
- context and action must match this request. It is not nullable: omit it for an explicit
135
- scope check without invocation data. Identity-dependent provider actions must refuse
136
- missing instance context. Normalize/bind do not accept this field.
137
- Result is exactly `{status,problems}`; status is ready/needs-configuration/
138
- authorization-required/unavailable. Problems is an array of code + optional message
139
- objects using the error-code set above. Ready requires an empty problems array.
140
-
141
- Check performs provider-owned READ-ONLY mutable readiness/credential/store/member
142
- checks through existing native/provider mechanisms. Bounded private temporary Git
143
- staging for fetch/checkout/read is allowed with owned cleanup; accepted stores,
144
- operator checkouts and remotes must not be mutated. It does not change binding,
145
- initialize a base, enroll an identity, create a team, or schedule/publish work.
146
- Unsupported/unqualified checks return non-ready. Results are evaluated at each
147
- action boundary and never persisted as permanent authority in the resolution.
148
- A real provider acceptance is still required; fixture success is not certification.
149
-
150
- ## Captured command invocation
151
-
152
- The captured action loader runs the provider's check against the verified record at
153
- each command/operation/hook load; non-ready blocks before the action. Inspection and
154
- instruction composition do not enroll or claim readiness. Captured hook dispatch and public captured native start/restart are implemented.
155
- Public captured retirement remains unimplemented; managed-runtime/Pi adoption and
156
- real-host readiness remain separate qualification steps.
157
-
158
- For synchronous captured CLI commands, core writes the exact ProviderBinding1 to a
159
- fresh private invocation directory outside the home and retained artifacts. It
160
- passes only its absolute path in `OATS_BINDING_FILE`; the selected capability's
161
- retained root and effective settings are supplied separately. The file is owner-only
162
- mode `0600` and removed with its owned directory after success or failure. A pre-existing
163
- ambient snapshot variable is scrubbed. The caller must not exit before cleanup.
164
-
165
- This is an ephemeral invocation input, never the operator's live `bindings-file`
166
- or a durable worker pointer. A provider must distinguish absent (legacy) from
167
- present-but-invalid (refuse, no fallback). Independent work must freeze its needed
168
- binding/runtime data under existing durable source/attempt custody before returning;
169
- no async worker may rely on the invocation file remaining. No credential value is
170
- part of the ProviderBinding contract. Abrupt process death can leave private scratch;
171
- it does not make that scratch selectable authority or justify unsafe cleanup.
172
-
173
- ### Current paired execution transport versus explicit old ingress
174
-
175
- Current captured commands, operations and hooks with an actual selected provider binding receive BOTH `OATS_INVOCATION_CONTEXT_FILE` and `OATS_BINDING_FILE`. Generic invocation is universal; an additive/unbound capability legitimately has no binding snapshot. The supplemental source receipt is not a substitute for either input. Checks still use the existing stdin contract and optional inline invocation, not an additional file channel.
176
-
177
- The raw namespace-command route does not nominate an instance or admit an action. Source-independent existing-run completion therefore receives `instance:null`, `intent:null` and no instance-derived prior receipt, even after source-home deletion. The [existing-run completion boundary](2026-09-16-captured-admission.md#existing-provider-run-completion-after-source-home-deletion) keeps qualified retained provider-run custody separate from a new kernel mutation grant. No helper binding or invented live source identity substitutes for that authority.
178
-
179
- Binding/source-receipt-only fixtures represent explicitly OLD transport, not positives for the current paired reader. Missing, malformed or invalid-present current snapshots must not cause synthesized projections or silent fallback. Any deliberate old-ingress compatibility path is separately explicit and qualified against exact producer/provider pins; it does not silently upgrade old fixtures or alter the selected supplemental-input/registered-replay policy.
180
-
181
- ## Captured lifecycle registration input
182
-
183
- The kernel also has a bounded private `OATS_SOURCE_RECEIPT_FILE` projection for a
184
- synchronous captured lifecycle hook that explicitly selects
185
- `inputs.sourceReceipt:{version:1}` in its retained object-form declaration. No
186
- opt-in means no source snapshot, regardless of layer; generic invocation remains
187
- universal. See the [selected input contract](2026-09-17-capability-helper-input-contract.md). Its exact v1 payload is the agreed
188
- `{schemaVersion,kind,home,work,context,agent,instance,sourceIdentity,role,executionBinding,responsibleHuman,binding}`
189
- receipt. Persistent sources require their qualified captured soul identity; helper
190
- receipts require `sourceIdentity:null`. The context equals the durable execution
191
- deployment, the role is the retained canonical source instructions (bounded to
192
- 128 KiB), and the provider binding contains no credential values.
193
-
194
- The file uses the same owner-only mode `0600`, outside-home/retained-artifact custody
195
- and normal success/failure cleanup posture as `OATS_BINDING_FILE`. The home argument
196
- must match the receipt. Captured lifecycle hook loading preflights every applicable
197
- retained hook, exact approval, host requirement and provider readiness before the
198
- first lifecycle side effect, then preserves the existing hook metadata, warning,
199
- environment and required-hook result contract. Each selected receipt is derived only for its actual binding owner, from the
200
- verified canonical body and owned generic instance/action facts, before provider
201
- readiness/effects. Multiple opting providers get separate same-owner snapshots;
202
- unsolicited/contradictory explicit receipts refuse and caller extraEnv cannot
203
- nominate snapshot paths. No knowledge-slot dependency or automatic receipt is
204
- inferred. This supplemental input is not a generic messaging identity contract
205
- or permission for new registration through an absent-input fallback.
206
-
207
- ## Provider-neutral captured invocation context
208
-
209
- Captured commands, hooks and operations receive one private mode-`0600`
210
- `OATS_INVOCATION_CONTEXT_FILE`. Read-only checks receive that same validated data in
211
- `input.invocation` instead, NOT via a second file/environment source of authority.
212
- This enables setup-specific admission without requiring already-completed enrollment.
213
- The unreleased v1 payload is:
214
-
215
- ```text
216
- {schemaVersion:1, executionBinding,
217
- subject: <exact captured record subject>,
218
- instance:null|{home,work,name,agent,incarnationId},
219
- intent:null|{schemaVersion:1,executionId,incarnationId,attempt},
220
- context, responsibleHuman, messagingChoice,
221
- capability, action, priorReceipt}
222
- ```
223
-
224
- The subject is the existing closed union: `{kind:'persistent',soul: SoulSelection}`
225
- or `{kind:'helper',provider: CapabilityArtifactRef,definition: ResourceRef,name}`.
226
- Helpers retain their exact provider artifact and definition, not an alias-derived
227
- identity. The shared subject/context codecs and structural schemas are reused.
228
- Overall limits are 512 KiB, depth 32 and 16384 entries; `priorReceipt` separately has
229
- 128 KiB, depth 24 and 8192 entries. Its JSON is opaque and nullable, never credentials.
230
-
231
- The kernel derives it from the verified record, explicit target and that capability's
232
- current stored metadata/index before provider readiness or execution. Non-null instance
233
- facts and any supplied prior receipt must match the captured home's owned incarnation,
234
- record and indexed receipts; a scope action has instance:null and no invented home. A public broker check
235
- with invocation re-verifies the referenced record and matches the entire binding,
236
- artifact set and effective settings, not merely the request's syntactic shape.
237
- `action` is the
238
- existing exact loader action (`command` with capability/namespace and name, `hook`
239
- with capability/name, or `operation` with slot/name), not a new action table.
240
- `messagingChoice`
241
- carries the requested private floor and explicit wider set; it is intent, never proof
242
- of privacy/enrollment. `priorReceipt` is bounded opaque JSON owned by the selected
243
- capability. Credential values remain outside all three snapshots. Providers must use
244
- the exact execution/source/instance/context/human/action facts and reconcile retries
245
- against their prior receipt; they must not infer replacements from cwd, OS user,
246
- display name, source alias or ambient configuration.
247
-
248
- The file uses the same owned scratch, success/failure cleanup and observed-result
249
- preservation boundary as the binding/source snapshots. Captured hook dispatch recovers
250
- an observed opaque provider receipt even if several nested snapshot cleanups fail,
251
- including after a nonzero child exit. It records a required, unconfirmed cleanup
252
- failure rather than treating the hook as clean or discarding receipt-owned effects.
253
- This accounting is provider-neutral and does not interpret knowledge or messaging data.
254
- Existing
255
- `OATS_SOURCE_RECEIPT_FILE` remains a selected supplemental source-context input,
256
- not a messaging-specific or general identity mechanism. Provider registration,
257
- helper skipping/recursion policy and qualified existing-descriptor replay stay
258
- provider-owned; absence alone does not identify a dependent/non-ready provider. Captured hook dispatch and public captured
259
- start/restart are implemented; public captured retirement remains unimplemented.
260
- Managed-runtime/Pi adoption and real-host qualification remain outstanding. These
261
- captured paths must not fall back to current source or configuration.
262
-
263
- This addition is an unreleased coordinated wire change: both provider validators
264
- must accept optional `check.input.invocation` and the exact subject union before a
265
- new compatible provider pin is used. The new incarnation/intent fields also need
266
- coordinated successor consumers; earlier pins are not silently patched or claimed
267
- compatible. [Captured admission](2026-09-16-captured-admission.md) records opaque fresh
268
- incarnations and logical request IDs before effects using the existing home index.
269
- An explicit retry reuses its ID/receipt; identical distinct requests get distinct IDs.
270
- Composition/home/alias values are never replacement identities. Actual captured native dispatch is implemented under indexed incarnation/intent
271
- custody. Stable scheduler execution-ID propagation and broader managed-runtime/Pi
272
- and real-host qualification remain outstanding; inert fixture dispatch does not
273
- prove model health or task completion. Admission
274
- authorizes an attempt/reconciliation, not duplicate native effects, enrollment or privacy.