@awebai/oats 0.29.4 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -6
- package/bin/oats.mjs +194 -50
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
- package/capabilities/oats-aweb/injects/aweb.md +1 -1
- package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
- package/capabilities/oats-aweb/oats.json +5 -12
- package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
- package/capabilities/oats-code-review/injects/reviewer.md +26 -0
- package/capabilities/oats-code-review/oats.json +16 -0
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
- package/capabilities/oats-developer/injects/developer.md +38 -0
- package/capabilities/oats-developer/oats.json +17 -0
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
- package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
- package/capabilities/oats-engineering-expert/oats.json +17 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
- package/capabilities/oats-okf/bin/oats-okf.mjs +8 -4
- package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
- package/capabilities/oats-okf/lib/inspection.mjs +26 -7
- package/capabilities/oats-okf/lib/sources.mjs +16 -2
- package/capabilities/oats-okf/lib/worker.mjs +5 -16
- package/capabilities/oats-okf/oats.json +6 -3
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
- package/capabilities/oats-okf-harvest/oats.json +3 -3
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +2 -2
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
- package/capabilities/oats-okf-maintenance/oats.json +2 -2
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +1 -1
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
- package/capabilities/oats-workspace-experts/oats.json +9 -0
- 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 +76 -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 +61 -0
- package/docs/release-lane.md +77 -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/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 +132 -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/resolve.mjs +29 -87
- 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 +9 -15
- package/package.json +1 -1
- package/skills/oats-getting-started/SKILL.md +25 -13
- 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,65 +0,0 @@
|
|
|
1
|
-
# Phase 4 — implementing workspace model v2: proposal for the human
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-09-23 · **Status:** PROPOSED — nothing lands before the human approves this plan.
|
|
4
|
-
**Decision:** `agents/oats-expert/soul/knowledge/decisions/workspace-model-v2.md` · **Worked example:** [2026-09-23-simplified-workspace-model.md](2026-09-23-simplified-workspace-model.md)
|
|
5
|
-
|
|
6
|
-
## What we are building, in one paragraph
|
|
7
|
-
|
|
8
|
-
A clean v2 of the kernel's declaration, resolution and launch path: read `oats-workspace.yaml` v2 / `oats-membership.yaml` / `soul.yaml` v2 / `oats-local.yaml` over Git remotes; confirm membership; resolve every capability by `from:`; fetch packages at the locked version with per-version approval in lock v3; copy each capability whole into the instance (`.oats/modules/` + `.agents/skills/`); compose `AGENTS.md`; launch the harness normally. Remove the installed-capability tier, the classic activation config and the v1 declaration readers. No migration. The framework's own repos become the first real v2 workspace and the Desktop follows through new DTOs under new feature names.
|
|
9
|
-
|
|
10
|
-
## Where the current code is
|
|
11
|
-
|
|
12
|
-
`lib/` is 82 modules / 21 k lines; `core.mjs` alone is 9.2 k. The v1 declaration/portable path is spread over ~20 modules (`workspace-definition`, `workspace-discovery`, `source-spec`, `portable-*`, `capability-provenance`, `prepared-resources`, `resolution-shape`, `captured-*`, `packages` 1.4 k). Much of that machinery exists to carry per-soul versioned sources, migration evidence and the installed tier — the things v2 removes. The lifecycle core (spawn/retire/session/events/schedule, the Desktop DTOs, `binding` validation, the lock) stays.
|
|
13
|
-
|
|
14
|
-
**Approach (human, 2026-09-23): the new modules ARE the kernel — no `lib/v2/`, no seam, no flag.** Each phase replaces canonical code on main and deletes what it supersedes; tests are updated to the new truth in the same phase. Desktop contracts that change do so under new feature names; the Desktop follows in W12.
|
|
15
|
-
|
|
16
|
-
## Work packages
|
|
17
|
-
|
|
18
|
-
Each is one PR (or two small ones), reviewed by me, on `main`, as canonical code from the first phase (no seam — see the approach above). Order is dependency order; W1–W3 can proceed in parallel lanes. **Status (2026-09-23): W1–W8 and W10 shipped in OATS 0.25.0 (PR99 `59ae22df`); W8's last part — folding the classic no-`oats-local.yaml` spawn path into the one pipeline and deleting the v1 residue — is a follow-up; W9/W9b/W11/W12 are Phases D–F.**
|
|
19
|
-
|
|
20
|
-
| # | Package | Delivers | Owner | Size |
|
|
21
|
-
|---|---|---|---|---|
|
|
22
|
-
| **W1** | **Schemas + fixtures** | `oats-workspace.schema.json` v2, `oats-membership.schema.json`, `soul.schema.json` v2, `oats-local.schema.json`, lock v3; the Northwind example as a **test fixture workspace** (three teams, five repos as bare local remotes) used by every later package | lead | S |
|
|
23
|
-
| **W2** | **Remote observation** | `lib/remote.mjs`: fetch a file or a tree from a Git remote at default-branch or exact commit, in the operator's access context (git credential helper / `gh` token), with typed `cannot read <url>`; bounded; a content-addressed **fetch cache** under the OS cache dir (invisible plumbing) | lead | M |
|
|
24
|
-
| **W3** | **Membership + discovery** | `lib/workspace.mjs`: read the workspace file; for each member read `oats-membership.yaml`; confirm both halves in one access context (`E_MEMBERSHIP_UNCONFIRMED` naming the missing/unreadable half); enumerate `souls/*/soul.yaml` and `capabilities/*/oats.json`; apply `private`; team labels (`E_TEAM_UNKNOWN`); standalone case | lead | M |
|
|
25
|
-
| **W4** | **Resolution** | `lib/resolve.mjs`: workspace defaults ⊕ `defaults.byTeam` ⊕ soul (`off` removes) → for each `(name, from)`: member lookup or package lookup; slot filling from `layer:` (`E_SLOT_CONFLICT`); produces an immutable **resolution** (the input to preview/apply — reuses `decision.revision`) | lead | M |
|
|
26
|
-
| **W5** | **Packages v2 + lock v3** | `lib/packages.mjs` (rewritten in place): `packages:` → catalog/git ref → commit; integrity; **approval per version** stored in `oats-lock.json` v3 (`approved.executables` digest); `oats package add|remove`; a moved tag fails integrity and re-asks; **delete** `oats install/restore/use/init` and the installed tier | lead | M |
|
|
27
|
-
| **W6** | **Materialization + launch** | `lib/materialize.mjs`: copy each resolved capability whole into `<instance>/.oats/modules/<cap>/`; copy `skills/` into `<instance>/.agents/skills/<cap>/`; compose `AGENTS.md` (soul + injects); record `modules{}` and **`providers{}` (from `spawn --provider <cap> k=v`, the instance-level payload home; merged with soul + `oats-local.yaml` settings before `binding`)** in `instance.json`; keep `CLAUDE.md`/`.claude/skills` aliases; **launch the harness normally** (drop the ambient-skill exclusion; keep model/profile pinning) | lead | M |
|
|
28
|
-
| **W7** | **CLI switch-over** | `oats sync`, `oats spawn` (preview/apply unchanged in shape, now fed by W4/W6), `oats capabilities` / `oats souls` with origin + team, `oats workspace status`; `oats status` shows `modules … @ commit` + `member moved since`; `oats version --json` advertises `workspaceApi: 2` + feature `workspace-v2`; **remove the v1 readers** (`oats.yaml`, per-soul `source:`, `oats-config.yaml` activation) — a v1 file at a v2 path errors naming the schema | lead | M |
|
|
29
|
-
| **W8** | **Delete v1** | Remove `portable-*`, `source-spec`, `capability-provenance` (v1 parts), `prepared-resources`, migration stores/evidence, the installed tier in `packages.mjs`, classic config activation, their tests and docs; `core.mjs` loses everything that only served v1 | lead | L (mostly deletion) |
|
|
30
|
-
| **W9** | **Framework repos as the first workspace (decisions 18–21)** | `oats-workspace.yaml` v2 in `oats` (drop the six imports; `packages:` pins oats.framework/okf/aweb/jira/linear/authoring/dev **as packages**; `teams:` global/engineering; `defaults`); `oats-membership.yaml` in ALL seven repos; the six soul editions rewritten (`oats.okf: {from: package}` etc. even though the repos are members); **a new expert soul in every package repo** — `okf-expert`, `aweb-expert`, `jira-expert`, `linear-expert`, `authoring-expert`, `dev-expert` (v2 `souls/<name>/`, team global, knows and evolves that capability); `package-catalog.json` kept as the official marketplace (bare-version `packages:` entries resolve through it) | lead (member-repo PRs to their owners; the expert souls' AGENTS.md drafted by me, reviewed by the package owner) | L |
|
|
31
|
-
| **W9b** | **`oats.core` and `oats.setup` rewritten for the new architecture (human, 2026-09-23)** | The two official capabilities' skills and injects are rewritten to teach the *new* model, not patched: **`oats.core`** (`oats-operate`, `oats-souls`, the "you run on OATS" inject) — how an agent works inside an instance under this architecture: its home layout (`.oats/modules/`, `.agents/skills/`, `instance.json` modules/providers), the verbs it will actually use (`status`, `spawn --preview/--provider`, `retire`, `session`, `instance events`, `capabilities`, `souls`, `workspace status`), what a workspace/member/package/team is *from the agent's seat*, drift ("member moved since"), how to find and read other souls. **`oats.setup`** (`oats-config`/`oats-packages` → renamed to what they now are: `oats-workspace`, `oats-packages`, `oats-onboarding`) — the whole architecture and its best practices: workspace ↔ repo handshake and why, `oats-workspace.yaml` / `oats-membership.yaml` / `soul.yaml` v2 / `oats-local.yaml` field by field, teams as labels, member-tier vs package-tier and the non-collapse rule, `packages:` + lock v3 + per-version approval, the official catalog vs `git:` refs, `sync`/`package add`, the deployment directory (the operator's; no naming convention) and clone-then-spawn, private items, external souls, the standalone case, provider payload homes (soul/machine/spawn), what is deliberately NOT versioned and why. Every skill is validated against the shipped CLI (`oats <verb> --help` snapshot test) so they cannot drift from the commands. | lead (swarm + review) | M |
|
|
32
|
-
| **W10** | **Docs** | **the rebuild guide (removed in 0.26.0; ships with the schemas; states that 0.24.x keeps spawning 0.24.x deployments)**; `docs/workspaces.md` rewritten around v2; `souls-and-instances.md`, `packages.md`, `configuration.md` (mostly deleted), `first-team.md` → the operator's deployment directory; DTO doc § Workspace v2; release notes | lead | M |
|
|
33
|
-
| **W11** | **Onboarding skill** | `oats-setup-expert` / `oats.setup`: ASK for the deployment directory (an existing folder with the operator's clones is the usual case — no named convention, decision 9), `oats sync`, clone-then-spawn; **the hosting rule for mixed public/private organisations (decision 26): ask up front whether any member is private; if so the workspace file is hosted in a private repo that is NOT a public member (a dedicated private `workspace` repo is the honest shape), public contributors get the standalone case with `oats.core` by default (decision 25); `oats onboard` prints the same rule in its next-steps**; the `oats-operate` skill updated for the new verbs | lead | S |
|
|
34
|
-
| **W12** | **Desktop follow-through** | New kernel DTOs (from W7) consumed the usual way — engineer reads the merged head, files pins, wires: Capabilities/Souls origin + team columns; "installed" removed as a state; spawn preview shows modules (from/commit/hash) + team; Workspaces surface shows membership status | Desktop engineer, after W7 | M |
|
|
35
|
-
|
|
36
|
-
**Team review (Antares, 2026-09-23) folded in:** rebuild guide (W10), **second review (two aweb teams, stores, soul layout, standalone, public/private hosting → decisions 23–26: `messaging.byTeam`, stores = repo + provider `root`, `souls/` only, `oats.core` standalone default, private host rule taught by onboarding),** `--provider` instance payload (W6/W7), drift display (W7), duplicate-name rule (W6), 0.24.x-keeps-working stated everywhere.
|
|
37
|
-
|
|
38
|
-
**Not in scope:** K11 (member admission UI/"Join"), K12 (transcript verb), 10B editor/detach — they wait behind this.
|
|
39
|
-
|
|
40
|
-
## How phases land
|
|
41
|
-
|
|
42
|
-
Each phase = one developer-swarm workflow (parallel agents, disjoint files, against a written module contract) → one adversarial-review workflow (independent reviewers with different lenses) → fixes → my four-gate review → merge to main. No compatibility flag: when a phase lands, its modules are the kernel and the v1 code they replace is deleted in the same PR, with tests rewritten. Between phases main is always green and always the canonical state.
|
|
43
|
-
|
|
44
|
-
## Releases
|
|
45
|
-
|
|
46
|
-
- **0.24.14** — 10A + 10B-0 (already planned; nothing v2). Ships first, independent.
|
|
47
|
-
- **0.25.0** — W1–W8: the new model is the kernel, v1 deleted as each phase landed; `workspaceApi: 2`. Breaking by design (no migration).
|
|
48
|
-
- **0.26.0** — W9 live (framework repos on v2), W11 onboarding, W12 Desktop.
|
|
49
|
-
|
|
50
|
-
## Risks and how the plan handles them
|
|
51
|
-
|
|
52
|
-
| Risk | Mitigation |
|
|
53
|
-
|---|---|
|
|
54
|
-
| Remote access context is subtle (SSH vs HTTPS vs `gh` token; private repos) | W2 uses git itself (`git ls-remote`, `git archive`/shallow fetch) with the operator's configured credential helpers — no new credential store; typed `cannot read` never guesses |
|
|
55
|
-
| `core.mjs` entanglement makes W8 risky | W8 is deletion behind a green W7; `rg` proof of zero importers per module before each deletion (the v1-residue table from the Phase C review); CI + the Northwind fixture + Desktop suites are the gate |
|
|
56
|
-
| Package approval UX ("asks once") in non-interactive spawns | `oats sync` is where approval is asked; `spawn` refuses `E_PACKAGE_UNAPPROVED` pointing at `sync` — never prompts mid-spawn |
|
|
57
|
-
| Latest-state members drift between preview and apply | The resolution records the member commit; apply re-observes and refuses `E_DECISION_STALE` if it moved — same mechanism as today's decision revision |
|
|
58
|
-
| Desktop relying on "installed" | Removed as a state in W12; until then the Capabilities view keeps working on 0.24.x DTOs (contracts unchanged) |
|
|
59
|
-
|
|
60
|
-
## What I need from you
|
|
61
|
-
|
|
62
|
-
1. **Approve the plan shape** (parallel v2 beside v1, one switch-over release, then delete) or tell me you want in-place.
|
|
63
|
-
2. **Confirm I implement the kernel packages W1–W11 myself**, with the Desktop engineer on W12 after W7 — or whether Juan's side should take lanes (W2 remote observation and W5 packages are the most separable).
|
|
64
|
-
3. **0.25.0 as the breaking release number** — fine?
|
|
65
|
-
4. Anything in W9 you want different for the framework repos (team labels for the six souls: I'd put the five experts under `global`, `oats-setup-expert` under `global`, and any dev capabilities in `oats-dev` under `engineering`).
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
# Desktop Phase F — the Desktop is built FOR workspace model v2
|
|
2
|
-
|
|
3
|
-
> **Vocabulary (2026-09-26):** there is no "personal team". Read it below as **the workspace's default team**. See the AMENDMENT at the top of [the teams contract](2026-09-25-teams-contract.md). This document is a record and keeps its original wording.
|
|
4
|
-
|
|
5
|
-
**Status**: boundary for the Desktop engineer, issued 2026-09-24 by the lead under
|
|
6
|
-
the human's direction: *"the desktop should not just adapt to the new version,
|
|
7
|
-
it should be natively built for it."* Supersedes the Phase 3 parity plan's
|
|
8
|
-
assumptions about what the Desktop reads; keeps its visual deliverable (the
|
|
9
|
-
redesign frames, excl. 05/06).
|
|
10
|
-
|
|
11
|
-
**Human's second directive, verbatim intent**: make ultra sure the Desktop is set
|
|
12
|
-
up to work in the new setup — new versions, new CLI, new deployment shape.
|
|
13
|
-
|
|
14
|
-
## 0. Why this is a rebuild of the model, not a patch
|
|
15
|
-
|
|
16
|
-
The Desktop today is a 0.24 product that *tolerates* 0.25 kernels: its
|
|
17
|
-
`ACCEPT_RANGE` admits `0.25.x`, so it launches, and the few CLI verbs it drives
|
|
18
|
-
(`version`, `session *`, `spawn`, `retire`, `schedule`, `catalog`) still answer.
|
|
19
|
-
But its **model of a deployment is 0.24's**, reimplemented in
|
|
20
|
-
`packages/desktop/server/deployment.mjs`: it reads `oats-config.yaml`,
|
|
21
|
-
`agents/<name>/soul`, `local-agents/`, and capability manifests from
|
|
22
|
-
`.agents/capabilities/installed/`, and derives the roster itself. None of these
|
|
23
|
-
is how a v2 deployment is shaped:
|
|
24
|
-
|
|
25
|
-
| 0.24 (what the Desktop reads) | v2 (what a deployment IS) |
|
|
26
|
-
|---|---|
|
|
27
|
-
| `oats-config.yaml` at the repo root | `oats-local.yaml` at the deployment directory → `workspace:` URL |
|
|
28
|
-
| souls at `agents/<name>/soul` | souls at `souls/<name>` **in member repos**, materialised per commit into `agents/<name>/souls/<commit>` |
|
|
29
|
-
| capabilities installed into `.agents/capabilities/installed/` | packages resolved through `oats-workspace.yaml` + the official catalog, locked in `oats-lock.json`, **copied whole into each instance home** (`.oats/modules/<cap>`) |
|
|
30
|
-
| `team:` block | `oats-membership.yaml` `team:` label per member; `messaging.byTeam.<label>` payloads |
|
|
31
|
-
| `oats catalog` DTO | removed; the catalog is `package-catalog.json` resolved by `oats sync` |
|
|
32
|
-
| roster derived by the Desktop | `oats status --json` is the roster (agents, instances, `modules[]` drift, `soul` source drift, `identity`) |
|
|
33
|
-
|
|
34
|
-
A Desktop that keeps the left column and adds a few right-column fields is the
|
|
35
|
-
"adapt" outcome the human rejected. Phase F replaces the left column.
|
|
36
|
-
|
|
37
|
-
## 1. The principle: the kernel is the model; the Desktop renders and drives it
|
|
38
|
-
|
|
39
|
-
- **Read model**: every fact the Desktop shows about a deployment comes from
|
|
40
|
-
the kernel's JSON surfaces — `oats status --json`, `oats inspect --json`,
|
|
41
|
-
`oats workspace status --json`, `oats spawn --preview --json`, `oats
|
|
42
|
-
readiness --json`, `oats version --json`, `oats sync --json`. The Desktop
|
|
43
|
-
does not parse `oats-config.yaml`, `oats-local.yaml`, `soul.yaml`,
|
|
44
|
-
manifests or lock files itself. Where a fact is missing from a kernel
|
|
45
|
-
surface, the fix is a kernel PR (lead's lane), not a Desktop-side parser.
|
|
46
|
-
- **Write model**: every mutation is a kernel verb with `--json`: `sync`,
|
|
47
|
-
`sync --approve`, `spawn` (preview → `--expect-decision` apply), `retire`,
|
|
48
|
-
`session start|restart|recompose`, `schedule *`, `onboard`. The Desktop
|
|
49
|
-
never writes a deployment file.
|
|
50
|
-
- **Version contract**: `oats version --json` `features[]` is the capability
|
|
51
|
-
probe. The Desktop's `ACCEPT_RANGE` moves to `>=0.25.6 <0.27.0` (the first
|
|
52
|
-
kernel with `served-identity`), and each feature the UI depends on is gated
|
|
53
|
-
on its `features[]` name, not on a version number.
|
|
54
|
-
|
|
55
|
-
## 2. Deliverables (slices; each is one PR against main, each reviewed by the lead)
|
|
56
|
-
|
|
57
|
-
**F1 — Deployment model on kernel JSON.** Replace
|
|
58
|
-
`server/deployment.mjs`'s own readers with `oats status --json` (+ `oats
|
|
59
|
-
workspace status --json` for the workspace header: name, key, members, packages,
|
|
60
|
-
lock state, `approvalNeeded`). Roster rows carry `modules[]` drift, `soul`
|
|
61
|
-
source (`repo: <member> @ <c7>`, "member moved since"), `identity`. Legacy
|
|
62
|
-
`local-agents/`/`tmp-agents/` paths are dropped. Remove `server/catalog.mjs`'s
|
|
63
|
-
`oats catalog` DTO validation (the verb no longer exists).
|
|
64
|
-
|
|
65
|
-
**F2 — Workspace onboarding and sync.** A "Open deployment" flow that: detects a
|
|
66
|
-
directory with `oats-local.yaml` (v2), or offers `oats onboard` for one without
|
|
67
|
-
(the kernel asks for the deployment directory and the workspace URL — the
|
|
68
|
-
Desktop collects both, never invents a folder name; decision 9). A "Sync"
|
|
69
|
-
action runs `oats sync --json`; exit 2 with `approvalNeeded[]` renders an
|
|
70
|
-
approval sheet showing each package's `executables` digest and applies with
|
|
71
|
-
`oats sync --approve <id>@<version>` (the version string is what
|
|
72
|
-
`approvalNeeded[].version` reports — for a git-pinned package, the full OID).
|
|
73
|
-
Lock drift and `E_PACKAGE_INTEGRITY` are surfaced verbatim.
|
|
74
|
-
|
|
75
|
-
**F3 — Spawn dialog on the v2 preview.** The preview already carries
|
|
76
|
-
`modules`, `providers`, `settings.<cap>`, `team`, `resolution`, `decision`.
|
|
77
|
-
Render: which modules the instance will get and from where (package vs member,
|
|
78
|
-
commit); the merged `settings.<cap>` per provider (read-only); **Identity**
|
|
79
|
-
select (local | global) with a Resident field for global, prefilled from
|
|
80
|
-
`settings.<messaging cap>.identity`, forwarded as `--provider <cap>
|
|
81
|
-
identity.mode=… identity.resident=…` (decision 27 — there is no kernel flag);
|
|
82
|
-
`decision.effective.providers` is what the confirm binds. `cli-adapter.mjs`
|
|
83
|
-
`SPAWN_ARG_RULES` gains one `provider` rule (capability id, dotted key, value
|
|
84
|
-
grammar); no identity-named rules. Work mode select includes `workspace`.
|
|
85
|
-
|
|
86
|
-
**F3 amended by the human (2026-09-24). This supersedes design frame 02 and the
|
|
87
|
-
text above wherever they differ.** The dialog leads with the **instance name**:
|
|
88
|
-
the purpose field becomes a name field that shows `<soul>-<purpose>` live and
|
|
89
|
-
then the kernel's final name from the preview. A no-prefix toggle maps to
|
|
90
|
-
`spawn --name <slug>`, gated on the `spawn-name` feature; `--purpose` stays the
|
|
91
|
-
default. **Runtime and model** are always visible, with their resolved value and
|
|
92
|
-
its source. **Relationship** sits in the main form, shown by default: None /
|
|
93
|
-
Child of / Sibling of / Parent of. There is **no** modules/capabilities list and
|
|
94
|
-
no attach-knowledge / child-spawn / open-PR toggles, because those behaviours
|
|
95
|
-
come from capabilities. There is **no** preview button either. The preview runs
|
|
96
|
-
in the background to fill the real defaults, and apply still binds with
|
|
97
|
-
`--expect-decision` (`E_DECISION_STALE` re-previews). A collapsed section named
|
|
98
|
-
**Developer settings** holds:
|
|
99
|
-
- **work**: base | branch and the worktree path. A `checkout` soul is offered
|
|
100
|
-
"Use a worktree instead?" (`--work worktree`); the work mode itself comes
|
|
101
|
-
from the soul's `work:`.
|
|
102
|
-
- harness permissions
|
|
103
|
-
- launch config
|
|
104
|
-
- session backend
|
|
105
|
-
- Run on (the execution server)
|
|
106
|
-
- wake-up
|
|
107
|
-
- messaging identity (`--provider <cap> identity.mode=…`, decision 27)
|
|
108
|
-
|
|
109
|
-
(Second human redirect, same day: relationship moved into the main form, work
|
|
110
|
-
moved into the collapsed section, and the section was renamed from "Advanced".)
|
|
111
|
-
Every modal gets a darker backdrop.
|
|
112
|
-
|
|
113
|
-
**F4 — Instance card and roster on v2 facts.** The served-identity line (`acts
|
|
114
|
-
as <address> via grant, expires <t>` / `alias <a> on <team>`); module rows with
|
|
115
|
-
"moved since" markers and a **re-spawn** action (preview → apply, then retire
|
|
116
|
-
the old instance — module homes answer `E_UNSUPPORTED_MODE` to
|
|
117
|
-
`session recompose` by design; an instance never changes under itself); the
|
|
118
|
-
soul-source row; quarantine state from `rollbackIncomplete` with the retry
|
|
119
|
-
action (`oats retire`) and `--force` behind a confirm.
|
|
120
|
-
|
|
121
|
-
**F5 — Redesign frames** (the original Phase 3 deliverable, excl. 05/06),
|
|
122
|
-
implemented on top of F1–F4 rather than on the 0.24 model.
|
|
123
|
-
|
|
124
|
-
**F7 — Side panels redesigned, teams everywhere (human, 2026-09-25). This
|
|
125
|
-
supersedes the frames and the text above wherever they differ.** One Desktop PR:
|
|
126
|
-
- **Side panels** in the spawn modal's design language (frame 01a):
|
|
127
|
-
- an identity header and compact cards;
|
|
128
|
-
- only useful facts (no "Not reported" rows), and empty sections hidden;
|
|
129
|
-
- relative dates, and shortened paths with Copy;
|
|
130
|
-
- errors as one plain sentence, with the code behind Details;
|
|
131
|
-
- discoverable cross-links between an instance and its soul.
|
|
132
|
-
- **Terminal-side context panel tabs, in order:** Instance · Soul · Git & GitHub.
|
|
133
|
-
- **Teams, per surface** (teams contract `docs/design/2026-09-25-teams-contract.md`):
|
|
134
|
-
- **Soul** (Workspace inspector): the soul's labels, primary marked, each
|
|
135
|
-
joinable or "not mapped by this workspace". Read-only, from
|
|
136
|
-
`inspect --soul` `teams`.
|
|
137
|
-
- **Instance** (Workspace inspector and the terminal-side Instance tab): the
|
|
138
|
-
live panel (#178). Personal is always on; joined teams have Leave, and
|
|
139
|
-
joinable ones have Join.
|
|
140
|
-
- **Spawn modal, main form** (not Developer settings), a Teams row:
|
|
141
|
-
- "Personal team — always", fixed;
|
|
142
|
-
- each joinable label as an unchecked checkbox, sent as
|
|
143
|
-
`--provider <messaging> join=<a,b>`;
|
|
144
|
-
- unmapped labels greyed with the reason;
|
|
145
|
-
- the line "By default it's only in your personal team. Tick the teams it
|
|
146
|
-
should also join."
|
|
147
|
-
|
|
148
|
-
The row is shown iff the preview carries `teams` AND the messaging
|
|
149
|
-
module's preview row lists `join` in `declares` (feature
|
|
150
|
-
`settings-declared`; the Desktop gates on declared facts, never on
|
|
151
|
-
versions).
|
|
152
|
-
- **Second human redirect (QA, same day):** unmapped labels are not shown
|
|
153
|
-
anywhere (no greyed rows, no "not mapped" text), and Teams in the spawn
|
|
154
|
-
modal is one row styled like Relationship.
|
|
155
|
-
|
|
156
|
-
**F6 — Version and doctor surface.** `oats version --json` and `oats doctor
|
|
157
|
-
--json` in an About/Health pane; `ACCEPT_RANGE` and the three pins move to
|
|
158
|
-
`>=0.25.6`; a kernel below the floor is refused with the upgrade command shown.
|
|
159
|
-
|
|
160
|
-
Order: F1 → F2 → F3 → F4 → F5 → F6, or F1 then F3/F4 in parallel if the engineer
|
|
161
|
-
spawns children (its call; the lead reviews each PR).
|
|
162
|
-
|
|
163
|
-
## 3. What the engineer must LEARN first (before F1)
|
|
164
|
-
|
|
165
|
-
Read, in this order, in the checked-out main:
|
|
166
|
-
1. `docs/workspaces.md` — the v2 model end to end (deployment vs workspace,
|
|
167
|
-
members, packages, payloads, `byTeam`, hosting).
|
|
168
|
-
2. the 0.25 rebuild guide (removed in 0.26.0; `docs/configuration.md` and
|
|
169
|
-
`oats onboard` now) — how an operator builds a deployment (this is the
|
|
170
|
-
flow F2 wraps).
|
|
171
|
-
3. `docs/desktop-cli-api.md` — every JSON surface, with examples; note
|
|
172
|
-
`features[]`, `decision.effective.providers`, `instances[].identity`.
|
|
173
|
-
4. `docs/design/2026-09-23-workspace-module-contracts.md` §0.25.x — what
|
|
174
|
-
changed per release and why.
|
|
175
|
-
5. `agents/oats-expert/soul/knowledge/decisions/workspace-model-v2.md` and
|
|
176
|
-
`…/served-identity-is-a-messaging-layer-fact.md` — the decisions.
|
|
177
|
-
6. `test/fixtures/northwind/build.mjs` — the two-team fixture workspace; run
|
|
178
|
-
`node --test test/spawn-workspace.test.mjs` once and read what a v2 spawn
|
|
179
|
-
produces on disk (`.oats/modules/`, `instance.json` `modules`/`providers`/
|
|
180
|
-
`workspace.soul.id`).
|
|
181
|
-
|
|
182
|
-
Then build a scratch deployment by hand with the CLI (`oats onboard`, `oats
|
|
183
|
-
sync`, `oats sync --approve`, `oats spawn --preview`, `oats spawn --no-launch`,
|
|
184
|
-
`oats status`, `oats inspect`, `oats retire`) against the Northwind fixture
|
|
185
|
-
remotes, and keep the transcript: F1's tests are written against exactly those
|
|
186
|
-
JSON shapes.
|
|
187
|
-
|
|
188
|
-
## 3b. Native rework, not a compatibility layer (human, 2026-09-24)
|
|
189
|
-
|
|
190
|
-
The human's rule, verbatim intent: *"do a native rework — do not keep v1-specific
|
|
191
|
-
things, and no v1 modules calling v2 modules."* Concretely:
|
|
192
|
-
|
|
193
|
-
- **Remove, do not wrap.** A 0.24 reader (`server/deployment.mjs`'s
|
|
194
|
-
`oats-config.yaml`/`soul.yaml`/manifest parsing, `local-agents/`,
|
|
195
|
-
`.agents/capabilities/installed/`, the `oats catalog` DTO) is deleted in the
|
|
196
|
-
slice that replaces it — never kept behind a flag, a fallback branch, or an
|
|
197
|
-
"if the kernel is old" path. The Desktop supports one kernel line
|
|
198
|
-
(`ACCEPT_RANGE` from 0.25.6) and refuses older ones with the upgrade command.
|
|
199
|
-
- **No adapters between generations.** No module whose job is to translate a
|
|
200
|
-
v1-shaped object into a v2-shaped one or vice versa (no `legacyRosterToV2()`,
|
|
201
|
-
no `toOldCard()`); the v2 kernel JSON is consumed where it is read and shaped
|
|
202
|
-
once for rendering. If a v1 module still needs a v2 fact, the v1 module is
|
|
203
|
-
the thing being replaced — replace it, do not feed it.
|
|
204
|
-
- **Names and types follow v2.** Types, fields and UI labels use the kernel's
|
|
205
|
-
vocabulary (workspace, member, package, module, deployment, soul source,
|
|
206
|
-
served identity); 0.24 vocabulary (installed capability, config chain, team
|
|
207
|
-
block, agents root as identity) leaves the codebase with the code that used
|
|
208
|
-
it. `git grep` for the old terms is part of each slice's exit check.
|
|
209
|
-
- **Tests follow the same rule.** Fixtures shaped like 0.24 deployments are
|
|
210
|
-
deleted with the readers; new fixtures are v2 deployments produced by the
|
|
211
|
-
kernel (Northwind or a hand-built scratch deployment), not hand-written
|
|
212
|
-
JSON imitating old shapes.
|
|
213
|
-
- **One exception, stated per case.** Where a 0.24 concept has a genuine v2
|
|
214
|
-
successor with the same meaning and the Desktop code is already correct for
|
|
215
|
-
it (a terminal broker, a tmux target admission), it stays — the PR names it
|
|
216
|
-
as "unchanged, v2-agnostic", not as "kept for compatibility".
|
|
217
|
-
|
|
218
|
-
Exit check for Phase F as a whole: no file under `packages/desktop/` reads a
|
|
219
|
-
deployment file, names a 0.24 concept, or contains a code path that exists
|
|
220
|
-
only for a kernel below the floor.
|
|
221
|
-
|
|
222
|
-
## 4. Rules that do not change
|
|
223
|
-
|
|
224
|
-
- `packages/desktop/**` only; kernel gaps go to the lead as a written ask
|
|
225
|
-
(they become kernel PRs; the engineer never adds a Desktop-side parser to
|
|
226
|
-
work around one).
|
|
227
|
-
- No native tmux/PTY/Electron execution by the agent; the lead's native gate
|
|
228
|
-
at review time is the acceptance.
|
|
229
|
-
- Every slice: focused tests + the intended mutants on the new code; the
|
|
230
|
-
Desktop suite green; one PR per slice against main; lead's pr-review.
|
|
231
|
-
- The design frames are the visual authority; the kernel JSON is the data
|
|
232
|
-
authority; where a frame shows a 0.24 concept (an "installed capability"
|
|
233
|
-
list, a `team:` block), the frame is adapted to the v2 concept and the
|
|
234
|
-
adaptation noted in the PR.
|
|
235
|
-
|
|
236
|
-
## 5. Acceptance for Phase F as a whole
|
|
237
|
-
|
|
238
|
-
The lead builds a fresh v2 deployment from the Northwind fixture using ONLY the
|
|
239
|
-
Desktop (open → onboard → sync → approve → spawn with a global identity →
|
|
240
|
-
inspect → retire) on kernel 0.25.6+, and every fact shown matches `oats status
|
|
241
|
-
--json` / `oats inspect --json` byte for byte. Nothing in
|
|
242
|
-
`packages/desktop/server` reads a deployment file.
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
# Phase D — the OATS project runs on the architecture it offers (plan)
|
|
2
|
-
|
|
3
|
-
> **Vocabulary (2026-09-26):** there is no "personal team". Read it below as **the workspace's default team**. See the AMENDMENT at the top of [the teams contract](2026-09-25-teams-contract.md). This document is a record and keeps its original wording.
|
|
4
|
-
|
|
5
|
-
**Status**: plan, 2026-09-24, lead. Decisions 18–22 of the workspace model, the
|
|
6
|
-
five-soul roster and its 2026-09-24 amendment, the human's sequencing
|
|
7
|
-
("knowledge centralisation first"; "do not retire live souls until their
|
|
8
|
-
instances retire"). Mailed to the human and the OSS coordinator before the
|
|
9
|
-
first swarm. Method per standing instruction: write → swarm build →
|
|
10
|
-
adversarial-review swarm → PR → main; releases under delegated authority.
|
|
11
|
-
|
|
12
|
-
## Co-leads and lanes (human, 2026-09-24)
|
|
13
|
-
|
|
14
|
-
The human made the two `oats-expert` instances — the redesign lead
|
|
15
|
-
(`oats-expert-knowledge-reworks`) and the maintainer of the second deployment
|
|
16
|
-
(`oats-expert-antares`) — **co-leads with equivalent authority**, who agree on
|
|
17
|
-
pushes. Agreed by both on 2026-09-24:
|
|
18
|
-
|
|
19
|
-
| Lane | Owner | Status |
|
|
20
|
-
|---|---|---|
|
|
21
|
-
| Desktop Phase F (engineer PRs, native gates) | lead | assigned |
|
|
22
|
-
| Kernel (`lib/`, `bin/`; kernel gaps raised by anyone) | lead | assigned |
|
|
23
|
-
| Releases 0.25.7 and D5 (catalog + 0.26.0) | lead | assigned |
|
|
24
|
-
| oats.aweb 1.13.0 re-land end to end | Antares | assigned |
|
|
25
|
-
| D1 operator node + integrations node | Antares | assigned (draft PR `d1/operator-node` handed over) |
|
|
26
|
-
| aweb and okf package-expert seams | Antares | assigned |
|
|
27
|
-
| D2, D3, D4, desktop + kernel bundle migrations (D1 remainder) | lead, driven by the child instance `oats-expert-phase-d` | assigned (human, 2026-09-24: picked up by the lead's side after all, so as not to wait on the other deployment's human). The lead reviews and merges; Class B items go to Antares for ACK; D3's aweb/okf seams are drafted by the driver and settled with Antares. **Antares is a REQUIRED cross-reviewer** on D4's `oats.setup` rewrite (it must not drift from the operator node) and on D3's `aweb-expert` and `okf-expert` souls (the seams); the rest of the driver's PRs it reads without gating. |
|
|
28
|
-
|
|
29
|
-
**Push protocol.**
|
|
30
|
-
- **Class A** — notify after, one line: stewardship, docs and knowledge inside
|
|
31
|
-
one's own lane or node; merging a PR the other co-lead approved in writing;
|
|
32
|
-
merging one's own lane's PR after the other co-lead's review; the bump PR of
|
|
33
|
-
an agreed release.
|
|
34
|
-
- **Class B** — `PUSH INTENT: <what> @ <commit/PR>` → `ACK <message-id>` before
|
|
35
|
-
acting: tags, releases, npm publishes, catalog pins; framework-behaviour
|
|
36
|
-
changes (kernel semantics, OKF/memory contracts, workspace config semantics,
|
|
37
|
-
published skills); merges into the other's lane; reverts, force-anything,
|
|
38
|
-
branch or tag deletion. A blocking intent unanswered for about 45 minutes goes
|
|
39
|
-
to the human, never to action.
|
|
40
|
-
- **Amendment (the human, 2026-09-26 ~14:00Z): "do the merge then fix if something broke".**
|
|
41
|
-
- A PR the lead has reviewed and approved is **merged immediately** by the lead (`gh pr merge --squash --match-head-commit <approved oid>`), without waiting for PR CI. CI runs on main after the merge.
|
|
42
|
-
- A red main is fixed forward at once, by the author or the lead, before anything else merges.
|
|
43
|
-
- **Tags still wait for main CI green on their exact SHA** (a tag never moves).
|
|
44
|
-
- Developers run only the affected suites locally (the nested globs included). The full glob and `smoke:tarball` run in CI, sharded ×6.
|
|
45
|
-
- The watcher no longer relays merges.
|
|
46
|
-
- **Amendment (the human, 2026-09-26 ~13:10Z): "lets approve and tag ourselves all of these PRs".**
|
|
47
|
-
- With the co-lead unresponsive since ~10:30Z, the lead's review + green CI is the full Class B gate, in BOTH lanes: merges, okf/aweb tags, catalog pins, releases.
|
|
48
|
-
- Every such act is logged, with its head/tag oid, in a running account mailed to the co-lead for after-the-fact review.
|
|
49
|
-
- The co-lead's objections then go to the human, and a revert follows only on the human's word.
|
|
50
|
-
- This ends when the co-lead resumes and the lead records that here.
|
|
51
|
-
- Every PR is reviewed by the co-lead who did not author it (a helper's PR is
|
|
52
|
-
reviewed by its own lead, inside that lead's lane). A disagreement not settled
|
|
53
|
-
in two mails goes to the human. Standing rules unchanged: PR CI is the full
|
|
54
|
-
gate; published tags never move; no destructive git on shared checkouts.
|
|
55
|
-
- `main` on these repositories carries no branch or tag protection: the parity
|
|
56
|
-
gate and the cross-review are the only things between a merge and `main`.
|
|
57
|
-
|
|
58
|
-
## Human decision (2026-09-24): no package approval
|
|
59
|
-
|
|
60
|
-
**Package approval is removed from the kernel and from the Desktop.** People
|
|
61
|
-
install a package only when they trust it. Declaring it in the workspace's
|
|
62
|
-
`packages:` IS the trust decision, so there's no second, per-version approval
|
|
63
|
-
step. This supersedes the "executables approved once per version" rule in
|
|
64
|
-
`docs/workspaces.md` (§ Packages, lock, approval, catalog) and everything built
|
|
65
|
-
on it:
|
|
66
|
-
- `oats sync` exit 2 for pending approvals and `approvalNeeded`
|
|
67
|
-
- `--approve <id>@<version>` and the interactive prompt
|
|
68
|
-
- the lock's `approved` record
|
|
69
|
-
- `E_PACKAGE_UNAPPROVED` at spawn and dispatch
|
|
70
|
-
- the Desktop F2 approval flow (`E_APPROVAL_STALE`)
|
|
71
|
-
- the planned pinned `--approve …=<digest>`
|
|
72
|
-
|
|
73
|
-
What stays: the lock still pins each package to the exact commit and integrity,
|
|
74
|
-
and restore still refuses drift (`E_PACKAGE_INTEGRITY`). Reproducibility is not
|
|
75
|
-
approval. It's a breaking contract change, so it ships in a minor release, and
|
|
76
|
-
the Desktop requires that kernel.
|
|
77
|
-
|
|
78
|
-
## Slices, in order
|
|
79
|
-
|
|
80
|
-
### D1 — Knowledge centralisation (IN PROGRESS)
|
|
81
|
-
|
|
82
|
-
Goal: every roster soul's knowledge lives in the central base
|
|
83
|
-
`awebai/oats-knowledge` (OKF 2.1.4), one owned node each; the in-repo
|
|
84
|
-
`agents/*/soul/knowledge` bundles stop receiving writes and are decommissioned
|
|
85
|
-
when no live instance links them.
|
|
86
|
-
|
|
87
|
-
Done: nodes `oats-operator-expert` and `integrations-expert` chartered
|
|
88
|
-
(oats-knowledge PR #3); eight attributed seeds landed in
|
|
89
|
-
`agents/oats-expert/soul/knowledge/inbox` (oats PR #121); the roster amendment
|
|
90
|
-
accepted; the rule "no per-soul knowledge merges" in force.
|
|
91
|
-
|
|
92
|
-
Work:
|
|
93
|
-
1. **Copy-migrate by judgement** (the 2026-09-21 method: two-part test plus the
|
|
94
|
-
2026-09-24 recipe refinement; not copying): `agents/oats-expert/soul/knowledge`
|
|
95
|
-
(~130 files) → node `oats-expert`; `agents/oats-desktop-engineer/soul/knowledge`
|
|
96
|
-
(~120) → `oats-desktop-expert`; `agents/cli-dev/soul/knowledge` (~155) →
|
|
97
|
-
`oats-kernel-expert`; `agents/integrations-expert/soul/knowledge` (13) →
|
|
98
|
-
`integrations-expert`. Others (`dev-coordinator`, `docs-expert`, `ux-designer`,
|
|
99
|
-
`lead`, `oats-coordinator`) are assessed for the few universal concepts they
|
|
100
|
-
hold and otherwise not carried. One PR per node on oats-knowledge, reviewed
|
|
101
|
-
by the lead; the OSS coordinator reviews the operator and integrations PRs.
|
|
102
|
-
2. **Seed the operator node** — attributed to `oats-expert-antares`:
|
|
103
|
-
MOVE (not copy) from the oats-expert bundle: `lessons/the-aweb-team-root-must-sit-where-the-spawn-hook-looks`,
|
|
104
|
-
`lessons/okf-state-directory-must-sit-outside-every-work-tree`,
|
|
105
|
-
`lessons/capability-trust-hash-covers-the-installation-record`,
|
|
106
|
-
`lessons/a-locally-minted-oats-identity-has-no-cross-team-first-contact-address`,
|
|
107
|
-
`lessons/stale-checkout-serves-stale-soul`,
|
|
108
|
-
`playbooks/rebuild-a-deployment-in-scratch-against-local-bare-remotes`;
|
|
109
|
-
generalise the R1–R10 rebuild findings and the published-combination
|
|
110
|
-
verifications from `stewardship/delivery-log` (the log keeps the record).
|
|
111
|
-
From the inbox: `check-the-record-before-redesigning-identity`,
|
|
112
|
-
`grant-custody-service-and-renewal-belong-on-the-custody-host` (operator
|
|
113
|
-
half), `the-wake-broker-accepts-a-grant-home`.
|
|
114
|
-
3. **Seed the integrations node** — from the inbox:
|
|
115
|
-
`a-merged-provider-payload-cannot-enforce-host-only-keys`,
|
|
116
|
-
`aw-grant-commands-resolve-the-identity-from-cwd-only` (discipline half),
|
|
117
|
-
`oats-runtime-requirements-for-grant-backed-resident-operation`; from the
|
|
118
|
-
integrations-expert bundle: `fake-aw-must-model-real-refusals` and the rest
|
|
119
|
-
of this week's harvested lessons.
|
|
120
|
-
4. **Route the remainder of the inbox**: aweb package expert (D3) gets
|
|
121
|
-
`aweb-grants-are-team-bound-to-the-custody-identitys-active-team`,
|
|
122
|
-
`a-grant-signed-send-must-name-the-subject-as-sender` and the aw halves;
|
|
123
|
-
kernel expert gets `path-keyed-owner-registry-breaks-under-per-commit-soul-copies`.
|
|
124
|
-
5. **Rebind the souls** in `souls/<name>/`: the `knowledge:` grammar there is
|
|
125
|
-
still 0.24's (`capability` + `source: git:…@v2.1.2#oats-package`); v2 is
|
|
126
|
-
`capabilities: { oats.okf: { from: package } }` plus `okf.json`
|
|
127
|
-
(`{ version: 1, owner: <node owner uuid>, owns: ["oats/<node>"], reads: [...] }`)
|
|
128
|
-
and the store `oats` naming `awebai/oats-knowledge` / `knowledge` / `main`.
|
|
129
|
-
Add `souls/oats-operator-expert` (rename of `oats-setup-expert`, keeps the
|
|
130
|
-
`oats.setup` charter) and `souls/integrations-expert`.
|
|
131
|
-
6. **Do NOT delete** `agents/<n>/soul/knowledge` or the legacy souls while a
|
|
132
|
-
live instance links them (human rule). Record which are live; decommission
|
|
133
|
-
as they retire; new spawns use `souls/<n>`.
|
|
134
|
-
7. **Release playbook** (`oats-expert` node, stewardship area): landing order
|
|
135
|
-
for provider PRs (tag → pin on the branch → squash; a bundled provider never
|
|
136
|
-
lands ahead of its tag), the version literals to bump on a catalog bump,
|
|
137
|
-
the mirror checker, the bump-PR step. First entries: today's two lessons.
|
|
138
|
-
|
|
139
|
-
### D2 — The OATS workspace as a v2 workspace (decisions 18, 19, 21)
|
|
140
|
-
|
|
141
|
-
`oats-workspace.yaml` at the `oats` repo (name `oats`; members = the seven
|
|
142
|
-
framework repos incl. `oats` itself; `packages:` = oats.framework / okf / aweb /
|
|
143
|
-
jira / linear / authoring / dev pinned from the catalog; `defaults.capabilities`
|
|
144
|
-
= `oats.core` from package + knowledge `oats.okf`); `oats-membership.yaml` ×7
|
|
145
|
-
(each package repo is a member AND a package publisher — non-collapse:
|
|
146
|
-
`packages:` resolves it as a package, membership only grants trust and a soul).
|
|
147
|
-
`package-catalog.json` stays the official marketplace (decision 21); the `oats`
|
|
148
|
-
repo keeps `oats-dev` as dev capabilities. A fresh deployment directory (asked
|
|
149
|
-
for, never named by convention — decision 9) is the acceptance: `oats onboard`
|
|
150
|
-
→ `sync` → `approve` → spawn every roster soul `--no-launch`.
|
|
151
|
-
|
|
152
|
-
### D3 — Souls to `souls/<name>` and the six package-expert souls (decision 20)
|
|
153
|
-
|
|
154
|
-
Each package repo carries `souls/oats-<pkg>-expert` (oats-okf-expert,
|
|
155
|
-
oats-aweb-expert, oats-jira-expert, oats-linear-expert, oats-authoring-expert,
|
|
156
|
-
oats-dev-expert), the expert in that package, with a node in the central base
|
|
157
|
-
from day one. **Messaging (human, 2026-09-24; supersedes the lead's per-soul rule):**
|
|
158
|
-
`oats.aweb` is the workspace's messaging **default**
|
|
159
|
-
(`defaults.messaging: { oats.aweb: { from: package } }`, oats#140); a soul
|
|
160
|
-
without messaging says `messaging: none`. The human calls it "the most
|
|
161
|
-
important capability, and most workspaces will use it as default", so the
|
|
162
|
-
provider must work well as a default. Open items (oats.aweb unless noted):
|
|
163
|
-
an unconfigured default must not make every soul unspawnable (onboarding sets
|
|
164
|
-
the messaging root before the first spawn, and/or an unconfigured provider
|
|
165
|
-
reports what is missing instead of refusing); error texts and `setup` must stop
|
|
166
|
-
pointing at `oats-config.yaml`; the deployment names its messaging root
|
|
167
|
-
explicitly rather than by search; `aw mail` usable from `work/`; retired aliases
|
|
168
|
-
reusable. Kernel (lead): in v2 the team scope is the deployment directory and
|
|
169
|
-
the team id comes from the messaging payload, not the classic `team:` block.
|
|
170
|
-
#140 merges together with the first answer to the unspawnable-default item.
|
|
171
|
-
**Teams (human, 2026-09-24): seamless by default.** (R1) Every person gets a
|
|
172
|
-
**personal team per workspace**, created on first use with no invite and no
|
|
173
|
-
manual initialisation — two people, or one person on two workspaces, get
|
|
174
|
-
separate teams; stable across one person's machines. (R2) When a soul whose
|
|
175
|
-
`team:` label the workspace maps to a shared team (`messaging.byTeam.<label>.team`)
|
|
176
|
-
is spawned, the instance **joins that team seamlessly**. Authorization for R2
|
|
177
|
-
(what entitles a person to join without an invite) is oats.aweb's design call
|
|
178
|
-
with the aweb project, fail-closed and visible when the entitlement is missing.
|
|
179
|
-
Kernel (lead): pass the soul's team label and the workspace identity so the
|
|
180
|
-
provider derives the personal team deterministically; an unmapped team means
|
|
181
|
-
"personal". The onboarding skill's manual invite-then-join step is the 1.12.0
|
|
182
|
-
path and is rewritten when the provider ships R1/R2.
|
|
183
|
-
**Teams, re-stated as THE priority (human, 2026-09-25; amends R1/R2):**
|
|
184
|
-
"As long as we don't have this working seamlessly, people won't understand
|
|
185
|
-
things." The two most important messaging behaviours, above every other
|
|
186
|
-
messaging item:
|
|
187
|
-
- **(R1) A personal team by default.** A user's agents in a workspace get
|
|
188
|
-
that person's personal team for the workspace with no setup step. This is
|
|
189
|
-
the default whenever the workspace maps nothing else.
|
|
190
|
-
- **Defaults and joining (human, later the same day; refines R1/R2′):**
|
|
191
|
-
- By default an instance is in the person's personal team ONLY, even when
|
|
192
|
-
its soul names teams.
|
|
193
|
-
- Joining a wider team is explicit: a spawn choice, or at any point of the
|
|
194
|
-
instance's life one simple command, run by the human, another agent, or
|
|
195
|
-
the instance when told to. It covers only the soul's labels the workspace
|
|
196
|
-
maps.
|
|
197
|
-
- The Desktop offers these controls.
|
|
198
|
-
- Personal teams are per WORKSPACE: one personal team spanning several
|
|
199
|
-
workspaces is wrong, and aweb's per-workspace get-or-create (abjj) is
|
|
200
|
-
urgent. Nobody uses OATS in production yet, which is what keeps this a
|
|
201
|
-
fix and not a migration.
|
|
202
|
-
- Contract: `docs/design/2026-09-25-teams-contract.md`.
|
|
203
|
-
- **(R2′) Wider teams, at spawn AND during an instance's life.** When a soul
|
|
204
|
-
belongs to one or more wider teams, its instance is also included in each
|
|
205
|
-
team the soul specifies, both at spawn and at any later point of its life,
|
|
206
|
-
not only at spawn. The teams are exactly those the workspace defines
|
|
207
|
-
(`messaging.byTeam` / the workspace's team labels); no team outside the
|
|
208
|
-
workspace's definition, and none silently missing. R2′ supersedes R2's
|
|
209
|
-
"is spawned … joins": joining is a lifetime operation, and a soul may name
|
|
210
|
-
several teams.
|
|
211
|
-
Both are oats.aweb's (Antares) with aweb primitives. **The kernel's share is
|
|
212
|
-
the lead's:**
|
|
213
|
-
- today `soul.team` is ONE label (docs/soul.schema.json), and the messaging
|
|
214
|
-
payload merges `byTeam[soul.team]` for that one label. "Team/teams" needs a
|
|
215
|
-
soul to name several team labels, and the payload to carry each mapped
|
|
216
|
-
team's entry (not one merged view), so the provider can join all of them;
|
|
217
|
-
- the workspace identity and the person's identity reach the provider, so
|
|
218
|
-
the personal team derives deterministically;
|
|
219
|
-
- a lifecycle entry point for "join now" during an instance's life (for
|
|
220
|
-
example, a provider operation or hook run against a live home when the
|
|
221
|
-
workspace's teams or the soul's team labels change at a new commit).
|
|
222
|
-
The contract shape is decided with Antares and recorded as a Decision before
|
|
223
|
-
code. **Human, same day:** the primitives must be seamlessly integrated into
|
|
224
|
-
the aweb messaging capability (acceptance is the oats.aweb experience: no
|
|
225
|
-
manual `aw team …` anywhere we ship, and live instances follow the
|
|
226
|
-
workspace's teams), and kernel changes are in scope, so the provider is not
|
|
227
|
-
bent around today's kernel.
|
|
228
|
-
**Naming (lead, 2026-09-24):** the `oats-` prefix on all six —
|
|
229
|
-
it matches the repository names and the roster's `oats-kernel-`/`oats-desktop-`/
|
|
230
|
-
`oats-operator-expert`, and it keeps instance aliases from colliding with the
|
|
231
|
-
messaging project's own `aweb-expert` soul on a shared team. **Seams named in the
|
|
232
|
-
charters** (roster amendment): `oats-aweb-expert` READS
|
|
233
|
-
`aweb-protocol-expert` in base `aweb-oss-knowledge` (repo
|
|
234
|
-
`github.com/awebai/aweb`, root `knowledge/`, branch `main`, OKF 2.1.x
|
|
235
|
-
descriptor at `knowledge/okf-base.json`; owner `1913b77b-…`) through a
|
|
236
|
-
read-only store reference; `oats-okf-expert` names its seam to the knowledge-theory
|
|
237
|
-
material in `oats-expert`. Whether the aweb bookshelf decisions the program
|
|
238
|
-
rests on are published into that node is the aweb side's call (asked).
|
|
239
|
-
|
|
240
|
-
### D4 — `oats.core` and `oats.setup` rewritten (decision 22, W9b)
|
|
241
|
-
|
|
242
|
-
Not patched: written for the v2 world. `oats.core`: home layout, `oats status`
|
|
243
|
-
with modules/soul/identity rows, spawn preview → apply, `sync --approve`, the
|
|
244
|
-
two-directory boundary, what a module is. `oats.setup` (held by
|
|
245
|
-
`oats-operator-expert`): onboarding that ASKS for the deployment directory and
|
|
246
|
-
the workspace URL, the hosting rule (decision 26), the public-member executable
|
|
247
|
-
rule, the rebuild guide as procedure with the operator node as rationale.
|
|
248
|
-
Developer souls in `oats.dev` gain `promotesTo: <node>` (roster amendment);
|
|
249
|
-
the harvester delivers to that node as a PR the owning expert reviews.
|
|
250
|
-
|
|
251
|
-
**D4 also removes the legacy the v2 model already declared gone** (human,
|
|
252
|
-
2026-09-24; boundary §3b's native-rework rule applied to the repository):
|
|
253
|
-
- **Docs, skills, examples** (driver, in D4): delete what v2 removed rather than
|
|
254
|
-
rewriting it (e.g. the OAS migration guide, the legacy Desktop succession
|
|
255
|
-
doc, `oats-config.yaml` examples, the `oats-config` skill); rewrite what
|
|
256
|
-
survives against `oats-local.yaml` and the workspace file; every remaining
|
|
257
|
-
mention of `oats-config.yaml` either describes its removal or is gone.
|
|
258
|
-
- **Kernel** (lead, one Class B PR after D2 lands, because the OATS workspace
|
|
259
|
-
itself stops reading `oats-config.yaml` only once D2 converts it): the
|
|
260
|
-
`oats-config.yaml` scope chain and its readers, the `local-agents/` and
|
|
261
|
-
`tmp-agents/` layouts, the OAS-scope probes, the installed-capability tier
|
|
262
|
-
remnants. Removed, not flagged; the `REMOVED_VERBS` answers stay.
|
|
263
|
-
- **In-repo package copies** (`capabilities/oats-{okf,aweb,jira,linear,authoring}`)
|
|
264
|
-
are NOT removed in D4: `package.json` ships `capabilities/` as the kernel's
|
|
265
|
-
bundled providers, pinned by the mirror-parity, release-packaging and
|
|
266
|
-
clean-room tests. Whether 0.26.0 still bundles them is a release decision
|
|
267
|
-
for D5 (lead); until then they stay unmarked. `private` becomes a schema key
|
|
268
|
-
(the kernel already reads it); `oats-review` is marked private.
|
|
269
|
-
- **Legacy souls** (`agents/*` and their knowledge bundles) are NOT part of D4:
|
|
270
|
-
they go when the live instances linking them retire (human rule).
|
|
271
|
-
|
|
272
|
-
**Human direction 2026-09-25: runtime → harness** ("throughout the app and cli and everywhere"). It ships in 0.26.0 as one kernel PR after (e):
|
|
273
|
-
- every kernel-owned name is renamed with no alias (`--harness`, `launch-configs.<n>.harness`, `instance.json.harness`, JSON fields, feature `harness`);
|
|
274
|
-
- two released-contract aliases stay: the provider env sets both `OATS_HARNESS` and `OATS_RUNTIME`, and manifests may say `requires[].runtime` or `requires[].harness`;
|
|
275
|
-
- the Desktop switches on the `harness` feature.
|
|
276
|
-
|
|
277
|
-
**Human direction 2026-09-25 (~17:20Z), amending the above: release 0.26.0 WITHOUT the harness rename; harness ships as a separate, later release.**
|
|
278
|
-
- 0.26.0 ships main as it stands once the in-flight PRs land: (e), K, the teamsOf check, `layers.<layer>.from`, and Desktop F7. It keeps the `runtime` names everywhere.
|
|
279
|
-
- The harness rename (the kernel PR, with the alias addendum: env `OATS_RUNTIME`, stdin `launch.runtime`, manifest `agents[].runtime`/`requires[].runtime`, `spawn --runtime`) ships in the **next minor, 0.27.0**. It is a breaking CLI/JSON change (`--runtime` refused on session/launch-config, `version.runtimes` dropped, launch-configs field renamed), so it isn't a patch. It ships together with the Desktop's switch on feature `harness`, and the Desktop's accepted kernel range widens to include 0.27.
|
|
280
|
-
- Neither the kernel harness PR nor the Desktop switch merges to main before the v0.26.0 tag.
|
|
281
|
-
|
|
282
|
-
Also: "core capabilities" is the human vocabulary for the knowledge/messaging/tasks capabilities in prose; wire names are unchanged.
|
|
283
|
-
|
|
284
|
-
### D5 — Catalog update and 0.26.0
|
|
285
|
-
|
|
286
|
-
Catalog pins for the new package versions; **widen Desktop `ACCEPT_RANGE` and
|
|
287
|
-
the three pins FIRST** (minor bump rule); release notes; tag; the fresh
|
|
288
|
-
deployment from D2 rebuilt on the published artefacts by the OSS coordinator
|
|
289
|
-
(outsider verification) before the program board marks Phase D done.
|
|
290
|
-
|
|
291
|
-
## Adversarial review (per slice)
|
|
292
|
-
|
|
293
|
-
Each slice's swarm is followed by a review swarm with the standing lenses
|
|
294
|
-
(direction against the decisions; correctness by reproduction; security —
|
|
295
|
-
trust at acquisition, hoisted paths, hook approval, host-only keys; docs as
|
|
296
|
-
contract — every guide claim has a test), plus two Phase-D-specific ones: **the
|
|
297
|
-
outsider** (can a reader who was not in the room set OATS up from `oats.setup`
|
|
298
|
-
alone?) and **the seam** (does every cross-project read resolve to a real node
|
|
299
|
-
with a real owner?).
|
|
300
|
-
|
|
301
|
-
## Out of scope
|
|
302
|
-
|
|
303
|
-
Desktop (Phase F, its own boundary); oats.aweb 1.13.0 re-land (held on the
|
|
304
|
-
aweb release); legacy `~/OATS` deployment cutover (the operator's, on the
|
|
305
|
-
published 0.26.0).
|