The largest gap in the coverage list is not a gap

Tool servers — 56 modules, over half — were written up as the biggest
missing thing. They are expressible with what exists, and the first
framing was wrong in a way worth keeping: a module provides `tools` and
the session requires them does not work, because a requirement has one
answer and 56 modules offering tools would be 56 answers.

Turned around it fits exactly. The session provides `tool-host`; every
module offering tools requires it and contributes where its tools are.
Many-to-one is what `contributes` has always been, and the session
receives all of them in one file. Verified by resolving it rather than
by reading the code.

It only became possible today: until 022, several modules on one node
requiring the same thing was refused outright. Worth noting because it
means the credential fix bought more than credentials.

What remains is a decision about what a tool server is, which is work
rather than a missing shape.

The entry stays in the list rather than being deleted — a checklist that
quietly loses its biggest item reads as though nobody looked.
This commit is contained in:
2026-09-01 03:09:11 +02:00
parent f583502fc9
commit 0760280bc6
+25 -8
View File
@@ -50,17 +50,34 @@ is `extends` chains, which were doing inheritance and are better as separate mod
## Missing, and what each would take
Ordered by how many modules need it.
Ordered by how many modules need it. The largest entry turned out not to be a gap at all, which
is left in place rather than deleted: the first framing of it was wrong in an instructive way, and
a checklist that quietly loses its biggest item reads as though nobody looked.
### Tool servers — 56 modules
### Tool servers — 56 modules — *not a gap*
**The largest single gap.** Over half the modules ship a `tools/` directory that becomes tools an
agent can call on that node. Nothing in the new manifest says *this module offers tools*.
Over half the modules ship a `tools/` directory that becomes tools an agent can call on that node.
This was written up as the largest single gap. **It is expressible with what exists**, and the
first framing of it was wrong in a way worth keeping: *a module provides `tools`, the session
requires them* does not work, because a requirement has exactly one answer and 56 modules offering
tools would be 56 answers to one question.
A module can already run the server — it is a container or a service. What is missing is the
convention that makes it reachable: something has to know the tools exist and route to them. That
is plausibly not a manifest feature at all but a **provision** — a module provides `tools`, the
session on that node requires them — which would need no new vocabulary. **Not yet decided.**
Turn it around and it fits exactly. The session **provides** `tool-host`; every module offering
tools **requires** it and **contributes** where its tools are. Many-to-one is what `contributes`
has always been, and the session receives all of them in one file:
```
given: { from: gitea, values: { at: … } }
{ from: minio, values: { at: … } }
{ from: umami, values: { at: … } }
```
Verified by resolving it, not by reading the code. It also only became possible today: until
[`022`](../../04-ISSUES/022-one-credential-per-node-per-provision-not-per-module/00-report.md) was
fixed, several modules on one node requiring the same thing was refused outright.
What remains is not vocabulary but a decision about **what a tool server is** — a container the
module already runs, and what the session does with the list. That is work, not a missing shape.
### Schema migrations — 14 modules