@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.
@@ -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).
@@ -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; a handoff or clone could carry selected references, verified observations and labeled provisional reasoning, but that is not a knowledge store and copying it promotes nothing. A clone would need its own identity, credentials and ownership, and no protocol for selecting and sharing such context is defined.
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
 
@@ -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.5.0` | `oats.engineering-expert`, `oats.developer`, `oats.code-review` | `code-reviewer` |
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
@@ -28,7 +28,12 @@
28
28
  },
29
29
  "oats.engineering": {
30
30
  "url": "https://github.com/awebai/oats-engineering.git",
31
- "ref": "v1.5.0",
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.1",
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",