Files
hq/04-ISSUES/258-every-machine-bound-the-resolver-to-itself/00-report.md
T
jschoubben 418261213c
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): main's version judged it; the change's judges the pull requests after it merges; it…
mesh/delivery superseded: a newer head of the same pull request
Remove the decision records and research efforts, which the knowledge base now holds whole (issue 426)
ADR 0290 rule 9: once the import is checked record by record, hq keeps no copy.
The records and efforts are removed; every link or path to them reads "ADR NNNN" or
"research NNN"; a design's decisions: lists "ADR NNNN". 02-DECISIONS keeps a pointer
README with the reading order's six topics, which the knowledge base reads through the
records module; 01-RESEARCH keeps a pointer README. The checks drop the rules that
judged records (the knowledge base holds each at propose; checks/README.md says where)
and refuse a record written here again. Playbooks 01 and 02 and the skills write and
read records with the knowledge base's verbs.
2026-10-11 12:56:09 +02:00

2.4 KiB

opened
opened
2026-10-05

258. Every machine bound the mesh's resolver to itself

Symptom

After the mesh moved to one resolver (ADR 0194, 0196), the seat mesh-dns-resolver was recorded as held on the anchor, and each other machine was pinned to it for wildcard-resolution. Each machine was then pushed. The anchor's resolver configuration named its own private address first. Every other machine's did too: each named its own private address, not the anchor's.

Nothing broke, because each machine still ran a resolver of its own while the move was under way. But the mesh had decided on one resolver, recorded who held it and pinned every machine to it, and no machine used it.

Cause

The controller binds a requirement in one of two branches:

  • Answered here, when a module on the same machine provides it.
  • Answered elsewhere, when one on another machine does.

Only the second branch read the seat's holder (ADR 0110) and a pin. The first took the local provider, and read a pin only to choose between two local ones. Every machine still had its own resolver assigned, so every machine took the first branch.

The seat's own definition says the requirement "resolves to the holder wherever it is placed". The code did not.

Fix

For a mesh-wide provision, a pin naming another machine, or the seat's holder on another machine, wins over a provider on this one. With neither, the local provider answers as before.

This is checked by three resolve tests in mesh-controller:

  • the holder elsewhere answers;
  • a pin elsewhere answers;
  • a holder here still answers here.

The tests fail without the fix.

The fix broke something else (issue 273). It applied to every seat that delivers a provision, and the store's seat delivers the relational database. Its first push re-bound every database consumer on a machine running its own store to the store holding the seat. Each was made an empty database there, and nothing said so for twenty hours. ADR 0232 limits this rule to provisions that keep nothing of their consumers'. For one that keeps data, only a pin moves a consumer away from a provider beside it.

Verified

2026-10-05, after the fix rolled out: all four machines' resolver configuration names the anchor's resolver first and the public one second. Each resolves the mesh's machine names, a wildcard name under a machine, and a public name.