@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.
- package/README.md +12 -6
- package/bin/oats.mjs +194 -50
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +6 -11
- package/docs/configuration.md +213 -64
- package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
- package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
- package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
- package/docs/design/2026-09-27-team-model-v2.md +97 -117
- package/docs/design/2026-09-28-automations-trust.md +38 -0
- package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
- package/docs/design/HISTORY.md +65 -0
- package/docs/design/README.md +23 -54
- package/docs/desktop-cli-api.md +1787 -1777
- package/docs/desktop.md +30 -91
- package/docs/execution-targets.md +146 -292
- package/docs/first-team.md +31 -17
- package/docs/implementation.md +77 -288
- package/docs/integrations.md +118 -320
- package/docs/knowledge-capability-authoring.md +25 -52
- package/docs/knowledge-reference/acceptance.md +3 -3
- package/docs/knowledge-reference/adoption.md +1 -1
- package/docs/knowledge-reference/harvester.md +2 -2
- package/docs/knowledge-reference/package-craft.md +3 -3
- package/docs/knowledge-reference/provider-mapping.md +3 -6
- package/docs/knowledge-reference/reader-capture.md +3 -3
- package/docs/knowledge-theory.md +62 -166
- package/docs/knowledge.md +225 -404
- package/docs/layers.md +42 -97
- package/docs/oats-local.schema.json +58 -5
- package/docs/oats-membership.schema.json +1 -8
- package/docs/oats-package.schema.json +5 -5
- package/docs/oats-workspace.schema.json +8 -22
- package/docs/official-catalog.md +25 -28
- package/docs/packages.md +45 -63
- package/docs/plans/0.30-close-out.md +83 -0
- package/docs/release-lane.md +82 -0
- package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
- package/docs/release-notes/v0.19.0.md +48 -147
- package/docs/release-notes/v0.19.1.md +2 -3
- package/docs/release-notes/v0.19.3.md +2 -15
- package/docs/release-notes/v0.20.0.md +0 -15
- package/docs/release-notes/v0.22.0.md +71 -138
- package/docs/release-notes/v0.22.1.md +42 -90
- package/docs/release-notes/v0.22.10.md +1 -1
- package/docs/release-notes/v0.22.11.md +1 -47
- package/docs/release-notes/v0.22.12.md +4 -13
- package/docs/release-notes/v0.22.13.md +1 -42
- package/docs/release-notes/v0.22.14.md +3 -11
- package/docs/release-notes/v0.22.15.md +1 -46
- package/docs/release-notes/v0.22.16.md +6 -8
- package/docs/release-notes/v0.22.18.md +1 -99
- package/docs/release-notes/v0.22.19.md +3 -14
- package/docs/release-notes/v0.22.2.md +6 -15
- package/docs/release-notes/v0.22.3.md +0 -1
- package/docs/release-notes/v0.22.4.md +1 -14
- package/docs/release-notes/v0.22.5.md +2 -12
- package/docs/release-notes/v0.22.6.md +0 -3
- package/docs/release-notes/v0.23.0.md +9 -25
- package/docs/release-notes/v0.23.1.md +9 -25
- package/docs/release-notes/v0.23.2.md +2 -4
- package/docs/release-notes/v0.24.0.md +56 -97
- package/docs/release-notes/v0.24.1.md +7 -11
- package/docs/release-notes/v0.24.10.md +34 -45
- package/docs/release-notes/v0.24.11.md +12 -20
- package/docs/release-notes/v0.24.12.md +35 -48
- package/docs/release-notes/v0.24.13.md +34 -41
- package/docs/release-notes/v0.24.2.md +9 -13
- package/docs/release-notes/v0.24.3.md +7 -11
- package/docs/release-notes/v0.24.4.md +6 -6
- package/docs/release-notes/v0.24.5.md +6 -10
- package/docs/release-notes/v0.24.6.md +2 -5
- package/docs/release-notes/v0.24.7.md +46 -75
- package/docs/release-notes/v0.24.8.md +58 -96
- package/docs/release-notes/v0.24.9.md +38 -54
- package/docs/release-notes/v0.25.0.md +59 -76
- package/docs/release-notes/v0.25.1.md +57 -81
- package/docs/release-notes/v0.25.2.md +51 -70
- package/docs/release-notes/v0.25.3.md +11 -13
- package/docs/release-notes/v0.25.4.md +9 -13
- package/docs/release-notes/v0.25.5.md +3 -5
- package/docs/release-notes/v0.25.6.md +20 -29
- package/docs/release-notes/v0.25.7.md +5 -7
- package/docs/release-notes/v0.25.8.md +26 -39
- package/docs/release-notes/v0.26.0.md +175 -646
- package/docs/release-notes/v0.27.0.md +4 -5
- package/docs/release-notes/v0.27.1.md +4 -6
- package/docs/release-notes/v0.27.2.md +1 -1
- package/docs/release-notes/v0.28.0.md +57 -124
- package/docs/release-notes/v0.29.0.md +89 -208
- package/docs/release-notes/v0.29.1.md +1 -1
- package/docs/release-notes/v0.29.2.md +3 -4
- package/docs/release-notes/v0.30.0.md +205 -0
- package/docs/release-notes/v0.30.1.md +123 -0
- package/docs/schedules.md +280 -363
- package/docs/servers.md +99 -117
- package/docs/soul.schema.json +2 -9
- package/docs/souls-and-instances.md +145 -158
- package/docs/workspaces.md +137 -215
- package/lib/automations.mjs +21 -6
- package/lib/core.mjs +226 -74
- package/lib/instance-events.mjs +1 -1
- package/lib/instance-inspect.mjs +109 -34
- package/lib/instance-lifecycle.mjs +14 -1
- package/lib/instance-resolution.mjs +26 -27
- package/lib/launch-preference.mjs +87 -0
- package/lib/materialize.mjs +3 -3
- package/lib/packages.mjs +1 -1
- package/lib/resolve.mjs +30 -88
- package/lib/schedule.mjs +1 -1
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +2 -2
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +10 -16
- package/package.json +1 -3
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-authoring/LICENSE +0 -21
- package/capabilities/oats-authoring/oats-package.json +0 -11
- package/capabilities/oats-authoring/oats.json +0 -12
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +0 -84
- package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +0 -109
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +0 -116
- package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +0 -11
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +0 -1338
- package/capabilities/oats-aweb/injects/aweb.md +0 -47
- package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -356
- package/capabilities/oats-aweb/lib/captured-execution.mjs +0 -91
- package/capabilities/oats-aweb/lib/captured-native.mjs +0 -91
- package/capabilities/oats-aweb/lib/grant-custody.mjs +0 -38
- package/capabilities/oats-aweb/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-aweb/lib/portable-binding.mjs +0 -146
- package/capabilities/oats-aweb/lib/session-readiness.mjs +0 -56
- package/capabilities/oats-aweb/lib/wake-receive.mjs +0 -56
- package/capabilities/oats-aweb/oats.json +0 -208
- package/capabilities/oats-aweb/skills/LICENSE +0 -21
- package/capabilities/oats-aweb/skills/VENDORED.md +0 -31
- package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +0 -201
- package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +0 -161
- package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +0 -61
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +0 -116
- package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +0 -74
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +0 -216
- package/capabilities/oats-jira/bin/oats-jira.mjs +0 -40
- package/capabilities/oats-jira/injects/jira.md +0 -10
- package/capabilities/oats-jira/oats.json +0 -22
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +0 -179
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +0 -34
- package/capabilities/oats-linear/bin/oats-linear.mjs +0 -344
- package/capabilities/oats-linear/injects/linear.md +0 -8
- package/capabilities/oats-linear/oats.json +0 -24
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +0 -223
- package/capabilities/oats-okf/bin/oats-okf-binding.mjs +0 -14
- package/capabilities/oats-okf/bin/oats-okf.mjs +0 -209
- package/capabilities/oats-okf/injects/okf.md +0 -42
- package/capabilities/oats-okf/lib/binding-wire.mjs +0 -348
- package/capabilities/oats-okf/lib/captured-worker.mjs +0 -109
- package/capabilities/oats-okf/lib/config.mjs +0 -124
- package/capabilities/oats-okf/lib/consult.mjs +0 -518
- package/capabilities/oats-okf/lib/harvest-status.mjs +0 -88
- package/capabilities/oats-okf/lib/harvest-switch.mjs +0 -94
- package/capabilities/oats-okf/lib/inspection.mjs +0 -119
- package/capabilities/oats-okf/lib/invocation-context.mjs +0 -111
- package/capabilities/oats-okf/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-okf/lib/io.mjs +0 -118
- package/capabilities/oats-okf/lib/migration.mjs +0 -137
- package/capabilities/oats-okf/lib/okf-validate.mjs +0 -123
- package/capabilities/oats-okf/lib/portable-binding.mjs +0 -199
- package/capabilities/oats-okf/lib/source-contract.mjs +0 -46
- package/capabilities/oats-okf/lib/sources.mjs +0 -424
- package/capabilities/oats-okf/lib/stores.mjs +0 -473
- package/capabilities/oats-okf/lib/worker.mjs +0 -497
- package/capabilities/oats-okf/oats.json +0 -148
- package/capabilities/oats-okf/schemas/okf-base.schema.json +0 -46
- package/capabilities/oats-okf/schemas/okf-bindings.schema.json +0 -112
- package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +0 -87
- package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +0 -113
- package/capabilities/oats-okf/schemas/okf-soul.schema.json +0 -37
- package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +0 -144
- package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +0 -86
- package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +0 -104
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +0 -140
- package/capabilities/oats-okf-harvest/injects/harvester.md +0 -12
- package/capabilities/oats-okf-harvest/oats.json +0 -26
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +0 -168
- package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-harvest/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-harvest/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +0 -170
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +0 -12
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +0 -50
- package/capabilities/oats-okf-maintenance/oats.json +0 -21
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +0 -159
- package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +0 -146
- package/capabilities/oats-review/injects/review.md +0 -69
- package/capabilities/oats-review/oats.json +0 -10
- package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
- package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
- package/docs/conventions.md +0 -90
- package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
- package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
- package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
- package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
- package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
- package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
- package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
- package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
- package/docs/design/2026-09-15-captured-dispatch.md +0 -127
- package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
- package/docs/design/2026-09-15-package-preparation.md +0 -100
- package/docs/design/2026-09-15-portable-data-contract.md +0 -121
- package/docs/design/2026-09-15-portable-declarations.md +0 -189
- package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
- package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
- package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
- package/docs/design/2026-09-15-source-observation.md +0 -119
- package/docs/design/2026-09-16-captured-admission.md +0 -77
- package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
- package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
- package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
- package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
- package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
- package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
- package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
- package/docs/design/2026-09-16-portable-onboarding.md +0 -179
- package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
- package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
- package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
- package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
- package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
- package/docs/design/2026-09-17-captured-native-start.md +0 -58
- package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
- package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
- package/docs/design/2026-09-17-public-captured-start.md +0 -108
- package/docs/design/2026-09-17-public-prepare-request.md +0 -90
- package/docs/design/2026-09-18-captured-pi-host.md +0 -205
- package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
- package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
- package/docs/design/2026-09-20-redesign-program-board.md +0 -142
- package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
- package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
- package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
- package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
- package/docs/design/2026-09-24-phase-d-plan.md +0 -305
- package/docs/design/2026-09-25-teams-contract.md +0 -258
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
- package/docs/design/desktop-ux-plan.md +0 -362
- package/docs/design/launch-configurations.md +0 -168
- package/docs/design/okf-mirror-provenance.md +0 -105
- package/docs/design/operations-contract.md +0 -141
- package/docs/oats-member.schema.json +0 -38
- package/skills/integration-authoring/SKILL.md +0 -84
- package/skills/oats-support/SKILL.md +0 -79
- package/skills/skill-craft/SKILL.md +0 -109
- package/skills/soul-craft/SKILL.md +0 -116
|
@@ -1,136 +1,116 @@
|
|
|
1
|
-
# Team model v2:
|
|
1
|
+
# Team model v2: shared and local teams, the default team, and membership per deployment
|
|
2
2
|
|
|
3
|
-
Status
|
|
3
|
+
**Status:** decided and implemented (kernel 0.30.0, feature `team-model-2`). This record decides where teams, the default team and team membership live, how the kernel resolves them, and what the kernel hands a messaging provider. The reference pages ([workspaces.md](../workspaces.md#teams), [capabilities.md](../capabilities.md#teams-in-the-provider-environment), [desktop-cli-api.md](../desktop-cli-api.md#team-model-v2-feature-team-model-2-oats-0300-replaces-feature-teams)) win on operator-visible behaviour.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Why
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
>
|
|
9
|
-
> "we do not need aweb primitives for this, we already have teams. we need to be able to add and remove souls to teams."
|
|
10
|
-
>
|
|
11
|
-
> "only pepe and i are using this for now, just clean up and do the right thing. no backwards comp required. setup may require creating accounts and teams, we need to support onboarding."
|
|
7
|
+
Team membership is **local to each deployment**, over shared repositories and souls. Two people running the same souls from the same repositories have different sets of teams: some are shared (both map the label to the same provider team), some are personal, and each has their own default. Membership therefore never lives in a committed file, and every soul, member or package, is treated the same.
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
What is shared is a fact, not a choice: a shared team's provider id is the same for everyone. That fact is committed once; everything personal is local.
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
2. **The default team is not the workspace's.** After amendment K it's the provider setting `team`, else the provider's own default. For oats.aweb that's the messaging root's active team: host state, invisible in config.
|
|
17
|
-
3. **"Primary"** (the first of a soul's `team:` labels) sets `OATS_TEAM_LABEL` and ordering but isn't the default team.
|
|
18
|
-
4. **`oats-membership.yaml` `team`** is a repository-level default label layered under the soul's.
|
|
11
|
+
## The model (option B)
|
|
19
12
|
|
|
20
|
-
|
|
13
|
+
The chosen model is **option B: shared facts committed, personal choices local**. The committed `oats-workspace.yaml` `teams:` declares the shared teams with their provider ids; each deployment's `oats-local.yaml` declares its local teams, its default team and all membership.
|
|
21
14
|
|
|
22
|
-
|
|
15
|
+
### Where it lives
|
|
16
|
+
|
|
17
|
+
Committed `oats-workspace.yaml` (shared teams only; edited by PR):
|
|
23
18
|
|
|
24
|
-
### The workspace (`oats-workspace.yaml`)
|
|
25
19
|
```yaml
|
|
26
20
|
teams:
|
|
27
|
-
|
|
28
|
-
platform: { description: … }
|
|
29
|
-
defaultTeam: dev # NEW: required when `teams` is non-empty; a declared label
|
|
30
|
-
messaging:
|
|
31
|
-
oats.aweb: { from: package }
|
|
32
|
-
byTeam:
|
|
33
|
-
dev: { team: <provider team id> }
|
|
34
|
-
platform: { team: <provider team id> }
|
|
21
|
+
oats: { team: oats:example.aweb.ai } # a shared team: the same provider id for everyone
|
|
35
22
|
```
|
|
36
|
-
- **`teams:`** declares the teams that exist (labels), as today.
|
|
37
|
-
- **`defaultTeam:`** is the team a soul's instances go to by default. It's a label, never a provider id.
|
|
38
|
-
- **`messaging.byTeam.<label>`** maps each label to its provider team, as today. It's the ONLY place a provider team id is written.
|
|
39
|
-
- **Validation:** `defaultTeam` must be a declared label (`E_TEAM_UNKNOWN`). Once messaging is active, the default team's label must be mapped (`E_TEAM_UNMAPPED`, a refusal, not a warning: an instance must have somewhere to live).
|
|
40
23
|
|
|
41
|
-
|
|
24
|
+
Local `oats-local.yaml` (the deployment's per-machine file, never committed):
|
|
25
|
+
|
|
42
26
|
```yaml
|
|
43
|
-
teams:
|
|
44
|
-
|
|
27
|
+
teams:
|
|
28
|
+
antares-oats: { team: antares-oats:ana.aweb.ai } # a local (personal) team: label → provider id
|
|
29
|
+
defaultTeam: antares-oats
|
|
30
|
+
souls:
|
|
31
|
+
disabled: [...]
|
|
32
|
+
teams: # the extra teams each soul's instances MAY join here
|
|
33
|
+
"*": [oats] # every soul
|
|
34
|
+
oats-expert: [oats] # one soul: its bare name, or <package>/<soul> for a package soul
|
|
35
|
+
default: # an optional per-soul override of defaultTeam
|
|
36
|
+
oats-expert: oats
|
|
45
37
|
```
|
|
46
|
-
|
|
47
|
-
- **`
|
|
48
|
-
- **
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
-
|
|
38
|
+
|
|
39
|
+
- **`teams.<label>`** is `{ team?, description? }` in the committed file and `{ team, description? }` locally. These are the only places a provider team id is written. A shared team without `team` is declared but not yet created: readiness `team-unmapped`, a failure when it is the default, a warning otherwise.
|
|
40
|
+
- **A label in both files** is `team-label-collision`, a readiness warning and never a spawn refusal: the shared definition wins, and the fix is renaming the local label. A teammate's PR adding a shared team never breaks another deployment on sync.
|
|
41
|
+
- **`defaultTeam`** is the team every instance of this deployment lives in: its default-team identity. It names a label from either file. `oats teams add` of the first team sets it.
|
|
42
|
+
- **`souls.teams`** lists the teams a soul's instances are eligible to join here: `"*"` for every soul, and a soul's own entry adds to it. Eligible teams are offered, never auto-joined.
|
|
43
|
+
- **`souls.default`** overrides `defaultTeam` for one soul; it must be one of that soul's teams (`E_TEAM_NOT_ELIGIBLE`).
|
|
44
|
+
- **An undeclared label** anywhere is `E_TEAM_UNKNOWN`: a spawn, preview or `inspect --soul` refusal, and a readiness item.
|
|
45
|
+
- **Messaging active and no default** is `E_TEAM_UNCONFIGURED` (a readiness failure). There is no guessed team and no fallback to a provider's own active team.
|
|
46
|
+
- **A label never gates, restricts, changes trust or partitions the knowledge store.**
|
|
47
|
+
|
|
48
|
+
### Not part of the model
|
|
49
|
+
|
|
50
|
+
These keys are refused with `E_WORKSPACE_SCHEMA` (reason `removed-key`), naming the replacement; there are no aliases:
|
|
51
|
+
|
|
52
|
+
- `oats-workspace.yaml` `messaging.byTeam` (the id is `teams.<label>.team`) and `defaults.byTeam` (capabilities compose from the committed workspace and the soul only, so composition is the same for everyone);
|
|
53
|
+
- `soul.yaml` `team:` and `oats-membership.yaml` `team`;
|
|
54
|
+
- the "primary" label;
|
|
55
|
+
- the messaging provider's own `team` setting, at every layer.
|
|
56
|
+
|
|
57
|
+
### Resolution
|
|
58
|
+
|
|
59
|
+
- `defaultOf(soul) = souls.default[soul] ?? defaultTeam`.
|
|
60
|
+
- `teamsOf(soul) = {defaultOf(soul)} ∪ souls.teams["*"] ∪ souls.teams[soul]`, each label resolved through `teams.<label>`. The deployment default is among a soul's teams only when it is that soul's default or the soul lists it.
|
|
61
|
+
- A soul's teams are rows `{label, team, default, from: "shared"|"local"}`, the default first, then by label; its default is `{label, team, from: "deployment"|"soul"}`. The spawn preview, `inspect --soul`, `oats souls` and readiness report them; `instance.json` records them at spawn.
|
|
62
|
+
- **Changing `defaultTeam`** does not move running instances (their default-team identity is fixed): readiness `--home` warns `default-team-changed` until respawn.
|
|
64
63
|
|
|
65
64
|
### At spawn, and live
|
|
66
|
-
- An instance is **always in its effective default team** (it can't leave it: `E_TEAM_DEFAULT`).
|
|
67
|
-
- It joins other eligible teams explicitly: the spawn choice `join=…`, or the provider's join/leave on a live instance. This is unchanged from the teams contract.
|
|
68
|
-
- **When a soul loses a label**, or the workspace unmaps it, a joined instance leaves it on the next live read. This is unchanged: teams contract §7 decision 6.
|
|
69
|
-
- **When the effective default changes** (the workspace or soul `defaultTeam` edited), running instances keep their team until respawn. Readiness warns (`default-team-changed`) and names the new default.
|
|
70
65
|
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
- **At spawn an instance joins its default team only.** Every other eligible team is offered: the spawn's `join=<labels>` provider setting (a trigger's `spawn.teams` becomes it), and checkboxes in the Desktop spawn dialog. Each joined team gets its own identity.
|
|
67
|
+
- **Later**, the provider's per-instance join and leave verbs opt one instance in or out of an eligible team. The default team is the instance's identity and is not left.
|
|
68
|
+
- **Live rule:** a joined team that is no longer eligible (removed from the soul's list, or the team removed) is left on the next live read. A newly eligible team is offered, never auto-joined. Nothing else is undone.
|
|
69
|
+
|
|
70
|
+
### Verbs
|
|
71
|
+
|
|
72
|
+
The kernel verbs edit `oats-local.yaml` in place; they never call a provider, clone, or open a PR.
|
|
73
|
+
|
|
73
74
|
```
|
|
74
|
-
oats
|
|
75
|
-
oats
|
|
76
|
-
oats
|
|
75
|
+
oats teams [--json] # this deployment's teams, ids, the default, problems
|
|
76
|
+
oats teams add <label> --team <id> [--description d] # declare a local team
|
|
77
|
+
oats teams remove <label> # a local team nothing references
|
|
78
|
+
oats teams default <label>
|
|
79
|
+
oats soul teams <soul>|'*' [--add a,b] [--remove a,b] [--default <label> | --clear-default]
|
|
77
80
|
```
|
|
78
|
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
3. **Package souls:** is a workspace-side `teams.<label>.souls: [...]` the right way to add a package soul to a team? The alternative is that package souls have only their package's teams.
|
|
115
|
-
|
|
116
|
-
## Sequencing (proposed)
|
|
117
|
-
1. **Now, small (the messaging lane):** an oats.aweb release with the setup `--new-account` fix + the dead `helperInjection` key.
|
|
118
|
-
2. **This design:** the co-lead shapes it → the human answers 1–3 → **Decided**.
|
|
119
|
-
3. **Kernel 0.30.0 (breaking):**
|
|
120
|
-
- the schemas;
|
|
121
|
-
- resolution + env;
|
|
122
|
-
- the `oats soul teams` verb;
|
|
123
|
-
- readiness;
|
|
124
|
-
- the oats.setup skills;
|
|
125
|
-
- docs.
|
|
126
|
-
4. **oats.aweb 1.17:** the default from the kernel (no root-active fallback); `oats aweb setup` onboarding.
|
|
127
|
-
5. **Desktop:**
|
|
128
|
-
- the server passes the new fields (the engineer);
|
|
129
|
-
- the soul-page team controls + the spawn dialog (the ux-designer).
|
|
130
|
-
6. **The KB + migration** of the two existing deployments (one-shot, by the humans with the setup-admin soul).
|
|
131
|
-
|
|
132
|
-
**Owners (proposed):**
|
|
133
|
-
- the kernel: a cli-dev;
|
|
134
|
-
- oats.aweb + onboarding: the messaging co-lead's developer;
|
|
135
|
-
- the Desktop: the engineer + the ux-designer;
|
|
136
|
-
- this doc, the review and the release: the lead.
|
|
81
|
+
|
|
82
|
+
- `oats teams add` of a label already declared in either file is `E_TEAM_EXISTS`.
|
|
83
|
+
- `oats teams remove` of a label still referenced (`defaultTeam`, `souls.teams`, `souls.default`) is `E_TEAM_IN_USE`, naming every reference; there is no cascade. A shared label is not removable here (`E_TEAM_SHARED`: it is edited by PR).
|
|
84
|
+
- `oats soul teams` with an unknown label is `E_TEAM_UNKNOWN`; a `--default` outside the soul's teams after the write is `E_TEAM_NOT_ELIGIBLE`; `--default` with `'*'` is `E_BAD_ARGS`.
|
|
85
|
+
- The Desktop offers the same controls, labelled "on this computer": the deployment's teams and default, and a soul's teams here.
|
|
86
|
+
|
|
87
|
+
### Onboarding
|
|
88
|
+
|
|
89
|
+
Setup is the messaging provider's act, run by a human at setup time, never at spawn, mint, retire or wake. OATS holds no human login. The provider's setup is expected to:
|
|
90
|
+
|
|
91
|
+
- create the account and the first team when none exists, and record it locally with `oats teams add` (which makes it the default);
|
|
92
|
+
- create a new **local** team at the provider, then record it with `oats teams add <label> --team <id>`. A local team is never declared without an existing id;
|
|
93
|
+
- for a **shared** team declared without an id, let its owner create it and print the exact line to commit (`teams: { <label>: { team: <id> } }`), by PR; setup never edits the committed file;
|
|
94
|
+
- join an **existing shared** team through its owner's invite;
|
|
95
|
+
- normalize a label to the provider's team-name rules rather than passing it raw; the local mapping, not the name, is the truth.
|
|
96
|
+
|
|
97
|
+
## The kernel ↔ provider contract
|
|
98
|
+
|
|
99
|
+
**Environment** (every provider context: lifecycle hooks, home commands, operations and readiness checks). Teams travel beside a provider's settings, never inside them.
|
|
100
|
+
|
|
101
|
+
- `OATS_DEFAULT_TEAM`: the soul's default label. `OATS_DEFAULT_TEAM_ID`: its provider id. `OATS_DEFAULT_TEAM_FROM`: `deployment` (`defaultTeam`) or `soul` (`souls.default`).
|
|
102
|
+
- No default configured: none of the three is set. An unmapped default: `OATS_DEFAULT_TEAM` and `OATS_DEFAULT_TEAM_FROM` are set, `OATS_DEFAULT_TEAM_ID` is not.
|
|
103
|
+
- `OATS_TEAMS`: JSON `[{label, team, default, from: "shared"|"local"}]`, every **mapped** team the soul may be in here, the default included (`default: true`), default first, then by label. Eligible to join = the rows with `default: false`. Unset when a home's teams are unknown (none recorded and unreadable now).
|
|
104
|
+
- `OATS_TEAMS_SOURCE`: `live` (the workspace and `oats-local.yaml` read now, or a fresh resolution) or `recorded` (the spawn-time record in `instance.json`). **A provider leaves a joined team only on a `live` list**: a recorded list lacks every change since the spawn.
|
|
105
|
+
- Live reads happen where teams are acted on: a home's launch hook (`oats session start|restart`), its messaging module's commands and operations, `oats inspect --home` and `oats readiness --home`. Every other context gets the recorded teams. A scheduled wake's session start uses the recorded teams, so it leaves nothing.
|
|
106
|
+
- The pre-0.30 names `OATS_TEAM_LABEL`, `OATS_TEAM_LABELS` and `OATS_TEAM_ID` are always unset.
|
|
107
|
+
|
|
108
|
+
**What the messaging provider does with it:**
|
|
109
|
+
|
|
110
|
+
- mint an instance's default-team identity from `OATS_DEFAULT_TEAM_ID`, and join the other eligible teams only when asked (`join=` at spawn, or its per-instance verbs);
|
|
111
|
+
- refuse the spawn, naming the problem, when no default is configured or the default is unmapped;
|
|
112
|
+
- keep one identity root per team and mint each identity from that team's root, never from whatever team a root happens to have active; report a declared team with no member root as its own readiness problem;
|
|
113
|
+
- make a leave caused by a live read visible: a warning in the hook or command output, a `left: [{label, team, at, reason: "no-longer-eligible"}]` list (the last 20) in its teams document, and the instance's events (`oats instance events`). There is no acknowledge state, and readiness does not nag;
|
|
114
|
+
- report its teams document with `defaultTeam` in exactly the kernel's shape, `{label, team, from}`.
|
|
115
|
+
|
|
116
|
+
**Kernel verbs are config only.** `oats teams add | remove | default` write `oats-local.yaml` `teams` and `defaultTeam`; `oats soul teams` writes `souls.teams` and `souls.default`. A provider's setup records what it created by calling `oats teams add` and `oats teams default` through `OATS_CLI_BIN`. Joining a shared team's membership is a provider act; there is no kernel `oats teams join`.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Hosts opt in to workspace automations (`automations.trust`)
|
|
2
|
+
|
|
3
|
+
Status: **DECIDED 2026-09-28 by Juan** (the automation trust decision, recommended by the leads on
|
|
4
|
+
2026-09-27). Target: OATS 0.30.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
A workspace trigger or schedule runs on the host whose `host.name` is its `runsOn` and whose `gh`
|
|
8
|
+
account is its `owner` (docs/schedules.md "Who runs it"). Both facts can come from a commit. So
|
|
9
|
+
anyone who can commit to a member repo can make a machine that matches those names run an
|
|
10
|
+
automation. Its operator never said yes to that automation, only to a host name and a login.
|
|
11
|
+
|
|
12
|
+
## Decision
|
|
13
|
+
**A host runs a workspace automation only when its operator has trusted it**, in the local file:
|
|
14
|
+
```yaml
|
|
15
|
+
# oats-local.yaml (never in oats-workspace.yaml or a member file: the committed schemas refuse it)
|
|
16
|
+
automations:
|
|
17
|
+
trust:
|
|
18
|
+
- oats-knowledge/okf-review # <member>/<id>, as the automations list names it
|
|
19
|
+
# or: trust: "*" # every automation the workspace places on this host
|
|
20
|
+
```
|
|
21
|
+
- **Runs only if** `runsOn` matches, `owner` matches, **and** `trust` admits it. `triggers.disabled` /
|
|
22
|
+
`schedules.disabled` still opt out on top.
|
|
23
|
+
- **Absent or empty `trust`:** nothing runs.
|
|
24
|
+
- **Matching but untrusted:** it never runs. It's listed with reason `untrusted` (after
|
|
25
|
+
`assigned-elsewhere`, `owner-mismatch` and `host-unnamed`). A readiness/status item says
|
|
26
|
+
"declared for this host, not trusted here", and its remedy names the exact `oats-local.yaml`
|
|
27
|
+
line to add. The automations status row carries the reason, so the Desktop can show it.
|
|
28
|
+
- **A trust entry that matches nothing** is a warning, not an error: a member may not have
|
|
29
|
+
synced yet.
|
|
30
|
+
- **Personal automations** (`oats trigger add` / `schedule add` in `oats-local.yaml`) are already
|
|
31
|
+
the operator's own choice and need no trust entry.
|
|
32
|
+
|
|
33
|
+
## Behaviour change
|
|
34
|
+
Hosts that ran workspace automations before 0.30 must add their `trust` lines. The 0.30 release
|
|
35
|
+
notes say so. No host of ours runs one today, so there's nothing to migrate.
|
|
36
|
+
|
|
37
|
+
## Unblocks
|
|
38
|
+
The okf review trigger on Juan's host: it runs once his host trusts it.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Soul launch preferences: a harness and model per soul, overridable per machine
|
|
2
|
+
|
|
3
|
+
Status: **DECIDED 2026-09-28 by the human (Pepe)**: "per soul preference, but also allow the local
|
|
4
|
+
overrides". Target: OATS 0.30.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
Workspace-model v2 (0.25.0) removed `runtime`/`model` from `soul.yaml`, and 0.26.0 made a launch
|
|
8
|
+
configuration "a spawn-time host choice, never a soul field", for portability (not every machine has
|
|
9
|
+
every harness or model). The cost: there is no way to say "this role runs on Claude Code with Opus
|
|
10
|
+
5.5" without passing `--launch-config` on every spawn, and the Desktop's soul pages show "No default
|
|
11
|
+
harness" for every soul.
|
|
12
|
+
|
|
13
|
+
## Decision
|
|
14
|
+
1. **A soul may declare a launch preference** in `soul.yaml`:
|
|
15
|
+
```yaml
|
|
16
|
+
launch: { harness: claude, model: claude-opus-5-5 } # harness: pi|claude|codex; model optional
|
|
17
|
+
```
|
|
18
|
+
It says only *what the role should run on*: no args, env, yolo or executable (those stay host
|
|
19
|
+
facts, in launch configurations). A package soul may declare one too (oats.engineering's
|
|
20
|
+
`code-reviewer`: Codex with Astra).
|
|
21
|
+
2. **A machine may override it** in `oats-local.yaml`:
|
|
22
|
+
```yaml
|
|
23
|
+
souls:
|
|
24
|
+
launch:
|
|
25
|
+
"*": <launch-config name> # every soul on this machine (optional)
|
|
26
|
+
oats-expert: opus # a launch configuration's name, or
|
|
27
|
+
oats.engineering/code-reviewer: { harness: codex, model: <model> } # an inline preference
|
|
28
|
+
```
|
|
29
|
+
3. **Precedence for a new selection** (a spawn, or a start/restart given `--launch-config`/`--harness`/`--model`/`--reselect-launch`): explicit flags (`--launch-config`, `--harness`,
|
|
30
|
+
`--model`) → the machine's `souls.launch.<soul>` → its `souls.launch."*"` → the soul's `launch:` →
|
|
31
|
+
today's host default. A launch configuration named by an override supplies its full recipe; an
|
|
32
|
+
inline or soul preference supplies harness and model on top of the host's baseline for that harness.
|
|
33
|
+
**A home's recorded launch stays frozen:** a plain start/restart runs it as recorded (`from:
|
|
34
|
+
recorded`). A preference is a default for new instances, not a live setting; a drifted
|
|
35
|
+
preference shows in `inspect --home` (`launch.current`), and a restart never changes it silently.
|
|
36
|
+
4. **Unavailable harness:** if the chosen harness isn't installed on the machine, the spawn refuses
|
|
37
|
+
with a clear error naming the source (soul / local / flag) and the fix (install it, or override in
|
|
38
|
+
`oats-local.yaml`). No silent fallback to another harness.
|
|
39
|
+
5. **Reported everywhere a launch is shown:** `spawn --preview`, `inspect --soul` and `oats souls`
|
|
40
|
+
carry the soul's declared `launch` and the effective one with its `from` (`flag` | `local` |
|
|
41
|
+
`local-default` | `soul` | `host` | `recorded`); `instance.json` records the effective one.
|
|
42
|
+
|
|
43
|
+
## Migration (binding): the same hazard as the team model
|
|
44
|
+
0.29.4's `soul.yaml` schema refuses unknown keys, and members are read at their latest commit.
|
|
45
|
+
- The kernel accepts `launch:` and `souls.launch` in 0.30.
|
|
46
|
+
- **Committed souls gain `launch:` only on the flag day** (every deployment of the workspace runs
|
|
47
|
+
0.30), and `oats.engineering` ships its reviewer's `launch:` in a release with `compatibility:
|
|
48
|
+
oats >=0.30.0`.
|
|
49
|
+
- Until then, each machine sets its preferences with the local override (0.30), or with
|
|
50
|
+
`--launch-config` at spawn.
|
|
51
|
+
|
|
52
|
+
## Consumers
|
|
53
|
+
- The **Desktop** already renders a soul's default harness and model on the soul page and the side
|
|
54
|
+
panel, but it reads fields v2 souls no longer have, so it shows "No default harness". It reads the new
|
|
55
|
+
`launch` (declared + effective + `from`) consumer-first, before the kernel emits it; the spawn dialog
|
|
56
|
+
shows the effective choice and where it came from.
|
|
57
|
+
- **`oats.developer`'s** `/run-the-review-loop` compares the developer's effective model with the
|
|
58
|
+
reviewer's effective one (from `spawn --preview`) and picks another model when they're the same.
|
|
59
|
+
|
|
60
|
+
## The first preferences (at the flag day)
|
|
61
|
+
- All expert souls in the oats repo: Claude Code, Opus 5.5.
|
|
62
|
+
- `oats.engineering/code-reviewer`: Codex, Astra.
|
|
63
|
+
(Model ids are verified against each harness when they're written, not guessed.)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Design history
|
|
2
|
+
|
|
3
|
+
The design records below were superseded and deleted. Each row keeps the
|
|
4
|
+
decision findable: what the record decided, what replaced it, and a link to its
|
|
5
|
+
full text at the last commit that carried it. The current behaviour is in the
|
|
6
|
+
reference pages; the records still in force are listed in the
|
|
7
|
+
[design index](README.md).
|
|
8
|
+
|
|
9
|
+
| record | date | decision | superseded by |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| [OATS Desktop — UX plan (phase 1)](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/desktop-ux-plan.md) | 2026-07-22 | Chose the Desktop's design language: a VS Code-style shell with command palette, semantic theme tokens and an agent-centred information architecture. | [Desktop design brief](../../packages/desktop/docs/design-brief.md) |
|
|
12
|
+
| [Architecture reassessment: usable agents with replaceable services](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-07-architecture-reassessment.md) | 2026-09-07 | Kept the package and capability-layer mechanism, fixed places where the CLI and Desktop bypassed it, and assigned separate ownership to kernel, backends, capabilities and Desktop. | [layers](../layers.md) |
|
|
13
|
+
| [Souls and capabilities in Desktop](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-07-desktop-souls-capabilities.md) | 2026-09-07 | Desktop inspects souls, capabilities and provider operations only through kernel JSON and changes them only through CLI verbs, never by editing YAML itself. | [Desktop CLI API](../desktop-cli-api.md) |
|
|
14
|
+
| [Proposal: manage server agents from an iPhone](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-07-mobile-agent-management-proposal.md) | 2026-09-07 | Proposed managing server agents from an iPhone through an installable mobile web app reached over Tailscale, reusing the existing control and session contracts. | none (proposal, never implemented) |
|
|
15
|
+
| [Launch configurations and launch recipes](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/launch-configurations.md) | 2026-09-07 | A launch configuration is a named host choice of harness, executable, args, env, model and yolo; a spawn records a launch recipe that every start renders. | [configuration](../configuration.md#launch-configurations) |
|
|
16
|
+
| [Provider operations and inspection contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/operations-contract.md) | 2026-09-07 | A capability declares named operations over its own commands; `oats operation run` resolves the slot's provider and relays one validated JSON answer. | [capabilities](../capabilities.md#operations-a-capability-declares) |
|
|
17
|
+
| [Expert-assisted deployment and an extensible OATS](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-08-expert-assisted-deployment-proposal.md) | 2026-09-08 | Proposed that an OATS expert sets up and verifies agents on other machines through reliable commands and skills, with multi-team membership and explicit knowledge destinations. | [capabilities](../capabilities.md#official-packages) (`oats.setup`), [workspaces](../workspaces.md#teams) |
|
|
18
|
+
| [Knowledge and memory in OATS: the central knowledge base and the expertise doctrine](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-13-knowledge-and-memory-direction.md) | 2026-09-13 | All knowledge leaves the soul for a central per-project base of owned nodes; working agents only read and capture, and a per-instance harvester is the sole writer. | [knowledge theory](../knowledge-theory.md), [knowledge](../knowledge.md) |
|
|
19
|
+
| [Knowledge implementation plan](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-13-knowledge-implementation.md) | 2026-09-13 | Planned the first OKF delivery: Git and directory bases configured by a bindings file, independent per-source harvest, PR-only Git delivery and explicit migration. | [knowledge](../knowledge.md), [OKF knowledge operations](2026-09-26-okf-knowledge-operations.md) |
|
|
20
|
+
| [Knowledge contracts, integrations, and storage](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-13-knowledge-location-contract.md) | 2026-09-13 | Proposed separating the knowledge model, the integration and storage custody, using bases, nodes and bindings with harvest independent of the source instance. | [knowledge](../knowledge.md#bindings-document), [knowledge capability contract](2026-09-16-knowledge-capability-contract.md) |
|
|
21
|
+
| [Finalizing the OKF mirror's source provenance](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/okf-mirror-provenance.md) | 2026-09-13 | The standalone oats-okf repository is authoritative; the mirror here is finalized only from a clean checkout at the published tag, verified against origin. | [release lane](../release-lane.md#mirroring-a-released-oatsokf) |
|
|
22
|
+
| [Retained capability artifacts and captured resolutions](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-artifact-retention-contract.md) | 2026-09-14 | Added primitives that retain verified, immutable capability trees addressed by digest, as the base for captured resolutions, separate approval and dispatch. | removed (no successor, 0.26.0) |
|
|
23
|
+
| [Portable souls and Git-backed organizational workspaces](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-portable-souls-and-git-workspaces.md) | 2026-09-14 | Souls declare their capability sources, a Git-hosted workspace declares reciprocal membership and defaults, and each local deployment resolves, installs and binds credentials. | [workspaces](../workspaces.md) |
|
|
24
|
+
| [Portable Souls — substantive contract amendment](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-portable-souls-contract-amendments.md) | 2026-09-14 | Amended Portable Souls with `requires` versus `defaults`, `repo:` source paths, external soul imports by reference and store-qualified knowledge nodes. | [workspaces](../workspaces.md) |
|
|
25
|
+
| [Portable Souls](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-14-portable-souls-explainer.md) | 2026-09-14 | Explained the Portable Souls model (soul, workspace and deployment responsibilities, reciprocal membership, private-first teams) through an illustrative multi-repository organisation. | [workspaces](../workspaces.md), [Desktop design brief](../../packages/desktop/docs/design-brief.md) |
|
|
26
|
+
| [Captured dispatch integration](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-captured-dispatch.md) | 2026-09-15 | Captured each selected manifest's setting defaults with provenance and dispatched commands only from the exact captured resolution, never from current configuration. | removed (no successor, 0.26.0) |
|
|
27
|
+
| [Captured resolution records — implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-captured-resolution-records.md) | 2026-09-15 | Defined content-addressed, immutable resolution records stored under the deployment, outside instance homes, with verification of every retained input. | removed (no successor, 0.26.0) |
|
|
28
|
+
| [Package preparation integration](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-package-preparation.md) | 2026-09-15 | Reused one shared capability materializer for acquisition, restore and portable package preparation instead of a separate portable installer. | [packages](../packages.md#materialization-from-a-package) |
|
|
29
|
+
| [Portable data and digest contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-data-contract.md) | 2026-09-15 | Made integrity an explicit `{format, value}` pair with a new executable-aware tree encoding and canonical JSON, so trust never transfers between formats. | [packages](../packages.md#lock-v3); captured formats removed in 0.26.0 |
|
|
30
|
+
| [Portable declaration codecs — implementation contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-declarations.md) | 2026-09-15 | Added one bounded YAML/JSON reader and parsers for soul v1, workspace, repository exports and external imports, feeding a single choice engine. | [workspaces](../workspaces.md#the-files), [souls and instances](../souls-and-instances.md#soulyaml-v2) |
|
|
31
|
+
| [Portable Souls infrastructure implementation handoff](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-souls-handoff.md) | 2026-09-15 | Recorded the fifteen binding Portable Souls decisions and a dependency-ordered delivery plan, with Desktop feature work deferred. | [workspaces](../workspaces.md); captured path removed in 0.26.0 |
|
|
32
|
+
| [Portable Souls infrastructure implementation](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-portable-souls-implementation.md) | 2026-09-15 | Recorded a ledger mapping each binding Portable Souls decision to delivery steps and acceptance evidence. | [workspaces](../workspaces.md); captured path removed in 0.26.0 |
|
|
33
|
+
| [Selection lock and approval — implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-selection-lock-and-approval.md) | 2026-09-15 | Introduced a selection lock of artifact sets with current and available choices, and exact-artifact executable approval kept separate from the lock. | [lock v3](../packages.md#lock-v3), [package trust](../packages.md#trust) |
|
|
34
|
+
| [Repository observation and source custody](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-15-source-observation.md) | 2026-09-15 | Observed repositories through native Git and `gh` in one transaction, recording exact identity and commit without checking out or executing source. | [workspace module contracts](2026-09-23-workspace-module-contracts.md) |
|
|
35
|
+
| [Captured incarnation and admitted actions](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-captured-admission.md) | 2026-09-16 | Minted a stable incarnation ID per fresh home and indexed custody witnesses and admitted provider intents outside the home. | removed (no successor, 0.26.0) |
|
|
36
|
+
| [Retained helper selection — supported subset](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-captured-helper-dispatch.md) | 2026-09-16 | Resolved a capability's helper exactly from the source resolution's helper map, with no live soul, configuration or lock lookup. | removed (no successor, 0.26.0) |
|
|
37
|
+
| [Explicit retained launch inputs](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-captured-launch-inputs.md) | 2026-09-16 | Required explicit runtime, executable, arguments, environment, model and yolo inputs to compile a captured launch recipe, with no defaulting. | removed (no successor, 0.26.0) |
|
|
38
|
+
| [Command/curriculum preparation](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-command-profile-preparation.md) | 2026-09-16 | Added `oats prepare`, combining by-reference soul import, workspace choices and package preparation into captured records without launching. | removed in 0.26.0; replaced by [`oats sync`](../packages.md#oats-sync--the-one-command-for-the-common-path) |
|
|
39
|
+
| [Fresh-install-first Portable Souls rollout](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-fresh-install-first-rollout.md) | 2026-09-16 | Prioritised fresh installations over automatic in-place migration and historical reconstruction, keeping the architecture and custody rules unchanged. | none (fresh installs; no migration) |
|
|
40
|
+
| [Fresh operator walkthrough: working preparation versus pending launch](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-fresh-operator-walkthrough.md) | 2026-09-16 | Recorded a source-level walkthrough of fresh preparation versus the still-pending captured launch. | [workspace module contracts](2026-09-23-workspace-module-contracts.md), [workspaces](../workspaces.md) |
|
|
41
|
+
| [Messaging capability contract boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-messaging-capability-contract.md) | 2026-09-16 | OATS supplies generic messaging selection, lifecycle and outcome contracts; the messaging capability owns identity, teams, transport and access verification. | merged into the [knowledge and messaging capability contract](2026-09-16-knowledge-capability-contract.md) |
|
|
42
|
+
| [Portable migration evidence reader and planner](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-portable-migration-evidence.md) | 2026-09-16 | Added a read-only inventory and planner of legacy locks, homes and schedules as evidence for a later explicit migration. | removed (no successor, 0.25.0) |
|
|
43
|
+
| [Portable fresh onboarding and source discovery](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-portable-onboarding.md) | 2026-09-16 | Kept source, deployment, work target and membership context as independent facts in a fresh onboarding and discovery facade. | [Desktop CLI API](../desktop-cli-api.md#oats-onboard-onboardapi-2), [workspaces](../workspaces.md) |
|
|
44
|
+
| [Public preparation request-file transport](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-prepare-request-transport.md) | 2026-09-16 | Let `oats prepare --request` read the whole preparation input from one bounded JSON file, exclusive with every other input flag. | removed (no successor, 0.26.0) |
|
|
45
|
+
| [Provider-owned binding codecs — implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-provider-binding-codecs.md) | 2026-09-16 | A core capability may declare a versioned `binding` naming its own normalize, bind and check commands, so providers own their binding model. | [capabilities](../capabilities.md#readiness-check-bindingcheck) |
|
|
46
|
+
| [Provider binding wire v1](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-16-provider-binding-wire.md) | 2026-09-16 | Defined the bounded JSON stdin/stdout protocol for the normalize, bind and check binding phases. | [capabilities](../capabilities.md#readiness-check-bindingcheck) |
|
|
47
|
+
| [Capability-owned helper injection and lifecycle input contract](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-capability-helper-input-contract.md) | 2026-09-17 | Replaced kernel assumptions with an explicit `helperInjection` manifest field and a per-hook opt-in for source receipts. | removed (no successor, 0.26.0; the fields are accepted and ignored) |
|
|
48
|
+
| [Captured native backend parity: tmux and Herdr](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-captured-backend-parity.md) | 2026-09-17 | Supported captured start and restart on both tmux and Herdr through explicit backend endpoints recorded in receipts. | removed (no successor, 0.26.0) |
|
|
49
|
+
| [Captured native start through the existing session transaction](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-captured-native-start.md) | 2026-09-17 | Started captured instances through the existing native session transaction, from a retained entrypoint or an explicit host executable path. | removed (no successor, 0.26.0) |
|
|
50
|
+
| [Captured boundary resource hookup](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-portable-boundary-hookup.md) | 2026-09-17 | Wired the captured-only boundary injections into captured preparation, with unchanged labels and order. | removed (no successor, 0.26.0) |
|
|
51
|
+
| [Captured-only instance and directory boundaries](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-portable-boundary-resources.md) | 2026-09-17 | Added captured-only instance-boundary and work-directory injections that take authority from the captured resolution rather than the working directory. | removed (no successor, 0.26.0) |
|
|
52
|
+
| [Public captured start and retained helper dispatch](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-public-captured-start.md) | 2026-09-17 | Exposed captured start and restart, including retained helpers, through `oats session start\|restart --deployment --resolution`. | removed (no successor, 0.26.0) |
|
|
53
|
+
| [Public preparation request-file transport](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-17-public-prepare-request.md) | 2026-09-17 | Added a shared helper that reads a preparation request file intact, leaving validation to the one preparation entry point. | removed (no successor, 0.26.0) |
|
|
54
|
+
| [Captured Pi print host — kernel implementation boundary](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-18-captured-pi-host.md) | 2026-09-18 | Added an explicit Pi SDK print-mode host for captured launches, with kernel-controlled arguments, task and history. | removed (no successor, 0.26.0) |
|
|
55
|
+
| [First-cut retained execution: installation and release checklist](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-18-first-cut-release-checklist.md) | 2026-09-18 | Planned the installation, acceptance and publication checklist for the first runnable retained-execution release. | removed (no successor, 0.26.0) |
|
|
56
|
+
| [Explicit Herdr protocol20/22 adapter compatibility](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-18-herdr-protocol-compatibility.md) | 2026-09-18 | The Herdr adapter supports exactly protocols 20 and 22 by explicit selection, with no version negotiation. | [execution targets](../execution-targets.md) |
|
|
57
|
+
| [OATS redesign — program board](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-20-redesign-program-board.md) | 2026-09-20 | Recorded the state, owners and blockers of every redesign work stream. | none (status board) |
|
|
58
|
+
| [OATS adoption plan: workspace first, knowledge and experts second](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md) | 2026-09-20 | Planned moving OATS development onto a Git workspace, then central knowledge and expert souls, then Desktop parity, with official `oats.core` and `oats.setup` capabilities. | [workspaces](../workspaces.md), [official catalog](../official-catalog.md) |
|
|
59
|
+
| [Public source inspection for same-repository workspace onboarding](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-20-workspace-onboarding-public.md) | 2026-09-20 | Added read-only `oats inspect --request` to inspect onboarding sources and optionally emit a preparation request. | removed in 0.26.0; replaced by [`oats onboard`](../desktop-cli-api.md#oats-onboard-onboardapi-2) |
|
|
60
|
+
| [Desktop parity — slice plan and kernel/provider seams (S8)](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-22-desktop-parity-seams.md) | 2026-09-22 | Planned Desktop parity slices and the kernel and provider JSON seams they need, under shared rules for envelopes and targets. | [Desktop CLI API](../desktop-cli-api.md) |
|
|
61
|
+
| [A simpler multi-repo model for OATS — brainstorm with a worked example](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-23-simplified-workspace-model.md) | 2026-09-23 | Accepted workspace model v2: membership is trust, souls name where each capability comes from, only packages are versioned, capabilities are copied into instances. | [workspaces](../workspaces.md), [workspace module contracts](2026-09-23-workspace-module-contracts.md) |
|
|
62
|
+
| [Phase 4 — implementing workspace model v2: proposal for the human](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-23-workspace-v2-implementation-plan.md) | 2026-09-23 | Planned the workspace model v2 implementation as ordered work packages replacing canonical kernel code, with no migration and no feature flag. | [workspace module contracts](2026-09-23-workspace-module-contracts.md) |
|
|
63
|
+
| [Desktop Phase F — the Desktop is built FOR workspace model v2](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-24-desktop-phase-f-boundary.md) | 2026-09-24 | The Desktop is rebuilt natively for workspace model v2, reading every deployment fact and making every change through kernel JSON verbs. | [Desktop CLI API](../desktop-cli-api.md#workspace-model-workspaceapi-2), [Desktop design brief](../../packages/desktop/docs/design-brief.md) |
|
|
64
|
+
| [Phase D — the OATS project runs on the architecture it offers (plan)](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-24-phase-d-plan.md) | 2026-09-24 | Planned running the OATS project on workspace model v2, centralising its knowledge, and recorded removing per-version package approval. | [packages](../packages.md#trust), [official catalog](../official-catalog.md) |
|
|
65
|
+
| [Teams contract: several team labels per soul, per-team messaging, live reconciliation](https://github.com/awebai/oats/blob/7838d3ca70772f63854b198601fbc45437c2e999/docs/design/2026-09-25-teams-contract.md) | 2026-09-25 | A soul may carry several team labels, each with its own messaging payload, and the provider reconciles team membership live. | [team model v2](2026-09-27-team-model-v2.md) |
|
package/docs/design/README.md
CHANGED
|
@@ -1,54 +1,23 @@
|
|
|
1
|
-
# Design
|
|
2
|
-
|
|
3
|
-
Dated
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- [Portable Souls explainer](2026-09-14-portable-souls-explainer.md) — the short version.
|
|
25
|
-
- [Portable souls and Git-backed workspaces](2026-09-14-portable-souls-and-git-workspaces.md) — the accepted architecture.
|
|
26
|
-
- [Contract amendments (14 Sep)](2026-09-14-portable-souls-contract-amendments.md) · [portable declarations](2026-09-15-portable-declarations.md) · [portable data/digest contract](2026-09-15-portable-data-contract.md) · [source observation](2026-09-15-source-observation.md).
|
|
27
|
-
- [Fresh-install-first rollout](2026-09-16-fresh-install-first-rollout.md) · [fresh operator walkthrough](2026-09-16-fresh-operator-walkthrough.md) · [portable onboarding and discovery](2026-09-16-portable-onboarding.md) · [migration evidence](2026-09-16-portable-migration-evidence.md) — the `lib/portable-migration*`, `lib/portable-onboarding-acceptance.mjs` modules and the `portable-onboarding-public` acceptance driver these cite are deleted; each note carries a superseded banner pointing at the [simplified workspace model](2026-09-23-simplified-workspace-model.md).
|
|
28
|
-
|
|
29
|
-
## Retained execution — artifacts, approval, capture (0.24; artifact/approval parts superseded by lock v3)
|
|
30
|
-
|
|
31
|
-
- [Artifact retention](2026-09-14-artifact-retention-contract.md) · [selection lock and approval](2026-09-15-selection-lock-and-approval.md) · [captured resolution records](2026-09-15-captured-resolution-records.md).
|
|
32
|
-
- [Package preparation](2026-09-15-package-preparation.md) · [command/curriculum preparation](2026-09-16-command-profile-preparation.md) · [prepare request transport](2026-09-16-prepare-request-transport.md) · [public prepare request](2026-09-17-public-prepare-request.md).
|
|
33
|
-
- [Captured dispatch](2026-09-15-captured-dispatch.md) · [captured admission](2026-09-16-captured-admission.md) · [retained helper dispatch](2026-09-16-captured-helper-dispatch.md) · [retained launch inputs](2026-09-16-captured-launch-inputs.md).
|
|
34
|
-
- [Boundary resources](2026-09-17-portable-boundary-resources.md) · [boundary hookup](2026-09-17-portable-boundary-hookup.md) · [captured native start](2026-09-17-captured-native-start.md) · [public captured start](2026-09-17-public-captured-start.md).
|
|
35
|
-
- [Backend parity: tmux and Herdr](2026-09-17-captured-backend-parity.md) · [Herdr protocol compatibility](2026-09-18-herdr-protocol-compatibility.md) · [captured Pi print host](2026-09-18-captured-pi-host.md).
|
|
36
|
-
- [First-cut release checklist](2026-09-18-first-cut-release-checklist.md).
|
|
37
|
-
- Implementation records: [implementation](2026-09-15-portable-souls-implementation.md) · [handoff](2026-09-15-portable-souls-handoff.md).
|
|
38
|
-
|
|
39
|
-
## Capabilities and providers
|
|
40
|
-
|
|
41
|
-
- Package engine contract (`package-engine-contract.md`, removed in 0.26) · package-runtime API (`package-runtime-api.md`, removed in 0.26) — **superseded** (installed tier removed; see [packages](../packages.md)) · [operations contract](operations-contract.md) · [launch configurations](launch-configurations.md).
|
|
42
|
-
- [Provider binding wire v1](2026-09-16-provider-binding-wire.md) · [provider binding codecs](2026-09-16-provider-binding-codecs.md) · [capability helper/input contract](2026-09-17-capability-helper-input-contract.md).
|
|
43
|
-
- [Knowledge capability contract](2026-09-16-knowledge-capability-contract.md) · [messaging capability contract](2026-09-16-messaging-capability-contract.md).
|
|
44
|
-
|
|
45
|
-
## Knowledge and memory
|
|
46
|
-
|
|
47
|
-
- [Knowledge and memory direction](2026-09-13-knowledge-and-memory-direction.md) · [knowledge location contract](2026-09-13-knowledge-location-contract.md) · [knowledge implementation plan](2026-09-13-knowledge-implementation.md) · [OKF mirror provenance](okf-mirror-provenance.md).
|
|
48
|
-
|
|
49
|
-
## Product direction and Desktop
|
|
50
|
-
|
|
51
|
-
- [Architecture reassessment](2026-09-07-architecture-reassessment.md) · [expert-assisted deployment](2026-09-08-expert-assisted-deployment-proposal.md).
|
|
52
|
-
- [Desktop UX plan](desktop-ux-plan.md) · [souls and capabilities in Desktop](2026-09-07-desktop-souls-capabilities.md) · [mobile management proposal](2026-09-07-mobile-agent-management-proposal.md).
|
|
53
|
-
|
|
54
|
-
Adding a design doc: date-prefix it, state its status in the first lines, and add it here under the right theme.
|
|
1
|
+
# Design records
|
|
2
|
+
|
|
3
|
+
Dated records of decisions that are still in force: the context, the decision
|
|
4
|
+
and its consequences. The current behaviour is explained in the reference pages
|
|
5
|
+
([workspaces](../workspaces.md), [packages](../packages.md),
|
|
6
|
+
[configuration](../configuration.md), [souls and instances](../souls-and-instances.md),
|
|
7
|
+
[capabilities](../capabilities.md), [knowledge](../knowledge.md)); when a record and
|
|
8
|
+
a reference page disagree, the reference page wins. Superseded records are
|
|
9
|
+
deleted; [HISTORY.md](HISTORY.md) lists each one, its decision and its
|
|
10
|
+
successor, with a link to its full text.
|
|
11
|
+
|
|
12
|
+
- [Workspace module contracts](2026-09-23-workspace-module-contracts.md): the
|
|
13
|
+
normative contracts of `lib/remote.mjs`, `lib/workspace.mjs`, `lib/resolve.mjs`,
|
|
14
|
+
`lib/packages.mjs`, `lib/materialize.mjs` and the CLI verbs built on them.
|
|
15
|
+
- [Knowledge and messaging capability contract](2026-09-16-knowledge-capability-contract.md):
|
|
16
|
+
the kernel supplies contracts; capabilities own knowledge and messaging behaviour.
|
|
17
|
+
- [OKF knowledge operations](2026-09-26-okf-knowledge-operations.md): package
|
|
18
|
+
souls, triggers and automations for harvest and maintenance.
|
|
19
|
+
- [Team model v2](2026-09-27-team-model-v2.md): shared teams in the workspace,
|
|
20
|
+
local teams, the default team and membership in each deployment.
|
|
21
|
+
|
|
22
|
+
The Desktop's design brief for designers is in
|
|
23
|
+
[packages/desktop/docs](../../packages/desktop/docs/design-brief.md).
|