@awebai/oats 0.22.0 → 0.22.1

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 (41) hide show
  1. package/README.md +30 -47
  2. package/bin/oats.mjs +11 -6
  3. package/capabilities/oats-authoring/LICENSE +21 -0
  4. package/capabilities/oats-authoring/oats-package.json +11 -0
  5. package/capabilities/oats-authoring/oats.json +4 -4
  6. package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +63 -0
  7. package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +109 -0
  8. package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +109 -0
  9. package/capabilities/oats-aweb/oats.json +6 -6
  10. package/capabilities/oats-aweb/skills/LICENSE +21 -0
  11. package/capabilities/oats-aweb/skills/VENDORED.md +26 -0
  12. package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +201 -0
  13. package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +161 -0
  14. package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +61 -0
  15. package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +328 -0
  16. package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +74 -0
  17. package/capabilities/oats-jira/oats.json +1 -1
  18. package/capabilities/oats-linear/oats.json +1 -1
  19. package/capabilities/oats-okf/agents/memory-harvest/soul.yaml +6 -0
  20. package/capabilities/oats-okf/bin/oats-okf.mjs +82 -51
  21. package/capabilities/oats-okf/oats.json +4 -1
  22. package/capabilities/oats-review/oats.json +1 -1
  23. package/docs/2026-09-03-architecture-proposal.md +642 -0
  24. package/docs/first-team-demo.md +87 -0
  25. package/docs/first-team.md +179 -0
  26. package/docs/integrations.md +83 -65
  27. package/docs/layers.md +356 -80
  28. package/docs/migration-from-oas.md +80 -116
  29. package/docs/release-notes/v0.22.1.md +106 -0
  30. package/lib/core.mjs +255 -363
  31. package/package.json +1 -1
  32. package/packages/record/README.md +76 -16
  33. package/packages/record/docs/turn-record-sot.md +1 -1
  34. package/packages/record/lib/store.mjs +207 -43
  35. package/capabilities/oats-aweb/package.json +0 -20
  36. package/capabilities/oats-jira/package.json +0 -25
  37. package/capabilities/oats-linear/README.md +0 -234
  38. package/capabilities/oats-linear/package.json +0 -29
  39. package/capabilities/oats-linear/test/oats-linear.test.mjs +0 -168
  40. package/capabilities/oats-okf/package.json +0 -22
  41. /package/capabilities/oats-okf/agents/{memory-harvest.md → memory-harvest/AGENTS.md} +0 -0
package/README.md CHANGED
@@ -16,9 +16,10 @@ session you can enter and steer.
16
16
 
17
17
  OATS works with **Pi** and **Claude Code**. A team may mix providers and models
18
18
  while sharing the same souls, package and config contracts, instance
19
- lifecycle, and coordination topology. Every conversation an agent has is
20
- captured into an append-only, searchable **turn record** that outlives models,
21
- harnesses, and this repository's own designs.
19
+ lifecycle, and coordination topology. On machines where `oats setup` has run,
20
+ the append-only, searchable **turn record** captures supported local transcripts
21
+ and aw client logs. It outlives models, harnesses, and this repository's own
22
+ designs.
22
23
 
23
24
  ## Contents
24
25
 
@@ -63,56 +64,34 @@ harnesses, and this repository's own designs.
63
64
  `sibling` relationships, can carry cross-machine identities through a
64
65
  messaging layer such as `oats.aweb`, and are visible together in OATS
65
66
  Desktop.
66
- - **Everything is on the record.** Claude Code, Pi, and Codex sessions, plus
67
- aweb mail and chat, are captured as signed turns with exact provenance and
68
- searched locally with `oats recall`.
67
+ - **Supported conversations stay on the record.** On machines where `oats
68
+ setup` has run, OATS captures Claude Code, Pi, and Codex transcripts plus aw
69
+ client logs. It skips sources matched by the local record's ignore list.
70
+ Native session turns are content-addressed, not signed, and carry exact
71
+ provenance. Projected aweb mail and chat keep their original message
72
+ signatures verbatim. Search the captured content locally with `oats recall`.
69
73
 
70
74
  ## Quick start
71
75
 
72
- Requires Node.js 22 or newer and tmux.
76
+ Follow [Run your first OATS team](docs/first-team.md) for the tested path:
77
+ install the kernel and runtimes, adopt a development configuration, select
78
+ an available harvester model, connect your team, and complete a real task
79
+ through review, harvest, and retirement.
73
80
 
74
81
  ```bash
75
82
  npm install -g @awebai/oats@latest
76
- pi install npm:@awebai/oats-pi@latest # only if you run agents in Pi
77
- ```
78
-
79
- Initialize a workspace and check it:
80
-
81
- ```bash
82
- cd my-workspace
83
- oats init
84
- oats doctor
85
- ```
86
-
87
- Create a specialist and put it to work:
88
-
89
- ```bash
90
- oats create backend-expert --type developers --repo . --work worktree
91
- oats spawn backend-expert --purpose implement --task "Add rate limiting to the public API"
92
- oats status --team
93
- oats retire <instance>
94
- ```
95
-
96
- Or adopt a complete reference configuration from an official package:
97
-
98
- ```bash
83
+ pi install npm:@awebai/oats-pi@latest
84
+ cd /path/to/project
99
85
  oats init --package oats.dev --config default
100
- oats install
101
86
  ```
102
87
 
103
- `oats init --package` acquires and exact-locks the full closure, validates the
104
- chosen template against its providers, writes it as your local
105
- `oats-config.yaml`, and records the adopted base so `oats config diff` and
106
- `oats config sync` can compare against it later.
107
-
108
- Start capturing the turn record on this machine:
109
-
110
- ```bash
111
- oats setup
112
- oats recall "rate limiting"
113
- ```
88
+ Continue with the guide's model, team, and executable-trust setup before
89
+ spawning. Initialization acquires packages; it does not authenticate a
90
+ runtime or join a messaging team.
114
91
 
115
- A Pi agent can also load the `oats-getting-started` skill and guide the setup.
92
+ See [the first-team example](docs/first-team-demo.md) for the real Pi and
93
+ Claude tasks behind the guide. Existing OAS users: start with
94
+ [the migration command](docs/migration-from-oas.md).
116
95
 
117
96
  ## How it works
118
97
 
@@ -207,10 +186,13 @@ Bare `oats install` restores the exact lock and never advances source state.
207
186
 
208
187
  ## The turn record
209
188
 
210
- `packages/record` is the load-bearing layer. Every conversation an agent has
211
- is captured as signed turns in an append-only, content-addressed, replicated
212
- record with exact provenance, and searched locally through a SQLite full-text
213
- index. It has no runtime dependencies beyond Node.
189
+ `packages/record` is the load-bearing layer. On each machine where `oats setup`
190
+ has run, it captures Claude Code, Pi, and Codex transcripts plus aw client logs.
191
+ It skips sources matched by that record root's ignore list. Native session
192
+ turns are content-addressed, not signed, and carry exact provenance. Projected
193
+ aweb mail and chat keep their original message signatures verbatim. The
194
+ append-only record can be replicated and searched locally through a SQLite
195
+ full-text index. It has no runtime dependencies beyond Node.
214
196
 
215
197
  ```bash
216
198
  oats setup # install capture hooks and the background watcher
@@ -323,6 +305,7 @@ forms. Do not hand-edit the lock or installed stores.
323
305
  - [OATS Desktop](docs/desktop.md)
324
306
  - [Migration from OAS](docs/migration-from-oas.md)
325
307
  - [Release notes](docs/release-notes/)
308
+ - [Architecture proposal, 2026-09-03](docs/2026-09-03-architecture-proposal.md): components, contracts, and what may be replaced (proposal, not shipped behavior)
326
309
 
327
310
  ## Contributing
328
311
 
package/bin/oats.mjs CHANGED
@@ -2804,13 +2804,17 @@ function createCmd() {
2804
2804
  if (!name || name.startsWith("--")) die("usage: oats create <name> [--local] [--description <d>] [--type <agent-type>] [--repo <r>] [--work worktree|checkout|attached|workspace] [--runtime pi|claude] [--model <m>] [--instructions-file <f>]");
2805
2805
  const local = args.includes("--local");
2806
2806
  const startDir = dirFlag();
2807
- // --local can BOOTSTRAP a deployment: with no agents/ or local-agents/ yet,
2808
- // anchor at the enclosing git repo (else the start dir) people can use OATS
2809
- // with local agents alone.
2807
+ // `create` BOOTSTRAPS a deployment: with no agents/ or local-agents/ yet,
2808
+ // anchor at the enclosing git repo (else the start dir). It is the command
2809
+ // that populates the roster root, so it must not demand that the root
2810
+ // already exist — that demand was the first thing a new user hit after
2811
+ // `oats init` (a raw stack trace from ensureRoot). Local and committed souls
2812
+ // anchor the same way; writeSoul creates the directories.
2810
2813
  let root = findRoot(startDir);
2814
+ let bootstrapped = false;
2811
2815
  if (!root) {
2812
- if (!local) root = ensureRoot(startDir); // keeps the pointed error for committed souls
2813
- else root = join(defaultRepo(startDir) || resolve(startDir), "agents");
2816
+ root = join(defaultRepo(startDir) || resolve(startDir), "agents");
2817
+ bootstrapped = true;
2814
2818
  }
2815
2819
  const instrFile = flag("instructions-file");
2816
2820
  const r = coreCreateAgent(root, {
@@ -2818,7 +2822,8 @@ function createCmd() {
2818
2822
  work: flag("work"), runtime: flag("runtime"), model: flag("model"),
2819
2823
  instructions: instrFile ? readFileSync(instrFile, "utf8") : undefined,
2820
2824
  });
2821
- if (args.includes("--json")) { console.log(JSON.stringify(r, null, 2)); return; }
2825
+ if (args.includes("--json")) { console.log(JSON.stringify({ ...r, ...(bootstrapped ? { agentsRoot: root } : {}) }, null, 2)); return; }
2826
+ if (bootstrapped) console.log(`Created deployment root ${shortPath(root)} (this scope had no agents/ yet)`);
2822
2827
  console.log(`Created ${r.kind === "local" ? "LOCAL agent (uncommitted — soul lives in local-agents/, gitignored)" : "agent"} "${r.agent}" — soul at ${shortPath(r.soul)}`);
2823
2828
  console.log(`Edit ${shortPath(join(r.soul, "AGENTS.md"))} to define its role, then: oats spawn ${r.agent} --task "..."`);
2824
2829
  }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OATS Framework
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,11 @@
1
+ {
2
+ "package": "oats.authoring",
3
+ "version": "1.0.0",
4
+ "description": "Official additive OATS guidance for capability, skill, and soul authoring.",
5
+ "compatibility": {
6
+ "oats": ">=0.19.0"
7
+ },
8
+ "capabilities": [
9
+ "."
10
+ ]
11
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "capability": "oats.authoring",
3
3
  "version": "1.0.0",
4
- "compatibility": { "oats": ">=0.6.2" },
4
+ "compatibility": { "oats": ">=0.19.0" },
5
5
  "description": "Additive framework-authoring guidance for capability packages, agent skills, and souls.",
6
6
  "requires": [],
7
7
  "skills": [
8
- "../../skills/integration-authoring",
9
- "../../skills/skill-craft",
10
- "../../skills/soul-craft"
8
+ "skills/integration-authoring",
9
+ "skills/skill-craft",
10
+ "skills/soul-craft"
11
11
  ]
12
12
  }
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: integration-authoring
3
+ description: >-
4
+ Route custom OATS capability-package and integration work to the framework's
5
+ integrations expert. Use when building, adapting, or debugging a reusable
6
+ capability, new task/messaging/knowledge integration, oats.json manifest,
7
+ lifecycle hook, or operational command—not merely activating an existing
8
+ package. Triggers: "custom integration", "capability package", "integrate
9
+ our tracker", "new messaging integration", "write an oats.json".
10
+ ---
11
+
12
+ # Capability and integration authoring — delegate
13
+
14
+ A capability package may ship skills, instance instructions, requirements,
15
+ namespaced commands, and approved hooks. An integration is the constrained
16
+ subtype implementing exactly one fundamental layer. Building either requires
17
+ manifest, security, targeting-boundary, collision, and probe discipline; use
18
+ the framework's **integrations-expert** soul rather than improvising.
19
+
20
+ If the user only wants an existing package, use:
21
+
22
+ ```bash
23
+ oats install <source> # external acquisition + exact lock; inactive
24
+ oats trust <id> # only if commands/hooks exist
25
+ oats use <id> --global|--type <t>|--soul <s>
26
+ ```
27
+
28
+ ## 1. Verify the expert is available
29
+
30
+ Run `oats status` and confirm the deployment can resolve the `integrations-expert` soul. If it is absent, ask the human which OATS framework deployment owns reusable package work; never locate or import private kernel files.
31
+
32
+ ## 2. Spawn the expert against the user's repository
33
+
34
+ ```bash
35
+ oats spawn integrations-expert \
36
+ --purpose <package-slug> \
37
+ --repo <users-workspace-or-repo> \
38
+ --work checkout \
39
+ --task '<capability intent; layer if any; skills/instructions/commands/hooks; external tools; desired global/type/soul targets; distribution path>'
40
+ ```
41
+
42
+ Use `--relation child --relative-to <your-instance>` only when the documented workflow makes the expert your child; otherwise leave the operator-origin spawn unrelated. The work tree is the user's repository, where a config-owned local package belongs under `.agents/capabilities/owned/<name>/`. A framework contribution belongs under `capabilities/<name>/` in the framework worktree; an independently published package uses its own repository.
43
+
44
+ ## 3. Brief the design boundary
45
+
46
+ Tell the expert:
47
+
48
+ - whether it is additive or implements exactly one of knowledge/messaging/tasks;
49
+ - external requirements and executable surfaces;
50
+ - intended distribution and version/compatibility;
51
+ - desired config-owned targets and settings; and
52
+ - expected skill/instruction/scaffold collisions.
53
+
54
+ Targets never belong in the manifest. The expert must test exact pi/Claude
55
+ instance materialization, generated instructions, lock/trust behavior,
56
+ command gating, deterministic hooks, and scaffold ownership as applicable.
57
+
58
+ ## 4. Hand off
59
+
60
+ Report the tmux window (`tmux attach -t pi-agents`). The expert follows its
61
+ package/integration craft, runs a scaffold-only probe, and leaves acquisition
62
+ and activation commands for the user. Its durable lessons harvest back into
63
+ its soul.
@@ -0,0 +1,109 @@
1
+ ---
2
+ name: skill-craft
3
+ description: >-
4
+ How to create, evaluate, and maintain agent skills (SKILL.md files per the
5
+ Agent Skills standard). Use when writing a new skill, improving or debugging
6
+ an existing one (skill not triggering, agent ignoring instructions, skill too
7
+ long), turning a repeated procedure or correction into a skill, deciding
8
+ whether knowledge belongs in a skill versus the knowledge base versus
9
+ AGENTS.md, bundling scripts into skills, or evaluating whether a skill
10
+ actually helps. Based on the agentskills.io creator guides and Anthropic
11
+ best practices.
12
+ ---
13
+
14
+ # Skill craft — create, evaluate, maintain
15
+
16
+ A skill is a directory with a `SKILL.md` (YAML frontmatter + markdown body),
17
+ optionally `scripts/`, `references/`, `assets/`. Agents load only `name` +
18
+ `description` at startup; the body loads **only when the description matches
19
+ the task** — the description carries the entire burden of triggering.
20
+
21
+ ## Where does this knowledge belong? (decide first)
22
+
23
+ - **Repeatable procedure** ("how to do X, again and again") → **skill**.
24
+ - **Declarative fact/decision/lesson** ("what is true and why") → **OKF
25
+ concept** in the knowledge base (see `okf` skill). Skills may reference
26
+ concepts for the why.
27
+ - **Applies to every session of this agent** (role, boundaries, core workflow)
28
+ → **AGENTS.md** (see `soul-craft`). Rule of thumb: AGENTS.md is loaded
29
+ always — keep it minimal; skills load on demand — put domain workflows there.
30
+
31
+ ## Creating a skill
32
+
33
+ **Ground it in real expertise — never generate from thin air.** The valuable
34
+ content is what a capable model *doesn't* already know: your APIs, your
35
+ conventions, the corrections you had to make. Best sources: a hands-on task
36
+ you just completed (extract the steps that worked, the corrections given, the
37
+ formats used), runbooks, review comments, real failures and their fixes. A
38
+ skill with generic content ("handle errors appropriately") is worthless — cut
39
+ or ground it.
40
+
41
+ **Frontmatter rules** (spec + hard-won):
42
+ - `name`: lowercase alphanum + hyphens, ≤64 chars, **must match the directory
43
+ name**, no leading/trailing/double hyphens.
44
+ - `description`: ≤1024 chars, non-empty. ⚠️ **Use a `>-` block scalar if it
45
+ contains any `: ` colon-space** — an unquoted colon breaks YAML parsing and
46
+ the skill silently fails to load. Verify new skills actually load.
47
+
48
+ **Write the description for triggering** (it's the only thing the agent sees
49
+ before deciding):
50
+ - Imperative: "Use when..." not "This skill does...".
51
+ - Name the **user intents** it serves, not the implementation. Include
52
+ trigger phrases users actually say, and cover cases where they don't name
53
+ the domain ("even if they don't mention X").
54
+ - Precise beats broad: an over-broad description fires on near-miss tasks
55
+ and pollutes context.
56
+
57
+ **Write the body for a loaded context window** — it competes with everything
58
+ else once loaded:
59
+ - **Only what the agent would get wrong without it.** For every line ask:
60
+ "would removing this cause mistakes?" No → cut.
61
+ - ≤500 lines / ~5k tokens. Larger → move detail to `references/` and tell the
62
+ agent **when** to load each file ("read references/errors.md if the API
63
+ returns non-200"), not just that it exists.
64
+ - **Defaults, not menus**: pick one tool/approach, mention alternatives in
65
+ one line. Match prescriptiveness to fragility: fragile sequences get exact
66
+ commands ("run exactly this"); judgment tasks get goals + why.
67
+ - Procedures over answers: teach the approach that generalizes, with one
68
+ concrete worked example.
69
+ - **Gotchas section** — often the highest-value part: concrete corrections to
70
+ mistakes the agent *will* make ("the /health endpoint lies; use /ready").
71
+ - For multi-step workflows: an explicit checklist. For fragile output: a
72
+ template (agents pattern-match better than they follow prose). For
73
+ correctness-critical work: a validation loop (do → validate → fix → repeat)
74
+ or plan-validate-execute with a validator script.
75
+
76
+ **Scripts**: when you see an agent reinventing the same logic across runs,
77
+ write it once, test it, bundle it in `scripts/`, and reference it from the
78
+ body with exact invocations. Prefer zero-dependency scripts; pin versions for
79
+ `npx`/`uvx` one-offs. Scripts should print errors an agent can self-correct
80
+ from ("field X not found — available: a, b, c").
81
+
82
+ ## Evaluating (before trusting)
83
+
84
+ - **Trigger check**: draft ~10 realistic prompts that *should* fire the skill
85
+ (varied phrasing, some not naming the domain) and ~10 near-misses that
86
+ *shouldn't* (share keywords, need something else). Run them; the skill
87
+ triggered if its body was loaded. Fix the description, not the body, for
88
+ trigger failures.
89
+ - **Output check**: run 2-3 real tasks **with and without** the skill. If
90
+ with-skill isn't clearly better, the skill isn't earning its context — cut
91
+ or sharpen it. Read execution traces, not just outputs: wasted steps mean
92
+ vague instructions, inapplicable instructions being followed, or menus
93
+ without defaults.
94
+
95
+ ## Maintaining
96
+
97
+ - **Every correction is a candidate gotcha.** When a human (or reviewer)
98
+ corrects an agent following the skill, add the correction to the gotchas —
99
+ this is the single best maintenance loop.
100
+ - Treat skills like code: prune on every edit; if the agent ignores a rule,
101
+ the skill is probably too long and the rule is drowning. Test behavior
102
+ changes by observing runs, not by rereading the text.
103
+ - Never let a skill grow past one coherent unit of work — split like you'd
104
+ split a function.
105
+ - Log skill changes in the soul's `knowledge/log.md` (`**Update**: skills/x —
106
+ added gotcha about …`) so knowledge history and skill history stay one
107
+ timeline. Knowledge maintenance and skill maintenance are the same duty:
108
+ declarative lessons go to OKF concepts, procedural lessons go to skills,
109
+ and each should link to the other.
@@ -0,0 +1,109 @@
1
+ ---
2
+ name: soul-craft
3
+ description: >-
4
+ How to author and maintain an agent's soul — its AGENTS.md/CLAUDE.md
5
+ operating doc, soul.yaml config, and the balance between AGENTS.md, skills,
6
+ and the OKF knowledge base. Use when creating a new agent (writing its first
7
+ AGENTS.md), refining an existing soul that underperforms (agent ignores
8
+ instructions, drifts from its role, bloated operating doc), reviewing a
9
+ soul's setup, or deciding what goes in AGENTS.md versus a skill versus
10
+ knowledge. Based on the agents.md standard and Anthropic CLAUDE.md guidance.
11
+ ---
12
+
13
+ # Soul craft — author and maintain agent operating docs
14
+
15
+ A soul's `AGENTS.md` is loaded **every session of
16
+ every instance**. It is the most expensive real estate in the agent's context:
17
+ everything in it taxes every task, relevant or not. The craft is keeping it
18
+ minimal and pushing everything else to on-demand layers.
19
+
20
+ **Canonical files:** `AGENTS.md` and `.agents/skills/` are the canonical
21
+ sources; `CLAUDE.md` and `.claude/skills` must always be relative symlinks to
22
+ them, never independent files (the spawner creates these links — if you find a
23
+ real CLAUDE.md file diverging from AGENTS.md, that's a defect: merge and relink).
24
+
25
+ ## The three-layer rule
26
+
27
+ | Layer | Loaded | Belongs there |
28
+ |---|---|---|
29
+ | **AGENTS.md** | always | Role, boundaries, the default workflow, memory pointers — only what applies to *every* session |
30
+ | **skills/** | on demand (description match) | Domain workflows, repeatable procedures ("how") — see `skill-craft` |
31
+ | **knowledge/** | on demand (index-first) | Facts, decisions, lessons ("what/why") — format per the knowledge integration (default okf) |
32
+
33
+ The test for every AGENTS.md line: **"would removing this cause mistakes in
34
+ most sessions?"** No → move it to a skill or a knowledge concept, or cut it.
35
+ Bloated operating docs cause agents to ignore the rules that matter — a rule
36
+ being ignored is usually a symptom of too many rules.
37
+
38
+ ## Writing a soul's AGENTS.md
39
+
40
+ Structure that works (keep the whole thing short — a screen or two):
41
+
42
+ 1. **Role, one paragraph.** Who this agent is, what it owns, where it stops.
43
+ Boundaries beat capabilities: "you never merge", "you never modify the
44
+ assignee", "UI belongs to the ui agent" prevent more damage than feature
45
+ lists add value.
46
+ 2. **Operating loop.** The default shape of a work session — for a developer:
47
+ read ticket → plan in STATE.md → implement in ./work → verify → commit →
48
+ review loop → hand off. Concrete, not aspirational.
49
+ 3. **Verification.** How this agent checks its own work: the build/test/lint
50
+ commands that must pass, what "done" means. An agent with a check it can
51
+ run closes its own loop; without one, "looks done" is the only signal.
52
+ Include exact commands the agent can't guess (`make test-unit`, not
53
+ "run the tests").
54
+ 4. **Memory pointers.** Where its knowledge and state live (knowledge base
55
+ index, STATE.md discipline). Point, don't duplicate — the protocol lives
56
+ with your knowledge integration (default okf: the memory-harvest skill).
57
+ 5. **Escalation.** When to stop and ask the human or coordinator: the
58
+ human-gate triggers (security, authz, migrations, contract breaks),
59
+ plus "report to your spawner, don't self-fix" for infrastructure faults.
60
+
61
+ Style rules (from the agents.md standard + field experience):
62
+ - Write commands, not prose: `pnpm vitest run -t "<name>"` beats "run the
63
+ relevant test".
64
+ - Include only what can't be inferred from the repo: conventions that differ
65
+ from defaults, env quirks, etiquette (branch naming, PR format).
66
+ - Exclude: standard language conventions, file-by-file codebase tours, API
67
+ docs (link instead), anything that changes weekly (that's knowledge),
68
+ self-evident advice ("write clean code").
69
+ - Emphasis (**IMPORTANT**, YOU MUST) sparingly — it works, and it stops
70
+ working when everything is emphasized.
71
+ - The repo's own AGENTS.md (in ./work) covers repo mechanics — the soul doc
72
+ covers the *role*. Don't duplicate the repo doc; instruct reading it.
73
+
74
+ ## soul.yaml
75
+
76
+ Keep honest: `repo` (what it works on), `work` (worktree for builders,
77
+ checkout for reviewers/coordinators), `runtime`, `model` (only pin when the
78
+ role needs a specific one — reviewers on a different model than authors),
79
+ `description` (one line; shows in rosters and pickers).
80
+
81
+ ## Maintaining a soul
82
+
83
+ - **Change AGENTS.md rarely and deliberately** — it defines the agent. The
84
+ bar: a change in how the agent fundamentally operates, proven by instance
85
+ experience. Day-to-day lessons go to knowledge; procedures to skills.
86
+ - When an instance repeatedly misbehaves, diagnose in order: (1) is the rule
87
+ drowning in a bloated doc? → prune the doc; (2) is it ambiguous? → sharpen
88
+ with a command or example; (3) is it missing? → add it, minimally. Test by
89
+ observing the next instance's behavior, not by rereading.
90
+ - **Prune on every edit.** Adding a line? Look for two to cut.
91
+ - Log every soul change in `knowledge/log.md` (`**Update**: AGENTS.md — …`)
92
+ so the soul's evolution is reconstructible.
93
+ - Agents never rewrite their own role or safety boundaries; soul changes that
94
+ alter behavior go through the human (or a documented review workflow).
95
+ - Periodic review (worth doing when spawning feels off): does the role still
96
+ match reality? Do skills cover the recurring procedures? Is the knowledge
97
+ index current? Are the verification commands still correct?
98
+
99
+ ## Bootstrapping a new soul
100
+
101
+ Fastest path to a *grounded* soul (never write one from imagination):
102
+ 1. Do (or supervise) the role's work once in a plain session, noting
103
+ corrections, commands, and conventions as you go.
104
+ 2. Distill: role/boundaries/loop/verification/escalation → AGENTS.md;
105
+ repeated procedures → first skills; facts and decisions → first knowledge
106
+ concepts.
107
+ 3. Spawn an instance on a real task; watch where it stumbles; fold the
108
+ corrections back (doc, skill gotcha, or concept — per the three-layer rule).
109
+ Two rounds of this beat any amount of upfront authoring.
@@ -3,7 +3,7 @@
3
3
  "command": "aweb",
4
4
  "version": "1.8.0",
5
5
  "compatibility": {
6
- "oats": ">=0.6.2"
6
+ "oats": ">=0.19.0"
7
7
  },
8
8
  "layer": "messaging",
9
9
  "description": "Messaging layer via aweb: per-instance team identities + native aw mail/chat skills + cross-machine team roster.",
@@ -16,21 +16,21 @@
16
16
  {
17
17
  "runtime": "pi",
18
18
  "package": "npm:@awebai/pi",
19
- "why": "the aweb channel extension for pi sessions \u2014 real-time mail/chat awakenings; without it a pi instance can send with `aw` but is never woken by incoming messages",
19
+ "why": "the aweb channel extension for pi sessions real-time mail/chat awakenings; without it a pi instance can send with `aw` but is never woken by incoming messages",
20
20
  "install": "https://aweb.ai/docs (installed into pi with `pi install npm:@awebai/pi`)"
21
21
  },
22
22
  {
23
23
  "runtime": "claude",
24
24
  "package": "aweb-channel@awebai-marketplace",
25
25
  "marketplace": "awebai/claude-plugins",
26
- "why": "the aweb channel plugin for Claude Code sessions \u2014 real-time mail/chat awakenings; without it a Claude instance can send with `aw` but is never woken by incoming messages",
26
+ "why": "the aweb channel plugin for Claude Code sessions real-time mail/chat awakenings; without it a Claude instance can send with `aw` but is never woken by incoming messages",
27
27
  "install": "https://aweb.ai/docs (installs the awebai marketplace and the aweb-channel plugin into Claude Code)"
28
28
  }
29
29
  ],
30
30
  "skills": [
31
- "node_modules/@awebai/pi/skills/aweb-messaging",
32
- "node_modules/@awebai/pi/skills/aweb-team-membership",
33
- "node_modules/@awebai/pi/skills/aweb-identity"
31
+ "skills/aweb-messaging",
32
+ "skills/aweb-team-membership",
33
+ "skills/aweb-identity"
34
34
  ],
35
35
  "inject": "injects/aweb.md",
36
36
  "commands": {
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Juan Reyero
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,26 @@
1
+ # Vendored aweb Agent Skills
2
+
3
+ These reviewed resources are vendored from the MIT-licensed aweb repository:
4
+
5
+ - Repository: <https://github.com/awebai/aweb.git>
6
+ - Upstream package: `@awebai/pi@0.2.3`
7
+ - Tag: `pi-v0.2.3`
8
+ - Commit: `812bdeb1be8ed99dbd339a910a153e7b802501d4`
9
+ - Registry integrity: `sha512-SnCT+5Ybh57G7+zwlfw6QRgAoyAVkyhcgRqIPPx47e+UcJdi5REXw9td806LveLEKAx0CwFTyxOInPH6mfs4EA==`
10
+ - License: MIT; see [`LICENSE`](LICENSE)
11
+
12
+ Vendored trees:
13
+
14
+ - `aweb-messaging/`
15
+ - `aweb-team-membership/`
16
+ - `aweb-identity/`
17
+
18
+ To update, check out the named upstream repository at the intended reviewed commit, update the constants in `scripts/sync-vendored-skills.mjs`, then run from this repository root:
19
+
20
+ ```bash
21
+ node scripts/sync-vendored-skills.mjs --source /path/to/aweb
22
+ npm test
23
+ git diff -- capabilities/oats-aweb/skills
24
+ ```
25
+
26
+ The sync command refuses a checkout whose `HEAD` differs from its pinned commit. Review the complete generated diff, upstream license, and triggering descriptions before changing the recorded version/ref. Runtime acquisition never fetches these resources.