hq issue 190: the controller's private network writes insecure-registries into /etc/docker/daemon.json, a file the docker module (holder of node-container-runtime) owns. Rule: the controller never writes a file a seat's holder owns; it tells the owner.
This PR only adds the way to tell it:
${seat:<mesh-seat>:reach} = host:port where this machine reaches the holder of a mesh-scope seat. No requirement, no grant, no credential; the value is the one the mesh already composes into every built reference (artifactStoreAddress).
Rendering.SeatReach, filled in renderingFor. Only mesh-artifact-store is answered; any other seat is refused by name.
Empty answer (no store on the network yet): in an into: json file the empty member is dropped, and a list left empty is dropped, so the runtime is never told to trust "".
Tests (seat_into_test.go): filled in a file and in an env value, empty dropped (other members kept), unknown seat refused, composed through Declaration.
Merge order (issue 190):
this PR (controller: placeholder only; safe alone, nothing uses it yet)
mesh-catalog: docker states insecure-registries with the placeholder (only once this controller is deployed; an older controller would send the placeholder through literally)
mesh-controller: the overlay stops generating registry-trust/registry-trust-reload, and generated resources go through the collision check (only after 2; otherwise the docker module would lose the member, and with 2 in place the check would refuse the overlap if it ran first)
mesh-host PR (a unit still held by another declared service is not given back when one of its records goes) should be deployed before 3.
gofmt/vet clean; go test ./... passes against mesh-catalog main and against the catalogue branch, except internal/broker TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose, which fails on main as well (it reads mesh-host's genesis template beside it).
hq issue 190: the controller's private network writes `insecure-registries` into `/etc/docker/daemon.json`, a file the docker module (holder of `node-container-runtime`) owns. Rule: the controller never writes a file a seat's holder owns; it tells the owner.
This PR only adds the way to tell it:
- `${seat:<mesh-seat>:reach}` = host:port where this machine reaches the holder of a mesh-scope seat. No requirement, no grant, no credential; the value is the one the mesh already composes into every built reference (`artifactStoreAddress`).
- `Rendering.SeatReach`, filled in `renderingFor`. Only `mesh-artifact-store` is answered; any other seat is refused by name.
- Empty answer (no store on the network yet): in an `into: json` file the empty member is dropped, and a list left empty is dropped, so the runtime is never told to trust "".
Tests (`seat_into_test.go`): filled in a file and in an env value, empty dropped (other members kept), unknown seat refused, composed through `Declaration`.
**Merge order (issue 190):**
1. **this PR** (controller: placeholder only; safe alone, nothing uses it yet)
2. mesh-catalog: docker states `insecure-registries` with the placeholder (only once this controller is deployed; an older controller would send the placeholder through literally)
3. mesh-controller: the overlay stops generating `registry-trust`/`registry-trust-reload`, and generated resources go through the collision check (only after 2; otherwise the docker module would lose the member, and with 2 in place the check would refuse the overlap if it ran first)
mesh-host PR (a unit still held by another declared service is not given back when one of its records goes) should be deployed before 3.
gofmt/vet clean; `go test ./...` passes against mesh-catalog main and against the catalogue branch, except `internal/broker TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose`, which fails on main as well (it reads mesh-host's genesis template beside it).
The container runtime's module must state the mesh's registry to the runtime it owns, so the
controller can stop writing that into the runtime's file (hq issue 190). ${seat:<seat>:reach}
answers host:port without a binding: nothing required, granted or minted, and the address is
one the mesh already composes into every reference it built. Only mesh-artifact-store is
answered; another seat is refused by name. Unanswered in a file written into as JSON, the empty
member is dropped, so the runtime is never told to trust "".
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#62 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@d84c9699b3b1` — **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#62 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 issue 190: the controller's private network writes
insecure-registriesinto/etc/docker/daemon.json, a file the docker module (holder ofnode-container-runtime) owns. Rule: the controller never writes a file a seat's holder owns; it tells the owner.This PR only adds the way to tell it:
${seat:<mesh-seat>:reach}= host:port where this machine reaches the holder of a mesh-scope seat. No requirement, no grant, no credential; the value is the one the mesh already composes into every built reference (artifactStoreAddress).Rendering.SeatReach, filled inrenderingFor. Onlymesh-artifact-storeis answered; any other seat is refused by name.into: jsonfile the empty member is dropped, and a list left empty is dropped, so the runtime is never told to trust "".Tests (
seat_into_test.go): filled in a file and in an env value, empty dropped (other members kept), unknown seat refused, composed throughDeclaration.Merge order (issue 190):
insecure-registrieswith the placeholder (only once this controller is deployed; an older controller would send the placeholder through literally)registry-trust/registry-trust-reload, and generated resources go through the collision check (only after 2; otherwise the docker module would lose the member, and with 2 in place the check would refuse the overlap if it ran first)mesh-host PR (a unit still held by another declared service is not given back when one of its records goes) should be deployed before 3.
gofmt/vet clean;
go test ./...passes against mesh-catalog main and against the catalogue branch, exceptinternal/broker TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose, which fails on main as well (it reads mesh-host's genesis template beside it).The container runtime's module must state the mesh's registry to the runtime it owns, so the controller can stop writing that into the runtime's file (hq issue 190). ${seat:<seat>:reach} answers host:port without a binding: nothing required, granted or minted, and the address is one the mesh already composes into every reference it built. Only mesh-artifact-store is answered; another seat is refused by name. Unanswered in a file written into as JSON, the empty member is dropped, so the runtime is never told to trust "".Delivery
novox/mesh-controller@d84c9699b3b1— 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.