From 30e6435dea76ef41edee6ec30721367c3cf6f336 Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 22 Oct 2026 21:55:50 +0200 Subject: [PATCH] Name no node in claude-code's fixtures (issue 1838) --- .../cmd/claude-code/claude_code_test.go | 4 +- .../cmd/claude-code/config_test.go | 4 +- .../cmd/claude-code/hook_calls_test.go | 14 +- .../cmd/claude-code/memory_test.go | 430 +++++++++--------- .../cmd/claude-code/proposals_test.go | 122 ++--- .../cmd/claude-code/questions_test.go | 42 +- .../cmd/claude-code/session_start_test.go | 4 +- .../claude-code/cmd/claude-code/waits_test.go | 80 ++-- 8 files changed, 350 insertions(+), 350 deletions(-) diff --git a/modules/claude-code/cmd/claude-code/claude_code_test.go b/modules/claude-code/cmd/claude-code/claude_code_test.go index 021e0d56..bd390742 100644 --- a/modules/claude-code/cmd/claude-code/claude_code_test.go +++ b/modules/claude-code/cmd/claude-code/claude_code_test.go @@ -290,11 +290,11 @@ func TestAnAppliedBindingSaysWhyAndWho(t *testing.T) { p, w := node(t, "laptop") var asked []string done, err := OnBinding(p, &BindingState{Licence: "personal", Kind: "subscription", Generation: 7, - Why: "the switch verb", By: "g14.node-tools"}, seat(t, "personal", "at-7", 7, &asked), writer(w)) + Why: "the switch verb", By: "node-b.node-tools"}, seat(t, "personal", "at-7", 7, &asked), writer(w)) if err != nil { t.Fatal(err) } - for _, want := range []string{`"generation":7`, `"why":"the switch verb"`, `"by":"g14.node-tools"`} { + for _, want := range []string{`"generation":7`, `"why":"the switch verb"`, `"by":"node-b.node-tools"`} { if !strings.Contains(done, want) { t.Fatalf("the line %s lacks %s", done, want) } diff --git a/modules/claude-code/cmd/claude-code/config_test.go b/modules/claude-code/cmd/claude-code/config_test.go index 6fb00de8..80ba1795 100644 --- a/modules/claude-code/cmd/claude-code/config_test.go +++ b/modules/claude-code/cmd/claude-code/config_test.go @@ -355,8 +355,8 @@ func TestAPathOrAKeyThatIsNotWhatItSaysIsRefused(t *testing.T) { } func TestAllIsEveryNodeAndANameThatCannotBeAKeyIsRefused(t *testing.T) { - nodes, err := ExpandNodes([]string{"all"}, func() ([]string, error) { return []string{"ace", "g14"}, nil }) - if err != nil || strings.Join(nodes, ",") != "ace,g14" { + nodes, err := ExpandNodes([]string{"all"}, func() ([]string, error) { return []string{"node-a", "node-b"}, nil }) + if err != nil || strings.Join(nodes, ",") != "node-a,node-b" { t.Fatalf("%v %v", nodes, err) } p, w := node(t, "laptop") diff --git a/modules/claude-code/cmd/claude-code/hook_calls_test.go b/modules/claude-code/cmd/claude-code/hook_calls_test.go index ff3a9b7b..88974d6b 100644 --- a/modules/claude-code/cmd/claude-code/hook_calls_test.go +++ b/modules/claude-code/cmd/claude-code/hook_calls_test.go @@ -51,13 +51,13 @@ func suggestedCall(t *testing.T, msg string) map[string]any { // Issue 1757: the Stop hook's suggested watched call carries `by`, and the tool accepts it as printed. func TestTheStopHooksSuggestedWatchedCallIsAcceptedByTheTool(t *testing.T) { - p, _ := node(t, "g14") + p, _ := node(t, "node-b") store := newMemWaits() waiting = &Waiting{Store: store, Now: func() time.Time { return t0 }} t.Cleanup(func() { waiting = nil }) s := serve(t, p, &bus{kept: map[string]map[string]any{}}, memConfig{}) - text, isErr := s.call(t, "claude_code_wait", map[string]any{"op": "add", "session": "verify-0489-test", "by": "fix-1757@g14", + text, isErr := s.call(t, "claude_code_wait", map[string]any{"op": "add", "session": "verify-0489-test", "by": "fix-1757@node-b", "what": "the operator's Approve", "read": map[string]any{"address": "mesh-delivery.recheck"}, "bound_minutes": 10}) if isErr { t.Fatalf("add: %s", text) @@ -81,14 +81,14 @@ func TestTheStopHooksSuggestedWatchedCallIsAcceptedByTheTool(t *testing.T) { // Issue 1757: the Stop hook's suggested said call (past its bound) carries `by` too. func TestTheStopHooksSuggestedSaidCallIsAcceptedByTheTool(t *testing.T) { - p, _ := node(t, "g14") + p, _ := node(t, "node-b") store := newMemWaits() clock := t0 waiting = &Waiting{Store: store, Now: func() time.Time { return clock }} t.Cleanup(func() { waiting = nil }) s := serve(t, p, &bus{kept: map[string]map[string]any{}}, memConfig{}) - text, isErr := s.call(t, "claude_code_wait", map[string]any{"op": "add", "session": "verify-0489-test", "by": "fix-1757@g14", + text, isErr := s.call(t, "claude_code_wait", map[string]any{"op": "add", "session": "verify-0489-test", "by": "fix-1757@node-b", "what": "the operator's Approve", "read": map[string]any{"address": "mesh-delivery.recheck"}, "bound_minutes": 1}) if isErr { t.Fatalf("add: %s", text) @@ -114,20 +114,20 @@ func TestTheStopHooksSuggestedSaidCallIsAcceptedByTheTool(t *testing.T) { // Issue 1757: the SessionStart hook's suggested adopt call already carries `by` — checked, as asked, so a // regression here is caught the same way as the Stop hook's. func TestTheSessionStartHooksSuggestedAdoptCallIsAcceptedByTheTool(t *testing.T) { - p, _ := node(t, "g14") + p, _ := node(t, "node-b") store := newMemWaits() waiting = &Waiting{Store: store, Now: func() time.Time { return t0 }} t.Cleanup(func() { waiting = nil }) s := serve(t, p, &bus{kept: map[string]map[string]any{}}, memConfig{}) - text, isErr := s.call(t, "claude_code_wait", map[string]any{"op": "add", "session": "sess-old", "by": "fix-1757@g14", + text, isErr := s.call(t, "claude_code_wait", map[string]any{"op": "add", "session": "sess-old", "by": "fix-1757@node-b", "what": "the operator's Approve", "read": map[string]any{"address": "mesh-delivery.recheck"}, "bound_minutes": 10}) if isErr { t.Fatalf("add: %s", text) } msg := SessionStartMessage("sess-new", WaitsDirPath(p), t0.Add(time.Minute)) - if !strings.Contains(msg, "\"by\":\"fix-1757@g14\"") { + if !strings.Contains(msg, "\"by\":\"fix-1757@node-b\"") { t.Fatalf("the suggested adopt call does not carry by: %s", msg) } args := suggestedCall(t, msg) diff --git a/modules/claude-code/cmd/claude-code/memory_test.go b/modules/claude-code/cmd/claude-code/memory_test.go index 892e8f95..909068a5 100644 --- a/modules/claude-code/cmd/claude-code/memory_test.go +++ b/modules/claude-code/cmd/claude-code/memory_test.go @@ -211,10 +211,10 @@ const project = "-home-op-projects-novox-hq" func twoNodes(t *testing.T) (*memState, *clock, *memNode, *memNode) { state, c := newMemState(), &clock{now: time.Date(2026, 10, 13, 12, 0, 0, 0, time.UTC)} root := t.TempDir() - return state, c, newMemNode(t, root, "g14", HomeOperator, state, c), newMemNode(t, root, "shanks", HomeOperator, state, c) + return state, c, newMemNode(t, root, "node-b", HomeOperator, state, c), newMemNode(t, root, "node-d", HomeOperator, state, c) } -// carried writes a file on g14 and carries it to shanks. +// carried writes a file on node-b and carries it to node-d. func carriedOnBoth(t *testing.T, state *memState, c *clock, a, b *memNode, file, text string) { t.Helper() a.write(t, project, file, text, c.now) @@ -229,39 +229,39 @@ func carriedOnBoth(t *testing.T, state *memState, c *clock, a, b *memNode, file, // §5, §6: a memory file written on one node appears unchanged on another, at any depth, and is carried once. func TestAMemoryFileWrittenOnOneNodeAppearsUnchangedOnAnother(t *testing.T) { - state, c, g14, shanks := twoNodes(t) - g14.write(t, project, "MEMORY.md", "- [state](state.md) — where things stand\n", c.now) - g14.write(t, project, "notes/state.md", "ADR 0343 proposed.\n", c.now) - g14.look(t) + state, c, nodeB, nodeD := twoNodes(t) + nodeB.write(t, project, "MEMORY.md", "- [state](state.md) — where things stand\n", c.now) + nodeB.write(t, project, "notes/state.md", "ADR 0343 proposed.\n", c.now) + nodeB.look(t) state.pump(t) for file, want := range map[string]string{"MEMORY.md": "- [state](state.md) — where things stand\n", "notes/state.md": "ADR 0343 proposed.\n"} { - if got, ok := shanks.read(t, project, file); !ok || got != want { - t.Fatalf("%s on shanks: %q, %v", file, got, ok) + if got, ok := nodeD.read(t, project, file); !ok || got != want { + t.Fatalf("%s on node-d: %q, %v", file, got, ok) } } before := state.rev - shanks.look(t) - g14.look(t) + nodeD.look(t) + nodeB.look(t) state.pump(t) if state.rev != before { t.Fatalf("a carried file was carried again: %d changes", state.rev-before) } - // A change on shanks comes back to g14, over the version it replaced, which g14 keeps. + // A change on node-d comes back to node-b, over the version it replaced, which node-b keeps. c.now = c.now.Add(time.Minute) - shanks.write(t, project, "notes/state.md", "ADR 0343 accepted.\n", c.now) - shanks.look(t) + nodeD.write(t, project, "notes/state.md", "ADR 0343 accepted.\n", c.now) + nodeD.look(t) state.pump(t) - if got, _ := g14.read(t, project, "notes/state.md"); got != "ADR 0343 accepted.\n" { - t.Fatalf("the change did not reach g14: %q", got) + if got, _ := nodeB.read(t, project, "notes/state.md"); got != "ADR 0343 accepted.\n" { + t.Fatalf("the change did not reach node-b: %q", got) } - if !holdsText(g14.copies(t), "ADR 0343 proposed.\n") { - t.Fatal("the version replaced on g14 was not kept") + if !holdsText(nodeB.copies(t), "ADR 0343 proposed.\n") { + t.Fatal("the version replaced on node-b was not kept") } - if len(g14.notices)+len(shanks.notices) != 0 { - t.Fatalf("a plain change warned: %v %v", g14.notices, shanks.notices) + if len(nodeB.notices)+len(nodeD.notices) != 0 { + t.Fatalf("a plain change warned: %v %v", nodeB.notices, nodeD.notices) } // No value in the state is anything but a version of a memory file, and no tool answer carries the text. - raw, _ := json.Marshal(g14.Status()) + raw, _ := json.Marshal(nodeB.Status()) if strings.Contains(string(raw), "accepted") { t.Fatalf("the memory tool answered the text: %s", raw) } @@ -270,44 +270,44 @@ func TestAMemoryFileWrittenOnOneNodeAppearsUnchangedOnAnother(t *testing.T) { // §1, §2: only the memory folders are carried; a symbolic link, an oversized file and a secret's shape are not, and are // listed with why. func TestOnlyTheMemoryFoldersAreCarried(t *testing.T) { - state, c, g14, shanks := twoNodes(t) - projectDir := filepath.Join(g14.Home, ".claude", "projects", project) - g14.write(t, project, "MEMORY.md", "index\n", c.now) + state, c, nodeB, nodeD := twoNodes(t) + projectDir := filepath.Join(nodeB.Home, ".claude", "projects", project) + nodeB.write(t, project, "MEMORY.md", "index\n", c.now) for path, text := range map[string]string{ - filepath.Join(projectDir, "session.jsonl"): "{}\n", - filepath.Join(g14.Home, ".claude", "settings.json"): "{}\n", - filepath.Join(g14.Home, ".claude", "history.jsonl"): "{}\n", + filepath.Join(projectDir, "session.jsonl"): "{}\n", + filepath.Join(nodeB.Home, ".claude", "settings.json"): "{}\n", + filepath.Join(nodeB.Home, ".claude", "history.jsonl"): "{}\n", } { if err := os.WriteFile(path, []byte(text), 0o600); err != nil { t.Fatal(err) } } - g14.write(t, project, "key.md", "-----BEGIN OPENSSH PRIVATE KEY-----\nabc\n", c.now) - g14.write(t, project, "url.md", "https://op:hunter2@git.example.org/x\n", c.now) - g14.write(t, project, "big.md", strings.Repeat("x", MemoryMostBytes+1), c.now) - g14.write(t, project, "hash.md", "head 1fe6ea4ee47379007598e163784dbd7ac50b7f79\n", c.now) + nodeB.write(t, project, "key.md", "-----BEGIN OPENSSH PRIVATE KEY-----\nabc\n", c.now) + nodeB.write(t, project, "url.md", "https://op:hunter2@git.example.org/x\n", c.now) + nodeB.write(t, project, "big.md", strings.Repeat("x", MemoryMostBytes+1), c.now) + nodeB.write(t, project, "hash.md", "head 1fe6ea4ee47379007598e163784dbd7ac50b7f79\n", c.now) outside := filepath.Join(t.TempDir(), "elsewhere.md") _ = os.WriteFile(outside, []byte("not memory\n"), 0o600) - if err := os.Symlink(outside, g14.path(project, "link.md")); err != nil { + if err := os.Symlink(outside, nodeB.path(project, "link.md")); err != nil { t.Fatal(err) } - g14.look(t) + nodeB.look(t) state.pump(t) for _, file := range []string{"key.md", "url.md", "big.md", "link.md"} { - if _, ok := shanks.read(t, project, file); ok { + if _, ok := nodeD.read(t, project, file); ok { t.Errorf("%s was carried", file) } } for _, file := range []string{"MEMORY.md", "hash.md"} { - if _, ok := shanks.read(t, project, file); !ok { + if _, ok := nodeD.read(t, project, file); !ok { t.Errorf("%s was not carried", file) } } - if _, err := os.Stat(filepath.Join(shanks.Home, ".claude", "projects", project, "session.jsonl")); err == nil { + if _, err := os.Stat(filepath.Join(nodeD.Home, ".claude", "projects", project, "session.jsonl")); err == nil { t.Error("a session was carried") } for _, f := range []string{"settings.json", "history.jsonl"} { - if _, err := os.Stat(filepath.Join(shanks.Home, ".claude", f)); err == nil { + if _, err := os.Stat(filepath.Join(nodeD.Home, ".claude", f)); err == nil { t.Errorf("%s was carried", f) } } @@ -315,7 +315,7 @@ func TestOnlyTheMemoryFoldersAreCarried(t *testing.T) { if len(keys) != 2 { t.Fatalf("the state holds %d keys, not the two memory files: %v", len(keys), keys) } - not, _ := g14.Status()["not carried"].(map[string]string) + not, _ := nodeB.Status()["not carried"].(map[string]string) for _, file := range []string{"key.md", "url.md", "big.md", "link.md"} { if not[project+"/"+file] == "" { t.Errorf("%s is not listed as not carried: %v", file, not) @@ -327,8 +327,8 @@ func TestOnlyTheMemoryFoldersAreCarried(t *testing.T) { func TestHomesOfTheTwoKindsNeverTakeEachOthersMemory(t *testing.T) { state, c := newMemState(), &clock{now: time.Date(2026, 10, 13, 12, 0, 0, 0, time.UTC)} root := t.TempDir() - laptop := newMemNode(t, root, "g14", HomeOperator, state, c) - control := newMemNode(t, root, "novox", HomeAgent, state, c) + laptop := newMemNode(t, root, "node-b", HomeOperator, state, c) + control := newMemNode(t, root, "node-c", HomeAgent, state, c) control.write(t, project, "MEMORY.md", "from a confined agent\n", c.now) control.look(t) state.pump(t) @@ -343,7 +343,7 @@ func TestHomesOfTheTwoKindsNeverTakeEachOthersMemory(t *testing.T) { } // A value of the other kind put under this kind's key is refused too. key := MemoryKey(HomeOperator, project, "x.md") - raw, _ := json.Marshal(MemoryVersion{Kind: HomeAgent, Project: project, Path: "x.md", Text: "x", Digest: digestOf([]byte("x")), Node: "novox"}) + raw, _ := json.Marshal(MemoryVersion{Kind: HomeAgent, Project: project, Path: "x.md", Text: "x", Digest: digestOf([]byte("x")), Node: "node-c"}) if err := laptop.Take(key, "put", raw, 99); err == nil { t.Fatal("a value of another kind was taken") } @@ -362,31 +362,31 @@ func TestHomesOfTheTwoKindsNeverTakeEachOthersMemory(t *testing.T) { // §7, §8: a file changed on two nodes since it was carried is kept twice in one file on both, the newer first, with // one warning; it clears once the file is tidied. func TestAFileChangedOnTwoNodesIsKeptTwiceTheNewerFirstWithAWarning(t *testing.T) { - state, c, g14, shanks := twoNodes(t) - carriedOnBoth(t, state, c, g14, shanks, "MEMORY.md", "- base\n") - g14.write(t, project, "MEMORY.md", "- base\n- learned on g14\n", c.now.Add(time.Minute)) - shanks.write(t, project, "MEMORY.md", "- base\n- learned on shanks\n", c.now.Add(2*time.Minute)) + state, c, nodeB, nodeD := twoNodes(t) + carriedOnBoth(t, state, c, nodeB, nodeD, "MEMORY.md", "- base\n") + nodeB.write(t, project, "MEMORY.md", "- base\n- learned on node-b\n", c.now.Add(time.Minute)) + nodeD.write(t, project, "MEMORY.md", "- base\n- learned on node-d\n", c.now.Add(2*time.Minute)) c.now = c.now.Add(3 * time.Minute) - g14.look(t) - shanks.look(t) + nodeB.look(t) + nodeD.look(t) state.pump(t) - g14.look(t) - shanks.look(t) + nodeB.look(t) + nodeD.look(t) state.pump(t) - a, _ := g14.read(t, project, "MEMORY.md") - b, _ := shanks.read(t, project, "MEMORY.md") + a, _ := nodeB.read(t, project, "MEMORY.md") + b, _ := nodeD.read(t, project, "MEMORY.md") if a != b { t.Fatalf("the nodes did not end on one text:\n%s\n----\n%s", a, b) } - newer, older := strings.Index(a, "learned on shanks"), strings.Index(a, "learned on g14") + newer, older := strings.Index(a, "learned on node-d"), strings.Index(a, "learned on node-b") marker := strings.Index(a, "