7f12c7fc37
The v3 stack, previously an uncommitted working tree, plus this session's two units and the burn-in instrument. This commit is the burn-in build identity: coordinator and worker must both report this revision before a task is created. Workflow (earlier sessions, uncommitted until now): human decision events and reduction, source cursors and reconcile-before-launch, turn-boundary reconciliation, internal/agentctx as the single renderer, ace-fca phases with sealed artifacts, the trajectory gate, bounded grilling, independent review, task pr enforcement, and human review reflection. Capability restrictions at the agent boundary: an authz.Agent surface at GatedWrite may ask and may not act. It also fixes two bugs the unit exposed -- gated surfaces could not reach the two endpoints written for them, and RequestHumanDecision would block an unowned task while rejecting a question from the session that did own it. Turn-boundary reconcile-failure escalation: a streak of consecutive failures asks the session to hand off, fenced on the lease epoch, with reconcile_failure as a real handoff reason. The worker was dropping the coordinator's verdict on the floor; it now acts on it. Burn-in: herdr.WriteLaunchContext dumps the exact agentctx.Build result to <worktree>/.orchestra/launch.md at every launch, local and federated. BURNIN.md is the runbook. deploy/build.sh stamps both binaries from one commit. go build, go vet and go test ./... pass, 20 packages. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
92 lines
3.0 KiB
Go
92 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"orchestra/internal/registry"
|
|
)
|
|
|
|
type unreachable struct{}
|
|
|
|
func (unreachable) Reachable(string, time.Duration) bool { return false }
|
|
|
|
func TestFederatedReachabilityDefersRemoteHerdrToWorkerHeartbeat(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "config.json")
|
|
if err := os.WriteFile(path, []byte(`{
|
|
"machines":[{"id":"homesrv","address":"192.168.1.104:9145"},{"id":"workpc","address":"192.168.1.105:9145"}],
|
|
"herdrs":[{"id":"local","machine_id":"homesrv","harness":"opencode"},{"id":"remote","machine_id":"workpc","harness":"opencode"}]
|
|
}`), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r, err := registry.Load(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
check := federatedReachability{base: unreachable{}, remote: remoteHerdrAddresses(r, "homesrv")}
|
|
if check.Reachable("192.168.1.105:9245", time.Second) != true {
|
|
t.Fatal("remote herdr should be admitted for worker heartbeat gating")
|
|
}
|
|
if check.Reachable("192.168.1.104:9245", time.Second) {
|
|
t.Fatal("local herdr should still require its TCP probe")
|
|
}
|
|
}
|
|
|
|
func TestCoordinatorOwnsOnlyLocalHerdrInFederationMode(t *testing.T) {
|
|
local := registry.Herdr{ID: "homesrv-opencode", MachineID: "homesrv"}
|
|
localTmux := registry.Herdr{ID: "homesrv-claude", MachineID: "homesrv", Backend: "tmux", Harness: "claude"}
|
|
remote := registry.Herdr{ID: "workpc-opencode", MachineID: "workpc"}
|
|
if !coordinatorOwnsHerdr(local, "homesrv") {
|
|
t.Fatal("coordinator does not own its local herdr")
|
|
}
|
|
if coordinatorOwnsHerdr(remote, "homesrv") {
|
|
t.Fatal("coordinator claimed a worker-owned remote herdr")
|
|
}
|
|
if coordinatorOwnsHerdr(localTmux, "homesrv") {
|
|
t.Fatal("coordinator claimed a local worker-owned tmux backend")
|
|
}
|
|
if !coordinatorOwnsHerdr(remote, "") {
|
|
t.Fatal("single-machine mode should retain legacy local ownership")
|
|
}
|
|
}
|
|
|
|
func TestMultiMachineRegistryRequiresKnownLocalMachine(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "config.json")
|
|
if err := os.WriteFile(path, []byte(`{
|
|
"machines":[{"id":"homesrv","address":"192.168.1.104:9145"},{"id":"workpc","address":"192.168.1.105:9145"}]
|
|
}`), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r, err := registry.Load(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := validateLocalMachine(r, ""); err == nil {
|
|
t.Fatal("missing local machine accepted")
|
|
}
|
|
if err := validateLocalMachine(r, "missing"); err == nil {
|
|
t.Fatal("unknown local machine accepted")
|
|
}
|
|
if err := validateLocalMachine(r, "homesrv"); err != nil {
|
|
t.Fatalf("known local machine rejected: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestTmuxRegistryRequiresMachineIdentityEvenOnOneMachine(t *testing.T) {
|
|
r, err := registry.New(registry.Config{
|
|
Machines: []registry.Machine{{ID: "homesrv", Address: "homesrv:9145"}},
|
|
Herdrs: []registry.Herdr{{ID: "homesrv-claude", MachineID: "homesrv", Backend: "tmux", Harness: "claude"}},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := validateLocalMachine(r, ""); err == nil {
|
|
t.Fatal("worker-owned tmux backend accepted without machine identity")
|
|
}
|
|
if err := validateLocalMachine(r, "homesrv"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|