@awebai/oats 0.29.3 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -6
- package/bin/oats.mjs +203 -54
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
- package/capabilities/oats-aweb/injects/aweb.md +1 -1
- package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
- package/capabilities/oats-aweb/oats.json +5 -12
- package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
- package/capabilities/oats-code-review/injects/reviewer.md +26 -0
- package/capabilities/oats-code-review/oats.json +16 -0
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
- package/capabilities/oats-developer/injects/developer.md +38 -0
- package/capabilities/oats-developer/oats.json +17 -0
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
- package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
- package/capabilities/oats-engineering-expert/oats.json +17 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
- package/capabilities/oats-okf/bin/oats-okf.mjs +16 -9
- package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
- package/capabilities/oats-okf/lib/config.mjs +2 -1
- package/capabilities/oats-okf/lib/consult.mjs +26 -4
- package/capabilities/oats-okf/lib/harvest-switch.mjs +16 -3
- package/capabilities/oats-okf/lib/inspection.mjs +26 -7
- package/capabilities/oats-okf/lib/io.mjs +9 -1
- package/capabilities/oats-okf/lib/sources.mjs +34 -3
- package/capabilities/oats-okf/lib/stores.mjs +8 -6
- package/capabilities/oats-okf/lib/worker.mjs +7 -17
- package/capabilities/oats-okf/oats.json +6 -3
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
- package/capabilities/oats-okf-harvest/oats.json +3 -3
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +37 -16
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +6 -1
- package/capabilities/oats-okf-maintenance/oats.json +2 -2
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +17 -2
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
- package/capabilities/oats-workspace-experts/oats.json +9 -0
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +7 -10
- 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 +116 -0
- 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 +76 -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 +61 -0
- package/docs/release-lane.md +77 -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.29.4.md +90 -0
- package/docs/release-notes/v0.30.0.md +205 -0
- package/docs/schedules.md +280 -349
- 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 +132 -215
- package/lib/automations.mjs +28 -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 +2 -5
- package/lib/resolve.mjs +29 -87
- package/lib/schedule.mjs +32 -18
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +53 -17
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +9 -15
- package/package.json +1 -1
- package/skills/oats-getting-started/SKILL.md +25 -13
- 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,744 +0,0 @@
|
|
|
1
|
-
# Knowledge and memory in OATS: the central knowledge base and the expertise doctrine
|
|
2
|
-
|
|
3
|
-
**Status:** founder direction (Pepe), consolidated on 2026-09-13 as the
|
|
4
|
-
implementation brief for the `oats.okf` knowledge capability. Written by
|
|
5
|
-
oas-expert (the OAS steward soul) from the recorded decisions listed in
|
|
6
|
-
section 10. Where this document states a requirement, it names the decision
|
|
7
|
-
it comes from. Where it proposes a mechanism, it says so, and the mechanism
|
|
8
|
-
is the implementers' call as long as the requirement holds.
|
|
9
|
-
|
|
10
|
-
**Audience:** the OATS engineers who will implement this in `oats.okf`, and
|
|
11
|
-
their reviewers. Read section 3 before anything else. An implementation that
|
|
12
|
-
gets every mechanism in sections 4 to 6 right and section 3 wrong is worse
|
|
13
|
-
than the current package.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Scoping amendments — 2026-09-13
|
|
18
|
-
|
|
19
|
-
Subsequent direct human scoping settles eight points. These supersede any
|
|
20
|
-
conflicting mechanisms or completion tests below. The requirements describe
|
|
21
|
-
OATS's default knowledge model and its OKF implementation, not compulsory
|
|
22
|
-
theoretical policy for every third-party knowledge capability:
|
|
23
|
-
|
|
24
|
-
1. **All knowledge leaves the soul**, including general expertise.
|
|
25
|
-
2. **For now, cannot-write is explicit OKF injection guidance**, not a
|
|
26
|
-
mechanical filesystem-refusal guarantee (amends sections 4.6, 7.8 and 8.1).
|
|
27
|
-
3. **Harvesting is independent of the source instance's context**; its worktree,
|
|
28
|
-
branch and work mode do not determine execution or destination custody.
|
|
29
|
-
4. **Git-committed knowledge uses PR delivery**, for both public and private
|
|
30
|
-
repositories; there is no attached/private direct-commit exception
|
|
31
|
-
(amends sections 4.11 and 7.7).
|
|
32
|
-
5. **For now, repository permissions rest on users' GitHub accounts.** Assume
|
|
33
|
-
all agents in a workspace/team can access its configured knowledge repos.
|
|
34
|
-
Defer the public/private distinction, per-agent ACLs, and disclosure routing;
|
|
35
|
-
`reads` is context selection, not an access-control boundary (settles the
|
|
36
|
-
initial read-scoping choice in section 7.6).
|
|
37
|
-
6. **The first working version includes Git-backed OKF and a non-Git knowledge
|
|
38
|
-
store.** Non-Git support is not a later stub or roadmap item. Whether its
|
|
39
|
-
first implementation is directory-backed OKF or another tool is still open.
|
|
40
|
-
7. **The reference knowledge/memory theory is independent of storage tools.**
|
|
41
|
-
A CLI-backed integration such as the proposed Omnigraph case can adopt the
|
|
42
|
-
same concepts and doctrine while using native tools, but may also choose a
|
|
43
|
-
different theoretical model. OKF files, indexes, validation and Git PR
|
|
44
|
-
mechanics below are implementation choices, not universal requirements.
|
|
45
|
-
8. **OATS provides canonical theory and authoring help; capabilities own runtime.**
|
|
46
|
-
Maintain canonical docs for knowledge injections/skills and provide a
|
|
47
|
-
`knowledge-theory-expert` agent to help capability authors. Default OKF
|
|
48
|
-
follows the reference framework. Every capability supplies its own complete
|
|
49
|
-
skills, injections, memory behavior, harvester and related machinery; no
|
|
50
|
-
mandatory shared runtime doctrine is injected by OATS. The expert and full
|
|
51
|
-
authoring material are planned, not implemented yet.
|
|
52
|
-
|
|
53
|
-
The accepted rulings are recorded in
|
|
54
|
-
[external knowledge custody](../../agents/oats-expert/soul/knowledge/decisions/external-knowledge-custody.md)
|
|
55
|
-
and [provider-neutral knowledge and harvest](../../agents/oats-expert/soul/knowledge/decisions/provider-neutral-knowledge-and-harvest.md).
|
|
56
|
-
The [knowledge location contract](2026-09-13-knowledge-location-contract.md)
|
|
57
|
-
is a **proposal**, separating the common model from integrations and custody,
|
|
58
|
-
with explicit bindings, embedded/dedicated Git OKF, and non-Git storage.
|
|
59
|
-
Its schema and mechanisms are not accepted yet; the earlier public/private
|
|
60
|
-
policy proposal is deferred. The original brief is retained
|
|
61
|
-
below for rationale and further scoping; it is not an implementation-ready
|
|
62
|
-
contract where these questions remain open.
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## 1. What this changes, in one paragraph
|
|
67
|
-
|
|
68
|
-
Today every soul carries its own `soul/knowledge/` bundle, the working
|
|
69
|
-
instance is told to run `oats okf harvest` after committing, and the
|
|
70
|
-
harvester promotes that instance's notes (or captured session turns) into
|
|
71
|
-
that soul's bundle. After this change there is **one knowledge base per
|
|
72
|
-
project**, normally living in the project's repository; each soul's former
|
|
73
|
-
knowledge folder becomes a **node** of that base, with exactly one owning
|
|
74
|
-
soul; souls declare which nodes they **own** and which they **read**; the
|
|
75
|
-
running agent reads its nodes and the wider base, keeps its instance memory
|
|
76
|
-
current, and **never writes to the base and never learns that a harvester
|
|
77
|
-
exists**; a harvester runs **per instance**, on a schedule the capability
|
|
78
|
-
declares and once more at retirement, and is the **only writer**; and the
|
|
79
|
-
harvester's first rule, ahead of all mechanics, is that knowledge is what
|
|
80
|
-
makes an agent an expert in a subject, **never a description of what the
|
|
81
|
-
code already says**.
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## 2. Vocabulary
|
|
86
|
-
|
|
87
|
-
These terms are used precisely throughout. Most are already OATS vocabulary
|
|
88
|
-
(`docs/knowledge.md`, `docs/knowledge-theory.md`, the September 3
|
|
89
|
-
architecture proposal); the new ones are marked.
|
|
90
|
-
|
|
91
|
-
| Term | Meaning |
|
|
92
|
-
|---|---|
|
|
93
|
-
| **Soul** | Durable specialist identity: `soul.yaml`, `AGENTS.md`, `skills/`. Committed, reviewed, versioned. Identity across incarnations. |
|
|
94
|
-
| **Instance** | One disposable incarnation of a soul with its own home, task, and work view. |
|
|
95
|
-
| **Instance memory** | `STATE.md`, `log.md`, `notes/` in the instance home. Indexical (I, here, now). Dies with the instance. |
|
|
96
|
-
| **Knowledge base (KB)** *(new)* | One versioned OKF bundle per project holding every node. Repo-resident by default; a team-scope location is the option for cross-repository or private knowledge. |
|
|
97
|
-
| **Node** *(new)* | A sub-bundle of the KB (its own `index.md`, `log.md`, sections) with exactly one owning soul. What `soul/knowledge/` used to be, relocated. The unit of ownership, of reading interest, and of promotion destination. The 2026-09-08 deployment proposal calls this a *collection*. |
|
|
98
|
-
| **Owns / reads** *(new)* | A soul's declarations: the nodes its harvesters write to, and the nodes its instances load at session start. |
|
|
99
|
-
| **Harvester** | A soul of the type permitted to write knowledge (`memory-harvest`). Converts one instance's notes and captured record into KB writes. The only writer. |
|
|
100
|
-
| **Harvest** | The act of de-indexicalization: rephrasing what an instance learned so the claim survives its author, then judging it against the promotion bar. |
|
|
101
|
-
| **Promotion bar** | "Durable AND would change what a future instance of this soul does." An invariance test. Extended in section 3 by the second test: "and could it NOT have been found by reading the repository." |
|
|
102
|
-
| **Capture vs judgment** | The working instance captures without judging (cheap, in-flow). The harvester judges (deliberate, one consistent standard). |
|
|
103
|
-
| **Soul type** | The policy unit in OATS: which capabilities a soul receives, what knowledge it may read, whether it may write knowledge, and its communication reach. |
|
|
104
|
-
| **Record** | The turn record (`packages/record`): every Claude Code, Pi, and Codex session captured verbatim, content-addressed; `oats recall` reads windows of it. |
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## 3. The doctrine: what knowledge is, and what it is not
|
|
109
|
-
|
|
110
|
-
### 3.1 The single most important thing
|
|
111
|
-
|
|
112
|
-
> Knowledge is what makes an expert agent an expert in a topic or a project.
|
|
113
|
-
> It is **not** a description of what lives in the code.
|
|
114
|
-
|
|
115
|
-
Source: founder direction of 2026-09-09, restating the position first taken
|
|
116
|
-
on 2026-08-27 and recorded in the OATS architecture proposal on 2026-09-04
|
|
117
|
-
("The line is decision versus description").
|
|
118
|
-
|
|
119
|
-
An agent that knows how the code is laid out, what the modules are called,
|
|
120
|
-
and how they fit together has learned nothing an agent with a fresh clone and
|
|
121
|
-
ten minutes could not learn. Worse, a stored description competes with the
|
|
122
|
-
code and loses on freshness: once it drifts it lies, silently, to every
|
|
123
|
-
future instance. That is the content automatic memory systems accumulate,
|
|
124
|
-
and it is what public audits of those systems found to be worthless (section
|
|
125
|
-
9, source 4). Code is the truth about code.
|
|
126
|
-
|
|
127
|
-
What no amount of code reading recovers is **why** the code is the way it
|
|
128
|
-
is, **what was rejected** on the way, **what was decided** about where it is
|
|
129
|
-
going, **what was discovered** to be a limitation and how it was worked
|
|
130
|
-
around, **what the state of an area is** right now, and **what someone
|
|
131
|
-
concluded** after thinking a problem through. That is expertise. It is what a
|
|
132
|
-
senior engineer knows and a new hire does not, even when both can read the
|
|
133
|
-
same repository. It is what we are building souls to accumulate.
|
|
134
|
-
|
|
135
|
-
### 3.2 The accept list
|
|
136
|
-
|
|
137
|
-
The harvester promotes these kinds of knowledge. Each is illustrated so the
|
|
138
|
-
category is unmistakable.
|
|
139
|
-
|
|
140
|
-
1. **Decisions and their rationale.** What was chosen and why. *"Registration-time
|
|
141
|
-
authorization: every tool's gate is decided in `newServer()` and nowhere
|
|
142
|
-
else, because a second line of defence invites the first one to be
|
|
143
|
-
skipped."*
|
|
144
|
-
2. **Rejected alternatives and why.** Code shows the outcome, never the
|
|
145
|
-
alternatives. Without this record a capable agent will "helpfully" refactor
|
|
146
|
-
toward the rejected option. *"A standalone `semantic_models:` spec was
|
|
147
|
-
rejected: it silently disables the production semantic layer with a green
|
|
148
|
-
parse."*
|
|
149
|
-
3. **Architecture rationale.** Why the shape is what it is, and whether it is
|
|
150
|
-
deliberate or a stopgap. Not the shape itself. *"The client talks GraphQL for
|
|
151
|
-
both metadata and query execution because no Go SDK exists; this diverges
|
|
152
|
-
from both Python reference implementations on purpose."* The description of
|
|
153
|
-
which package implements the client is not knowledge; the repository says
|
|
154
|
-
it.
|
|
155
|
-
4. **Roadmap and direction.** Where the project is going and what it is
|
|
156
|
-
sponsored to become. *"The epic exists to stop generated SQL being how data
|
|
157
|
-
gets read; the end state retires the text-to-SQL tool entirely."*
|
|
158
|
-
5. **How the work is going: typed slow state with an owner.** A maintained,
|
|
159
|
-
dated, superseded-on-change picture of an area: what is on main, what is in
|
|
160
|
-
flight, what is blocked, what is open. This is the compounding-expertise
|
|
161
|
-
claim itself, and it is safe only when it has an owner and an
|
|
162
|
-
update-on-change rule. Without those it is indistinguishable from slop.
|
|
163
|
-
6. **Blockers**, named with what they block and what unblocks them.
|
|
164
|
-
7. **Discoveries.** Facts about the world that were not written anywhere and
|
|
165
|
-
cost effort to establish. *"MCP tool descriptions are truncated at 2,048
|
|
166
|
-
bytes and clients that defer schemas replace optional parameter descriptions
|
|
167
|
-
with generated summaries; only the description and required parameters
|
|
168
|
-
survive."*
|
|
169
|
-
8. **Limitations found and the solutions that worked.** *"GraphQL pages at
|
|
170
|
-
about 1,024 rows where Arrow Flight streams; follow `totalPages`, never send
|
|
171
|
-
'no limit'."*
|
|
172
|
-
9. **Conclusions of thinking things through or researching.** The output of
|
|
173
|
-
an investigation, not its transcript.
|
|
174
|
-
10. **Inspiration genealogy** (the strongest case for design souls). What was
|
|
175
|
-
borrowed from where, which patterns were rejected, and which observed
|
|
176
|
-
failures drove the rejection. Code shows pixel values, never intent.
|
|
177
|
-
11. **Process and environment lessons** that the repository cannot express:
|
|
178
|
-
CI and release traps, toolchain gotchas, review protocol, the way this team
|
|
179
|
-
ships. *"CI does not build or test this repository; the local verification
|
|
180
|
-
loop is the only gate."*
|
|
181
|
-
|
|
182
|
-
### 3.3 The reject list
|
|
183
|
-
|
|
184
|
-
The harvester drops these, however well written.
|
|
185
|
-
|
|
186
|
-
1. **Anything a fresh agent could derive by reading the repository:**
|
|
187
|
-
structure, style, naming, how modules fit, what a file does, which function
|
|
188
|
-
calls which. Including "helpful" maps of the codebase. If a navigational
|
|
189
|
-
hint is genuinely needed, it belongs in the repository's own docs where it
|
|
190
|
-
moves with the code.
|
|
191
|
-
2. **Task residue:** PR numbers, half-done plans, "was working on X", "liked
|
|
192
|
-
variant C", point-in-time environment facts, who was on shift. Indexical
|
|
193
|
-
content whose referents die with the instance.
|
|
194
|
-
3. **Session trivia and tool noise:** what commands were run, what the tool
|
|
195
|
-
output said, retries, dead ends that taught nothing.
|
|
196
|
-
4. **Secrets and credentials**, however they appear.
|
|
197
|
-
5. **Third-party message content verbatim.** A lesson may be *about* a
|
|
198
|
-
received message; unverified sender content is not knowledge by
|
|
199
|
-
transcription.
|
|
200
|
-
6. **Lessons that should have been code.** A gotcha that a lint rule, a test,
|
|
201
|
-
a type, or a CI check would eliminate is knowledge debt unless it says so
|
|
202
|
-
and points at the real fix. The harvester asks for the elimination route
|
|
203
|
-
first: architecture, then lint/CI/tests, then a skill or rule, and only
|
|
204
|
-
then a lesson.
|
|
205
|
-
|
|
206
|
-
### 3.4 The two-part test
|
|
207
|
-
|
|
208
|
-
For every candidate the harvester asks:
|
|
209
|
-
|
|
210
|
-
1. **Would a future instance of this soul act differently for knowing it?**
|
|
211
|
-
2. **Could it NOT have found this by reading the repository?**
|
|
212
|
-
|
|
213
|
-
Both must be yes. The first is the original promotion bar (an invariance
|
|
214
|
-
test). The second is the code-is-truth guard. "Architecture" passes only as
|
|
215
|
-
rationale or decision; an architecture *description* fails the second test
|
|
216
|
-
by definition. Keep that word precise in the skill.
|
|
217
|
-
|
|
218
|
-
### 3.5 Why decisions and descriptions age differently
|
|
219
|
-
|
|
220
|
-
A description goes stale and **silently lies**. A decision is **superseded**,
|
|
221
|
-
which is an explicit, loggable act: the new decision names the old one. This
|
|
222
|
-
is why decision records are safe to keep for years and descriptions are not
|
|
223
|
-
safe to keep for weeks. Slow state (accept item 5) sits between the two and
|
|
224
|
-
is only safe because it carries a timestamp, an owner, and the rule that
|
|
225
|
-
whoever changes the reality updates the record in the same session.
|
|
226
|
-
|
|
227
|
-
### 3.6 Non-coding souls are almost pure knowledge
|
|
228
|
-
|
|
229
|
-
The code-is-truth objection bites developer souls hardest and non-coding
|
|
230
|
-
souls not at all. An `oats-expert` soul's accepted project direction and
|
|
231
|
-
rejected alternatives, or a domain expert's model of the subject: none of
|
|
232
|
-
that rationale is re-derivable just by reading the code. For those
|
|
233
|
-
souls the knowledge node **is** the expertise, and the doctrine's reject
|
|
234
|
-
list mostly removes noise rather than substance. The harvester must not apply
|
|
235
|
-
a "developers rarely need knowledge" heuristic to them. Source: founder
|
|
236
|
-
correction of 2026-08-27 ("developer agents should know about important
|
|
237
|
-
architecture decisions... UX agents can also hold valuable knowledge of
|
|
238
|
-
inspiration... do push back if you don't think so"), and the OATS proposal's
|
|
239
|
-
write-side paragraph of 2026-09-04.
|
|
240
|
-
|
|
241
|
-
### 3.7 One home per decision: the homing rule
|
|
242
|
-
|
|
243
|
-
Split-brain comes from copies, not from the existence of a record. Route each
|
|
244
|
-
piece of knowledge to exactly one home, by audience:
|
|
245
|
-
|
|
246
|
-
| Kind | Home |
|
|
247
|
-
|---|---|
|
|
248
|
-
| Multi-role project facts every contributor needs (module boundaries, IPC contracts, platform constraints that bind several roles) | The repository's own docs (ADR-style), because a per-role node silos what everyone, including non-OATS contributors, needs. Nodes hold **pointers**, never copies. |
|
|
249
|
-
| Role-scoped craft decisions (why this panel renders this way, why the CLI parses arguments as it does) | That role's node. |
|
|
250
|
-
| Product direction and cross-cutting vision | The steward's node. Other souls consult it and never duplicate it. |
|
|
251
|
-
| Procedures future instances should run the same way every time | The soul's `skills/`, not knowledge. (Section 4.9.) |
|
|
252
|
-
|
|
253
|
-
A concrete pattern already in production on one deployment: an engineer
|
|
254
|
-
soul's operating doc says *"the repository documents itself unusually well;
|
|
255
|
-
your knowledge carries only what those files do not say, plus a record of
|
|
256
|
-
where they are stale."* That sentence is the doctrine applied. Its node then
|
|
257
|
-
holds the decisions behind the tool surface and a stale-docs ledger, and
|
|
258
|
-
nothing that the repository's own `ARCHITECTURE.md` already says.
|
|
259
|
-
|
|
260
|
-
### 3.8 The audit question
|
|
261
|
-
|
|
262
|
-
The doctrine came out of a public audit of an automatic memory system
|
|
263
|
-
(source 4): dozens of stored memories per clone, most never read, a roughly
|
|
264
|
-
three-to-one write-to-read ratio, content dominated by point-in-time state,
|
|
265
|
-
outdated facts, duplication of the instructions file, and per-machine
|
|
266
|
-
divergence in a hidden store. Every one of those failures is a guard this
|
|
267
|
-
design holds: indexical content is rejected at harvest; reading is explicit
|
|
268
|
-
and index-first; the base is versioned and reviewed; capture and judgment are
|
|
269
|
-
separate roles. The standing test for any concept in the base is therefore:
|
|
270
|
-
|
|
271
|
-
> **Would this survive that audit?** It is either likely to be consulted,
|
|
272
|
-
> explicitly freshness-marked where it must be, or absent because the
|
|
273
|
-
> repository can already answer it.
|
|
274
|
-
|
|
275
|
-
---
|
|
276
|
-
|
|
277
|
-
## 4. The target architecture
|
|
278
|
-
|
|
279
|
-
### 4.1 One knowledge base per project, repo-resident by default
|
|
280
|
-
|
|
281
|
-
**Requirement (founder, 2026-09-09, amended the same day):** all knowledge
|
|
282
|
-
of a project lives in one versioned OKF bundle, auditable as a whole: one
|
|
283
|
-
index of nodes, one history, one validator run. The base **may live in the
|
|
284
|
-
repository itself**, and that is the default for a single-repository project
|
|
285
|
-
and for every open-source project: a `knowledge/` bundle at the repository
|
|
286
|
-
root, one sub-bundle per node. Portability is then git. Clone the project and
|
|
287
|
-
its knowledge comes along, for contributors from any organization, with no
|
|
288
|
-
export step.
|
|
289
|
-
|
|
290
|
-
A **team-scope base** (a directory or repository at the deployment's team
|
|
291
|
-
scope) remains the option for a multi-repository deployment's cross-repo or
|
|
292
|
-
private knowledge. **Base location is a binding, not a design constant**:
|
|
293
|
-
souls reference nodes by name; deployment configuration says where a named
|
|
294
|
-
node lives.
|
|
295
|
-
|
|
296
|
-
Why central rather than per soul: with knowledge scattered across soul
|
|
297
|
-
directories, nothing can audit the whole, no single validator run covers it,
|
|
298
|
-
nodes of different souls cannot cross-link cleanly, a steward cannot see what
|
|
299
|
-
the team knows, and "the expert's memory" becomes an unauditable second
|
|
300
|
-
source of truth (the failure the 2026-09-08 deployment proposal names for
|
|
301
|
-
deployment experts: *the expert must not become the deployment's database*).
|
|
302
|
-
|
|
303
|
-
Why repo-resident rather than a separate store: it keeps the property the
|
|
304
|
-
current design already has (soul knowledge is versioned in the repo today),
|
|
305
|
-
it makes knowledge governance equal to repository governance (a harvester's
|
|
306
|
-
promotion to an open-source project is a pull request reviewed like code),
|
|
307
|
-
and it removes the export/import mechanism the first draft required. The
|
|
308
|
-
founder withdrew that requirement explicitly: *"Portability matters for
|
|
309
|
-
things like open source projects with contributors from many orgs. Nothing
|
|
310
|
-
stops the knowledge from being in the repo itself."*
|
|
311
|
-
|
|
312
|
-
### 4.2 Nodes
|
|
313
|
-
|
|
314
|
-
A node is what `soul/knowledge/` is today, relocated: an OKF sub-bundle with
|
|
315
|
-
its own `index.md`, `log.md`, core sections (`lessons/`, `decisions/`,
|
|
316
|
-
`playbooks/`, `references/`) and whatever role-grown sections its owner
|
|
317
|
-
needs (`architecture/`, `roadmap/`, `stewardship/`, `codebase-gotchas/`).
|
|
318
|
-
The knowledge ontology is itself part of the specialization: a steward grows
|
|
319
|
-
`roadmap/`; a developer soul does not, and a `Roadmap` concept in a developer
|
|
320
|
-
node is a smell (project direction belongs to whoever stewards the project).
|
|
321
|
-
|
|
322
|
-
Every node has **exactly one owning soul**. This is the homing rule lifted
|
|
323
|
-
one level. A node may be owned by a soul whose role is stewardship of a
|
|
324
|
-
project or an area: that is where multi-role project decisions go when the
|
|
325
|
-
repository's own docs are not the right home. Role craft goes to the role's
|
|
326
|
-
own node.
|
|
327
|
-
|
|
328
|
-
Illustrative layout (the implementers choose the exact shape):
|
|
329
|
-
|
|
330
|
-
```text
|
|
331
|
-
<base>/ # repo root knowledge/, or a team-scope directory
|
|
332
|
-
index.md # the base: lists every node, its owner, one line each
|
|
333
|
-
log.md # base-level history: one entry per harvest delivery
|
|
334
|
-
<node>/ # one sub-bundle per node
|
|
335
|
-
index.md
|
|
336
|
-
log.md
|
|
337
|
-
lessons/ decisions/ playbooks/ references/ <role-grown>/
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
### 4.3 Soul declarations: owns and reads
|
|
341
|
-
|
|
342
|
-
A soul declares, in `soul.yaml` (exact keys are the implementers' call):
|
|
343
|
-
|
|
344
|
-
- the nodes it **owns**: the harvesters that run for its instances write
|
|
345
|
-
there by default;
|
|
346
|
-
- the nodes it **reads**: loaded index-first at session start and consulted
|
|
347
|
-
throughout the session.
|
|
348
|
-
|
|
349
|
-
A soul with no declarations owns a node named after itself and reads only
|
|
350
|
-
that: the current behavior, relocated. Portable souls reference nodes by
|
|
351
|
-
name; the deployment's configuration binds names to a base location, so a
|
|
352
|
-
soul copied between deployments keeps working as long as a node of that name
|
|
353
|
-
exists or is created at scaffold time.
|
|
354
|
-
|
|
355
|
-
Illustrative:
|
|
356
|
-
|
|
357
|
-
```yaml
|
|
358
|
-
# soul.yaml
|
|
359
|
-
name: semantic-layer-engineer
|
|
360
|
-
knowledge:
|
|
361
|
-
owns: [semantic-layer-engineer]
|
|
362
|
-
reads: [lens-semantic-layer, platform-architecture]
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
```yaml
|
|
366
|
-
# oats-config.yaml, knowledge layer settings (illustrative)
|
|
367
|
-
capabilities:
|
|
368
|
-
layers:
|
|
369
|
-
knowledge:
|
|
370
|
-
capability: oats.okf
|
|
371
|
-
settings:
|
|
372
|
-
base: knowledge # repo-resident, relative to the scope root
|
|
373
|
-
# base: /srv/team-kb # or a team-scope base for cross-repo knowledge
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
### 4.4 The read side
|
|
377
|
-
|
|
378
|
-
Requirement, in this order, carried by the okf skill and the injection:
|
|
379
|
-
|
|
380
|
-
1. **At session start**, read the owned nodes index-first: `index.md`, then
|
|
381
|
-
only the links the task needs. Never bulk-read.
|
|
382
|
-
2. **Throughout the session**, consult the owned and read nodes, and the
|
|
383
|
-
wider base on demand, whenever a decision could already have been made.
|
|
384
|
-
Prior decisions, lessons, and playbooks are binding context. Re-deriving
|
|
385
|
-
what the base already knows is a bug.
|
|
386
|
-
3. **After every compaction**, re-read the owned nodes' indexes and the
|
|
387
|
-
instance's own `STATE.md`. On Pi this is the existing `session_compact`
|
|
388
|
-
hook; on Claude Code it is the session-start hook with the compaction
|
|
389
|
-
matcher, contributed at launch by the capability.
|
|
390
|
-
4. Keep `STATE.md`, `log.md`, and `notes/` current as you work.
|
|
391
|
-
|
|
392
|
-
Nothing about harvesting. The whole base is readable on demand; scoping by
|
|
393
|
-
soul type or team stays a policy knob (the architecture proposal's read side:
|
|
394
|
-
*"an instance can find and consult organizational knowledge within its
|
|
395
|
-
type's scope"*). The default for a single-team deployment is: everything
|
|
396
|
-
readable, owned and read nodes loaded.
|
|
397
|
-
|
|
398
|
-
Why the read side leads: the July 2026 audit of the OKF injection found it
|
|
399
|
-
heavily write-biased (capture and harvest explicit, consultation one passing
|
|
400
|
-
sentence). Memory contracts must be symmetric, or knowledge accumulates and
|
|
401
|
-
is never used, which is exactly the three-to-one write-to-read failure of
|
|
402
|
-
the audited auto-memory systems.
|
|
403
|
-
|
|
404
|
-
### 4.5 Instance memory is unchanged
|
|
405
|
-
|
|
406
|
-
`STATE.md` (rewritten, `# Next` names the single next action), `log.md`
|
|
407
|
-
(append-only, dated, newest first), `notes/` (one OKF concept per insight,
|
|
408
|
-
written in soul genre from birth). The capture discipline stays exactly as
|
|
409
|
-
it is: write every non-obvious insight down, do not judge whether it is
|
|
410
|
-
"important enough", keep state current before every commit. This is the
|
|
411
|
-
harvester's primary input together with the captured record.
|
|
412
|
-
|
|
413
|
-
### 4.6 The harvester: one per instance, the only writer
|
|
414
|
-
|
|
415
|
-
- **One harvester per instance per run.** Never one harvester sweeping all
|
|
416
|
-
instances. Its briefing names the source instance, the nodes its soul
|
|
417
|
-
owns, the notes directory, and the record windows.
|
|
418
|
-
- **Inputs:** the instance's pending notes plus its captured session turns
|
|
419
|
-
since the last harvest, record-fed and id-bounded with a watermark
|
|
420
|
-
advanced on delivery. `oats.okf` 1.5.x already does this (`oats recall
|
|
421
|
-
--thread ... --after ... --until`, `.okf-harvest-record.json` and its
|
|
422
|
-
prepared `.next.json`, the replan detector, `--from-record`, `--force`).
|
|
423
|
-
- **Judgment:** the doctrine of section 3, as the **first section** of the
|
|
424
|
-
harvester's skill, with the accept list, the reject list, and the two-part
|
|
425
|
-
test verbatim. Then the existing mechanics: promote/merge/drop,
|
|
426
|
-
knowledge-versus-skill routing, `Finding` to `Lesson`, index and log
|
|
427
|
-
discipline, strict validation.
|
|
428
|
-
- **Destination:** the nodes the source soul owns. Procedure-shaped
|
|
429
|
-
candidates still route to the soul's `skills/` (section 4.9).
|
|
430
|
-
- **Harvesters are the only writers to the base.** A running instance's
|
|
431
|
-
attempt to write into the base is refused, not ignored. Enforcement is by
|
|
432
|
-
the composed instructions plus whatever the implementers can make
|
|
433
|
-
mechanical (a read-only view, a check in the harvester's delivery path, a
|
|
434
|
-
validator rule on authorship).
|
|
435
|
-
- **Exclusions stand:** never promote a secret; never promote third-party
|
|
436
|
-
message content verbatim.
|
|
437
|
-
- **The harvester is a soul** of the type permitted to write knowledge,
|
|
438
|
-
spawned by the knowledge capability. OATS runs no special harvester
|
|
439
|
-
(architecture proposal, "three simplifications"). Its runtime and model
|
|
440
|
-
are the capability's `harvest-runtime` and optional `harvest-model`
|
|
441
|
-
settings, independent of the source instance's runtime.
|
|
442
|
-
|
|
443
|
-
### 4.7 The running agent does not know the harvester exists
|
|
444
|
-
|
|
445
|
-
Requirement (founder, 2026-09-09). The agent knows: which nodes are its own
|
|
446
|
-
to read, that the whole base is readable, that it must keep notes, state,
|
|
447
|
-
and log current because they are harvested for it, and that it never writes
|
|
448
|
-
to the base. The injection **stops** telling instances to run `oats okf
|
|
449
|
-
harvest`, stops explaining custody paths, and stops describing the
|
|
450
|
-
harvester. Note-writing discipline stays; the trigger moves out of the
|
|
451
|
-
agent's hands.
|
|
452
|
-
|
|
453
|
-
Why: the harvest trigger was a discipline point in the agent's operating
|
|
454
|
-
loop that competed with the task, that agents skipped, and that failed for
|
|
455
|
-
reasons the agent could not fix (on one deployment `oats okf harvest`
|
|
456
|
-
failed on the harvester's messaging identity, and the working agent had to
|
|
457
|
-
escalate an infrastructure fault it should never have seen). Today's
|
|
458
|
-
injection spends roughly thirty lines on harvest mechanics: that is the
|
|
459
|
-
write bias of section 4.4 in another form. The agent's job is the task.
|
|
460
|
-
|
|
461
|
-
### 4.8 Triggers: a per-instance local schedule, and a final harvest at retirement
|
|
462
|
-
|
|
463
|
-
1. **Capability-declared schedule template.** The knowledge capability
|
|
464
|
-
declares "harvest this instance every N". Spawn materializes one
|
|
465
|
-
per-instance job of kind `operation` through the existing local host
|
|
466
|
-
scheduler (`docs/schedules.md`: one launchd or systemd host timer, no
|
|
467
|
-
daemon, `oats operation run knowledge:harvest --home <home>`). Retire
|
|
468
|
-
removes the job. The job skips when nothing is new (watermark and replan
|
|
469
|
-
detection already exist). Instances are never harvested by a fleet-wide
|
|
470
|
-
job. No server is involved.
|
|
471
|
-
2. **Final harvest at retirement.** The `harvest` lifecycle event (migration
|
|
472
|
-
step 6 of the architecture proposal, now delegated to the OATS team to
|
|
473
|
-
rule on) runs on retire **before the home is removed**. Either the harvest
|
|
474
|
-
completes synchronously, or the notes and the record window are
|
|
475
|
-
snapshotted to a location that survives the home and the job runs against
|
|
476
|
-
the snapshot. The watermark makes the double run (scheduled plus final)
|
|
477
|
-
idempotent.
|
|
478
|
-
|
|
479
|
-
This reverses a deliberate earlier decision (2026-07-09: "retirement is a
|
|
480
|
-
knowledge no-op", to make long-lived sessions feed the soul while alive
|
|
481
|
-
instead of hoarding until death). The reason it can be reversed now is that
|
|
482
|
-
the continuous harvest no longer depends on the agent: the schedule feeds
|
|
483
|
-
the base while the instance lives, and the final harvest only closes the
|
|
484
|
-
gap between the last scheduled run and retirement. Nothing is lost either
|
|
485
|
-
way, and nothing is hoarded.
|
|
486
|
-
|
|
487
|
-
### 4.9 Skills stay with the soul; knowledge moves to the base
|
|
488
|
-
|
|
489
|
-
This is the steward's reading of the direction, not a founder sentence, and
|
|
490
|
-
it is flagged in section 8 for confirmation. Skills are procedural, are part
|
|
491
|
-
of the curated curriculum materialized at spawn, and are soul artifacts by
|
|
492
|
-
the OATS soul anatomy. The harvester's routing table is unchanged: facts
|
|
493
|
-
future instances should **know** go to the owned node; steps they should
|
|
494
|
-
**run the same way** go to `soul/skills/`; a correction to an existing
|
|
495
|
-
procedure maintains that skill. Skill deliveries keep the soul's custody
|
|
496
|
-
(commit on the instance's branch, PR for workspace-mode souls, direct edit
|
|
497
|
-
for local souls); knowledge deliveries follow the base's custody (section
|
|
498
|
-
4.11).
|
|
499
|
-
|
|
500
|
-
### 4.10 Parallel instances of one soul
|
|
501
|
-
|
|
502
|
-
N instances of one soul each own a different part of a problem. Each becomes
|
|
503
|
-
expert in its part while alive (instance memory). What it learns that is
|
|
504
|
-
durable for the **part**, not the instance (limitations, decisions,
|
|
505
|
-
solutions), consolidates into the soul's node, typically as a section per
|
|
506
|
-
part. The next incarnation of the soul starts with all of it. Instance
|
|
507
|
-
expertise dies; part expertise survives. Realization artifacts ("clothes",
|
|
508
|
-
derived from the record) are what make replicating such instances cheap;
|
|
509
|
-
they do not carry knowledge and are never a knowledge store.
|
|
510
|
-
|
|
511
|
-
### 4.11 The write side: git custody into the base
|
|
512
|
-
|
|
513
|
-
Harvesters write with git custody: a branch per harvest, rebase onto the
|
|
514
|
-
base's head, one commit prefixed `memory-harvest:`, publish, watermark on
|
|
515
|
-
delivery. Index and log entries are append-shaped so concurrent harvests
|
|
516
|
-
conflict rarely. For a repo-resident base the delivery follows **that
|
|
517
|
-
repository's** branch and review flow: for an open-source project a
|
|
518
|
-
harvester's promotion is a pull request reviewed like code (the promotion
|
|
519
|
-
bar plus human review). For a private single-team repository the deployment
|
|
520
|
-
may allow direct commits to the working branch, exactly as the current
|
|
521
|
-
attached-harvest path does. For a team-scope base the same rules apply to
|
|
522
|
-
that base's repository. Local souls (`local-agents/`, uncommitted by
|
|
523
|
-
contract) need an uncommitted node location; see section 6.
|
|
524
|
-
|
|
525
|
-
### 4.12 Human-accepted decisions pass by construction
|
|
526
|
-
|
|
527
|
-
A steward soul records a decision the human already made. It goes through
|
|
528
|
-
`notes/` like everything else, but a note typed `Decision` carrying an
|
|
529
|
-
explicit acceptance marker (who accepted it, when) passes the bar by
|
|
530
|
-
construction: the harvester does the mechanics (index, log, links,
|
|
531
|
-
supersession of an older decision) and does not re-judge. Otherwise
|
|
532
|
-
stewardship latency grows and the harvester becomes a second judge with less
|
|
533
|
-
context than the human.
|
|
534
|
-
|
|
535
|
-
---
|
|
536
|
-
|
|
537
|
-
## 5. Worked examples of the doctrine
|
|
538
|
-
|
|
539
|
-
### 5.1 A developer soul, before and after
|
|
540
|
-
|
|
541
|
-
Candidate from a session transcript of a feature engineer:
|
|
542
|
-
|
|
543
|
-
> *"The tool registration lives in `internal/tools/`, one file per tool; each
|
|
544
|
-
> registers via a `Register*` function, appears in `defaultTools`, and gets a
|
|
545
|
-
> gated branch in `newServer()`."*
|
|
546
|
-
|
|
547
|
-
Verdict: **drop** the first two clauses (repository says it) and **promote**
|
|
548
|
-
the third as a lesson only if it is phrased as the failure it prevents:
|
|
549
|
-
|
|
550
|
-
> *"Three edits, not two: a `Register*` function, a `defaultTools` entry, and
|
|
551
|
-
> a gated branch in `newServer()`. Two out of three compiles cleanly and ships
|
|
552
|
-
> nothing. Elimination route: a registration test that fails on a missing
|
|
553
|
-
> gate would make this lesson unnecessary; until it exists this is a
|
|
554
|
-
> stopgap."*
|
|
555
|
-
|
|
556
|
-
The promoted form passes both tests (a future instance acts differently; the
|
|
557
|
-
repository does not say that two-of-three ships nothing) and names its own
|
|
558
|
-
elimination route.
|
|
559
|
-
|
|
560
|
-
### 5.2 A steward soul
|
|
561
|
-
|
|
562
|
-
Candidate: *"Pepe decided on 2026-09-09 that the knowledge base is central
|
|
563
|
-
and may be repo-resident, and withdrew the export/import requirement."*
|
|
564
|
-
Verdict: **promote by construction** as a `Decision` with the acceptance
|
|
565
|
-
marker; supersede the paragraph in the earlier direction that required
|
|
566
|
-
export/import; link both. This is exactly the fast path of section 4.12.
|
|
567
|
-
|
|
568
|
-
### 5.3 A domain expert with no code
|
|
569
|
-
|
|
570
|
-
Candidate from a semantic-layer expert: *"The `lf_region` rollup is
|
|
571
|
-
provisional pending stakeholder sign-off; judgment calls in it must be
|
|
572
|
-
flagged when they matter to an answer, never quietly redefined."* Verdict:
|
|
573
|
-
**promote** as typed slow state (owner: this soul; superseded when sign-off
|
|
574
|
-
lands). Nothing in any repository carries this; the soul is almost pure
|
|
575
|
-
knowledge.
|
|
576
|
-
|
|
577
|
-
### 5.4 Residue
|
|
578
|
-
|
|
579
|
-
Candidate: *"Opened PR #123 and #124; #124 is waiting on Eric; next I should
|
|
580
|
-
rebase #123."* Verdict: **drop**. Task residue, all of it. If there is a
|
|
581
|
-
durable claim underneath ("PRs in this repository sit unmerged for weeks;
|
|
582
|
-
verify state against `origin/main` and open PRs before relying on it"), the
|
|
583
|
-
harvester promotes that sentence and nothing else.
|
|
584
|
-
|
|
585
|
-
---
|
|
586
|
-
|
|
587
|
-
## 6. What changes in `oats.okf`, concretely
|
|
588
|
-
|
|
589
|
-
Baseline: `oats.okf` 1.6.1 as shipped in `capabilities/oats-okf/` of this
|
|
590
|
-
repository (manifest with `harvest-runtime` and `harvest-model` settings,
|
|
591
|
-
`soul-scaffold` and `spawn` hooks, `harvest` and `inspect` commands and
|
|
592
|
-
operations, `injects/okf.md`, `skills/okf`, `skills/memory-harvest`,
|
|
593
|
-
`agents/memory-harvest`, `lib/harvest-branch.mjs`). The record-fed harvest,
|
|
594
|
-
watermarks, replan detection, exclusions, non-zero exit on failure, and the
|
|
595
|
-
operations contract all exist and stay.
|
|
596
|
-
|
|
597
|
-
| Area | Change |
|
|
598
|
-
|---|---|
|
|
599
|
-
| **Manifest** | Add the base binding setting (repo-resident default, team-scope option). Add the per-instance schedule template the spawn hook materializes. Declare participation in the `harvest` lifecycle event once the kernel ships it. |
|
|
600
|
-
| **`soul-scaffold` hook** | Create the soul's default node in the base (not `soul/knowledge/`), register it in the base index with its owner, and write the default `owns`/`reads` if the soul declares none. |
|
|
601
|
-
| **`spawn` hook** | Resolve the soul's owned and read nodes to paths through the binding; record them in `instance.json`; make them reachable from the instance home without the agent knowing the base layout (a `./knowledge/` view with one entry per node is one option); materialize the per-instance harvest job; on Claude Code contribute the compaction re-read hook. |
|
|
602
|
-
| **`retire` / `harvest` hook** | Remove the schedule job; run the final harvest before home removal, or snapshot notes and the record window and run against the snapshot. |
|
|
603
|
-
| **Injection (`injects/okf.md`)** | Rewrite around the read side (section 4.4). Remove every instruction to run `oats okf harvest`, the custody explanations, and the harvester description. Keep the capture discipline. State plainly: you read your nodes and the base; you never write to the base. |
|
|
604
|
-
| **Harvester skill (`skills/memory-harvest`)** | Section 3 verbatim as the first section. Destination becomes the owned nodes. Add per-node write serialization, the base-custody delivery paths, the Decision fast path, and the pending-for-owner rules. Keep the record-window protocol and exclusions. |
|
|
605
|
-
| **Harvester agent and briefing** | The briefing names the source instance, its soul's owned nodes and their paths, the notes directory, the record windows, the base custody, and the serialization handle. |
|
|
606
|
-
| **`harvest` command and operation** | Per instance (`--home`), invoked by the schedule and by the retire path; still runnable by a human or the Desktop through the operations contract. Never fleet-wide. |
|
|
607
|
-
| **`inspect` operation** | Extend the view to show the instance's owned and read nodes and the base's freshness (last harvest, pending notes, watermark position). |
|
|
608
|
-
| **Validator** | Validate the whole base strictly after every harvest, not only the touched node. |
|
|
609
|
-
| **`okf` skill** | Teach the base and node model on the read side; the authoring craft is unchanged. |
|
|
610
|
-
| **Migration** | An explicit command (or a step of `oats migrate --from-oas`) that moves each existing `soul/knowledge/` into a node of the base, rewrites intra-bundle links, registers the node, and leaves `soul/knowledge` resolvable to the node during the transition so existing `AGENTS.md` links keep working. Souls' `AGENTS.md` files that reference `./soul/knowledge/...` are then updated by their owners. |
|
|
611
|
-
| **Kernel asks** | The `harvest` lifecycle event (proposal step 6); `soul.yaml` keys for owns/reads read by the kernel or passed through to the capability; the configuration key for the base binding; a way for a capability to declare a per-instance schedule template that spawn materializes. |
|
|
612
|
-
|
|
613
|
-
---
|
|
614
|
-
|
|
615
|
-
## 7. Design requirements the implementers must settle (not optional)
|
|
616
|
-
|
|
617
|
-
1. **Concurrent harvesters on one node.** Four instances of one soul mean
|
|
618
|
-
four harvesters writing the same node, and with a repo-resident base four
|
|
619
|
-
harvesters on one repository branch is the same race. Serialize per node
|
|
620
|
-
(a base-level lock or a queue) and require rebase-before-commit; never let
|
|
621
|
-
two harvesters race on an `index.md`. This is the one new failure mode
|
|
622
|
-
the design introduces. It must have a test.
|
|
623
|
-
2. **Doctrine first, verbatim.** Section 3's accept list, reject list, and
|
|
624
|
-
two-part test are the first section of the harvester skill. Mechanics
|
|
625
|
-
come after.
|
|
626
|
-
3. **Human-accepted decisions pass by construction** (section 4.12), with a
|
|
627
|
-
defined acceptance marker.
|
|
628
|
-
4. **Local souls need an uncommitted node location.** `local-agents/` souls
|
|
629
|
-
are uncommitted by contract; their nodes cannot be committed into a
|
|
630
|
-
repo-resident base. Options: a gitignored area of the base, or a local
|
|
631
|
-
base bound at the machine scope. Decide, document, and keep the doctrine
|
|
632
|
-
identical.
|
|
633
|
-
5. **Pending-for-owner queue** (from the 2026-09-08 proposal): if kept, a
|
|
634
|
-
named owner and an expiry, or it becomes the slop pile in a new location.
|
|
635
|
-
6. **Read scoping by soul type**: decide whether it ships in the first
|
|
636
|
-
version or stays "everything readable" with the knob reserved. Either is
|
|
637
|
-
acceptable; say which.
|
|
638
|
-
7. **Delivery for repo-resident bases**: default to the current attached
|
|
639
|
-
commit for private repositories and to a pull request where the
|
|
640
|
-
repository's governance requires review; make the choice a binding, not a
|
|
641
|
-
guess in the harvester.
|
|
642
|
-
8. **Refusal, not silence, on a forbidden write.** An instance that tries to
|
|
643
|
-
write into the base must get an error it can report, not a no-op.
|
|
644
|
-
9. **Acceptance is knowledge output, not harvester activity.** The bar for
|
|
645
|
-
"done" is a fresh instance answering from the base, verified through the
|
|
646
|
-
selected runtime (section 8 tests), not evidence that a harvester ran.
|
|
647
|
-
|
|
648
|
-
---
|
|
649
|
-
|
|
650
|
-
## 8. Completion tests
|
|
651
|
-
|
|
652
|
-
1. **Two souls, two nodes.** Each owns one node and reads the other's. An
|
|
653
|
-
instance of each sees both at session start; neither can write to the
|
|
654
|
-
base directly (an attempted write is refused, not ignored).
|
|
655
|
-
2. **Four parts, one soul.** Four instances of one soul, each briefed with a
|
|
656
|
-
different part of a problem, harvested on schedule and at retirement. The
|
|
657
|
-
soul's node contains a section per part with the decisions and
|
|
658
|
-
limitations each found; no code descriptions; no task residue. The base
|
|
659
|
-
log shows one commit per harvest and no conflicts or lost writes.
|
|
660
|
-
3. **Expertise survives the instance.** A fresh instance of that soul,
|
|
661
|
-
spawned afterwards, answers a question about a limitation found by
|
|
662
|
-
instance three with no access to instance three's home or transcript.
|
|
663
|
-
4. **Retire mid-task with pending notes.** The final harvest lands before the
|
|
664
|
-
home is gone; the notes' durable content is in the node; the point-in-time
|
|
665
|
-
content is not.
|
|
666
|
-
5. **Exclusions hold.** A harvester fed a transcript containing a secret and
|
|
667
|
-
a third-party message promotes neither and promotes the positive-control
|
|
668
|
-
lesson.
|
|
669
|
-
6. **Doctrine holds.** A harvester fed a transcript containing a correct
|
|
670
|
-
architecture description, a decision with rationale, a rejected
|
|
671
|
-
alternative, and a PR-number plan promotes the decision and the rejected
|
|
672
|
-
alternative, and drops the description and the plan. The promoted
|
|
673
|
-
concepts carry turn-id provenance.
|
|
674
|
-
7. **The read side is real.** A fresh instance's captured session shows it
|
|
675
|
-
opened its owned node's `index.md` before its first non-trivial action,
|
|
676
|
-
and re-read it after a forced compaction.
|
|
677
|
-
8. **Whole-base validation.** Strict OKF validation of the entire base passes
|
|
678
|
-
after every harvest.
|
|
679
|
-
9. **Migration.** An existing deployment with per-soul `soul/knowledge/`
|
|
680
|
-
bundles migrates to one base with one node per soul, links intact,
|
|
681
|
-
validator clean, and every soul's next instance reads its node.
|
|
682
|
-
10. **The agent is unaware.** The composed `AGENTS.md` of a migrated
|
|
683
|
-
instance contains no instruction to run a harvest and no description of
|
|
684
|
-
the harvester.
|
|
685
|
-
|
|
686
|
-
---
|
|
687
|
-
|
|
688
|
-
## 9. What is out of scope, deliberately
|
|
689
|
-
|
|
690
|
-
- **Picking up ordinary top-level `CLAUDE.md`/`AGENTS.md` setups as
|
|
691
|
-
spawnable agents** that join the team. Real, wanted, parked by the founder
|
|
692
|
-
on 2026-09-09. Do not design it inside this change.
|
|
693
|
-
- **An export/import mechanism for nodes.** Withdrawn by the founder on
|
|
694
|
-
2026-09-09; moving a node between bases is git (subtree, or a copy plus a
|
|
695
|
-
log entry).
|
|
696
|
-
- **A central knowledge service or database.** The base is files under git.
|
|
697
|
-
A different provider may implement a different store; the default OKF
|
|
698
|
-
package does not.
|
|
699
|
-
- **Changing the OKF format** or its type vocabulary. The typology
|
|
700
|
-
(`Instance State`, `Finding`, `Lesson`, `Decision`, `Playbook`,
|
|
701
|
-
`Reference`, role-grown types) is unchanged.
|
|
702
|
-
- **A fleet-wide harvester.** Explicitly rejected: one harvester per
|
|
703
|
-
instance per run.
|
|
704
|
-
- **Moving skills out of the soul.** Pending confirmation (section 4.9), the
|
|
705
|
-
soul keeps `skills/`.
|
|
706
|
-
|
|
707
|
-
---
|
|
708
|
-
|
|
709
|
-
## 10. Where each decision comes from
|
|
710
|
-
|
|
711
|
-
The chronology, so that an implementer or reviewer can trace any requirement
|
|
712
|
-
to its source. Paths are in the OAS steward's knowledge bundle
|
|
713
|
-
(`agents/oas-expert/soul/knowledge/` of the OAS repository) unless another
|
|
714
|
-
repository is named.
|
|
715
|
-
|
|
716
|
-
| Date | Decision or evidence | Source |
|
|
717
|
-
|---|---|---|
|
|
718
|
-
| 2026-07-08 | Knowledge typology: soul knowledge is incarnation-invariant, instance memory is indexical, harvest is de-indexicalization, types are consolidation stages, sections are role-grown, souls hold project-slow state. | `architecture/knowledge-typology.md`; restated in OATS `docs/knowledge-theory.md`. |
|
|
719
|
-
| 2026-07-09 | Capture and judgment are separate roles; the promotion bar is held only by the harvester; continuous post-commit harvest; retirement is a knowledge no-op (now reversed, section 4.8). | `architecture/memory-design.md`. |
|
|
720
|
-
| 2026-07-10 | The OKF injection was write-biased; read-side consultation must be explicit and index-first. | `lessons/okf-injection-read-side-gap.md`. |
|
|
721
|
-
| 2026-07-26 | Provider-agnostic specialization: compounding expertise across sessions, models, and runtimes; memory outside any one harness. | `decisions/provider-agnostic-specialization-and-curated-context.md`. |
|
|
722
|
-
| 2026-08-27 | Investigation of the public auto-memory audit: governed memory must survive that audit; developer souls must not mirror code; harness-agnostic knowledge enables mixed-runtime teams. | `lessons/governed-memory-survives-auto-memory-audit.md`, `lessons/developer-souls-should-not-mirror-code.md`, `lessons/harness-agnostic-knowledge-enables-mixed-runtime-teams.md`; the video "Turn off Claude Code's Memory" (Theo, t3.gg, YouTube id Jf54k7tFeEc). |
|
|
723
|
-
| 2026-08-27 | Founder correction: developer and UX souls hold decisions, rejected alternatives, inspiration genealogy, and typed slow state; the bias is against descriptions, not decisions. Decision-vs-description; one home per decision; freshness discipline. | Steward note `decision-vs-description-and-knowledge-homing.md` (instance notes, pending harvest); relayed to the OATS coordinator on 2026-09-04. |
|
|
724
|
-
| 2026-09-03/04 | OATS architecture proposal: knowledge is a contract with a read side and a write side; a harvester is a soul type permitted to write knowledge; the write side's doctrine is decision versus description; non-coding specialists are almost pure knowledge; custody scoping belongs to the contract. | the September 3 architecture proposal (this repository until 0.26.0; in the v0.25.x tags), sections "Soul type", "The slot contracts", "Three simplifications". |
|
|
725
|
-
| 2026-09-05 to 09-08 | Record-fed harvest shipped: `oats.okf` 1.5.0 to 1.6.1 (record windows, watermark, replan detection, exclusions, harvest runtime and model settings, non-zero exit on failure, inspect view and harvest action). | `capabilities/oats-okf/` at 1.6.1 (this repository); `docs/design/operations-contract.md`. |
|
|
726
|
-
| 2026-09-07 | Founder: the OATS team holds the agreed architecture vision; OAS-side review is advisory. | Steward note `oats-vision-delegated-to-juan.md`. |
|
|
727
|
-
| 2026-09-08 | Expert-assisted deployment proposal: shared knowledge collections with explicit promotion destinations; pending-for-owner for ambiguous material; the expert must not become the deployment's database; acceptance is knowledge output, not harvester activity. | `docs/design/2026-09-08-expert-assisted-deployment-proposal.md` (this repository), "Shared knowledge and promotion destinations"; steward note `deployment-as-capability-not-a-layer.md`. |
|
|
728
|
-
| 2026-09-09 | **Founder direction:** central knowledge base of soul-owned nodes; owns/reads; harvester-only writes; one harvester per instance; per-instance local schedule plus final harvest at retirement; the running agent unaware of the harvester; doctrine first; parallel instances consolidate per part; design requirements and completion tests. | Steward note `central-knowledge-base-soul-owned-nodes.md`; sent to the OATS coordinator the same day. |
|
|
729
|
-
| 2026-09-09 | **Founder amendment:** the base may be repo-resident; portability is git; export/import withdrawn; base location is a binding. | Same note, amended; sent the same day. |
|
|
730
|
-
| 2026-09-10 | Deployment evidence: engineer souls whose operating docs say the repository documents itself and the knowledge carries only what the docs do not say plus where they are stale; repository-resident review knowledge bases mined from real reviews and gating a learnings reviewer. | The LFX deployment's souls and repositories (uncommitted local souls; not in any framework repository). |
|
|
731
|
-
| 2026-09-13 | This consolidation. | This document. |
|
|
732
|
-
|
|
733
|
-
---
|
|
734
|
-
|
|
735
|
-
## 11. A note to the implementers
|
|
736
|
-
|
|
737
|
-
Read section 3 twice before opening the harvester skill. The mechanics in
|
|
738
|
-
sections 4, 6, and 7 exist so that the doctrine reaches the base reliably,
|
|
739
|
-
under concurrency, without the working agent's involvement, and with git as
|
|
740
|
-
the audit trail. But the product is not the pipeline. The product is a soul
|
|
741
|
-
whose next incarnation knows what the last one learned, and knows nothing
|
|
742
|
-
the repository could have told it. When a mechanism and the doctrine
|
|
743
|
-
conflict, the doctrine wins, and the conflict is a finding to report, not a
|
|
744
|
-
detail to resolve quietly.
|