Issue 1966, a recovery fix (instruction recovery-fixes-merge-and-tell; merged through the gate).
Live case. On novox, distribution's want moved to build 6e1dfaa8, whose manifest listens on 5100 and no longer publishes 5000, while novox's assignment layer still gives distribution ports {5000: 5100}. GivenPorts refused the setting, JudgeSettings/LeftOut left distribution out of the declaration, and resolutionCompose derived the filter only from the kept modules: port 5100, where the old store container still ran, closed from 07:46 to 09:24 UTC and every build failed dial tcp 10.10.0.1:5100: i/o timeout.
Change.resolutionCompose derives the filter from the composed modules plus the left-out modules still running. Rules reads every module's exposure through exposureOf; a left-out module whose exposure cannot be read opens no wider than the mesh (noWiderThanTheMesh), never at its manifest's default (ADR 0046 §5-6).
Quick or thorough. Quick, chosen: one place, what failed live, met once. Thorough, not built: compose a left-out module as what runs of it (Carried, as a held module is); it would also close opening a left-out module that never ran, and using the new manifest's listens rather than the running composition's.
Tests. Rows in TestTheModuleAskingForTheRuleSetGetsEveryModulesPorts (no new test function; the repository is over its unit budget): the live case, an expose narrowing kept, a refused expose bounded to the mesh. Each fails without the fix. go vet (plain and -tags integration) clean; the unit suite (39 packages) passes.
Undo. Revert this pull request's merge commit.
Reviewed-by: mesh-code-reviewer@shanks at 17a4ac620c (two rounds)
Issue 1966, a recovery fix (instruction recovery-fixes-merge-and-tell; merged through the gate).
**Live case.** On novox, distribution's want moved to build 6e1dfaa8, whose manifest listens on 5100 and no longer publishes 5000, while novox's assignment layer still gives distribution ports {5000: 5100}. `GivenPorts` refused the setting, `JudgeSettings`/`LeftOut` left distribution out of the declaration, and `resolutionCompose` derived the filter only from the kept modules: port 5100, where the old store container still ran, closed from 07:46 to 09:24 UTC and every build failed `dial tcp 10.10.0.1:5100: i/o timeout`.
**Change.** `resolutionCompose` derives the filter from the composed modules plus the left-out modules still running. `Rules` reads every module's exposure through `exposureOf`; a left-out module whose exposure cannot be read opens no wider than the mesh (`noWiderThanTheMesh`), never at its manifest's default (ADR 0046 §5-6).
**Quick or thorough.** Quick, chosen: one place, what failed live, met once. Thorough, not built: compose a left-out module as what runs of it (`Carried`, as a held module is); it would also close opening a left-out module that never ran, and using the new manifest's listens rather than the running composition's.
**Tests.** Rows in `TestTheModuleAskingForTheRuleSetGetsEveryModulesPorts` (no new test function; the repository is over its unit budget): the live case, an `expose` narrowing kept, a refused `expose` bounded to the mesh. Each fails without the fix. `go vet` (plain and `-tags integration`) clean; the unit suite (39 packages) passes.
**Undo.** Revert this pull request's merge commit.
Reviewed-by: mesh-code-reviewer@shanks at 17a4ac620c07a70162a09f5e4e524b851b0c2eef (two rounds)
https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
A module left out of the declaration for a setting its new definition no
longer composes (ADR 0163 rule 6) keeps running what it ran, but
resolutionCompose dropped it from the modules the filter is derived from,
so the filter closed the ports it still serves. On novox, 2026-11-09
07:46-09:24 UTC, the artifact store's want at build 6e1dfaa8 (listens on
5100, no container publishes 5000) met the node layer's ports
{"5000": 5100}: GivenPorts refused it, distribution was left out, and
5100 closed while the old registry container served there; every build
failed "dial tcp 10.10.0.1:5100: i/o timeout".
The filter is now derived from the composed modules and the left-out
ones; a left-out module's settings (exposure) are still not read.
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Rules skipped a left-out module's expose and reaches, so its listens
opened at the manifest's default source and an operator's narrowing for
the node was dropped (ADR 0046). Its exposure is now read like any
module's (exposureOf); where it cannot be read for that module, its
listens open no wider than the mesh (noWiderThanTheMesh), never at the
manifest's default.
Left for the thorough fix, composing a left-out module as what runs of
it (Carried, as a held module is): the filter also opens for a left-out
module that never ran on the node, and it opens the new manifest's
listens rather than what the old composition runs.
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Deliverynovox/mesh-host@17a4ac620c07 — merged since 2026-11-09T09:49:16Z
Source — source.main moved to novox/mesh-host@7c483da93a. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-11-09 09:46 (new) → proposed (announced): novox/mesh-host#218's head announced
2026-11-09 09:46 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
2026-11-09 09:49 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-host@17a4ac620c07` — **merged** since 2026-11-09T09:49:16Z
**Source** — source.main moved to novox/mesh-host@7c483da93a03. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-11-09 09:46 (new) → proposed (announced): novox/mesh-host#218's head announced
- 2026-11-09 09:46 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
- 2026-11-09 09:49 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `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.
Issue 1966, a recovery fix (instruction recovery-fixes-merge-and-tell; merged through the gate).
Live case. On novox, distribution's want moved to build 6e1dfaa8, whose manifest listens on 5100 and no longer publishes 5000, while novox's assignment layer still gives distribution ports {5000: 5100}.
GivenPortsrefused the setting,JudgeSettings/LeftOutleft distribution out of the declaration, andresolutionComposederived the filter only from the kept modules: port 5100, where the old store container still ran, closed from 07:46 to 09:24 UTC and every build faileddial tcp 10.10.0.1:5100: i/o timeout.Change.
resolutionComposederives the filter from the composed modules plus the left-out modules still running.Rulesreads every module's exposure throughexposureOf; a left-out module whose exposure cannot be read opens no wider than the mesh (noWiderThanTheMesh), never at its manifest's default (ADR 0046 §5-6).Quick or thorough. Quick, chosen: one place, what failed live, met once. Thorough, not built: compose a left-out module as what runs of it (
Carried, as a held module is); it would also close opening a left-out module that never ran, and using the new manifest's listens rather than the running composition's.Tests. Rows in
TestTheModuleAskingForTheRuleSetGetsEveryModulesPorts(no new test function; the repository is over its unit budget): the live case, anexposenarrowing kept, a refusedexposebounded to the mesh. Each fails without the fix.go vet(plain and-tags integration) clean; the unit suite (39 packages) passes.Undo. Revert this pull request's merge commit.
Reviewed-by: mesh-code-reviewer@shanks at
17a4ac620c(two rounds)https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
A module left out of the declaration for a setting its new definition no longer composes (ADR 0163 rule 6) keeps running what it ran, but resolutionCompose dropped it from the modules the filter is derived from, so the filter closed the ports it still serves. On novox, 2026-11-09 07:46-09:24 UTC, the artifact store's want at build 6e1dfaa8 (listens on 5100, no container publishes 5000) met the node layer's ports {"5000": 5100}: GivenPorts refused it, distribution was left out, and 5100 closed while the old registry container served there; every build failed "dial tcp 10.10.0.1:5100: i/o timeout". The filter is now derived from the composed modules and the left-out ones; a left-out module's settings (exposure) are still not read. Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7iDelivery
novox/mesh-host@17a4ac620c07— merged since 2026-11-09T09:49:16ZSource — source.main moved to novox/mesh-host@7c483da93a. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.