Replace Outline with an Obsidian-format knowledge vault on the agent host
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 1m21s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
This commit is contained in:
dongarandClaude Opus 5.5 committed 2026-10-02 17:30:54 +00:00
1 parent 230b927ebe
commit aa97309a0c
1 file changed
+50 -31
+50 -31
View File
@@ -297,7 +297,7 @@ does not stop at gates for their own sake.
**Approval sources.** Matrix (L5), Gitea comments (D2) and Vikunja comments (O5) **Approval sources.** Matrix (L5), Gitea comments (D2) and Vikunja comments (O5)
are approval sources; each authenticates the approver against its own operator are approval sources; each authenticates the approver against its own operator
allowlist. The first valid approval wins and is echoed to the other channels. The allowlist. The first valid approval wins and is echoed to the other channels. The
knowledge store (L10) is **never** an approval source or an instruction channel. knowledge vault (L10) is **never** an approval source or an instruction channel.
**The trust dial.** How much the operator reviews after the fact is **data the **The trust dial.** How much the operator reviews after the fact is **data the
operator sets**, per project and per milestone: for example, whether PR review is operator sets**, per project and per milestone: for example, whether PR review is
@@ -408,16 +408,16 @@ the caller treats it as a failure (L9).
- **For a repo:** the project's own documents (`ARCHITECTURE.md`, build plans, - **For a repo:** the project's own documents (`ARCHITECTURE.md`, build plans,
conventions), versioned in the repo and changed by PR (D2). Read at work-item conventions), versioned in the repo and changed by PR (D2). Read at work-item
start; the repo is the authority. start; the repo is the authority.
- **For infrastructure:** the world model in the knowledge store (L10): what - **For infrastructure:** the world model in the knowledge vault (L10): what
exists and how it is arranged. exists and how it is arranged.
**4. Agent memory** — the agent's own notes, outliving work items and scopes. **4. Agent memory** — the agent's own notes, outliving work items and scopes.
- **What it holds:** the operator's preferences, lessons learned, recurring - **What it holds:** the operator's preferences, lessons learned, recurring
decisions and their reasons. Much like a good collaborator's notebook. decisions and their reasons. Much like a good collaborator's notebook.
- **Where:** the agent's private space in the knowledge store (L10), one note per - **Where:** the agent's own folder under `memory/` in the knowledge vault (L10),
fact, with an index. one note per fact, with an index. Private between agents.
- **Written by the agent** at defined moments (below); **visible to the operator**, - **Written by the agent** at defined moments (below); **visible to the operator**
who corrects it through conversation, not by editing. (read-only, L10), who corrects it through conversation, not by editing.
- **Read at work-item start** (the index, plus notes relevant to the task) and when - **Read at work-item start** (the index, plus notes relevant to the task) and when
the agent is about to make a decision the notes cover. the agent is about to make a decision the notes cover.
@@ -589,38 +589,55 @@ are recorded as input/output pairs from the start, with outcomes marked. Changin
a model is then a configuration change and a re-run, not a matter of benchmark a model is then a configuration change and a re-run, not a matter of benchmark
chatter. chatter.
### L10. Knowledge store (Outline) ### L10. Knowledge vault
Durable knowledge that outlives work items: world models, agent memory (L6), and Durable knowledge that outlives work items: world models, agent memory (L6), and
later operator-written procedures. operator-written material such as procedures. It is a folder of Markdown files on
the agent host (X1), in the format Obsidian reads (frontmatter, `[[links]]`,
tags), so the operator browses it in Obsidian with links, backlinks and the graph.
**Layout: one writer per document.** **One vault, one writer per folder.**
- **One collection per writing principal:** `nisse-ops-world`, `nisse-dev-world`, - **Agent memory lives under `memory/`,** one folder per agent. Other folders hold
each agent's memory, and `procedures` (the operator's). Sharing grants read shared material (world models, the operator's notes); their names and layout are
access only; concurrent writers never exist. left to grow with need.
- **`nisse-dev` gets private space only.** Shared infrastructure documents are a - **Every folder has exactly one writer,** an agent or the operator, so concurrent
map of exactly what its sealed network keeps its builds from (D7). writes never happen.
- **Each agent authenticates as its own Outline user,** with its own API token. A - **Mounts enforce it** (a hard wall, P4): each agent's container gets the folders it
token from the operator's account would silently void every permission here. writes read-write, the shared folders it may read read-only, and nothing else. No
- **Collections and documents are identified by ID** from configuration and state, agent can read another's memory. `nisse-dev` gets no infrastructure material,
never discovered, and document IDs recorded when created make writes idempotent. which would be a map of exactly what its builds are kept from (D7).
- **Links point from memory to shared notes, never the other way,** so the shared
part reads cleanly on its own.
- **Writes are atomic** (write, then rename), so a reader never sees half a note.
- **Access is through control tools** (L13): the harness reads and writes the mounted
folders. No tool VM ever sees the vault.
- **History:** the vault is a git repository on the agent host, and the harness
commits each write with the agent and work item that made it. A note's revision is
its commit (L6).
**The operator's copy.** Syncthing keeps a copy on the operator's devices, with the
direction set per folder:
- **folders an agent writes,** memory included, are send-only from the host: the
operator reads them, and a local edit never flows back;
- **folders the operator writes** are receive-only on the host.
So conflicts can't arise. Obsidian's own settings folder and `.git` are not synced.
**Never an instruction channel, never an approval channel.** Work is never read **Never an instruction channel, never an approval channel.** Work is never read
out of the knowledge store, and an agent never writes there to make another agent out of the vault, and an agent never writes there to make another agent act.
act. Coordination between agents goes through the operator, Matrix, or a ticket (L1). Coordination between agents goes through the operator, Matrix, or a ticket (L1).
**Corrections go through conversation.** The operator tells the agent, which **Corrections go through conversation.** The operator tells the agent, which
records the correction verbatim (L6). The operator keeps write permission as a records the correction verbatim (L6). As a break-glass, the operator can stop the
break-glass: stop the agent, edit, restart. An agent re-reads a document's agent and edit its folder on the host, then restart.
revision before writing and merges rather than overwrites if it moved.
**Retrieval is structural first.** Procedures are bound to entries in ops policy **Retrieval is structural first.** Procedures are bound to entries in ops policy
(O2) and fetched whenever a plan uses that entry; search exists in addition, never (O2) by path and read whenever a plan uses that entry; search (over plain files)
instead. exists in addition, never instead.
**Outages.** A failed write never blocks work (retry, or record locally and **Failures.** A failed write never blocks work (retry, or record and reconcile). A
reconcile). A failed read of a bound procedure stops planning that action; other missing bound procedure stops planning that action; other failed reads proceed and
failed reads proceed and log the gap. log the gap.
### L11. Prompt injection ### L11. Prompt injection
@@ -1062,8 +1079,8 @@ identity, so every upstream action traces to one agent.
### X5. Supporting services ### X5. Supporting services
All self-hosted: Matrix (Synapse), Gitea, LiteLLM, the local inference host All self-hosted: Matrix (Synapse), Gitea, LiteLLM, the local inference host
(llama-swap on an RTX 4090 host), Vikunja, Outline, Vaultwarden, LLDAP with (llama-swap on an RTX 4090 host), Vikunja, Vaultwarden, LLDAP with Authelia, and
Authelia. Each agent gets its own account, scoped token and room in each service Syncthing for the operator's copy of the knowledge vault (L10). Each agent gets its own account, scoped token and room in each service
it uses; nothing is shared between agents. it uses; nothing is shared between agents.
--- ---
@@ -1123,11 +1140,13 @@ history):
- **Documents as the dev workflow (D2),** a fresh workspace per task and toolchain - **Documents as the dev workflow (D2),** a fresh workspace per task and toolchain
preflight (D3), and git hygiene learned from the live runs (D4). preflight (D3), and git hygiene learned from the live runs (D4).
- **Conversation (L5)** is a first-class requirement, not a command interpreter. - **Conversation (L5)** is a first-class requirement, not a command interpreter.
- **The knowledge vault (L10)** replaces Outline: Markdown on the agent host, shared
between agents by mounts, synced to the operator by Syncthing. Revised in PR #90.
- **Deployment (X1, L13),** revised in PR #90: one agent host with each agent as a - **Deployment (X1, L13),** revised in PR #90: one agent host with each agent as a
container, and disposable tool VMs (a build VM per project for `nisse-dev`) where container, and disposable tool VMs (a build VM per project for `nisse-dev`) where
every model-chosen command runs over SSH, replacing a VM per agent. every model-chosen command runs over SSH, replacing a VM per agent.
- **Kept, largely as they were:** the work model, durability and reconciliation, - **Kept, largely as they were:** the work model, durability and reconciliation,
LiteLLM and the canonical log, delegation, the knowledge store, prompt injection, LiteLLM and the canonical log, delegation, prompt injection,
identity, and `nisse-ops`' approved step sequences. identity, and `nisse-ops`' approved step sequences.
- **Moved to the Development Plan (to be written):** build order, supporting-service - **Moved to the Development Plan (to be written):** build order, supporting-service
status, and interim arrangements. status, and interim arrangements.