Reconcile: adopt initialization's consolidated HQ as canonical, re-home this session's new work #24

Merged
jschoubben merged 177 commits from reconcile-init-into-main into main 2026-09-05 10:27:11 +00:00
3 changed files with 56 additions and 84 deletions
Showing only changes of commit 066f14b5f8 - Show all commits
@@ -81,17 +81,18 @@ Four layers. Naming them honestly is worth more than the word on the tin:
| **machines are linked by a private network** | and every machine reaches every other over it |
| **one node holds knowledge of all of them** | the control plane, and only it |
| **modules are how anything is built and delivered** | this *is* the CI/CD, not something beside it ([ADR 0010](0010-delivery.md)) |
| **agents are hired onto nodes and do the work** | the layer the other three exist to carry |
| **every node is a conversation you can address** | it holds a session, it remembers, and any node can message any other ([ADR 0004](0004-a-node-and-how-it-joins.md)) |
| **workers are hired onto nodes to do tasks** | employees, with a lifecycle — a different thing from the row above ([ADR 0003](0003-agents-are-persistent-employees.md)) |
**The fourth row is where the value is, and the first three are what make it possible.** An agent
hired onto one node can reach any other — a shell, a service, a file — because the private network
makes every node reachable and `identity` decides which agents may reach which. **That is the
capability being built**: not machines that can be configured centrally, which is ordinary, but a
set of machines an agent can work across as though they were one.
**The last two rows are not the same thing and the vocabulary of one does not describe the other.**
A node's own session belongs to the node: nobody hires it, it holds no tasks, it is never
reassigned, and it is gone when the node leaves. A worker is an employee — named, hired, drained,
retired, movable. They are built from the same parts and run on entirely different terms, and
collapsing them is how the employee vocabulary ends up stretched over something it does not fit.
The credential belongs to the **agent**, never to the node it is sitting on
([ADR 0006](0006-the-substrate-and-the-control-plane.md)), which is the same rule as *nodes and
agents are decoupled* below, applied to access.
**Where the value is** is that both can reach across the whole set: a shell, a service, a file, or
simply a question to another node. Not machines that can be configured centrally, which is
ordinary, but a set of machines that can be worked across as though they were one.
**This is not a mesh in the peer-to-peer sense and will not become one.** The word describes what
machines can reach, not how they are governed:
@@ -51,81 +51,6 @@ when it expires. A temporary employee is still an employee.
Some agents are **human**. What differs is modality — how the agent acts — not category. A node
itself is an agent of a kind exempt from the hiring lifecycle.
### The node's own session
*Written 2026-08-29. The sentence above is the whole of this and had been left as one line, which
is why it kept being read as a leftover rather than as the design.*
**Every node holds one session of its own, permanently.** It listens on its own queue, anything in
the mesh may prompt it, and it remembers — what it was asked ten minutes ago and what it was asked
last week, across every caller, the way any conversation is remembered by both sides. Its system
prompt is the node's **engram**: the personality that makes one node's answers recognisably its
own.
Nothing about it is request-response. A caller asks, the node answers, the exchange stays.
**It is the same mechanism as a hired agent, and deliberately not the same lifecycle.** That
distinction is the answer to a question asked repeatedly and worth settling here:
| the same | different |
|---|---|
| a persistent session, accumulating memory, a system prompt, a scoped tool list, addressable by message | how it comes into existence, and whether it can stop |
**One implementation, two ways of existing: hired, or inherent to a node.** Building the mechanism
twice is real duplication and the concern was right; collapsing the lifecycles is the other mistake
and it is worse.
**It is provisioned the ordinary way and made immutable — not held outside the system.** The
sentence above says *exempt from the hiring lifecycle*, and the precision matters: it is exempt
from **hiring**, not from having a lifecycle. Its lifecycle is the **node's** — provisioned when
the node enrols, retired when the node is retired. Same states, a different thing driving them.
That distinction is what keeps it inside the model. A thing genuinely held outside would have to be
special-cased by everything that lists agents; a thing provisioned normally and constrained is one
row like any other, and the constraints are **checkable** rather than remembered:
| | |
|---|---|
| **cannot be retired, reassigned, or deleted while its node exists** | it *is* that machine's voice — retiring it leaves a node nothing can talk to, moving it puts one machine's mind on another |
| **exactly one per node** | with two, nothing decides which replies when the node is addressed; with none, the node is mute |
| **may be disabled and re-enabled** | ordinary, and see below |
| **its engram may be changed** | its existence is immutable, its personality is not — that is how a node is configured |
[ADR 0001](0001-mesh-brokers-nodes-host-agents-think.md)'s *the two agent rows per node merge* is
the same fact from the other side: **one per node** — not zero, and not two.
**Disabled is a state that answers.** A node prompted while its agent is disabled replies saying
so, immediately, without a model being invoked. It does not time out and it is not silence — the
queue is still consumed, and the answer is the state.
That is the whole reason disabling is better than not provisioning. A node with no agent is a
silence somebody has to diagnose; a node whose agent is disabled tells you what is wrong in the
reply. It is the same rule the host follows about a service that does not exist, applied here:
**absence must never be indistinguishable from a failure to answer.**
### What is scoped, and what is not
**Its tool list is its own and narrower than a session a person drives.** The same scoping any
agent has; a different list.
**There is no authorisation between nodes.** Every node is the operator's own, and a prompt from
one is a prompt from the operator. Asking a node something is asking a colleague, and colleagues do
not present credentials.
Stated once so it is not discovered later: **the mesh boundary is therefore the security
boundary.** Anything inside can reach whatever any node can reach, which is what makes the token
and the overlay the entire perimeter ([ADR 0004](0004-a-node-and-how-it-joins.md),
[ADR 0007](0007-connectivity.md)).
**How a node passes a question on is the node's own choice, not a field in a message.** Asked
something it must ask a third node about, a node may say who is asking or may simply ask — the way
a person relaying a question decides how to phrase it. That follows from the engram, not from a
protocol. What it costs is a machine-readable chain of who ultimately asked; what each node was
asked, and by whom, remains in that node's own record.
**A node thinks about one thing at a time**, being one session. Callers queue, and a long answer
delays the others.
## Consequences
- Memory, workspace and reputation have a subject to belong to. Policy becomes possible: an
@@ -28,6 +28,52 @@ asked to do — and that belongs in the host's profile rather than in the defini
because its absence is every node in the ordinary disconnected situation at once. An episodic
host on a phone is that situation more often. Neither needed a new mechanism.
### A node is also a conversation
*Written 2026-08-29. It runs on every node today and appeared in no record, which is how something
deliberate comes to look accidental.*
**A node holds one session, permanently, and it is part of what the node is** — not a program
installed on it. Anything in the mesh can send it a message; it replies; and it remembers. What it
was asked ten minutes ago is still there next week, alongside what everything else asked in
between, the same way both sides of any conversation remember it.
Its system prompt is the node's **engram** — what makes one node's replies recognisably its own
rather than generic.
**It has its own tools**, and fewer than a session a person is driving directly. So a question can
be answered by going and looking: *what is in our forge*, not only *what is your battery*.
**Messages travel the broker like everything else** ([ADR 0002](0002-nodes-communicate-over-a-broker.md)).
There is no second transport and nothing is dialled.
**Any node can message any node, and this is the one part of the system that is genuinely a mesh**
— symmetric, with no centre. A node that is asked something it does not know can ask another, and
how it passes the question on is its own business: it may say who wants to know, or simply ask. A
person relaying a question makes the same choice, and it follows from the engram rather than from a
message format.
**There is no authorisation between nodes.** Every node is the operator's own, so a message from
one is a message from them, and asking a node something is asking a colleague rather than
presenting credentials. Stated once so it is not discovered later: **the mesh boundary is therefore
the security boundary** — anything inside can reach what any node can reach, which is what puts the
whole perimeter on the token and the overlay
([ADR 0007](0007-connectivity.md)).
**It can be switched off, and switched off it still answers.** A node whose session is disabled
replies saying so, at once, with no model involved — the queue is still read, and the state is the
reply. That is deliberate and it is the same rule the host follows about a service that does not
exist: **absence must never be indistinguishable from a failure to answer.** A node with nothing
there is a silence somebody has to go and diagnose; a node that says *I am switched off* is not.
**One per node, always, and it cannot be moved to another machine.** Two and nothing decides which
replies; none and the node is mute; moved, and one machine is answering as another.
**It is not an employee** ([ADR 0003](0003-agents-are-persistent-employees.md)). Nobody hires it,
it holds no tasks, it drains nothing and it is never reassigned — that vocabulary was written for
workers and does not describe this. It exists because the node does, and it is gone when the node
leaves.
## How it joins
**The host has one behaviour and two sources of declaration.** What differs between the first