Replace Outline with an Obsidian-format knowledge vault on the agent host
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 1m21s
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:
1 parent
230b927ebe
commit
aa97309a0c
1 file changed
+50
-31
+50
-31
@@ -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.
|
||||||
Reference in new issue
Block a user