@awebai/oats 0.28.0 → 0.29.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/bin/oats.mjs +296 -106
- package/capabilities/oats-okf/bin/oats-okf.mjs +28 -8
- package/capabilities/oats-okf/injects/okf.md +33 -33
- package/capabilities/oats-okf/lib/binding-wire.mjs +4 -1
- package/capabilities/oats-okf/lib/config.mjs +2 -1
- package/capabilities/oats-okf/lib/consult.mjs +1 -5
- package/capabilities/oats-okf/lib/harvest-status.mjs +88 -0
- package/capabilities/oats-okf/lib/harvest-switch.mjs +81 -0
- package/capabilities/oats-okf/lib/okf-validate.mjs +123 -0
- package/capabilities/oats-okf/lib/sources.mjs +28 -3
- package/capabilities/oats-okf/lib/stores.mjs +9 -4
- package/capabilities/oats-okf/lib/worker.mjs +82 -8
- package/capabilities/oats-okf/oats.json +14 -8
- package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +8 -6
- package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +1 -1
- package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +104 -0
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +140 -0
- package/capabilities/oats-okf-harvest/injects/harvester.md +12 -0
- package/capabilities/oats-okf-harvest/oats.json +26 -0
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +168 -0
- package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +192 -0
- package/capabilities/{oats-okf/skills/okf → oats-okf-harvest/skills/okf-authoring}/SKILL.md +15 -30
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +149 -0
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +12 -0
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +45 -0
- package/capabilities/oats-okf-maintenance/oats.json +21 -0
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +144 -0
- package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +192 -0
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +151 -0
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +123 -0
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +146 -0
- package/capabilities/oats-review/injects/review.md +3 -2
- package/capabilities/oats-review/oats.json +3 -4
- package/docs/capabilities.md +41 -9
- package/docs/capability-manifest.schema.json +0 -7
- package/docs/desktop-cli-api.md +257 -11
- package/docs/implementation.md +1 -1
- package/docs/knowledge-capability-authoring.md +8 -2
- package/docs/knowledge-reference/package-craft.md +8 -5
- package/docs/knowledge.md +101 -0
- package/docs/oats-local.schema.json +31 -1
- package/docs/official-catalog.md +7 -4
- package/docs/packages.md +11 -5
- package/docs/release-lane.md +1 -1
- package/docs/release-notes/v0.29.0.md +240 -0
- package/docs/schedules.md +133 -5
- package/docs/souls-and-instances.md +4 -6
- package/docs/workspaces.md +11 -2
- package/lib/automations.mjs +369 -0
- package/lib/core.mjs +65 -154
- package/lib/instance-inspect.mjs +12 -4
- package/lib/instance-resolution.mjs +31 -182
- package/lib/materialize.mjs +5 -7
- package/lib/operator-dispatch.mjs +1 -2
- package/lib/packages.mjs +17 -0
- package/lib/remote.mjs +21 -1
- package/lib/resolve.mjs +51 -7
- package/lib/schedule.mjs +211 -41
- package/lib/triggers.mjs +182 -49
- package/lib/workspace.mjs +1 -1
- package/package-catalog.json +6 -4
- package/package.json +1 -1
- package/capabilities/oats-okf/agents/memory-harvest/AGENTS.md +0 -26
- package/capabilities/oats-okf/agents/memory-harvest/soul.yaml +0 -5
- package/capabilities/oats-okf/skills/memory-harvest/SKILL.md +0 -285
- package/capabilities/oats-review/agents/reviewer/AGENTS.md +0 -53
- package/capabilities/oats-review/agents/reviewer/soul.yaml +0 -6
- /package/capabilities/{oats-okf/skills/okf → oats-okf-harvest/skills/okf-authoring}/scripts/okf-validate.mjs +0 -0
|
@@ -57,8 +57,14 @@ source. The current authoring-reference patch is package 1.0.1: once framework
|
|
|
57
57
|
v0.23.1 is published, an explicit initial Git acquisition at that tag selects
|
|
58
58
|
the patch instead. It does not silently change the catalog's 1.0.0 selection
|
|
59
59
|
or an existing lock. For local development, use an explicit complete source
|
|
60
|
-
package path instead. Activation
|
|
61
|
-
|
|
60
|
+
package path instead. Activation targets the authoring skill, without
|
|
61
|
+
selecting or replacing a knowledge capability.
|
|
62
|
+
|
|
63
|
+
The expert is an oats.framework **package soul** from framework 1.3.0
|
|
64
|
+
(`oats-package/souls/knowledge-theory-expert/`, reading `oats.knowledge-theory`
|
|
65
|
+
1.1.0 from its own package): spawn it by its qualified name in the author's
|
|
66
|
+
repository, `oats spawn oats.framework/knowledge-theory-expert --repo <repo>`.
|
|
67
|
+
Before 1.3.0 it was a capability-defined agent, which OATS 0.29.0 removed.
|
|
62
68
|
There are no executable surfaces to trust in this package. Installed experts
|
|
63
69
|
use their materialized local curriculum, not this repository at runtime.
|
|
64
70
|
|
|
@@ -35,8 +35,7 @@ A knowledge implementation's capability manifest might begin:
|
|
|
35
35
|
"compatibility": { "oats": ">=0.22.19" },
|
|
36
36
|
"layer": "knowledge",
|
|
37
37
|
"skills": ["skills/native-reader", "skills/native-harvest"],
|
|
38
|
-
"inject": "injects/knowledge.md"
|
|
39
|
-
"agents": ["agents/native-harvester"]
|
|
38
|
+
"inject": "injects/knowledge.md"
|
|
40
39
|
}
|
|
41
40
|
```
|
|
42
41
|
|
|
@@ -49,14 +48,18 @@ kernel's real manifest validation, not this example as a complete schema.
|
|
|
49
48
|
|
|
50
49
|
The optional `oats.knowledge-theory` capability is deliberately **different**:
|
|
51
50
|
it is additive, declares no layer, injection, command or hook, and supplies
|
|
52
|
-
only
|
|
51
|
+
only its authoring skill; the expert that uses it is the oats.framework package
|
|
52
|
+
soul `knowledge-theory-expert`. It neither selects knowledge policy nor
|
|
53
53
|
depends on OKF. A runtime integration should not depend on it just to inherit
|
|
54
54
|
mandatory doctrine. Explicit versioned reuse is a choice, not a requirement.
|
|
55
55
|
|
|
56
56
|
## Soul craft
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
An agent a package ships is a **package soul**: `souls/<name>/` beside the
|
|
59
|
+
package's capabilities (listed in `oats-package.json` `souls:`), holding
|
|
60
|
+
`soul.yaml`, canonical `AGENTS.md` and relative `CLAUDE.md -> AGENTS.md`; it
|
|
61
|
+
reads the package's own capabilities with `from: here`. (A capability manifest
|
|
62
|
+
declares no agents: `agents:` was removed in OATS 0.29.0.) Keep role instructions to a screen or two:
|
|
60
63
|
role and boundaries, operating loop, verification, local skill pointer,
|
|
61
64
|
escalation. Do not bury an entire curriculum in always-loaded instructions.
|
|
62
65
|
|
package/docs/knowledge.md
CHANGED
|
@@ -311,6 +311,107 @@ receipts. Inputs are processed only when required destinations resolve. All-drop
|
|
|
311
311
|
or no-change judgment can be successful without inventing a PR. Enqueue, worker
|
|
312
312
|
spawn and command exit alone are not successful learning.
|
|
313
313
|
|
|
314
|
+
## Knowledge operations
|
|
315
|
+
|
|
316
|
+
> **Version scope:** oats.okf **4.0.0** on kernel **0.29.0** (package souls,
|
|
317
|
+
> triggers and workspace automations). Everything above describes the 2.x runtime, which 4.0.0 keeps for
|
|
318
|
+
> capture, custody and delivery. The design and its decisions are in
|
|
319
|
+
> [the knowledge-operations plan](design/2026-09-26-okf-knowledge-operations.md).
|
|
320
|
+
> The setup procedure is the `oats-onboarding` skill ("Knowledge operations with
|
|
321
|
+
> OKF") and okf's `okf-trigger-setup`.
|
|
322
|
+
|
|
323
|
+
From 4.0.0, harvested knowledge is judged by a harvester, reviewed by a
|
|
324
|
+
maintainer and merged without an operator in the loop, except where a merge
|
|
325
|
+
would supersede a human-accepted decision.
|
|
326
|
+
|
|
327
|
+
### The flow
|
|
328
|
+
|
|
329
|
+
1. **Capture.** A working soul whose knowledge slot is `oats.okf`, on a host
|
|
330
|
+
where harvest is on (below), registers a source at spawn. Capture and
|
|
331
|
+
custody are as above: notes and bounded transcript windows, copied outside
|
|
332
|
+
the home.
|
|
333
|
+
2. **Harvest.** The source's `run-source` job spawns the package soul
|
|
334
|
+
`oats.okf/knowledge-harvester` (team `okf`). It reads the input in full,
|
|
335
|
+
transcript windows included, and judges it with the OKF promotion
|
|
336
|
+
doctrine. It stages edits on the owned nodes and opens a PR on the
|
|
337
|
+
knowledge-base repo, labelled `okf-harvest`, whose body carries a fenced
|
|
338
|
+
`okf-harvest` provenance block (the run, the source soul and instance, the
|
|
339
|
+
owned and read nodes, the task references, the harvester's alias). It
|
|
340
|
+
stays alive, answering questions in `okf`, until the PR is merged or
|
|
341
|
+
closed, then retires. `harvester-max-age` (default 7d) bounds it; it never
|
|
342
|
+
closes its own PR.
|
|
343
|
+
3. **Trigger.** The workspace declares the trigger in a member repo,
|
|
344
|
+
`oats-triggers/okf-harvest-review.yaml` (`kind: oats-trigger`), from the package template
|
|
345
|
+
`oats.okf:harvest-review`. It names the host that runs it (`runsOn`, that
|
|
346
|
+
machine's `host.name`) and the GitHub account it acts as (`owner`, which
|
|
347
|
+
must be able to merge on the knowledge-base repo). Only that host, logged
|
|
348
|
+
in to `gh` as that account, polls for such PRs. For each one it spawns a
|
|
349
|
+
NEW `oats.okf/knowledge-maintainer`, joining `okf`. The event reaches it as
|
|
350
|
+
`OATS_TRIGGER_EVENT_FILE`. A local trigger (`oats trigger add`, this host
|
|
351
|
+
only) is the machine-private alternative. Triggers are described in
|
|
352
|
+
[schedules.md, "Triggers"](schedules.md#triggers), and the workspace
|
|
353
|
+
file in ["Workspace triggers and schedules"](schedules.md#workspace-triggers-and-schedules).
|
|
354
|
+
4. **Review.** The maintainer checks out the PR and situates it: the
|
|
355
|
+
provenance, the source soul's owned and read nodes, the neighbouring
|
|
356
|
+
concepts, and the source's tickets when a tasks capability can read them.
|
|
357
|
+
It records a verdict on the PR (`merge`, `amend+merge`, `request-changes`
|
|
358
|
+
or `close`), amends what needs amending, and merges with the host's `gh`. A
|
|
359
|
+
PR that would supersede a concept with human acceptance evidence is not
|
|
360
|
+
merged: it is labelled `okf-needs-human` for the workspace's human. The
|
|
361
|
+
maintainer tells the harvester the outcome and retires.
|
|
362
|
+
|
|
363
|
+
### Who gets which okf skills
|
|
364
|
+
|
|
365
|
+
| Capability | Composed into | Skills | Inject |
|
|
366
|
+
|---|---|---|---|
|
|
367
|
+
| `oats.okf` | every working soul whose knowledge slot it fills | `okf-consultation` (reading soul knowledge and citing it); `okf-instance-knowledge` (what instance knowledge is worth capturing, and the form of `STATE.md`, `log.md` and `notes/`) | the work mode: consult instance memory and soul knowledge at task start, after compaction and before decisions; capture before compaction |
|
|
368
|
+
| `oats.okf-harvest` | `oats.okf/knowledge-harvester` only | `knowledge-theory` (the OKF promotion doctrine); `knowledge-harvest` (the procedure, through the PR's lifetime); `okf-authoring` | the harvester's: a judge, not a worker; the staged roots are its only write surface |
|
|
369
|
+
| `oats.okf-maintenance` | `oats.okf/knowledge-maintainer` only | `knowledge-theory`; `knowledge-review`; `okf-authoring`; `okf-trigger-setup` | the maintainer's: one PR per instance; supersede explicitly, never silently |
|
|
370
|
+
|
|
371
|
+
Working souls get no promotion doctrine: the harvester is the only judge of
|
|
372
|
+
what is promoted, and the maintainer the only one who merges. The shared
|
|
373
|
+
skills ship as identical copies in each capability. The harvester and the
|
|
374
|
+
maintainer hold no knowledge slot, so nothing harvests them.
|
|
375
|
+
|
|
376
|
+
### The harvest switch
|
|
377
|
+
|
|
378
|
+
Harvest is off unless both the host and the soul allow it:
|
|
379
|
+
|
|
380
|
+
| Where | Setting | Effect |
|
|
381
|
+
|---|---|---|
|
|
382
|
+
| The host, `oats-local.yaml` | `settings.oats.okf.harvest: on` (default `off`) | This host harvests its working souls. |
|
|
383
|
+
| A soul, `soul.yaml` | `knowledge: { harvest: off }` | This soul is never harvested, whatever the host says. |
|
|
384
|
+
|
|
385
|
+
Off means **no capture at all**: no source is registered and no transcript or
|
|
386
|
+
notes enter custody, so nothing accumulates for later. Turning it on starts
|
|
387
|
+
with the next session. `oats okf setup --harvest on|off` writes the host
|
|
388
|
+
setting, and `oats okf harvest-status [--soul <soul>]` reports the effective
|
|
389
|
+
value, the row that decided it and the registered sources.
|
|
390
|
+
`oats schedule disable <job>` on a source's `run-source` job is an emergency
|
|
391
|
+
brake for one source, not the switch. The review trigger does not depend on the
|
|
392
|
+
switch: a host can review harvest PRs from other hosts without harvesting.
|
|
393
|
+
Keep harvest off until the end-to-end check in `okf-trigger-setup` passes.
|
|
394
|
+
|
|
395
|
+
### The `okf` team
|
|
396
|
+
|
|
397
|
+
The package souls carry `team: okf`. The workspace declares the label and maps
|
|
398
|
+
it to a messaging team:
|
|
399
|
+
|
|
400
|
+
```yaml
|
|
401
|
+
teams:
|
|
402
|
+
okf: { description: Knowledge operations }
|
|
403
|
+
messaging:
|
|
404
|
+
byTeam:
|
|
405
|
+
okf: { team: <messaging team id> }
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
Harvesters and maintainers talk there (subjects prefixed `okf:` with the PR's
|
|
409
|
+
URL) without writing into the working teams. Like every label it organises and
|
|
410
|
+
gates nothing. A workspace without it reports `E_TEAM_UNKNOWN` on both package
|
|
411
|
+
souls in discovery. They still spawn, but into no messaging team, so the
|
|
412
|
+
harvester and the maintainer cannot talk, and `oats trigger test` fails its
|
|
413
|
+
team check.
|
|
414
|
+
|
|
314
415
|
## Inspection and operator commands
|
|
315
416
|
|
|
316
417
|
Run home-local commands from that source home: inside an instance the
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://oats.dev/schemas/local-v2.json",
|
|
4
4
|
"title": "Deployment-local overrides v2 (oats-local.yaml)",
|
|
5
|
-
"description": "The operator's side of a workspace: which workspace this machine realizes, where member clones live when not at the taught convention, host-owned capability settings (absolute paths belong HERE, never in the workspace file), souls disabled on this machine, and the named launch configurations this host offers. Never shared through Git.",
|
|
5
|
+
"description": "The operator's side of a workspace: which workspace this machine realizes, where member clones live when not at the taught convention, host-owned capability settings (absolute paths belong HERE, never in the workspace file), souls disabled on this machine, this host's name and the workspace triggers and schedules it does not run, and the named launch configurations this host offers. Never shared through Git.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["schemaVersion", "workspace"],
|
|
8
8
|
"additionalProperties": false,
|
|
@@ -64,6 +64,36 @@
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
|
+
"host": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"additionalProperties": false,
|
|
70
|
+
"required": ["name"],
|
|
71
|
+
"properties": {
|
|
72
|
+
"name": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$", "description": "This machine's name (0.29.0). A workspace trigger or schedule runs on the host whose name is its `runsOn` (and only when this host's gh account is its `owner`). A machine fact, never in Git." }
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"triggers": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"additionalProperties": false,
|
|
78
|
+
"properties": {
|
|
79
|
+
"disabled": {
|
|
80
|
+
"description": "Workspace triggers this host does not run, by qualified id <member>/<id>, without a commit (`oats trigger disable <member>/<id>` writes it). Local triggers are enabled and disabled in oats-schedules.json.",
|
|
81
|
+
"type": "array", "uniqueItems": true,
|
|
82
|
+
"items": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*/[a-z0-9-]{1,40}$" }
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"schedules": {
|
|
87
|
+
"type": "object",
|
|
88
|
+
"additionalProperties": false,
|
|
89
|
+
"properties": {
|
|
90
|
+
"disabled": {
|
|
91
|
+
"description": "Workspace schedules this host does not run, by qualified id <member>/<id>, without a commit (`oats schedule disable <member>/<id>` writes it). Local schedules are enabled and disabled in oats-schedules.json.",
|
|
92
|
+
"type": "array", "uniqueItems": true,
|
|
93
|
+
"items": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*/[a-z0-9-]{1,40}$" }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
67
97
|
"souls": {
|
|
68
98
|
"type": "object",
|
|
69
99
|
"additionalProperties": false,
|
package/docs/official-catalog.md
CHANGED
|
@@ -65,13 +65,16 @@ this policy does not invent new catalog or manifest fields.
|
|
|
65
65
|
|
|
66
66
|
## Listed first set
|
|
67
67
|
|
|
68
|
-
- Listed capabilities: `oats.okf`, `oats.
|
|
69
|
-
`oats.
|
|
70
|
-
-
|
|
68
|
+
- Listed capabilities: `oats.okf`, `oats.okf-harvest`, `oats.okf-maintenance`,
|
|
69
|
+
`oats.aweb`, `oats.authoring`, `oats.jira`, `oats.linear`, `oats.dev`,
|
|
70
|
+
`oats.knowledge-theory`, `oats.core` and `oats.setup`. `oats.okf-harvest` and
|
|
71
|
+
`oats.okf-maintenance` select the `oats.okf` package (4.0.0).
|
|
72
|
+
- **`oats.framework` 1.3.0** is listed at tag `oats-framework/v1.3.0` in
|
|
71
73
|
`awebai/oats`, payload root `oats-package`. The `oats.core`, `oats.setup` and
|
|
72
74
|
`oats.knowledge-theory` aliases select that distribution; package identity is
|
|
73
75
|
distinct from capability identity. Core supplies operation/soul guidance;
|
|
74
|
-
setup supplies OATS Soul Setup, configuration and package guidance.
|
|
76
|
+
setup supplies OATS Soul Setup, configuration and package guidance. The
|
|
77
|
+
package also ships the `knowledge-theory-expert` package soul.
|
|
75
78
|
|
|
76
79
|
These entries are in the current repository catalog. An older installed CLI keeps
|
|
77
80
|
its bundled catalog; publication here does not update that installation or rewrite
|
package/docs/packages.md
CHANGED
|
@@ -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.
|
|
78
|
-
oats.okf:
|
|
77
|
+
oats.framework: v1.3.0
|
|
78
|
+
oats.okf: v4.0.0
|
|
79
79
|
oats.aweb: v1.14.2
|
|
80
80
|
teams:
|
|
81
81
|
global: { description: Org-wide }
|
|
@@ -263,7 +263,13 @@ oats-package/
|
|
|
263
263
|
`agents/<package>--<soul>/` (the package id with `.` as `-`:
|
|
264
264
|
`agents/oats-okf--knowledge-maintainer/`), which is also its agent name
|
|
265
265
|
(`OATS_AGENT`, the `oats status` row); its instances are named from it
|
|
266
|
-
(`oats-okf-knowledge-maintainer-<purpose>`).
|
|
266
|
+
(`oats-okf-knowledge-maintainer-<purpose>`). That prefix counts toward the
|
|
267
|
+
64-character instance-name limit, so a package soul's purposes are short:
|
|
268
|
+
`oats-okf-knowledge-maintainer-` is 30 characters, which leaves 34 for the
|
|
269
|
+
purpose (fewer when a `-2` suffix de-duplicates it). A longer one is
|
|
270
|
+
`E_INSTANCE_NAME_INVALID { prefix, purpose, maxPurpose }`, naming the budget;
|
|
271
|
+
a trigger's or schedule's purpose template obeys the same limit when it
|
|
272
|
+
renders. A soul name never holds `--`,
|
|
267
273
|
so a member soul of the same bare name keeps its own `agents/<soul>/`.
|
|
268
274
|
Two packages whose ids sanitise alike (`a.b`, `a-b`) and that ship a
|
|
269
275
|
same-named soul would share a directory: both are listed with an
|
|
@@ -338,8 +344,8 @@ A soul that names one of the package's capabilities with
|
|
|
338
344
|
}
|
|
339
345
|
```
|
|
340
346
|
|
|
341
|
-
`ref` carries the tag convention: a workspace's `oats.framework: v1.
|
|
342
|
-
resolves to tag `oats-framework/v1.
|
|
347
|
+
`ref` carries the tag convention: a workspace's `oats.framework: v1.3.0`
|
|
348
|
+
resolves to tag `oats-framework/v1.3.0`. Resolving through the catalog never
|
|
343
349
|
advances a lock by itself — `oats sync` does, and
|
|
344
350
|
says so.
|
|
345
351
|
|
package/docs/release-lane.md
CHANGED
|
@@ -30,7 +30,7 @@ under `stage/<tag>/logs/`; a failing step exits non-zero with the log path.
|
|
|
30
30
|
|
|
31
31
|
| Phase | Mirrors in `release.yml` | Writes |
|
|
32
32
|
| --- | --- | --- |
|
|
33
|
-
| `build --tag vX.Y.Z [--sha <commit>]` |
|
|
33
|
+
| `build --tag vX.Y.Z [--sha <commit>]` | jobs `build-and-test` and `tests` (the lane runs the suite unsharded): notes gate, three-manifest bump, `node --check`, `npm ci`, `npm run check`, Desktop test deps, `npm test`, `pack:check` and the tarball greps, `smoke:tarball`, the `version --json` probe | `npm/*.tgz`, `MANIFEST.json` |
|
|
34
34
|
| `desktop --tag vX.Y.Z --arch arm64\|x64` | one `desktop-build` matrix leg: desktop `npm ci`, `npm test`, `npm run dist -- --<arch>`, strict deep `codesign --verify` (macOS), `dist:smoke` in build-verify mode | `assets/oats-desktop-*` |
|
|
35
35
|
| `stage --tag vX.Y.Z` | publish job, "Checksums" (`shasum -a 256`) | `assets/SHA256SUMS.txt` |
|
|
36
36
|
| `publish-npm --tag vX.Y.Z [--dry-run] --yes` | publish job, the two guarded `npm publish --access public` steps, kernel then adapter | — |
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# OATS 0.29.0
|
|
2
|
+
|
|
3
|
+
## Added
|
|
4
|
+
|
|
5
|
+
- **Workspace triggers and schedules** (feature `automations`). A trigger or a
|
|
6
|
+
schedule can now be declared in Git, in any confirmed member, and shared with the
|
|
7
|
+
team. It is named `<member>/<id>`, and a machine's own ones are named
|
|
8
|
+
`local/<id>`. See
|
|
9
|
+
[schedules.md#workspace-triggers-and-schedules](../schedules.md#workspace-triggers-and-schedules).
|
|
10
|
+
- Triggers and schedules stay separate:
|
|
11
|
+
|
|
12
|
+
| | triggers | schedules |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| folder | `oats-triggers/` | `oats-schedules/` |
|
|
15
|
+
| file name anywhere in the member | `*.oats-trigger.yaml` | `*.oats-schedule.yaml` |
|
|
16
|
+
| `kind:` | `oats-trigger` | `oats-schedule` |
|
|
17
|
+
| commands and list | `oats trigger …` | `oats schedule …` |
|
|
18
|
+
| opt-out | `triggers.disabled` | `schedules.disabled` |
|
|
19
|
+
|
|
20
|
+
`oats-package/`, `.git/` and `node_modules/` are never scanned.
|
|
21
|
+
- Every file carries `kind`, `schemaVersion: 1`, `runsOn` (the host that runs it)
|
|
22
|
+
and `owner` (the GitHub account it acts as). The wrong kind is
|
|
23
|
+
`E_AUTOMATION_SCHEMA`, and a duplicate id is `E_AUTOMATION_DUPLICATE`.
|
|
24
|
+
- A host runs one only when `runsOn` is its new `oats-local.yaml` `host.name`
|
|
25
|
+
**and** its `gh` is logged in as `owner`. Otherwise the item is listed as
|
|
26
|
+
`assigned-elsewhere`, `owner-mismatch` or `host-unnamed`.
|
|
27
|
+
- `oats trigger disable <member>/<id>` and `oats schedule disable <member>/<id>`
|
|
28
|
+
stop it on this host without a commit, by writing `triggers.disabled` or
|
|
29
|
+
`schedules.disabled` in `oats-local.yaml`.
|
|
30
|
+
- `oats sync` takes a snapshot of them. The host tick reads the snapshot and
|
|
31
|
+
refreshes it every ten minutes (`oats automations refresh`).
|
|
32
|
+
- `oats trigger add … --workspace <member> --runs-on <host> --owner <host>/<login>`
|
|
33
|
+
writes the file in a checkout of the member, or prints it. `oats schedule add`
|
|
34
|
+
takes the same options.
|
|
35
|
+
- `oats trigger list --json` and `oats schedule list --json` answer the Desktop's
|
|
36
|
+
rows for both levels: the owner, where it runs and why (not), the soul and
|
|
37
|
+
where it comes from, the task verbatim, the event or cron, and the last and
|
|
38
|
+
next run. Local schedule rows keep their bare `id` and add `qualifiedId`. See
|
|
39
|
+
[desktop-cli-api.md](../desktop-cli-api.md).
|
|
40
|
+
- Each row's `origin` carries `url` (the file on GitHub at its commit) and
|
|
41
|
+
`localPath` (the file in this machine's clone of the member), each `null` when
|
|
42
|
+
there is none. Both lists carry `host.ghUser` (who `gh` is logged in as, per
|
|
43
|
+
GitHub host) and the host `scheduler`. "When it next runs" is `nextDue`
|
|
44
|
+
everywhere.
|
|
45
|
+
- **Desktop facts** (feature `desktop-facts`): kernel facts the Desktop's Workspace
|
|
46
|
+
view shows, so it never derives them. Every field is an addition. See
|
|
47
|
+
[desktop-cli-api.md](../desktop-cli-api.md#desktop-facts-feature-desktop-facts-oats-0290).
|
|
48
|
+
- `oats inspect --soul --json`: each capability's `composedFrom` (`workspace`,
|
|
49
|
+
`team:<label>` or `soul`), and `capabilitiesOff[]`, the defaults the soul
|
|
50
|
+
turned off (`<id>: off` or `<slot>: none`).
|
|
51
|
+
- `oats souls --json` rows: the default `harness`/`model` a spawn starts with,
|
|
52
|
+
and `spawnable` and `problem`, the refusal a spawn would meet (it spawns
|
|
53
|
+
nothing). Also `file`.
|
|
54
|
+
- `oats capabilities --json` rows: `layer` on package rows too, `description`,
|
|
55
|
+
`skills`/`commands`/`hooks` by name, `file`, and a member capability's `tree`
|
|
56
|
+
(its Git tree id).
|
|
57
|
+
- `oats workspace status --json`:
|
|
58
|
+
- the workspace and team `defaults` as rows;
|
|
59
|
+
- this computer's member `clones` and the rule that found each;
|
|
60
|
+
- `disabledSouls`;
|
|
61
|
+
- `lock` (`path`, `lockfileVersion`);
|
|
62
|
+
- `packages[].latest` when the shipped catalog has a newer version;
|
|
63
|
+
- file locations (`workspace.file`, `members[].url`,
|
|
64
|
+
`members[].membershipFile`).
|
|
65
|
+
- `oats status --json` instance rows: `startedAt` (the last start or restart),
|
|
66
|
+
`modelFrom` (also recorded in `instance.json`) and `identityAddress`. A member
|
|
67
|
+
module's drift `current` gains `version`.
|
|
68
|
+
- URLs are GitHub pages at the row's commit, `null` for any other host.
|
|
69
|
+
- `oats help` lists `spawn --provider`.
|
|
70
|
+
- **`oats schedule test <id>`**: where a schedule runs, whether its soul resolves
|
|
71
|
+
(a spawn preview) and when it is next due. It spawns nothing, like
|
|
72
|
+
`oats trigger test`.
|
|
73
|
+
- **`launchConfig`** on a trigger's `spawn` and on a spawn schedule: the soul starts
|
|
74
|
+
on that launch configuration of the running host (`oats-local.yaml`
|
|
75
|
+
`launch-configs`). A package trigger template can expose it as a parameter.
|
|
76
|
+
- `oats trigger status --json` rows add `nextDue`, `concurrency` and `liveCount`;
|
|
77
|
+
`oats trigger test --json` `wouldFire` items add `repo`.
|
|
78
|
+
- **`OATS_SETTINGS_ORIGINS`** beside `OATS_SETTINGS`, for every hook and
|
|
79
|
+
capability command (and readiness probes): where each leaf of the payload came
|
|
80
|
+
from, a JSON pointer → `{ kind, at }` (`manifest-default`, `workspace`, `soul`,
|
|
81
|
+
`host`, `spawn`). A provider can tell a soul-set value from a host-set one
|
|
82
|
+
without reading `soul.yaml`. `instance.json` records it with the settings
|
|
83
|
+
(`capabilities[].settingsOrigins`, `capabilityRuntime[].settingsOrigins`).
|
|
84
|
+
|
|
85
|
+
## Changed
|
|
86
|
+
|
|
87
|
+
- **oats.framework 1.3.0 pinned.** The official catalog pins `oats.framework` to
|
|
88
|
+
`oats-framework/v1.3.0` (this repository's workspace pins it too). 0.28.1 was never
|
|
89
|
+
released, so this pin covers three framework releases:
|
|
90
|
+
- **1.2.0:** the setup-admin skills. oats.setup 2.1.0 adds `oats-setup-model`,
|
|
91
|
+
`oats-workspace-config`, `oats-teams`, `oats-automations` and a setup inject,
|
|
92
|
+
and oats.core 2.1.0 is current for an instance's view. The `oats-setup-admin`
|
|
93
|
+
soul uses them.
|
|
94
|
+
- **1.2.1:** OKF knowledge operations in onboarding (oats.setup 2.1.1,
|
|
95
|
+
`oats-onboarding`).
|
|
96
|
+
- **1.3.0:** `knowledge-theory-expert` is a package soul
|
|
97
|
+
(`oats spawn oats.framework/knowledge-theory-expert`), with
|
|
98
|
+
oats.knowledge-theory 1.1.0.
|
|
99
|
+
|
|
100
|
+
A workspace picks it up by pinning `oats.framework: v1.3.0` and running
|
|
101
|
+
`oats sync`.
|
|
102
|
+
- **A local trigger's id is `local/<id>`** in `oats trigger` rows, in its dedup keys
|
|
103
|
+
and state, and in a triggered instance's `instance.json.trigger.id` and event
|
|
104
|
+
file. It was the bare id in 0.28.0. Every `oats trigger` verb still accepts the
|
|
105
|
+
bare id.
|
|
106
|
+
|
|
107
|
+
## Removed
|
|
108
|
+
|
|
109
|
+
- **BREAKING: capability-defined agents.** A capability manifest's `agents:` is
|
|
110
|
+
refused at resolution, with
|
|
111
|
+
`E_CAPABILITY_AGENTS_REMOVED { capability, agents, from }`. The remedy names the
|
|
112
|
+
replacement: a **package soul** (`souls/<name>/` in the package, spawned as
|
|
113
|
+
`oats spawn <package>/<name>`) or a **member soul**. `oats spawn <name>` no
|
|
114
|
+
longer falls back to an agent declared by a materialized or locked module; an
|
|
115
|
+
unknown name is `E_SOUL_UNKNOWN`. The manifest schema drops `agents`.
|
|
116
|
+
- A home an earlier kernel spawned for one (its agent directory holds only
|
|
117
|
+
`instances/`) is still listed by `oats status`, may be a `--parent`, and
|
|
118
|
+
retires. Nothing creates one any more.
|
|
119
|
+
- This repository's users moved:
|
|
120
|
+
- oats.okf 4.0.0's harvester is a package soul;
|
|
121
|
+
- the post-commit **`reviewer`** is an oats.dev **1.1.0** package soul
|
|
122
|
+
(`oats.dev/reviewer`, beside oats.review 1.3.0; the pin moves to
|
|
123
|
+
`v1.1.0`), and oats.review's inject spawns it unchanged, now named
|
|
124
|
+
`oats-dev-reviewer-<short-sha>`;
|
|
125
|
+
- **`knowledge-theory-expert`** is an oats.framework **1.3.0** package soul
|
|
126
|
+
(`oats spawn oats.framework/knowledge-theory-expert`), with
|
|
127
|
+
oats.knowledge-theory 1.1.0.
|
|
128
|
+
- A v2 soul.yaml declares no harness or model, so the reviewer's harness and
|
|
129
|
+
model now come from the **spawner's launch configuration** (its former pin was
|
|
130
|
+
pi, gpt-5.6-sol).
|
|
131
|
+
|
|
132
|
+
## Fixed
|
|
133
|
+
|
|
134
|
+
- A package soul's derived instance name is checked and de-duplicated as the name
|
|
135
|
+
the home gets (`acme-pkg-keeper-<purpose>`, not `acme-pkg--keeper-…`). A
|
|
136
|
+
purpose inside the limit is no longer refused, and a second spawn with the same
|
|
137
|
+
purpose is `…-2` instead of a collision. An over-long purpose is
|
|
138
|
+
`E_INSTANCE_NAME_INVALID` naming how many characters the purpose may have
|
|
139
|
+
(`details.maxPurpose`).
|
|
140
|
+
|
|
141
|
+
- Concurrent spawns of the same instance: a spawn that loses the race now refuses
|
|
142
|
+
with `E_PLACEMENT_TAKEN` (it created nothing). It used to fail with an uncoded
|
|
143
|
+
"instance already exists" error, surfaced as `E_SPAWN_FAILED`.
|
|
144
|
+
- Disabled-here messages name the per-kind key (`triggers.disabled`,
|
|
145
|
+
`schedules.disabled`).
|
|
146
|
+
|
|
147
|
+
## Desktop
|
|
148
|
+
|
|
149
|
+
- **Schedules and Triggers tabs** on the automations contract. Rows are grouped by
|
|
150
|
+
where they run: on this computer, needing attention here, or elsewhere. Workspace
|
|
151
|
+
and local items are listed together, with an origin chip, a filter and a search.
|
|
152
|
+
- Each row has an on-here switch, the soul and where it comes from, the cron in
|
|
153
|
+
words or the trigger's event, and where it runs and as whom. It also shows the
|
|
154
|
+
last and next run, and a menu (Open, Test, Run now, on/off here, Open file).
|
|
155
|
+
- A row opens a detail page: the prompt verbatim, the schedule or event, recent
|
|
156
|
+
runs, the kernel's placement verdict, where it comes from, and the test result.
|
|
157
|
+
- The old Schedules read path is gone.
|
|
158
|
+
- **Why each capability is there.** The soul page and an instance's soul tab tag
|
|
159
|
+
each capability `workspace`, `team · <label>` or `soul`, and list the defaults the
|
|
160
|
+
soul turned off (including a slot it emptied), from the kernel's Desktop facts.
|
|
161
|
+
- **A moved module names its versions**: "moved 2.1.5 → 2.2.0" in the instance
|
|
162
|
+
panel's module drift.
|
|
163
|
+
- The Desktop accepts OATS CLIs `>=0.25.8 <0.30.0`.
|
|
164
|
+
|
|
165
|
+
## Internal
|
|
166
|
+
|
|
167
|
+
- The release workflow runs the test suite in six parallel shards, like PR CI, and
|
|
168
|
+
publication waits for every shard.
|
|
169
|
+
|
|
170
|
+
## Upgrading from 0.28
|
|
171
|
+
|
|
172
|
+
> **0.29.0 and oats.okf 4.0.0 move in lockstep.** On kernel 0.29.0, oats.okf ≤3.x
|
|
173
|
+
> is refused because it declares a capability agent, and oats.okf 4.0.0 requires
|
|
174
|
+
> kernel 0.29.0. A deployment on okf 3.x therefore **stays on kernel 0.28 until it
|
|
175
|
+
> moves its pins**. It then upgrades in one sitting, in this order:
|
|
176
|
+
|
|
177
|
+
1. **Upgrade the kernel**: the npm package, the pi adapter and the Desktop, all
|
|
178
|
+
0.29.0.
|
|
179
|
+
2. **Move the pins** to the official catalog's: `oats.okf: v4.0.0`,
|
|
180
|
+
`oats.dev: v1.1.0`, `oats.framework: v1.3.0`.
|
|
181
|
+
3. **Run `oats sync`.**
|
|
182
|
+
|
|
183
|
+
Between step 1 and step 3, a package pinned below its 0.29 release still declares
|
|
184
|
+
`agents:`. A spawn, preview or `inspect --soul` of any soul that composes it
|
|
185
|
+
refuses with `E_CAPABILITY_AGENTS_REMOVED`:
|
|
186
|
+
- **oats.okf ≤3.x** (`memory-harvest`): this is **every soul with oats.okf in its
|
|
187
|
+
knowledge slot**;
|
|
188
|
+
- **oats.dev 1.0.x** (`reviewer`);
|
|
189
|
+
- **oats.framework ≤1.2.x** (`knowledge-theory-expert`).
|
|
190
|
+
|
|
191
|
+
Harvest is off by default in okf 4.0.0. Switch it on
|
|
192
|
+
(`oats okf setup --harvest on`) where you want it.
|
|
193
|
+
|
|
194
|
+
Homes spawned earlier keep loading their recorded modules. Homes spawned for a
|
|
195
|
+
capability agent stay listed and retirable.
|
|
196
|
+
|
|
197
|
+
## oats.okf 4.0.0 (catalog pin and bundled mirror)
|
|
198
|
+
|
|
199
|
+
The official catalog now pins `oats.okf` to `v4.0.0` (tag object `239f2885`,
|
|
200
|
+
commit `1f0ba12f`). The copy bundled in this package is its byte mirror.
|
|
201
|
+
|
|
202
|
+
**BREAKING:**
|
|
203
|
+
- The package requires `oats >=0.29.0`; an older kernel refuses it
|
|
204
|
+
(`E_CAPABILITY_INCOMPATIBLE`).
|
|
205
|
+
- The `okf` and `memory-harvest` skills are gone from `oats.okf`.
|
|
206
|
+
|
|
207
|
+
- **Three capabilities.** The package now exports:
|
|
208
|
+
- `oats.okf`: the knowledge slot;
|
|
209
|
+
- `oats.okf-harvest`: the harvester's completion and status commands;
|
|
210
|
+
- `oats.okf-maintenance`: the maintainer's review context.
|
|
211
|
+
|
|
212
|
+
The catalog maps `oats.okf-harvest` and `oats.okf-maintenance` to the
|
|
213
|
+
`oats.okf` package.
|
|
214
|
+
- **Working souls get two skills and the inject.** A soul with `oats.okf` in
|
|
215
|
+
its knowledge slot gets `okf-consultation` and `okf-instance-knowledge`, and
|
|
216
|
+
the okf inject.
|
|
217
|
+
- **The harvester is a package soul.** `oats okf run-source` (and `oats okf
|
|
218
|
+
harvest`) spawns `oats.okf/knowledge-harvester`. It is named
|
|
219
|
+
`okf-harvester-<run>` and homes under
|
|
220
|
+
`agents/oats-okf--knowledge-harvester/`. It is no longer the `memory-harvest`
|
|
221
|
+
capability agent. After a successful completion it stays alive in the `okf`
|
|
222
|
+
team until its PR is merged or closed. `oats.okf/knowledge-maintainer` is the
|
|
223
|
+
package's second soul.
|
|
224
|
+
- **The harvest-review trigger.** The package ships the trigger template
|
|
225
|
+
`harvest-review` (`triggers/harvest-review.json`). It watches the labelled
|
|
226
|
+
harvest PRs.
|
|
227
|
+
- **`harvest: on|off`** (default **off**). Harvest is a host switch in
|
|
228
|
+
`oats-local.yaml` `settings.oats.okf.harvest` (`oats okf setup --harvest
|
|
229
|
+
on|off`). Off means no source registration, capture or custody. A soul can
|
|
230
|
+
only opt out (`knowledge: { harvest: off }`).
|
|
231
|
+
- **`oats okf read` is removed** (`E_REMOVED`). Use `oats okf cat --base
|
|
232
|
+
<alias> <path>`, which takes the same path and gives the same text and
|
|
233
|
+
receipt.
|
|
234
|
+
|
|
235
|
+
The bundled mirror now covers the three capability directories
|
|
236
|
+
(`capabilities/oats-okf`, `capabilities/oats-okf-harvest`,
|
|
237
|
+
`capabilities/oats-okf-maintenance`). The package's souls and trigger are
|
|
238
|
+
checked byte for byte in `scripts/okf-source-inventory.json` (schemaVersion 2).
|
|
239
|
+
The npm package does not ship them, because the kernel reads a package's souls
|
|
240
|
+
and triggers from Git at its locked commit.
|