Fix of issue 1834: the operator's desktop build node's root disk filled for the second time in a day (after issue 1772's anonymous volumes), and the merge checks then failed with "store never became ready" because the check's throwaway store died on a full disk and --rm erased why.
What changes, all in mesh-controller:
Nothing of an image build stays (internal/builder). When an image artifact ends, its build tag <module>-<artifact>:<commit>, the name its push gave it (the registry's or the check's scratch name, PushedNames), its narrowed folder and its context clone are removed, in one docker rmi for both names; "is removed" is said only when docker removed it. A held image a comparison pulls (imageContent) is removed once read. A Local publisher (raising a mesh) keeps its image, which is the artifact there.
A floor of free space (20 GiB). A build or check refuses under it on / or its workspace's filesystem, saying "the build node has N GiB free on /, under the floor of 20 GiB"; and the build node's taking loop declines work under it, so another build node takes the ask.
A store that dies says why. The throwaway store and bus no longer start with --rm; a failed readiness carries the container's state, exit code and last 20 log lines, then the existing removal removes it.
This is the first step of the operator's rule of 2026-10-22 "a build leaves nothing behind" (its milestone, with reusable data kept once as declared caches, is being recorded).
Tests (written to fail first): TestACheckUnderTheFloorOfFreeSpaceRefusesSayingSo, TestABuildUnderTheFloorOfFreeSpaceRefusesSayingSo, TestTheWorkspacesFilesystemIsReadToo, TestAStoreThatDiesSaysWhyItDied, TestTheThrowawayStoreIsNotStartedWithRm, TestABuildRemovesWhatItLeftOnTheNode, TestAnImageKeptLocallyIsNotRemoved, TestTheHeldImageAComparisonPullsIsRemovedAfterReading, TestAnImageThatCannotBeRemovedIsNotSaidRemoved, TestANodeUnderTheFloorOfFreeSpaceTakesNoWork. Try build-1792669110617295234: pass (7m22s; unit level 1576 tests in 2.07 s).
After its delivery the lead resumes the desktop build node's build agent, paused since 13:10.
Fix of issue 1834: the operator's desktop build node's root disk filled for the second time in a day (after issue 1772's anonymous volumes), and the merge checks then failed with "store never became ready" because the check's throwaway store died on a full disk and `--rm` erased why.
What changes, all in mesh-controller:
- **Nothing of an image build stays (internal/builder).** When an image artifact ends, its build tag `<module>-<artifact>:<commit>`, the name its push gave it (the registry's or the check's scratch name, `PushedNames`), its narrowed folder and its context clone are removed, in one `docker rmi` for both names; "is removed" is said only when docker removed it. A held image a comparison pulls (`imageContent`) is removed once read. A Local publisher (raising a mesh) keeps its image, which is the artifact there.
- **A floor of free space (20 GiB).** A build or check refuses under it on `/` or its workspace's filesystem, saying "the build node has N GiB free on /, under the floor of 20 GiB"; and the build node's taking loop declines work under it, so another build node takes the ask.
- **A store that dies says why.** The throwaway store and bus no longer start with `--rm`; a failed readiness carries the container's state, exit code and last 20 log lines, then the existing removal removes it.
This is the first step of the operator's rule of 2026-10-22 "a build leaves nothing behind" (its milestone, with reusable data kept once as declared caches, is being recorded).
Tests (written to fail first): TestACheckUnderTheFloorOfFreeSpaceRefusesSayingSo, TestABuildUnderTheFloorOfFreeSpaceRefusesSayingSo, TestTheWorkspacesFilesystemIsReadToo, TestAStoreThatDiesSaysWhyItDied, TestTheThrowawayStoreIsNotStartedWithRm, TestABuildRemovesWhatItLeftOnTheNode, TestAnImageKeptLocallyIsNotRemoved, TestTheHeldImageAComparisonPullsIsRemovedAfterReading, TestAnImageThatCannotBeRemovedIsNotSaidRemoved, TestANodeUnderTheFloorOfFreeSpaceTakesNoWork. Try build-1792669110617295234: pass (7m22s; unit level 1576 tests in 2.07 s).
After its delivery the lead resumes the desktop build node's build agent, paused since 13:10.
Reviewed-by: reviewer-1834@shanks at f501eaca430541240e804ef89ba9664db96e75fb
A full / made every check on shanks end 'store never became ready' with the reason erased by --rm.
Builds now remove their local image tag, narrowed source and context clone; a build or check
refuses under 20 GiB free on / and the workspace, saying so; the throwaway store is no longer
started with --rm and a store that does not come up reports its exit code and last 20 log lines.
mesh/delivery covered: a later merge that contains it was delivered: novox/mesh-controller@01f615aa0ad6 (merged as 8f2d22db into main, walk plan-17926707…
mesh/merge-gate head f501eaca4305 merged into trunk 4463991e0609 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
The registry push tags the image a second time, so removing only the build tag freed nothing.
The held image a comparison pulls goes after it is read, and a node under the floor leaves the ask
to another build node instead of taking it and failing.
Deliverynovox/mesh-controller@f501eaca4305 — covered since 2026-10-22T12:45:51Z
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
Machines
mesh-controller on every machine running it: sent
mesh-sdk on every machine running it: sent
build-agent on every machine running it: sent
mesh-tools on every machine running it: sent
route-proxy on every machine running it: sent
audit-logger on every machine running it: sent
baserow on every machine running it: sent
bazarr on every machine running it: sent
bookshelf on every machine running it: sent
confluence on every machine running it: sent
gitea on every machine running it: sent
gitlab on every machine running it: sent
grafana on every machine running it: sent
home-assistant on every machine running it: sent
icecast on every machine running it: sent
influxdb on every machine running it: sent
jackett on every machine running it: sent
jira on every machine running it: sent
kometa on every machine running it: sent
lab on every machine running it: sent
letta on every machine running it: sent
lidarr on every machine running it: sent
mesh-catalog on every machine running it: sent
model-usage on every machine running it: sent
mosquitto on every machine running it: sent
netcheck on every machine running it: sent
nextcloud on every machine running it: sent
nodered on every machine running it: sent
ombi on every machine running it: sent
openai-consumer on every machine running it: sent
radarr on every machine running it: sent
redis on every machine running it: sent
route-adapter on every machine running it: sent
searxng on every machine running it: sent
showcase on every machine running it: sent
sonarr on every machine running it: sent
tautulli on every machine running it: sent
umami on every machine running it: sent
unifi on every machine running it: sent
zsh on every machine running it: sent
Transitions
2026-10-22 11:46 (new) → proposed (announced): novox/mesh-controller#435's head announced
2026-10-22 12:04 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-22 12:04 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-22 12:21 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-22 12:21 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-22 12:45 delivering → covered (covered): covered: a later merge that contains it was delivered: novox/mesh-controller@01f615aa0a (merged as 8f2d22db into main, walk plan-1792670716360084102)
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@f501eaca4305` — **covered** since 2026-10-22T12:45:51Z
**Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- ace: receives build-agent
- g14: receives build-agent
- novox: receives mesh-controller, build-agent
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
**Machines**
- mesh-controller on every machine running it: sent
- mesh-sdk on every machine running it: sent
- build-agent on every machine running it: sent
- mesh-tools on every machine running it: sent
- route-proxy on every machine running it: sent
- audit-logger on every machine running it: sent
- baserow on every machine running it: sent
- bazarr on every machine running it: sent
- bookshelf on every machine running it: sent
- confluence on every machine running it: sent
- gitea on every machine running it: sent
- gitlab on every machine running it: sent
- grafana on every machine running it: sent
- home-assistant on every machine running it: sent
- icecast on every machine running it: sent
- influxdb on every machine running it: sent
- jackett on every machine running it: sent
- jira on every machine running it: sent
- kometa on every machine running it: sent
- lab on every machine running it: sent
- letta on every machine running it: sent
- lidarr on every machine running it: sent
- mesh-catalog on every machine running it: sent
- model-usage on every machine running it: sent
- mosquitto on every machine running it: sent
- netcheck on every machine running it: sent
- nextcloud on every machine running it: sent
- nodered on every machine running it: sent
- ombi on every machine running it: sent
- openai-consumer on every machine running it: sent
- radarr on every machine running it: sent
- redis on every machine running it: sent
- route-adapter on every machine running it: sent
- searxng on every machine running it: sent
- showcase on every machine running it: sent
- sonarr on every machine running it: sent
- tautulli on every machine running it: sent
- umami on every machine running it: sent
- unifi on every machine running it: sent
- zsh on every machine running it: sent
**Transitions**
- 2026-10-22 11:46 (new) → proposed (announced): novox/mesh-controller#435's head announced
- 2026-10-22 12:04 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-22 12:04 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-22 12:21 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-22 12:21 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-22 12:45 delivering → covered (covered): covered: a later merge that contains it was delivered: novox/mesh-controller@01f615aa0ad6 (merged as 8f2d22db into main, walk plan-1792670716360084102)
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Merge check at f501eaca
Judged: head f501eaca4305 merged into trunk 4463991e0609; read beside it: mesh-catalog b7b9f2a3da78, mesh-controller-main 4463991e0609, mesh-host 4065b45ae84f, mesh-tools e0fadc43d9dd
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
tier 0: mesh-controller
tier 1: build-agent
ace: receives build-agent
g14: receives build-agent
novox: receives mesh-controller, build-agent
shanks: receives build-agent
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
read by no module's build: cmd/mesh-builder/busy_test.go, internal/builder/build_source_test.go, internal/builder/builder_test.go, internal/builder/disk_1834_test.go
Run by the build seat on ace as build-1792669580230677717 (builds --log build-1792669580230677717).
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.
Fix of issue 1834: the operator's desktop build node's root disk filled for the second time in a day (after issue 1772's anonymous volumes), and the merge checks then failed with "store never became ready" because the check's throwaway store died on a full disk and
--rmerased why.What changes, all in mesh-controller:
<module>-<artifact>:<commit>, the name its push gave it (the registry's or the check's scratch name,PushedNames), its narrowed folder and its context clone are removed, in onedocker rmifor both names; "is removed" is said only when docker removed it. A held image a comparison pulls (imageContent) is removed once read. A Local publisher (raising a mesh) keeps its image, which is the artifact there./or its workspace's filesystem, saying "the build node has N GiB free on /, under the floor of 20 GiB"; and the build node's taking loop declines work under it, so another build node takes the ask.--rm; a failed readiness carries the container's state, exit code and last 20 log lines, then the existing removal removes it.This is the first step of the operator's rule of 2026-10-22 "a build leaves nothing behind" (its milestone, with reusable data kept once as declared caches, is being recorded).
Tests (written to fail first): TestACheckUnderTheFloorOfFreeSpaceRefusesSayingSo, TestABuildUnderTheFloorOfFreeSpaceRefusesSayingSo, TestTheWorkspacesFilesystemIsReadToo, TestAStoreThatDiesSaysWhyItDied, TestTheThrowawayStoreIsNotStartedWithRm, TestABuildRemovesWhatItLeftOnTheNode, TestAnImageKeptLocallyIsNotRemoved, TestTheHeldImageAComparisonPullsIsRemovedAfterReading, TestAnImageThatCannotBeRemovedIsNotSaidRemoved, TestANodeUnderTheFloorOfFreeSpaceTakesNoWork. Try build-1792669110617295234: pass (7m22s; unit level 1576 tests in 2.07 s).
After its delivery the lead resumes the desktop build node's build agent, paused since 13:10.
Reviewed-by: reviewer-1834@shanks at
f501eaca43Delivery
novox/mesh-controller@f501eaca4305— covered since 2026-10-22T12:45:51ZDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Machines
Transitions
8f2d22dbinto main, walk plan-1792670716360084102)The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
f501eacaJudged: head
f501eaca4305merged into trunk4463991e0609; read beside it: mesh-catalogb7b9f2a3da78, mesh-controller-main4463991e0609, mesh-host4065b45ae84f, mesh-toolse0fadc43d9ddmesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1792669580230677717(builds --log build-1792669580230677717).