@awebai/oats 0.30.0 → 0.30.2
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/bin/oats.mjs +1 -1
- package/docs/capabilities.md +3 -3
- package/docs/design/2026-09-23-workspace-module-contracts.md +2 -1
- package/docs/desktop-cli-api.md +23 -11
- package/docs/first-team.md +1 -1
- package/docs/implementation.md +2 -1
- package/docs/integrations.md +1 -1
- package/docs/knowledge-capability-authoring.md +1 -1
- package/docs/knowledge.md +4 -4
- package/docs/official-catalog.md +4 -4
- package/docs/packages.md +13 -13
- package/docs/plans/0.30-close-out.md +24 -2
- package/docs/release-lane.md +7 -2
- package/docs/release-notes/v0.30.1.md +123 -0
- package/docs/release-notes/v0.30.2.md +85 -0
- package/docs/souls-and-instances.md +6 -5
- package/docs/workspaces.md +7 -2
- package/lib/core.mjs +42 -28
- package/lib/instance-inspect.mjs +1 -1
- package/lib/instance-resolution.mjs +15 -8
- package/lib/materialize.mjs +33 -19
- package/lib/packages.mjs +1 -1
- package/lib/resolve.mjs +1 -1
- package/package-catalog.json +3 -3
- package/package.json +1 -3
- package/skills/oats-getting-started/SKILL.md +2 -2
- 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 -1672
- package/capabilities/oats-aweb/injects/aweb.md +0 -47
- package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -365
- 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 -201
- 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 -286
- package/capabilities/oats-code-review/injects/reviewer.md +0 -26
- package/capabilities/oats-code-review/oats.json +0 -16
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +0 -66
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +0 -30
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +0 -56
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +0 -34
- package/capabilities/oats-developer/injects/developer.md +0 -38
- package/capabilities/oats-developer/oats.json +0 -17
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +0 -43
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +0 -47
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +0 -65
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +0 -37
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +0 -36
- package/capabilities/oats-engineering-expert/injects/expert.md +0 -37
- package/capabilities/oats-engineering-expert/oats.json +0 -17
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +0 -37
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +0 -52
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +0 -50
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +0 -53
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +0 -49
- 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 -213
- package/capabilities/oats-okf/injects/okf.md +0 -42
- package/capabilities/oats-okf/lib/binding-wire.mjs +0 -380
- 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 -138
- 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 -438
- package/capabilities/oats-okf/lib/stores.mjs +0 -473
- package/capabilities/oats-okf/lib/worker.mjs +0 -486
- package/capabilities/oats-okf/oats.json +0 -151
- 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 -134
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +0 -26
- package/capabilities/oats-workspace-experts/oats.json +0 -9
package/bin/oats.mjs
CHANGED
|
@@ -2823,7 +2823,7 @@ function versionCmd() {
|
|
|
2823
2823
|
// Phase B: `instance-modules` and `spawn-provider-payload` are advertised only once spawn
|
|
2824
2824
|
// runs on resolve/materialize (contract §6); a feature the binary does not implement is
|
|
2825
2825
|
// never listed.
|
|
2826
|
-
console.log(JSON.stringify({ schemaVersion: 1, name: "@awebai/oats", version: OATS_VERSION, desktopApi: 1, harnesses: ["pi", "claude", "codex"], sessionBackends: ["tmux", "herdr"], launchOptions: ["yolo"], remote: ["spawn", "retire", "status", "session", "session-start", "session-restart", "launch-config", "roster", "harvest", "schedule", "session-upload", "operations"], features: ["retire-home", "session-start", "session-restart", "launch-config", "schedule", "session-upload", "operations", "instance-git", "instance-git-remote", "souls-declarations", "lifecycle-plans", "retire-retention", "readiness", "spawn-preview", "instance-events", "instance-events-2", "schedule-history", "schedule-read-2", "spawn-preview-2", "spawn-idempotency", "spawn-idempotency-2", "spawn-apply-2", "workspace-v2", "instance-modules", "spawn-provider-payload", "served-identity", "packages-no-approval", "spawn-name", "settings-origins", "team-model-2", "settings-declared", "capabilities-private", "layers-from", "harness", "package-souls", "triggers", "automations", "desktop-facts", "launch-preference"], automationsApi: A.AUTOMATIONS_API, workspaceApi: 2, instanceGitApi: 1, spawnApplyApi: 1, soulsApi: 2, lifecycleApi: 1, readinessApi: 2, spawnPreviewApi: 2, eventsApi: 2, scheduleHistoryApi: 3, scheduleApi: SCHEDULE_API, operationsApi: 2 }));
|
|
2826
|
+
console.log(JSON.stringify({ schemaVersion: 1, name: "@awebai/oats", version: OATS_VERSION, desktopApi: 1, harnesses: ["pi", "claude", "codex"], sessionBackends: ["tmux", "herdr"], launchOptions: ["yolo"], remote: ["spawn", "retire", "status", "session", "session-start", "session-restart", "launch-config", "roster", "harvest", "schedule", "session-upload", "operations"], features: ["retire-home", "session-start", "session-restart", "launch-config", "schedule", "session-upload", "operations", "instance-git", "instance-git-remote", "souls-declarations", "lifecycle-plans", "retire-retention", "readiness", "spawn-preview", "instance-events", "instance-events-2", "schedule-history", "schedule-read-2", "spawn-preview-2", "spawn-idempotency", "spawn-idempotency-2", "spawn-apply-2", "workspace-v2", "instance-modules", "spawn-provider-payload", "served-identity", "packages-no-approval", "spawn-name", "settings-origins", "team-model-2", "settings-declared", "capabilities-private", "layers-from", "harness", "package-souls", "triggers", "automations", "desktop-facts", "launch-preference", "preview-composed-from"], automationsApi: A.AUTOMATIONS_API, workspaceApi: 2, instanceGitApi: 1, spawnApplyApi: 1, soulsApi: 2, lifecycleApi: 1, readinessApi: 2, spawnPreviewApi: 2, eventsApi: 2, scheduleHistoryApi: 3, scheduleApi: SCHEDULE_API, operationsApi: 2 }));
|
|
2827
2827
|
return;
|
|
2828
2828
|
}
|
|
2829
2829
|
console.log(`@awebai/oats ${OATS_VERSION} (desktop API v1)`);
|
package/docs/capabilities.md
CHANGED
|
@@ -28,7 +28,7 @@ A capability lives in one of two kinds of source:
|
|
|
28
28
|
A soul says `capabilities: { <name>: { from: here | <repo key> | package } }`
|
|
29
29
|
(or `off`); the workspace supplies defaults. At spawn every resolved
|
|
30
30
|
capability is **copied whole** into the instance (`<home>/.oats/modules/<name>/`,
|
|
31
|
-
skills into `<home>/.agents/skills/<
|
|
31
|
+
its skills flat into `<home>/.agents/skills/<skill>/`), and the instance's `AGENTS.md` is
|
|
32
32
|
generated without changing the canonical soul. Nothing is installed or
|
|
33
33
|
activated at a deployment.
|
|
34
34
|
|
|
@@ -237,8 +237,8 @@ live.
|
|
|
237
237
|
|
|
238
238
|
Every spawned instance gets a **full copy** of each capability its soul
|
|
239
239
|
resolved to, under `<home>/.oats/modules/<capability>/` (manifest, `bin/`,
|
|
240
|
-
injects, skills), and those skills under
|
|
241
|
-
|
|
240
|
+
injects, skills), and those skills flat under `<home>/.agents/skills/<skill>/`
|
|
241
|
+
beside the soul's own, one level deep where harnesses discover them. Its generated `AGENTS.md` is the
|
|
242
242
|
soul's `AGENTS.md`, the kernel and work-mode blocks, then each module's inject
|
|
243
243
|
in name order. Two composed skills with one name fail the spawn
|
|
244
244
|
(`E_SKILL_DUPLICATE`). The harness then starts normally, with its own skill
|
|
@@ -286,7 +286,8 @@ shims that throw `E_REMOVED { name, contract }`, pointing at this record.
|
|
|
286
286
|
must match the lock's commit (`E_MATERIALIZE_INTEGRITY { why: "lock" }`); an unknown repo is
|
|
287
287
|
`E_MATERIALIZE_SOURCE`.
|
|
288
288
|
2. The copy's digest must equal the fetch's and any `module.digest` (`E_MATERIALIZE_INTEGRITY`).
|
|
289
|
-
3. Copy skills whole to `<home>/.agents/skills/<
|
|
289
|
+
3. Copy skills whole to `<home>/.agents/skills/<skill>/`, flat (0.30.2; the grouped
|
|
290
|
+
`<name>/<skill>/` layout this section first specified hid every skill from the harnesses).
|
|
290
291
|
4. Compose `<home>/AGENTS.md` = soul body (`options.soulAgentsMd` or `soulDir`) + kernel blocks + module
|
|
291
292
|
injects; operating guidance comes from a module such as `oats.core`. Keep `CLAUDE.md → AGENTS.md`
|
|
292
293
|
and `.claude/skills → ../.agents/skills`.
|
package/docs/desktop-cli-api.md
CHANGED
|
@@ -36,7 +36,8 @@ canonical (`github.com/<org>/<repo>`, or `local/<abs-path>`). Examples use
|
|
|
36
36
|
"instance-git-remote","souls-declarations","lifecycle-plans","retire-retention","readiness","spawn-preview","instance-events",
|
|
37
37
|
"instance-events-2","schedule-history","schedule-read-2","spawn-preview-2","spawn-idempotency","spawn-idempotency-2","spawn-apply-2",
|
|
38
38
|
"workspace-v2","instance-modules","spawn-provider-payload","served-identity","packages-no-approval","spawn-name","settings-origins",
|
|
39
|
-
"team-model-2","settings-declared","capabilities-private","layers-from","harness","package-souls","triggers","automations","desktop-facts","launch-preference"
|
|
39
|
+
"team-model-2","settings-declared","capabilities-private","layers-from","harness","package-souls","triggers","automations","desktop-facts","launch-preference",
|
|
40
|
+
"preview-composed-from"],
|
|
40
41
|
"automationsApi":1,"workspaceApi":2,"instanceGitApi":1,"spawnApplyApi":1,"soulsApi":2,"lifecycleApi":1,
|
|
41
42
|
"readinessApi":2,"spawnPreviewApi":2,"eventsApi":2,"scheduleHistoryApi":3,"scheduleApi":2,"operationsApi":2}
|
|
42
43
|
```
|
|
@@ -88,6 +89,7 @@ canonical (`github.com/<org>/<repo>`, or `local/<abs-path>`). Examples use
|
|
|
88
89
|
| `automations` | workspace triggers and schedules; `oats automations refresh` | `automationsApi: 1` |
|
|
89
90
|
| `desktop-facts` | the facts under [Desktop facts](#desktop-facts-feature-desktop-facts-oats-0290) | |
|
|
90
91
|
| `launch-preference` | soul and local launch preferences; `launch`, `launchCurrent`, `launchFrom`; `--reselect-launch`; `key` on soul and agent rows ([Launch preferences](#soul-launch-preferences-feature-launch-preference-oats-0300)) | |
|
|
92
|
+
| `preview-composed-from` | `composedFrom` on preview `modules[]` ([Composition](#the-preview)) | |
|
|
91
93
|
|
|
92
94
|
Payload-only integers, never in the probe: `onboardApi: 2`, `syncApi: 1`,
|
|
93
95
|
`workspaceStatusApi: 1`, `capabilitiesApi: 1`, the `oats souls` document's
|
|
@@ -591,7 +593,7 @@ Read-only (it writes no lock):
|
|
|
591
593
|
"souls":["rm"],"capabilities":["nw-house-style"],"publishes":null,"url":"https://github.com/nw/agents/tree/66566512…",
|
|
592
594
|
"membershipFile":{"path":"oats-membership.yaml","url":"https://github.com/nw/agents/blob/66566512…/oats-membership.yaml"}}],
|
|
593
595
|
"packages":[{"id":"oats.okf","version":"3.0.0","source":"catalog:oats.okf","commit":"ab897841…","integrity":"sha256-bada35…",
|
|
594
|
-
"capabilities":["oats.okf"],"souls":[],"latest":{"version":"4.0.
|
|
596
|
+
"capabilities":["oats.okf"],"souls":[],"latest":{"version":"4.0.5","ref":"v4.0.5"}}],
|
|
595
597
|
"declaredPackages":["oats.framework","oats.okf"],"unsynced":["oats.framework"],"stale":[],
|
|
596
598
|
"external":[{"source":"git:github.com/oss/experts@3c606e09…","soul":"security-reviewer"}],
|
|
597
599
|
"problems":[],"warnings":[],
|
|
@@ -642,8 +644,8 @@ packages' capabilities and souls, sorted by name, then origin. Both carry
|
|
|
642
644
|
"defaultTeam":{"label":"mine","team":"mine:ana.aweb.ai","from":"deployment"},
|
|
643
645
|
"private":false,"path":"souls/writer","work":"directory","description":"Drafts campaigns.","harness":"pi","model":null,"harnessFrom":"kernel-default",
|
|
644
646
|
"file":{"path":"souls/writer/soul.yaml","url":null},"spawnable":true,"problem":null},
|
|
645
|
-
{"name":"knowledge-maintainer","qualifiedName":"oats.okf/knowledge-maintainer","origin":"package oats.okf v4.0.
|
|
646
|
-
"version":"4.0.
|
|
647
|
+
{"name":"knowledge-maintainer","qualifiedName":"oats.okf/knowledge-maintainer","origin":"package oats.okf v4.0.5","kind":"package","package":"oats.okf",
|
|
648
|
+
"version":"4.0.5","repoKey":"github.com/awebai/oats-okf","commit":"26d8216f…","teams":null,"defaultTeam":null,"private":false,
|
|
647
649
|
"path":"oats-package/souls/knowledge-maintainer","work":"directory","description":"Reviews harvested knowledge.","harness":"pi","model":null,
|
|
648
650
|
"harnessFrom":"kernel-default","file":{"path":"oats-package/souls/knowledge-maintainer/soul.yaml","url":null},
|
|
649
651
|
"spawnable":false,"problem":{"code":"E_TEAM_UNKNOWN","message":"team \"reviewers\" is not declared (oats-local.yaml#/souls/teams/…)"}}],
|
|
@@ -1073,9 +1075,9 @@ it to a temporary copy (`soulFetched: true`).
|
|
|
1073
1075
|
```json
|
|
1074
1076
|
{"modules":[
|
|
1075
1077
|
{"name":"nw-tools","from":{"kind":"member","repoKey":"github.com/nw/agents","commit":"66566512…"},"layer":null,"private":false,"declares":[],
|
|
1076
|
-
"changedSince":{"instance":"rm-2","was":"45b86f64…"}},
|
|
1078
|
+
"changedSince":{"instance":"rm-2","was":"45b86f64…"},"composedFrom":"soul"},
|
|
1077
1079
|
{"name":"oats.okf","from":{"kind":"package","package":"oats.okf","version":"2.1.3","commit":"ab897841…","integrity":"sha256-bada35…","repoKey":"github.com/awebai/oats-okf"},
|
|
1078
|
-
"layer":"knowledge","private":false,"declares":["state-dir"],"changedSince":false}],
|
|
1080
|
+
"layer":"knowledge","private":false,"declares":["state-dir"],"changedSince":false,"composedFrom":"workspace"}],
|
|
1079
1081
|
"teams":[{"label":"eng","team":"eng:nw.aweb.ai","default":true,"from":"shared"}],
|
|
1080
1082
|
"defaultTeam":{"label":"eng","team":"eng:nw.aweb.ai","from":"soul"},
|
|
1081
1083
|
"resolution":"abacbdb5a7975098d77007c8","declRevision":"068a0d3f1311a9e84e9aff2e","payloadRevision":"81a368006c610194aa35dbe0",
|
|
@@ -1124,9 +1126,18 @@ it to a temporary copy (`soulFetched: true`).
|
|
|
1124
1126
|
|
|
1125
1127
|
**Composition.**
|
|
1126
1128
|
- `modules[]` (feature `instance-modules`): `{name, from, layer, private,
|
|
1127
|
-
declares, changedSince}`; `from` is what `instance.json` will
|
|
1128
|
-
`changedSince` is `null` (no previous instance), `false` (unchanged
|
|
1129
|
-
newest one) or `{instance, was}`.
|
|
1129
|
+
declares, changedSince, composedFrom}`; `from` is what `instance.json` will
|
|
1130
|
+
record. `changedSince` is `null` (no previous instance), `false` (unchanged
|
|
1131
|
+
since the newest one) or `{instance, was}`.
|
|
1132
|
+
- `composedFrom` (feature `preview-composed-from`, OATS 0.30.2): why the
|
|
1133
|
+
module is there — `"soul"` (the soul declares it, including a soul entry
|
|
1134
|
+
that overrides a workspace default of the same name, a package soul's
|
|
1135
|
+
`from: here`, and every module of a standalone view) or `"workspace"` (a
|
|
1136
|
+
`defaults.<slot>` or `defaults.capabilities` entry). It is the same value
|
|
1137
|
+
`oats inspect --soul` reports as `capabilities[].composedFrom`. It is
|
|
1138
|
+
provenance only: it never enters `resolution`, `declRevision`,
|
|
1139
|
+
`payloadRevision` or `decision.revision`, and `instance.json` does not
|
|
1140
|
+
record it. `from` says where the bytes come from.
|
|
1130
1141
|
- `capabilities[]` (`{name, origin}`, `origin` `package:<id>@<v>` or
|
|
1131
1142
|
`member:<repoKey>@<commit>`) and `skills[]` (the soul's own skills as
|
|
1132
1143
|
strings, module skills as `{name, source: "module:<cap>"}`) are display
|
|
@@ -1288,8 +1299,9 @@ the keyed-spawn fields `decision`, `spawnIdempotencyKey`, `spawnCompleted` and
|
|
|
1288
1299
|
`wake`; later starts add `restarts` and `restartCount`.
|
|
1289
1300
|
|
|
1290
1301
|
- `modules.<cap>`: `{from, commit, digest, materializedAt}`; `digest` hashes
|
|
1291
|
-
the copy at `<home>/.oats/modules/<cap>/`. Module skills are copied to
|
|
1292
|
-
`<home>/.agents/skills/<
|
|
1302
|
+
the copy at `<home>/.oats/modules/<cap>/`. Module skills are copied flat to
|
|
1303
|
+
`<home>/.agents/skills/<skill>/` (homes spawned by 0.30.1 or earlier keep
|
|
1304
|
+
`<home>/.agents/skills/<cap>/<skill>/`).
|
|
1293
1305
|
- `providers.<cap>`: the merged payload (`{}` when none).
|
|
1294
1306
|
- `workspace`: `{key, name, deployment, commit, resolution, standalone, soul,
|
|
1295
1307
|
layers}`. `name` is recorded, and every hook, command and operation of the
|
package/docs/first-team.md
CHANGED
|
@@ -120,7 +120,7 @@ oats status
|
|
|
120
120
|
`--harness pi|claude|codex` picks the harness; complete any native folder
|
|
121
121
|
trust or authentication prompt in the printed session. The instance home is
|
|
122
122
|
`agents/<soul>/instances/<instance>/`; `work/` is its repository view;
|
|
123
|
-
`.oats/modules/<cap>/` and `.agents/skills/<
|
|
123
|
+
`.oats/modules/<cap>/` are the copied capabilities and `.agents/skills/<skill>/` their skills;
|
|
124
124
|
`instance.json` records `modules` (from, commit, digest), `providers` and
|
|
125
125
|
`workspace`. A running instance never changes under itself — a member that
|
|
126
126
|
moves affects only new spawns, and `oats status` shows the drift
|
package/docs/implementation.md
CHANGED
|
@@ -30,7 +30,8 @@ published to npm. Its developer docs are in
|
|
|
30
30
|
| `lib/` | the kernel (below) |
|
|
31
31
|
| `injects/` | the kernel and work-mode instruction blocks composed into every instance |
|
|
32
32
|
| `skills/` | bootstrap skills shipped with the kernel |
|
|
33
|
-
| `capabilities/` |
|
|
33
|
+
| `capabilities/` | this repository's own member capabilities (`oats-workspace-experts`), discovered at the member's latest state |
|
|
34
|
+
| `mirrors/` | generated byte mirrors of the official packages' capabilities (for example `oats-okf*`, checked by `scripts/check-okf-mirror.mjs`): release-lane and test material, kept out of `capabilities/` so member discovery does not list them a second time; not shipped in the npm package |
|
|
34
35
|
| `oats-package/` | the `oats.framework` package |
|
|
35
36
|
| `souls/` | this repository's own souls (a workspace member) |
|
|
36
37
|
| `docs/` | the reference pages, schemas, design records and release notes |
|
package/docs/integrations.md
CHANGED
|
@@ -29,7 +29,7 @@ an author soul:
|
|
|
29
29
|
```yaml
|
|
30
30
|
# oats-workspace.yaml
|
|
31
31
|
packages:
|
|
32
|
-
oats.framework: v1.4.
|
|
32
|
+
oats.framework: v1.4.1 # provides oats.core, oats.setup, oats.knowledge-theory
|
|
33
33
|
|
|
34
34
|
# souls/<author-soul>/soul.yaml
|
|
35
35
|
capabilities:
|
package/docs/knowledge.md
CHANGED
|
@@ -26,7 +26,7 @@ The workspace pins the package and fills the slot for every soul by default:
|
|
|
26
26
|
```yaml
|
|
27
27
|
# oats-workspace.yaml (excerpt)
|
|
28
28
|
packages:
|
|
29
|
-
oats.okf: v4.0.
|
|
29
|
+
oats.okf: v4.0.5
|
|
30
30
|
defaults:
|
|
31
31
|
knowledge: { oats.okf: { from: package } }
|
|
32
32
|
stores:
|
|
@@ -207,9 +207,9 @@ its `oats trigger test` passes.
|
|
|
207
207
|
|
|
208
208
|
| Capability | Composed into | Skills | Inject |
|
|
209
209
|
|---|---|---|---|
|
|
210
|
-
| `oats.okf` | every working soul it serves | [`okf-consultation`](../
|
|
211
|
-
| `oats.okf-harvest` | `oats.okf/knowledge-harvester` | `knowledge-theory`, [`knowledge-harvest`](../
|
|
212
|
-
| `oats.okf-maintenance` | `oats.okf/knowledge-maintainer` | `knowledge-theory`, [`knowledge-review`](../
|
|
210
|
+
| `oats.okf` | every working soul it serves | [`okf-consultation`](../mirrors/oats-okf/skills/okf-consultation/SKILL.md), [`okf-instance-knowledge`](../mirrors/oats-okf/skills/okf-instance-knowledge/SKILL.md) | Consult soul and instance knowledge; capture with judgment. |
|
|
211
|
+
| `oats.okf-harvest` | `oats.okf/knowledge-harvester` | `knowledge-theory`, [`knowledge-harvest`](../mirrors/oats-okf-harvest/skills/knowledge-harvest/SKILL.md), `okf-authoring` | A judge; its staged roots are its only write surface. |
|
|
212
|
+
| `oats.okf-maintenance` | `oats.okf/knowledge-maintainer` | `knowledge-theory`, [`knowledge-review`](../mirrors/oats-okf-maintenance/skills/knowledge-review/SKILL.md), `okf-authoring`, [`okf-trigger-setup`](../mirrors/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md) | One PR per instance; never supersede silently. |
|
|
213
213
|
|
|
214
214
|
Working souls get no promotion doctrine: only the harvester judges and only
|
|
215
215
|
the maintainer merges. `knowledge-theory` and `okf-authoring` ship as
|
package/docs/official-catalog.md
CHANGED
|
@@ -9,10 +9,10 @@ or workspace membership alone does not make a package official.
|
|
|
9
9
|
|
|
10
10
|
| package | release | capabilities | package souls |
|
|
11
11
|
|---|---|---|---|
|
|
12
|
-
| `oats.framework` | `oats-framework/v1.4.
|
|
13
|
-
| `oats.okf` | `v4.0.
|
|
12
|
+
| `oats.framework` | `oats-framework/v1.4.1` (this repository) | `oats.core`, `oats.setup`, `oats.knowledge-theory` | `knowledge-theory-expert` |
|
|
13
|
+
| `oats.okf` | `v4.0.5` | `oats.okf` (knowledge), `oats.okf-harvest`, `oats.okf-maintenance` | `knowledge-harvester`, `knowledge-maintainer` |
|
|
14
14
|
| `oats.aweb` | `v1.17.1` | `oats.aweb` (messaging) | |
|
|
15
|
-
| `oats.engineering` | `v1.
|
|
15
|
+
| `oats.engineering` | `v1.3.0` | `oats.engineering-expert`, `oats.developer`, `oats.code-review` | `code-reviewer` |
|
|
16
16
|
| `oats.authoring` | `v1.0.3` | `oats.authoring` | |
|
|
17
17
|
| `oats.jira` | `v1.0.1` | `oats.jira` (tasks) | |
|
|
18
18
|
| `oats.linear` | `v1.0.1` | `oats.linear` (tasks) | |
|
|
@@ -27,7 +27,7 @@ no lock and adds nothing to an existing workspace.
|
|
|
27
27
|
## Find and use packages
|
|
28
28
|
|
|
29
29
|
- A workspace pins an official package by **bare version** in its
|
|
30
|
-
`packages:` map (`oats.okf: v4.0.
|
|
30
|
+
`packages:` map (`oats.okf: v4.0.5`); `oats sync` resolves it through the
|
|
31
31
|
catalog to an exact commit, fetches it, verifies its integrity and locks it.
|
|
32
32
|
A package outside the catalog is written `git:<repo>@<ref>`. Pinning does
|
|
33
33
|
not join a team or adopt the publisher's workspace. See
|
package/docs/packages.md
CHANGED
|
@@ -44,14 +44,14 @@ whole organisation:
|
|
|
44
44
|
|
|
45
45
|
```yaml
|
|
46
46
|
packages:
|
|
47
|
-
oats.okf: v4.0.
|
|
47
|
+
oats.okf: v4.0.5 # bare version → the official catalog
|
|
48
48
|
acme.tools: git:github.com/acme/tools@v0.4.0 # direct ref: git:<repo>@<tag or full OID>
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
- **Bare version** (`v4.0.
|
|
51
|
+
- **Bare version** (`v4.0.5`, `4.0.5`, `1.0.0-rc.1`): the id is looked up in
|
|
52
52
|
the official catalog — `package-catalog.json` in the `oats` repo, or the file
|
|
53
53
|
named by `OATS_PACKAGE_CATALOG` — which supplies the repo url, the tag
|
|
54
|
-
convention (`v4.0.
|
|
54
|
+
convention (`v4.0.5` or `oats-framework/v1.4.1`) and the payload path. An id
|
|
55
55
|
the catalog does not know is `E_PACKAGE_MISSING` ("use `git:<repo>@<ref>` for
|
|
56
56
|
a package outside the catalog"). The catalog is the reviewed official list
|
|
57
57
|
([official-catalog.md](official-catalog.md)) and the only way a
|
|
@@ -74,8 +74,8 @@ members:
|
|
|
74
74
|
- git:github.com/acme/agents
|
|
75
75
|
- git:github.com/acme/platform
|
|
76
76
|
packages:
|
|
77
|
-
oats.framework: v1.4.
|
|
78
|
-
oats.okf: v4.0.
|
|
77
|
+
oats.framework: v1.4.1
|
|
78
|
+
oats.okf: v4.0.5
|
|
79
79
|
oats.aweb: v1.17.1
|
|
80
80
|
teams:
|
|
81
81
|
platform: { team: "platform:acme.aweb.ai", description: Platform engineering }
|
|
@@ -105,7 +105,7 @@ decision recorded in the lock.
|
|
|
105
105
|
$ oats sync
|
|
106
106
|
workspace acme (github.com/acme/agents @ 3f2a9c1e)
|
|
107
107
|
members agents ✓↔ (@ 3f2a9c1e) platform ✓↔ (@ 77c0a1b2) billing ✗ (no-backlink)
|
|
108
|
-
packages acme.tools 0.4.0 ✓ (@ 47f4b816) oats.okf 4.0.
|
|
108
|
+
packages acme.tools 0.4.0 ✓ (@ 47f4b816) oats.okf 4.0.5 ✓ (@ 26d8216f)
|
|
109
109
|
changed acme.tools — → 0.4.0 (@ 47f4b816)
|
|
110
110
|
souls 9 discovered (6 members, 1 external, 2 package, 0 disabled here) · 0 private capabilities
|
|
111
111
|
teams platform (shared) · this deployment's: oats teams
|
|
@@ -160,8 +160,8 @@ same workspace commit hold identical locks.
|
|
|
160
160
|
"source": "catalog:oats.okf",
|
|
161
161
|
"url": "https://github.com/awebai/oats-okf.git",
|
|
162
162
|
"path": "oats-package",
|
|
163
|
-
"version": "4.0.
|
|
164
|
-
"commit": "
|
|
163
|
+
"version": "4.0.5",
|
|
164
|
+
"commit": "26d8216f8ce986cad1ffa7a8291b4a4978510ee2",
|
|
165
165
|
"integrity": "sha256-…",
|
|
166
166
|
"capabilities": ["oats.okf", "oats.okf-harvest", "oats.okf-maintenance"]
|
|
167
167
|
},
|
|
@@ -212,7 +212,7 @@ At spawn a `from: package` module is fetched at the lock's commit from the
|
|
|
212
212
|
lock's `url`, at the manifest-listed directory (`oats-package.json#capabilities[]`
|
|
213
213
|
entry), into `<home>/.oats/modules/<cap>/`; the copy's digest is verified
|
|
214
214
|
against what the fetch reported; skills are copied to
|
|
215
|
-
`<home>/.agents/skills/<
|
|
215
|
+
`<home>/.agents/skills/<skill>/` (flat). `instance.json.modules.<cap>.from` is
|
|
216
216
|
`{ kind: "package", package, version, commit, integrity, repoKey }`. Bumping
|
|
217
217
|
`packages:` and syncing affects **only new spawns**; `oats status` shows a
|
|
218
218
|
running instance's package module as `moved` once the lock points elsewhere.
|
|
@@ -331,12 +331,12 @@ A soul that names one of the package's capabilities with
|
|
|
331
331
|
{
|
|
332
332
|
"policy": "docs/official-catalog.md",
|
|
333
333
|
"packages": {
|
|
334
|
-
"oats.okf": { "url": "https://github.com/awebai/oats-okf.git", "ref": "v4.0.
|
|
335
|
-
"oats.framework": { "url": "https://github.com/awebai/oats.git", "ref": "oats-framework/v1.4.
|
|
334
|
+
"oats.okf": { "url": "https://github.com/awebai/oats-okf.git", "ref": "v4.0.5", "path": "oats-package" },
|
|
335
|
+
"oats.framework": { "url": "https://github.com/awebai/oats.git", "ref": "oats-framework/v1.4.1", "path": "oats-package" }
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
338
|
```
|
|
339
339
|
|
|
340
|
-
`ref` carries the tag convention: a workspace's `oats.framework: v1.4.
|
|
341
|
-
resolves to tag `oats-framework/v1.4.
|
|
340
|
+
`ref` carries the tag convention: a workspace's `oats.framework: v1.4.1`
|
|
341
|
+
resolves to tag `oats-framework/v1.4.1`. Resolving through the catalog never
|
|
342
342
|
advances a lock by itself: `oats sync` does, and says so.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# OATS 0.30 close-out: the shared plan
|
|
2
2
|
|
|
3
3
|
The single source of truth for the rest of 0.30, owned by BOTH leads (oats-expert-knowledge-reworks
|
|
4
|
-
and oats-expert-antares; Juan asked for joint work on 2026-09-28). Whoever changes the state updates
|
|
4
|
+
and oats-expert-antares, succeeded by oats-expert-steward; Juan asked for joint work on 2026-09-28). Whoever changes the state updates
|
|
5
5
|
this file.
|
|
6
6
|
|
|
7
7
|
## Rules
|
|
@@ -20,7 +20,7 @@ this file.
|
|
|
20
20
|
| 5 | The 0.30.0 release PR (brief below) | lead | cli-dev-v2-native | briefed |
|
|
21
21
|
| 6 | Full rehearsal re-run on the final heads (all cases, incl. 5 and 10); close-out; retire case 9; the 0.30 runbook for Juan and Pepe | Antares | — | DONE on the final heads (main kernel stamped 0.30.0 + aweb v1.17.1 + okf v4.0.4): all cases PASS (1–8, 10, onboarding (a)–(e) + resume, the BYOT leave/retire owner commands actually run → revoked, 22 clean retires). Known: 8 (E_SPAWN_FAILED), the BYOT membership limit. Runbook for Juan and Pepe: next |
|
|
22
22
|
| 7a | automations.trust (#300, ACKed a0562b9f) + the Desktop grouping of `untrusted` with owner-mismatch (not here, with the remedy; a real-capture test): the Desktop PR merges BEFORE #300. Both land before the tag, or both go to 0.30.1 together | lead | cli-dev-okf-ops + ux-designer-desktop-redesign | routed |
|
|
23
|
-
| 7 | Tag v0.30.0 after green main CI on the exact release SHA | Antares | — |
|
|
23
|
+
| 7 | Tag v0.30.0 after green main CI on the exact release SHA | Antares | — | DONE: v0.30.0 + oats-framework/v1.4.0 on dec58082 (main CI green on it); published @awebai/oats 0.30.0 (shasum 2e370157) + @awebai/oats-pi 0.30.0, latest; a clean-room onboard with the published package locks framework 1.4.0, aweb 1.17.1, okf 4.0.4, engineering 1.1.0 |
|
|
24
24
|
|
|
25
25
|
**Sequence:** 1–4 in parallel → 6 on the final heads → 5 with the final pins → 7.
|
|
26
26
|
|
|
@@ -50,6 +50,22 @@ this file.
|
|
|
50
50
|
8. A check of the PACKED tarball: its `package-catalog.json` carries oats.engineering 1.1.0,
|
|
51
51
|
oats.aweb 1.17.1 and oats.okf 4.0.4.
|
|
52
52
|
|
|
53
|
+
## Released (2026-09-29)
|
|
54
|
+
**OATS 0.30.0** on npm (`@awebai/oats` and `@awebai/oats-pi`, latest), from `dec58082` (#297).
|
|
55
|
+
Tags `v0.30.0` and `oats-framework/v1.4.0` are both on that SHA. Pins: oats.aweb 1.17.1,
|
|
56
|
+
oats.okf 4.0.4, oats.engineering 1.1.0, framework 1.4.0. A clean-room `oats onboard` against the
|
|
57
|
+
published package locks all of them without a catalog override.
|
|
58
|
+
|
|
59
|
+
Found by the rehearsals, and fixed before the tag:
|
|
60
|
+
- joined teams unusable against real aw;
|
|
61
|
+
- okf readiness always `unknown`;
|
|
62
|
+
- `oats aweb setup` from a deployment;
|
|
63
|
+
- launch-hook warnings dropped;
|
|
64
|
+
- `readiness --soul` with no soul copy;
|
|
65
|
+
- a newcomer's first `--join`;
|
|
66
|
+
- a stale `settings.team` orphaning identities on retire;
|
|
67
|
+
- a BYOT retire with no owner command.
|
|
68
|
+
|
|
53
69
|
## After the tag
|
|
54
70
|
- **Flag day:** the oats.engineering release with the souls' `launch:` (experts on Claude Code +
|
|
55
71
|
Opus 5.5; `code-reviewer` on Codex + Astra; compat `>=0.30.0`), and committing the shared team id.
|
|
@@ -57,5 +73,11 @@ this file.
|
|
|
57
73
|
- the kernel items that miss the tag: retire of homes whose session is gone, automations.trust;
|
|
58
74
|
- deployment-scope capability commands without `--soul`;
|
|
59
75
|
- the case-8 pre-check (`E_TEAM_UNCONFIGURED`).
|
|
76
|
+
- the kernel refuses an unrecognised spawn argument (a bare `join=oats` without
|
|
77
|
+
`--provider oats.aweb` was silently ignored, so the spawn joined nothing).
|
|
78
|
+
- a launch (spawn, `session start`, `session restart`) puts the spawning kernel's bin directory
|
|
79
|
+
FIRST on the instance's PATH and records it in the launch recipe, so plain `oats` inside an
|
|
80
|
+
instance is the kernel that made it (two kernels side by side: a 0.30 home ran the global 0.24.6
|
|
81
|
+
and `oats aweb` was `E_UNKNOWN_COMMAND`; the injected instructions tell agents to run plain `oats`).
|
|
60
82
|
- **Parked:** item L (`git rm agents/`, cli-dev-v2-native). It needs the GitHub `workflow` token
|
|
61
83
|
scope from the human on the lead's machine.
|
package/docs/release-lane.md
CHANGED
|
@@ -174,9 +174,14 @@ not weaken the pre-publish build/inventory/ABI gates.
|
|
|
174
174
|
## Mirroring a released `oats.okf`
|
|
175
175
|
|
|
176
176
|
The standalone `awebai/oats-okf` repository is authoritative. This repository
|
|
177
|
-
carries a generated mirror of its capabilities under `
|
|
177
|
+
carries a generated mirror of its capabilities under `mirrors/oats-okf*/`
|
|
178
178
|
and the inventory `scripts/okf-source-inventory.json`; neither is edited by
|
|
179
|
-
hand.
|
|
179
|
+
hand. The inventory records each capability at its path inside the package
|
|
180
|
+
(`capabilities/oats-okf`, what the tag attests) and, in `mirrorPaths`, where
|
|
181
|
+
this repository keeps it. The mirror is not under `capabilities/`: this
|
|
182
|
+
repository is a workspace member, and member discovery would list it as a
|
|
183
|
+
latest-state member capability beside the package. After an okf release is
|
|
184
|
+
tagged:
|
|
180
185
|
|
|
181
186
|
1. Check out the release in a clean clone of `awebai/oats-okf` at the tagged
|
|
182
187
|
commit, with the tag present locally and `origin` pointing at the official
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# OATS 0.30.1
|
|
2
|
+
|
|
3
|
+
## Fixes
|
|
4
|
+
|
|
5
|
+
- **Desktop: an instance-less soul no longer takes the whole roster down.**
|
|
6
|
+
`oats status --json` reports an agent row's `key` as `null` when no instance
|
|
7
|
+
records a workspace soul, as the roster contract documents. That happens for a
|
|
8
|
+
soul directory with no instances: after a spawn preview of a soul that has
|
|
9
|
+
never been spawned, or after its last instance is retired. The 0.30.0 Desktop
|
|
10
|
+
accepted only a string there, so one such row rejected the whole observation
|
|
11
|
+
with `E_CLI_PROTOCOL` ("The installed OATS CLI returned an invalid deployment
|
|
12
|
+
observation"). The Desktop now accepts `null` and still refuses any other
|
|
13
|
+
type.
|
|
14
|
+
- **Knowledge readiness answers, fast.** With oats.okf 4.0.5, `oats readiness`
|
|
15
|
+
answers the knowledge check from okf's cache in the knowledge `stateDir`, well
|
|
16
|
+
inside the kernel's 30 s cap, instead of cloning every base and timing out as
|
|
17
|
+
`unknown` (measured: 7 s against 35 s and `unknown` before). A base that is
|
|
18
|
+
not cached yet, out of date or unreachable is reported as a named warning or
|
|
19
|
+
problem, never `unknown`. A spawn with harvest off fills the cache, spending at
|
|
20
|
+
most 20 s per base, and still refuses a soul that names a node its base does
|
|
21
|
+
not have.
|
|
22
|
+
- **Desktop: a stored workspace selection the server no longer serves** (a
|
|
23
|
+
deleted deployment) locked the Desktop out: every roster refresh refused the
|
|
24
|
+
server's reply as "belongs to a different workspace", and the switcher
|
|
25
|
+
already showed the served workspace as active. A selection that is not
|
|
26
|
+
among the served workspaces is now treated like an empty one: both rosters
|
|
27
|
+
adopt the served workspace and the stored selection is replaced. A
|
|
28
|
+
selection the server does serve, answered with another workspace, is still
|
|
29
|
+
refused.
|
|
30
|
+
- **Desktop: terminal tabs are back to native geometry.** 13px system
|
|
31
|
+
monospace, xterm's default line height, and 32px side gutters with no
|
|
32
|
+
vertical inset, as before Redesign v3. The block cursor is one cell tall
|
|
33
|
+
again. A font size you chose yourself is kept.
|
|
34
|
+
- **Desktop: the spawn dialog could stay on "Reading defaults…" forever.**
|
|
35
|
+
A routine roster refresh restarted the spawn preview while it was still
|
|
36
|
+
being read, so on a machine where the preview takes several seconds it
|
|
37
|
+
never finished. The dialog now re-reads only when a fact the preview
|
|
38
|
+
depends on changes.
|
|
39
|
+
|
|
40
|
+
## Packages
|
|
41
|
+
|
|
42
|
+
- **oats.okf 4.0.5** (was 4.0.4 in 0.30.0): the knowledge readiness fix above.
|
|
43
|
+
- **oats.engineering 1.3.0** (was 1.1.0 in 0.30.0).
|
|
44
|
+
- 1.2.0: the packaged `code-reviewer` launches on Codex with `gpt-6-astra` by default, a different model family from the developers it reviews. A machine without the `codex` binary gets `E_HARNESS_UNAVAILABLE` when it spawns `code-reviewer`, until it installs Codex or overrides the preference (`oats-local.yaml` `souls.launch`, or `--harness`/`--model` at spawn).
|
|
45
|
+
- 1.3.0: review happens on local branches, before the PR. The developer runs its adversarial loop with the `code-reviewer` on its local branch and hands the reviewed branch to its expert. The expert reviews that branch, and only when it accepts is a PR opened. A returned branch's delta goes back through the same reviewer first.
|
|
46
|
+
|
|
47
|
+
## Changed
|
|
48
|
+
|
|
49
|
+
- **Desktop: calmer selection, focus and search fields.** A selected segment
|
|
50
|
+
(Group by, List/Graph and similar) now uses the brand tint instead of
|
|
51
|
+
white-on-grey. Clicking a button, tab or row no longer draws a focus ring.
|
|
52
|
+
Keyboard focus stays visible as the tint plus a thin accent edge, not a
|
|
53
|
+
2px ring. Search and filter fields have a single border that turns accent
|
|
54
|
+
on focus, with no inner ring.
|
|
55
|
+
Sidebar instance rows are more compact, with a gap between highlighted rows,
|
|
56
|
+
and an instance's pull request number sits before its branch name instead of
|
|
57
|
+
on its own line.
|
|
58
|
+
- **The official workspace lists each package capability once.** The `oats`
|
|
59
|
+
repository kept byte mirrors of the official packages' capabilities
|
|
60
|
+
(`oats.okf`, `oats.aweb`, `oats.jira`, …) under `capabilities/`, so `oats
|
|
61
|
+
capabilities` in the official workspace also listed each of them as a member
|
|
62
|
+
capability of `github.com/awebai/oats`, beside its package. The mirrors now
|
|
63
|
+
live in `mirrors/`, which member discovery does not read, and the npm
|
|
64
|
+
package no longer carries them (nothing read them at runtime: capabilities
|
|
65
|
+
resolve from Git at the locked commit). No operator action.
|
|
66
|
+
- **Desktop: clearer Workspace views, and Spawn goes straight to the soul.**
|
|
67
|
+
Soul cards label their facts ("Team oats", "No instances" instead of a
|
|
68
|
+
bare "none"), group by repo by default, and keep a compact Spawn on the
|
|
69
|
+
instances line. Capabilities are compact one-line row cards with a
|
|
70
|
+
kind-coloured tile, their source and who uses them; a row opens the
|
|
71
|
+
capability page with the full description. Teams show one card per team,
|
|
72
|
+
split into shared and this-computer sections. Spawn on a soul card or the
|
|
73
|
+
soul page opens the spawn dialog for that soul, with a "What will be
|
|
74
|
+
created" preview (core capabilities and capabilities with their sources);
|
|
75
|
+
"Change soul" returns to the picker.
|
|
76
|
+
- **Two Desktop souls.** The `oats-desktop-designer` soul is removed.
|
|
77
|
+
`oats-desktop-expert` now owns Desktop's UX and design direction as well as
|
|
78
|
+
its product rationale, and `oats-desktop-developer` builds all of
|
|
79
|
+
`packages/desktop`, including renderer views, styles, themes and copy.
|
|
80
|
+
Running designer instances keep working until they are retired; `oats
|
|
81
|
+
status` reports their soul as no longer present.
|
|
82
|
+
- **The legacy Desktop soul trees are removed.** `agents/oats-desktop-engineer`
|
|
83
|
+
and `agents/ux-designer` were no longer offered souls. The
|
|
84
|
+
`oats-desktop-expert` knowledge node carries their durable rationale.
|
|
85
|
+
- **The remaining legacy soul trees are removed.** `agents/cli-dev`,
|
|
86
|
+
`dev-coordinator`, `docs-expert`, `integrations-expert`, `lead`,
|
|
87
|
+
`oats-coordinator` and `oats-expert` were pre-v2 soul bundles, not offered
|
|
88
|
+
souls; the offered souls live in `souls/` and the packages. Their bundled
|
|
89
|
+
knowledge gate (`npm run validate:okf`) goes with them: the souls' knowledge
|
|
90
|
+
lives in the central knowledge base, which validates itself.
|
|
91
|
+
- **Desktop: a calmer instance panel.** The summary bar under the terminal
|
|
92
|
+
(harness, tmux target, team marks, Details, Focus mode) is gone, and the
|
|
93
|
+
terminal gets its height. A panel toggle at the end of the tab bar shows or
|
|
94
|
+
hides the instance panel (⌥⌘B, Ctrl+Alt+B on Linux and Windows; also in the
|
|
95
|
+
command palette). Focus mode stays in the palette; in focus mode the panel
|
|
96
|
+
toggle and the sidebar's edge button stay visible and leave it. The Instance
|
|
97
|
+
tab drops Built from and Details. When the kernel reports drift, its header
|
|
98
|
+
shows an "older build" chip whose tooltip says what changed and that
|
|
99
|
+
re-spawning picks up the new state. Where it works is one card: the work mode
|
|
100
|
+
in plain words, then repo, branch and home. Messaging is a compact list of
|
|
101
|
+
teams, with an icon refresh and the identity address on its own line. The Git
|
|
102
|
+
& GitHub tab is now the Developer tab; it shows branch, changes and pull
|
|
103
|
+
request cards; the branch line says how far it is from main and, when it has
|
|
104
|
+
an upstream, how many commits are unpushed. An instance without Git by design
|
|
105
|
+
(directory or workspace mode) gets a calm "No Git for this instance" note
|
|
106
|
+
instead of a red error; a worktree that has gone missing still reports its
|
|
107
|
+
error.
|
|
108
|
+
- **The official workspace's souls declare launch preferences.** Its experts,
|
|
109
|
+
developers and setup admin prefer Claude Code with Opus 5.5 (`launch:` in
|
|
110
|
+
each `soul.yaml`); each machine can override them in `oats-local.yaml`
|
|
111
|
+
`souls.launch`, and spawn flags win over both.
|
|
112
|
+
|
|
113
|
+
## Still known in 0.30.1
|
|
114
|
+
|
|
115
|
+
The 0.30.0 notes said the first two below would be fixed in 0.30.1. They are
|
|
116
|
+
not in this release, and are planned for 0.30.2.
|
|
117
|
+
|
|
118
|
+
- With no teams configured, a spawn is refused by the provider
|
|
119
|
+
(`E_SPAWN_FAILED`, relaying "no teams configured: run `oats aweb setup`"),
|
|
120
|
+
not by the kernel's `E_TEAM_UNCONFIGURED`.
|
|
121
|
+
- A capability operator command run from a deployment needs `--soul <soul>`.
|
|
122
|
+
- On a team you control (BYOT), retire cannot revoke membership; the retire
|
|
123
|
+
prints the owner's `aw id team remove-member` command, as in 0.30.0.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# OATS 0.30.2
|
|
2
|
+
|
|
3
|
+
## Changed
|
|
4
|
+
|
|
5
|
+
- **Desktop: a faster, calmer load.** The backend reads a deployment's status
|
|
6
|
+
and workspace status in parallel, holds the souls and capabilities catalogs
|
|
7
|
+
and soul inspections server-side (re-read when the workspace state or a
|
|
8
|
+
Desktop mutation moves, or when viewed after 60 s), and slows its cycle
|
|
9
|
+
from 5 s to 30 s while no window is focused. Returning to the window no longer
|
|
10
|
+
re-reads the capabilities list or cancels the observation in flight. When
|
|
11
|
+
the installed CLI supports `--max-age`, background reads accept the kernel's
|
|
12
|
+
recent observation; `/api/panel`, `/api/agents`, `/api/workspace-sync` and
|
|
13
|
+
`/api/capabilities` inspect now report `observedAt` and `refreshing`.
|
|
14
|
+
- **Desktop: Where it works shows the work folder.** The Instance tab's Where
|
|
15
|
+
it works card adds a Folder row, `<home>/work`, between Branch and Home, with
|
|
16
|
+
a copy button; in checkout, attached and workspace mode a muted "shared" tag
|
|
17
|
+
says it links to the tree other instances share.
|
|
18
|
+
|
|
19
|
+
- **Desktop: consistent loading states.** The sidebar roster, the hierarchy,
|
|
20
|
+
the soul inspector and readiness now run on one state model: skeletons
|
|
21
|
+
shaped like the final content instead of false empty lists,
|
|
22
|
+
content and focus kept while refreshing, stale data labelled with its
|
|
23
|
+
observation's age and a Retry, and the actions that need current state held
|
|
24
|
+
with an accessible reason until a good read.
|
|
25
|
+
|
|
26
|
+
- **Desktop: the Workspace view and the instance panel join the loading-state
|
|
27
|
+
model.** The Souls grid, the Capabilities tab and its capability pages, and
|
|
28
|
+
the instance panel's Soul and Messaging sections show skeletons at the real
|
|
29
|
+
row and card size instead of empty claims, keep their content (and a held
|
|
30
|
+
table) through a refresh or a failed re-read, and name a stale observation's
|
|
31
|
+
age with a Retry; the spawn dialog's harness, model and launch hints describe
|
|
32
|
+
the preview for the choices on screen only.
|
|
33
|
+
- **The spawn preview says why each module is there.** Every `modules[]` row
|
|
34
|
+
of `oats spawn … --preview --json` carries `composedFrom`: `"soul"` when the
|
|
35
|
+
soul declares the capability (a package soul's `from: here` and every module
|
|
36
|
+
of a standalone view included), `"workspace"` when a workspace default
|
|
37
|
+
(`defaults.<slot>` or `defaults.capabilities`) gave it. It is the value
|
|
38
|
+
`oats inspect --soul` already reports as `capabilities[].composedFrom`.
|
|
39
|
+
Provenance only: `resolution`, `declRevision`, `payloadRevision` and the
|
|
40
|
+
spawn decision are unchanged, so a previewed decision still binds its apply.
|
|
41
|
+
Gate on the new feature `preview-composed-from`
|
|
42
|
+
([Desktop CLI API](../desktop-cli-api.md#the-preview)).
|
|
43
|
+
|
|
44
|
+
## Fixed
|
|
45
|
+
|
|
46
|
+
- **Instance skills are flat again, so Claude Code finds them.** Since the
|
|
47
|
+
workspace model (0.25.0) spawn copied each module's skills grouped by
|
|
48
|
+
capability, `<home>/.agents/skills/<capability>/<skill>/SKILL.md`. Claude
|
|
49
|
+
Code discovers skills one level deep (`.claude/skills/<skill>/SKILL.md`), so
|
|
50
|
+
no capability skill resolved there: `/oats-operate`, `/oats-aweb`,
|
|
51
|
+
`/okf-consultation` and the rest were missing from the session although the
|
|
52
|
+
composed `AGENTS.md` tells the agent to load them. (pi's loader recurses, so
|
|
53
|
+
pi instances were not affected.) Spawn now copies every skill, the soul's
|
|
54
|
+
own and every module's, flat to `<home>/.agents/skills/<skill>/`, the
|
|
55
|
+
layout the Agent Skills convention and every harness expect;
|
|
56
|
+
`.claude/skills → ../.agents/skills` is unchanged. `instance.json` records
|
|
57
|
+
the flat paths (`capabilities[].skills`; a module's skill tree in
|
|
58
|
+
`composition.expected[].resolved` is the skills root).
|
|
59
|
+
- **One skill name, one directory.** Every composed skill shares the flat
|
|
60
|
+
directory, so names are unique across the soul and its modules, compared
|
|
61
|
+
case-insensitively: a soul's own skill named like a module's skill, or two
|
|
62
|
+
names differing only in case, is `E_SKILL_DUPLICATE` at spawn and the home
|
|
63
|
+
is removed. A soul skill named like a *capability* (`oats.okf`) is no
|
|
64
|
+
longer a collision. No soul in this repository is affected.
|
|
65
|
+
- **oats.framework 1.4.1** (oats.core 2.2.1): the `oats-operate` skill shows
|
|
66
|
+
the flat layout.
|
|
67
|
+
|
|
68
|
+
**Existing Claude Code instances keep their grouped layout and still do not
|
|
69
|
+
see their capability skills: respawn them to pick up the fix.** Nothing
|
|
70
|
+
rewrites an existing home: a running instance never changes under itself, and
|
|
71
|
+
moving its skills would contradict what its `instance.json` recorded. Until
|
|
72
|
+
it is respawned, an agent can read a skill by path,
|
|
73
|
+
`.agents/skills/<capability>/<skill>/SKILL.md`.
|
|
74
|
+
|
|
75
|
+
## Still known in 0.30.2
|
|
76
|
+
|
|
77
|
+
The 0.30.1 notes planned the first two below for 0.30.2. They are not in this
|
|
78
|
+
release; they are planned for 0.30.3.
|
|
79
|
+
|
|
80
|
+
- With no teams configured, a spawn is refused by the provider
|
|
81
|
+
(`E_SPAWN_FAILED`, relaying "no teams configured: run `oats aweb setup`"),
|
|
82
|
+
not by the kernel's `E_TEAM_UNCONFIGURED`.
|
|
83
|
+
- A capability operator command run from a deployment needs `--soul <soul>`.
|
|
84
|
+
- On a team you control (BYOT), retire cannot revoke membership; the retire
|
|
85
|
+
prints the owner's `aw id team remove-member` command, as in 0.30.0.
|
|
@@ -122,8 +122,8 @@ full copy** of every capability the soul resolved to:
|
|
|
122
122
|
<agents-root>/<soul>/instances/<instance>/
|
|
123
123
|
AGENTS.md # generated: soul AGENTS.md + kernel/work-mode blocks + each module's inject
|
|
124
124
|
CLAUDE.md → AGENTS.md
|
|
125
|
-
.agents/skills/ # canonical skill tree
|
|
126
|
-
<
|
|
125
|
+
.agents/skills/ # canonical skill tree, flat: the soul's skills and every module's, full copies
|
|
126
|
+
<skill>/SKILL.md # one level deep, where every harness discovers skills
|
|
127
127
|
.claude/skills → ../.agents/skills
|
|
128
128
|
.oats/modules/<capability>/ # the whole capability: oats.json, bin/, injects/, skills/ (hooks run from here)
|
|
129
129
|
work/ # worktree, checkout symlink, attached tree, or private directory
|
|
@@ -150,8 +150,8 @@ composed skills and instructions, a spawn records:
|
|
|
150
150
|
"commit": "3f2a9c1e…", "digest": "sha256-…", "materializedAt": "2026-09-24T10:12:44.118Z"
|
|
151
151
|
},
|
|
152
152
|
"oats.okf": {
|
|
153
|
-
"from": { "kind": "package", "package": "oats.okf", "version": "4.0.
|
|
154
|
-
"commit": "
|
|
153
|
+
"from": { "kind": "package", "package": "oats.okf", "version": "4.0.5", "commit": "26d8216f…", "integrity": "sha256-…", "repoKey": "github.com/awebai/oats-okf" },
|
|
154
|
+
"commit": "26d8216f…", "digest": "sha256-…", "materializedAt": "2026-09-24T10:12:44.201Z"
|
|
155
155
|
}
|
|
156
156
|
},
|
|
157
157
|
"providers": {
|
|
@@ -193,7 +193,8 @@ bump affects only new spawns.
|
|
|
193
193
|
OATS is a skill contributor, not a skill sandbox. The harness (pi, Claude Code,
|
|
194
194
|
Codex) starts with cwd = the instance home and its **own** skill discovery
|
|
195
195
|
intact: it sees, nearest first, the instance's `.agents/skills/` (soul skills
|
|
196
|
-
and the copied capability skills
|
|
196
|
+
and the copied capability skills, all flat at `.agents/skills/<skill>/SKILL.md`,
|
|
197
|
+
the one level deep Claude Code discovers through `.claude/skills`), the repo's own `.agents/skills/` once it
|
|
197
198
|
works in `work/`, and whatever the operator keeps at machine level. All three
|
|
198
199
|
are intended. Two *composed* skills with one name is a spawn error naming both
|
|
199
200
|
capabilities (`E_SKILL_DUPLICATE`); a composed skill versus an ambient one is
|