@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,750 +0,0 @@
1
- _OATS architecture · accepted for infrastructure implementation · reconciled 15 September 2026_
2
-
3
- # Portable Souls
4
-
5
- > **Design accepted; implementation authorization is now explicit.** Baseline
6
- > `428cd9af615652c4a93d754c1106674abd18545b` contains storage retention only, not
7
- > migrated consumers or private-team guarantees. Desktop feature work is **later**.
8
-
9
- How a multi-repository organization can publish expert souls, discover them through
10
- existing Git access and prepare them on different machines, without an OATS registry:
11
- private-first messaging choices and captured software compositions are the accepted
12
- target, **not certified deployed behavior**.
13
-
14
- > The **soul** declares what it needs and where it comes from.
15
- > The **workspace** declares admission, defaults, knowledge stores, teams and catalogs.
16
- > The **local deployment** resolves, installs, binds credentials and keeps state.
17
-
18
- **Example boundary:** all LFX repository/package names, roles, versions, team
19
- addresses, local layouts and scenarios below are **illustrations, not an inventory
20
- or facts about a real deployment**. They are not claims that a named repository,
21
- package export, release or provider behavior exists. No credentials or transcripts
22
- are included. YAML shapes need parser/schema review; `repo:` semantics are accepted.
23
- The [reconciled proposal](2026-09-14-portable-souls-and-git-workspaces.md),
24
- [binding handoff](2026-09-15-portable-souls-handoff.md),
25
- [public amendment](2026-09-14-portable-souls-contract-amendments.md) and
26
- [implementation ledger](2026-09-15-portable-souls-implementation.md) are the common
27
- baseline. There is no separate pre-review policy on this page.
28
-
29
- _Concepts_
30
-
31
- ## The vocabulary
32
-
33
- Every later section uses these words precisely. The LFX column illustrates the accepted model, not an actual checkout or live membership.
34
-
35
- | Concept | What it is | In LFX |
36
- |---|---|---|
37
- | Soul | A durable expert definition: role, procedural curriculum, capability requirements, knowledge nodes, team aliases. Not a running process. | `self-serve-expert`, `self-serve-ux-expert`, `member-service-expert`, `mcp-data-expert`. Project experts can be committed in their own repositories' `agents/` directory and shared; local-only definitions are not a publication mechanism. |
38
- | Instance | One incarnation of a soul: its own home, task, effective composition, runtime identity. Retired when done. | `self-serve-expert-1` working a PR in a worktree of `lfx-self-serve`. |
39
- | Capability | A reusable runtime surface: skills, instructions, commands and hooks, helper agents. May implement a fundamental layer. | `lfx.local-review` (adversarial review workflows), `lfx.service-dev`, `lfx.ui-dev`, `oats.okf` (knowledge), `oats.aweb` (messaging), `oats.jira` (tasks). |
40
- | Package | The acquisition and update unit: exports one or more capabilities, with payload and dependency declarations. | `lfx-engineering-capabilities#packages/local-review`; `awebai/oats-okf`. |
41
- | Fundamental layer | Knowledge, messaging, tasks. Zero or one default implementation per slot in an instance is a v1 simplification, provisional; implementations are replaceable. | OKF, aweb, Jira as illustrative choices; a default fills an open role but cannot override a hard requirement. |
42
- | Source repository | The versioned home of souls or packages. In the beginning this is simply the project repository itself: souls live under its conventional `agents/` directory, next to the code they work on. A dedicated souls repository is an option for souls that span repositories, not the starting point. | `lfx-self-serve/agents/self-serve-expert/`, `lfx-v2-member-service/agents/member-service-expert/`; `lfx-engineering-experts` for experts that span repositories (`mcp-data-expert`, `org-dashboard-expert`, `individual-dashboard-expert`); `lfx-engineering-capabilities` for packages. |
43
- | Work target | The repository or directory an instance operates on. Not necessarily the soul's source repository. | `lfx-v2-member-service`, worked by a soul that may live in `lfx-engineering-experts`. |
44
- | Workspace definition | A Git-hosted organisational authority: admitted repositories, layer defaults, knowledge stores, team references, catalogs. No secrets. | An illustrative `lfx-workspace` repository, separate from local deployment configuration. |
45
- | Local deployment | One operator's installed realisation: artifacts, lock, repository mappings, credentials, trust approvals, private team, instance compositions. | Operator A's root, operator B's different root, or a laptop with only `lfx-self-serve` cloned. |
46
- | Team | A messaging provider's membership boundary; catalog/live visibility, contact and history are separate grants requiring qualification. | `lfx` (everyone), `self-serve`, `platform`, `marketing`. |
47
- | Private team | Intended per-human/workspace team for messaging-enabled instances, reused across hosts; wider teams are opt-in. No privacy guarantee until a named owner qualifies the provider. | Human A plus qualified workspace identity is the key, not a username or alias. |
48
- | Knowledge store and node | Durable knowledge outside souls. Default OKF uses store-qualified nodes, one steward per node and explicit promotion destinations; other providers own their models. | `lfx-knowledge` with nodes such as `self-serve-service`, `lfx-review-conventions`. |
49
- | Artifact and lock | Immutable capability artifact with package provenance. The lock holds new-preparation choices; captured resolutions outside homes govern instances/jobs. | `lfx.local-review / 4b7e02` selected by three instances; `lfx.local-review / c91a4f` by a fourth. |
50
- | Channel and pin | A moving selector (`@main`, a release channel) or a fixed one (`@v4.1.0`, a commit). Resolved once per instance into an artifact. | Marketing follows `@main`; platform pins during a release. |
51
-
52
- _Why_
53
-
54
- ## The fundamental issues
55
-
56
- The symptoms (an uncommitted config, a gitignored `local-agents/` folder) are downstream of five structural problems. Each one is something the architecture has to answer, not something a tidier config file fixes.
57
-
58
- | Issue | Root cause | Illustrative failure | What the design does |
59
- |---|---|---|---|
60
- | Expertise is trapped on machines | A soul is an accumulation of expertise, but its definition depends on things that exist only on the author's laptop. So the organisation cannot own, share or build on its own experts; each person re-creates them. | An unpublished `self-serve-ux-expert` depends on its author's local setup; colleagues must reconstruct its dependencies. | Souls become self-describing: every requirement carries its source, every knowledge node its store. A committed soul's *software sources* are complete; deployment inputs (credentials, team enrolment, store access) can still be missing and are reported as such. (see: Files) |
61
- | Identity is inferred from location | What something is, where it came from, who admitted it and where it runs are all read off the filesystem. Nothing is addressable independently of a machine, so nothing can be reasoned about, trusted or moved. | A naive folder-based rule mistakes a fork or stray clone for a member and misses real members elsewhere; provenance becomes a folder name. | Qualified identities and reciprocal Git declarations. Source, install location, work target and team membership are four separate facts. (see: Org) |
62
- | There is no organisational unit for agents | Repositories exist and machines exist; "LFX's agents" does not exist anywhere as a thing that can admit members, set defaults, list its knowledge or be asked what experts it has. | Without declarations, answering "which experts exist and where?" depends on the original operator instead of inspectable data. | A Git-hosted workspace definition: admission, defaults, knowledge stores, team references, catalogs. Discoverable from any member repository with existing GitHub access. (see: Onboarding) |
63
- | Freshness and reproducibility fight | Humans want the latest and do not want to manage version numbers. Running agents need an exact, immutable composition or their behaviour changes under them and they cannot be retired or recovered safely. One mutable pointer cannot satisfy both. | Updating `lfx.local-review` in the shared store changes it for every instance already running, including a review sweep queued yesterday. Pinning it instead means someone manages versions by hand. | Channels and pins for humans; one immutable resolution per instance for machines; several artifacts per capability side by side; approval per revision for anything executable. (see: Updates) |
64
- | Access is one blunt grant | Reading a repository, executing its hooks, joining a team, seeing a colleague's running agents and reading their conversations are five different permissions. When they are one, either too much is exposed or everything is locked. | Anyone who can read `lfx-self-serve` would, under a naive design, see and contact every instance spawned from it, including a manager reading an engineer's agents' mail. | Catalog/live visibility, contact and history are separate grants; private-first is the intended default pending provider qualification, not inferred from source access. (see: Teams) · (see: Permissions) |
65
-
66
- A sixth constraint sits across all five: solving them must not add infrastructure LFX has to operate. No registry service, no discovery daemon, no OATS user database. Git hosting, the messaging provider and the machines people already have are the whole substrate.
67
-
68
- _The model_
69
-
70
- ## Three responsibilities, kept apart
71
-
72
- The design separates what travels with a soul, what the organisation asserts, and what one operator has actually installed. Source location, installation location, work target and team membership are four different things and none may be inferred from another.
73
-
74
- **Soul**
75
-
76
- _Owned by the soul's maintainer · committed with the soul_
77
-
78
- - Role and procedural curriculum
79
- - `requires` constraints and `defaults` fallbacks; each intrinsic capability has a **source-complete** reference: repository, package path, revision policy
80
- - Source-complete knowledge locators or explicitly inherited bindings; store-qualified reads and optional owned-node destinations for OKF
81
- - Logical team aliases (`self-serve`, `lfx`), never a provider's real team id
82
- - Fundamental-layer needs it does not care about (any messaging provider)
83
-
84
- **Workspace definition**
85
-
86
- _Owned by workspace maintainers · the `lfx-workspace` repository_
87
-
88
- - Admitted member repositories
89
- - Default provider per fundamental layer
90
- - The organisation's knowledge stores and tools, so authors and onboarding can find them
91
- - Named team references mapped to provider-qualified ids
92
- - Catalog sources for capability packages
93
- - No secrets, no machine state
94
-
95
- **Local deployment**
96
-
97
- _Owned by one operator · on one machine_
98
-
99
- - Retained artifacts; lock choices for new preparation and separate captured resolutions outside homes
100
- - Repository mappings, work targets
101
- - Credentials, knowledge-store connections
102
- - The human's private team and each instance's wider memberships
103
- - Executable trust approvals
104
- - Per-instance compositions
105
-
106
- Two boundaries fall out of this. A soul can carry the *software* needed to talk to Jira or a knowledge store; it cannot carry anyone's credentials, enrolment or paths, so a missing input produces an explicit `needs configuration` rather than a launch that pretends to have succeeded. And discovery may *advertise* a capability without *activating* it: only what a soul actually requires, plus its dependency closure, is installed.
107
-
108
- _At org level_
109
-
110
- ## LFX, drawn
111
-
112
- Illustrative topology, not a deployment inventory. Labels [new] indicate possible additions, not approved repository creation. A repository may hold several independently updated packages; every listed member follows the same reciprocal rule.
113
-
114
- > **Souls live in project repositories first**
115
- > - The default home of a soul is the repository it works on, under that repository's `agents/` directory: `lfx-self-serve/agents/self-serve-expert/`.
116
- > - A repository carries as many repo-related souls as it wants. `lfx-self-serve` can hold `self-serve-expert`, `self-serve-ux-expert` and `self-serve-accessibility-expert` side by side, each exported.
117
- > - Unpublished project-related definitions can be made portable there without a central soul repository.
118
- > - A separate experts repository such as `lfx-engineering-experts` is for experts whose subject spans repositories (`mcp-data-expert`, `org-dashboard-expert`, `individual-dashboard-expert`), or later a marketing team with no code repository. Nothing requires souls to be centralised.
119
- > - Souls are named for the expertise they hold, not for a job title: `self-serve-ux-expert`, not "UX engineer".
120
-
121
- - _workspace definition_: **lfx-workspace (new)** — members · layer defaults · knowledge stores · teams (lfx, self-serve, platform, marketing) · catalogs
122
-
123
- (admits / backlink)
124
-
125
- - _capability repository_: **lfx-engineering-capabilities** — `packages/local-review` · `packages/pr-flow` · `packages/service-dev` · `packages/ui-dev` · `packages/mcp-playbooks`
126
- - _experts repository · subjects that span repositories_: **lfx-engineering-experts** — mcp-data-expert · org-dashboard-expert · individual-dashboard-expert
127
- - _souls repository_: **lfx-marketing-souls (new)** — campaign-strategy-expert · newsletter-strategy-expert · community-content-expert
128
- - _project repository · carries its own souls_: **lfx-self-serve** — `agents/self-serve-expert` · `agents/self-serve-ux-expert` · `agents/self-serve-accessibility-expert` · `packages/self-serve-dev` (project-local capability)
129
- - _project repositories · each carries its own souls_: **lfx-v2-member-service, lfx-v2-meeting-service, lfx-v2-committee-service, …** — `agents/member-service-expert`, `agents/member-service-salesforce-expert`, `agents/meeting-service-expert`, … sharing lfx.local-review and lfx.service-dev
130
- - _knowledge store_: **lfx-knowledge (new)** — one illustrative default store, not a one-store limit · explicit node stewards/destinations · default OKF promotion
131
-
132
- _Sources that are not membership (see Reciprocal membership)_
133
-
134
- - *every developer soul* → lfx-engineering-capabilities#packages/local-review
135
- - *self-serve-expert* → its own repo, `repo:packages/self-serve-dev`
136
- - *workspace defaults* → awebai/oats-okf, oats.aweb, oats.jira (third party: no backlink, not admitted)
137
-
138
- ### Shared capabilities in `lfx-engineering-capabilities`
139
-
140
- One repository, several independently updated package roots. This illustrative grouping preserves examples of shared craft; it is neither an inventory nor a packaging decision.
141
-
142
- | Package | Capability | What it groups |
143
- |---|---|---|
144
- | packages/local-review | `lfx.local-review` | Adversarial review workflows: the per-repository convention reviewers, the learnings reviewers fed by each repo's review knowledge base, and the general reviewer, launched together after every commit. |
145
- | packages/pr-flow | `lfx.pr-flow` | Branching, PR readiness and preflight conventions; the pre-PR full-branch sweep. |
146
- | packages/service-dev | `lfx.service-dev` | The Go service craft shared by the v2 services: Goa design and generated-code boundaries, NATS, FGA, indexer contracts, Helm chart wiring. |
147
- | packages/ui-dev | `lfx.ui-dev` | UI conventions shared by `lfx-v2-ui` and `lfx-self-serve`: component patterns, accessibility, upstream API validation. |
148
- | packages/mcp-playbooks | `lfx.mcp-playbooks` | MCP playbooks that `mcp-data-expert` could share with other MCP-facing souls. |
149
-
150
- Souls pick from these individually: `self-serve-ux-expert` needs `lfx.ui-dev` and `lfx.local-review`, not `lfx.service-dev`. Only what a soul requires is installed.
151
-
152
- _Admission_
153
-
154
- ## Membership is reciprocal, for every member
155
-
156
- A repository belongs to the LFX workspace when two independent declarations agree: the workspace **admits** the repository, and the repository **names** the workspace. Neither alone is enough. This is the general rule for organisational membership; it does not care what the repository contains.
157
-
158
- ```
159
- eligible(operator, repository, workspace) =
160
- operator can read lfx-workspace
161
- AND operator can read repository
162
- AND lfx-workspace admits repository
163
- AND repository identifies lfx-workspace
164
- ```
165
-
166
- Why both directions: admission alone would let the workspace claim any public repository; a backlink alone would let any fork or copy join by keeping one line. Together they mean a member is something both sides chose, at recorded revisions, and nothing can be faked by moving folders or forking. Identities are qualified (canonical remote, provider repository id), so renames and transfers are handled explicitly rather than by whichever same-named folder wins.
167
-
168
- ### It applies to every kind of member
169
-
170
- The rule is the same whether the repository holds code, souls, packages or knowledge. What admission *unlocks* differs by what the repository exports.
171
-
172
- | Member | Example | Its backlink says | Admission makes it |
173
- |---|---|---|---|
174
- | Project repository | `lfx-self-serve`, `lfx-v2-member-service` | `workspace:` plus the souls it exports from its own `agents/`, and any project-local package | A candidate work target and source of souls discoverable with required repository access; preparation has separate readiness gates. |
175
- | Experts repository | `lfx-engineering-experts`, `lfx-marketing-souls` | `workspace:` plus its exported souls | A source of souls whose subjects span repositories. |
176
- | Capabilities repository | `lfx-engineering-capabilities` | `workspace:` plus its package roots | A catalog entry: its packages are advertised to soul authors. Nothing is installed by admission alone. |
177
- | Knowledge repository | `lfx-knowledge` | `workspace:` plus the store it exposes | A listed knowledge store: authors and the onboarding expert can find it, harvesters can be pointed at it. Reading it still needs GitHub access to it. |
178
-
179
- **lfx-v2-member-service/oats.yaml (a project repository)**
180
-
181
- ```yaml
182
- workspace: git:github.com/linuxfoundation/lfx-workspace
183
-
184
- exports:
185
- souls:
186
- - path: agents/member-service-expert
187
- - path: agents/member-service-salesforce-expert
188
- ```
189
-
190
- **lfx-knowledge/oats.yaml (a knowledge repository)**
191
-
192
- ```yaml
193
- workspace: git:github.com/linuxfoundation/lfx-workspace
194
-
195
- exports:
196
- knowledge:
197
- - store: . # this repository is the store
198
- description: LFX expert knowledge, soul-owned nodes
199
- ```
200
-
201
- ### What is not membership
202
-
203
- - **Consuming a source.** The workspace defaults point at `awebai/oats-okf`, `oats.aweb` and `oats.jira`; souls may point at third-party packages. None of those repositories backlink, none are admitted, none become LFX members. A source declaration grants no membership, no execution trust and no credentials.
204
- - **A fork.** A personal fork of `lfx-engineering-experts` still carries `workspace: linuxfoundation/lfx-workspace`. The workspace does not list the fork, so it is not a member: its souls are not discoverable as LFX's and its packages are not catalogued.
205
- - **A neighbouring folder.** Something cloned under `~/lfx` that neither backlinks nor is admitted is just a directory.
206
- - **A public reusable soul repository.** It cannot backlink to every organisation that uses it, so it is consumed, not admitted: LFX *imports* the soul by reference (below).
207
-
208
- ### Importing an external soul
209
-
210
- The accepted contract resolves the external-adoption gap: A soul that lives in a repository LFX cannot admit is used by **reference, never by copy**. The reference has four fields: canonical source repository, exported soul path, revision selector, adopter-local alias. Preparation retains the exact resolved revision and the source files the soul needs; the upstream soul identity, the revision and the local alias stay distinct, so a newer revision is the same soul and a renamed alias is not a new one.
211
-
212
- ```
213
- # lfx-workspace/oats-workspace.yaml
214
- imports:
215
- - source: git:github.com/some-org/mcp-experts
216
- soul: agents/mcp-data-expert
217
- revision: v2.3.0 # pin or channel, resolved once per prepare
218
- alias: mcp-data-expert
219
- adoption: # workspace-side defaults for this import, keyed to the qualified upstream identity
220
- teams: { experts: platform } # advertises a destination; does not enrol
221
- knowledge-destination: lfx-knowledge
222
- tasks: oats.jira # rebinds a default; cannot replace a hard requirement
223
- ```
224
-
225
- - The workspace advertises the import in its catalog; the source repository is not admitted and needs no backlink. Private sources still need GitHub access.
226
- - A standalone prepare accepts the identical reference with no workspace at all.
227
- - Adoption defaults on the entry may bind extension points and rebind rebindable defaults; a spawn-time choice may override them within the same bounds. Neither edits the soul.
228
- - The imported soul's original organisation never becomes a second source of policy; the instance selects exactly one workspace context.
229
-
230
- Adding a member is two reviewed changes: a PR to `lfx-workspace` adding one line to `members`, and a PR to the new repository adding its `oats.yaml`. Removing a member is either one. Branch protection on both sides is the review process; no OATS service is involved.
231
-
232
- _Concretely_
233
-
234
- ## What the files say
235
-
236
- Illustrative syntax from the proposal, not an agreed schema. What matters is the shape: each file says only what its owner is entitled to say.
237
-
238
- **lfx-self-serve/agents/self-serve-expert/soul.yaml**
239
-
240
- Illustrative soul declaration as **pseudoconfiguration**, not current runnable
241
- configuration (nesting requires parser/schema review):
242
-
243
- ```text
244
- name: self-serve-expert
245
- description: Ships lfx-self-serve features through reviewed PRs
246
-
247
- requires: # hard constraints, never erased by an override
248
- capabilities:
249
- lfx.local-review:
250
- source: git:github.com/linuxfoundation/lfx-engineering-capabilities@main#packages/local-review
251
- lfx.self-serve-dev:
252
- source: repo:packages/self-serve-dev # root of retained source repository
253
- messaging: any # no concrete provider => needs configuration
254
- tasks: any
255
-
256
- defaults: # fallbacks rebindable within requirements
257
- tasks:
258
- capability: oats.jira
259
- source: git:github.com/awebai/oats-jira@v1#oats-package
260
-
261
- knowledge: # OKF payload, NOT a mandatory kernel node schema
262
- reads:
263
- - store: git:github.com/linuxfoundation/lfx-knowledge@main
264
- node: lfx-platform-architecture
265
- - store: git:github.com/linuxfoundation/lfx-knowledge@main
266
- node: lfx-review-conventions
267
- owns:
268
- - node: self-serve-service # inherits explicitly selected write binding
269
- - node: self-serve-ui-patterns
270
- destination: git:github.com/linuxfoundation/lfx-knowledge@main
271
-
272
- teams: [self-serve, lfx] # opt-in aliases, not automatic wider enrollment
273
- ```
274
-
275
- These conceptual fields require parser review, including how a fixed store source
276
- is distinguished from a rebindable default. `owns` without a destination does not
277
- invent a store: no explicit write binding means `needs configuration`. Each resolved
278
- address includes store plus node; equal leaf names in different stores never collide.
279
- All provider/version/team labels below are hypothetical, not install instructions.
280
-
281
- **lfx-workspace/oats-workspace.yaml**
282
-
283
- ```yaml
284
- name: lfx
285
-
286
- members:
287
- - github.com/linuxfoundation/lfx-engineering-capabilities # packages
288
- - github.com/linuxfoundation/lfx-engineering-experts # souls
289
- - github.com/linuxfoundation/lfx-marketing-souls # souls
290
- - github.com/linuxfoundation/lfx-knowledge # knowledge store
291
- - github.com/linuxfoundation/lfx-self-serve # project + its souls
292
- - github.com/linuxfoundation/lfx-v2-member-service # project + its souls
293
- - github.com/linuxfoundation/lfx-v2-meeting-service
294
- # … one line per admitted repository, whatever it holds
295
-
296
- defaults:
297
- knowledge: { capability: oats.okf, source: git:github.com/awebai/oats-okf@v2#oats-package }
298
- messaging: { capability: oats.aweb, source: git:github.com/awebai/oats-aweb@v1#oats-package }
299
- tasks: { capability: oats.jira, source: git:github.com/awebai/oats-jira@v1#oats-package }
300
-
301
- knowledge: # discoverability: where LFX keeps knowledge
302
- stores:
303
- - git:github.com/linuxfoundation/lfx-knowledge # one store for now; more can be listed later
304
-
305
- teams:
306
- lfx: aweb:lfx.aweb.ai/lfx
307
- self-serve: aweb:lfx.aweb.ai/self-serve
308
- platform: aweb:lfx.aweb.ai/platform
309
- marketing: aweb:lfx.aweb.ai/marketing
310
- private: per-human # default: one private team per person
311
-
312
- catalogs:
313
- - git:github.com/linuxfoundation/lfx-engineering-capabilities
314
- ```
315
-
316
- **lfx-engineering-experts/oats.yaml (member repository backlink + export index)**
317
-
318
- ```yaml
319
- workspace: git:github.com/linuxfoundation/lfx-workspace
320
-
321
- exports:
322
- souls:
323
- - path: agents/mcp-data-expert
324
- description: Exposing LFX data through MCP: schema, playbooks, limits
325
- - path: agents/org-dashboard-expert
326
- description: What an organisation sees of itself in LFX and why
327
- - path: agents/individual-dashboard-expert
328
- description: The individual contributor's view: identity, activity, privacy
329
- ```
330
-
331
- Small, declarative, data-only. Discovery reads this file; it never scans the tree or runs anything in the repository.
332
-
333
- **Illustrative deployment (new resolution/source-store paths and wire schema require review)**
334
-
335
- ```
336
- <deployment>/
337
- oats-lock.json # current choices for NEW preparation only
338
- .agents/capabilities/artifacts/
339
- lfx.local-review/
340
- sha256-4b7e02…/ # older skill-only artifact
341
- sha256-c91a4f…/ # new skill-only artifact; visible change notice
342
- oats.jira/
343
- sha256-a13d77…/ # approved executable artifact (has a spawn hook)
344
- <captured-resolutions>/ # outside homes; authority for each instance/job
345
- <retained-soul-sources>/ # qualified identity + digest; not capability helpers
346
- .oats-state/ # provider state; private choices, not privacy proof
347
- lfx-self-serve/ # work target, mapped in the deployment
348
- lfx-v2-member-service/
349
- ```
350
-
351
- Digest prefixes above are abbreviated **display labels**, not valid on-disk
352
- references; retained artifacts use full `sha256-<64 hex digits>` digests. Soul-source
353
- and resolution paths are placeholders pending schema review, not landed directories.
354
-
355
- _Communication_
356
-
357
- ## Teams: private first, wider by choice
358
-
359
- The accepted target is a private team for each human's messaging-enabled instances
360
- in one workspace, reused across that human's machines. The human may opt each
361
- instance into wider aliases such as `lfx`, `self-serve` or `marketing`.
362
-
363
- **No provider privacy guarantee is claimed until a named messaging owner qualifies
364
- actual behavior.** This is the intended model, not certified aweb behavior:
365
-
366
- - **Private is the floor.** Use a provider-resolvable human identity plus qualified
367
- workspace identity, never OS username, checkout path or agent alias. Children
368
- and scheduled instances inherit their responsible human. Messaging-disabled
369
- workers create no team. Standalone deployments need an explicit context key;
370
- `messaging: any` supplies no software, credentials or enrollment.
371
- - **Wider is opt-in per instance.** Soul aliases and import mappings advertise
372
- destinations, not membership. Explicit wider sets replace wider defaults while
373
- retaining the private floor; `[self-serve]` does not accumulate every alias.
374
- - **Identity survives membership changes.** One global instance identity holds
375
- multiple provider membership credentials and survives widening/narrowing. Local
376
- process/session/deployment-record IDs and team-qualified aliases are not that
377
- identity. Two incarnations of a soul do not automatically share it.
378
- - **Four grants, separately qualified.** Catalog visibility, live-instance visibility,
379
- contact permission and conversation-history access differ. Joining a wider team
380
- must not reveal prior private conversations or other private instances. Ordinary
381
- members and administrators controlling host/service are distinct access contexts;
382
- private-team design is not protection from the latter.
383
- - **Capture choices honestly.** Private context and wider-team references are not
384
- evidence of enrollment, credential availability or privacy.
385
-
386
- For illustration, human A keeps `self-serve-ux-expert-2` private while opting
387
- `self-serve-expert-1` into `self-serve`. Human B's representative joins that wider
388
- team. They should be contactable there without exposing either human's other
389
- instances or earlier history. That is a qualification test, not a guarantee
390
- established by writing a team map.
391
-
392
- _Knowledge_
393
-
394
- ## Knowledge follows the same rule
395
-
396
- The knowledge source is declared at the workspace level too, and a soul must be able to reach its knowledge by knowing *where to look* and *which nodes belong to it*, without needing access to the workspace repository. The workspace is the discoverability point that says which knowledge repositories and tools LFX has; it is not a gate the soul passes through on every read.
397
-
398
- **The soul carries**
399
-
400
- - Source-complete store locators or explicitly inherited bindings; fixed sources and rebindable defaults stay distinct
401
- - The nodes it **owns** with optional destinations; absent destinations inherit an explicitly selected write binding or report missing configuration
402
- - The nodes it **reads**, each store-qualified; context selection, not an access-control list
403
-
404
- **The workspace carries**
405
-
406
- - The list of stores: `lfx-knowledge` is one illustrative entry, not a limit
407
- - The default knowledge provider (the capability that reads and harvests: `oats.okf`)
408
- - Defaults resolved before use; subsequent reads do not refetch the workspace
409
-
410
- **The deployment carries**
411
-
412
- - Credentials for the store
413
- - Resolved locators, local clone/connection and provenance captured outside the home
414
- - Explicit promotion destinations, credential references and approvals; later schedules retain execution resolutions
415
-
416
- The kernel's knowledge contract stays provider-neutral: the owns/reads node model and harvester-only promotion describe the default implementation (OKF); a replacement knowledge provider exposes its own configuration and readiness through the capability contract and is not forced into OKF's storage or authoring model.
417
-
418
- Precedence is constraints plus fallbacks: a generic soul can inherit a selected store/provider binding; a specialized soul can fix its source. Operator/import choices rebind only defaults and extension points. The provider-neutral kernel envelope records non-secret payload/provenance with separate credential references. Access belongs to GitHub or the selected provider; a workspace-only nickname is not a complete address.
419
-
420
- ### Open-source souls may consume open-source knowledge bases
421
-
422
- A public soul can name a public store the same way it names a public package: `mcp-data-expert`, once open-sourced, may read from a public `mcp-knowledge` repository maintained with it, and any organisation that prepares the soul reads that store with no LFX involvement. Consuming a public store is a source relation, not membership; it does not admit the store's repository to the adopter's workspace. A separately declared membership still follows the reciprocal rule.
423
-
424
- Within declared defaults and extension points, the adopting organisation chooses where the soul's *own* nodes grow: in the public store, if its maintainers accept harvest PRs, or in its own store (`lfx-knowledge`). Fixed source requirements cannot be overridden. Each choice resolves a store-qualified destination under the declared node name. Public PRs do not break single-owner stewardship, because three roles are involved: the node's responsible steward, the harvester proposing a change, and the repository maintainers accepting it. Consuming a public store never implies publishing the adopter's notes to it; the destination and the intent to publish are explicit. Reads may come from more than one store. The invariant is **one explicit owner per node and an explicit destination for each promoted concept**, not one storage location per soul; one default write store is a common case, not an approved limit. Git promotions use PRs, public or private; proposal and acceptance differ.
425
-
426
- Why the workspace list matters even though souls do not need it: someone writing `newsletter-strategy-expert` and choosing which nodes it should read, and the onboarding expert presenting "these are LFX's knowledge repositories", both start from that list. Node ownership stays with souls, one owner per node, per the knowledge direction of 13 September.
427
-
428
- The reconciled proposal carries the same contract. Knowledge remains outside the
429
- soul; only declarations travel. Later reads and independent harvests need not
430
- consult the publisher's workspace or retain the source home. Mutable knowledge
431
- contents are not part of the software pin.
432
-
433
- _Walkthrough_
434
-
435
- ## Onboarding from one repository
436
-
437
- A new engineer joins the platform team. They have a laptop, GitHub access to the LFX repositories, and a clone of `lfx-v2-member-service` because that is the service they were handed. They ask the onboarding expert: "Set me up to work on the member service the LFX way."
438
-
439
- 1. **Read the backlink.**
440
- `lfx-v2-member-service/oats.yaml` names `github.com/linuxfoundation/lfx-workspace`. That is the only thing the local checkout contributes.
441
- 2. **Fetch the workspace definition.**
442
- Using the engineer's own GitHub token. Nothing is cloned; one small file is read at a recorded revision.
443
- 3. **Validate admission.**
444
- `lfx-v2-member-service` is in `members` and points back: eligible. Every other member is checked the same way. A name exposed by the readable allowlist can be marked inaccessible/unavailable without fetching protected descriptions; never distinguish hidden from nonexistent beyond what GitHub exposes.
445
- 4. **Read export indexes.**
446
- `lfx-v2-member-service` exports `member-service-expert` and `member-service-salesforce-expert`; `lfx-engineering-experts` exports `mcp-data-expert`, `org-dashboard-expert` and `individual-dashboard-expert`; `lfx-engineering-capabilities` advertises its packages. The engineer is shown qualified names and where each comes from.
447
- 5. **Resolve, then fetch only what is needed.**
448
- The engineer picks `member-service-expert` and `member-service-salesforce-expert`. Their requirements plus the workspace defaults resolve in one transaction into exact compositions: `lfx.local-review@main` at `4b7e02`, `lfx.service-dev@main`, `oats-okf@v2`, `oats-aweb@v1`, `oats-jira@v1`. Those packages are materialised; `lfx-knowledge` is cloned for the declared nodes. `lfx-self-serve` and the marketing repositories are never downloaded.
449
- 6. **Record the private context and wider choices.**
450
- With a bound, qualified messaging provider, preparation would reuse/create the engineer's private team. The engineer chooses `platform` for one instance; the other stays private-only. Until a named owner qualifies the provider, report choices and unqualified enrollment/privacy separately, not an existing private team.
451
- 7. **Report each readiness boundary separately.**
452
- Installed: yes. Executable trust: `oats-jira` has a spawn hook, so its artifact needs the engineer's approval. Bindings: Jira credentials missing, `needs configuration`. Teams: private context and `platform` choice recorded; enrollment/provider qualification pending. No unapproved resources execute and nothing claims unestablished readiness.
453
-
454
- After complete preparation, ordinary files retain artifacts, soul source, captured resolution and non-secret binding/team choices outside the home. CLI diagnostics are infrastructure work; Desktop follows these APIs later. The onboarding conversation need not survive. Failed preparation never publishes a selectable partial resolution.
455
-
456
- _Configuration_
457
-
458
- ## Precedence: two levels, no repository defaults
459
-
460
- The accepted contract replaces the original three-tier proposal. Capability policy has two authorities, one resolver. A standalone repository can be the explicit deployment scope, not a middle tier between workspace and soul.
461
-
462
- - **1. Workspace defaults** — Provider per fundamental layer, knowledge stores, team map, catalogs. Fill whatever the soul left open.
463
- - **2. The soul's own declarations** — Intrinsic capabilities with sources, knowledge store and nodes, team aliases, any hard requirement on a specific provider. Portable: travels with the soul.
464
- - **Explicit operator choice, bounded (not a third tier)** — On the workspace side (an import entry's adoption defaults, or a spawn-time choice). May rebind defaults and bindings; can never erase a hard requirement, and an attempt reports an incompatibility. Not a third tier: two authorities, one resolver.
465
-
466
- Two rules hold at every level: a hard requirement is never erased by a default, and an incompatible combination (two providers for one slot, a required provider the workspace forbids) fails loudly or reports `needs configuration`. Nothing is silently substituted.
467
-
468
- - **No agent-types/family entity.** Soul declarations and qualified per-soul adoption choices replace family policy in the target design; the baseline resolver is not claimed migrated.
469
- - **One explicit workspace context.** An imported soul's original organization never supplies another policy tier. Standalone preparation uses explicit bindings and reports missing ones.
470
- - **Repository briefing (`agents-md-injection`) and worktree setup stay**, selected from the repository actually worked on, not the imported source. Executable trust applies. Directory work targets need no fake Git or membership.
471
-
472
- _Versions_
473
-
474
- ## Updates without surprises
475
-
476
- People should not pick numbered versions as a routine. Machines still need exact revisions to reproduce behaviour and to retire or recover an instance safely. The reconciliation: humans choose a **channel** or a **pin**; preparation resolves it once into an **immutable composition**; the deployment keeps **several artifacts per capability** side by side.
477
-
478
- - **lfx.local-review / 4b7e02** — resolved from @main on 9 Sep · approved
479
- Selected by:
480
- - self-serve-expert-1 (started 10 Sep)
481
- - nightly review sweep (queued 13 Sep)
482
- - member-service-expert-1 (platform pinned for release)
483
- - **lfx.local-review / c91a4f** — resolved from @main on 14 Sep · approved today
484
- Selected by:
485
- - meeting-service-expert-2 (started today)
486
- - new compatible instances following that channel after explicit refresh and any required approval; pinned preparations keep their selected revision
487
-
488
- - **Explicit prepare/update** refreshes once per transaction. Show available-unapproved beside last-approved usable, never calling the latter "latest"; no daemon or unattended approval. **Existing instances and queued jobs** keep captured resolutions, not today's lock. Declarative skill changes get a bounded visible notice.
489
- - Inside **one** instance there is exactly one artifact per capability id. If a dependency closure needs two, both requirement paths are reported and preparation fails; no newest-wins rule, no general semver solver in the first version.
490
- - Artifacts referenced by a live instance, a rollback or a pending job are retained, including the code needed to retire an instance after its source has been deleted.
491
- - Offline use is shown as last-known, not as current. A failed refresh is visible.
492
- - The pin covers the OATS-managed composition: soul snapshot, capability closure, helpers, commands and hooks, non-secret configuration and binding provenance. It does not freeze knowledge contents, credentials, live team memberships, the work repository, external services or host tools.
493
-
494
- ### Automatic download is not automatic trust
495
-
496
- OATS already requires fresh approval when an executable artifact's integrity changes. "Executable" means the package declares **commands, hooks, or environment**. One hook is enough.
497
-
498
- | Package | Executable? | Following @main means |
499
- |---|---|---|
500
- | lfx.local-review (skills and instructions only) | No | New instances may use them after explicit prepare/update; visible change notice, no execution-approval prompt. |
501
- | oats.jira (no commands, but a spawn hook) | Yes | Every changed executable artifact needs fresh approval; unchanged artifact integrity keeps its approval despite unrelated source changes. |
502
- | oats.aweb (commands and hooks) | Yes | Same: approval per revision. |
503
-
504
- Any provider declaring commands, hooks or environment is gated at the changed artifact, including env-only providers. V1 has no unattended approval. Any future policy needs a separate decision; publisher continuity or "latest" never grants approval. Rolling software back also does not undo external writes or schema migrations, so two revisions sharing `lfx-knowledge` still need provider compatibility.
505
-
506
- _Access_
507
-
508
- ## Four permissions, not one
509
-
510
- GitHub supplies authentication and content authorization; the workspace supplies
511
- admission; the messaging provider owns membership and actual permissions. There
512
- is no second OATS user database or ACL engine.
513
-
514
- - **Catalog visibility:** accessible exported souls/packages, not live presence.
515
- - **Live-instance visibility:** which running incarnations may be discovered.
516
- - **Contact:** permission to address/message an instance.
517
- - **Conversation-history access:** permission to read earlier conversations, never
518
- inferred from contact or later wider-team membership.
519
-
520
- The intended private-first outcome is that repository access alone reveals neither
521
- private live instances nor their conversations. Widening one instance must not
522
- expose other private instances or earlier history. **No privacy guarantee until a
523
- named messaging owner qualifies provider behavior** in these separate dimensions,
524
- including ordinary members versus administrators controlling host/service.
525
- A recorded membership choice does not constitute qualification.
526
-
527
- A readable allowlist may reveal private repository names; protected descriptions
528
- must not be copied into broader indexes. Caches must not cross authorization
529
- contexts. Revocation cannot erase existing clones; offline metadata is last-known,
530
- not proof of current membership.
531
-
532
- _Modularity_
533
-
534
- ## Same pieces, eight arrangements
535
-
536
- The point of separating soul, workspace and deployment is that the same pieces compose into very different setups without any of them changing shape. Each card is an acceptance illustration for the target, not something a real deployment can run today. In all of them a soul may live in the project repository it works on, in a shared souls repository, or in a third party's repository; the arrangement never dictates where.
537
-
538
- **Solo engineer, one repo, no workspace**
539
-
540
- Clone `lfx-self-serve` alone and spawn `self-serve-expert` from its own `agents/` directory. The repository is the deployment.
541
-
542
- - Workspace: none reachable; standalone scope
543
- - Capabilities: from the soul's sources: lfx-engineering-capabilities and `repo:packages/self-serve-dev`
544
- - Knowledge: the store the soul names, if readable; else needs configuration
545
- - Teams: `messaging: any` supplies no software, credentials or team. Missing provider/human identity/standalone context key => needs configuration. Private-team claims additionally require named-owner provider qualification; no unnamed product default is assumed
546
-
547
- **The whole organisation**
548
-
549
- `lfx-workspace` admits thirty repositories; anyone starts from whichever one they hold.
550
-
551
- - Workspace: defaults, stores, teams, catalogs
552
- - Capabilities: souls' sources plus defaults
553
- - Knowledge: lfx-knowledge
554
- - Teams: private plus opt-in lfx, platform, self-serve, marketing
555
-
556
- **A team with its own capability repo**
557
-
558
- Marketing keeps `lfx-marketing-capabilities` without touching `lfx-engineering-capabilities`; its souls point there.
559
-
560
- - Workspace: admits the new repo; adds it as a catalog
561
- - Capabilities: `lfx.campaign-research` from the marketing repo
562
- - Knowledge: own nodes in lfx-knowledge, or a marketing store
563
- - Teams: private plus marketing
564
-
565
- **Project-local capability**
566
-
567
- `lfx-self-serve` could carry `packages/self-serve-dev` and reference `repo:packages/self-serve-dev` from its retained repository root.
568
-
569
- - Workspace: unchanged
570
- - Capabilities: one from lfx-engineering-capabilities, one from the same snapshot
571
- - Knowledge: unchanged
572
- - Teams: unchanged
573
-
574
- **Open-sourcing a soul**
575
-
576
- `mcp-data-expert` is published for the world. Another organisation prepares it with its own defaults and bindings.
577
-
578
- - Workspace: theirs, not LFX's; no backlink to either
579
- - Capabilities: from the soul's public sources
580
- - Knowledge: the public store the soul names for what it reads; their own store for the nodes it owns locally (syntax open)
581
- - Teams: their private teams and aliases
582
-
583
- **Two speeds in one workspace**
584
-
585
- Platform pins `lfx.local-review@v4.1.0` through a release; everyone else follows `@main`.
586
-
587
- - Workspace: unchanged
588
- - Capabilities: two lfx.local-review artifacts coexist; each instance holds one
589
- - Knowledge: shared, provider-compatible
590
- - Teams: unchanged
591
-
592
- **Swapping a layer**
593
-
594
- LFX moves tasks from Jira to GitHub Issues by changing one workspace default.
595
-
596
- - Workspace: `tasks: oats.github-issues`
597
- - Capabilities: souls saying `tasks: any` follow; a soul hard-requiring Jira keeps Jira or reports needs configuration
598
- - Knowledge: unchanged
599
- - Teams: unchanged
600
-
601
- **Two organisations on one laptop**
602
-
603
- Two explicit deployments side by side, with separate defaults and selected workspace contexts; provider isolation still requires qualification.
604
-
605
- - Workspace: two, each reciprocal with its own members
606
- - Capabilities: separate artifact stores and locks
607
- - Knowledge: separate stores
608
- - Teams: separate private teams per workspace
609
-
610
- _Payoff_
611
-
612
- ## What it unlocks
613
-
614
- **Commit the local souls**
615
-
616
- Local-only project definitions can become portable, committed exports once their sources and declarations no longer depend on one machine's layout.
617
-
618
- _Example:_ `member-service-expert` moves from `lfx-v2-member-service/local-agents/` to `lfx-v2-member-service/agents/`, in the same repository, names `lfx.local-review`'s source, and is listed in that repository's export index. Engineers with source access can discover and request preparation; launch still requires trust, credentials, configuration, store access and applicable enrollment readiness. No souls repository is needed for this.
619
-
620
- **Onboard from any one repository**
621
-
622
- LFX is reachable from whichever repository a person already has, with the access they already hold.
623
-
624
- _Example:_ A contractor with read access to `lfx-v2-meeting-service` and `lfx-engineering-capabilities` prepares `meeting-service-expert` from a fresh laptop. They never learn the marketing repositories exist as more than an inaccessible name.
625
-
626
- **Private by default — qualification target**
627
- Intended outcome after provider setup and qualification, not a current promise.
628
- _Example test:_ human A's `self-serve-expert-1` and `self-serve-ux-expert-2`
629
- coordinate privately; ordinary wider-team members must not discover them or read
630
- their private history without the corresponding grants.
631
-
632
- **Souls that actually travel**
633
-
634
- A soul published in one organisation runs in another, with the other's defaults and bindings.
635
-
636
- _Example:_ `mcp-data-expert` is open-sourced with a public `mcp-knowledge` store. A second company runs it reading that store, harvesting into its own store, on its own aweb teams, with GitHub Issues instead of Jira. Same soul, no copied config.
637
-
638
- **Forks stay out**
639
-
640
- A copied backlink is not admission. Membership needs both directions at recorded revisions.
641
-
642
- _Example:_ A personal fork of `lfx-engineering-experts` still says `workspace: linuxfoundation/lfx-workspace`. The workspace does not list the fork, so its souls are not LFX members and its packages are not catalogued.
643
-
644
- **Teams move at their own pace**
645
-
646
- Different instances hold different revisions of the same capability in the same deployment.
647
-
648
- _Example:_ Platform pins `lfx.local-review@v4.1.0` for a release while self-serve follows `@main`. Both artifacts coexist; nobody is forced to upgrade mid-release.
649
-
650
- **Nothing new to operate**
651
-
652
- Git hosting is the control plane; CI validates indexes if wanted. No registry server, no discovery daemon.
653
-
654
- _Example:_ Admitting `lfx-marketing-souls` is a PR to `lfx-workspace` adding one line to `members`, plus a backlink in the new repository. Branch protection is the review process.
655
-
656
- **Knowledge without a detour**
657
-
658
- A soul reads and grows its knowledge from its own declaration; the workspace is where you find out what stores exist.
659
-
660
- _Example:_ with explicit provider, store access and write destination bindings, a standalone `lfx-self-serve` checkout reads store-qualified `lfx-review-conventions` and harvests into a resolved `self-serve-service` destination without workspace access. Missing inputs remain needs configuration.
661
-
662
- **Honest readiness**
663
-
664
- Each boundary is reported on its own: installed, trusted, configured, enrolled.
665
-
666
- _Example:_ A prepared instance shows "needs configuration: Jira token", "approve: oats.jira a13d77" and "platform: enrolment pending" instead of launching and failing on first task.
667
-
668
- _Where it stands_
669
-
670
- ## Baseline, accepted target, open gates
671
-
672
- | Evidence boundary | What it establishes |
673
- |---|---|
674
- | Preexisting OATS package machinery | Git/local sources, package roots, closure/materialization, exact locks, integrity-bound trust and lifecycle composition; not the new two-authority resolver. |
675
- | Baseline `428cd9af` Portable Souls foundation | `lib/capability-artifacts.mjs` retains/verifies A and B side by side with typed refusals; storage-only. Installer still overwrites `installed/<id>`, launch hooks reload by ID, scheduled operations resolve at execution. |
676
- | Accepted infrastructure target, not completion | Source-complete declarations, reciprocal discovery, by-reference imports and retained sources, captured resolutions outside homes, preparation and consumer/store/lock/digest migration, honest CLI readiness. |
677
- | Provider and later UI gates | Private/wider choices are recordable, not privacy guarantees. Named messaging owner qualification is pending; Desktop features follow infrastructure later. |
678
-
679
- The [retention contract](2026-09-14-artifact-retention-contract.md) is binding. Before
680
- core imports retention, shared tree-copy/digest/publication mechanics move into a
681
- narrow leaf with no policy/lifecycle logic or back-import to core. Migration verifies
682
- existing artifacts and grades records `reconstructed`, `partial` or `unknown` with
683
- evidence. Overwritten historical revisions are not recovered by refetching moving
684
- sources. Preserve running sessions; partial/unknown never passes readiness.
685
-
686
- At consumer migration, the versioned digest covers file bytes, symlink targets and
687
- regular-file executable flags normalized from owner execute, `(mode & 0o100) !== 0`,
688
- for both Git and `path:`. Old digests remain verifiable without reinterpretation;
689
- group/other execute and other mode bits stay outside identity. Do not rewrite modes.
690
- Storage retention does not implement the digest bump or A/B lifecycle dispatch.
691
-
692
- Retain source artifacts, capability artifacts and resolutions conservatively while
693
- instances, jobs or supported recovery reference them. Dispatch/restart/retire/recovery
694
- uses the captured record after source/home deletion, never an ambient lock. Recurring
695
- schedules must state capture versus explicit future reprepare policy (capture remains
696
- proposed); already queued work never advances silently. No scheduler is activated
697
- by this documentation work.
698
-
699
- ### Remaining review gates
700
-
701
- - Parser/schema syntax for `repo:`, imports/adoption, requires/defaults, store-qualified
702
- reads/owns and exports; lock/resolution/digest wire versions and migration mechanics.
703
- Accepted semantics do not mean every YAML illustration parses.
704
- - Qualified repository identities and canonical remotes across renames/transfers;
705
- source moves need explicit provenance, never filename matching.
706
- - Named messaging owner and qualification of private human/context identity, live
707
- discovery, inbound contact, history and administrator limitations. Standalone
708
- context keys and messaging-disabled workers remain explicit cases.
709
- - Zero or one default provider per slot is a **v1 product simplification**, not a
710
- capability limit. Simultaneous Jira + GitHub is an unsolved design test; do not
711
- assume named bindings or build a generalized multi-provider solver.
712
-
713
- Lead amendments are fully incorporated and preserved in a public design appendix.
714
- Infrastructure implementation is now human-authorized; Desktop is later and held
715
- capture patch `54b07ee` stays excluded.
716
-
717
- _Falsification_
718
-
719
- ## How we would know it works
720
-
721
- Accepted design and amendment scenarios, kept as tests rather than promises. Any failure prevents the corresponding acceptance claim; provider/live gates are not proven by docs or storage fixtures.
722
-
723
- - A fresh operator prepares `self-serve-expert` without the author's private workspace config.
724
- - Two operators with different local layouts discover the same accessible LFX definitions.
725
- - Uncloned repositories are discoverable without installing their code.
726
- - Forked or unadmitted repositories do not become LFX members.
727
- - Inaccessible or stale indexes neither leak protected descriptions nor imply readiness.
728
- - Same-repository packages work portably; external local paths are clearly marked nonportable.
729
- - Multiple revisions of `lfx.local-review` coexist while each instance has one unambiguous composition.
730
- - An update cannot replace a running instance's or a pending job's artifacts.
731
- - Conflicting dependencies and missing bindings/approval fail before unsafe execution; source conflicts report both origins, including env-only executable surfaces.
732
- - A soul reads and harvests store-qualified nodes with an explicit destination without workspace access; a replacement provider is not forced into OKF's node schema.
733
- - A named messaging owner qualifies two humans' private/wider visibility, contact and history independently, without claiming isolation from administrators controlling host/service.
734
- - Real multi-team membership, useful outputs and recovery work end to end, not just scaffolds.
735
-
736
- ### Lead's three scenarios, adopted
737
-
738
- 1. Import the same public soul unchanged into LFX and into a standalone deployment with no Git work target. It reads its public knowledge, binds an explicit adopter write destination, and prepares without consulting its publisher's workspace configuration. Source identity and exact retained revision are verified.
739
- 2. Two humans on two hosts each in one workspace. Each person's private team is reused across their hosts; a spawned child or scheduled instance stays inside it; one representative is widened and narrowed without changing its global identity; discovery, inbound contact and historical conversation access are verified separately.
740
- 3. An existing instance and an independent queued job stay on revision A; a new instance is prepared on approved revision B; the original source is removed; A still executes its managed lifecycle and recovery resources. No ambient shared "latest" lookup may substitute B.
741
-
742
- ---
743
-
744
- _Sources: [accepted proposal](2026-09-14-portable-souls-and-git-workspaces.md),
745
- [public amendment](2026-09-14-portable-souls-contract-amendments.md),
746
- [binding handoff](2026-09-15-portable-souls-handoff.md),
747
- [retention contract](2026-09-14-artifact-retention-contract.md) and
748
- [implementation ledger](2026-09-15-portable-souls-implementation.md).
749
- All LFX examples are hypothetical; all new YAML nesting needs parser review.
750
- No ignored instance file is needed to interpret this design._