@awebai/oats 0.22.17 → 0.23.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.
Files changed (45) hide show
  1. package/README.md +7 -2
  2. package/bin/oats.mjs +365 -31
  3. package/docs/configuration.md +65 -0
  4. package/docs/design/2026-09-07-mobile-agent-management-proposal.md +228 -0
  5. package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +558 -0
  6. package/docs/design/2026-09-13-knowledge-and-memory-direction.md +744 -0
  7. package/docs/design/2026-09-13-knowledge-implementation.md +127 -0
  8. package/docs/design/2026-09-13-knowledge-location-contract.md +340 -0
  9. package/docs/design/launch-configurations.md +164 -0
  10. package/docs/design/package-runtime-api.md +177 -3
  11. package/docs/desktop-cli-api.md +68 -2
  12. package/docs/desktop-instance-start.md +39 -3
  13. package/docs/execution-targets.md +16 -0
  14. package/docs/knowledge-capability-authoring.md +98 -0
  15. package/docs/knowledge-reference/acceptance.md +108 -0
  16. package/docs/knowledge-reference/adoption.md +61 -0
  17. package/docs/knowledge-reference/harvester.md +107 -0
  18. package/docs/knowledge-reference/model.md +84 -0
  19. package/docs/knowledge-reference/package-craft.md +126 -0
  20. package/docs/knowledge-reference/provider-mapping.md +77 -0
  21. package/docs/knowledge-reference/reader-capture.md +87 -0
  22. package/docs/knowledge-theory.md +20 -6
  23. package/docs/layers.md +8 -7
  24. package/docs/oats-config.schema.json +33 -2
  25. package/docs/release-notes/v0.22.18.md +101 -0
  26. package/docs/release-notes/v0.22.19.md +115 -0
  27. package/docs/release-notes/v0.23.0.md +93 -0
  28. package/docs/souls-and-instances.md +18 -1
  29. package/injects/work-directory.md +18 -0
  30. package/lib/core.mjs +1109 -187
  31. package/lib/schedule.mjs +12 -2
  32. package/lib/servers.mjs +89 -4
  33. package/package.json +2 -2
  34. package/packages/record/README.md +19 -0
  35. package/packages/record/bin/capture.mjs +144 -53
  36. package/packages/record/bin/recall.mjs +17 -11
  37. package/packages/record/bin/record-native-start.mjs +11 -0
  38. package/packages/record/lib/capture-cc.mjs +82 -27
  39. package/packages/record/lib/capture-lock.mjs +81 -5
  40. package/packages/record/lib/formats.mjs +108 -21
  41. package/packages/record/lib/native-history.mjs +87 -0
  42. package/packages/record/lib/session-roots.mjs +90 -0
  43. package/packages/record/lib/session-snapshot.mjs +61 -0
  44. package/packages/record/lib/sessions-for-home.mjs +88 -56
  45. package/skills/oats/SKILL.md +3 -1
@@ -0,0 +1,101 @@
1
+ # OATS v0.22.18
2
+
3
+ Choose how an agent runs without replacing its home. Desktop offers
4
+ **Start…** for stopped instances and **Restart with…** for running
5
+ instances, with harness, model, permissions and named launch
6
+ configurations. The kernel records what each home was started with and
7
+ starts it again the same way.
8
+
9
+ ## Named launch configurations
10
+
11
+ Define a reusable configuration in a scope's `oats-config.yaml`, or use
12
+ **Manage launch configurations** in Desktop. A configuration chooses `pi`,
13
+ `claude` or `codex`, an optional executable or wrapper, literal arguments,
14
+ environment values or references, a default model and the shared `yolo`
15
+ setting.
16
+
17
+ ```yaml
18
+ launch-configs:
19
+ codex-personal:
20
+ runtime: codex
21
+ args: ["--profile", "personal"]
22
+ yolo: true
23
+ ```
24
+
25
+ Arguments are passed literally; native configuration files and account
26
+ settings stay under the harness's control. For environment credentials use
27
+ a reference such as `API_KEY: {fromEnv: PERSONAL_KEY}`: the execution host
28
+ resolves it each time the agent starts. The recorded recipe, receipts,
29
+ previews, roster answers and spawn answers do not expose the value (the
30
+ launch itself and its transport necessarily use it). A configuration cannot name the kernel's own launch
31
+ environment or override environment a capability owns.
32
+
33
+ An existing instance keeps its recorded launch configuration even if the
34
+ scope's definition changes or disappears. Select a named configuration
35
+ explicitly to apply its current definition. Changing only the model or
36
+ permissions keeps the rest of the recorded invocation; choosing a harness
37
+ without a configuration starts that harness's defaults, with no model
38
+ carried across harnesses.
39
+
40
+ `oats launch-config list | set | remove | preview` author and inspect
41
+ configurations; `oats spawn --launch-config` starts a new instance under
42
+ one; a soul may name a default (`launch-config:` in soul.yaml,
43
+ `oats soul set --launch-config`).
44
+
45
+ ## Restart in place
46
+
47
+ `oats session start` with a selection validates the requested launch
48
+ (recipe, executable, references, capability preparation, runtime packages)
49
+ and starts a stopped instance; it never stops a running harness. Only
50
+ `oats session restart` does: it runs the same checks first, then sends
51
+ SIGTERM to the harness under the pane's launcher and waits a bounded time
52
+ for it to end; it does not escalate to a forced kill and refuses to launch
53
+ a second harness if it cannot confirm the first has stopped, reporting what
54
+ was signalled and observed. The instance keeps its home, identity, work and
55
+ notes; OATS does not transfer a native conversation between harnesses.
56
+ Save work before restarting.
57
+
58
+ Capabilities take part through what was captured for the home: a capability
59
+ may declare a `launch` hook to prepare another harness (under the settings
60
+ captured at spawn, with the scope's current manifest and trust); a
61
+ capability that contributed harness-specific arguments and cannot prepare
62
+ the new one refuses the switch. Homes that predate launch recipes are
63
+ converted narrowly from their recorded command when a selection asks for
64
+ it; unrecognized arguments are refused by name.
65
+
66
+ One limitation, stated rather than hidden: a runtime-package requirement is
67
+ verified with the package manager's controlled list command under the
68
+ launch's environment and executable, which cannot carry a configuration's
69
+ arguments. When such a requirement applies and the configuration passes
70
+ arguments, the launch is not reported verified (`E_LAUNCH_PROBE_UNSUPPORTED`):
71
+ put native configuration a required package must see in a wrapper
72
+ executable or the environment.
73
+
74
+ ```sh
75
+ oats launch-config list --dir /path/to/team
76
+ oats launch-config preview --home /path/to/instance --runtime codex --json
77
+ oats session restart --home /path/to/instance --launch-config codex-personal
78
+ ```
79
+
80
+ Local tmux and Herdr sessions use the same lifecycle operations. Registered
81
+ servers support configuration management and start/restart choices through
82
+ their installed OATS CLI (probe tokens `launch-config`, `session-restart`);
83
+ existing remote homes keep their saved route, and an older kernel is
84
+ refused after the compatibility probe, before any mutation or stop.
85
+
86
+ ## Desktop fixes
87
+
88
+ Tabs from other workspaces stay hidden. Instance action menus are positioned
89
+ correctly when opened and remain stable through roster refreshes. Failed
90
+ launch preflight checks are shown in the invocation preview, and an accepted
91
+ launch is not presented as a running agent until the terminal is observed.
92
+
93
+ ## Also in this release
94
+
95
+ - Capture lock (source only; the installed capture service is unchanged):
96
+ nonce-checked ownership, cleanup of a failed initialization that respects
97
+ a replacement, release outcomes reported as observed, and the privacy
98
+ loader's exit no longer leaves a lock behind.
99
+ - A design proposal for managing agents from an iPhone over Tailscale
100
+ (docs/design/2026-09-07-mobile-agent-management-proposal.md); no
101
+ implementation ships.
@@ -0,0 +1,115 @@
1
+ # OATS v0.22.19
2
+
3
+ Version 0.22.18 was tagged but never published: its hosted gate failed on
4
+ four tests that pass on macOS and fail on Linux (two launch tests calling
5
+ the kernel directly resolved the real harness binary on the test process
6
+ PATH, one launch test spawned zsh, which the runner does not install, and
7
+ one capture-lock test where Linux reused the inode of an unlinked
8
+ directory). The tag stays fixed and unpublished. This release carries the
9
+ same content with the corrections below.
10
+
11
+ Choose how an agent runs without replacing its home. Desktop offers
12
+ **Start…** for stopped instances and **Restart with…** for running
13
+ instances, with harness, model, permissions and named launch
14
+ configurations. The kernel records what each home was started with and
15
+ starts it again the same way.
16
+
17
+ ## Named launch configurations
18
+
19
+ Define a reusable configuration in a scope's `oats-config.yaml`, or use
20
+ **Manage launch configurations** in Desktop. A configuration chooses `pi`,
21
+ `claude` or `codex`, an optional executable or wrapper, literal arguments,
22
+ environment values or references, a default model and the shared `yolo`
23
+ setting.
24
+
25
+ ```yaml
26
+ launch-configs:
27
+ codex-personal:
28
+ runtime: codex
29
+ args: ["--profile", "personal"]
30
+ yolo: true
31
+ ```
32
+
33
+ Arguments are passed literally; native configuration files and account
34
+ settings stay under the harness's control. For environment credentials use
35
+ a reference such as `API_KEY: {fromEnv: PERSONAL_KEY}`: the execution host
36
+ resolves it each time the agent starts. The recorded recipe, receipts,
37
+ previews, roster answers and spawn answers do not expose the value (the
38
+ launch itself and its transport necessarily use it). A configuration cannot name the kernel's own launch
39
+ environment or override environment a capability owns.
40
+
41
+ An existing instance keeps its recorded launch configuration even if the
42
+ scope's definition changes or disappears. Select a named configuration
43
+ explicitly to apply its current definition. Changing only the model or
44
+ permissions keeps the rest of the recorded invocation; choosing a harness
45
+ without a configuration starts that harness's defaults, with no model
46
+ carried across harnesses.
47
+
48
+ `oats launch-config list | set | remove | preview` author and inspect
49
+ configurations; `oats spawn --launch-config` starts a new instance under
50
+ one; a soul may name a default (`launch-config:` in soul.yaml,
51
+ `oats soul set --launch-config`).
52
+
53
+ ## Restart in place
54
+
55
+ `oats session start` with a selection validates the requested launch
56
+ (recipe, executable, references, capability preparation, runtime packages)
57
+ and starts a stopped instance; it never stops a running harness. Only
58
+ `oats session restart` does: it runs the same checks first, then sends
59
+ SIGTERM to the harness under the pane's launcher and waits a bounded time
60
+ for it to end; it does not escalate to a forced kill and refuses to launch
61
+ a second harness if it cannot confirm the first has stopped, reporting what
62
+ was signalled and observed. The instance keeps its home, identity, work and
63
+ notes; OATS does not transfer a native conversation between harnesses.
64
+ Save work before restarting.
65
+
66
+ Capabilities take part through what was captured for the home: a capability
67
+ may declare a `launch` hook to prepare another harness (under the settings
68
+ captured at spawn, with the scope's current manifest and trust); a
69
+ capability that contributed harness-specific arguments and cannot prepare
70
+ the new one refuses the switch. Homes that predate launch recipes are
71
+ converted narrowly from their recorded command when a selection asks for
72
+ it; unrecognized arguments are refused by name.
73
+
74
+ One limitation, stated rather than hidden: a runtime-package requirement is
75
+ verified with the package manager's controlled list command under the
76
+ launch's environment and executable, which cannot carry a configuration's
77
+ arguments. When such a requirement applies and the configuration passes
78
+ arguments, the launch is not reported verified (`E_LAUNCH_PROBE_UNSUPPORTED`):
79
+ put native configuration a required package must see in a wrapper
80
+ executable or the environment.
81
+
82
+ ```sh
83
+ oats launch-config list --dir /path/to/team
84
+ oats launch-config preview --home /path/to/instance --runtime codex --json
85
+ oats session restart --home /path/to/instance --launch-config codex-personal
86
+ ```
87
+
88
+ Local tmux and Herdr sessions use the same lifecycle operations. Registered
89
+ servers support configuration management and start/restart choices through
90
+ their installed OATS CLI (probe tokens `launch-config`, `session-restart`);
91
+ existing remote homes keep their saved route, and an older kernel is
92
+ refused after the compatibility probe, before any mutation or stop.
93
+
94
+ ## Desktop fixes
95
+
96
+ Tabs from other workspaces stay hidden. Instance action menus are positioned
97
+ correctly when opened and remain stable through roster refreshes. Failed
98
+ launch preflight checks are shown in the invocation preview, and an accepted
99
+ launch is not presented as a running agent until the terminal is observed.
100
+
101
+ ## Also in this release
102
+
103
+ - Capture lock (source only; the installed capture service is unchanged):
104
+ nonce-checked ownership, cleanup of a failed initialization that respects
105
+ a replacement, release outcomes reported as observed, and the privacy
106
+ loader's exit no longer leaves a lock behind. The initializing directory
107
+ is held open until its owner record is written or its cleanup finishes,
108
+ preventing its inode from being reused during cleanup; a replacement
109
+ directory is left alone.
110
+ - Test fixtures: the launch tests resolve their fake harness binaries on the
111
+ test process PATH and exercise only the shells the host installs; no
112
+ kernel change.
113
+ - A design proposal for managing agents from an iPhone over Tailscale
114
+ (docs/design/2026-09-07-mobile-agent-management-proposal.md); no
115
+ implementation ships.
@@ -0,0 +1,93 @@
1
+ # OATS v0.23.0
2
+
3
+ This is the prerequisite kernel release for capability-owned external knowledge
4
+ and independent harvesting. It adds generic directory work and more reliable
5
+ record capture; it does **not** migrate existing knowledge or select a new
6
+ knowledge integration. The bundled `oats.okf` and official catalog pin remain
7
+ **1.6.1**. OKF 2.0 is a separate, subsequent capability release; no new catalog
8
+ pin or bundled v2 runtime is included here.
9
+
10
+ ## Independent directory work
11
+
12
+ `work: directory` creates an instance-owned ordinary `work/` directory. It does
13
+ not require a Git repository, branch, worktree, or fabricated commit. Existing
14
+ Git work modes retain their semantics. A capability can use directory workers
15
+ for non-Git knowledge custody without making its storage model a kernel policy.
16
+
17
+ Directory lifecycle checks reject a replaced, missing or symlinked work root
18
+ before launch, and preserve retryable cleanup obligations when compensation
19
+ cannot finish. Hooks receive the running kernel's CLI path. Generic scheduled
20
+ commands no longer inherit another instance's source identity.
21
+
22
+ ## Evidence capture and recall
23
+
24
+ Record capture distinguishes completed work from skipped, held, incomplete and
25
+ failed attempts. Capture verifies attributed native transcript identity,
26
+ honors native storage roots and recorded launch environments, and includes
27
+ supported nested Claude subagent transcripts. Uncertain discovery, unreadable
28
+ or replaced sources, incomplete tails and lock failures are not certified as
29
+ complete evidence. Large piped recall responses drain stdout before exiting.
30
+ Managed starts now preserve independent, execution-time native record-location
31
+ history, so a later observer's environment cannot silently redirect capture.
32
+ History survives retirement and is not a knowledge bundle. Older or standalone
33
+ sessions without that authority fail closed on `capture --home`; an operator
34
+ can explicitly use `oats capture --current-roots --home <home>` to inventory the
35
+ currently configured roots, but that does not certify all historical locations.
36
+
37
+ These are evidence-preservation guarantees, not a claim that a model has learned
38
+ from the captured records.
39
+
40
+ ## Optional knowledge-theory authoring resources
41
+
42
+ `oats.knowledge-theory` 1.0.0 is an optional **Git-distributed OATS package**
43
+ in this repository's self-contained `oats-package/` subtree. It exports
44
+ `knowledge-theory-expert` and the `knowledge-capability-authoring` skill with
45
+ the complete local reference curriculum. The kernel npm tarball ships public
46
+ docs and the CLI, but **excludes** this optional payload entirely. npm omits
47
+ symlinks; a partial copy without the canonical source alias is not a supported
48
+ package. Acquisition does not synthesize aliases or relax integrity semantics.
49
+
50
+ After this immutable tag is published, acquire through the normal Git package
51
+ route and explicitly opt in for an author soul:
52
+
53
+ ```bash
54
+ oats install git:github.com/awebai/oats@v0.23.0 --dir /path/to/scope
55
+ oats use oats.knowledge-theory --soul <author-soul> --dir /path/to/scope
56
+ ```
57
+
58
+ The default Git package root is `oats-package/`; acquisition locks the resolved
59
+ commit and alone activates nothing. An official catalog pin can follow only
60
+ after the immutable tag exists. No unpublished theory catalog pin is shipped
61
+ in this prerequisite release.
62
+
63
+ The package has no knowledge-layer binding, mandatory injection, runtime hook,
64
+ command or dependency on OKF. Authors may adopt, adapt or replace the reference
65
+ model. Each selected knowledge capability owns its runtime, reader/capture,
66
+ judgment and delivery instructions. The first external-knowledge design covers
67
+ Git PR delivery and non-Git directory custody; no framework ACL layer is added.
68
+
69
+ Canonical references are published under
70
+ [the authoring guide](../knowledge-capability-authoring.md) and
71
+ [the reference model](../knowledge-reference/model.md), with byte-identical
72
+ copies in the Git-packaged skill. Installed instances read those local copies,
73
+ not a source checkout or mutable network documentation. Git transport preserves
74
+ the tracked source `CLAUDE.md -> AGENTS.md`; generated instances receive their
75
+ own canonical alias through the unchanged normal composition path.
76
+
77
+ ## Packaging and compatibility
78
+
79
+ Kernel, Pi adapter and Desktop versions are aligned at 0.23.0, including both
80
+ lockfiles. Desktop still uses CLI API v1; its accepted kernel band is widened
81
+ to `>=0.22.0 <0.24.0`, retaining support for released 0.22.x kernels.
82
+
83
+ Local, CI and runnerless release checks share the recursive JavaScript
84
+ inventory, including capability libraries, record and optional package scripts.
85
+ Validation checks the optional theory manifests and canonical curriculum parity.
86
+ Pack checks require public docs and reject any optional package bytes in the
87
+ npm kernel. The installed kernel acquires an exact, self-contained Git fixture
88
+ through direct and catalog routes, checks its tracked source alias, then removes
89
+ the fixture checkout. Probes verify local reference closure, alternative-theory
90
+ isolation, discovery, scaffold and retirement in Git and directory scopes without
91
+ launching models. Publication
92
+ remains gated on the exact tag's build/test/smoke results and Desktop artifacts;
93
+ already-versioned candidates remain safe with `--allow-same-version`.
@@ -25,9 +25,10 @@ A soul is durable and committed. It is the part you review, improve, and keep.
25
25
  | `kind` | `persistent` for committed agents, `local` for full local souls under `local-agents/` (legacy `tmp` reads as `local`). |
26
26
  | `description` | Short role description. |
27
27
  | `repo` | Target repo, absolute or relative to the agents root's parent. |
28
- | `work` | `worktree` or `checkout`. |
28
+ | `work` | `worktree`, `checkout`, `attached`, `workspace`, or `directory`. |
29
29
  | `runtime` | `pi` or `claude` — the harness new instances launch on; a spawn can override with `--runtime`. For `claude`, the binary is `claude` unless a local-only `oats-claude-config` file (closest one walking up from the repo; one line naming the binary, e.g. `claude-personal`) selects another — a personal machine preference for account selection, never committed. With the aweb messaging integration active, claude sessions get the `aweb-channel` plugin wired at spawn for real-time push events. |
30
30
  | `model` | Optional default model — a `provider/id[:thinking]` pattern or a comma-separated preference list (`github-copilot/x:high, anthropic/x:high`); at spawn the first entry whose provider/model is available wins (pi models probed via `pi --list-models`). For the `claude` runtime the value is translated to what the claude CLI accepts: `anthropic/<id>[:thinking]` becomes the bare `<id>`, aliases and bare `claude-*` ids pass through, other providers' entries are dropped, and nothing usable falls back to claude's own default. A spawn can override it. |
31
+ | `launch-config` | Optional default launch configuration for new instances (a name declared under `launch-configs:` in the scope's config; see docs/design/launch-configurations.md). `oats spawn --launch-config <name|none>` overrides it; `oats soul set --launch-config <name>` / `--no-launch-config` edit it. |
31
32
 
32
33
  A soul is model-agnostic as an artifact. Its files are plain operating docs,
33
34
  skills, and knowledge. `model` is only the default choice for new instances,
@@ -255,6 +256,22 @@ only what the briefing names, keep commits small and attributable. Retiring
255
256
  an attached instance never removes the shared tree. The packaged
256
257
  `work-attached` instruction source carries this discipline into each generated instance AGENTS.md.
257
258
 
259
+ ### `directory` — independent execution
260
+
261
+ `work/` is a new instance-owned directory, not a Git repo or a link to a source.
262
+ Use it explicitly for capability workers that need private execution space
263
+ without Git. `repo` (or `--repo`) supplies configuration context only and may be
264
+ an ordinary directory; without it, the deployment scope is used. An
265
+ `oats-config.yaml` below laptop scope supports package-only deployments before
266
+ any local souls exist. No implicit fallback changes the other modes.
267
+
268
+ `--work-dir` and `--branch` are rejected. Canonical instructions, skill
269
+ composition, provider trust and runtime preflight still apply. No worktree setup
270
+ runs. Retirement preserves nonempty work in verified recovery storage beside the
271
+ home (`workRecovery.path/work`) before deleting it, including files created by
272
+ hooks; directory work has no disposable-root exemptions. The work-root cannot be
273
+ exchanged for a symlink. Recovery does not replace the worker's delivery protocol.
274
+
258
275
  ### `workspace` — cross-repo coordinator
259
276
 
260
277
  `work/` is a symlink to the **whole workspace** (the team scope declared by
@@ -0,0 +1,18 @@
1
+ ## Work mode: directory
2
+
3
+ Your `./work` is an **instance-owned execution directory**. It is not a Git
4
+ worktree, a checkout, or a link to the source instance or deployment context.
5
+ The context recorded as `repo` supplies configuration; it grants no permission
6
+ to edit that directory.
7
+
8
+ - Do task work inside `./work`. No Git repository or branch is created for you;
9
+ do not initialize a fake repository to satisfy a workflow. Git might discover
10
+ a containing repository; that does not authorize work in the containing tree.
11
+ - Access external inputs and destinations only as explicitly authorized by the
12
+ task and active capabilities. This mode does not impose a storage provider or
13
+ a publication protocol.
14
+ - Keep canonical instructions in the instance's `AGENTS.md`; `CLAUDE.md` is its
15
+ compatibility symlink. Run OATS lifecycle/capability commands from home.
16
+ - Retirement removes the execution directory only after nonempty work has a
17
+ verified copy in the reported recovery storage beside the home. Recovery is
18
+ not publication: deliver your results through the task's own protocol first.