@awebai/oats 0.29.4 → 0.30.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.
- package/README.md +12 -6
- package/bin/oats.mjs +194 -50
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +6 -11
- package/docs/configuration.md +213 -64
- package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
- package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
- package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
- package/docs/design/2026-09-27-team-model-v2.md +97 -117
- package/docs/design/2026-09-28-automations-trust.md +38 -0
- package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
- package/docs/design/HISTORY.md +65 -0
- package/docs/design/README.md +23 -54
- package/docs/desktop-cli-api.md +1787 -1777
- package/docs/desktop.md +30 -91
- package/docs/execution-targets.md +146 -292
- package/docs/first-team.md +31 -17
- package/docs/implementation.md +77 -288
- package/docs/integrations.md +118 -320
- package/docs/knowledge-capability-authoring.md +25 -52
- package/docs/knowledge-reference/acceptance.md +3 -3
- package/docs/knowledge-reference/adoption.md +1 -1
- package/docs/knowledge-reference/harvester.md +2 -2
- package/docs/knowledge-reference/package-craft.md +3 -3
- package/docs/knowledge-reference/provider-mapping.md +3 -6
- package/docs/knowledge-reference/reader-capture.md +3 -3
- package/docs/knowledge-theory.md +62 -166
- package/docs/knowledge.md +225 -404
- package/docs/layers.md +42 -97
- package/docs/oats-local.schema.json +58 -5
- package/docs/oats-membership.schema.json +1 -8
- package/docs/oats-package.schema.json +5 -5
- package/docs/oats-workspace.schema.json +8 -22
- package/docs/official-catalog.md +25 -28
- package/docs/packages.md +45 -63
- package/docs/plans/0.30-close-out.md +83 -0
- package/docs/release-lane.md +82 -0
- package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
- package/docs/release-notes/v0.19.0.md +48 -147
- package/docs/release-notes/v0.19.1.md +2 -3
- package/docs/release-notes/v0.19.3.md +2 -15
- package/docs/release-notes/v0.20.0.md +0 -15
- package/docs/release-notes/v0.22.0.md +71 -138
- package/docs/release-notes/v0.22.1.md +42 -90
- package/docs/release-notes/v0.22.10.md +1 -1
- package/docs/release-notes/v0.22.11.md +1 -47
- package/docs/release-notes/v0.22.12.md +4 -13
- package/docs/release-notes/v0.22.13.md +1 -42
- package/docs/release-notes/v0.22.14.md +3 -11
- package/docs/release-notes/v0.22.15.md +1 -46
- package/docs/release-notes/v0.22.16.md +6 -8
- package/docs/release-notes/v0.22.18.md +1 -99
- package/docs/release-notes/v0.22.19.md +3 -14
- package/docs/release-notes/v0.22.2.md +6 -15
- package/docs/release-notes/v0.22.3.md +0 -1
- package/docs/release-notes/v0.22.4.md +1 -14
- package/docs/release-notes/v0.22.5.md +2 -12
- package/docs/release-notes/v0.22.6.md +0 -3
- package/docs/release-notes/v0.23.0.md +9 -25
- package/docs/release-notes/v0.23.1.md +9 -25
- package/docs/release-notes/v0.23.2.md +2 -4
- package/docs/release-notes/v0.24.0.md +56 -97
- package/docs/release-notes/v0.24.1.md +7 -11
- package/docs/release-notes/v0.24.10.md +34 -45
- package/docs/release-notes/v0.24.11.md +12 -20
- package/docs/release-notes/v0.24.12.md +35 -48
- package/docs/release-notes/v0.24.13.md +34 -41
- package/docs/release-notes/v0.24.2.md +9 -13
- package/docs/release-notes/v0.24.3.md +7 -11
- package/docs/release-notes/v0.24.4.md +6 -6
- package/docs/release-notes/v0.24.5.md +6 -10
- package/docs/release-notes/v0.24.6.md +2 -5
- package/docs/release-notes/v0.24.7.md +46 -75
- package/docs/release-notes/v0.24.8.md +58 -96
- package/docs/release-notes/v0.24.9.md +38 -54
- package/docs/release-notes/v0.25.0.md +59 -76
- package/docs/release-notes/v0.25.1.md +57 -81
- package/docs/release-notes/v0.25.2.md +51 -70
- package/docs/release-notes/v0.25.3.md +11 -13
- package/docs/release-notes/v0.25.4.md +9 -13
- package/docs/release-notes/v0.25.5.md +3 -5
- package/docs/release-notes/v0.25.6.md +20 -29
- package/docs/release-notes/v0.25.7.md +5 -7
- package/docs/release-notes/v0.25.8.md +26 -39
- package/docs/release-notes/v0.26.0.md +175 -646
- package/docs/release-notes/v0.27.0.md +4 -5
- package/docs/release-notes/v0.27.1.md +4 -6
- package/docs/release-notes/v0.27.2.md +1 -1
- package/docs/release-notes/v0.28.0.md +57 -124
- package/docs/release-notes/v0.29.0.md +89 -208
- package/docs/release-notes/v0.29.1.md +1 -1
- package/docs/release-notes/v0.29.2.md +3 -4
- package/docs/release-notes/v0.30.0.md +205 -0
- package/docs/release-notes/v0.30.1.md +123 -0
- package/docs/schedules.md +280 -363
- package/docs/servers.md +99 -117
- package/docs/soul.schema.json +2 -9
- package/docs/souls-and-instances.md +145 -158
- package/docs/workspaces.md +137 -215
- package/lib/automations.mjs +21 -6
- package/lib/core.mjs +226 -74
- package/lib/instance-events.mjs +1 -1
- package/lib/instance-inspect.mjs +109 -34
- package/lib/instance-lifecycle.mjs +14 -1
- package/lib/instance-resolution.mjs +26 -27
- package/lib/launch-preference.mjs +87 -0
- package/lib/materialize.mjs +3 -3
- package/lib/packages.mjs +1 -1
- package/lib/resolve.mjs +30 -88
- package/lib/schedule.mjs +1 -1
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +2 -2
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +10 -16
- package/package.json +1 -3
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-authoring/LICENSE +0 -21
- package/capabilities/oats-authoring/oats-package.json +0 -11
- package/capabilities/oats-authoring/oats.json +0 -12
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +0 -84
- package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +0 -109
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +0 -116
- package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +0 -11
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +0 -1338
- package/capabilities/oats-aweb/injects/aweb.md +0 -47
- package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -356
- package/capabilities/oats-aweb/lib/captured-execution.mjs +0 -91
- package/capabilities/oats-aweb/lib/captured-native.mjs +0 -91
- package/capabilities/oats-aweb/lib/grant-custody.mjs +0 -38
- package/capabilities/oats-aweb/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-aweb/lib/portable-binding.mjs +0 -146
- package/capabilities/oats-aweb/lib/session-readiness.mjs +0 -56
- package/capabilities/oats-aweb/lib/wake-receive.mjs +0 -56
- package/capabilities/oats-aweb/oats.json +0 -208
- package/capabilities/oats-aweb/skills/LICENSE +0 -21
- package/capabilities/oats-aweb/skills/VENDORED.md +0 -31
- package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +0 -201
- package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +0 -161
- package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +0 -61
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +0 -116
- package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +0 -74
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +0 -216
- package/capabilities/oats-jira/bin/oats-jira.mjs +0 -40
- package/capabilities/oats-jira/injects/jira.md +0 -10
- package/capabilities/oats-jira/oats.json +0 -22
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +0 -179
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +0 -34
- package/capabilities/oats-linear/bin/oats-linear.mjs +0 -344
- package/capabilities/oats-linear/injects/linear.md +0 -8
- package/capabilities/oats-linear/oats.json +0 -24
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +0 -223
- package/capabilities/oats-okf/bin/oats-okf-binding.mjs +0 -14
- package/capabilities/oats-okf/bin/oats-okf.mjs +0 -209
- package/capabilities/oats-okf/injects/okf.md +0 -42
- package/capabilities/oats-okf/lib/binding-wire.mjs +0 -348
- package/capabilities/oats-okf/lib/captured-worker.mjs +0 -109
- package/capabilities/oats-okf/lib/config.mjs +0 -124
- package/capabilities/oats-okf/lib/consult.mjs +0 -518
- package/capabilities/oats-okf/lib/harvest-status.mjs +0 -88
- package/capabilities/oats-okf/lib/harvest-switch.mjs +0 -94
- package/capabilities/oats-okf/lib/inspection.mjs +0 -119
- package/capabilities/oats-okf/lib/invocation-context.mjs +0 -111
- package/capabilities/oats-okf/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-okf/lib/io.mjs +0 -118
- package/capabilities/oats-okf/lib/migration.mjs +0 -137
- package/capabilities/oats-okf/lib/okf-validate.mjs +0 -123
- package/capabilities/oats-okf/lib/portable-binding.mjs +0 -199
- package/capabilities/oats-okf/lib/source-contract.mjs +0 -46
- package/capabilities/oats-okf/lib/sources.mjs +0 -424
- package/capabilities/oats-okf/lib/stores.mjs +0 -473
- package/capabilities/oats-okf/lib/worker.mjs +0 -497
- package/capabilities/oats-okf/oats.json +0 -148
- package/capabilities/oats-okf/schemas/okf-base.schema.json +0 -46
- package/capabilities/oats-okf/schemas/okf-bindings.schema.json +0 -112
- package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +0 -87
- package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +0 -113
- package/capabilities/oats-okf/schemas/okf-soul.schema.json +0 -37
- package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +0 -144
- package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +0 -86
- package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +0 -104
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +0 -140
- package/capabilities/oats-okf-harvest/injects/harvester.md +0 -12
- package/capabilities/oats-okf-harvest/oats.json +0 -26
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +0 -168
- package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-harvest/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-harvest/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +0 -170
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +0 -12
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +0 -50
- package/capabilities/oats-okf-maintenance/oats.json +0 -21
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +0 -159
- package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +0 -146
- package/capabilities/oats-review/injects/review.md +0 -69
- package/capabilities/oats-review/oats.json +0 -10
- package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
- package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
- package/docs/conventions.md +0 -90
- package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
- package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
- package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
- package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
- package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
- package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
- package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
- package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
- package/docs/design/2026-09-15-captured-dispatch.md +0 -127
- package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
- package/docs/design/2026-09-15-package-preparation.md +0 -100
- package/docs/design/2026-09-15-portable-data-contract.md +0 -121
- package/docs/design/2026-09-15-portable-declarations.md +0 -189
- package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
- package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
- package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
- package/docs/design/2026-09-15-source-observation.md +0 -119
- package/docs/design/2026-09-16-captured-admission.md +0 -77
- package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
- package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
- package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
- package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
- package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
- package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
- package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
- package/docs/design/2026-09-16-portable-onboarding.md +0 -179
- package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
- package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
- package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
- package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
- package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
- package/docs/design/2026-09-17-captured-native-start.md +0 -58
- package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
- package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
- package/docs/design/2026-09-17-public-captured-start.md +0 -108
- package/docs/design/2026-09-17-public-prepare-request.md +0 -90
- package/docs/design/2026-09-18-captured-pi-host.md +0 -205
- package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
- package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
- package/docs/design/2026-09-20-redesign-program-board.md +0 -142
- package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
- package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
- package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
- package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
- package/docs/design/2026-09-24-phase-d-plan.md +0 -305
- package/docs/design/2026-09-25-teams-contract.md +0 -258
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
- package/docs/design/desktop-ux-plan.md +0 -362
- package/docs/design/launch-configurations.md +0 -168
- package/docs/design/okf-mirror-provenance.md +0 -105
- package/docs/design/operations-contract.md +0 -141
- package/docs/oats-member.schema.json +0 -38
- package/skills/integration-authoring/SKILL.md +0 -84
- package/skills/oats-support/SKILL.md +0 -79
- package/skills/skill-craft/SKILL.md +0 -109
- package/skills/soul-craft/SKILL.md +0 -116
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
# Provider operations and inspection contract
|
|
2
|
-
|
|
3
|
-
Implemented 2026-09-07 on the existing capability engine. The kernel
|
|
4
|
-
resolves providers; a GUI reads one answer and calls the commands below.
|
|
5
|
-
Nothing here names a provider: what a knowledge, messaging or tasks
|
|
6
|
-
capability offers is what its manifest declares.
|
|
7
|
-
|
|
8
|
-
## Manifest: operations
|
|
9
|
-
|
|
10
|
-
```json
|
|
11
|
-
"operations": {
|
|
12
|
-
"harvest": { "kind": "action", "command": "harvest", "context": "home", "description": "Promote this instance's notes into its soul" },
|
|
13
|
-
"inspect": { "kind": "view", "command": "inspect", "context": "home", "description": "Show this instance's working knowledge" }
|
|
14
|
-
}
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
`command` names one of the manifest's `commands`. `kind` is `action`
|
|
18
|
-
(default) or `view`. `context` is `home` (default; runs in an instance
|
|
19
|
-
home) or `scope` (runs in the config scope). Optional `args` declare
|
|
20
|
-
`{name, flag, required, description}`; the runner passes `--arg name=value`
|
|
21
|
-
pairs as those flags and refuses unknown or missing required ones. A view
|
|
22
|
-
must answer `{ documents: [{ label, kind: "markdown"|"text", path?, text? }],
|
|
23
|
-
summary? }`; the kernel validates that shape and relays it. Paths are
|
|
24
|
-
provenance for the reader; the kernel reads nothing for a view. Validation
|
|
25
|
-
happens when the manifest loads (`docs/capability-manifest.schema.json`).
|
|
26
|
-
|
|
27
|
-
## oats inspect
|
|
28
|
-
|
|
29
|
-
`oats inspect [--dir <scope>] [--soul <name> [--agents-root <abs>]] [--home
|
|
30
|
-
<abs>] [--server <id>] --json` answers, in one envelope: `scope` (context,
|
|
31
|
-
workspace, team, chain, agentsRoots); `souls` (persistent, local and
|
|
32
|
-
packaged, each with runtime defaults, `editable {fields, instructions,
|
|
33
|
-
reason}`, instances, and for the selected soul its `instructions {file,
|
|
34
|
-
text, sha256, bytes, truncated, error}` capped at 256 KiB of bytes on a
|
|
35
|
-
character boundary); `layers` (effective provider per layer); `capabilities`
|
|
36
|
-
(installed state and `health` from the package engine, `missingRequires`,
|
|
37
|
-
and separately `activation {enabled, source, target, level, provenance,
|
|
38
|
-
settings, declaredAt}` plus `operations` with `available` and a `reason`);
|
|
39
|
-
`knowledge` (the effective knowledge provider's operations); `snapshot` and
|
|
40
|
-
`currentConfig` with `--home`; `problems`.
|
|
41
|
-
|
|
42
|
-
A `--home` answer is authoritative for that home: activation, settings,
|
|
43
|
-
layers and operation availability come from the home's captured bindings
|
|
44
|
-
with the currently acquired manifests and current trust, marked `source:
|
|
45
|
-
"snapshot"`; the live config is `currentConfig`, and `snapshot.drift`
|
|
46
|
-
lists activation, settings and integrity differences. The home selects its
|
|
47
|
-
own soul under its own agents root (its recorded work repository may be
|
|
48
|
-
another repository); `--dir`, if given, must be the recorded repository or
|
|
49
|
-
the workspace of that root, and `--agents-root` must be that root
|
|
50
|
-
(`E_HOME_MISMATCH`). Without a home, `--dir` is the config context and
|
|
51
|
-
same-named souls under two member roots need `--agents-root`
|
|
52
|
-
(`E_SOUL_AMBIGUOUS`). The ambient `PI_AGENTS_ROOT` never redirects these
|
|
53
|
-
commands. Integrity scanning happens only in this command.
|
|
54
|
-
|
|
55
|
-
## oats operation run
|
|
56
|
-
|
|
57
|
-
`oats operation run <layer>:<name> (--home <abs> | --soul <name> [--dir
|
|
58
|
-
<scope>] [--agents-root <abs>]) [--arg k=v ...] --json` resolves the
|
|
59
|
-
provider that fills `<layer>` for the home (captured bindings and settings)
|
|
60
|
-
or for the soul in the scope (config), requires the operation to be declared
|
|
61
|
-
(`E_OPERATION_UNKNOWN`), a provider to exist (`E_OPERATION_UNAVAILABLE`,
|
|
62
|
-
also for a home-context operation without `--home`), the executable surface
|
|
63
|
-
to be trusted (`E_CAPABILITY_BLOCKED`) and its `requires` to be on PATH
|
|
64
|
-
(`E_CAPABILITY_REQUIRES`), then runs the provider's own command exactly as
|
|
65
|
-
`oats <ns> <cmd>` would, with cwd and identity set to the selected target
|
|
66
|
-
(`OATS_HOME`, `OATS_INSTANCE`, `OATS_AGENT`, `OATS_SOUL`, `OATS_ROOT`,
|
|
67
|
-
`OATS_CONTEXT`, `OATS_WORKSPACE`, `OATS_OPERATION`, `OATS_SETTINGS`,
|
|
68
|
-
`OATS_CLI_BIN`, team variables) and every ambient identity of the invoking
|
|
69
|
-
process removed. The answer is `{ operation, capability, version, argv,
|
|
70
|
-
cwd, target: {home, instance}|null, result, instance?, home? }`; top-level
|
|
71
|
-
`instance`/`home` appear only when the provider's answer names something it
|
|
72
|
-
launched, never the source home.
|
|
73
|
-
|
|
74
|
-
The receipt must be exactly one JSON-v1 envelope on stdout from a process
|
|
75
|
-
that exits 0. Otherwise the outcome is unconfirmed: `E_OPERATION_TIMEOUT`
|
|
76
|
-
(240 s, below every wrapper) or `E_OPERATION_RESULT` (no valid envelope,
|
|
77
|
-
contaminated output, or a success envelope contradicted by the exit
|
|
78
|
-
status), with `error.details {unconfirmed: true, exit, envelope?, stderr?}`
|
|
79
|
-
carrying what was observed. A provider's own `ok: false` is relayed with
|
|
80
|
-
its code.
|
|
81
|
-
|
|
82
|
-
## Schedules
|
|
83
|
-
|
|
84
|
-
Kind `operation` `{operation: "<layer>:<name>", home}` runs `oats operation
|
|
85
|
-
run <op> --home <home>` as a command job: same admission, tracking and
|
|
86
|
-
reconciliation. An unconfirmed outcome keeps the slot as unknown and any
|
|
87
|
-
name the provider answered is kept for `oats schedule reconcile`.
|
|
88
|
-
|
|
89
|
-
## Mutations
|
|
90
|
-
|
|
91
|
-
*(0.24 only — `oats use` was removed by the workspace model v2; activation is the soul's `capabilities:` + workspace defaults. Kept for history.)*
|
|
92
|
-
`oats use ... --json` answers `{ capability, action: enable|disable|
|
|
93
|
-
layer-none|inherit, target, layer, level, file, settings, before, after
|
|
94
|
-
{..., effective}, remaining?, note?, missingRequires }`. `--inherit`
|
|
95
|
-
removes only the addressed target at this level; other bindings stay and
|
|
96
|
-
are listed. `use none --layer l` is a level statement and takes no soul or
|
|
97
|
-
type. A layer bound to another capability at a level is never overwritten
|
|
98
|
-
(`E_LAYER_BOUND` with the exact remedy).
|
|
99
|
-
|
|
100
|
-
*(0.24/0.25 only — `oats soul set` was removed in 0.26.0: a soul is edited in its member repository, then `oats sync`. Kept for history.)*
|
|
101
|
-
`oats soul set <name> [--dir] [--agents-root] [--runtime] [--model |
|
|
102
|
-
--no-model] [--yolo | --no-yolo] [--backend] [--description |
|
|
103
|
-
--no-description] [--instructions-file <path>] --json` edited only the given
|
|
104
|
-
`soul.yaml` lines and replaced `AGENTS.md`; packaged souls were refused
|
|
105
|
-
(`E_SOUL_READONLY`). The receipt carried before/after and sha256s.
|
|
106
|
-
|
|
107
|
-
## Remote
|
|
108
|
-
|
|
109
|
-
`inspect` and `operation` route with `--server <id>` through
|
|
110
|
-
the saved route. The gate is the destination's `features` list containing
|
|
111
|
-
`operations` and its `operationsApi: 1` (`E_REMOTE_INCOMPATIBLE` before
|
|
112
|
-
anything is sent): `features` describes what a kernel can do locally, which
|
|
113
|
-
is what runs on the host. The probe's `remote` list describes what a CLI
|
|
114
|
-
can ROUTE to a server and is what a GUI checks on the local CLI before
|
|
115
|
-
offering remote actions; it is not a gate on the destination. An explicit `--dir` is the exact member context and
|
|
116
|
-
travels as is; `--home` is its own context; otherwise the registered
|
|
117
|
-
workspace is the scope.
|
|
118
|
-
|
|
119
|
-
## Replaceability
|
|
120
|
-
|
|
121
|
-
`test/operation.test.mjs` runs the real CLI on the Northwind fixture and
|
|
122
|
-
replaces the provider in a spawned home's module copy (what `operation run
|
|
123
|
-
--home` executes) with a recording provider of its own: the runner is generic
|
|
124
|
-
and assumes nothing about the official provider's operations.
|
|
125
|
-
|
|
126
|
-
## Workspace model (0.26.0)
|
|
127
|
-
|
|
128
|
-
On a workspace deployment, and for a home whose `instance.json` records
|
|
129
|
-
`modules`, `oats inspect`, `oats readiness` and `oats operation run` read the
|
|
130
|
-
workspace model's own records instead of the config chain:
|
|
131
|
-
- the subject is `--home` (instance.json plus its module copies) or `--soul`
|
|
132
|
-
(the soul resolved as its spawn would be), never a scope;
|
|
133
|
-
- `operationsApi` is 2 (also on the run result), and each soul row carries
|
|
134
|
-
`soulsApi: 2`;
|
|
135
|
-
- there is no trust gate (`E_CAPABILITY_BLOCKED` is gone);
|
|
136
|
-
- no `scope`, `chain`, `activation`, `snapshot` or `currentConfig` block.
|
|
137
|
-
|
|
138
|
-
The payloads are specified in
|
|
139
|
-
[desktop-cli-api.md](../desktop-cli-api.md#inspect-readiness-and-operation-run-on-the-workspace-model-operationsapi-2-soulsapi-2-readinessapi-2-oats-0260).
|
|
140
|
-
The sections above describe the classic path, which is removed with the classic
|
|
141
|
-
config chain.
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://oats.dev/schemas/member-v1.json",
|
|
4
|
-
"title": "Portable repository export index v1",
|
|
5
|
-
"description": "oats.yaml advertises definitions; a backlink is not admission or permission. Public external export indexes may omit workspace.",
|
|
6
|
-
"type": "object",
|
|
7
|
-
"required": ["schemaVersion", "exports"],
|
|
8
|
-
"additionalProperties": false,
|
|
9
|
-
"properties": {
|
|
10
|
-
"schemaVersion": { "const": 1 },
|
|
11
|
-
"workspace": { "$ref": "https://oats.dev/schemas/workspace-v1.json#/$defs/repository" },
|
|
12
|
-
"exports": {
|
|
13
|
-
"type": "object", "additionalProperties": false,
|
|
14
|
-
"properties": {
|
|
15
|
-
"souls": {
|
|
16
|
-
"type": "array", "items": {
|
|
17
|
-
"type": "object", "required": ["path", "definition"], "additionalProperties": false,
|
|
18
|
-
"properties": {
|
|
19
|
-
"path": { "$ref": "https://oats.dev/schemas/workspace-v1.json#/$defs/path" },
|
|
20
|
-
"definition": { "$ref": "https://oats.dev/schemas/workspace-v1.json#/$defs/path" },
|
|
21
|
-
"description": { "type": "string" }
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
"packages": {
|
|
26
|
-
"type": "array", "items": {
|
|
27
|
-
"type": "object", "required": ["path"], "additionalProperties": false,
|
|
28
|
-
"properties": {
|
|
29
|
-
"path": { "$ref": "https://oats.dev/schemas/workspace-v1.json#/$defs/path" },
|
|
30
|
-
"description": { "type": "string" }
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"knowledge": { "type": "array", "items": { "$ref": "https://oats.dev/schemas/soul-v1.json#/properties/knowledge" } }
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
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 tasks/messaging/knowledge core capability, 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 declared hooks. A core capability is the constrained
|
|
16
|
-
kind that fills one of the knowledge, messaging or tasks positions (its
|
|
17
|
-
manifest's `layer` field names which). Building either requires
|
|
18
|
-
manifest, security, targeting-boundary, collision, and probe discipline; use
|
|
19
|
-
the framework's **integrations-expert** soul rather than improvising.
|
|
20
|
-
|
|
21
|
-
If the user only wants an existing package, declare it and give it to souls;
|
|
22
|
-
no build is needed:
|
|
23
|
-
|
|
24
|
-
```yaml
|
|
25
|
-
# oats-workspace.yaml (host repository): declaring the package is the trust decision
|
|
26
|
-
packages:
|
|
27
|
-
vendor.review: git:github.com/vendor/review@v1.0.0
|
|
28
|
-
# a soul's soul.yaml, or the workspace defaults: a capability the package exports
|
|
29
|
-
# (a package may export several; the soul names each one it wants)
|
|
30
|
-
capabilities:
|
|
31
|
-
vendor.review: { from: package }
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Then run `oats sync` (fetch, verify integrity, lock). The oats.setup
|
|
35
|
-
capability's **oats-package-pins** skill has the procedure.
|
|
36
|
-
|
|
37
|
-
## 1. Verify the expert is available
|
|
38
|
-
|
|
39
|
-
Run `oats souls` in the deployment and confirm it resolves the
|
|
40
|
-
`integrations-expert` soul (a member repository or package provides it). If it
|
|
41
|
-
is absent, ask the human which OATS deployment owns reusable package work;
|
|
42
|
-
never locate or import private kernel files.
|
|
43
|
-
|
|
44
|
-
## 2. Spawn the expert against the package's repository
|
|
45
|
-
|
|
46
|
-
The package lives in its own repository. Make that repository a member of the
|
|
47
|
-
workspace (or use the member that already holds it), then spawn the expert on
|
|
48
|
-
it:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
oats spawn integrations-expert --preview \
|
|
52
|
-
--purpose <package-slug> \
|
|
53
|
-
--repo <member clone of the package repository> \
|
|
54
|
-
--work worktree \
|
|
55
|
-
--task '<capability intent; layer if any; skills/instructions/commands/hooks; external tools; which souls should get it; distribution path>'
|
|
56
|
-
# review the preview, then run the same command without --preview
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Use `--relation child --relative-to <your-instance>` only when the documented
|
|
60
|
-
workflow makes the expert your child; otherwise leave the spawn unrelated. A
|
|
61
|
-
package is distributed from its own repository as `oats-package/` with a
|
|
62
|
-
version tag; a framework contribution belongs in the framework's repository.
|
|
63
|
-
|
|
64
|
-
## 3. Brief the design boundary
|
|
65
|
-
|
|
66
|
-
Tell the expert:
|
|
67
|
-
|
|
68
|
-
- whether it is additive or implements exactly one of knowledge/messaging/tasks;
|
|
69
|
-
- external requirements and executable surfaces (commands, hooks);
|
|
70
|
-
- intended distribution and version/compatibility;
|
|
71
|
-
- which souls or workspace defaults should receive it, and its settings; and
|
|
72
|
-
- expected skill/instruction collisions (a duplicate skill name fails the spawn).
|
|
73
|
-
|
|
74
|
-
Which souls get a capability is declared by the workspace (`defaults`) and the
|
|
75
|
-
souls (`soul.yaml` `capabilities`), never in the manifest. The expert must
|
|
76
|
-
test exact pi/Claude/Codex instance materialization, generated instructions,
|
|
77
|
-
command gating, deterministic hooks, and the lock's integrity check as
|
|
78
|
-
applicable.
|
|
79
|
-
|
|
80
|
-
## 4. Hand off
|
|
81
|
-
|
|
82
|
-
Report the new instance (`oats status`). The expert follows its
|
|
83
|
-
package/integration craft, runs a preview-only probe, and leaves the
|
|
84
|
-
`packages:` pin and the `oats sync` for the user.
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oats-support
|
|
3
|
-
description: >-
|
|
4
|
-
Route deep OATS framework questions to the framework's own expert agent.
|
|
5
|
-
Use when a user asks how OATS works beyond the basics in the oats-operate skill, why
|
|
6
|
-
the framework behaves a certain way, wants framework changes or roadmap
|
|
7
|
-
context, or hits framework bugs — the answer is to instantiate the
|
|
8
|
-
oats-expert soul from the OATS framework repo and delegate. Triggers: "ask
|
|
9
|
-
the OATS experts", "why does OATS do X", "is this an OATS bug", "OATS
|
|
10
|
-
architecture question", "who maintains this framework".
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# OATS support — delegate to the framework's expert
|
|
14
|
-
|
|
15
|
-
The OATS framework repo carries its own agents. The **oats-expert** soul holds
|
|
16
|
-
the framework's architecture record, decisions, and roadmap — knowledge no
|
|
17
|
-
generic session has. For deep questions, instantiate it and let the user
|
|
18
|
-
talk to it directly. Do not guess at framework internals yourself.
|
|
19
|
-
|
|
20
|
-
## 1. Find the OATS framework repo locally
|
|
21
|
-
|
|
22
|
-
Check in this order. Verify a hit by remote URL — it must point at
|
|
23
|
-
`awebai/oats`:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# a) an existing pi install from a local path IS the repo
|
|
27
|
-
python3 -c "import json,os; [print(p if isinstance(p,str) else p.get('source','')) for p in json.load(open(os.path.expanduser('~/.pi/agent/settings.json'))).get('packages',[])]"
|
|
28
|
-
# b) common spots
|
|
29
|
-
ls -d ~/oats ~/oats-framework 2>/dev/null
|
|
30
|
-
# c) verify any candidate
|
|
31
|
-
git -C <candidate> remote get-url origin # expect awebai/oats
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
**Do not use a pi-managed git clone** (`~/.pi/agent/git/...`) as the home
|
|
35
|
-
for agent instantiation. `pi update` resets and cleans those clones, which
|
|
36
|
-
would wipe the souls' accumulated knowledge.
|
|
37
|
-
|
|
38
|
-
## 2. If not found, ask the user where to clone
|
|
39
|
-
|
|
40
|
-
Never pick a location silently. Suggest `~/oats` or a sibling of
|
|
41
|
-
their workspace, then:
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
git clone https://github.com/awebai/oats <chosen-path>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## 3. Instantiate the oats-expert soul
|
|
48
|
-
|
|
49
|
-
Spawn from the repo's own agents root (`--dir` targets it regardless of
|
|
50
|
-
where your session runs):
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
oats spawn oats-expert --dir <repo> --purpose <short-slug> \
|
|
54
|
-
--task "<the user question, plus their workspace path and any config context>"
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Do NOT pass `--parent` here: `--dir <repo>` targets a DIFFERENT deployment's
|
|
58
|
-
agents root, and lineage is deployment-local — your instance is not
|
|
59
|
-
discoverable (or renderable) in the target's hierarchy, so the spawn is
|
|
60
|
-
correctly operator-origin/top-level there. Pass `--parent "$OATS_INSTANCE"`
|
|
61
|
-
only when spawning within your own deployment.
|
|
62
|
-
|
|
63
|
-
Include in the task briefing: the user's actual question, their workspace
|
|
64
|
-
path, and relevant `oats doctor` output. The expert reads its soul knowledge
|
|
65
|
-
and answers with citations.
|
|
66
|
-
|
|
67
|
-
## 4. Hand off
|
|
68
|
-
|
|
69
|
-
Tell the user the instance is running and how to reach it:
|
|
70
|
-
`tmux attach -t pi-agents`, then pick the window. Report the window name.
|
|
71
|
-
Retirement is the user's call (or yours if they delegate it) — retiring
|
|
72
|
-
harvests the instance's notes back into the expert's soul.
|
|
73
|
-
|
|
74
|
-
## Scope note
|
|
75
|
-
|
|
76
|
-
Quick questions (home layout, roster, lifecycle, doctor) are already
|
|
77
|
-
answered by the **oats-operate** skill (the `oats.core` capability) — use that first. Delegate to the expert for
|
|
78
|
-
architecture, design rationale, roadmap, and anything you would otherwise
|
|
79
|
-
guess about.
|
|
@@ -1,109 +0,0 @@
|
|
|
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.
|
|
@@ -1,116 +0,0 @@
|
|
|
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 capability (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 capability (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: `description` (one line; shows in rosters and pickers), `work`
|
|
77
|
-
(`worktree` for builders, `checkout` for reviewers/coordinators, `directory`
|
|
78
|
-
or `workspace` where the role needs them), and the capabilities the role
|
|
79
|
-
actually uses (`capabilities: { <cap>: { from: package | here | <repo key> } }`,
|
|
80
|
-
plus `knowledge` / `messaging` / `tasks` slots; `none` empties one). The
|
|
81
|
-
soul lives in its member repository, which is also what it works on.
|
|
82
|
-
|
|
83
|
-
Runtime, model and permission bypass are not soul fields: they are chosen at
|
|
84
|
-
spawn (`--harness`, `--model`, `--yolo`) or by a host's named launch
|
|
85
|
-
configuration, so the same soul runs on any harness a host provides. Check a
|
|
86
|
-
soul with `oats spawn <soul> --preview` before committing it.
|
|
87
|
-
|
|
88
|
-
## Maintaining a soul
|
|
89
|
-
|
|
90
|
-
- **Change AGENTS.md rarely and deliberately** — it defines the agent. The
|
|
91
|
-
bar: a change in how the agent fundamentally operates, proven by instance
|
|
92
|
-
experience. Day-to-day lessons go to knowledge; procedures to skills.
|
|
93
|
-
- When an instance repeatedly misbehaves, diagnose in order: (1) is the rule
|
|
94
|
-
drowning in a bloated doc? → prune the doc; (2) is it ambiguous? → sharpen
|
|
95
|
-
with a command or example; (3) is it missing? → add it, minimally. Test by
|
|
96
|
-
observing the next instance's behavior, not by rereading.
|
|
97
|
-
- **Prune on every edit.** Adding a line? Look for two to cut.
|
|
98
|
-
- Log every soul change in `knowledge/log.md` (`**Update**: AGENTS.md — …`)
|
|
99
|
-
so the soul's evolution is reconstructible.
|
|
100
|
-
- Agents never rewrite their own role or safety boundaries; soul changes that
|
|
101
|
-
alter behavior go through the human (or a documented review workflow).
|
|
102
|
-
- Periodic review (worth doing when spawning feels off): does the role still
|
|
103
|
-
match reality? Do skills cover the recurring procedures? Is the knowledge
|
|
104
|
-
index current? Are the verification commands still correct?
|
|
105
|
-
|
|
106
|
-
## Bootstrapping a new soul
|
|
107
|
-
|
|
108
|
-
Fastest path to a *grounded* soul (never write one from imagination):
|
|
109
|
-
1. Do (or supervise) the role's work once in a plain session, noting
|
|
110
|
-
corrections, commands, and conventions as you go.
|
|
111
|
-
2. Distill: role/boundaries/loop/verification/escalation → AGENTS.md;
|
|
112
|
-
repeated procedures → first skills; facts and decisions → first knowledge
|
|
113
|
-
concepts.
|
|
114
|
-
3. Spawn an instance on a real task; watch where it stumbles; fold the
|
|
115
|
-
corrections back (doc, skill gotcha, or concept — per the three-layer rule).
|
|
116
|
-
Two rounds of this beat any amount of upfront authoring.
|