@awebai/oats 0.39.1 → 0.39.3
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/docs/design/2026-10-01-instance-cloning.md +106 -0
- package/docs/knowledge-theory.md +4 -2
- package/docs/official-catalog.md +2 -1
- package/docs/release-notes/v0.39.2.md +64 -0
- package/docs/release-notes/v0.39.3.md +10 -0
- package/docs/souls-and-instances.md +24 -0
- package/package-catalog.json +8 -2
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Instance cloning: the `oats.cloning` package
|
|
2
|
+
|
|
3
|
+
Status: **DECIDED 2026-10-01** by the maintainer with the steward (the transcript handling revised
|
|
4
|
+
2026-10-02 by the human: "cloning just works"). Shipped as `oats.cloning` 1.0.0
|
|
5
|
+
([awebai/oats-cloning](https://github.com/awebai/oats-cloning)), compatibility `oats >=0.34.0`.
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
[Knowledge theory](../knowledge-theory.md#reusing-working-understanding-context-handoffs-and-cloning)
|
|
9
|
+
accepted cloning in principle and left it open: harvesting preserves individual lessons, not the
|
|
10
|
+
combined working picture of a long-running instance. A clone should carry selected references,
|
|
11
|
+
verified observations and provisional reasoning marked as such, under its own identity, credentials
|
|
12
|
+
and ownership, and copying it promotes nothing to shared knowledge.
|
|
13
|
+
|
|
14
|
+
## Decision
|
|
15
|
+
1. **A capability, not a kernel change.** Everything cloning needs already exists in the kernel:
|
|
16
|
+
`oats status` and `instance.json` to find and describe the source, `oats capture`/`oats recall`
|
|
17
|
+
for its transcript, `oats spawn` with `--relation`/`--relative-to`, the launch flags and `--base`,
|
|
18
|
+
`--preview` then `--expect-decision`, `oats session upload`/`session start`, and
|
|
19
|
+
`oats retire --self`. No config key, manifest field, hook variable or lock format changes. The
|
|
20
|
+
capability has no lifecycle hooks, so it cannot break a composing soul's spawn.
|
|
21
|
+
2. **Three roles.** The *requester* (an instance with the capability, or the operator from the
|
|
22
|
+
deployment with `--soul oats.cloning/cloner`) runs
|
|
23
|
+
`oats cloning request <source> --goal … --relation independent|child|sibling|parent`. That spawns
|
|
24
|
+
a short-lived *cloner* (the package soul `oats.cloning/cloner`, `knowledge: none`), which reads the
|
|
25
|
+
source (`dossier`), writes a brief and a plan (`/plan-clone`), spawns the *clone* (`spawn`:
|
|
26
|
+
preview, apply, verify), reports and retires itself. The clone is an ordinary instance of the
|
|
27
|
+
source's soul; nothing about it is special to the kernel.
|
|
28
|
+
3. **The requester chooses only what is theirs:** the goal, the relation and its anchor (the source
|
|
29
|
+
by default, never the cloner, which retires), the name, whether the transcript is read, and the
|
|
30
|
+
work base. `independent` is the kernel's `unrelated` and takes no anchor. The cloner decides what
|
|
31
|
+
the clone carries, and asks the requester only when a choice is genuinely theirs.
|
|
32
|
+
4. **The clone carries a curated brief, not a copy.** A generated preamble (a provenance block and
|
|
33
|
+
fixed "you are a clone" text) and the cloner's body under fixed headings: the goal verbatim,
|
|
34
|
+
what is verified (each with its evidence), decisions and why, working understanding marked
|
|
35
|
+
provisional, open threads and who owns them, work state, where to look (transcript turn ids are
|
|
36
|
+
citations), and what was not carried. Inherited material is not new evidence: the clone notes it
|
|
37
|
+
only after re-verifying it. Its commitments, PRs, threads and children stay with the source
|
|
38
|
+
unless the brief says they were handed over.
|
|
39
|
+
5. **Read-only on the source, bounded.** `dossier` copies a filtered `instance.json` (never the
|
|
40
|
+
command, environment, hooks, `capabilityMeta` or any credential locator), `TASK.md`, `STATE.md`,
|
|
41
|
+
`log.md` and `notes/**/*.md` as regular files contained in the home, with size budgets. It never
|
|
42
|
+
reads identity material, `.oats*`, attachments or the regenerated `AGENTS.md`. Work state is read
|
|
43
|
+
with read-only git: branch, HEAD, ahead/behind, commit subjects, changed paths and a diffstat,
|
|
44
|
+
never diff content; a directory work tree is only listed.
|
|
45
|
+
6. **The transcript is included by default, through a temporary record.** `--transcript exclude`
|
|
46
|
+
opts out. The cloner captures the source into a private record in its own home
|
|
47
|
+
(`oats capture --root`, 0700), copies the host's capture ignore list into it (and captures nothing
|
|
48
|
+
if that list exists but cannot be read), reads it with `oats recall --root`, and deletes it. The
|
|
49
|
+
host's own record is never written, so a source the host chose not to capture stays uncaptured.
|
|
50
|
+
7. **Security requirements, each tested.**
|
|
51
|
+
- *Redaction, not refusal.* Before the clone can see anything, `spawn` redacts the whole assembled
|
|
52
|
+
brief, preamble included, with a fixed set of patterns: PEM private keys, provider tokens and
|
|
53
|
+
keys, JWTs, Bearer tokens, credentials in URLs, and uppercase assignments such as
|
|
54
|
+
`API_TOKEN=…` or `PASSWORD: …`. Each match becomes `[redacted:<pattern>]`; the receipt and the
|
|
55
|
+
answer list `{line, pattern}`, never the value. Where a pattern's boundary is ambiguous it
|
|
56
|
+
redacts more rather than less. Redaction is pattern-limited: a form no pattern recognises
|
|
57
|
+
survives it, so the `/plan-clone` exclusions stay the policy and redaction is the seatbelt.
|
|
58
|
+
- *The brief lives only in the clone's home, mode 0600.* `claude` and `codex` launches pass
|
|
59
|
+
`TASK.md` as an argument, visible to other local users. So the clone is spawned `--no-launch`
|
|
60
|
+
with only the preamble and a pointer in its task, the brief is attached with
|
|
61
|
+
`oats session upload` (0600), `TASK.md` is made 0600, and only then is the session started.
|
|
62
|
+
`spawn` verifies the modes, the attachment's sha256 and the provenance block byte for byte.
|
|
63
|
+
- *A fresh messaging identity.* `spawn` never passes identity settings, and after the start checks
|
|
64
|
+
that the clone's alias is its own instance name and its identity differs from the source's
|
|
65
|
+
(`E_CLONE_IDENTITY` otherwise; a resident identity tied to the source's is refused before the
|
|
66
|
+
spawn).
|
|
67
|
+
- *The plan cannot escalate.* `spawn` enforces that the plan matches the request and the source:
|
|
68
|
+
the soul, relation, anchor and name; the source's launch settings (yolo and child spawns are never
|
|
69
|
+
escalated); `oats.okf harvest=off` carried when the source had it, never turned on; a base only
|
|
70
|
+
for worktree souls.
|
|
71
|
+
8. **Cleanup survives retirement.** Retirement keeps a changed home in recovery storage, so the
|
|
72
|
+
cloner cannot rely on its home being deleted: once the apply has run, it empties `clone/` except
|
|
73
|
+
`receipt.json` (which holds no source text), and a later run first removes an earlier run's
|
|
74
|
+
leftovers. A refusal before the apply deletes the temporary record and keeps the brief and plan
|
|
75
|
+
for a retry. Known limit: a cloner killed mid-run and then retired from outside leaves its
|
|
76
|
+
`clone/` (0700) in recovery storage.
|
|
77
|
+
9. **Packaging.** Its own repository and package, `oats.cloning`, mirrored and pinned in this
|
|
78
|
+
repository like the other official packages, with a member expert soul (`oats-cloning-expert`)
|
|
79
|
+
beside the package soul. **Not a workspace default:** only the souls that request clones compose
|
|
80
|
+
it (`oats.cloning: { from: package }`), and it becomes a default later on evidence of use. The
|
|
81
|
+
workspace pins it as `git:github.com/awebai/oats-cloning@v1.0.0` until every deployment's CLI
|
|
82
|
+
carries the catalog entry, because a bare version is `E_PACKAGE_MISSING` on a CLI without it.
|
|
83
|
+
|
|
84
|
+
## Rejected
|
|
85
|
+
- **A raw transcript fork** (resuming or forking the source's harness session). It copies identity
|
|
86
|
+
statements, home paths, secrets and half-finished reasoning as if settled, is harness-specific,
|
|
87
|
+
and carries no notion of what is still true. The brief is a curated reading, not a replay.
|
|
88
|
+
- **Copying `notes/` into the clone.** Notes are the source's evidence; copied, they would be
|
|
89
|
+
harvested a second time as the clone's own.
|
|
90
|
+
- **The brief in `TASK.md`.** World-readable by default and passed on the command line.
|
|
91
|
+
- **A refuse-on-match secret scan.** It stops a clone over one stray token; redaction removes the
|
|
92
|
+
value and still reports where it was.
|
|
93
|
+
- **An operator consent step per clone** (dropped by the human), and an acknowledgement flag for
|
|
94
|
+
sources the host does not capture. Both are procedural gates: same-user agents can already read
|
|
95
|
+
the host record, and the temporary record makes neither necessary.
|
|
96
|
+
- **Shipping inside `oats.framework`** (deployable with a bare pin today). Rejected for a standalone
|
|
97
|
+
package identity, as the human asked. **A second package inside this repository** was rejected
|
|
98
|
+
too: a `git:` pin always reads `oats-package/`, so it would carry the costs of both options.
|
|
99
|
+
- **A workspace default** in v1: no evidence yet that every soul needs it.
|
|
100
|
+
|
|
101
|
+
## Out of scope (v1)
|
|
102
|
+
Cloning across machines or from a retired instance; cloning into a different soul (that is a
|
|
103
|
+
handoff); asking a live source to write its own handoff; carrying work-tree content, uncommitted
|
|
104
|
+
changes, attachments, schedules, joined teams or children; a Desktop "Clone" action; kernel
|
|
105
|
+
provenance fields such as `clonedFrom`; the knowledge harvester skipping inherited material in a
|
|
106
|
+
clone's transcript (the preamble marks it instead).
|
package/docs/knowledge-theory.md
CHANGED
|
@@ -230,13 +230,15 @@ Directory bases use their own recoverable publication mechanism. Receipts state
|
|
|
230
230
|
|
|
231
231
|
## Reusing working understanding: context handoffs and cloning
|
|
232
232
|
|
|
233
|
-
Harvesting preserves individual lessons, not the combined working picture that makes a long-running instance effective
|
|
233
|
+
Harvesting preserves individual lessons, not the combined working picture that makes a long-running instance effective. A handoff or clone carries selected references, verified observations and labeled provisional reasoning; that is not a knowledge store, and copying it promotes nothing.
|
|
234
|
+
|
|
235
|
+
Cloning exists as the official `oats.cloning` package ([souls and instances](souls-and-instances.md#cloning-an-instance)). A clone is a new instance of the source's soul with its own identity, credentials and ownership. What it carries is a curated brief written by a short-lived cloner for the new goal: what was re-verified, with its evidence; decisions and their reasons; working understanding marked provisional; open threads and who owns them; and where to look, with transcript turn ids as citations. The cloner leaves secrets out of the brief, a pattern-based redaction pass catches the common forms that slip through, and the brief is attached to the clone as a 0600 file, never placed in its task text. A clone does not carry the raw transcript, the source's `notes/`, the content of its work tree or its uncommitted changes (a worktree clone starts from the source's committed branch, the soul's default or a requested ref), or its commitments: those stay with the source unless the brief says they were handed over. Inherited material is not new evidence; the clone records it in its own notes only after re-verifying it.
|
|
234
236
|
|
|
235
237
|
## Implementation boundaries
|
|
236
238
|
|
|
237
239
|
The model's settled positions are those above: short- and long-running instances are both legitimate; the default is centralized, per-soul knowledge open to reviewed structural evolution; capabilities own their model and runtime behavior; the doctrine preserves expertise, not code descriptions or task residue; and structural change preserves provenance and running work. These are not CLI flags or configuration schemas.
|
|
238
240
|
|
|
239
|
-
The default OKF capability implements consultation, capture, independent harvest and maintainer review; it does not provide automatic per-soul provisioning, a co-located profile, automatic speciation, redirects or context cloning. Proving the kernel's flexibility needs a genuinely different organization and learning model, not only Git and directory storage within OKF. Updating this document does not migrate existing deployments.
|
|
241
|
+
The default OKF capability implements consultation, capture, independent harvest and maintainer review; it does not provide automatic per-soul provisioning, a co-located profile, automatic speciation, redirects or context cloning. Context cloning is a separate package, `oats.cloning`, not part of the knowledge capability. Proving the kernel's flexibility needs a genuinely different organization and learning model, not only Git and directory storage within OKF. Updating this document does not migrate existing deployments.
|
|
240
242
|
|
|
241
243
|
## Related documentation
|
|
242
244
|
|
package/docs/official-catalog.md
CHANGED
|
@@ -12,8 +12,9 @@ or workspace membership alone does not make a package official.
|
|
|
12
12
|
| `oats.framework` | `oats-framework/v1.5.0` (this repository) | `oats.core`, `oats.setup`, `oats.knowledge-theory` | `knowledge-theory-expert` |
|
|
13
13
|
| `oats.okf` | `v4.1.1` | `oats.okf` (knowledge), `oats.okf-harvest`, `oats.okf-maintenance` | `knowledge-harvester`, `knowledge-maintainer` |
|
|
14
14
|
| `oats.aweb` | `v1.21.1` | `oats.aweb` (messaging) | |
|
|
15
|
-
| `oats.engineering` | `v1.
|
|
15
|
+
| `oats.engineering` | `v1.8.0` | `oats.engineering-expert`, `oats.developer`, `oats.code-review`, `oats.maintainer` | `code-reviewer` |
|
|
16
16
|
| `oats.authoring` | `v1.0.3` | `oats.authoring` | |
|
|
17
|
+
| `oats.cloning` | `v1.0.1` | `oats.cloning` | `cloner` |
|
|
17
18
|
| `oats.jira` | `v1.0.1` | `oats.jira` (tasks) | |
|
|
18
19
|
| `oats.linear` | `v1.0.1` | `oats.linear` (tasks) | |
|
|
19
20
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# OATS 0.39.2
|
|
2
|
+
|
|
3
|
+
## Added
|
|
4
|
+
|
|
5
|
+
- **oats.cloning 1.0.1**, a new official package (catalog entry, workspace
|
|
6
|
+
member and pin, and the bundled mirror): clone an instance for a new goal.
|
|
7
|
+
`oats cloning request <source>` spawns the package soul
|
|
8
|
+
`oats.cloning/cloner`, which reads the source and writes a curated,
|
|
9
|
+
redacted brief, then spawns the clone with it attached and a fresh
|
|
10
|
+
identity. The clone gets no raw transcript, notes or work content. See
|
|
11
|
+
[instance cloning](../design/2026-10-01-instance-cloning.md).
|
|
12
|
+
- The framework's oats-expert, oats-kernel-expert, oats-desktop-expert,
|
|
13
|
+
integrations-expert, oats-operator-expert and oats-setup-admin souls take
|
|
14
|
+
it (`oats.cloning: { from: package }`); there is no workspace default.
|
|
15
|
+
- The workspace pins it as `git:github.com/awebai/oats-cloning@v1.0.1`
|
|
16
|
+
until every deployment's CLI carries this catalog entry; then the pin
|
|
17
|
+
becomes the bare `v1.0.1`.
|
|
18
|
+
- 1.0.1 over 1.0.0 (the first pin on main): secret assignments are
|
|
19
|
+
redacted in any case and as JSON or YAML keys (`password=…`,
|
|
20
|
+
`client_secret: …`, `"PASSWORD": "…"`), a quoted value to its real
|
|
21
|
+
closing quote. The README states what redaction does not catch, and that
|
|
22
|
+
under `delivery: channel` a Claude Code cloner or clone waits at Claude
|
|
23
|
+
Code's development-channels confirmation until a human answers it.
|
|
24
|
+
- Operators: run `oats sync` to lock the package; new spawns of those
|
|
25
|
+
souls get the capability. Running instances keep what they were spawned
|
|
26
|
+
with.
|
|
27
|
+
|
|
28
|
+
## Changed
|
|
29
|
+
|
|
30
|
+
- **Desktop: terminal text in the White and Solarized themes renders at the
|
|
31
|
+
stroke weight of a native macOS terminal with font smoothing.** Chromium
|
|
32
|
+
draws dark text on a light background lighter, so these themes' terminal text
|
|
33
|
+
looked fainter than the same font in a native terminal. Each theme now sets
|
|
34
|
+
its own text weight; Dark is unchanged, and bold text stays bold.
|
|
35
|
+
- **oats.engineering 1.8.0** (catalog and workspace pin, and the bundled
|
|
36
|
+
mirrors; includes 1.6.0 and 1.7.0):
|
|
37
|
+
- **New capability `oats.maintainer`**: the whole maintainer job, generic.
|
|
38
|
+
It covers the overview of what's open, launching work, a direction and
|
|
39
|
+
architecture gate, review and merge at an exact head, release planning
|
|
40
|
+
and shipping with a verification checklist, cross-review between peer
|
|
41
|
+
maintainers, keeping the project clean, and a living roadmap,
|
|
42
|
+
architectural calls and coherence rules kept in the maintainer's
|
|
43
|
+
knowledge. Skills: `/maintainer-intake`, `/launch-work`,
|
|
44
|
+
`/direction-gate`, `/pr-review`, `/plan-release`, `/ship-release`,
|
|
45
|
+
`/cross-review-peer`, `/keep-it-clean`.
|
|
46
|
+
- **A maintainer is not an expert; no soul holds both roles.** The
|
|
47
|
+
maintainer launches work without leading it: `/launch-work` delegates it
|
|
48
|
+
to a live expert whose work it continues, or spawns the best-suited expert
|
|
49
|
+
with `--relation unrelated` as the effort's lead, never as its own child.
|
|
50
|
+
The lead coordinates the developers and experts it needs.
|
|
51
|
+
- **Knowledge and state.** Maintainers and experts consult their knowledge
|
|
52
|
+
before deciding, and keep their instance state accurate.
|
|
53
|
+
- **Experts tell a standing maintainer what they start** when a human
|
|
54
|
+
launches them directly.
|
|
55
|
+
- **Experts give unrelated work to a new expert** (1.6.0). New work goes to
|
|
56
|
+
a live expert only when it continues that expert's work or that expert's
|
|
57
|
+
context helps. Otherwise the expert spawns a new one: as its child when
|
|
58
|
+
the work is part of its effort, or with `--relation unrelated` when it is
|
|
59
|
+
independent, reporting to whoever asked.
|
|
60
|
+
- **Developers prefer this machine's reviewer override** (1.7.0). When
|
|
61
|
+
picking the reviewer's model, `/run-the-review-loop` reads what the
|
|
62
|
+
machine will launch (`launch.effective`, including an `oats-local.yaml`
|
|
63
|
+
`souls.launch` override), not only the soul's default. It keeps the
|
|
64
|
+
override when that runs on another harness than the developer's.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# OATS 0.39.3
|
|
2
|
+
|
|
3
|
+
## Fixed
|
|
4
|
+
|
|
5
|
+
- **Desktop: sidebar instance rows keep their gap when selected or hovered.**
|
|
6
|
+
Each row is meant to paint its fill 2px short of its top and bottom edges,
|
|
7
|
+
leaving a 4px gap between neighbouring fills. The hover and selected fills
|
|
8
|
+
painted over that gap, so a selected row and a hovered row above or below it
|
|
9
|
+
touched. They now stop short of it, in every theme; row height and the tree
|
|
10
|
+
connectors are unchanged.
|
|
@@ -387,6 +387,30 @@ If the workspace has a messaging capability such as aweb, spawned instances
|
|
|
387
387
|
can also receive identities and coordinate with each other automatically. The
|
|
388
388
|
tasks capability can provide shared work state while messaging provides conversation.
|
|
389
389
|
|
|
390
|
+
### Cloning an instance
|
|
391
|
+
|
|
392
|
+
A clone is a new instance of an existing instance's soul that starts from a
|
|
393
|
+
curated brief of what that instance knows, for a new goal. It is not a copy of
|
|
394
|
+
the source's home. Cloning is the official
|
|
395
|
+
[`oats.cloning`](https://github.com/awebai/oats-cloning) package, not a kernel
|
|
396
|
+
verb; a soul that may request clones composes it
|
|
397
|
+
(`oats.cloning: { from: package }`). An instance with the capability runs:
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
oats cloning request <source> --goal-file goal.md --relation independent|child|sibling|parent \
|
|
401
|
+
[--relative-to <instance>] [--name <slug>] [--transcript exclude] [--base source|default|<ref>]
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
From the deployment directory the operator adds `--soul oats.cloning/cloner`.
|
|
405
|
+
The relation is required and is the kernel's spawn relation of the clone to the
|
|
406
|
+
anchor (`--relative-to`, the source by default); `independent` is the kernel's
|
|
407
|
+
`unrelated` and takes no anchor. The request spawns a short-lived
|
|
408
|
+
`oats.cloning/cloner`, which reads the source (its home files, work state and,
|
|
409
|
+
unless excluded, its transcript), writes the brief, spawns the clone with its
|
|
410
|
+
own identity, reports and retires itself. Only instances on this host can be
|
|
411
|
+
cloned. [Reusing working understanding](knowledge-theory.md#reusing-working-understanding-context-handoffs-and-cloning)
|
|
412
|
+
says what a clone carries and what it does not.
|
|
413
|
+
|
|
390
414
|
### Retire
|
|
391
415
|
|
|
392
416
|
Retirement runs active capability retire hooks in reverse spawn order before the home disappears. The aweb
|
package/package-catalog.json
CHANGED
|
@@ -28,7 +28,12 @@
|
|
|
28
28
|
},
|
|
29
29
|
"oats.engineering": {
|
|
30
30
|
"url": "https://github.com/awebai/oats-engineering.git",
|
|
31
|
-
"ref": "v1.
|
|
31
|
+
"ref": "v1.8.0",
|
|
32
|
+
"path": "oats-package"
|
|
33
|
+
},
|
|
34
|
+
"oats.cloning": {
|
|
35
|
+
"url": "https://github.com/awebai/oats-cloning.git",
|
|
36
|
+
"ref": "v1.0.1",
|
|
32
37
|
"path": "oats-package"
|
|
33
38
|
},
|
|
34
39
|
"oats.framework": {
|
|
@@ -65,6 +70,7 @@
|
|
|
65
70
|
"oats.okf-maintenance": "oats.okf",
|
|
66
71
|
"oats.engineering-expert": "oats.engineering",
|
|
67
72
|
"oats.developer": "oats.engineering",
|
|
68
|
-
"oats.code-review": "oats.engineering"
|
|
73
|
+
"oats.code-review": "oats.engineering",
|
|
74
|
+
"oats.maintainer": "oats.engineering"
|
|
69
75
|
}
|
|
70
76
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awebai/oats",
|
|
3
|
-
"version": "0.39.
|
|
3
|
+
"version": "0.39.3",
|
|
4
4
|
"description": "OATS (Open Agent Team Specification) — durable souls, disposable instances, targetable capability packages, and the runtime-neutral oats CLI/kernel.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agents",
|