Every merge to the controller's repository planned the controller, the build seat's holder and the route proxy in three gated tiers, whatever it changed (issue 338). The planner now maps a merge's files onto the build source each module's newest trunk build said: a README moves nothing, the controller's command the controller alone, the proxy's program the proxy alone. A module with none said, or one an open plan has yet to build, is read whole as before. Sharing a repository draws no packages edge any more, and one recorded before neither widens nor orders a plan.
48 lines
2.1 KiB
Go
48 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-controller/internal/inventory"
|
|
)
|
|
|
|
// The holder of the build seat follows the controller that defines its worker (novox/hq issue 206).
|
|
// On 2026-10-03 a plan put the build machine in tier 0 and the controller in tier 1; the new build
|
|
// machine could not bind the worker the old controller had defined, and nothing could build the
|
|
// controller that would have redefined it. The built-by edge from the controller to its build
|
|
// machine yields to that order: the controller is built by whichever build machine is running.
|
|
func TestTheBuildSeatsHolderFollowsTheControllerThatDefinesItsWorker(t *testing.T) {
|
|
edges := []inventory.Edge{
|
|
{From: "build-agent", To: "mesh-controller", Kind: inventory.EdgePackages},
|
|
{From: "build-agent", To: "mesh-controller", Kind: inventory.EdgeWorkerOf},
|
|
{From: "mesh-controller", To: "build-agent", Kind: inventory.EdgeBuiltBy},
|
|
{From: "route-proxy", To: "mesh-controller", Kind: inventory.EdgePackages},
|
|
{From: "route-proxy", To: "build-agent", Kind: inventory.EdgeBuiltBy},
|
|
}
|
|
// A packages edge recorded before novox/hq ADR 0267 widens nothing: the controller moved alone moves
|
|
// alone, and a change to a package all three build from moves all three, each by its own build source.
|
|
if alone := reachableFrom([]string{"mesh-controller"}, edges); len(alone) != 1 {
|
|
t.Fatalf("the controller alone, whatever packages its repository: %v", alone)
|
|
}
|
|
set := reachableFrom([]string{"mesh-controller", "build-agent", "route-proxy"}, edges)
|
|
tiers := tiersOf(set, edges)
|
|
pos := map[string]int{}
|
|
for i, tier := range tiers {
|
|
for _, m := range tier {
|
|
pos[m] = i
|
|
}
|
|
}
|
|
if pos["mesh-controller"] != 0 {
|
|
t.Fatalf("the controller first, built by the build machine that is running: %v", tiers)
|
|
}
|
|
if pos["build-agent"] <= pos["mesh-controller"] {
|
|
t.Fatalf("the build machine after the controller that defines its worker: %v", tiers)
|
|
}
|
|
if pos["route-proxy"] <= pos["build-agent"] {
|
|
t.Fatalf("what the build machine builds comes after it: %v", tiers)
|
|
}
|
|
if hasCycle(tiers, edges) {
|
|
t.Fatalf("no cycle here: %v", tiers)
|
|
}
|
|
}
|