diff --git a/modules/claude-code/cmd/claude-code/insteadof_test.go b/modules/claude-code/cmd/claude-code/insteadof_test.go index 9ac5a4d37..405ca61cc 100644 --- a/modules/claude-code/cmd/claude-code/insteadof_test.go +++ b/modules/claude-code/cmd/claude-code/insteadof_test.go @@ -109,7 +109,9 @@ func TestTheMeshsToolsAreReadFromTheBus(t *testing.T) { t.Errorf("replacements: %s", got) } t.Run("the again tool answers the operator and the healers only", func(t *testing.T) { - for caller, refused := range map[string]bool{"person.jochen": false, "shanks.mesh-healers": false, "shanks.mesh-config": true} { + // An operator's session through the mesh MCP server is proved as its machine's tool runner (issue 627, issue 1966). + for caller, refused := range map[string]bool{"person.jochen": false, "shanks.node-tools": false, "shanks.mesh-healers": false, + "shanks.mesh-config": true} { if err := seatlist.Refusal("claude_code_seat_list_again", seatListAgainCallers, caller); (err != nil) != refused { t.Errorf("%s: refused=%v, err %v", caller, refused, err) } diff --git a/modules/claude-code/cmd/claude-code/main.go b/modules/claude-code/cmd/claude-code/main.go index af9c534ff..53a18a1a0 100644 --- a/modules/claude-code/cmd/claude-code/main.go +++ b/modules/claude-code/cmd/claude-code/main.go @@ -667,8 +667,10 @@ func refusals(n int) string { return fmt.Sprintf(" (after %d refusal(s))", n) } -// seatListAgainCallers may read the seat list again: every operator's session and the healers (ADR 0636 §7). -var seatListAgainCallers = []string{stdio.AnyPerson, "mesh-healers"} +// seatListAgainCallers may read the seat list again: every operator's session and the healers (ADR 0636 §7). A call through +// the mesh MCP server is proved only as its machine's tool runner (.node-tools, issue 627), so node-tools stands for +// an operator's session until a session is proved (issue 1966). +var seatListAgainCallers = []string{stdio.AnyPerson, "node-tools", "mesh-healers"} // seatListTools are the seat list reader's two tools: what the list holds and what it waits for, and a read now. The // reader starts once the runtime serves, after the tools are listed, so each tool finds it when it is called.