Kept compositions follow config changes from a durable consumer, so going back to an earlier build keeps today's config (issue 1945, ADR 0545) #466

Merged
jschoubben merged 7 commits from fix/1945-kept-compositions-follow-config into main 2026-10-25 18:37:58 +00:00
Member

Research 072 piece moved: the composer reacts (milestone 2), config heard as events from mesh-config's bucket instead of a pass.

Why

A kept (older) composition was never composed again when config changed (composed_writer.go: 'an older one is never written again'), so any rollback silently reverted every config value: on 2026-10-25 g14's mesh-build-go capacity fell back to 0 although mesh-config resolved 2.

What

  • A durable consumer mesh-controller-config-follow on KV_mesh-config_resolved (deliver last per subject: each value once when made, then each write), gathered 1 s, acked after the touched node and the touched modules' kept compositions are composed; refused 30 s on failure, at once on stop; config-not-followed raised and cleared.
  • followKept composes every kept fingerprint from its own build's manifest with today's inputs; writeComposed writes only a changed digest; per-write node lock; stops on the controller's stop.
  • Its delivery group member mesh-delivery (same branch) makes the assigner follow a kept composition's new digest.

Also

This branch carries mesh-controller #465's commits (merged); a merge of it gives a NEW controller fingerprint, so its build is a new ask (the build of #465 at 9fe60d08 is stuck as a dead-lettered ask since the steps bucket was full).

Tests

go test -race ./... and go vet -tags integration ./... pass; test functions 1765 -> 1764. Recovery mode: no try; merge by hand.

Issue: issue 1945.

Reviewed-by: reviewer-kept2@shanks at ff3cc47027

Research 072 piece moved: the composer reacts (milestone 2), config heard as events from mesh-config's bucket instead of a pass. ## Why A kept (older) composition was never composed again when config changed (composed_writer.go: 'an older one is never written again'), so any rollback silently reverted every config value: on 2026-10-25 g14's mesh-build-go capacity fell back to 0 although mesh-config resolved 2. ## What - A durable consumer `mesh-controller-config-follow` on KV_mesh-config_resolved (deliver last per subject: each value once when made, then each write), gathered 1 s, acked after the touched node and the touched modules' kept compositions are composed; refused 30 s on failure, at once on stop; `config-not-followed` raised and cleared. - followKept composes every kept fingerprint from its own build's manifest with today's inputs; writeComposed writes only a changed digest; per-write node lock; stops on the controller's stop. - Its delivery group member mesh-delivery (same branch) makes the assigner follow a kept composition's new digest. ## Also This branch carries mesh-controller #465's commits (merged); a merge of it gives a NEW controller fingerprint, so its build is a new ask (the build of #465 at 9fe60d08 is stuck as a dead-lettered ask since the steps bucket was full). ## Tests go test -race ./... and go vet -tags integration ./... pass; test functions 1765 -> 1764. Recovery mode: no try; merge by hand. Issue: issue 1945. Reviewed-by: reviewer-kept2@shanks at ff3cc47027e04e7d558259447fdf6f9620f9a552
mesh-tools added 7 commits 2026-10-25 18:37:16 +00:00
The controller composed a module only at the fingerprint it is registered at,
so each of the up to five compositions kept for going back carried the config
of the moment it was made: a want back to an earlier mesh-build-go on g14 put
its capacity back to 0. Nothing composed a node when mesh-config's resolved
values changed, either.

Now a write of mesh-config_resolved (<node>.<module>.<key>), heard from that
bucket's watch and gathered for a second, drops the controller's 5 s reading
of the values, composes the node, and composes every kept fingerprint of the
touched modules on that node again from its own build's manifest with today's
inputs, writing only the compositions whose digest differs. A starting
controller does it once for every node, for a change no controller heard.
The two replaced-controller tests are one table test with the kept cases.
Research 072: milestone 2, the composer reacting to the change of an input.
The start composed every kept composition of every module on every node, each a
whole node composed in memory under the node's lock: 10 to 50 minutes at a
start, holding take-ins back. Now the writes of mesh-config_resolved are read
from the durable consumer mesh-controller-config-follow, acknowledged once the
change is composed, so a restart composes again only what was written since
the last change handled, and a first start nothing it did not hear. The node's
lock is taken for each write alone. A consumer that cannot be made or read
raises config-not-followed and is tried again a minute later, cleared once it
reads. The controller's account is granted that consumer's acknowledgements
where mesh-config serves, as its verb is.
Research 072: milestone 2, the composer reacting to the change of an input.
The config consumer delivered new writes only, and mesh-config never writes an
unchanged value again: g14's mesh-build-go capacity of 2, set before this
release, would never reach its kept compositions carrying 0. A newly made
durable now reads each key's last value once, through the same gather,
per-write lock and acknowledgement; its deliver policy is set before its first
delivery. Acknowledgements are synchronous and sent past the stop, and one the
bus refuses is said by its key.
Research 072: milestone 2, the composer reacting to the change of an input.
Let the kept compositions' pass end at the stop (issue 1945, ADR 0545, review 3)
mesh/delivery held for a person: merged without a passing check: only a person decides what follows
mesh/delivery-group group fix/1945-kept-compositions-follow-config held: a member is held: novox/mesh-controller@ff3cc47027e0 (merged without a passing check: …
mesh/check failed: integration: github.com/novox/mesh-controller/cmd/mesh-controller.TestTheDeclarationsStreamGoesOnceEveryNodeRunsTheNewEngine: with …
ff3cc47027
followKept went on composing every kept key, and the config consumer every
touched node, after the controller was told to stop. Both now check the stop
before each key and each node; the writes of an unfinished batch are refused
at once, so the next controller takes them.
Research 072: milestone 2, the composer reacting to the change of an input.
Author
Member

Delivery novox/mesh-controller@ff3cc47027e0 — held since 2026-10-25T18:38:00Z

Held for a person: merged without a passing check: only a person decides what follows — the merge reached the trunk without a passing check.

Source — source.main moved to novox/mesh-controller@40034be479. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.

Group fix/1945-kept-compositions-follow-config: novox/mesh-controller@ff3cc47027, novox/mesh-delivery@73779a5dd1

Transitions

  • 2026-10-25 18:37 (new) → proposed (announced): novox/mesh-controller#466's head announced
  • 2026-10-25 18:38 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides what follows

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-controller@ff3cc47027e0` — **held** since 2026-10-25T18:38:00Z Held for a person: merged without a passing check: only a person decides what follows — the merge reached the trunk without a passing check. **Source** — source.main moved to novox/mesh-controller@40034be479f8. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Group** `fix/1945-kept-compositions-follow-config`: novox/mesh-controller@ff3cc47027e0, novox/mesh-delivery@73779a5dd180 **Transitions** - 2026-10-25 18:37 (new) → proposed (announced): novox/mesh-controller#466's head announced - 2026-10-25 18:38 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides what follows The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
jschoubben merged commit 40034be479 into main 2026-10-25 18:37:58 +00:00
jschoubben deleted branch fix/1945-kept-compositions-follow-config 2026-10-25 18:37:58 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#466