Seat.Replicated (compiled, never stored, like Needs); only mesh-dns-resolver.
Holdings keyed by (seat, node, module): migration 0062. HoldSeat (seat --to) replaces every holder in one transaction; new AddSeatHolder behind seat <name> --add <node>/<module>, refused for a seat held once.
checkClaims: every holder on record holds and is never a second claimant; a seat held once with two records is refused, naming it; two claimants with nothing on record are still refused.
answeredElsewhere: a machine holding the seat answers its own requirement. HolderAmong returns the first holder in the providers' (name) order.
Roster facts get .Holders (seat -> holders, this machine first, then by name); the plan renders it from the holders on record (or the sole claimant) on the private network.
seats --json shows replicated.
Tests: two holders compose on both and each lists itself first; a third machine lists both and no public resolver; a holder answers itself; mesh-store still refuses a second holder (and two records); unrecorded claimants of the replicated seat are refused; only the resolver is replicated and survives store rows; one host record per machine (issue 262's missing check); store test for several holders. make check (live Postgres) green with the catalogue branch beside it.
Order: merge and roll out before mesh-catalog's feat/the-mesh-has-two-resolvers (its template reads .Holders, which an older controller cannot render). Against catalogue main, four tests that read the catalogue fail by design (they expect the new resolv-conf); the code itself is safe with the old catalogue.
hq ADR 0223.
- `Seat.Replicated` (compiled, never stored, like `Needs`); only `mesh-dns-resolver`.
- Holdings keyed by (seat, node, module): migration **0062**. `HoldSeat` (`seat --to`) replaces every holder in one transaction; new `AddSeatHolder` behind `seat <name> --add <node>/<module>`, refused for a seat held once.
- `checkClaims`: every holder on record holds and is never a second claimant; a seat held once with two records is refused, naming it; two claimants with nothing on record are still refused.
- `answeredElsewhere`: a machine holding the seat answers its own requirement. `HolderAmong` returns the first holder in the providers' (name) order.
- Roster facts get `.Holders` (seat -> holders, this machine first, then by name); the plan renders it from the holders on record (or the sole claimant) on the private network.
- `seats --json` shows `replicated`.
Tests: two holders compose on both and each lists itself first; a third machine lists both and no public resolver; a holder answers itself; `mesh-store` still refuses a second holder (and two records); unrecorded claimants of the replicated seat are refused; only the resolver is replicated and survives store rows; one host record per machine (issue 262's missing check); store test for several holders. `make check` (live Postgres) green with the catalogue branch beside it.
**Order:** merge and roll out **before** mesh-catalog's `feat/the-mesh-has-two-resolvers` (its template reads `.Holders`, which an older controller cannot render). Against catalogue main, four tests that read the catalogue fail by design (they expect the new resolv-conf); the code itself is safe with the old catalogue.
musl takes the first reply from any listed nameserver, so a public fallback
beside the mesh's resolver answered NXDOMAIN for mesh names in every Alpine
container (hq ADR 0223). The fix is two mesh resolvers and no public one, which
needs mesh-dns-resolver held on two machines: a seat can now be replicated,
each holder recorded by 'seat <name> --add', checkClaims accepts every holder
on record and still refuses a second holder of any other mesh seat, a holder
answers its own requirement, and a roster fact gives each replicated seat's
holders, this machine first, so resolv-conf can list them. Migration 0062 keys
a holding by seat and assignment.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Transitions
2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#65 merged; its head was not heard by this owner, so it is made from the forge's word
2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@df9231c73445` — **held** since 2026-10-06T23:05:28Z
Held for a person: merged without a passing check: only a person decides that it goes on — `mesh-delivery.release` with why lets it go on.
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
**Transitions**
- 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#65 merged; its head was not heard by this owner, so it is made from the forge's word
- 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
hq ADR 0223.
Seat.Replicated(compiled, never stored, likeNeeds); onlymesh-dns-resolver.HoldSeat(seat --to) replaces every holder in one transaction; newAddSeatHolderbehindseat <name> --add <node>/<module>, refused for a seat held once.checkClaims: every holder on record holds and is never a second claimant; a seat held once with two records is refused, naming it; two claimants with nothing on record are still refused.answeredElsewhere: a machine holding the seat answers its own requirement.HolderAmongreturns the first holder in the providers' (name) order..Holders(seat -> holders, this machine first, then by name); the plan renders it from the holders on record (or the sole claimant) on the private network.seats --jsonshowsreplicated.Tests: two holders compose on both and each lists itself first; a third machine lists both and no public resolver; a holder answers itself;
mesh-storestill refuses a second holder (and two records); unrecorded claimants of the replicated seat are refused; only the resolver is replicated and survives store rows; one host record per machine (issue 262's missing check); store test for several holders.make check(live Postgres) green with the catalogue branch beside it.Order: merge and roll out before mesh-catalog's
feat/the-mesh-has-two-resolvers(its template reads.Holders, which an older controller cannot render). Against catalogue main, four tests that read the catalogue fail by design (they expect the new resolv-conf); the code itself is safe with the old catalogue.130d20114btof506fb34ecDelivery
novox/mesh-controller@df9231c73445— held since 2026-10-06T23:05:28ZHeld for a person: merged without a passing check: only a person decides that it goes on —
mesh-delivery.releasewith why lets it go on.Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.