57/F3: Keep the assignments and each module's declared config on the bus (issue 652) #315

Open
mesh-admin wants to merge 8 commits from pkg/57-f3-assignment-buckets into feat/57-config-and-provisioning
Contributor

What changed

  • Two record mirrors (ADR 0289, design 54; ADR 0356), asserted with the controller's own buckets at its start: mesh-controller_assignments, key <node>.<module>, value {node, module, assigned}; and mesh-controller_declared-config, key <module>, value {module, settings} where each declared key is built from named fields: kind, default, why (ADR 0289 §12). A field a manifest declaration gains does not reach the bus until it is listed (package K1 widens it deliberately). Every registered module has a key ({} when it declares none); a module no longer registered loses its key. One value per key, no age, 64 KiB a value, 64 MiB a bucket, a purge marker lives a day.
  • The writer (internal/recordmirror): every pass asks for the lease first and writes nothing without it (ErrNotHeld); it re-reads the bucket every pass and compares it byte for byte with the store, so a value written behind its back (a former lease holder) is put back from the store; it asks for the lease again before each write and each removal; it writes by compare-and-set, purges a key whose record is gone, and raises one event after each successful write: assignment-changed / declared-config-changed on the controller's seat (mirror, key, change, the top-level fields that changed, revision, epoch, time; never the value). A refused event is tried once more, then counted lost and logged.
  • The serving controller (cmd/mesh-controller/record_mirrors.go) runs one pass for both mirrors every 10 s from the store, only while it holds the lease.
  • Grants: the controller's composition gains the two buckets and two events (writers table rows, ControllerStates, the seat's emits). A module reads them through reads as mesh-controller.assignments / mesh-controller.declared-config; catalogue.ControllerMirrors (the controller's list of its mirrors) lets that read pass the catalogue check. Nobody else may write them.
  • TestNoPathDeletesALogOrABucket allows Purge in internal/recordmirror (a removal is a purge of the key, design 54 §2).
  • The captured genesis template is mesh-host c8920622 (mesh-host#110, merged into mesh-host's feat/57).

The record

ADR 0356 is accepted (version 5). It records where this differs from ADR 0289 and design 54: the mirrors are written by a pass over committed records at most 10 s apart (§1); the writer reads its own mirror to write it (§2); the mirrors are listed by the controller, not declared as state in its manifest, granted to readers through reads and not reported as undeclared (§3); and the declared-config mirror is a sixth mirror (§4). Each of its seven checks has a test below.

Why

mesh-config (package K3, issue 662) resolves a module's config values per node from which module runs where and what each module declares (ADR 0348 clauses 2, 4); both lived only in the controller's store.

How it is proven

  • internal/recordmirror:
    • TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent (store and real bus; in testdata/store-tests): a registration and an assignment each change one key and raise one event; the same records again change nothing; a changed declaration names settings; an unassignment and a module no longer registered are each one purge and one removed; the declaration's bytes are its named fields.
    • TestNatsAMirrorChangesOneKeyAndRaisesOneEventPerChange, TestNatsAWriterStartedAgainWritesOnlyWhatDiffers, TestNatsAWriteRefusedByCompareAndSetReadsAgain.
    • TestNatsAForeignWriteIsCorrectedOnTheNextPass (ADR 0356 §2).
    • TestNatsAWriterWithoutTheLeaseWritesNothing (no lease at the pass, and lost mid-pass) and TestNatsARemovalWithoutTheLeaseRemovesNothing (the removal loop's own check).
    • TestOnlyTheAuditAndAMirrorsWriterReadAMirror (ADR 0289 §19 as ADR 0356 §2 changes it). It catches a name standing for a mirror qualified by its package under any import name (broker.AssignmentsBucket, an aliased b.DeclaredConfigBucket, recordmirror.Assignments), the same names bare in a file of package broker or recordmirror, and a string literal holding a mirror's bucket name, in any non-test file of cmd and internal outside the allowed files (the mirrors' definition, grants and writer). It does not catch a bucket name built at run time (BucketName(ControllerSeat, "assignments"), concatenated literals) or a mirror reached through a value handed over from an allowed file; the test says so. In package broker, declaring a field named like a mirror is flagged, on the safe side.
    • TestTheReaderTestFindsPlantedReaders: each of those planted readers (qualified, aliased, bare in broker, nested bare, literal) is named; allowed files and a selector on a value are not.
    • TestAKeyTheBusCannotHoldIsRefusedAlone, TestTheFieldsThatChangedAreNamed.
  • internal/inventory TestTheDeclaredConfigMirrorCarriesOnlyItsListedFields (ADR 0289 §12): fails on a declaration field the list does not name.
  • internal/broker: TestAModuleReadsTheControllersMirrorsAndWritesNone, TestAListedMirrorIsNotReportedAsUndeclared (ADR 0201 §16), TestTheMirrorsListAndTheWritersTableAgree; the states agreement test holds the catalogue's and the bus's mirror lists equal.
  • internal/catalogue TestAReadOfTheControllersMirrorsIsAReadOfKeptState.
  • Commands run on this head (7a691edd) merged with feat/57 at its head (dc36536): git merge (no conflict), then MESH_TEST_POSTGRES=… sh merge-check.sh: exit 0 (gofmt, go vet, the whole suite under -race, every listed store test against a throwaway PostgreSQL over TCP).

Deliberately left

  • Design 54 §4's audit (D17, H6, mirror-drifted, mirror-event-lost), the other three mirrors, the rest of an assignment's fields, and cutting a value over 64 KiB to its summary (ADR 0289 §16): issue 419. The audit joins the reader test's allowed files when it is built.
  • Reading config (with settings as its alias) once the manifest field is renamed, and listing the new declaration fields: package K1 (issue 660), in internal/inventory/mirrors.go.

Reviewer's checklist

  1. Does what issue 652 and design 57's F3 say, as ADR 0356 records it. Nothing outside it beyond the grants and tests it needs.
  2. The done-when proof is new and fails before (no buckets, no writer). Existing tests changed, and why: the writers-table row list, the controller's bucket grant list, the states agreement, the golden composition and the genesis capture each gain the two mirrors; the no-purge test gains the decided exception.
  3. No module's composition changes: only the controller principal's grant (golden composed.conf, one line).
  4. No secret in any bucket, event, fixture or commit: a value is built from named fields only, and the catalogue refuses a default for a secret-named key. No database change.
  5. No new manifest or declaration field.
  6. gofmt, go vet, go test ./... and merge-check.sh: pass, on the merged tree.
  7. Words: record mirror (glossary), assignment, config value, declared config.
## What changed - **Two record mirrors** (ADR 0289, design 54; ADR 0356), asserted with the controller's own buckets at its start: `mesh-controller_assignments`, key `<node>.<module>`, value `{node, module, assigned}`; and `mesh-controller_declared-config`, key `<module>`, value `{module, settings}` where each declared key is built from **named fields: `kind`, `default`, `why`** (ADR 0289 §12). A field a manifest declaration gains does not reach the bus until it is listed (package K1 widens it deliberately). Every registered module has a key (`{}` when it declares none); a module no longer registered loses its key. One value per key, no age, 64 KiB a value, 64 MiB a bucket, a purge marker lives a day. - **The writer** (`internal/recordmirror`): every pass **asks for the lease first** and writes nothing without it (`ErrNotHeld`); it **re-reads the bucket every pass** and compares it byte for byte with the store, so a value written behind its back (a former lease holder) is put back from the store; it **asks for the lease again before each write and each removal**; it writes by compare-and-set, purges a key whose record is gone, and raises one event after each successful write: `assignment-changed` / `declared-config-changed` on the controller's seat (mirror, key, change, the top-level fields that changed, revision, epoch, time; never the value). A refused event is tried once more, then counted lost and logged. - **The serving controller** (`cmd/mesh-controller/record_mirrors.go`) runs one pass for both mirrors every 10 s from the store, only while it holds the lease. - **Grants**: the controller's composition gains the two buckets and two events (writers table rows, `ControllerStates`, the seat's emits). A module reads them through `reads` as `mesh-controller.assignments` / `mesh-controller.declared-config`; `catalogue.ControllerMirrors` (the controller's list of its mirrors) lets that read pass the catalogue check. Nobody else may write them. - `TestNoPathDeletesALogOrABucket` allows `Purge` in `internal/recordmirror` (a removal is a purge of the key, design 54 §2). - The captured genesis template is mesh-host c8920622 (mesh-host#110, merged into mesh-host's feat/57). ## The record **ADR 0356 is accepted (version 5).** It records where this differs from ADR 0289 and design 54: the mirrors are written by a pass over committed records at most 10 s apart (§1); the writer reads its own mirror to write it (§2); the mirrors are listed by the controller, not declared as state in its manifest, granted to readers through `reads` and not reported as undeclared (§3); and the declared-config mirror is a sixth mirror (§4). Each of its seven checks has a test below. ## Why mesh-config (package K3, issue 662) resolves a module's config values per node from which module runs where and what each module declares (ADR 0348 clauses 2, 4); both lived only in the controller's store. ## How it is proven - `internal/recordmirror`: - `TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent` (store and real bus; in `testdata/store-tests`): a registration and an assignment each change one key and raise one event; the same records again change nothing; a changed declaration names `settings`; an unassignment and a module no longer registered are each one purge and one `removed`; the declaration's bytes are its named fields. - `TestNatsAMirrorChangesOneKeyAndRaisesOneEventPerChange`, `TestNatsAWriterStartedAgainWritesOnlyWhatDiffers`, `TestNatsAWriteRefusedByCompareAndSetReadsAgain`. - `TestNatsAForeignWriteIsCorrectedOnTheNextPass` (ADR 0356 §2). - `TestNatsAWriterWithoutTheLeaseWritesNothing` (no lease at the pass, and lost mid-pass) and `TestNatsARemovalWithoutTheLeaseRemovesNothing` (the removal loop's own check). - `TestOnlyTheAuditAndAMirrorsWriterReadAMirror` (ADR 0289 §19 as ADR 0356 §2 changes it). **It catches** a name standing for a mirror qualified by its package under any import name (`broker.AssignmentsBucket`, an aliased `b.DeclaredConfigBucket`, `recordmirror.Assignments`), the same names bare in a file of package broker or recordmirror, and a string literal holding a mirror's bucket name, in any non-test file of `cmd` and `internal` outside the allowed files (the mirrors' definition, grants and writer). **It does not catch** a bucket name built at run time (`BucketName(ControllerSeat, "assignments")`, concatenated literals) or a mirror reached through a value handed over from an allowed file; the test says so. In package broker, declaring a field named like a mirror is flagged, on the safe side. - `TestTheReaderTestFindsPlantedReaders`: each of those planted readers (qualified, aliased, bare in broker, nested bare, literal) is named; allowed files and a selector on a value are not. - `TestAKeyTheBusCannotHoldIsRefusedAlone`, `TestTheFieldsThatChangedAreNamed`. - `internal/inventory` `TestTheDeclaredConfigMirrorCarriesOnlyItsListedFields` (ADR 0289 §12): fails on a declaration field the list does not name. - `internal/broker`: `TestAModuleReadsTheControllersMirrorsAndWritesNone`, `TestAListedMirrorIsNotReportedAsUndeclared` (ADR 0201 §16), `TestTheMirrorsListAndTheWritersTableAgree`; the states agreement test holds the catalogue's and the bus's mirror lists equal. - `internal/catalogue` `TestAReadOfTheControllersMirrorsIsAReadOfKeptState`. - **Commands run on this head (7a691edd) merged with feat/57 at its head (dc36536)**: `git merge` (no conflict), then `MESH_TEST_POSTGRES=… sh merge-check.sh`: exit 0 (gofmt, go vet, the whole suite under -race, every listed store test against a throwaway PostgreSQL over TCP). ## Deliberately left - Design 54 §4's audit (D17, H6, `mirror-drifted`, `mirror-event-lost`), the other three mirrors, the rest of an assignment's fields, and cutting a value over 64 KiB to its summary (ADR 0289 §16): issue 419. The audit joins the reader test's allowed files when it is built. - Reading `config` (with `settings` as its alias) once the manifest field is renamed, and listing the new declaration fields: package K1 (issue 660), in `internal/inventory/mirrors.go`. ## Reviewer's checklist 1. Does what issue 652 and design 57's F3 say, as ADR 0356 records it. Nothing outside it beyond the grants and tests it needs. 2. The done-when proof is new and fails before (no buckets, no writer). Existing tests changed, and why: the writers-table row list, the controller's bucket grant list, the states agreement, the golden composition and the genesis capture each gain the two mirrors; the no-purge test gains the decided exception. 3. No module's composition changes: only the controller principal's grant (golden `composed.conf`, one line). 4. No secret in any bucket, event, fixture or commit: a value is built from named fields only, and the catalogue refuses a default for a secret-named key. No database change. 5. No new manifest or declaration field. 6. gofmt, go vet, go test ./... and merge-check.sh: pass, on the merged tree. 7. Words: record mirror (glossary), assignment, config value, declared config.
mesh-admin added 5 commits 2026-10-14 00:35:07 +00:00
mesh-config resolves a module's config values per node from which module runs
where and what each registered module declares, and both lived only in the
controller's store (hq issue 652, design 57 F3). The controller now keeps two
record mirrors, mesh-controller_assignments (<node>.<module>) and
mesh-controller_declared-config (<module>), built from the store by the lease
holder every ten seconds and written only where a value differs, by
compare-and-set, with one assignment-changed or declared-config-changed per
write and a purge said as removed (ADR 0289, design 54 §2-3). A module reads
them through `reads` as mesh-controller.<mirror>; the writers table keeps every
other writer out. Neither holds a secret: an assignment names its node and
module, a declaration is what the public manifest declares.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The writer behind the assignments and declared-config mirrors (hq issue 652,
ADR 0289, design 54 §2-3): filled from the bucket on its first pass, it
compares each value byte for byte, writes by compare-and-set, purges a key
whose record is gone with a marker that lives a day, and says each write once
after it succeeded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An assignment and a registration each change exactly one key and raise exactly
one event; the same records written again change nothing (hq issue 652, the
package's done-when). Listed as a store test, so the merge check runs it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The controller's composition gains the two mirror buckets and their events, so
the golden composition moves, and the genesis template is captured again from
mesh-host's branch of this package, whose installer user list carries them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Capture the genesis template from mesh-host's branch of this package
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
8563b90918
The template at mesh-host c8920622 carries the controller's grant to write the
two record mirrors and say their events; the genesis template test holds the
controller's composition to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Contributor

Delivery novox/mesh-controller@7a691edd3a6c — rejected since 2026-10-14T01:45:20Z

Delivery plan — builds nothing: the change touches no module of the mesh's graph

Transitions

  • 2026-10-14 01:40 (new) → proposed (announced): novox/mesh-controller#315's head announced
  • 2026-10-14 01:45 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
  • 2026-10-14 01:45 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed

The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@7a691edd3a6c` — **rejected** since 2026-10-14T01:45:20Z **Delivery plan** — builds nothing: the change touches no module of the mesh's graph **Transitions** - 2026-10-14 01:40 (new) → proposed (announced): novox/mesh-controller#315's head announced - 2026-10-14 01:45 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit - 2026-10-14 01:45 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at 8563b909
Judged: head 8563b90918fb merged into trunk bfc79c64d989; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main 2d18f438c516, mesh-host 1a2677882380, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — the change touches no module of the mesh's graph
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s)

Run by the build seat on ace as build-1791938134235979340 (builds --log build-1791938134235979340).

--- its merge-check.sh (go toolchain)
ok  	github.com/novox/mesh-controller/cmd/mesh-builder	1.087s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	154.698s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.010s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.018s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.056s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.151s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.097s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	3.086s
ok  	github.com/novox/mesh-controller/internal/builder	34.366s
ok  	github.com/novox/mesh-controller/internal/catalogue	7.756s
ok  	github.com/novox/mesh-controller/internal/conditions	2.582s
ok  	github.com/novox/mesh-controller/internal/envfile	1.058s
ok  	github.com/novox/mesh-controller/internal/facts	1.060s
ok  	github.com/novox/mesh-controller/internal/identity	4.440s
ok  	github.com/novox/mesh-controller/internal/inventory	29.912s
ok  	github.com/novox/mesh-controller/internal/lease	17.737s
ok  	github.com/novox/mesh-controller/internal/licences	3.640s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.088s
ok  	github.com/novox/mesh-controller/internal/link	58.573s
ok  	github.com/novox/mesh-controller/internal/lint	2.371s
ok  	github.com/novox/mesh-controller/internal/outward	1.117s
ok  	github.com/novox/mesh-controller/internal/overlay	1.073s
ok  	github.com/novox/mesh-controller/internal/recordmirror	7.618s
ok  	github.com/novox/mesh-controller/internal/secrets	1.468s
ok  	github.com/novox/mesh-controller/internal/store	3.335s
ok  	github.com/novox/mesh-controller/internal/testbus	1.194s
ok  	github.com/novox/mesh-controller/internal/token	1.020s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL	github.com/novox/mesh-controller/internal/broker	3.086s
**Merge check** at `8563b909` Judged: head `8563b90918fb` merged into trunk `bfc79c64d989`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `2d18f438c516`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — the change touches no module of the mesh's graph - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s) Run by the build seat on ace as `build-1791938134235979340` (`builds --log build-1791938134235979340`). ``` --- its merge-check.sh (go toolchain) ok github.com/novox/mesh-controller/cmd/mesh-builder 1.087s ok github.com/novox/mesh-controller/cmd/mesh-controller 154.698s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.010s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.018s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.056s ok github.com/novox/mesh-controller/examples/route-proxy 1.151s ok github.com/novox/mesh-controller/internal/artifacts 1.097s ? github.com/novox/mesh-controller/internal/beside [no test files] --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL FAIL github.com/novox/mesh-controller/internal/broker 3.086s ok github.com/novox/mesh-controller/internal/builder 34.366s ok github.com/novox/mesh-controller/internal/catalogue 7.756s ok github.com/novox/mesh-controller/internal/conditions 2.582s ok github.com/novox/mesh-controller/internal/envfile 1.058s ok github.com/novox/mesh-controller/internal/facts 1.060s ok github.com/novox/mesh-controller/internal/identity 4.440s ok github.com/novox/mesh-controller/internal/inventory 29.912s ok github.com/novox/mesh-controller/internal/lease 17.737s ok github.com/novox/mesh-controller/internal/licences 3.640s ok github.com/novox/mesh-controller/internal/licences/adapters 1.088s ok github.com/novox/mesh-controller/internal/link 58.573s ok github.com/novox/mesh-controller/internal/lint 2.371s ok github.com/novox/mesh-controller/internal/outward 1.117s ok github.com/novox/mesh-controller/internal/overlay 1.073s ok github.com/novox/mesh-controller/internal/recordmirror 7.618s ok github.com/novox/mesh-controller/internal/secrets 1.468s ok github.com/novox/mesh-controller/internal/store 3.335s ok github.com/novox/mesh-controller/internal/testbus 1.194s ok github.com/novox/mesh-controller/internal/token 1.020s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL github.com/novox/mesh-controller/internal/broker 3.086s ```
mesh-admin left a comment
Author
Contributor

Verdict: CHANGES at 8563b90918

Independent review of package F3 (issue 652) at head 8563b90918, together with mesh-host#110 at c89206225165.

Checks I ran in my own worktree: gofmt -l clean; go vet clean; sh merge-check.sh exit 0 against a throwaway PostgreSQL (MESH_TEST_POSTGRES over 127.0.0.1, stopped afterwards), under -race; the bus tests ran on the embedded nats-server v2.11.17 (internal/testbus). TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent passed. The forge's mesh/repo-check is red on this head (TestTheInstallersFirstUserList...) because the check clones mesh-host's feat/57 beside it, which lacks mesh-host#110; I reproduced that: the test fails with mesh-host at origin/feat/57 and passes with mesh-host at c8920622.

Must change:

  1. internal/recordmirror/mirror.go:136 and :256 — the writer's memory is filled once and then trusted for ever. A write by anyone else (exactly ADR 0289 §10's former lease holder) is never corrected while the store's record stays the same: I wrote {"a":9} behind a writer's back after it wrote {"a":1}, and the next Sync with the store still at {"a":1} did {Written:0} and left {"a":9} in the bucket. With no audit yet (D17/H6 are issue 419), nothing repairs it. Since this design already re-reads the store every 10 s, refill the memory when the bucket's last sequence differs from the last one this writer wrote (one Status call per pass), or refill every pass; add the test.
  2. internal/recordmirror/mirror.go:200-230 — the Writer writes when Holds says false; it consults Holds only after a compare-and-set refusal. A Writer with Holds: func() bool { return false } wrote 1 key in my probe. Design 54 §2 and ADR 0289 §9: a controller without the lease writes none. Check holds() before each put and purge (cheap: a mutex and a clock), and test it.
  3. internal/inventory/mirrors.go:33 and :63 — the declared-config value carries settings whole as raw JSON. ADR 0289 §12: each value is built from a list of named fields, and a test fails on a field the list does not name. Today the stored manifest is the marshalled SettingDeclaration (kind, default, why), and a default is refused for secret-named keys (setting_defaults.go), so no secret can reach the bucket today; but K1 (issue 660) adds fields and renames settings to config, and this value would carry them unreviewed. Build it from a struct of its own with the listed fields, and add the test the ADR names.
  4. Record, not code: two deviations from accepted clauses need a correction in the knowledge base (knowledge-base.propose with insight), named in this PR. (a) ADR 0289 §18 / design 54 §5 say "declared as the controller's state in its manifest". I agree with the deviation: a state declaration grants the mesh-controller module's own principal (KindModule) publish on $KV.<bucket>.>, which the writers table rows this PR adds would refuse at composition; readers' grants come from bucketOfRead, not the declaration. catalogue.ControllerMirrors plus the agreement test is sound. (b) ADR 0289 §7 / design 54 §2 say "after each commit"; a 10 s pass from the store is sound (only committed state is read, every change path is covered, it stays inside §38's reader bound), but the record must say so.

Should (may follow, issue 419 or K1):

  1. internal/broker/controller_buckets.go:69 — ADR 0289 §16 (a value over 64 KiB is cut to its summary and says so) is not built; a declaration over the cap fails its put every 10 s.
  2. internal/inventory/mirrors.go:63 — K1 must move this read to config (with settings as the alias); say so in issue 660.

Endless rewrite loop: none found. Values are deterministic (time in UTC, maps sorted, numbers as written), the refused-write path takes an equal value's revision without writing, and nothing a mirror write causes changes the store.

Verdict: CHANGES at 8563b90918fb Independent review of package F3 (issue 652) at head 8563b90918fb153902b611608968e4d8370766be, together with mesh-host#110 at c89206225165. Checks I ran in my own worktree: gofmt -l clean; go vet clean; `sh merge-check.sh` exit 0 against a throwaway PostgreSQL (MESH_TEST_POSTGRES over 127.0.0.1, stopped afterwards), under -race; the bus tests ran on the embedded nats-server v2.11.17 (internal/testbus). TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent passed. The forge's mesh/repo-check is red on this head (TestTheInstallersFirstUserList...) because the check clones mesh-host's feat/57 beside it, which lacks mesh-host#110; I reproduced that: the test fails with mesh-host at origin/feat/57 and passes with mesh-host at c8920622. Must change: 1. internal/recordmirror/mirror.go:136 and :256 — the writer's memory is filled once and then trusted for ever. A write by anyone else (exactly ADR 0289 §10's former lease holder) is never corrected while the store's record stays the same: I wrote `{"a":9}` behind a writer's back after it wrote `{"a":1}`, and the next Sync with the store still at `{"a":1}` did `{Written:0}` and left `{"a":9}` in the bucket. With no audit yet (D17/H6 are issue 419), nothing repairs it. Since this design already re-reads the store every 10 s, refill the memory when the bucket's last sequence differs from the last one this writer wrote (one Status call per pass), or refill every pass; add the test. 2. internal/recordmirror/mirror.go:200-230 — the Writer writes when `Holds` says false; it consults `Holds` only after a compare-and-set refusal. A Writer with `Holds: func() bool { return false }` wrote 1 key in my probe. Design 54 §2 and ADR 0289 §9: a controller without the lease writes none. Check `holds()` before each put and purge (cheap: a mutex and a clock), and test it. 3. internal/inventory/mirrors.go:33 and :63 — the declared-config value carries `settings` whole as raw JSON. ADR 0289 §12: each value is built from a list of named fields, and a test fails on a field the list does not name. Today the stored manifest is the marshalled `SettingDeclaration` (kind, default, why), and a default is refused for secret-named keys (setting_defaults.go), so no secret can reach the bucket today; but K1 (issue 660) adds fields and renames `settings` to `config`, and this value would carry them unreviewed. Build it from a struct of its own with the listed fields, and add the test the ADR names. 4. Record, not code: two deviations from accepted clauses need a correction in the knowledge base (`knowledge-base.propose` with `insight`), named in this PR. (a) ADR 0289 §18 / design 54 §5 say "declared as the controller's state in its manifest". I agree with the deviation: a `state` declaration grants the mesh-controller module's own principal (KindModule) publish on `$KV.<bucket>.>`, which the writers table rows this PR adds would refuse at composition; readers' grants come from `bucketOfRead`, not the declaration. `catalogue.ControllerMirrors` plus the agreement test is sound. (b) ADR 0289 §7 / design 54 §2 say "after each commit"; a 10 s pass from the store is sound (only committed state is read, every change path is covered, it stays inside §38's reader bound), but the record must say so. Should (may follow, issue 419 or K1): 5. internal/broker/controller_buckets.go:69 — ADR 0289 §16 (a value over 64 KiB is cut to its summary and says so) is not built; a declaration over the cap fails its put every 10 s. 6. internal/inventory/mirrors.go:63 — K1 must move this read to `config` (with `settings` as the alias); say so in issue 660. Endless rewrite loop: none found. Values are deterministic (time in UTC, maps sorted, numbers as written), the refused-write path takes an equal value's revision without writing, and nothing a mirror write causes changes the store.
mesh-admin added 1 commit 2026-10-14 01:01:03 +00:00
Correct a mirror written behind the writer's back, and write none without the lease
mesh/merge-gate out of date: judged against trunk 617881c3093d, the trunk is now 71362c196dbc; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk 617881c3093d, the trunk is now 71362c196dbc; judged again on a recheck or when it is merged
mesh/delivery superseded: a newer head of the same pull request
69367aa786
Review of mesh-controller#315 (hq issue 652): the writer trusted the bucket as
it read it once, so a former lease holder's write stayed for good; it wrote
without the lease, asking only after a refused compare-and-set; and the
declared config carried a manifest's declarations whole, so a field the
manifest gains would reach the bus unreviewed (ADR 0289 §9, §10, §12). Every
pass now reads the bucket and writes back the store's value where it differs,
asks for the lease before the pass and before every write, and a declaration
is mirrored as its listed fields (kind, default, why), with a test that fails
on a declaration field the list does not name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Contributor

Merge check at 69367aa7
Judged: head 69367aa78642 merged into trunk 617881c3093d; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main df9e5728a925, mesh-host 1a2677882380, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — the change touches no module of the mesh's graph
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s)

Run by the build seat on ace as build-1791939690718064235 (builds --log build-1791939690718064235).

--- its merge-check.sh (go toolchain)
ok  	github.com/novox/mesh-controller/cmd/mesh-builder	1.081s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	158.656s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.020s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.029s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.021s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.127s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.067s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	2.976s
ok  	github.com/novox/mesh-controller/internal/builder	33.338s
ok  	github.com/novox/mesh-controller/internal/catalogue	7.588s
ok  	github.com/novox/mesh-controller/internal/conditions	2.543s
ok  	github.com/novox/mesh-controller/internal/envfile	1.029s
ok  	github.com/novox/mesh-controller/internal/facts	1.027s
ok  	github.com/novox/mesh-controller/internal/identity	4.274s
ok  	github.com/novox/mesh-controller/internal/inventory	30.010s
ok  	github.com/novox/mesh-controller/internal/lease	17.700s
ok  	github.com/novox/mesh-controller/internal/licences	3.522s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.050s
ok  	github.com/novox/mesh-controller/internal/link	57.813s
ok  	github.com/novox/mesh-controller/internal/lint	2.301s
ok  	github.com/novox/mesh-controller/internal/outward	1.086s
ok  	github.com/novox/mesh-controller/internal/overlay	1.067s
ok  	github.com/novox/mesh-controller/internal/recordmirror	8.016s
ok  	github.com/novox/mesh-controller/internal/secrets	1.426s
ok  	github.com/novox/mesh-controller/internal/store	3.258s
ok  	github.com/novox/mesh-controller/internal/testbus	1.180s
ok  	github.com/novox/mesh-controller/internal/token	1.019s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL	github.com/novox/mesh-controller/internal/broker	2.976s

Out of date when it landed: out of date: judged against trunk 617881c309, the trunk is now 71362c196dbc; judged again on a recheck or when it is merged

**Merge check** at `69367aa7` Judged: head `69367aa78642` merged into trunk `617881c3093d`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `df9e5728a925`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — the change touches no module of the mesh's graph - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s) Run by the build seat on ace as `build-1791939690718064235` (`builds --log build-1791939690718064235`). ``` --- its merge-check.sh (go toolchain) ok github.com/novox/mesh-controller/cmd/mesh-builder 1.081s ok github.com/novox/mesh-controller/cmd/mesh-controller 158.656s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.029s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.021s ok github.com/novox/mesh-controller/examples/route-proxy 1.127s ok github.com/novox/mesh-controller/internal/artifacts 1.067s ? github.com/novox/mesh-controller/internal/beside [no test files] --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL FAIL github.com/novox/mesh-controller/internal/broker 2.976s ok github.com/novox/mesh-controller/internal/builder 33.338s ok github.com/novox/mesh-controller/internal/catalogue 7.588s ok github.com/novox/mesh-controller/internal/conditions 2.543s ok github.com/novox/mesh-controller/internal/envfile 1.029s ok github.com/novox/mesh-controller/internal/facts 1.027s ok github.com/novox/mesh-controller/internal/identity 4.274s ok github.com/novox/mesh-controller/internal/inventory 30.010s ok github.com/novox/mesh-controller/internal/lease 17.700s ok github.com/novox/mesh-controller/internal/licences 3.522s ok github.com/novox/mesh-controller/internal/licences/adapters 1.050s ok github.com/novox/mesh-controller/internal/link 57.813s ok github.com/novox/mesh-controller/internal/lint 2.301s ok github.com/novox/mesh-controller/internal/outward 1.086s ok github.com/novox/mesh-controller/internal/overlay 1.067s ok github.com/novox/mesh-controller/internal/recordmirror 8.016s ok github.com/novox/mesh-controller/internal/secrets 1.426s ok github.com/novox/mesh-controller/internal/store 3.258s ok github.com/novox/mesh-controller/internal/testbus 1.180s ok github.com/novox/mesh-controller/internal/token 1.019s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL github.com/novox/mesh-controller/internal/broker 2.976s ``` **Out of date when it landed**: out of date: judged against trunk 617881c3093d, the trunk is now 71362c196dbc; judged again on a recheck or when it is merged
mesh-admin left a comment
Author
Contributor

Verdict: CHANGES at 69367aa786

Second review of package F3 (issue 652) at head 69367aa786, following review 246. The code at this head needs no change. What must change is the base, the record and this pull request's description.

Checks I ran in my own worktree: gofmt -l is clean. go vet is clean. sh merge-check.sh exited 0 against a throwaway PostgreSQL over 127.0.0.1 (stopped afterwards), under -race, with every listed store test passing. The bus tests ran on the vendored nats-server (internal/testbus). TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose passes with mesh-host at origin/feat/57 (c18d5a8, which includes mesh-host#110), using MESH_CHECK_BESIDE.

Review 246's findings, each fix checked by reverting it locally:

  • 1 (a foreign write is corrected): mirror.go:133 re-reads the bucket on every pass. When I restored the fill-once behaviour, TestNatsAForeignWriteIsCorrectedOnTheNextPass failed: the pass did {Written:0} and the bucket still held {"a":9}. Fixed.
  • 2 (no write without the lease): mirror.go:128/153/181/232, and holds() with nil Holds now means not held (:291). The production writer passes holds (record_mirrors.go:85). When I reverted holds() and the checks, TestNatsAWriterWithoutTheLeaseWritesNothing failed with 2 writes, 2 removals and 11 bucket writes; with only the per-write checks removed, it failed too. Fixed.
  • 3 (the value is built from named fields): DeclaredMirrored with DeclaredMirroredFields (mirrors.go:48, :92). TestTheDeclaredConfigMirrorCarriesOnlyItsListedFields failed when I added a field to SettingDeclaration and again when I added an unlisted field to DeclaredMirrored. Fixed.

I re-ran the earlier probes on this head. A foreign {"a":9} is put back to {"a":1}. A foreign purge is re-created. A foreign extra key is removed. The next pass writes nothing. A writer with Holds false writes 0 keys and returns ErrNotHeld.

Must change:

  1. testdata/store-tests:64 conflicts with F2 (#316), which merged first; the trunk is now 71362c1. Rebase onto it and keep both sides' lines. I merged it locally that way, and merge-check.sh on the result exited 0. The forge's merge-gate and repo-check say "out of date" (pending), and mesh/delivery is failure, so the rebased head needs both checks green.
  2. Finding 4 of review 246 asked for the two deviations to be corrected in the record and named in this pull request. ADR 0356 covers them: clause 1 covers the pass (changes ADR 0289 §7), clause 3 covers granted-not-declared (changes §18), and clause 4 adds the declared-config mirror. It is proposed, version 3, not in force. The knowledge base's review of version 2 asked for changes on three points: the writer's re-read against ADR 0289 §19 ("the controller never reads a mirror"), a missing §7 link on clause 4, and ADR 0201 §16 (undeclared buckets are reported). Do not merge until ADR 0356 is accepted. Name ADR 0356 in the description.
  3. The description is stale. It still says settings is "carried whole" and that the writer is "filled from the bucket on its first pass", and it does not list the three new tests. Update it.

Should (may follow):

  1. ADR 0356 clause 2 says the bucket is re-read "when the bucket's last sequence moved", but the code re-reads it with WatchAll on every pass (mirror.go:133). Make the code and the clause say the same thing: either change the clause to "every pass", or add the Status check to the code.
  2. No test pins the lease check in the removal loop (mirror.go:181) on its own. A writer that loses the lease mid-pass is tested only on writes.
  3. Review 246's findings 5 (the 64 KiB cut, §16) and 6 (K1 reads config) still stand for issue 419 and K1.
Verdict: CHANGES at 69367aa78642 Second review of package F3 (issue 652) at head 69367aa786427326d48acf270186a28d5f9a33ee, following review 246. **The code at this head needs no change.** What must change is the base, the record and this pull request's description. Checks I ran in my own worktree: gofmt -l is clean. go vet is clean. `sh merge-check.sh` exited 0 against a throwaway PostgreSQL over 127.0.0.1 (stopped afterwards), under -race, with every listed store test passing. The bus tests ran on the vendored nats-server (internal/testbus). TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose passes with mesh-host at origin/feat/57 (c18d5a8, which includes mesh-host#110), using MESH_CHECK_BESIDE. Review 246's findings, each fix checked by reverting it locally: - 1 (a foreign write is corrected): mirror.go:133 re-reads the bucket on every pass. When I restored the fill-once behaviour, TestNatsAForeignWriteIsCorrectedOnTheNextPass failed: the pass did `{Written:0}` and the bucket still held `{"a":9}`. Fixed. - 2 (no write without the lease): mirror.go:128/153/181/232, and `holds()` with nil Holds now means not held (:291). The production writer passes `holds` (record_mirrors.go:85). When I reverted holds() and the checks, TestNatsAWriterWithoutTheLeaseWritesNothing failed with 2 writes, 2 removals and 11 bucket writes; with only the per-write checks removed, it failed too. Fixed. - 3 (the value is built from named fields): DeclaredMirrored with DeclaredMirroredFields (mirrors.go:48, :92). TestTheDeclaredConfigMirrorCarriesOnlyItsListedFields failed when I added a field to SettingDeclaration and again when I added an unlisted field to DeclaredMirrored. Fixed. I re-ran the earlier probes on this head. A foreign `{"a":9}` is put back to `{"a":1}`. A foreign purge is re-created. A foreign extra key is removed. The next pass writes nothing. A writer with Holds false writes 0 keys and returns ErrNotHeld. Must change: 1. testdata/store-tests:64 conflicts with F2 (#316), which merged first; the trunk is now 71362c1. Rebase onto it and keep both sides' lines. I merged it locally that way, and merge-check.sh on the result exited 0. The forge's merge-gate and repo-check say "out of date" (pending), and mesh/delivery is failure, so the rebased head needs both checks green. 2. Finding 4 of review 246 asked for the two deviations to be corrected in the record and named in this pull request. ADR 0356 covers them: clause 1 covers the pass (changes ADR 0289 §7), clause 3 covers granted-not-declared (changes §18), and clause 4 adds the declared-config mirror. It is **proposed, version 3, not in force**. The knowledge base's review of version 2 asked for changes on three points: the writer's re-read against ADR 0289 §19 ("the controller never reads a mirror"), a missing §7 link on clause 4, and ADR 0201 §16 (undeclared buckets are reported). Do not merge until ADR 0356 is accepted. Name ADR 0356 in the description. 3. The description is stale. It still says `settings` is "carried whole" and that the writer is "filled from the bucket on its first pass", and it does not list the three new tests. Update it. Should (may follow): 4. ADR 0356 clause 2 says the bucket is re-read "when the bucket's last sequence moved", but the code re-reads it with WatchAll on every pass (mirror.go:133). Make the code and the clause say the same thing: either change the clause to "every pass", or add the Status check to the code. 5. No test pins the lease check in the removal loop (mirror.go:181) on its own. A writer that loses the lease mid-pass is tested only on writes. 6. Review 246's findings 5 (the 64 KiB cut, §16) and 6 (K1 reads `config`) still stand for issue 419 and K1.
mesh-admin added 1 commit 2026-10-14 01:26:31 +00:00
Check the mirrors as ADR 0356 says, and prove a removal asks for the lease
mesh/merge-gate head 35c7662f895f merged into trunk dc36536e199e — pass: the change touches no module of the mesh's graph
mesh/repo-check head 35c7662f895f merged into trunk dc36536e199e — fail: its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheContro…
mesh/delivery superseded: a newer head of the same pull request
35c7662f89
Reviews 251 of mesh-controller#315 and ADR 0356 v4 (hq issue 652): a removal
without the lease removes nothing; a module no longer registered loses its
declared-config key with its event; a listed mirror is never reported as
undeclared state; only the audit and a mirror's own writer name a mirror's
bucket; and the mirrors' list and the writers table agree. The store test's
line moves where it merges with the integration branch's own new lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mesh-admin left a comment
Author
Contributor

Verdict: CHANGES at 35c7662f89

Third review of package F3 (issue 652) at head 35c7662f89, following reviews 246 and 251. Review 246's findings 1 to 3 and review 251's findings 1 and 5 are answered in code. One gap remains in the new reader test, and the description has two stale lines.

The record. ADR 0356 is accepted. The knowledge base serves version 5, which accepts version 4's text after its review approved it. Its "How it is checked" section lists seven checks, and this head has a test for each.

Merging. The branch merges cleanly into feat/57 at dc36536. git merge-tree --write-tree gives tree 6b42d95 with no conflict. A local merge gives the same tree, with the store-tests line moved so that it no longer collides with F2's line.

Checks I ran on the merged tree. gofmt -l cmd internal examples printed nothing. MESH_TEST_POSTGRES=postgres://postgres@127.0.0.1:55433/… sh merge-check.sh exited 0. That run includes go vet and the whole suite under -race, and every listed store test passed against a throwaway PostgreSQL over TCP (dynamic_shared_memory_type=mmap, stopped afterwards). The listed store tests include the extended TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent, in which a forgotten module is one purge and one removed event.

What I reverted or planted at the head, and what happened:

  • I dropped the lease check in the removal loop (mirror.go:181). TestNatsARemovalWithoutTheLeaseRemovesNothing failed (Removed:1, the key gone). TestNatsAWriterWithoutTheLeaseWritesNothing still passed, so the new test is the one that covers this check.
  • I made RaiseBuckets report the two mirrors. TestAListedMirrorIsNotReportedAsUndeclared failed and named both of them.
  • I removed a mirror from ControllerMirrors, added one to it, and let a module write a mirror's writers-table row. TestTheMirrorsListAndTheWritersTableAgree failed each time.
  • I planted a reader as broker.AssignmentsBucket in cmd/mesh-controller and as the literal "mesh-controller_declared-config" in internal/inventory. TestOnlyTheAuditAndAMirrorsWriterReadAMirror failed on both and named the file. It passes on the real tree, so it flags no legitimate code today.

Must change:

  1. internal/recordmirror/readers_test.go:58-60. The test catches only qualified names (broker.X, recordmirror.X). A reader inside package broker uses the bare name, so the test misses it. I planted internal/broker/zz_reader.go with func zzR() string { return AssignmentsBucket }, and the test passed. ADR 0356's check says the test fails when any package other than the audit or a mirror's writer reads a mirror, and broker is the controller's bus package. Fix: in a file of package broker that is not on mayNameAMirror, also match an *ast.Ident named AssignmentsBucket, DeclaredConfigBucket, MirrorAssignments, MirrorDeclaredConfig or ControllerMirrors. Today only controller_buckets.go and writers.go use these names, and both are on the allow list, so the change flags no current code.
  2. The description. "This pull request waits for ADR 0356's acceptance before it merges" is stale, because the record is accepted. The line for TestOnlyTheAuditAndAMirrorsWriterReadAMirror says it "fails when any other file of the controller names a mirror's bucket". After finding 1 is fixed, that claim holds for qualified names, bare names in broker and literal bucket names. Say that and not more (see finding 3). "Commands run" names checks on older bases. Add the merge-check on this head merged with dc36536.

Should (may follow):

  1. The test also misses an aliased import (b "…/broker"; b.DeclaredConfigBucket), broker.BucketName(broker.ControllerSeat, "assignments") and a concatenated literal. I planted each, and the test passed. These are deliberate evasions, not natural code, so naming the limit in the test's comment is enough. Matching on the imported path instead of the local package name would close the alias case cheaply.
  2. Review 246's findings 5 (cutting a value over 64 KiB, ADR 0289 §16) and 6 (K1 reads config) still stand for issue 419 and K1 (issue 660).
Verdict: CHANGES at 35c7662f895f Third review of package F3 (issue 652) at head 35c7662f895f57b0092939f67e6a48ac88386ed8, following reviews 246 and 251. Review 246's findings 1 to 3 and review 251's findings 1 and 5 are answered in code. One gap remains in the new reader test, and the description has two stale lines. **The record.** ADR 0356 is accepted. The knowledge base serves version 5, which accepts version 4's text after its review approved it. Its "How it is checked" section lists seven checks, and this head has a test for each. **Merging.** The branch merges cleanly into feat/57 at dc36536. `git merge-tree --write-tree` gives tree 6b42d95 with no conflict. A local merge gives the same tree, with the store-tests line moved so that it no longer collides with F2's line. **Checks I ran on the merged tree.** `gofmt -l cmd internal examples` printed nothing. `MESH_TEST_POSTGRES=postgres://postgres@127.0.0.1:55433/… sh merge-check.sh` exited 0. That run includes go vet and the whole suite under -race, and every listed store test passed against a throwaway PostgreSQL over TCP (dynamic_shared_memory_type=mmap, stopped afterwards). The listed store tests include the extended TestNatsAnAssignmentAndARegistrationEachChangeOneKeyAndRaiseOneEvent, in which a forgotten module is one purge and one `removed` event. **What I reverted or planted at the head, and what happened:** - I dropped the lease check in the removal loop (mirror.go:181). TestNatsARemovalWithoutTheLeaseRemovesNothing failed (Removed:1, the key gone). TestNatsAWriterWithoutTheLeaseWritesNothing still passed, so the new test is the one that covers this check. - I made RaiseBuckets report the two mirrors. TestAListedMirrorIsNotReportedAsUndeclared failed and named both of them. - I removed a mirror from ControllerMirrors, added one to it, and let a module write a mirror's writers-table row. TestTheMirrorsListAndTheWritersTableAgree failed each time. - I planted a reader as `broker.AssignmentsBucket` in cmd/mesh-controller and as the literal "mesh-controller_declared-config" in internal/inventory. TestOnlyTheAuditAndAMirrorsWriterReadAMirror failed on both and named the file. It passes on the real tree, so it flags no legitimate code today. Must change: 1. internal/recordmirror/readers_test.go:58-60. The test catches only qualified names (`broker.X`, `recordmirror.X`). A reader inside package broker uses the bare name, so the test misses it. I planted internal/broker/zz_reader.go with `func zzR() string { return AssignmentsBucket }`, and the test passed. ADR 0356's check says the test fails when any package other than the audit or a mirror's writer reads a mirror, and broker is the controller's bus package. Fix: in a file of package broker that is not on mayNameAMirror, also match an `*ast.Ident` named AssignmentsBucket, DeclaredConfigBucket, MirrorAssignments, MirrorDeclaredConfig or ControllerMirrors. Today only controller_buckets.go and writers.go use these names, and both are on the allow list, so the change flags no current code. 2. The description. "This pull request waits for ADR 0356's acceptance before it merges" is stale, because the record is accepted. The line for TestOnlyTheAuditAndAMirrorsWriterReadAMirror says it "fails when any other file of the controller names a mirror's bucket". After finding 1 is fixed, that claim holds for qualified names, bare names in broker and literal bucket names. Say that and not more (see finding 3). "Commands run" names checks on older bases. Add the merge-check on this head merged with dc36536. Should (may follow): 3. The test also misses an aliased import (`b "…/broker"; b.DeclaredConfigBucket`), `broker.BucketName(broker.ControllerSeat, "assignments")` and a concatenated literal. I planted each, and the test passed. These are deliberate evasions, not natural code, so naming the limit in the test's comment is enough. Matching on the imported path instead of the local package name would close the alias case cheaply. 4. Review 246's findings 5 (cutting a value over 64 KiB, ADR 0289 §16) and 6 (K1 reads `config`) still stand for issue 419 and K1 (issue 660).
Author
Contributor

Merge check at 35c7662f
Judged: head 35c7662f895f merged into trunk dc36536e199e; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main 2959c8143536, mesh-host 1a2677882380, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — the change touches no module of the mesh's graph
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (1.06s)

Run by the build seat on novox as build-1791941207220036292 (builds --log build-1791941207220036292).

--- its merge-check.sh (go toolchain)
ok  	github.com/novox/mesh-controller/cmd/mesh-builder	1.368s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	355.774s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.035s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.046s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.024s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.172s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.081s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (1.06s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	6.495s
ok  	github.com/novox/mesh-controller/internal/builder	85.329s
ok  	github.com/novox/mesh-controller/internal/catalogue	14.511s
ok  	github.com/novox/mesh-controller/internal/conditions	4.245s
ok  	github.com/novox/mesh-controller/internal/envfile	1.039s
ok  	github.com/novox/mesh-controller/internal/facts	1.041s
ok  	github.com/novox/mesh-controller/internal/identity	10.201s
ok  	github.com/novox/mesh-controller/internal/inventory	87.802s
ok  	github.com/novox/mesh-controller/internal/lease	17.907s
ok  	github.com/novox/mesh-controller/internal/licences	8.033s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.019s
ok  	github.com/novox/mesh-controller/internal/link	70.369s
ok  	github.com/novox/mesh-controller/internal/lint	3.299s
ok  	github.com/novox/mesh-controller/internal/outward	1.066s
ok  	github.com/novox/mesh-controller/internal/overlay	1.039s
ok  	github.com/novox/mesh-controller/internal/recordmirror	10.760s
ok  	github.com/novox/mesh-controller/internal/secrets	1.771s
ok  	github.com/novox/mesh-controller/internal/store	4.901s
ok  	github.com/novox/mesh-controller/internal/testbus	1.268s
ok  	github.com/novox/mesh-controller/internal/token	1.027s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (1.06s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL	github.com/novox/mesh-controller/internal/broker	6.495s
**Merge check** at `35c7662f` Judged: head `35c7662f895f` merged into trunk `dc36536e199e`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `2959c8143536`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — the change touches no module of the mesh's graph - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (1.06s) Run by the build seat on novox as `build-1791941207220036292` (`builds --log build-1791941207220036292`). ``` --- its merge-check.sh (go toolchain) ok github.com/novox/mesh-controller/cmd/mesh-builder 1.368s ok github.com/novox/mesh-controller/cmd/mesh-controller 355.774s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.035s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.046s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.024s ok github.com/novox/mesh-controller/examples/route-proxy 1.172s ok github.com/novox/mesh-controller/internal/artifacts 1.081s ? github.com/novox/mesh-controller/internal/beside [no test files] --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (1.06s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL FAIL github.com/novox/mesh-controller/internal/broker 6.495s ok github.com/novox/mesh-controller/internal/builder 85.329s ok github.com/novox/mesh-controller/internal/catalogue 14.511s ok github.com/novox/mesh-controller/internal/conditions 4.245s ok github.com/novox/mesh-controller/internal/envfile 1.039s ok github.com/novox/mesh-controller/internal/facts 1.041s ok github.com/novox/mesh-controller/internal/identity 10.201s ok github.com/novox/mesh-controller/internal/inventory 87.802s ok github.com/novox/mesh-controller/internal/lease 17.907s ok github.com/novox/mesh-controller/internal/licences 8.033s ok github.com/novox/mesh-controller/internal/licences/adapters 1.019s ok github.com/novox/mesh-controller/internal/link 70.369s ok github.com/novox/mesh-controller/internal/lint 3.299s ok github.com/novox/mesh-controller/internal/outward 1.066s ok github.com/novox/mesh-controller/internal/overlay 1.039s ok github.com/novox/mesh-controller/internal/recordmirror 10.760s ok github.com/novox/mesh-controller/internal/secrets 1.771s ok github.com/novox/mesh-controller/internal/store 4.901s ok github.com/novox/mesh-controller/internal/testbus 1.268s ok github.com/novox/mesh-controller/internal/token 1.027s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (1.06s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL github.com/novox/mesh-controller/internal/broker 6.495s ```
mesh-admin added 1 commit 2026-10-14 01:40:37 +00:00
Find a bare or aliased mirror reader, and say what the reader test misses
mesh/delivery rejected: the gate failed or could not run, or the repository's own check failed
mesh/merge-gate out of date: judged against trunk dc36536e199e, the trunk is now 60d390adeddc; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk dc36536e199e, the trunk is now 60d390adeddc; judged again on a recheck or when it is merged
7a691edd3a
Review 257 of mesh-controller#315 (hq issue 652): the test that only the audit
and a mirror's writer read a mirror (ADR 0289 §19, ADR 0356 §2) matched only
names qualified as broker. or recordmirror., so a reader inside package broker,
or one importing broker under another name, passed. It now matches by import
path and bare names in the defining packages, proves it on planted readers,
and names what it cannot see.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Contributor

Merge check at 7a691edd
Judged: head 7a691edd3a6c merged into trunk dc36536e199e; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main 2959c8143536, mesh-host 1a2677882380, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — the change touches no module of the mesh's graph
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)

Run by the build seat on shanks as build-1791942053809789385 (builds --log build-1791942053809789385).

--- its merge-check.sh (go toolchain)
ok  	github.com/novox/mesh-controller/cmd/mesh-builder	1.100s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	188.976s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.021s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.062s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.041s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.242s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.102s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	3.619s
ok  	github.com/novox/mesh-controller/internal/builder	41.726s
ok  	github.com/novox/mesh-controller/internal/catalogue	8.759s
ok  	github.com/novox/mesh-controller/internal/conditions	2.727s
ok  	github.com/novox/mesh-controller/internal/envfile	1.055s
ok  	github.com/novox/mesh-controller/internal/facts	1.065s
ok  	github.com/novox/mesh-controller/internal/identity	5.182s
ok  	github.com/novox/mesh-controller/internal/inventory	37.232s
ok  	github.com/novox/mesh-controller/internal/lease	17.723s
ok  	github.com/novox/mesh-controller/internal/licences	4.140s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.045s
ok  	github.com/novox/mesh-controller/internal/link	59.292s
ok  	github.com/novox/mesh-controller/internal/lint	2.626s
ok  	github.com/novox/mesh-controller/internal/outward	1.093s
ok  	github.com/novox/mesh-controller/internal/overlay	1.070s
ok  	github.com/novox/mesh-controller/internal/recordmirror	9.705s
ok  	github.com/novox/mesh-controller/internal/secrets	1.543s
ok  	github.com/novox/mesh-controller/internal/store	3.561s
ok  	github.com/novox/mesh-controller/internal/testbus	1.210s
ok  	github.com/novox/mesh-controller/internal/token	1.016s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)
    genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
    genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried
FAIL	github.com/novox/mesh-controller/internal/broker	3.619s
**Merge check** at `7a691edd` Judged: head `7a691edd3a6c` merged into trunk `dc36536e199e`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `2959c8143536`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — the change touches no module of the mesh's graph - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s) Run by the build seat on shanks as `build-1791942053809789385` (`builds --log build-1791942053809789385`). ``` --- its merge-check.sh (go toolchain) ok github.com/novox/mesh-controller/cmd/mesh-builder 1.100s ok github.com/novox/mesh-controller/cmd/mesh-controller 188.976s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.021s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.062s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.041s ok github.com/novox/mesh-controller/examples/route-proxy 1.242s ok github.com/novox/mesh-controller/internal/artifacts 1.102s ? github.com/novox/mesh-controller/internal/beside [no test files] --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL FAIL github.com/novox/mesh-controller/internal/broker 3.619s ok github.com/novox/mesh-controller/internal/builder 41.726s ok github.com/novox/mesh-controller/internal/catalogue 8.759s ok github.com/novox/mesh-controller/internal/conditions 2.727s ok github.com/novox/mesh-controller/internal/envfile 1.055s ok github.com/novox/mesh-controller/internal/facts 1.065s ok github.com/novox/mesh-controller/internal/identity 5.182s ok github.com/novox/mesh-controller/internal/inventory 37.232s ok github.com/novox/mesh-controller/internal/lease 17.723s ok github.com/novox/mesh-controller/internal/licences 4.140s ok github.com/novox/mesh-controller/internal/licences/adapters 1.045s ok github.com/novox/mesh-controller/internal/link 59.292s ok github.com/novox/mesh-controller/internal/lint 2.626s ok github.com/novox/mesh-controller/internal/outward 1.093s ok github.com/novox/mesh-controller/internal/overlay 1.070s ok github.com/novox/mesh-controller/internal/recordmirror 9.705s ok github.com/novox/mesh-controller/internal/secrets 1.543s ok github.com/novox/mesh-controller/internal/store 3.561s ok github.com/novox/mesh-controller/internal/testbus 1.210s ok github.com/novox/mesh-controller/internal/token 1.016s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s) genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_assignments.> $KV.mesh-controller_declared-config.> mesh.seat.mesh-controller.event.assignment-changed mesh.seat.mesh-controller.event.declared-config-changed] — it would come up and be refused on the first thing it tried FAIL github.com/novox/mesh-controller/internal/broker 3.619s ```
Author
Contributor

Verdict: APPROVE at 7a691edd3a

Fourth review of package F3 (issue 652), following reviews 246, 251 and 257. Both points of review 257 are answered.

  1. Bare and aliased readers (internal/recordmirror/readers_test.go). I planted internal/broker/zz_reader.go (return AssignmentsBucket) and internal/q/a.go (import bb ".../broker"; bb.DeclaredConfigBucket): TestOnlyTheAuditAndAMirrorsWriterReadAMirror failed and named both files. On the real tree it passes and flags nothing. TestTheReaderTestFindsPlantedReaders passes (qualified, aliased, bare in broker, nested bare, literal). The test's comment names what it still misses: names built at run time, concatenated literals, a mirror reached through a value handed over from an allowed file.
  2. The description is updated: ADR 0356 v5 accepted, the test's catches and limits stated accurately, commands run on this head merged with dc36536.

Nothing else changed since 35c7662: git diff --stat 35c7662..7a691ed is the one file readers_test.go (108 insertions, 9 deletions).

Merging: git merge-tree --write-tree origin/feat/57-config-and-provisioning 7a691ed gives tree 75632f5 with no conflict; a local merge gives the same tree.

Checks on the merged tree: gofmt -l cmd internal examples printed nothing; go vet ./... clean; MESH_TEST_POSTGRES=postgres://postgres@127.0.0.1:55434/... sh merge-check.sh exit 0, no FAIL line, against a throwaway PostgreSQL over TCP (dynamic_shared_memory_type=mmap, stopped afterwards).

Open findings that may follow, unchanged from earlier reviews: cutting a value over 64 KiB (ADR 0289 section 16) stays with issue 419, and K1 (issue 660) reads config.

Verdict: APPROVE at 7a691edd3a6c Fourth review of package F3 (issue 652), following reviews 246, 251 and 257. Both points of review 257 are answered. 1. Bare and aliased readers (internal/recordmirror/readers_test.go). I planted internal/broker/zz_reader.go (`return AssignmentsBucket`) and internal/q/a.go (`import bb ".../broker"; bb.DeclaredConfigBucket`): TestOnlyTheAuditAndAMirrorsWriterReadAMirror failed and named both files. On the real tree it passes and flags nothing. TestTheReaderTestFindsPlantedReaders passes (qualified, aliased, bare in broker, nested bare, literal). The test's comment names what it still misses: names built at run time, concatenated literals, a mirror reached through a value handed over from an allowed file. 2. The description is updated: ADR 0356 v5 accepted, the test's catches and limits stated accurately, commands run on this head merged with dc36536. Nothing else changed since 35c7662: `git diff --stat 35c7662..7a691ed` is the one file readers_test.go (108 insertions, 9 deletions). Merging: `git merge-tree --write-tree origin/feat/57-config-and-provisioning 7a691ed` gives tree 75632f5 with no conflict; a local merge gives the same tree. Checks on the merged tree: `gofmt -l cmd internal examples` printed nothing; `go vet ./...` clean; `MESH_TEST_POSTGRES=postgres://postgres@127.0.0.1:55434/... sh merge-check.sh` exit 0, no FAIL line, against a throwaway PostgreSQL over TCP (dynamic_shared_memory_type=mmap, stopped afterwards). Open findings that may follow, unchanged from earlier reviews: cutting a value over 64 KiB (ADR 0289 section 16) stays with issue 419, and K1 (issue 660) reads `config`.
Some checks are pending
mesh/delivery rejected: the gate failed or could not run, or the repository's own check failed
mesh/merge-gate out of date: judged against trunk dc36536e199e, the trunk is now 60d390adeddc; judged again on a recheck or when it is merged
Required
Details
mesh/repo-check out of date: judged against trunk dc36536e199e, the trunk is now 60d390adeddc; judged again on a recheck or when it is merged
Required
Details
Some required checks are missing.
You are not authorized to merge this pull request.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin pkg/57-f3-assignment-buckets:pkg/57-f3-assignment-buckets
git checkout pkg/57-f3-assignment-buckets
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#315