@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,417 +0,0 @@
1
- ---
2
- type: Playbook
3
- status: accepted-for-implementation
4
- title: Portable Souls infrastructure delivery and acceptance ledger
5
- description: Fifteen binding decisions mapped clause by clause to dependency-ordered delivery and evidence gates; baseline retention is storage-only.
6
- timestamp: 2026-09-15
7
- ---
8
-
9
- # Portable Souls infrastructure implementation
10
-
11
- ## Authority, scope and evidence rules
12
-
13
- Direct human authorization on 2026-09-15 permits infrastructure implementation
14
- and eventual deployment under the accepted constraints. It supersedes historical
15
- “not implementation authorized” language, not design boundaries. **Desktop feature
16
- work is later.** This documentation lane owns only `docs/design/`; it performs no
17
- commits/pushes, branch switches, live installation/activation, credential operations,
18
- schedulers, model/GUI launches or session control. Never integrate held capture
19
- patch `54b07ee`. Primary checkout, earlier roster/KB drafts and `soul/knowledge/`
20
- are not edit surfaces for this delivery.
21
-
22
- Binding inputs, all portable repository paths:
23
-
24
- - [Handoff: 15 decisions](2026-09-15-portable-souls-handoff.md#2-the-decisions-binding).
25
- - [Reconciled proposal](2026-09-14-portable-souls-and-git-workspaces.md), incorporating
26
- the [complete substantive amendment](2026-09-14-portable-souls-contract-amendments.md).
27
- - [Landed retention contract](2026-09-14-artifact-retention-contract.md), especially
28
- “Resolution and lock integration proposed next” and “Consumer migration”. Its
29
- integration requirements are binding despite the historical heading.
30
- - [Reconciled explainer](2026-09-14-portable-souls-explainer.md); LFX examples are
31
- hypothetical illustrations, not actual repositories, team setups or credentials.
32
- - Package engine (`package-engine-contract.md`, removed in 0.26), runtime API (`package-runtime-api.md`, removed in 0.26)
33
- and [current knowledge runtime](../knowledge.md) for preserved contracts.
34
- The [older knowledge brief](2026-09-13-knowledge-and-memory-direction.md) provides
35
- doctrine, not a competing source/default schema or permission to auto-edit skills.
36
-
37
- **Baseline:** `428cd9af615652c4a93d754c1106674abd18545b`, branch
38
- `feat/portable-souls-infrastructure`. Retention source and storage tests are landed.
39
- Installer, lock, runtime and queued-work consumers are not migrated by that patch.
40
- Concurrent uncommitted foundation work is not counted here as landed or qualified.
41
-
42
- **Ledger discipline:** “documented” means the accepted clause is reconciled, not
43
- implemented or tested. Every unchecked box below is an acceptance obligation; none
44
- is checked merely because this document exists. Add exact commands, revision/tree
45
- identity, pass/fail/skip counts and evidence paths when a gate actually runs. A
46
- fixture proves only what it executes. Scaffolds are not model learning, storage
47
- A/B execution is not lifecycle A/B dispatch, a PR is not accepted knowledge, and
48
- recording team choices is not enrollment or privacy qualification.
49
-
50
- ## Fifteen-decision checklist
51
-
52
- ### D01 — Three responsibilities
53
-
54
- Contract: handoff decision 1; proposal §3, §10. Documentation reconciled.
55
-
56
- - [ ] Soul declares needs and sources; workspace declares admission/defaults,
57
- knowledge stores, team references and catalogs; deployment resolves, installs,
58
- binds credentials and keeps state. Verify each field has the right owner.
59
- - [ ] Source, install location, work target and team membership remain independent;
60
- changing each cannot silently infer or change another.
61
-
62
- ### D02 — Source-complete soul declarations
63
-
64
- Contract: decision 2; proposal §4. Documentation reconciled; nesting needs parser review.
65
-
66
- - [ ] Every intrinsic capability resolves from `git:<repo>@<selector>#<package-path>`
67
- or a contained `repo:` source; selected package really exports the capability ID.
68
- - [ ] `repo:packages/self-serve-dev` uses the retained source **repository root**;
69
- nested soul directories, cwd, installation root and work target cannot change it.
70
- - [ ] Reject snapshot escape and broken/escaping symlinks; retain the required
71
- snapshot resources after the original source disappears.
72
- - [ ] `path:` is explicitly nonportable; no ambiguous `./` source spelling in
73
- portable declarations or hidden upstream catalog-nickname dependency.
74
-
75
- ### D03 — Requirements versus defaults
76
-
77
- Contract: decision 3; proposal §4, §12. Documentation reconciled.
78
-
79
- - [ ] `requires` constrains every successful composition; `defaults` selects fallback
80
- values within those constraints, not another configuration hierarchy.
81
- - [ ] Abstract requirements can use adopter providers; intrinsic implementation
82
- requirements cannot be erased by operator/import/workspace defaults.
83
- - [ ] Conflicting sources/requirements fail with **both origins/paths** reported.
84
- `messaging: any` alone supplies no software, credentials or private team.
85
-
86
- ### D04 — Two authorities, no repository tier or agent-types
87
-
88
- Contract: decision 4; proposal §12. Documentation reconciled.
89
-
90
- - [ ] Resolve workspace defaults and soul declarations through **one resolver**;
91
- no repository capability-default tier and no agent-types/family entity.
92
- - [ ] Import adoption is workspace-side, keyed by qualified source identity, not
93
- short alias; spawn choice can override it only within hard constraints.
94
- - [ ] Exactly one workspace context is selected; publisher workspace policy cannot
95
- leak into imported composition. Standalone unresolved bindings report missing.
96
- - [ ] Repository briefing (`agents-md-injection`) and worktree setup follow the
97
- repository actually worked on, not the soul source; executable trust still applies.
98
- A no-Git directory target remains valid without invented membership.
99
-
100
- ### D05 — Reciprocal membership for every member kind
101
-
102
- Contract: decision 5; proposal §5–§7. Documentation reconciled.
103
-
104
- - [ ] At recorded revisions and qualified identities, operator can read workspace
105
- and member, workspace admits member, and member names workspace.
106
- - [ ] Apply the same rule to project, experts, capabilities and knowledge repositories.
107
- A fork with a copied backlink or an adjacent folder is not admitted.
108
- - [ ] Consuming a package, public soul or public knowledge store never implies
109
- membership or needs a publisher backlink.
110
- - [ ] Index discovery is bounded and data-only, respects authorization context and
111
- reports stale/unavailable honestly; it executes no repository script and does
112
- not expose protected descriptions via broad caches/aggregate indexes.
113
- - [ ] Equivalent remotes can be qualified; rename/transfer/source-move cases require
114
- explicit provenance, not same-filename identity substitution. Exact syntax reviewed.
115
-
116
- ### D06 — External-soul import by reference
117
-
118
- Contract: decision 6; proposal §4 import section and §10. Documentation reconciled.
119
-
120
- - [ ] Accept canonical source repository, exported soul path, revision selector and
121
- adopter-local alias; never copy into an adopter-maintained soul definition.
122
- - [ ] Retain exact source revision and full required source resources. Upstream
123
- identity, exact revision and local alias are distinct; alias changes do not create
124
- souls, selector changes do not themselves create new global running identities.
125
- - [ ] Workspace advertisement does not admit publisher; standalone prepare accepts
126
- the same reference. Private sources still use existing Git access.
127
- - [ ] Adoption defaults map team aliases, default knowledge destinations and providers
128
- within requirements. Mapping advertises, never enrolls; explicit spawn choices
129
- have the same bounds. No fork/config-copy workaround is needed.
130
- - [ ] Persistent imported/member souls produce the same resolution shape; retain
131
- their sources separately, never disguise them as ephemeral capability helpers.
132
-
133
- ### D07 — Project-first expertise
134
-
135
- Contract: decision 7; proposal §9. Documentation reconciled.
136
-
137
- - [ ] Project souls live conventionally at `agents/<name>/`, several per repository
138
- as needed; experts repositories serve cross-repository subjects, not compulsory
139
- centralization. Role examples are named for expertise, not job assignments.
140
- - [ ] Canonical AGENTS.md and CLAUDE.md alias plus complete curriculum/reference
141
- closure survive retention; no silent conversion to an ephemeral helper.
142
-
143
- ### D08 — Knowledge at both levels, provider-neutral kernel
144
-
145
- Contract: decision 8; proposal §3 and §10. Documentation reconciled.
146
-
147
- - [ ] Workspace advertises stores/default provider; soul carries source-complete
148
- locators or **explicitly inherited** bindings. Later reads/harvests need no
149
- workspace fetch. Fixed sources and rebindable defaults are distinguishable.
150
- - [ ] Default OKF `reads` includes store+node; `owns` includes node+optional
151
- destination. Absent destination inherits an explicitly selected write binding
152
- or reports `needs configuration`, never silently creates a substitute.
153
- - [ ] Resolved addresses are store-qualified; equal leaf names in different stores
154
- do not collide. Multiple owned stores work: no one-store-per-soul invariant or
155
- unapproved single-write-store product limit.
156
- - [ ] Each node has one explicit steward and each promoted concept an explicit
157
- destination. Steward, proposing harvester and accepting maintainer remain distinct;
158
- multiple proposers are not conflicting ownership. Git delivery is PR-only,
159
- public or private, and acceptance requires merge-visible evidence.
160
- - [ ] A public read never publishes adopter notes/captures. Write destination and
161
- publication intent are explicit; do not invent a disclosure/ACL engine here.
162
- - [ ] Kernel envelope retains effective **non-secret**, provider-owned configuration
163
- and binding provenance with separate credential references. An alternate provider
164
- reports its own configuration/readiness without implementing OKF nodes or harvest.
165
-
166
- ### D09 — Private-first choices, provider qualification required
167
-
168
- Contract: decision 9; proposal §12. Documentation reconciled; provider gate unqualified.
169
-
170
- - [ ] Messaging-enabled private key uses provider-resolvable **human identity plus
171
- qualified workspace identity**, reused across the human's machines. OS username,
172
- checkout path or agent alias is insufficient. Standalone has an explicit context key.
173
- - [ ] Child and scheduled instances inherit responsible human; messaging-disabled
174
- workers create no team. Required missing provider/bindings block readiness.
175
- - [ ] Wider memberships are opt-in per instance; an explicit wider set replaces
176
- wider defaults and preserves private floor. Alias map alone never enrolls.
177
- - [ ] One global instance identity supports multiple membership credentials and
178
- survives widening/narrowing; local process/session/deployment-record IDs and
179
- team-qualified addresses are not replacement global identity keys.
180
- - [ ] A **named messaging owner** qualifies catalog visibility, live-instance
181
- visibility, inbound contact and conversation-history access **separately**.
182
- Wider membership exposes neither earlier private history nor other private
183
- instances; ordinary members versus host/service administrators are distinguished.
184
- - [ ] Before that qualification, record choices only and explicitly claim **no
185
- provider privacy guarantee**. No blanket readiness based on fields being present.
186
-
187
- ### D10 — One default provider per slot, v1 simplification
188
-
189
- Contract: decision 10; proposal §12. Documentation reconciled; simultaneous test open.
190
-
191
- - [ ] Knowledge/messaging/tasks have zero or one default provider per slot in v1;
192
- document this as a product simplification, not a universal capability limitation.
193
- - [ ] Examine simultaneous Jira + GitHub: default interface plus service integration
194
- versus named bindings. Record review outcome before choosing either; do not
195
- claim solved or build a generalized multi-provider solver by assumption.
196
-
197
- ### D11 — Captured managed composition and retention
198
-
199
- Contract: decision 11; proposal §10–§11; retention contract. Documentation reconciled.
200
-
201
- - [ ] Resolve channel/pin once per transaction, consistently across all references;
202
- captured resolution includes soul snapshot, capability closure, helpers, commands,
203
- hooks and managed runtime resources, non-secret configuration and provenance.
204
- - [ ] Several artifacts per capability coexist, one artifact per capability ID per
205
- instance; incompatible closure paths fail with both origins, no newest-wins rule.
206
- - [ ] Publish every required artifact then commit a **complete** resolution before
207
- launch; failure may leave unreferenced valid trees, never a selectable partial record.
208
- - [ ] Instance and independent queued work retain exact references outside homes;
209
- launch/restart/retire/recovery/generated commands/runtime packages/helpers use
210
- those roots after source/home deletion, never today's ambient config/lock.
211
- - [ ] Retain conservatively while instances, pending jobs or supported recovery
212
- paths reference source trees, artifacts and records; no elaborate GC initially.
213
- - [ ] Immutability is OATS-managed software only, not knowledge contents, credentials,
214
- membership, work repo, services or host tools. Credential rotation and authorized
215
- membership change do not silently upgrade software; rollback does not undo external
216
- writes and shared external-state compatibility belongs to providers.
217
- - [ ] Recurring schedules state capture versus explicit later reprepare policy;
218
- capture remains proposed pending review. Already queued executions never advance.
219
-
220
- ### D12 — Trust and explicit freshness
221
-
222
- Contract: decision 12; proposal §11. Documentation reconciled.
223
-
224
- - [ ] Commands, hooks **or environment (`env`)** make a capability executable;
225
- changed executable artifact integrity/revision needs fresh approval. Retention,
226
- catalog identity, publisher continuity and a local download confer none.
227
- - [ ] Declarative skills receive bounded visible change notices without adding an
228
- execution-approval gate; unchanged artifacts need not lose approval merely for
229
- unrelated source-repository changes.
230
- - [ ] Explicit prepare/update refreshes once per transaction; show available-unapproved
231
- beside last-approved usable, never “latest” for the latter. Offline/stale/failure
232
- states remain visible; failed required updates do not claim successful refresh.
233
- - [ ] No daemon, unattended trust or unattended approval in v1. Any future bounded
234
- policy is a separate product decision, not a shortcut around an approval prompt.
235
-
236
- ### D13 — Versioned mode-aware digest at migration
237
-
238
- Contract: decision 13; retention “Storage API implemented in this patch”. Documentation reconciled.
239
-
240
- - [ ] New digest covers file bytes, symlink targets and regular-file executable flag
241
- normalized from owner execute, `(mode & 0o100) !== 0`, identically for Git and `path:`.
242
- - [ ] Versioning unambiguously distinguishes formats; old bytes/symlink digests remain
243
- verifiable and are never reinterpreted as covering modes or silently reapproved.
244
- - [ ] Group/other execute and all other mode bits are outside identity. Retention
245
- preserves modes, never rewrites them or infers entrypoints by parsing free-form
246
- command/hook strings. This models execution by the owning deployment operator,
247
- not arbitrary OS principals. New wire spelling requires schema review.
248
-
249
- ### D14 — Explicit, honest migration
250
-
251
- Contract: decision 14; retention “Consumer migration”. Documentation reconciled.
252
-
253
- - [ ] One explicit store/lock migration verifies existing flat artifacts and preserves
254
- those exact inputs, not refetched moving-source substitutes for overwritten history.
255
- - [ ] Existing instances/jobs report `reconstructed`, `partial` or `unknown`, with
256
- evidence and unresolved inputs. Partial/unknown cannot pass complete readiness
257
- in CLI or later Desktop; running sessions remain intact, restart boundary chosen
258
- by their owners.
259
- - [ ] Follow all five consumer steps: (1) schema/store migration, (2) acquisition and
260
- preparation retention, (3) new instance/job captured references, (4) evidence-based
261
- old-record migration, (5) remove mutable lookups and update diagnostics/removal.
262
- No permanent dual resolver/store model.
263
- - [ ] Check acquisition, restoration, trust, discovery, spawn, launch, retirement,
264
- package/CLI diagnostics and scheduler/operation callers. A path in metadata is
265
- not proof of retained implementation. Preserve typed absence/invalid/drift refusals
266
- and never silently repair damaged retained trees or records.
267
-
268
- ### D15 — No new infrastructure
269
-
270
- Contract: decision 15; proposal §6–§8. Documentation reconciled.
271
-
272
- - [ ] Git hosting, selected messaging provider and existing machines are sufficient;
273
- no registry, discovery daemon or OATS user/permission database is introduced.
274
- - [ ] Standalone/no-Git deployment uses the same explicit-scope APIs, not a fake
275
- workspace or parent-directory authority scan. Only required source closure is
276
- acquired; optional caches are optimizations, not authority or activation.
277
-
278
- ## Dependency-ordered delivery plan
279
-
280
- Owners here are **responsibilities**, not assignments to a deployment/person.
281
- Parallel code work may proceed only at settled interfaces; synthesis and adversarial
282
- review bind the exact combined tree. Documentation status does not approve syntax.
283
-
284
- | Stage | Prerequisites | Deliverable / boundary | Acceptance evidence needed | Ledger at baseline |
285
- |---|---|---|---|---|
286
- | P0 — Documentation reconciliation | Full handoff, amendment and landed contract | Maintainer: reconcile proposal/explainer/handoff, preserve public amendment, this ledger | Link/fence/checklist/provenance checks; independent clause review | Documentation checks and final read-only review passed; receipt below |
287
- | P1 — Acyclic artifact mechanics | Retention contract; P0 constraints | Foundation: shared copy/digest/publication leaf; core and retention consume it without a cycle; no policy/lifecycle in leaf | Dependency graph/import tests and original retention tests; behavior-preserving baseline digest | Pending acceptance; concurrent code edits not certified here |
288
- | P2 — Versioned records and source custody | P1; schema review | Resolution/storage: explicit-scope records outside homes; separate source retention; exact identity/revision/alias; per-choice provenance and constraints; provider-neutral payload; typed refusals | Invalid/partial/prototype-safe record tests, source resource closure and deletion, atomic publication and damaged-tree refusal | Pending; wire versions/paths require review |
289
- | P3 — Soul declarations | P0; source/parser review coordinated with P2 | Parser: git/repo/path, requires/defaults, fixed versus rebindable knowledge, aliases; no type/repository tier | Nested-source base/containment, conflict origins, missing bindings, source completeness | Pending; examples are not schemas |
290
- | P4 — Workspace and discovery | P3 identities; canonical-remote review | Discovery: reciprocal members of every kind, bounded data-only exports, stores/defaults/catalogs/import advertisements | Two layouts, uncloned/inaccessible/forked/renamed sources, authorization-context cache tests | Pending |
291
- | P5 — Import and bounded composition | P2–P4 | Resolver: by-reference import, qualified adoption defaults, same standalone reference, one workspace, work-target briefing | Same public soul unchanged in org and no-Git standalone; source identity/revision/alias; no copy or false membership | Pending |
292
- | P6 — Explicit preparation transaction | P1–P5 | Acquisition/resolution: select once, publish artifacts, commit complete record before launch; preserve trust/host requirements; no implicit provider default | Failure injection before publication/commit/launch, available-unapproved vs last-approved, env-only gate, visible declarative changes, separate readiness | Pending |
293
- | P7 — Coordinated consumer/migration boundary | P2/P6; reviewed lock/digest migration | Lifecycle: implement retention contract steps 1–5 as one migration; wire acquisition/restore/trust/CLI and all dispatch consumers; no ambient substitutions | A/B end-to-end lifecycle/queued job after source deletion, legacy status evidence, old/new digest tests, referenced-removal protection | Pending; no scheduler activation |
294
- | P8 — CLI/provider readiness | P5–P7 | CLI and provider owners: show provenance/choices/missing configuration, reconstructed/partial/unknown; alternate knowledge payload | JSON/text diagnostic contract checks; alternate provider is not forced into OKF; explicit store-qualified default payload | Pending |
295
- | P9 — Messaging qualification | Named owner; P5–P8; approved provider test plan | Messaging owner: human/context identity, private reuse, wider choices, global identity continuity and four grants | Two humans on two hosts each; child inheritance; widen/narrow; discovery/contact/history/admin limits; messaging-disabled and standalone cases | **Unqualified**; choices only until evidence |
296
- | P10 — Operational rollout | Exact-tree infrastructure review and applicable P1–P9 gates | Deployment owner: deliberate release/install/migration with preserved running sessions and separate operational evidence | Required scaffold-only probes/retirement when authorized for that lane, installed-consumer tests, honest missing/unqualified status; no capture-patch integration | Not performed by this documentation lane |
297
- | Later — Desktop features | Infrastructure APIs/readiness and separate feature delivery | Desktop owner consumes same records and diagnostics, never promotes partial/unknown to complete | Later GUI acceptance; cannot substitute for infrastructure or messaging proof | **Later**, not this phase |
298
-
299
- P2 and P3 can refine syntax together; neither silently standardizes examples before
300
- parser review. P7 can be built incrementally, but consumers must not be declared
301
- migrated until the coordinated boundary is complete. P9 does not block recording
302
- choices or honest incomplete CLI diagnostics; it blocks enrollment/privacy claims.
303
- P10 is not permission for this documentation lane to perform any live operation.
304
- Simultaneous Jira/GitHub must be investigated before any related solver/binding
305
- extension; no stage chooses its answer here.
306
-
307
- ## Acceptance ledger
308
-
309
- | Gate | Falsification / required observation | Evidence state |
310
- |---|---|---|
311
- | A0 — Retention prerequisite | A/B trees execute their own storage-test payload after removing original source, flat store and lock; damaged entries not repaired | Landed source/tests at baseline, per retention contract; not rerun or widened into runtime proof by this document |
312
- | A1 — Portable adoption | Same public soul unchanged in organization and no-Git standalone; no publisher workspace; public read and explicit adopter write destination; source/revision/alias independently verified | Pending executable acceptance |
313
- | A2 — Private-first | Two humans, two hosts each; inherited child, same private key across hosts, wider set replace/narrow, stable global identity; four grants separately qualified; no silent knowledge-binding change | Unqualified; named messaging owner required, no privacy guarantee |
314
- | A3 — A/B runtime | Old instance AND independent queued work run A's lifecycle/recovery after source removal while new work uses approved B; no ambient latest lookup | Pending; storage A0 is insufficient |
315
- | A4 — Resolution/trust failure | Conflict provenance, missing bindings, env-only approval, no selectable partial record; explicit refresh notices and no unattended trust | Pending |
316
- | A5 — Knowledge neutrality | Store-qualified nodes/destinations, multi-store stewardship, PR versus acceptance, public reads not publication; alternate provider configuration without OKF semantics | Pending |
317
- | A6 — Migration/digest | Old evidence graded, overwritten artifact honestly unrecoverable, running sessions preserved; versioned owner-execute digest with old-format verification | Pending |
318
- | A7 — Discovery/access | Reciprocal admission every kind; forks/unadmitted excluded; bounded data-only indexes and protected descriptions/authorization caches; no new registry | Pending |
319
- | A8 — Documentation consistency | Full amendment coverage; 15 decisions; portable links; no stale operational/privacy claims; illustrative YAML not presented as final schema | **Passed for documentation only**; validation and final review receipt below |
320
-
321
- No live acceptance, deployment, model learning or GUI evidence is manufactured by
322
- this ledger. Consumer/API paths must be inspected at the actual tested revision;
323
- this plan is not an instruction to bypass protected current sessions or trust.
324
-
325
- ## Documentation validation receipt
326
-
327
- Validation on 2026-09-15, documentation only:
328
-
329
- - Inline Python static validator: **5 files**, **48 local links/anchors**, **15
330
- balanced fenced blocks** before adding the reproducible command below; handoff
331
- decisions **1–15** and checklist sections **D01–D15** present; trailing-whitespace
332
- and private-path/credential-marker scans passed. This is not a general secret scan.
333
- - The appendix's substantive text was compared byte-for-byte with the complete
334
- supplied amendment from its “Section 3” heading onward: **identical**. Its SHA-256
335
- is `053118e61807a4d4d57a0de12a96833c7de76f0fc7d29df0ff49ade646b83e50`.
336
- The checksum permits future verification without an ignored source file.
337
- - The final reproducible public-only command below ran via `bash -e -c` and
338
- **passed: 5 files, 48 links/anchors, 16 fenced blocks, 15 decisions/checklists**,
339
- plus the substantive amendment checksum. No parser/runtime behavior was tested.
340
- - `git diff --check -- docs/design` and
341
- `git diff --exit-code -- docs/design/2026-09-14-artifact-retention-contract.md`
342
- **passed** for tracked whitespace and preservation of the landed contract.
343
- The separate new-file whitespace loop below also passed for all five documents.
344
- - Read-only workflow `binding_design_review`: full clause/amendment/retention review
345
- passed; explainer review returned three concrete inconsistencies (unconditional
346
- B selection, approval per source revision rather than changed artifact, and
347
- publication equated with launch). All three were corrected.
348
- - Read-only workflow `binding_design_final_review`: **passed with no findings**.
349
- The reviewer read all five documents, rechecked the full explainer and all three
350
- fixes, and independently confirmed the appendix checksum, trailing whitespace
351
- and unchanged retention contract. Documentation acceptance only; runtime work,
352
- parser/schema approval and provider qualification are still separate gates.
353
-
354
- No parser acceptance, lifecycle test, model learning, deployment or provider privacy
355
- claim follows from these checks. The landed retention contract remains unchanged.
356
- Runtime/full repository tests belong to the foundation/consumer lanes and are not
357
- claimed run by this documentation task.
358
-
359
- Reproducible **public-only documentation check**, from the implementation worktree
360
- root (checks these five files, not implementation behavior):
361
-
362
- ```bash
363
- python3 - <<'PY'
364
- from pathlib import Path
365
- import hashlib, re
366
- root = Path('docs/design')
367
- files = sorted(root.glob('*portable-souls*.md'))
368
- assert len(files) == 5
369
- links = blocks = 0
370
- for path in files:
371
- text = path.read_text()
372
- assert text.endswith('\n') and not text.endswith('\n\n'), path
373
- assert all(line == line.rstrip() for line in text.splitlines()), path
374
- # Track Markdown fences, not inline backticks in the displayed checker.
375
- fence = None
376
- for line in text.splitlines():
377
- match = re.match(r'^(`{3,})(.*)$', line)
378
- if match and fence is None:
379
- fence = match[1]
380
- blocks += 1
381
- elif match and match[1] == fence and not match[2]:
382
- fence = None
383
- assert fence is None, path
384
- for target in re.findall(r'\[[^\]\n]+\]\(([^\s)]+)\)', text):
385
- if re.match(r'^[a-z]+://', target):
386
- continue
387
- name, _, anchor = target.partition('#')
388
- destination = path.parent / name if name else path
389
- assert destination.exists(), (path, target)
390
- if anchor:
391
- headings = re.findall(r'^#{1,6} (.+)$', destination.read_text(), re.M)
392
- slugs = [re.sub(r'[^\w\- ]', '', h.lower()).replace(' ', '-') for h in headings]
393
- assert anchor in slugs, (path, target)
394
- links += 1
395
- # This is a narrow marker check, not a credential-discovery operation.
396
- forbidden = ['/' + 'Users/', 'instances/' + 'oats-expert', 'juan.' + 'aweb.ai']
397
- assert all(marker not in text for marker in forbidden), path
398
- handoff = (root / '2026-09-15-portable-souls-handoff.md').read_text()
399
- body = handoff.split('## 2. The decisions (binding)\n')[1].split('## 3.')[0]
400
- assert re.findall(r'^(\d+)\. ', body, re.M) == [str(i) for i in range(1, 16)]
401
- ledger = (root / '2026-09-15-portable-souls-implementation.md').read_text()
402
- assert re.findall(r'^### D(\d\d) ', ledger, re.M) == [f'{i:02}' for i in range(1, 16)]
403
- appendix = (root / '2026-09-14-portable-souls-contract-amendments.md').read_text()
404
- marker = '## Section 3: responsibilities and knowledge'
405
- body = marker + appendix.split(marker, 1)[1]
406
- assert hashlib.sha256(body.encode()).hexdigest() == '053118e61807a4d4d57a0de12a96833c7de76f0fc7d29df0ff49ade646b83e50'
407
- print(f'PASS: {len(files)} files, {links} links/anchors, {blocks} fenced blocks; 15 decisions, 15 checklists; amendment checksum')
408
- PY
409
- for file in docs/design/*portable-souls*.md; do
410
- status=0
411
- output=$(git diff --no-index --check /dev/null "$file" 2>&1) || status=$?
412
- # --no-index may return 1 for differences even without whitespace errors.
413
- test -z "$output" && test "$status" -le 1 || { printf '%s\n' "$output"; exit 1; }
414
- done
415
- git diff --check -- docs/design
416
- git diff --exit-code -- docs/design/2026-09-14-artifact-retention-contract.md
417
- ```
@@ -1,122 +0,0 @@
1
- # Selection lock and approval — implementation boundary
2
-
3
- The new private API in `lib/portable-lock.mjs` implements selection lock v3.
4
- It is not yet connected to the public package CLI or migration. Old v1/v2
5
- readers and `docs/oats-lock.schema.json` retain their existing interpretation.
6
- The new structural schema is `docs/oats-lock-v3.schema.json`; changing the old
7
- public CLI/schema to admit it remains an explicit consumer-cutover gate.
8
-
9
- ## Future selections, not historical authority
10
-
11
- A lock has `lockfileVersion: 3`, `artifactSets` and `selections`. Artifact sets
12
- reuse `validateArtifactSet`; their keys hash the canonical complete set.
13
- Selection keys hash the normalized `{source,path}` request through the same
14
- source and canonical-JSON codecs used by captured records. Each non-null
15
- `current` or `available` reference must name an existing set with one matching
16
- root package and its complete dependency closure. Direct local-capability
17
- captures belong in resolutions, not fabricated package selections.
18
-
19
- Multiple sets can contain different versions of the same capability. This is
20
- not a multi-version composition within one instance. A captured resolution
21
- embeds its own selected set; reading it never consults this mutable lock.
22
-
23
- `current` and `available` are distinct. A failed/offline refresh can preserve
24
- both A and B while recording failure, without claiming either is latest.
25
- `observedAt` is the last successful observation's canonical UTC ISO timestamp,
26
- not an automatically generated timestamp for a failed refresh. No lock field
27
- can grant trust. Preparation must verify actual resources and exact approval
28
- before selecting executable B; writing a syntactically valid lock is neither
29
- that verification nor consent. A pin to B cannot silently fall back to A.
30
-
31
- ## Explicit scope and compare-and-swap
32
-
33
- `readLock3(deployment)` returns `{lock,integrity}`; both are null if absent.
34
- The integrity is a versioned canonical-JSON CAS token, not executable trust.
35
- Malformed, noncanonical, symlinked and unsupported files refuse. Old versions
36
- require their explicit evidence/migration reader; even an empty v1 file is not
37
- silently treated as a fresh v3 deployment.
38
-
39
- `writeLock3(deployment, expectedPreviousIntegrity, next)` validates the whole
40
- next snapshot and compares the exact previous token under a cooperative scope
41
- guard. It commits the entire snapshot atomically or reports `selection-changed`;
42
- no implicit row merging or artifact/record deletion occurs. First publication
43
- is no-replace. Identical snapshots may be kept, but a stale expected token still
44
- refuses. Staging is private and ignored before publication.
45
-
46
- All new portable-state writers use `portable-state.mjs`. A held/crashed guard
47
- is not auto-reaped; recovery is explicit. This serializes cooperating new
48
- writers, not legacy operations, hostile host processes or power loss. A live
49
- legacy cutover still needs the separately reviewed migration barrier. No such
50
- cutover or live lock write was performed while implementing this module.
51
-
52
- `portable-files.mjs` shares the bounded descriptor-backed metadata read with
53
- captured records, preserving their size/identity/content-change checks.
54
-
55
- ## Separate exact-artifact approval
56
-
57
- `lib/artifact-approvals.mjs` owns `.agents/portable/approvals.json`. Its closed
58
- version-1 ledger is keyed by capability ID, then integrity format and full digest.
59
- Every entry must agree with its keys and carry explicit operator provenance.
60
- Legacy digests, source/provider declarations and captured approval flags cannot
61
- supply this new authority. Missing ledger means no approvals; malformed existing
62
- metadata refuses, never repairs itself from a selection lock.
63
-
64
- `approveCapturedCapability(deployment, resolution, id, operatorOrigin)` is the
65
- record-addressed approval writer. It verifies the retained record, selected artifact
66
- and provenance, then preserves previous approvals under the same scope write guard.
67
- Prospective `approveAvailableCapability(deployment, artifactSet, id, operatorOrigin)`
68
- uses an exact content-addressed set already in lock v3, verifies its retained artifact
69
- and installation provenance with the SAME proof, and runs the complete kernel manifest
70
- codec before that same ledger writer. This breaks the legitimate ordering cycle:
71
- provider normalization code needs approval BEFORE a complete resolution can be built.
72
- No partial resolution is fabricated for approval. The CLI spelling is
73
- `oats trust <id> --deployment <absolute scope> --artifact-set <sha256-set-id>`;
74
- artifact-set selectors authorize no command execution and cannot mix with resolution
75
- selectors. Approval itself still grants neither binding readiness nor enrollment.
76
- There is no bulk caller-supplied ledger overwrite or approval during discovery.
77
- Approving B neither revokes nor rewrites A. Repeating A keeps its original receipt.
78
-
79
- `inspectCapturedApprovals` verifies retained inputs and reads current local
80
- approval authority without consulting current selections/configuration. It returns
81
- per-capability facts, not a dispatch permit. Helpers have dedicated record checks.
82
- The existing command/hook/environment classifier was extracted byte-identically
83
- from core into `capability-execution.mjs`; both callers use it. An environment-only
84
- artifact needs approval, and owner-execute changes require a new exact approval.
85
- Declarative-only changes have no executable gate; they remain visible as changed
86
- artifact identities. No approval for an unrelated managed harness resource follows
87
- from a capability's approval.
88
-
89
- All mutable publication uses an active synchronous scope-write context; saved or
90
- fabricated contexts cannot publish after the guard is released. This is an internal
91
- coordination safeguard, not a hostile-host permission system. Full manifest/launch
92
- validation, action-specific trust checks, explicit CLI consent and runtime/provider
93
- qualification still belong to the forthcoming preparation/dispatch integration.
94
-
95
- ## Shared structural schemas
96
-
97
- `docs/portable.schema.json` owns the shared value definitions. The thin
98
- `captured-resolution.schema.json`, `oats-lock-v3.schema.json` and
99
- `artifact-approvals.schema.json` reference them without copying their types.
100
- Generate with `node scripts/portable-schemas.mjs --write`; invocation without
101
- `--write` checks drift. All four schemas compile offline. Existing current-format
102
- schemas are unchanged; publishing these new wire schemas does not activate them
103
- in the old installer or CLI.
104
-
105
- Schema acceptance is structural, not a replacement for strict bounded decoding,
106
- canonical source parsing, choice replay, cross-reference/digest equality, graph
107
- closure, source/provenance verification or provider non-secret classification.
108
- The existing launch/manifest codecs still own their complete contracts. Real
109
- captured-record, lock and approval fixtures are checked against these schemas;
110
- a separate test checks deterministic generation and authority/credential boundaries.
111
-
112
- ## Verification so far
113
-
114
- Four focused tests cover A/B selection and failed-refresh visibility, canonical
115
- keys/root correlation, full-snapshot CAS/legacy/symlink/guard refusal, and two
116
- independent concurrent first writers. Existing captured-record and scaffold-only
117
- spawn/inspect/retire tests cover the shared read-helper extraction. Two focused
118
- captured-approval tests cover source-deleted A/B coexistence, poisoned current trust,
119
- key/format refusal, environment-only gating, owner-execute changes and declarative
120
- no-op. Two existing package-engine trust/environment regressions cover the classifier
121
- extraction. These qualify the tested storage/approval boundaries, not public CLI
122
- consent, complete preparation, native dispatch or live migration.