From fa0612859b89736bb144f7983e21ec10c6a5f0e4 Mon Sep 17 00:00:00 2001 From: Dai Ha Date: Fri, 14 Aug 2026 21:48:58 +0200 Subject: [PATCH] CB-560: document spawned member presence --- .../src/main/java/dev/ltms/bridged/Bridged.java | 15 ++++++++------- .../java/dev/ltms/bridged/mcp/BridgeMcpTest.java | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/bridged/src/main/java/dev/ltms/bridged/Bridged.java b/bridged/src/main/java/dev/ltms/bridged/Bridged.java index 87be519..3cecfd0 100644 --- a/bridged/src/main/java/dev/ltms/bridged/Bridged.java +++ b/bridged/src/main/java/dev/ltms/bridged/Bridged.java @@ -428,19 +428,20 @@ public final class Bridged { } /** - * The {@link Injector}'s readiness gate (CB-534): a target is deliverable if it is a worker whose - * agent has connected the bridge MCP, or a lead. + * The {@link Injector}'s readiness gate (CB-534): a target is deliverable if it is a spawned + * member whose agent has connected the bridge MCP, or a lead. * - *

The gate exists for one reason — to hold a delivery out of a spawned worker's boot + *

The gate exists for one reason — to hold a delivery out of a spawned member's boot * window, where herdr already reports {@code idle} but the TUI would drop an injected paste. That * hazard is a property of spawning. A lead is never spawned: the operator started it and named it * (or labelled its tab) only once it was up, so there is no boot window to guard. * *

A lead is also never enrolled in {@link MemberPresence} — {@code BridgeMcp} marks presence - * only for a worker, deliberately, since that map doubles as the worker roster's availability - * signal and a lead counted there would show up as an available worker. So without the second - * disjunct a lead is permanently un-deliverable: every lead→lead send sat on the gate for - * {@code READINESS_GRACE_POLLS} (~60s) and then failed having never been typed into the pane. + * for every spawned member (worker and architect), deliberately, since that map doubles as the + * member roster's availability signal and a lead counted there would show up as an available + * member. So without the second disjunct a lead is permanently un-deliverable: every + * lead→lead send sat on the gate for {@code READINESS_GRACE_POLLS} (~60s) and then failed + * having never been typed into the pane. * *

The lead set is read through the supplier on each call rather than snapshotted, so a lead * discovered by {@code leadScan} after startup becomes deliverable without a restart. diff --git a/bridged/src/test/java/dev/ltms/bridged/mcp/BridgeMcpTest.java b/bridged/src/test/java/dev/ltms/bridged/mcp/BridgeMcpTest.java index 874e8da..ab264ae 100644 --- a/bridged/src/test/java/dev/ltms/bridged/mcp/BridgeMcpTest.java +++ b/bridged/src/test/java/dev/ltms/bridged/mcp/BridgeMcpTest.java @@ -406,15 +406,29 @@ class BridgeMcpTest { } @Test - void anArchitectMcpCallerIsPresent() { + void spawnedMembersAreMarkedPresent() { + Principal worker = Principal.worker("term_worker", 200); Principal architect = Principal.architect("lead-designer", "term_design", 400); MemberPresence presence = new MemberPresence(); + BridgeMcp.markSpawnedMemberPresent(worker, presence); BridgeMcp.markSpawnedMemberPresent(architect, presence); + assertTrue(presence.isPresent("term_worker")); assertTrue(presence.isPresent("term_design")); } + @Test + void nonMembersAreNotMarkedPresent() { + Principal lead = Principal.leader("opus", "term_lead", 100); + MemberPresence presence = new MemberPresence(); + + BridgeMcp.markSpawnedMemberPresent(lead, presence); + BridgeMcp.markSpawnedMemberPresent(Principal.anonymous(), presence); + + assertFalse(presence.isPresent("term_lead")); + } + @Test void statusReportsLiveAgentStatus() { FakeHerdr blocked = new FakeHerdr().agentStatus("blocked");