@awebai/oats 0.29.4 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +12 -6
  2. package/bin/oats.mjs +194 -50
  3. package/docs/capabilities.md +160 -171
  4. package/docs/capability-manifest.schema.json +6 -11
  5. package/docs/configuration.md +213 -64
  6. package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
  7. package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
  8. package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
  9. package/docs/design/2026-09-27-team-model-v2.md +97 -117
  10. package/docs/design/2026-09-28-automations-trust.md +38 -0
  11. package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
  12. package/docs/design/HISTORY.md +65 -0
  13. package/docs/design/README.md +23 -54
  14. package/docs/desktop-cli-api.md +1787 -1777
  15. package/docs/desktop.md +30 -91
  16. package/docs/execution-targets.md +146 -292
  17. package/docs/first-team.md +31 -17
  18. package/docs/implementation.md +77 -288
  19. package/docs/integrations.md +118 -320
  20. package/docs/knowledge-capability-authoring.md +25 -52
  21. package/docs/knowledge-reference/acceptance.md +3 -3
  22. package/docs/knowledge-reference/adoption.md +1 -1
  23. package/docs/knowledge-reference/harvester.md +2 -2
  24. package/docs/knowledge-reference/package-craft.md +3 -3
  25. package/docs/knowledge-reference/provider-mapping.md +3 -6
  26. package/docs/knowledge-reference/reader-capture.md +3 -3
  27. package/docs/knowledge-theory.md +62 -166
  28. package/docs/knowledge.md +225 -404
  29. package/docs/layers.md +42 -97
  30. package/docs/oats-local.schema.json +58 -5
  31. package/docs/oats-membership.schema.json +1 -8
  32. package/docs/oats-package.schema.json +5 -5
  33. package/docs/oats-workspace.schema.json +8 -22
  34. package/docs/official-catalog.md +25 -28
  35. package/docs/packages.md +45 -63
  36. package/docs/plans/0.30-close-out.md +83 -0
  37. package/docs/release-lane.md +82 -0
  38. package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
  39. package/docs/release-notes/v0.19.0.md +48 -147
  40. package/docs/release-notes/v0.19.1.md +2 -3
  41. package/docs/release-notes/v0.19.3.md +2 -15
  42. package/docs/release-notes/v0.20.0.md +0 -15
  43. package/docs/release-notes/v0.22.0.md +71 -138
  44. package/docs/release-notes/v0.22.1.md +42 -90
  45. package/docs/release-notes/v0.22.10.md +1 -1
  46. package/docs/release-notes/v0.22.11.md +1 -47
  47. package/docs/release-notes/v0.22.12.md +4 -13
  48. package/docs/release-notes/v0.22.13.md +1 -42
  49. package/docs/release-notes/v0.22.14.md +3 -11
  50. package/docs/release-notes/v0.22.15.md +1 -46
  51. package/docs/release-notes/v0.22.16.md +6 -8
  52. package/docs/release-notes/v0.22.18.md +1 -99
  53. package/docs/release-notes/v0.22.19.md +3 -14
  54. package/docs/release-notes/v0.22.2.md +6 -15
  55. package/docs/release-notes/v0.22.3.md +0 -1
  56. package/docs/release-notes/v0.22.4.md +1 -14
  57. package/docs/release-notes/v0.22.5.md +2 -12
  58. package/docs/release-notes/v0.22.6.md +0 -3
  59. package/docs/release-notes/v0.23.0.md +9 -25
  60. package/docs/release-notes/v0.23.1.md +9 -25
  61. package/docs/release-notes/v0.23.2.md +2 -4
  62. package/docs/release-notes/v0.24.0.md +56 -97
  63. package/docs/release-notes/v0.24.1.md +7 -11
  64. package/docs/release-notes/v0.24.10.md +34 -45
  65. package/docs/release-notes/v0.24.11.md +12 -20
  66. package/docs/release-notes/v0.24.12.md +35 -48
  67. package/docs/release-notes/v0.24.13.md +34 -41
  68. package/docs/release-notes/v0.24.2.md +9 -13
  69. package/docs/release-notes/v0.24.3.md +7 -11
  70. package/docs/release-notes/v0.24.4.md +6 -6
  71. package/docs/release-notes/v0.24.5.md +6 -10
  72. package/docs/release-notes/v0.24.6.md +2 -5
  73. package/docs/release-notes/v0.24.7.md +46 -75
  74. package/docs/release-notes/v0.24.8.md +58 -96
  75. package/docs/release-notes/v0.24.9.md +38 -54
  76. package/docs/release-notes/v0.25.0.md +59 -76
  77. package/docs/release-notes/v0.25.1.md +57 -81
  78. package/docs/release-notes/v0.25.2.md +51 -70
  79. package/docs/release-notes/v0.25.3.md +11 -13
  80. package/docs/release-notes/v0.25.4.md +9 -13
  81. package/docs/release-notes/v0.25.5.md +3 -5
  82. package/docs/release-notes/v0.25.6.md +20 -29
  83. package/docs/release-notes/v0.25.7.md +5 -7
  84. package/docs/release-notes/v0.25.8.md +26 -39
  85. package/docs/release-notes/v0.26.0.md +175 -646
  86. package/docs/release-notes/v0.27.0.md +4 -5
  87. package/docs/release-notes/v0.27.1.md +4 -6
  88. package/docs/release-notes/v0.27.2.md +1 -1
  89. package/docs/release-notes/v0.28.0.md +57 -124
  90. package/docs/release-notes/v0.29.0.md +89 -208
  91. package/docs/release-notes/v0.29.1.md +1 -1
  92. package/docs/release-notes/v0.29.2.md +3 -4
  93. package/docs/release-notes/v0.30.0.md +205 -0
  94. package/docs/release-notes/v0.30.1.md +123 -0
  95. package/docs/schedules.md +280 -363
  96. package/docs/servers.md +99 -117
  97. package/docs/soul.schema.json +2 -9
  98. package/docs/souls-and-instances.md +145 -158
  99. package/docs/workspaces.md +137 -215
  100. package/lib/automations.mjs +21 -6
  101. package/lib/core.mjs +226 -74
  102. package/lib/instance-events.mjs +1 -1
  103. package/lib/instance-inspect.mjs +109 -34
  104. package/lib/instance-lifecycle.mjs +14 -1
  105. package/lib/instance-resolution.mjs +26 -27
  106. package/lib/launch-preference.mjs +87 -0
  107. package/lib/materialize.mjs +3 -3
  108. package/lib/packages.mjs +1 -1
  109. package/lib/resolve.mjs +30 -88
  110. package/lib/schedule.mjs +1 -1
  111. package/lib/teams-verbs.mjs +195 -0
  112. package/lib/teams.mjs +190 -0
  113. package/lib/triggers.mjs +2 -2
  114. package/lib/workspace.mjs +54 -147
  115. package/package-catalog.json +10 -16
  116. package/package.json +1 -3
  117. package/skills/oats-getting-started/SKILL.md +25 -13
  118. package/capabilities/oats-authoring/LICENSE +0 -21
  119. package/capabilities/oats-authoring/oats-package.json +0 -11
  120. package/capabilities/oats-authoring/oats.json +0 -12
  121. package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +0 -84
  122. package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +0 -109
  123. package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +0 -116
  124. package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +0 -11
  125. package/capabilities/oats-aweb/bin/oats-aweb.mjs +0 -1338
  126. package/capabilities/oats-aweb/injects/aweb.md +0 -47
  127. package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -356
  128. package/capabilities/oats-aweb/lib/captured-execution.mjs +0 -91
  129. package/capabilities/oats-aweb/lib/captured-native.mjs +0 -91
  130. package/capabilities/oats-aweb/lib/grant-custody.mjs +0 -38
  131. package/capabilities/oats-aweb/lib/invocation-shape.mjs +0 -135
  132. package/capabilities/oats-aweb/lib/portable-binding.mjs +0 -146
  133. package/capabilities/oats-aweb/lib/session-readiness.mjs +0 -56
  134. package/capabilities/oats-aweb/lib/wake-receive.mjs +0 -56
  135. package/capabilities/oats-aweb/oats.json +0 -208
  136. package/capabilities/oats-aweb/skills/LICENSE +0 -21
  137. package/capabilities/oats-aweb/skills/VENDORED.md +0 -31
  138. package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +0 -201
  139. package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +0 -161
  140. package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +0 -61
  141. package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +0 -116
  142. package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +0 -74
  143. package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +0 -216
  144. package/capabilities/oats-jira/bin/oats-jira.mjs +0 -40
  145. package/capabilities/oats-jira/injects/jira.md +0 -10
  146. package/capabilities/oats-jira/oats.json +0 -22
  147. package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +0 -179
  148. package/capabilities/oats-linear/bin/oats-linear-hook.mjs +0 -34
  149. package/capabilities/oats-linear/bin/oats-linear.mjs +0 -344
  150. package/capabilities/oats-linear/injects/linear.md +0 -8
  151. package/capabilities/oats-linear/oats.json +0 -24
  152. package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +0 -223
  153. package/capabilities/oats-okf/bin/oats-okf-binding.mjs +0 -14
  154. package/capabilities/oats-okf/bin/oats-okf.mjs +0 -209
  155. package/capabilities/oats-okf/injects/okf.md +0 -42
  156. package/capabilities/oats-okf/lib/binding-wire.mjs +0 -348
  157. package/capabilities/oats-okf/lib/captured-worker.mjs +0 -109
  158. package/capabilities/oats-okf/lib/config.mjs +0 -124
  159. package/capabilities/oats-okf/lib/consult.mjs +0 -518
  160. package/capabilities/oats-okf/lib/harvest-status.mjs +0 -88
  161. package/capabilities/oats-okf/lib/harvest-switch.mjs +0 -94
  162. package/capabilities/oats-okf/lib/inspection.mjs +0 -119
  163. package/capabilities/oats-okf/lib/invocation-context.mjs +0 -111
  164. package/capabilities/oats-okf/lib/invocation-shape.mjs +0 -135
  165. package/capabilities/oats-okf/lib/io.mjs +0 -118
  166. package/capabilities/oats-okf/lib/migration.mjs +0 -137
  167. package/capabilities/oats-okf/lib/okf-validate.mjs +0 -123
  168. package/capabilities/oats-okf/lib/portable-binding.mjs +0 -199
  169. package/capabilities/oats-okf/lib/source-contract.mjs +0 -46
  170. package/capabilities/oats-okf/lib/sources.mjs +0 -424
  171. package/capabilities/oats-okf/lib/stores.mjs +0 -473
  172. package/capabilities/oats-okf/lib/worker.mjs +0 -497
  173. package/capabilities/oats-okf/oats.json +0 -148
  174. package/capabilities/oats-okf/schemas/okf-base.schema.json +0 -46
  175. package/capabilities/oats-okf/schemas/okf-bindings.schema.json +0 -112
  176. package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +0 -87
  177. package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +0 -113
  178. package/capabilities/oats-okf/schemas/okf-soul.schema.json +0 -37
  179. package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +0 -144
  180. package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +0 -86
  181. package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +0 -104
  182. package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +0 -140
  183. package/capabilities/oats-okf-harvest/injects/harvester.md +0 -12
  184. package/capabilities/oats-okf-harvest/oats.json +0 -26
  185. package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +0 -168
  186. package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +0 -192
  187. package/capabilities/oats-okf-harvest/skills/okf-authoring/SKILL.md +0 -151
  188. package/capabilities/oats-okf-harvest/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
  189. package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +0 -170
  190. package/capabilities/oats-okf-maintenance/injects/maintainer.md +0 -12
  191. package/capabilities/oats-okf-maintenance/lib/provenance.mjs +0 -50
  192. package/capabilities/oats-okf-maintenance/oats.json +0 -21
  193. package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +0 -159
  194. package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +0 -192
  195. package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +0 -151
  196. package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
  197. package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +0 -146
  198. package/capabilities/oats-review/injects/review.md +0 -69
  199. package/capabilities/oats-review/oats.json +0 -10
  200. package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
  201. package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
  202. package/docs/conventions.md +0 -90
  203. package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
  204. package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
  205. package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
  206. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
  207. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
  208. package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
  209. package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
  210. package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
  211. package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
  212. package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
  213. package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
  214. package/docs/design/2026-09-15-captured-dispatch.md +0 -127
  215. package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
  216. package/docs/design/2026-09-15-package-preparation.md +0 -100
  217. package/docs/design/2026-09-15-portable-data-contract.md +0 -121
  218. package/docs/design/2026-09-15-portable-declarations.md +0 -189
  219. package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
  220. package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
  221. package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
  222. package/docs/design/2026-09-15-source-observation.md +0 -119
  223. package/docs/design/2026-09-16-captured-admission.md +0 -77
  224. package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
  225. package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
  226. package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
  227. package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
  228. package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
  229. package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
  230. package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
  231. package/docs/design/2026-09-16-portable-onboarding.md +0 -179
  232. package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
  233. package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
  234. package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
  235. package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
  236. package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
  237. package/docs/design/2026-09-17-captured-native-start.md +0 -58
  238. package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
  239. package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
  240. package/docs/design/2026-09-17-public-captured-start.md +0 -108
  241. package/docs/design/2026-09-17-public-prepare-request.md +0 -90
  242. package/docs/design/2026-09-18-captured-pi-host.md +0 -205
  243. package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
  244. package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
  245. package/docs/design/2026-09-20-redesign-program-board.md +0 -142
  246. package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
  247. package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
  248. package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
  249. package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
  250. package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
  251. package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
  252. package/docs/design/2026-09-24-phase-d-plan.md +0 -305
  253. package/docs/design/2026-09-25-teams-contract.md +0 -258
  254. package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
  255. package/docs/design/desktop-ux-plan.md +0 -362
  256. package/docs/design/launch-configurations.md +0 -168
  257. package/docs/design/okf-mirror-provenance.md +0 -105
  258. package/docs/design/operations-contract.md +0 -141
  259. package/docs/oats-member.schema.json +0 -38
  260. package/skills/integration-authoring/SKILL.md +0 -84
  261. package/skills/oats-support/SKILL.md +0 -79
  262. package/skills/skill-craft/SKILL.md +0 -109
  263. package/skills/soul-craft/SKILL.md +0 -116
@@ -1,50 +1,43 @@
1
1
  # OATS v0.24.13 — schedule history API 3 and the Desktop schedules table
2
2
 
3
- Kernel/Pi/Desktop **0.24.13**. Tag `v0.24.13` → the commit carrying these
4
- notes; the version-bump commit lands after the tag. Consumers gate on
5
- `oats version --json` `features[]` names and API integers — never on the version.
6
-
7
- ## Kernel — `schedule-read-2` (`scheduleHistoryApi: 3`; `scheduleApi` stays 2)
8
-
9
- `oats schedule list|show` history had four defects found by the Desktop
10
- engineer's exact-source review; each is closed under a new advertised name.
11
-
12
- - **A run's identity is when it was scheduled and started, never its outcome.**
13
- `runId = sha256(scheduledFor|startedAt|attemptId)[0:24]`; a run's later facts
14
- update its one row; `transitions[]` keeps the outcome sequence
15
- (`["started","unknown","ended"]` is one run, not three); `settled`,
16
- `recordedAt`. Pre-API-3 rows are returned `legacy: true` with `runId: null`
17
- and are never merged.
18
- - **Bounded, descriptor-safe state.** Both scope files are `lstat`ed (regular
19
- file only), opened `O_NOFOLLOW|O_NONBLOCK`, `fstat`-verified (dev+ino) and
20
- read whole **only within a 1 MiB budget** — over budget is a typed
21
- `E_SCHEDULE_STATE_OVERSIZE` refusal, never truncated JSON. `list` carries
22
- `integrity.sources[]`; history is capped at 50 rows at read
23
- (`history: {status, stored, truncated}`); one job's corrupt history or bad
24
- identity is its own row and never fails the others.
25
- - **Subject truth.** `list`/`show` echo the resolved `scope` and canonical `id`;
26
- a definition whose own `id` differs from its key → `E_SCHEDULE_IDENTITY`; ids
27
- are validated before any read. Typed refusal details travel through the CLI's
28
- JSON failure.
29
- - **Session provenance, never a transcript.** The `transcript` pointer named a
30
- reader that does not exist and is gone. Every run carries
31
- `session: {instance|null, home|null, incarnation|null, server|null, delivery}`
32
- — what the recorder knew at write time. A read-only transcript verb is a
33
- separate seam (K12), not implied by this API.
3
+ Kernel/Pi/Desktop **0.24.13**. Consumers gate on `oats version --json`
4
+ `features[]` names and API integers, never on the version. Shapes are in the
5
+ [Desktop CLI API](../desktop-cli-api.md).
6
+
7
+ ## Kernel: `schedule-read-2` (`scheduleHistoryApi: 3`; `scheduleApi` stays 2)
8
+
9
+ `oats schedule list|show` history had four defects; each is closed under a new
10
+ advertised name.
11
+
12
+ - **A run's identity is when it was scheduled and started, not its outcome.**
13
+ Each run has a stable `runId`; later facts update its one row and
14
+ `transitions[]` keeps the outcome sequence (`["started","unknown","ended"]`
15
+ is one run). Rows from before API 3 are returned with `legacy: true` and
16
+ `runId: null` and are never merged.
17
+ - **Bounded, descriptor-safe state.** Both scope files must be regular files,
18
+ are opened without following symlinks, and are read only within a 1 MiB
19
+ budget; over budget is a typed `E_SCHEDULE_STATE_OVERSIZE` refusal. History
20
+ is capped at 50 rows (`history: {status, stored, truncated}`); one job's
21
+ corrupt history never fails the others.
22
+ - **Subject truth.** `list` and `show` echo the resolved `scope` and canonical
23
+ `id`; a definition whose own `id` differs from its key refuses
24
+ `E_SCHEDULE_IDENTITY`.
25
+ - **Session provenance, not a transcript.** The `transcript` pointer, which
26
+ named a reader that did not exist, is removed. Every run carries
27
+ `session: {instance, home, incarnation, server, delivery}` as known when it
28
+ was recorded.
34
29
 
35
30
  ## Desktop
36
31
 
37
- - **Schedules** view: the compact table (enabled, schedule, target, cadence,
32
+ - **Schedules** view: a compact table (enabled, schedule, target, cadence,
38
33
  next run, last reported outcome, actions) with **Recent runs** for the
39
- workspace (≤50), read once on entry and on explicit Refresh — no polling.
40
- History enables nothing; `ended` is not success and `delivered` is not
41
- consumption; missing time facts are shown as unreported. Session provenance
42
- is displayed with a precise unavailable reason — no transcript, terminal or
43
- link. Remote history and editing a captured wake are shown as honest
44
- limitations. Gated on `scheduleHistoryApi === 3` and `schedule-read-2`.
45
- - **Security**: the command-running `GET /api/schedules` is removed (405, no
46
- command, no default workspace); legacy POST `list|show` aliases run through
47
- the same strict admission, budgets and two coalesced read slots.
34
+ workspace, read on entry and on Refresh, without polling. `ended` is not
35
+ shown as success and `delivered` not as consumption. Remote history and
36
+ editing a captured wake are not available. Requires `scheduleHistoryApi: 3`
37
+ and `schedule-read-2`.
38
+ - **Security**: the command-running `GET /api/schedules` is removed (405);
39
+ legacy POST `list|show` aliases go through the same strict admission and
40
+ budgets.
48
41
 
49
42
  ## Upgrade
50
43
 
@@ -4,18 +4,14 @@ Kernel/Pi/Desktop **0.24.2**. Publication is not deployment: every operator stil
4
4
 
5
5
  ## What changed
6
6
 
7
- - **`oats onboard [--dir <deployment>] [--workspace <git:source[@rev]>] [--force-existing] [--json]`** — bootstrap a deployment with an **`oats-setup-expert`** soul that holds `oats.core` and `oats.setup`. Acquires the official `oats.framework` package through the existing engine (resources-only guard before commit, no catalog auto-trust), activates exactly those two capabilities for that soul, writes its definition with both pinned at the acquired immutable commit, and **prints** the spawn command — it never launches a model. Classic local bootstrap, not captured preparation. `oats setup` (record capture setup) is unchanged.
8
- - **Soul creation declares `oats.core` explicitly.** `oats create` and new local souls write `requires.capabilities.oats.core` resolved from the official catalog; `--no-oats-core` opts out; nothing is invented when the catalog has no entry. When a soul declares `oats.core` or `oats.setup`, the kernel composes **neither** the legacy kernel skills (`oats`, `oats-config`, `oats-packages`) nor the `kernel:oats` injection — the capability's skills are the operational curriculum. Souls without it keep legacy behavior; `oats doctor` prints an informational line.
9
- - **Official capabilities.** `oats.framework` **1.1.1** (tag `oats-framework/v1.1.1`) exports `oats.core` (`oats-operate`, `oats-souls`, "you run on OATS" briefing), `oats.setup` (`oats-config`, `oats-packages`, `oats-workspace-setup` — now documenting the operator request shape) and `oats.knowledge-theory`. Listed in the official catalog with capability aliases.
10
- - **Retained inspection projects `launchSelection`** (`{runtime, model}` or `null`) for the primary from the verified retained record; provider binding codecs receive the same-kernel `OATS_CLI_BIN` after the environment scrub. These are what a provider `check` needs to be truthful about the primary's profile.
11
- - **aweb 1.11.0 pairing.** The catalog and all framework soul editions pin `oats.aweb@v1.11.0`, which adds the portable binding interface (floor `>=0.24.2`). Its `check` qualifies HOME-route operational custody only: explicit private team, `delivery: session`, an input-capable Claude/Codex primary. A strict-Pi print primary reports `needs-configuration`; the requirement is never dropped.
12
- - **Six framework soul editions** exported and imported by `oats-workspace.yaml`: the five knowledge-owning experts (`oats-expert`, `oats-kernel-expert`, `oats-desktop-expert`, `market-research-expert`, `oats-assistant`) at `caa341f3` and `oats-setup-expert` at `0aad753c`. All six declare `oats.core` from the repository's own payload.
13
- - Baseline hygiene: golden fixtures use a genuinely empty catalog; the package check lazy-loads dev validators so syntax-only lanes work without `node_modules`.
7
+ - **`oats onboard [--dir <deployment>] [--workspace <git:source[@rev]>] [--force-existing] [--json]`** bootstraps a deployment with an **`oats-setup-expert`** soul that holds `oats.core` and `oats.setup`. It acquires the official `oats.framework` package (no catalog auto-trust), activates exactly those two capabilities for that soul, pins both at the acquired commit, and **prints** the spawn command; it never launches a model. `oats setup` (record capture setup) is unchanged.
8
+ - **Soul creation declares `oats.core` explicitly.** `oats create` writes `requires.capabilities.oats.core` resolved from the official catalog; `--no-oats-core` opts out. A soul that declares `oats.core` or `oats.setup` no longer receives the legacy kernel skills (`oats`, `oats-config`, `oats-packages`) or the `kernel:oats` injection; the capability's skills replace them. Other souls keep the legacy behavior, and `oats doctor` prints an informational line.
9
+ - **Official capabilities.** `oats.framework` **1.1.1** (tag `oats-framework/v1.1.1`) exports `oats.core` (`oats-operate`, `oats-souls`, the "you run on OATS" briefing), `oats.setup` (`oats-config`, `oats-packages`, `oats-workspace-setup`) and `oats.knowledge-theory`, listed in the official catalog with capability aliases.
10
+ - **Retained inspection reports `launchSelection`** (`{runtime, model}` or `null`) for the primary, and provider binding codecs receive `OATS_CLI_BIN`.
11
+ - **aweb 1.11.0 pairing.** The catalog and the framework soul editions pin `oats.aweb@v1.11.0`, which adds the portable binding interface (floor `>=0.24.2`). Its `check` qualifies only an explicit private team with `delivery: session` and an input-capable Claude or Codex primary; a strict-Pi print primary reports `needs-configuration`.
12
+ - **Six framework soul editions** are exported and imported by `oats-workspace.yaml`: `oats-expert`, `oats-kernel-expert`, `oats-desktop-expert`, `market-research-expert`, `oats-assistant` and `oats-setup-expert`, all declaring `oats.core`.
14
13
 
15
- ## Second-operator gate
14
+ ## Known limits
16
15
 
17
- An independent operator on a fresh machine adopted the shared definition from public sources through `inspect` → `prepare` → approvals with 0.24.1: the whole graph (including `oats.core`/`oats.setup`) resolved and materialized; preparation stopped at aweb 1.10.3 as declared. Five usability seams were recorded (request-file mismatch between `inspect`/`prepare`, raw ENOENT on an absent deployment, `trust --dir` rejecting lock v3, `--artifact-set` missing from help, unattributed provider problems). **They are not fixed in this cut**; see the [program board](../design/2026-09-20-redesign-program-board.md).
18
-
19
- ## Not in this cut
20
-
21
- Desktop marketplace view / soul creation UI, legacy `agents/` roster and in-soul knowledge decommission (after the fresh-reader proof against the public `oats-knowledge`), Pi session-input support.
16
+ - The first-contact seams in `inspect` and `prepare` (request-file mismatch, raw `ENOENT` on an absent deployment, `oats trust --dir` rejecting lock v3, `--artifact-set` missing from help, unattributed provider problems) are fixed in [v0.24.3](v0.24.3.md).
17
+ - Pi primaries do not support session input.
@@ -1,13 +1,9 @@
1
- # OATS v0.24.3 — second-operator `prepare` seams
1
+ # OATS v0.24.3 — `prepare` usability fixes
2
2
 
3
- Kernel/Pi/Desktop **0.24.3**. Fixes the five usability seams an independent second operator hit adopting the shared workspace definition on 0.24.1/0.24.2 (see the [program board](../design/2026-09-20-redesign-program-board.md)). No contract, schema or authority change.
3
+ Kernel/Pi/Desktop **0.24.3**. Fixes five usability problems met when adopting a shared workspace definition on 0.24.1 and 0.24.2. No contract, schema or authority change.
4
4
 
5
- - **Attributed provider problems.** Every preparation problem now carries `slot`, `capability` and its `origins`, with kernel-fixed text (for example `oats.okf knowledge normalize binding could not be prepared` / `oats.aweb@1.10.3 declares no binding interface; messaging cannot be prepared`). The kernel names the missing item where it knows it (a missing binding interface); for a provider's own `needs-configuration` it attributes the slot/capability/phase but cannot name the missing setting unless the provider sends it — OKF 2.1.1 sends code only, so `bindings-file`/`state-dir` are named by the setup guidance and by OKF 2.1.2. One unqualified slot no longer masks another slot's diagnostics: every slot that has a binding interface is normalized, and the single resolver reports each invalid choice under its slot. Provider free text still never crosses the wire.
6
- - **`oats trust <capability> --dir <deployment>` on a lock v3 deployment** returns a typed problem with the exact working command (`oats trust <cap> --deployment <abs> --artifact-set <sha256-…>`) instead of `unsupported lockfileVersion 3`. No auto-approval.
7
- - **Help** documents `--artifact-set` and how `prepare`'s `selections[].artifactSet` / `approvalRequired[]` pair with it.
8
- - **`prepare` on an absent deployment path** returns a typed explicit-provisioning hold, not a raw `ENOENT` with a host path.
9
- - **One request file for both commands.** `prepare --request` accepts the explicit `workTarget` that `inspect --request` requires (explicit beats cwd; it never implies captured placement or current config), and `oats inspect --request <f> --emit-prepare-request <out>` writes the converted preparation request through the existing builder.
10
-
11
- The second operator's recorded requests and results are preserved verbatim as regression fixtures (`test/fixtures/second-operator/`). Their valid-vs-bogus `stores.oats` pair remains identical by design: both refused on missing OKF runtime settings (`bindings-file`, `state-dir`), which the messages now say.
12
-
13
- Setup guidance for those settings lands in the next `oats.framework` payload.
5
+ - **Attributed provider problems.** Every preparation problem carries `slot`, `capability` and its `origins`, with kernel-fixed text (for example `oats.aweb@1.10.3 declares no binding interface; messaging cannot be prepared`). For a provider's own `needs-configuration` the kernel names the slot, capability and phase but not the missing setting unless the provider sends it (OKF 2.1.1 sends only a code). One unqualified slot no longer hides another slot's diagnostics. Provider free text still never crosses the wire.
6
+ - **`oats trust <capability> --dir <deployment>` on a lock v3 deployment** returns a typed problem with the working command (`oats trust <cap> --deployment <abs> --artifact-set <sha256-…>`) instead of `unsupported lockfileVersion 3`. Nothing is approved automatically.
7
+ - **Help** documents `--artifact-set` and how it pairs with `prepare`'s `selections[].artifactSet` and `approvalRequired[]`.
8
+ - **`prepare` on an absent deployment path** returns a typed explicit-provisioning hold instead of a raw `ENOENT`.
9
+ - **One request file for both commands.** `prepare --request` accepts the explicit `workTarget` that `inspect --request` requires, and `oats inspect --request <f> --emit-prepare-request <out>` writes the converted preparation request.
@@ -1,10 +1,10 @@
1
1
  # OATS v0.24.4 — provider reasons cross the wire; one request file for both commands
2
2
 
3
- Kernel/Pi/Desktop **0.24.4**. Two findings from the independent second operator's repeat on 0.24.3 (see the [program board](../design/2026-09-20-redesign-program-board.md)), plus the first half of the binding-ownership rule. Kernel-first release: the provider releases that declare the new manifest fields (OKF 2.1.2, aweb 1.11.1) require this version.
3
+ Kernel/Pi/Desktop **0.24.4**. Provider releases that declare the new manifest fields (OKF 2.1.2, aweb 1.11.1) require this version.
4
4
 
5
- - **The kernel no longer discards the provider's reason.** A provider's `error.message` (and a non-ready `check`'s `result.problems[].message`) now crosses the binding wire when it is byte-equal to a fixed reason the provider declares — manifest `binding.reasons`, or the kernel's reviewed compatibility list for aweb 1.11.0 and OKF 2.1.2 — and is surfaced as the problem's `message` beside `slot`, `capability` and `origins`. Anything else is dropped as before and the kernel template is used. No interpolation, no operator values, no paths, ever: the second operator sees `messaging workspace must declare private: per-human` or `setting bindings-file is required (absolute host path)` in one run instead of six. Decision: `agents/oats-expert/soul/knowledge/decisions/provider-problem-reasons-cross-the-wire.md`.
6
- - **`binding.reasons` and `binding.keys` manifest fields** (optional). `reasons`: 1–64 unique printable-ASCII strings ≤200 chars, no braces; an invalid declaration refuses, it never falls back. `keys`: a provider's owned operator-binding keys, exact names or trailing-dot namespaces (`stores.`) — **shape-validated only in 0.24.4**; forwarding, overlap refusal and stray-key attribution land in 0.25. Providers must still ignore keys they do not own (decision `operator-bindings-ownership.md`). Every earlier kernel rejects manifests carrying these fields, so declaring providers floor on `>=0.24.4`.
7
- - **`inspect --request` accepts `prepare`'s fields.** `operator`, `launch`, `helperLaunches`, `mode`, `allowLocalPaths` are accepted, not evaluated, and listed under `ignored`; `--emit-prepare-request` carries them through unchanged. The same complete request file is now valid for both commands — the 0.24.3 fix had converged only one way.
8
- - **CLI renders the problem `key`** (for example `/bindings/messaging/responsibleHuman`) beside its message.
5
+ - **The kernel no longer discards the provider's reason.** A provider's `error.message` (and a non-ready `check`'s `result.problems[].message`) crosses the binding wire when it is byte-equal to a fixed reason the provider declares in manifest `binding.reasons`, or to the kernel's compatibility list for aweb 1.11.0 and OKF 2.1.2. It is surfaced as the problem's `message` beside `slot`, `capability` and `origins`; anything else is dropped and the kernel template is used. No interpolation, operator values or paths ever cross.
6
+ - **`binding.reasons` and `binding.keys` manifest fields** (optional). `reasons`: 1–64 unique printable-ASCII strings of at most 200 characters, no braces; an invalid declaration refuses. `keys`: a provider's owned operator-binding keys, exact names or trailing-dot namespaces (`stores.`), shape-validated only in this release. Providers must still ignore keys they do not own. Earlier kernels reject manifests carrying these fields, so declaring providers require `>=0.24.4`.
7
+ - **`inspect --request` accepts `prepare`'s fields.** `operator`, `launch`, `helperLaunches`, `mode` and `allowLocalPaths` are accepted, not evaluated, and listed under `ignored`; `--emit-prepare-request` carries them through. The same request file is now valid for both commands.
8
+ - **The CLI renders the problem `key`** (for example `/bindings/messaging/responsibleHuman`) beside its message.
9
9
 
10
- Not in this release: the operator-bindings deadlock between OKF 2.1.1 and aweb 1.11.0 (OKF validated messaging's `wider` as a store locator) is fixed provider-side in OKF 2.1.2, released next with `binding.reasons`/`binding.keys` declared and floor 0.24.4; then aweb 1.11.1 (manifest-only), the `oats.framework` 1.1.2 payload, and the workspace editions re-pinned.
10
+ Known limit: OKF 2.1.1 and aweb 1.11.0 cannot be prepared together (OKF validated messaging's `wider` as a store locator); OKF 2.1.2 fixes it.
@@ -1,12 +1,8 @@
1
- # OATS v0.24.5 — four small fixes from the second-operator wave
1
+ # OATS v0.24.5 — four small fixes
2
2
 
3
- Kernel/Pi/Desktop **0.24.5**. No contract, schema or authority change. Every item was found while an independent operator (and then the lead) drove the published 0.24.4 wave to its first end-to-end resolution.
3
+ Kernel/Pi/Desktop **0.24.5**. No contract, schema or authority change.
4
4
 
5
- - **Retirement recovers a worktree on the branch it actually has.** `oats retire` derived the recovery clone's branch from `instance.json` (the spawn-time branch); a worktree that had legitimately switched branches during its task could never pass recovery verification and became unretirable by the normal path, even with nothing unpreserved. Recovery now derives the branch from the worktree while it exists (detached HEADs recover at their exact commit), falls back to the recorded branch only when the worktree is gone, and records the drift in `recovery.json` (`branchDrift`). Fail-closed behaviour is unchanged; the source of truth moved to the object.
6
- - **Captured launch: `ifInstalled` runtime rows are not hard blocks, and refusals are attributed.** A provider's `requires` row marked `ifInstalled: true` (a version floor for an ambient package, if present) was treated as a hard requirement, so a Pi launch with aweb `delivery: session` could never publish a resolution — the same request without a `launch` block published fine. Such rows are now satisfied by absence in captured preparation. Remaining hard rows refuse through the ordinary preparation problem shape (`slot`, `capability`, `runtime`, `package`, the manifest's own `install` text) instead of one bare `needs-configuration`.
7
- - **Helper-injection refusal is attributed.** A capability that ships an `inject` without a `helperInjection` policy now yields a preparation problem naming that capability (with `origins`), so the operator learns *which* sibling has not adopted the contract rather than only that one has.
8
- - **`oats onboard --workspace` acquires the framework the workspace's catalog names.** The kernel tarball ships `package-catalog.json` as a snapshot at the kernel's tag, so it lags every `oats.framework` release cut afterwards; onboarding a current workspace edition against it refused as `integrity-drift` — correct, but a fresh machine has no reviewed list to point `OATS_PACKAGE_CATALOG` at. Onboarding now reads the workspace repository's `package-catalog.json` at the observed revision and uses its `oats.framework` entry; the bundled entry is the fallback, `OATS_PACKAGE_CATALOG` still overrides. The result reports `catalog.origin`, and a drift refusal names the lag and both integrities.
9
-
10
- Rule going forward (recorded in the maintainer's knowledge): **`prepare` never ends in a bare `needs-configuration` after selection** — every refusal is a problem with a slot/capability, or it is a kernel defect. Remaining bare sites are pre-selection input errors, record-shape guards and the skill-name collision, none reachable from a published edition.
11
-
12
- Not in this release: `binding.keys` enforcement and the dotted-exact-key grammar (0.25); OKF `check` per-cause reasons (OKF 2.1.3, deferred with harvest).
5
+ - **Retirement recovers a worktree on the branch it actually has.** Recovery used the spawn-time branch from `instance.json`, so a worktree that had switched branches could not be retired by the normal path. Recovery now reads the branch from the worktree while it exists (a detached HEAD recovers at its exact commit), falls back to the recorded branch only when the worktree is gone, and records the difference in `recovery.json` (`branchDrift`). Fail-closed behavior is unchanged.
6
+ - **Captured launch: `ifInstalled` runtime rows are not hard blocks, and refusals are attributed.** A `requires` row marked `ifInstalled: true` (a version floor for an optional package) was treated as mandatory, so a Pi launch with aweb `delivery: session` could never publish a resolution. Such rows are now satisfied by absence. Remaining hard rows refuse with an ordinary preparation problem (`slot`, `capability`, `runtime`, `package`, and the manifest's `install` text).
7
+ - **Helper-injection refusal is attributed.** A capability that ships an `inject` without a `helperInjection` policy yields a preparation problem naming that capability, with `origins`.
8
+ - **`oats onboard --workspace` uses the workspace's catalog.** The bundled `package-catalog.json` is a snapshot at the kernel's tag and lags later `oats.framework` releases, so onboarding a current workspace edition refused as `integrity-drift`. Onboarding now reads the workspace repository's `package-catalog.json` at the observed revision; the bundled entry is the fallback and `OATS_PACKAGE_CATALOG` still overrides. The result reports `catalog.origin`, and a drift refusal names both integrities.
@@ -2,8 +2,5 @@
2
2
 
3
3
  Kernel/Pi/Desktop **0.24.6**. No contract, schema or authority change.
4
4
 
5
- - **`oats catalog [--json]`** — read-only description of the *effective* official package catalog: where it came from (`bundled` snapshot or `OATS_PACKAGE_CATALOG` override), every package with url/ref/payload root and the exact `oats install` argv, and the capability→package alias map with each alias's resolution. Identity and discovery only: nothing is acquired, trusted or fetched (the contract test asserts no filesystem writes). Built for the Desktop's Capabilities view, which cannot import the kernel; the notes in the payload state that catalog identity grants no executable trust and that a bundled catalog may lag later package releases. Aliases are mappings, not an export inventory.
6
- - **Desktop parity slice 1a** (`feat/desktop-sidebar-keyboard-parity`): compact relation guides in the roster (nesting 14→8px, elbows 7→4px, gutters 8→6px — the human's request for more horizontal room; rows stay 56px, three themes keep computed AA), engine-owned **⌘F** reveal-and-focus filter (un-hides the sidebar first) and **⌘N** explicit soul chooser (never auto-spawns), visible shortcut hints that follow user rebinds/unbinds. Renderer-only; terminal key passthrough and focus ownership unchanged.
7
- - **CI**: the pull-request workflow now checks out full history — the workspace-layout guard reads pinned import revisions with `git cat-file`, and a shallow clone made main red from `f34207e9` to `475ea9bf`.
8
-
9
- Direction for the rest of S8 is recorded in `docs/design/2026-09-22-desktop-parity-seams.md` (slices 1b–8; kernel seams K1–K8; provider seam P1) and the lifecycle/enrollment/permission/auto-PR decisions in the maintainer's knowledge base. Frames 05 Knowledge and 06 Tasks are excluded by direction.
5
+ - **`oats catalog [--json]`**: a read-only description of the effective official package catalog: its origin (`bundled` snapshot or `OATS_PACKAGE_CATALOG` override), every package with URL, ref, payload root and the exact `oats install` argv, and the capability-to-package alias map. Nothing is acquired, trusted or fetched. Catalog identity grants no executable trust, a bundled catalog may lag later package releases, and aliases are mappings, not an export inventory. See [the official catalog](../official-catalog.md).
6
+ - **Desktop sidebar**: more compact relation guides in the roster, **⌘F** reveals and focuses the filter, **⌘N** opens an explicit soul chooser (never auto-spawns), and shortcut hints follow user rebinds.
@@ -1,81 +1,52 @@
1
1
  # OATS v0.24.7 — instance Git observation, soul declarations, and no hollow agents
2
2
 
3
- Kernel/Pi/Desktop **0.24.7**. Tag `v0.24.7` → commit `c923d81b` (this notes commit; the last code change is `912aaee0`, PR #57). The npm tarball's `gitHead` is `c923d81b`; the version-bump commit lands after the tag (PR #58). A from-the-tag verifier should expect `gitHead == c923d81b`. Two additive read-only contracts for the Desktop
4
- (`instanceGitApi: 1`, `soulsApi: 1`), one spawn refusal that closes a
5
- first-team-path defect, and four Desktop parity slices.
3
+ Kernel/Pi/Desktop **0.24.7** (PR #57). Two additive read-only contracts for the
4
+ Desktop (`instanceGitApi: 1`, `soulsApi: 1`), a spawn refusal that closes a
5
+ first-team defect, and Desktop views built on them. The contracts are
6
+ described in the [Desktop CLI API](../desktop-cli-api.md).
6
7
 
7
8
  ## Kernel
8
9
 
9
10
  - **`oats instance git <instance> [--home] [--dir] [--json]`** and
10
- **`oats instance diff <instance> --file <id> --revision <rev> [--index-revision <idx>] [--json]`** (K1) —
11
- read-only Git observation of one instance's work tree. Truth from the tree:
12
- the branch the tree is on (the spawn-recorded branch is reported as
13
- `recorded` with a `drift` flag). Porcelain v2 NUL status with renames keeping
14
- both paths; **upstream and default-branch merge-base as two separate
15
- comparisons** — no upstream is `null`, never 0/0. Opaque file ids minted
16
- under (HEAD, index); a diff is taken against the *captured* revision oid and
17
- refuses `E_STALE_OBSERVATION` (fresh observation attached) if HEAD, index or
18
- the file's content moved, before **or during** the read. Bounded (256 KiB,
19
- binary flagged). Qualified addressing: several homes with one name refuse
20
- `E_AMBIGUOUS_INSTANCE` with candidates; retired/unmaterialized tree is
21
- `E_NO_WORKTREE`.
22
- **Hardened after a consumer-side adversarial probe**: the observed tree is
23
- worked in by an agent, so its repo config is input — external diff, textconv,
24
- fsmonitor and hooks are disabled, the caller's Git environment and global/
25
- system config are not inherited, optional locks are off (no index refresh),
26
- and the index revision is a hash of `ls-files --stage` (no `write-tree`, no
27
- object written). The response states it: `readOnly: {helpers, optionalLocks, objectsWritten}`.
28
- - **`oats inspect --json` souls carry their declarations** (K4, `soulsApi: 1`):
29
- `declarations` (requires/defaults/knowledge/teams/resources, parsed
30
- kernel-side, `null` when absent), `provenance` (recorded by `oats onboard`
31
- from now on; `null` = *unrecorded*, never inferred), `readiness` (declared
32
- sources joined against the same payload's capability inventory — separate
33
- from launchability and adoption; never a green "Ready"), and
34
- `result.sources` — the scope's portable source context, with an honest
35
- `none-recorded` state.
36
- - **No hollow agents.** `oats create` declares `oats.core` by default; composition
37
- honours the declaration by suppressing the kernel's legacy skills — but nothing
38
- on that path activates the replacement, so a `spawn` produced an agent with
39
- **no operational curriculum and no warning** (second-operator finding on 0.24.6).
40
- Now `spawn` refuses `E_REQUIREMENT_INACTIVE` before creating anything, with
41
- the remedy (`oats install oats.framework` if needed, then
42
- `oats use oats.core --soul <name>`) and the opt-out (remove the declaration).
43
- `create` states the activation step up front (`next-step` note,
44
- `declaredCapabilities` in `--json`). `create` stays declaration, not acquisition.
45
-
46
- ## Desktop (parity slices 1b, 2a, 3, 4, 6a, 7a)
47
-
48
- - **1b** shared contextual right panel (Instance · Git & GitHub · Soul), collapsed
49
- rail, per-workspace preferences, temporary focus mode.
50
- - **2a** Git & GitHub panel on K1: worktree/branch/drift, upstream and base named
51
- separately, real file counts and rename paths, bounded read-only diff; stale
52
- → re-observe, never rendered. The legacy background `gitState` collector —
53
- which ran Git against every instance tree on every roster poll without helper
54
- controls and substituted healthy zeros on failure — is **removed**. Desktop
55
- Git reads are the K1 route only. GitHub/PR card is *unavailable* pending the
56
- P1 decision: forge connections are an ADE/workstation integration, not a capability (working names `oats.git`/`oats.forge` retired).
57
- - **3** Souls + Sources on K4: declarations, recorded provenance (`null` renders
58
- *Unrecorded*, never *Local*), "Not declared" vs "Not reported" distinguished,
59
- sources-installed ≠ Ready.
60
- - **4** Capabilities: official catalog via `oats catalog` (0.24.6+) plus the
61
- deployment's classic inventory; aliases are mappings not exports, refs are refs,
62
- override catalogs conspicuously labelled; "Add capability" copies the schema's
63
- exact `oats install <package>` argv and never executes it.
64
- - **6a** Spawn modal to the redesign on existing seams: two-column layout,
65
- grouped soul chooser, provider/model with reported-vs-assumed provenance,
66
- launch configuration restored (an already-supported property the renderer had
67
- regressed out of), fields that need K6 rendered disabled with their seam named.
68
- - **7a** Active overview (frame 07) on the roster: anonymous count-labelled
69
- relation groups (the roster reports no group names), activity `unknown` until K7.
70
-
71
- Desktop CLI floor for the new views is **0.24.7** (`instanceGitApi`/`soulsApi`
72
- gates); an older CLI renders those views as *unavailable*, never as empty-healthy.
73
-
74
- ## Also
75
-
76
- - Board and seams doc dates corrected (2026-09-21, not 09-22 — lead clock error
77
- caught by the second operator). Pinned SHAs unaffected.
78
- - Second-operator `launch` re-run on 0.24.6 passed both halves (publish with an
79
- executable launch selection; hard runtime row refuses attributed).
80
- - OKF 2.1.3 bug list (deferred with harvest): `check` per-cause reasons; retire
81
- leaves the per-source `okf-<id>` schedule definition enabled.
11
+ **`oats instance diff <instance> --file <id> --revision <rev> [--index-revision <idx>] [--json]`**:
12
+ read-only Git observation of one instance's work tree. It reports the branch
13
+ the tree is actually on (the spawn-recorded branch as `recorded`, with a
14
+ `drift` flag), status with renames, and upstream and default-branch
15
+ comparisons separately (no upstream is `null`). A diff refuses
16
+ `E_STALE_OBSERVATION` if HEAD, the index or the file moved; reads are bounded
17
+ at 256 KiB. Several homes with one name refuse `E_AMBIGUOUS_INSTANCE`; a
18
+ retired tree is `E_NO_WORKTREE`. The observed tree's repository config is
19
+ treated as untrusted input: external diff, textconv, fsmonitor and hooks are
20
+ disabled, the caller's Git environment and global config are not inherited,
21
+ and no object or index refresh is written (`readOnly` in the response).
22
+ - **`oats inspect --json` souls carry their declarations** (`soulsApi: 1`):
23
+ `declarations`, `provenance` (recorded by `oats onboard` from now on; `null`
24
+ means unrecorded), `readiness` (declared sources joined against the payload's
25
+ capability inventory, separate from launchability), and `result.sources`.
26
+ - **No hollow agents.** `oats create` declares `oats.core` by default, which
27
+ suppresses the kernel's legacy skills, but nothing activated the replacement,
28
+ so `spawn` produced an agent with no operational curriculum. `spawn` now
29
+ refuses `E_REQUIREMENT_INACTIVE` before creating anything, with the remedy
30
+ (`oats install oats.framework` if needed, then `oats use oats.core --soul
31
+ <name>`) and the opt-out (remove the declaration). `create` states the
32
+ activation step (`next-step` note, `declaredCapabilities` in `--json`).
33
+
34
+ ## Desktop
35
+
36
+ - A shared contextual right panel (Instance, Git & GitHub, Soul) with a
37
+ collapsed rail, per-workspace preferences and a temporary focus mode.
38
+ - **Git & GitHub panel** on `oats instance git|diff`: worktree, branch and
39
+ drift, upstream and base named separately, file counts and rename paths, and
40
+ a bounded read-only diff; stale observations are re-read, never rendered. The
41
+ old background Git collector, which ran Git on every roster poll, is removed.
42
+ The GitHub/PR card is unavailable in this release.
43
+ - **Souls and Sources** on the new declarations: recorded provenance
44
+ (`null` renders *Unrecorded*), "Not declared" distinct from "Not reported".
45
+ - **Capabilities**: the official catalog via `oats catalog` plus the
46
+ deployment's inventory; override catalogs are labelled; "Add capability"
47
+ copies the exact `oats install <package>` argv and never executes it.
48
+ - **Spawn modal** redesigned: two-column layout, grouped soul chooser,
49
+ provider and model with their provenance, and launch configuration restored.
50
+ - **Active overview** of the roster, with activity shown as unknown.
51
+
52
+ The new views need CLI **0.24.7**; an older CLI renders them as unavailable.
@@ -1,107 +1,69 @@
1
1
  # OATS v0.24.8 — lifecycle plans, readiness, spawn preview, instance events, and guarded Stop/Remove in the Desktop
2
2
 
3
- Kernel/Pi/Desktop **0.24.8**. Tag `v0.24.8` → the commit carrying these notes
4
- (the last code change is `508fda04`, PR #69). The npm tarball's `gitHead` is
5
- the tagged commit; the version-bump commit lands after the tag. All new
6
- contracts are **advertised**: consumers gate on `oats version --json`
7
- `features[]` names and the API integers below — never on the version number,
8
- never by optimistic invocation.
3
+ Kernel/Pi/Desktop **0.24.8** (PR #69). Every new contract is advertised:
4
+ consumers gate on `oats version --json` `features[]` names and API integers,
5
+ never on the version number. Full shapes are in the
6
+ [Desktop CLI API](../desktop-cli-api.md).
9
7
 
10
- ## Kernel — the remaining Desktop-parity seams (K3, K5, K6, K7, K8)
8
+ ## Kernel
11
9
 
12
- - **Lifecycle plans** (K3, `lifecycleApi: 1`, feature `lifecycle-plans`):
13
- `oats instance stop <i> --plan|--apply` and `oats retire <i> --plan`, then the
14
- **guarded apply** `oats retire <i> --plan-revision <rev> --idempotency-key <key>
15
- [--discard-worktree] [--delete-branch]`. A plan states producer facts (ordered
16
- targets deepest-first, session/work facts, recorded children, `midTask:
17
- "unknown"` never inferred) under a 24-hex `planRevision`; apply re-reads and
18
- refuses `E_PLAN_STALE` (fresh plan attached) when facts moved. Keys replay
19
- their own receipt instead of acting twice — stop receipts are stored **per
20
- key**, retire receipts survive the home's removal.
21
- - **Retention by default** (feature `retire-retention`): a plain retire
22
- re-homes the worktree to `<workspace>/.agents/worktrees/<repo>/<branch>`
23
- instead of deleting it; `--discard-worktree` removes; `--delete-branch`
24
- deletes the branch the tree is **verified** to be on and implies discard.
25
- Receipt `retention {worktree: retained|removed|absent, movedTo, branch,
26
- recordedBranch, branchDeleted?, branchDeletionSkipped?}`; a failed move is
10
+ - **Lifecycle plans** (`lifecycleApi: 1`, feature `lifecycle-plans`):
11
+ `oats instance stop <i> --plan|--apply` and `oats retire <i> --plan`, then
12
+ the guarded apply `oats retire <i> --plan-revision <rev> --idempotency-key
13
+ <key> [--discard-worktree] [--delete-branch]`. A plan states the facts
14
+ (ordered targets, session and work facts, recorded children) under a
15
+ `planRevision`; apply refuses `E_PLAN_STALE` when they moved. A repeated key
16
+ replays its receipt instead of acting twice.
17
+ - **Retention by default** (feature `retire-retention`): a plain retire moves
18
+ the worktree to `<workspace>/.agents/worktrees/<repo>/<branch>` instead of
19
+ deleting it; `--discard-worktree` removes it; `--delete-branch` deletes the
20
+ branch the tree is verified to be on and implies discard. A failed move is
27
21
  `E_WORK_PRESERVATION_FAILED` with the home kept.
28
- - **Children first, kernel-owned.** A guarded retire stops the plan's recorded
29
- children (bounded SIGTERM, never escalated) and retains them; a child still
30
- running refuses the whole retirement — `E_CHILDREN_RUNNING`, nothing retired.
31
- - **Branch deletion is bound to the confirmed branch**: re-verified at deletion,
32
- after hooks (which may mutate the tree); a mismatch deletes nothing and
33
- reports `branchDeletionSkipped {expected, actual, reason}`.
34
- - **Ambiguous parentage is reported, never acted on**: parent edges are bare
35
- names; one that resolves to several homes appears under `ambiguous[]`
36
- (`plan.ambiguous` on stop, `plan.facts.ambiguous` on retire).
37
- - A pre-plan CLI does not understand `--plan` and would retire on it; that is
38
- exactly why the feature is advertised — consumers must gate.
39
- - **Readiness** (K5, `readinessApi: 1`): `oats readiness [--soul] [--home]
40
- [--verify-signatures] [--policy] --json` — the quartet
41
- installed · trusted · configured · enrolled, each `pass|fail|unknown|not-applicable`
42
- with items `{subject, required, reason, producer, evidence, remedy}`;
43
- `summary.ready` is never vacuous. Signatures are `unknown` unless
44
- `--verify-signatures` (an explicit one-commit fetch; `verified|unsigned|invalid`
45
- with the signer named). Enrolled = workspace-member admission.
46
- - **Enforced child policy** (K5): soul `children: {spawn: bool}`, spawn
47
- `--allow-child-spawns|--no-child-spawns`, recorded as `instance.json`
48
- `policy.childSpawns {allowed, origin}`; a spawn with `--parent` under an off
49
- policy refuses `E_CHILD_SPAWNS_DISABLED`. `inspect --json` souls carry
50
- `declarations.children`; capability rows carry `commit`.
51
- - **Spawn preview** (K6, `spawnPreviewApi: 1`): `oats spawn … --preview --json`
52
- states the decision — instance name, home, worktree, branch, base `{ref, oid}`,
53
- runtime/model/launch config, work mode, composition sources, policy — without
54
- creating anything. `--base <ref>` picks the base; `@native-default` names the
55
- runtime's own default explicitly.
56
- - **Instance events** (K7, `eventsApi: 1`, feature `instance-events`):
57
- `oats instance events <i> [--limit] [--since] --json` — typed, producer-
58
- attributed lifecycle events (spawned, launched, restarted, stopped,
59
- stop-refused, retire-planned, retired, worktree-retained, branch-deleted,
60
- child-spawn-refused, recomposed) from the home's log and the workspace's
61
- retained copy; truncation and unreadable lines are visible, never smoothed.
62
- - **Schedule run history** (K8, `scheduleApi: 2`, feature `schedule-history`):
63
- schedules report `recentRuns` — settled runs only, producer order, ≤ 50.
22
+ - **Children first.** A guarded retire stops the plan's recorded children
23
+ (bounded SIGTERM, never escalated); a child still running refuses the whole
24
+ retirement with `E_CHILDREN_RUNNING`.
25
+ - Branch deletion is re-verified after hooks; a mismatch deletes nothing and
26
+ reports `branchDeletionSkipped`. Ambiguous parentage is reported, never
27
+ acted on.
28
+ - An older CLI does not understand `--plan` and would retire on it, so
29
+ consumers must gate on the feature.
30
+ - **Readiness** (`readinessApi: 1`): `oats readiness [--soul] [--home]
31
+ [--verify-signatures] [--policy] --json` reports installed, trusted,
32
+ configured and enrolled, each `pass|fail|unknown|not-applicable`, with items
33
+ and remedies. Signatures are `unknown` unless `--verify-signatures` is given.
34
+ - **Child spawn policy**: soul `children: {spawn: bool}` and spawn
35
+ `--allow-child-spawns|--no-child-spawns`, recorded in `instance.json`; a spawn
36
+ with `--parent` under a disabled policy refuses `E_CHILD_SPAWNS_DISABLED`.
37
+ - **Spawn preview** (`spawnPreviewApi: 1`): `oats spawn … --preview --json`
38
+ states the instance name, home, worktree, branch, base, runtime, model, launch
39
+ configuration, work mode and policy without creating anything. `--base <ref>`
40
+ picks the base; `@native-default` names the runtime's default.
41
+ - **Instance events** (`eventsApi: 1`, feature `instance-events`):
42
+ `oats instance events <i> [--limit] [--since] --json` returns typed lifecycle
43
+ events (spawned, launched, restarted, stopped, retired, worktree-retained,
44
+ branch-deleted, recomposed and others); truncation and unreadable lines are
45
+ visible.
46
+ - **Schedule run history** (`scheduleApi: 2`, feature `schedule-history`):
47
+ schedules report up to 50 settled `recentRuns`.
64
48
  - **Instruction refresh** (feature `session-recompose`): `oats session recompose
65
- --home <abs> [--dry-run] --json` recomposes a **live** home's `AGENTS.md`
66
- from its current soul with the same composer spawn used; previous text is
67
- retained beside it, `instance.json` and a `recomposed` event record it,
68
- nothing is restarted. An operator action for when a role changes and a
69
- respawn is not possible or wanted.
70
- - Remote workspaces: `oats instance git|diff` reach a remote instance through
71
- the negotiated route (K1 remote), refusing rather than guessing where no
72
- route exists.
49
+ --home <abs> [--dry-run] --json` recomposes a live home's `AGENTS.md` from its
50
+ current soul, keeps the previous text beside it, and restarts nothing.
51
+ - `oats instance git|diff` reach remote instances through the saved route.
73
52
 
74
- ## Desktop (parity slices 2b and 2c)
53
+ ## Desktop
75
54
 
76
- - **2b — Connections.** Settings → Connections with an inline "Connect
77
- GitHub" (device flow through `gh`, credential custody stays with `gh`; the
78
- auth pane is a closed key set with redaction). The Git & GitHub panel gains an
79
- observation-bound PR card: informational, correlated to the exact K1
80
- revision/branch/remote, never authority. Forge connections are an **ADE
81
- integration**, not a capability.
82
- - **2c — Stop and Remove.** The instance menu offers *Stop…* and *Remove
83
- instance…*; both open a plan-backed confirmation showing the kernel's exact
84
- targets, skipped/ambiguous children, session and work facts, the real branch
85
- (recorded-branch drift noted separately) and retained-by-default choices.
86
- One guarded local route; the plan is read from the CLI, each confirmation
87
- gets an opaque reference, the idempotency key is minted on the first
88
- confirmation and kept for that intent's retries, one apply at a time; lost
89
- responses are shown as **unknown outcome**, never "no effect". Stale plans
90
- require a new confirmation; a refused child stop names the child. The old
91
- unguarded retire route now answers `E_PLAN_REQUIRED`.
92
- - Everything above is **unavailable** (not hidden, not guessed) when the
93
- installed CLI does not advertise the corresponding feature.
94
-
95
- ## Also
96
-
97
- - Lessons recorded: consumers gate on advertised features, never on
98
- optimistic invocation; a declaration that suppresses a default must be
99
- enforced; read-only Git observation is a security boundary.
100
- - Verification budget: one full gate per change is PR CI; locally only the
101
- affected suites. Desktop-only changes run the Desktop suites plus the
102
- focused suite.
55
+ - **Connections**: Settings → Connections with "Connect GitHub" (device flow
56
+ through `gh`, which keeps the credential). The Git & GitHub panel gains an
57
+ informational PR card tied to the observed revision and branch.
58
+ - **Stop and Remove**: the instance menu offers *Stop…* and *Remove
59
+ instance…*, each with a plan-backed confirmation showing the kernel's targets,
60
+ children, session and work facts, the real branch and the retention choices.
61
+ Lost responses show an unknown outcome; stale plans need a new confirmation.
62
+ The old unguarded retire route answers `E_PLAN_REQUIRED`.
63
+ - Each control is unavailable when the installed CLI does not advertise its
64
+ feature.
103
65
 
104
66
  ## Upgrade
105
67
 
106
- `npm i -g @awebai/oats@0.24.8`, then `oats doctor`. Desktops pinned to an
107
- older CLI keep working; new controls appear as the CLI's advertised features do.
68
+ `npm i -g @awebai/oats@0.24.8`, then `oats doctor`. Desktops on an older CLI
69
+ keep working; new controls appear as the CLI advertises their features.