feat(mcp): let the agent end the roster's hour when it notices a gap #372

Merged
coilyco-ops merged 1 commit from feat/agent-can-refresh-its-roster into feat/roster-hour-ttl-and-refresh 2026-08-13 11:16:28 +00:00
Member

The hour from 363 is only safe if something can end it early, and the thing
best placed to notice a missing tool is the model that just failed to find one.
This is the tool it uses to say so, and the first tool Echo offers that does
not belong to an MCP server.

The collision question I raised on 163 was already answered by the code. The
name is built by the same server__tool rule with harness as the server, so a
rostered server publishing it hits register's existing fatal collision, whose
comment says degrading past it would silently drop whichever tool lost.

Two of the five tests this broke were telling me something. An empty roster is
a documented no-tool capability boundary, so the refresh is offered only when
the roster is non-empty; a tool in the one configuration meant to have none is
a capability claim with nothing behind it. And the proxy test asserts what
reaches the model at the wire, where the count moving from 1 to 2 is the real
change here.

The other four assertions stay exact counts rather than becoming contains
checks. An exact count is what fails when a tool nobody intended appears.

The result text and the description both say the new list lands on the next
turn. A model reading otherwise would tell a member a tool is available before
it can see one, which is 211.

The doc split out rather than squeezing the roster doc past its cap. The first
harness-owned tool is its own concept and a later second one lands beside it.

closes #371

Co-authored-by: Kai Siren coilysiren@gmail.com
Co-authored-by: Claude noreply@anthropic.com

The hour from 363 is only safe if something can end it early, and the thing best placed to notice a missing tool is the model that just failed to find one. This is the tool it uses to say so, and the first tool Echo offers that does not belong to an MCP server. The collision question I raised on 163 was already answered by the code. The name is built by the same server__tool rule with harness as the server, so a rostered server publishing it hits register's existing fatal collision, whose comment says degrading past it would silently drop whichever tool lost. Two of the five tests this broke were telling me something. An empty roster is a documented no-tool capability boundary, so the refresh is offered only when the roster is non-empty; a tool in the one configuration meant to have none is a capability claim with nothing behind it. And the proxy test asserts what reaches the model at the wire, where the count moving from 1 to 2 is the real change here. The other four assertions stay exact counts rather than becoming contains checks. An exact count is what fails when a tool nobody intended appears. The result text and the description both say the new list lands on the next turn. A model reading otherwise would tell a member a tool is available before it can see one, which is 211. The doc split out rather than squeezing the roster doc past its cap. The first harness-owned tool is its own concept and a later second one lands beside it. closes #371 Co-authored-by: Kai Siren <coilysiren@gmail.com> Co-authored-by: Claude <noreply@anthropic.com>
feat(mcp): let the agent end the roster's hour when it notices a gap
All checks were successful
ci / test (pull_request) Successful in 30s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
ci / image-build (pull_request) Successful in 19s
7a895a512d
The hour from 363 is only safe if something can end it early, and the thing
best placed to notice a missing tool is the model that just failed to find one.
This is the tool it uses to say so, and the first tool Echo offers that does
not belong to an MCP server.

The collision question I raised on 163 was already answered by the code. The
name is built by the same server__tool rule with harness as the server, so a
rostered server publishing it hits register's existing fatal collision, whose
comment says degrading past it would silently drop whichever tool lost.

Two of the five tests this broke were telling me something. An empty roster is
a documented no-tool capability boundary, so the refresh is offered only when
the roster is non-empty; a tool in the one configuration meant to have none is
a capability claim with nothing behind it. And the proxy test asserts what
reaches the model at the wire, where the count moving from 1 to 2 is the real
change here.

The other four assertions stay exact counts rather than becoming contains
checks. An exact count is what fails when a tool nobody intended appears.

The result text and the description both say the new list lands on the next
turn. A model reading otherwise would tell a member a tool is available before
it can see one, which is 211.

The doc split out rather than squeezing the roster doc past its cap. The first
harness-owned tool is its own concept and a later second one lands beside it.

closes #371

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
coilyco-ops merged commit 2b60f8f2f0 into feat/roster-hour-ttl-and-refresh 2026-08-13 11:16:28 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo!372
No description provided.