Skip to main content
Glama
haoyifan

Silicon Pantheon

by haoyifan

The first turn-based strategy game where AI agents are the first-class players, not NPCs.

Two AI agents face off on a tactical grid. You don't play — you coach.

Welcome to Silicon Pantheon — the arena where Claude, GPT-5, and Grok scheme across the board, commit to their moves, and throw elbows at each other. You sit on the sideline as a lord: whispering strategy, heckling from the bench, but never touching a unit yourself.

Claude and Grok walk into Thermopylae. One of them has to hold the pass.

The hosted lobby is live right now. game.siliconpantheon.com has open rooms waiting — a handful are kept running by the project so a first-time visitor can drop straight into a real match. Install the client, join, coach. See Play now ↓.


The game

https://github.com/user-attachments/assets/185d281e-a044-4ba4-aec2-15b23d0d8266

Think Fire Emblem, Advance Wars, Tactics Ogre — the whole tactical RPG lineage, distilled. Each agent commands a small army of warriors, mages, archers, cavalry, and whatever heroes the scenario ships with. Units tromp across a grid, trade blows, and push toward a win condition that's different in every battle.

If that's still abstract: picture chess, but the board is bigger, the pieces are stranger, the scenarios have lore, and both sides have a human coach heckling from the corner.

Scenarios

Every match is a scenario — a hand-crafted battle pulled from history, fantasy, or pop culture, each with its own map, army, and victory conditions. A sampler of what ships in the box:

  • Thermopylae. Leonidas and his Spartans hold the narrow pass against Xerxes until dusk. Blue is outnumbered roughly ten to one — cliffs and chokepoints are their only friends.

  • Helm's Deep. Rohan's defenders have to survive the night on the Deeping Wall while the uruk-hai pour up the causeway. Reinforcements arrive at dawn — if anyone's left to greet them.

  • The Long Night. Protect Jon Snow, kill the Night King. Red plays the army of the dead — every hero that falls joins its ranks.

  • Astronomy Tower. Keep Harry Potter breathing until the Order of the Phoenix shows up. Draco and the Death Eaters have a narrow window to end him first.

  • Battle of Arrakeen. Paul Muad'Dib wins by storming the Harkonnen fort, held by the Baron's sardaukar elite. The desert is a hazard in its own right.

  • Marineford. A three-way coastal brawl where every objective ticks down on a short clock.

Win conditions stretch well past "kill everyone": escort a VIP to a tile, hold ground for N turns, survive until reinforcements, storm an enemy fort, protect a named unit from dying. Scenarios can also fire narrative events mid-match and spawn reinforcements by script — Journey to the West drops a skeleton ambush onto the bridge at turn 10, Helm's Deep detonates the culvert halfway through the siege.

Humans as coaches

The AI does the playing. But humans are all over the game — in two very different ways.

Before the match, you pick a strategy playbook. The strategies/ folder is your growing library of doctrines — aggressive rush, defensive chokepoint, VIP escort, whatever patterns you've seen work. Each one is a markdown file: target priorities, map heuristics, when to commit and when to hold. Pick the one that fits the scenario and your agent reads it at game start as captain's intent, then keeps it in mind every turn.

Think of it as an AI lessons catalog written by humans — maintained by you, sharpened over time by your own instincts. A playbook you wrote stays yours forever, and every match you watch is a chance to revise it. The next agent that picks it up inherits every edit you ever made.

During the match, you coach in real time. Watch the action unfold in the TUI. When you see an opening — or a mistake about to happen — type into the Coach panel. Your agent reads the message at the top of its next turn and decides whether to listen.

"push the cavalry on the right flank"

"pull Tang Monk back to the temple — he's overextended"

Lessons

After every match, your agent writes its own post-mortem — what worked, what flopped, what it would do differently next time. These reflections get saved as markdown lessons and can be fed into future matches as context. Your agent gets sharper across runs — not by fine-tuning, but by reading its own diary.


Related MCP server: Haven League

How to play

Play now, no server setup — the hosted lobby

The hosted server at game.siliconpantheon.com is live. Fastest path in: install the client, launch it, done.

curl -LsSf https://astral.sh/uv/install.sh | sh   # if you don't have uv
uv sync --extra dev
uv run silicon-join

On first launch the TUI walks you through provider selection — Claude, OpenAI, or xAI (API keys and existing Claude Code / Codex subscriptions both work) — then drops you into the lobby.

Rooms are already waiting for you. A handful of rooms are kept open on the hosted server so a first-time visitor doesn't need to find a partner to get started — pick an open room, pick your side, pick your provider, and the battle kicks off. You can also host your own room and wait for someone to walk in.

Self-host

Want to run everything on your own iron — one laptop or a LAN party across a few? Stand up a server, point two clients at it.

# Terminal 1 — start the server
uv run silicon-serve

# Terminals 2 and 3 — one client per player (same laptop is fine)
uv run silicon-join --url http://127.0.0.1:8080/mcp/

From the lobby, one player hosts a room and picks a scenario; the other joins. Both click Ready and the battle kicks off. For a spectator-friendly Claude-vs-Claude (or Claude-vs-Grok) on your own machine, open both clients side by side and pick a provider in each. Pick Random on either side if you just want to smoke-test the engine — zero LLM cost, zero judgment.

Write your own scenario

Every scenario is a folder with a YAML config and optional Python rules. Full guide in docs/AUTHORING_SCENARIOS.md — scenario PRs are the first thing we look at in the morning.


Design & architecture

The interesting design lives below the surface. Here's the mental model.

Agents play through tools, not pixels

Agents don't see the board as images and don't control a cursor. The game exposes a compact MCP (Model Context Protocol) tool surface — around 14 tools — and agents observe and act entirely by calling them:

Read-only

Mutating

get_state, get_unit, get_legal_actions, simulate_attack, get_threat_map, get_history, get_coach_messages, describe_class, describe_scenario

move, attack, heal, wait, end_turn

A typical turn, from the agent's point of view:

agent > get_state()                        → { turn: 4, units: [...], last_action: {...} }
agent > get_legal_actions(u_b_knight_1)    → { moves: [...], attacks: [...] }
agent > simulate_attack(u_b_knight_1, u_r_cavalry_2)
                                           → predicted 7 dmg, counter 3
agent > move(u_b_knight_1, {x: 5, y: 3})
agent > attack(u_b_knight_1, u_r_cavalry_2)
...  acts with its remaining units  ...
agent > end_turn()

The MCP server is the sole arbiter of game state. Every illegal action is rejected with an explicit reason — no hallucinated plays, no silent failures.

Scenarios are plugins

A scenario is self-contained — a folder under games/ with everything needed to play. Authors can introduce new unit classes, new terrain types (with per-class movement overrides and mid-match effects), new win conditions via a small DSL, narrative events, and arbitrary Python rule hooks.

# games/journey_to_the_west/config.yaml  (excerpt)

terrain_types:
  river:    { passable: false, glyph: "~", color: blue }
  swamp:    { move_cost: 2, heals: -2, glyph: ",", color: magenta }
  temple:   { defense_bonus: 2, heals: 3, glyph: "T" }

unit_classes:
  tang_monk:
    display_name: Tang Monk
    hp_max: 16   atk: 2   defense: 2   move: 3
    tags: [vip, monk]
    # plus art frames, description, abilities…

win_conditions:
  - { type: reach_tile,            unit: u_b_tang_monk_1, tile: {x: 13, y: 4} }
  - { type: eliminate_all_enemy_units }
  - { type: protect_unit,          unit: u_b_tang_monk_1 }   # lose if killed

rules_plugin: rules.py   # Python hook — e.g. summon a turn-10 skeleton ambush

The engine also supports special abilities with MP costs, inventories and item trades, and damage-type / tag matrices — mechanics the current scenarios deliberately don't use yet. We're being cautious about piling complexity on the AI agents before we know what they handle well; those knobs will open up gradually as we test them. Stay tuned.

The engine validates the schema on load. Unknown fields fail loud, never silent, so scenario authors always know whether their new knob took effect.

Cross-model matches

Every provider plugs in behind the same adapter protocol. Each player picks their provider per match:

  • Anthropic — Claude Opus / Sonnet / Haiku, via your Claude Code subscription or a direct Anthropic API key

  • OpenAI — GPT-5, GPT-5-mini, via an API key or your Codex subscription

  • xAI — Grok-4, Grok-3

  • Random — no LLM, useful for engine tests and authoring

A Claude Sonnet (you, coaching) versus a Grok-4 (your friend, coaching), battlefield of Helm's Deep — that's the showcase we built this whole thing for.

More providers — Google Gemini, Ollama, AWS Bedrock, and others — are on the roadmap but not yet built. Each adapter sits behind the same ProviderAdapter protocol, so adding one is a self-contained PR. Contributions very welcome.

Context-efficient prompting

Scenario invariants (class stats, terrain table, win conditions, starting board, strategy playbook, prior lessons) ship once in a cached system prompt. Per-turn prompts are a small delta — only what actually changed since the agent last acted. A 30-turn match stays cheap to run, even when you're letting frontier models do the thinking.


Dig deeper


Contribute

Silicon Pantheon is early and moving fast. Three ways to jump in:

  • ⭐ Star the repo. If the project sparked your interest, the star is how we know to keep building.

  • 🗡️ Submit a scenario. Open a folder under games/, drop in a config.yaml (and an optional rules.py), open a PR. The best historical battles and fandom set-pieces are the ones nobody's written yet — that could be you.

  • ⚔️ Play a match on the hosted server at game.siliconpantheon.com and share the replay. Every match makes the lessons catalog a little sharper.

Bug reports, feature ideas, and design discussions all welcome in Issues.


License

Apache-2.0. Contributions are accepted under the same license; by submitting a PR you agree that your contribution is licensed under Apache-2.0.

Available Tools

39 tools
attackA

Mutating. Attack an enemy unit, resolving combat and counter-attack immediately. The attacker must be in READY or MOVED status and the target must be within attack range (check via get_legal_actions). unit_id is your attacking unit; target_id is the enemy unit. Both units may take damage; either may die. After attacking, the unit's status becomes DONE for this turn. Use simulate_attack first to preview the outcome without committing. Returns the combat result including damage dealt, counter-damage received, and kill status.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
unit_idYes
target_idYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses mutating nature, both units may take damage, may die, unit status becomes DONE. Since no annotations are provided, the description carries full burden and covers combat effects and result details (damage dealt, counter-damage, kill status).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly long but front-loaded with the key action. It includes necessary details without being overly verbose. Minor redundancy could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of combat resolution and lack of output schema, the description fully covers prerequisites, effects, return value, and suggests using get_legal_actions for range checking. Complete for effective tool usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description explains unit_id and target_id roles. connection_id is not explicitly described but is standard for context. Overall, it compensates well for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Attack an enemy unit, resolving combat and counter-attack immediately.' It includes specific verbs and resource, and distinguishes from sibling tools like simulate_attack (preview without committing) and get_legal_actions (range checking).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: attacker must be in READY or MOVED status, target within attack range (check via get_legal_actions). Recommends using simulate_attack first to preview outcome, providing clear before-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

concedeA

Resign the match — opponent wins immediately.

── Locking ── Three phases, honouring strict lock order (state_lock > session.lock > writer locks):

  1. state_lock: validate connection state, resolve session + team mapping, capture room_id.

  2. session.lock: flip GameStatus + winner, log forfeit to replay (writer lock is a leaf). Idempotent re-check of GAME_OVER inside the lock.

  3. No lock: call _note_game_over_if_needed which runs its own 3-phase protocol to flip room.status = FINISHED and write leaderboard.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full weight. It details a locking protocol with three phases, side effects like flipping GameStatus and logging forfeits, and calls to _note_game_over_if_needed. This is highly transparent about the tool's behavior beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but somewhat verbose with a multi-line locking protocol. It is front-loaded with the main purpose, but the technical details could be more concise. Still, it is structured with bullet points for clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description does not specify return values, but it thoroughly covers the side effects and locking behavior. It is complete enough for a mutation tool, though adding return info would be better.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description does not explain the single parameter 'connection_id' (e.g., how to obtain it or its format). The description adds no meaning beyond the schema's name and type, which is insufficient for a required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Resign the match — opponent wins immediately,' which is a specific verb-resource combination. This distinguishes concede from sibling tools like attack, move, or end_turn.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose is obvious: use when you want to resign. There are no explicit when-not or alternative instructions, but the context is clear enough for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_dev_gameA

Create a single hardcoded dev game and seat this connection in slot A (blue). A second connection can call join_dev_game to take slot B (red) and start the match.

── Locking ── Whole body under state_lock so two concurrent create_dev_game calls can't both observe "no dev game exists" and both create.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
scenarioNo01_tiny_skirmish

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description reveals important behavioral traits: it creates a game, uses a state lock to prevent duplicate creation, and expects a second connection to join. This is transparent about the locking mechanism and the requirement for a second participant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, including a separate section for the locking mechanism. It avoids unnecessary details and is easy to read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, and the two parameters with no description coverage, the description is incomplete. It does not explain parameter roles or return value, leaving gaps for an AI agent to understand proper usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (connection_id, scenario) with 0% coverage in the description. The description does not explain the meaning of connection_id or scenario, nor how they affect the behavior. The schema provides basic type info, but the description adds no value beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool creates a hardcoded dev game and seats the calling connection in slot A (blue). It distinguishes from the sibling tool 'join_dev_game' by mentioning that the second connection uses that tool to take slot B.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that only one dev game can exist, and a second connection must call join_dev_game to start the match. This provides clear context for when to use the tool. However, it does not explicitly state when not to use it or list alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_roomA

Create a new room, seating the caller in slot A as the host.

Transitions the caller from IN_LOBBY to IN_ROOM. Fails if the caller isn't IN_LOBBY or already has a room, if the scenario doesn't load, or if the config fields don't validate.

If max_turns is not provided, defaults to whatever the scenario declares in its YAML rules block.

── Locking ── Field validation + scenario load happen OUTSIDE state_lock (pure I/O on YAML). The actual registration (rooms.create + conn_to_room write + conn.state flip + heartbeat_state write) is done atomically under state_lock with a re-check of the caller's state so a concurrent transition can't slip us into a torn state.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
scenarioYes
max_turnsNo
team_assignmentNofixed
host_teamNoblue
fog_of_warNonone
turn_time_limit_sNo

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: state transitions, locking semantics, default for max_turns, and failure conditions. The detailed locking explanation provides agent-critical context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections and front-loaded main action. It is concise but sufficiently detailed, with no wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters, no output schema, and no annotations, the description covers state transitions, locking, and defaults adequately. However, it omits parameter descriptions and return value details, leaving gaps in completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description only explains the max_turns default. It does not describe connection_id, scenario, team_assignment, host_team, fog_of_war, or turn_time_limit_s. The description fails to compensate for the lack of schema-level documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'create' and the resource 'room', specifying that the caller becomes host in slot A. It distinguishes from siblings like join_room and list_rooms by detailing the state transition and failure conditions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for creating a room, but it does not explicitly state when to use it versus alternatives like create_dev_game or join_room. No guidance on prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_scenarioA

Read-only. Return the full scenario bundle for a given scenario name: narrative description, board dimensions, unit class table (stats and abilities), terrain type table (movement costs and defense bonuses), win conditions, and both armies' compositions. name is the scenario folder name (e.g. 'thermopylae') as listed by list_scenarios. Requires set_player_metadata to have been called. Use this to preview a scenario before hosting or joining a room, or to display unit/terrain legends in the UI.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
nameYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It explicitly declares 'Read-only,' making safety clear. Also details what is returned, ensuring the agent knows the scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with key info. Every sentence adds value; no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains the return content. It also includes prerequisites and usage context, making it complete for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the 'name' parameter with an example (thermopylae) and reference to list_scenarios, adding meaning beyond the schema. The connection_id is not explained but is standard. Schema coverage is 0%, so description compensates well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it's read-only and returns the full scenario bundle, listing all components. It distinguishes itself from sibling tool list_scenarios by specifying that it retrieves detailed data for a given name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases: previewing before hosting/joining a room or displaying legends. Also mentions prerequisite of set_player_metadata, but lacks when-not-to-use scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_replayA

Fetch this connection's match replay as JSONL text.

Available while the connection is IN_GAME (including after the game has ended; token stays valid briefly so clients can download before state is purged).

── Locking ── Resolve phase under state_lock. File read happens OUTSIDE state_lock (may be large). The ReplayWriter has its own lock — reading the file path is a stable-after-init attribute, safe to read without holding the writer lock.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses locking behavior (state_lock during resolve, file read outside state_lock, ReplayWriter lock) and explains the availability window. It does not cover potential side effects, rate limits, or error handling for invalid states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a brief purpose statement followed by a section on availability and locking. It is longer than necessary but each part adds relevant context. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key aspects like timing and locking, but lacks details on the response format (beyond JSONL text), error scenarios (e.g., connection not IN_GAME), and output schema. For a download tool, some of these gaps are acceptable, but overall it feels incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description should compensate by explaining the connection_id parameter. However, it provides no additional meaning beyond the schema title. The parameter remains underdocumented for an AI agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool fetches a match replay as JSONL text. The verb 'Fetch' and resource 'match replay' are specific, and the format is explicitly mentioned. This distinguishes it from sibling tools like get_history (returns JSON) or get_match_telemetry (returns telemetry).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear condition for use: while the connection is IN_GAME, including after the game ends but before state is purged. This gives an important timing context. However, it does not explicitly state when not to use it (e.g., if connection is not IN_GAME) or suggest alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

end_turnA

Mutating. End your turn and pass control to the opponent. Any of your units still in READY or MOVED status will automatically wait. You must call this exactly once per turn after you have finished issuing all move/attack/heal/wait commands. The opponent's turn begins immediately after. Returns an error if it is not currently your turn.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description discloses mutating nature, automatic waiting of units, and immediate opponent turn start. This adds behavioral context beyond a simple 'end turn'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each adding value. Front-loaded with 'Mutating' to indicate side effects. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple turn-ending action, the description covers purpose, usage, and side effects. However, the lack of parameter documentation is a significant gap, especially with no output schema to aid understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single required parameter 'connection_id' has zero schema description coverage, and the tool description does not explain its meaning, purpose, or how to obtain it. The agent is left guessing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'end' and resource 'turn', clearly stating the action. It distinguishes from siblings like 'wait' and 'concede' by naming the specific game action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call: exactly once per turn after all move/attack/heal/wait commands. Also notes error condition for wrong turn. Lacks explicit naming of alternative actions if not ready.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historyA

Read-only. Return the most recent game actions taken by both teams: moves, attacks, heals, waits, and end-turns, each with the acting unit, target, result, and turn number. last_n controls how many actions to return (default 10, max 100). Use this at turn start to understand what the opponent did last turn, especially under fog-of-war where you may not have seen their moves live. For aggregate match statistics use get_match_telemetry instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
last_nNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It declares 'Read-only' indicating no mutations, and describes the returned data (actions, units, targets, turn number). Could add more details like data freshness or pagination limits, but sufficient for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences efficiently convey purpose, usage, and param detail. No fluff, but could be slightly better structured with line breaks for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 2 params and no output schema, description covers purpose, usage guidelines, param details, and sibling differentiation. Lacks explicit return format, but context is adequate for agent to use the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description compensates partially. Explains 'last_n' with default and max values, but does not describe 'connection_id'. Adds value for one parameter but lacks full coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'return', the resource 'most recent game actions', and includes specific action types (moves, attacks, etc.). It distinguishes from sibling 'get_match_telemetry' by focusing on recent turn-by-turn actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance: 'Use this at turn start to understand what the opponent did last turn' and 'For aggregate match statistics use get_match_telemetry instead.' Provides clear when-to-use and when-not-to-use with a named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_leaderboardB

Return aggregated leaderboard stats per model.

Shows win/loss/draw counts, win percentage, and average thinking time for every model that has played at least one match. Sorted by win rate descending.

Timing is logged — this tool hits SQLite on every call (query_leaderboard runs a non-trivial aggregation) and has been implicated in transport hangs when it gets slow.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description discloses important behavioral information: timing is logged, it hits SQLite with a non-trivial aggregation, and it has been implicated in transport hangs when slow. This adds transparency beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three well-structured paragraphs with front-loaded purpose, followed by key details and a performance warning. Every sentence adds value with no redundancy or extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers return fields and performance impact, but omits explanation of the sole parameter (connection_id) and lacks any mention of error handling or empty results. Without an output schema, the return description is helpful but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one required parameter (connection_id) with 0% description coverage, and the description does not mention this parameter at all. The agent receives no help understanding what connection_id represents or how to use it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Return aggregated leaderboard stats per model' and details the fields and sorting, but does not explicitly distinguish from sibling stat tools like get_model_details or get_match_telemetry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives, nor any prerequisites or caveats for appropriate usage. The description only states what it does, not when it should be invoked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_match_telemetryA

Read-only. Return server-tracked match statistics for both teams: total tokens consumed, per-turn thinking time, number of tool calls, and turn count. Available during and after a match. Use this for post-game analysis or mid-game cost monitoring. For game-state history (what moves were made) use get_history instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Although no annotations exist, the description declares 'Read-only' and notes availability constraints ('during and after a match'), providing key behavioral context. It lacks detail on error handling or authorization, but for a simple stats tool this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences: first states core function, second adds usage context, third differentiates from a sibling. It is front-loaded and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description covers purpose, usage, and availability. It lists the returned statistics, providing enough detail for the agent to understand the tool's output, though it omits potential error responses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter 'connection_id' with 0% description coverage. The description does not explain what 'connection_id' refers to or its format, leaving the agent to infer its meaning from context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Return server-tracked match statistics for both teams' and lists specific fields (total tokens, thinking time, etc.), clearly defining the tool's purpose and distinguishing it from the sibling tool 'get_history'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies when to use ('Available during and after a match', 'post-game analysis or mid-game cost monitoring') and explicitly states the alternative: 'For game-state history use get_history instead.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_model_detailsA

Return drill-down stats for a single model.

Includes aggregated totals, head-to-head per opponent, and per-scenario win/loss breakdown. Used by the ranking detail screen when the lobby user presses Enter on a model row.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
modelYes
providerYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It explains the return content (aggregated totals, head-to-head, per-scenario breakdown) but does not disclose behavioral traits like idempotency, side effects, or required permissions. The read-only nature is implied but not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short paragraphs: the first states the core purpose, the second lists content and usage. Every sentence contributes value, and no unnecessary text is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description partially covers return details but omits parameter explanations. It suits a drill-down stats tool but lacks completeness for data format specifics, which would help an agent interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, meaning the parameter names and types are self-explanatory only by their names. The description does not add any meaning beyond the schema, leaving the agent to infer the purpose of connection_id, model, and provider.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Return drill-down stats for a single model' with specific verb and resource. It lists included breakdowns (aggregated totals, head-to-head, per-scenario) and distinguishes from sibling tools like get_leaderboard and get_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: 'Used by the ranking detail screen when the lobby user presses Enter on a model row.' This indicates when to invoke, but does not offer when-not-to-use or alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_room_stateC

Show the caller's current room, seats, readiness, and countdown.

── Locking ── Reads (conn, info, room, serialize, autostart_deadlines) are all done under a single state_lock acquisition so the serialized snapshot is internally consistent. _maybe_promote_on_deadline is called INSIDE the lock too; it reads+mutates state under the same critical section to avoid a TOCTOU with the deadline.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals that the tool may call _maybe_promote_on_deadline, which 'reads+mutates state under the same critical section,' implying potential side effects beyond a pure read. However, given no annotations, it partially compensates for missing behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose with implementation details about locking that are not essential for tool selection. The first sentence is clear, but the rest is overly technical for an AI agent's decision-making.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Lacks output format, error conditions, and usage context. The implementation details do not compensate for the missing output schema and parameter descriptions, leaving the tool incomplete from an agent's perspective.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not explain the connection_id parameter, providing no value beyond the schema's title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool shows 'the caller's current room, seats, readiness, and countdown,' which is specific and distinguishes it from sibling tools like get_state or get_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus siblings. The description focuses on internal locking rather than contextual usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_scenario_bundleA

Return ALL scenario descriptions in a single response.

The bundle includes every scenario's full describe_scenario output plus a content hash. The client caches the bundle locally; on the next login it sends cached_hash — if it matches, the server returns {ok, match: true} (no data transfer). If it doesn't match (scenarios changed), the full bundle is returned.

This replaces 30+ sequential describe_scenario calls with one round-trip (~200ms vs ~7s).

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
cached_hashNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully discloses caching mechanism, conditional response, and efficiency gains. No contradictions or hidden behaviors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise three-paragraph structure with front-loaded purpose and efficient use of space—every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with caching, description covers response format and workflow. Could mention error handling or authentication briefly, but sufficient for intended use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage 0%, but description explains cached_hash purpose and behavior. connection_id is not elaborated but is clear from name and required status.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states it returns ALL scenario descriptions in a single response, explicitly contrasting with describe_scenario to show its batch nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use: replaces 30+ sequential describe_scenario calls, with performance metrics. Also explains caching workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stateA

Read-only. Return the full game state visible to your team: board dimensions, terrain grid, all visible units (with hp, status, position, class), current turn number, active player, and win-condition progress. Fog-of-war hides enemy units outside your vision range. Use at turn start to orient before calling get_legal_actions or get_tactical_summary for specific decisions. connection_id identifies your server session (assigned at connect time).

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses the read-only nature and the scope of returned data, including board dimensions, terrain, units, turn number, and win-condition progress. It also describes the fog-of-war limitation, which is critical behavioral information beyond what an annotation would provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, starting with the read-only attribute, then listing returned data, followed by a note on fog-of-war, usage guidance, and parameter explanation. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description thoroughly covers the returned game state elements and the fog-of-war effect. However, without an output schema, explicitly stating the format (e.g., JSON object) would enhance completeness. Nonetheless, it provides sufficient information for an AI agent to understand what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has a single parameter connection_id with no description. The tool's description explains that connection_id identifies the server session and is assigned at connect time, adding crucial semantic context that is absent from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns the full game state visible to the user's team, listing specific components such as board dimensions, terrain grid, and unit details. It differentiates from sibling tools like get_legal_actions and get_tactical_summary by positioning get_state as a broad orientation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states to use the tool at turn start before calling get_legal_actions or get_tactical_summary for specific decisions. It also explains the fog-of-war behavior, which helps the agent understand when to expect incomplete information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tactical_summaryA

Precomputed 'what's worth doing this turn' digest: attack opportunities your units can execute right now (with predicted damage/counter/kill outcomes), threats against your units from visible enemies, and units still in MOVED status pending action. Call once per turn-start instead of many simulate_attack / get_threat_map calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description discloses it's a read-only digest with predicted outcomes, threats, and pending actions. Could mention it's non-destructive, but sufficient context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no waste. First sentence lists content, second gives usage guidance. Front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter and no output schema, description adequately covers purpose, usage, and content. Could slightly improve by explicitly stating it's read-only and the role of connection_id, but still complete for a summary tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and description adds no information about the single parameter connection_id. Parameter is self-explanatory, but description fails to compensate for missing schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides a precomputed digest of attack opportunities, threats, and MOVED status units, with specific verb+resource and distinct from siblings like simulate_attack.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call once per turn-start instead of many simulate_attack / get_threat_map calls', providing clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_threat_mapA

Read-only. Return a board-wide map of enemy threat coverage: for each tile, which visible enemy units can reach and attack it. Only includes enemies visible through fog-of-war. Use this to identify safe tiles for positioning and retreat; for a single unit's reach use get_unit_range instead. For a combined digest of threats and opportunities, prefer get_tactical_summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. States it is read-only, defines scope (board-wide, per tile, visible enemies), and gives return content. Lacks mention of edge cases (e.g., no enemies) but overall clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences. First defines core purpose, second adds filtering constraint, third provides usage guidance and alternatives. Front-loaded and no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description adequately explains return value (map of threat coverage per tile) and visibility constraints. Missing details on exact format or edge cases, but sufficient for basic use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has one parameter (connection_id) with 0% coverage; description does not mention it at all. While connection_id is standard for session, the low coverage requires compensation that is absent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it returns a board-wide map of enemy threat coverage for each tile. Distinguishes from siblings by mentioning get_unit_range for single unit and get_tactical_summary for combined digest.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (identify safe tiles for positioning/retreat) and when not to, with alternatives: get_unit_range for single unit, get_tactical_summary for combined digest. Also specifies only visible enemies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_unitA

Read-only. Return one unit's full details: hp, max_hp, attack, defense, class, position, status (READY/MOVED/DONE), and abilities. Works for your own units and visible enemy units; returns an error if the unit is hidden by fog-of-war or does not exist. unit_id is the string identifier shown in get_state output (e.g. 'blue_archer_1'). Prefer get_state for bulk inspection; use this when you need one unit's details after a specific action.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
unit_idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses read-only nature, lists return fields, and describes error conditions (hidden units, missing). This is comprehensive behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with key information. No unnecessary words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description lists return fields (hp, max_hp, etc.), mentions error conditions, and provides usage guidance against sibling. Covers essential context for the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must compensate. It explains unit_id with an example ('blue_archer_1'), but does not explain connection_id. Partial value, but not full compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it is read-only and returns one unit's full details listing specific fields like hp, max_hp, attack, etc. Distinguishes itself from sibling 'get_state' for bulk inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: 'Prefer get_state for bulk inspection; use this when you need one unit's details after a specific action.' Also notes it works for visible units but errors if hidden by fog-of-war or does not exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_unit_rangeA

Read-only. Return a unit's full threat zone: the set of tiles it can move to and the set of tiles it can attack from any reachable position. Works for any alive unit, own or enemy. unit_id is the string identifier from get_state (e.g. 'red_cavalry_2'). Use this to plan positioning or evaluate enemy threat coverage; for a board-wide enemy threat overview prefer get_threat_map instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
unit_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Starts with 'Read-only' indicating non-destructive operation. States works for any alive unit, own or enemy, clarifying ownership constraints. Lacks details on error handling or rate limits, but adequately covers key behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with 'Read-only,' no wasted words. Efficiently conveys purpose, usage, and alternative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and two parameters, the description covers behavior, input format, and usage guidance. Lacks mention of error conditions or what happens with invalid inputs, but is sufficient for basic use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must compensate. It explains unit_id with an example ('red_cavalry_2') but does not explain connection_id at all. With only two parameters and one left undocumented, the description does not fully compensate for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool returns a unit's full threat zone (move and attack tiles) and specifies it works for any alive unit, own or enemy. It distinguishes from sibling tool get_threat_map by noting the difference between single-unit and board-wide overview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (plan positioning or evaluate enemy threat coverage) and when to prefer alternative (get_threat_map for board-wide overview). Also provides unit_id format example.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

healA

Mutating. Heal an adjacent allied unit. Only units with the heal ability (typically Mages) can use this. healer_id is your healing unit (must be READY or MOVED); target_id is an adjacent allied unit that is damaged. Restores HP based on the healer's magic stat. After healing, the healer's status becomes DONE for this turn. Use get_legal_actions on the healer to see which allies are valid heal targets. Returns the amount healed and the target's updated HP.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
healer_idYes
target_idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, but description fully discloses effects: mutating, healer becomes DONE, HP restoration based on magic stat, return values. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five efficient sentences, front-loaded with 'Mutating.', each sentence adds necessary detail without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description mentions return values. References get_legal_actions for target validation. Covers prerequisites and consequences fully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

0% schema coverage; description explains healer_id and target_id conditions thoroughly. connection_id is not explained but likely contextually understood.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool heals an adjacent allied unit, specific to units with heal ability. It distinguishes from attack (damages enemies) and move (repositioning).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance: healer must be READY or MOVED, target must be adjacent and damaged. Recommends get_legal_actions to find valid targets. Lacks explicit when-not-to-use, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heartbeatC

Lightweight liveness ping. Returns server time in seconds.

conn.last_heartbeat_at is written without taking state_lock — a single-float store is GIL-atomic and this tool fires every ~10s per connection, so paying lock contention here would dominate the sweeper's cost for no correctness gain. Documented deliberate carve-out; see docs/THREADING.md.

Timed: if the server can't even respond to a heartbeat in <200ms, something is blocking the event loop and we want a log line to pin down when it started.

Diagnostic INFO log: also logs each heartbeat with the pre-write idle interval (now - previous_last_heartbeat_at). Grep for a specific cid to see exactly whether heartbeats are still landing for a supposedly-dead connection — when a client should be gone but the cid is somehow still being kept alive, this log proves WHO's ponging.

At INFO (not DEBUG) because we need it visible during ongoing investigations without forcing every operator to raise log level. Fires ~once per 10s per connected client — volume is modest.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

C2.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses key behaviors: it writes a field without locks for performance, logs at INFO level, and includes timing. This provides good insight into side effects and logging behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose with implementation details (e.g., GIL-atomic store, locking trade-offs) that are not essential for tool selection and could be omitted or summarized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers return value and logging behavior, but omits error handling, prerequisites, and more detail on the return format. It is adequate but not thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter 'connection_id', but the description does not clarify its meaning or usage. With 0% schema description coverage, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states the tool's purpose: 'Lightweight liveness ping. Returns server time in seconds.' This is specific and distinguishes it from sibling tools, though no explicit comparison is made.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions it fires every ~10s per connection and is used for monitoring, but does not explicitly state when an agent should invoke it or when alternatives are preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

join_dev_gameA

Mutating. Development-only shortcut: join the first available room as the red player and start the match immediately, bypassing the normal ready-up flow. Requires state=in_lobby (call set_player_metadata first). Returns the room_id and assigned slot. In production, use join_room + set_ready instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description discloses key behavioral traits: mutation, dev-only shortcut, bypass of ready-up flow, requirement for specific state, and return values (room_id, assigned slot). Missing details on possible errors or limits, but adequate for a simple tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: first sentence states mutating behavior and purpose, second states prerequisite, third states return and production alternative. Front-loaded with key keywords for quick agent scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description covers purpose, usage, and behavior well, it omits explanation of the input parameter `connection_id`. For a tool with one parameter and no output schema, this gap reduces completeness. The prerequisite mentions state but doesn't clarify the parameter's role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one parameter `connection_id` with 0% coverage in description. The description provides no explanation of what connection_id is or how to obtain it. With low schema coverage, the description must compensate but fails entirely, leaving the agent uninformed about the sole required input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'join' and resource 'dev game', specifying it's a development-only shortcut that joins the first available room as red player and starts the match. It distinguishes from sibling tools like join_room by highlighting the bypass of normal ready-up flow and production use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: development-only shortcut with prerequisite (state=in_lobby, call set_player_metadata first). Also gives clear alternative for production: use join_room + set_ready instead. This helps the agent decide when to invoke this tool vs alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

join_roomA

Mutating. Join an existing room by taking its open seat. Requires state=in_lobby (call set_player_metadata first). room_id is the room's string identifier from list_rooms. Returns the assigned room_id and slot (A or B). Fails if the room is full, does not exist, or you are already in a room. After joining, call set_ready to signal readiness; the match starts when both players are ready. To leave before the match starts, use leave_room.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
room_idYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses the mutating behavior, failure conditions (room full, doesn't exist, already in room), and return values (room_id and slot). There is no contradiction with structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with 'Mutating', and each sentence serves a specific purpose: precondition, parameter source, return, failure cases, and next steps. No extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and 2 parameters, the description covers most essential behavioral details. The only gap is the lack of explanation for connection_id, but overall it provides enough context for correct tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 2 parameters with 0% schema coverage. The description explains room_id as 'the room's string identifier from list_rooms' but does not explain connection_id, leaving the agent to infer its purpose. This partially adds value over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Join an existing room' using a specific verb and resource. It distinguishes from sibling tools like 'create_room', 'leave_room', and 'list_rooms' by providing context about the room lifecycle and preconditions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly specifies when to use this tool: requires state=in_lobby and set_player_metadata first. It also gives explicit guidance on next steps (call set_ready) and alternatives for leaving (use leave_room).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kick_playerA

Host-only: kick the joiner (slot B) from the room.

Only works pre-game (WAITING_FOR_PLAYERS, WAITING_READY). The kicked player's connection returns to IN_LOBBY. Cannot be used during gameplay.

── Locking ── Whole sequence runs under state_lock so status + joiner lookup + eviction are atomic.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description discloses atomicity via state_lock and the effect (connection returns to IN_LOBBY). Could mention reversibility or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, structured with clear sections. Every sentence adds value. No extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers prerequisites (host-only, pre-game), effect, and atomicity. Missing mention of whether action is reversible or how to get connection_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage 0%, description does not explain connection_id parameter beyond its name. Agent may not know how to obtain it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'kick', resource 'joiner (slot B)', and host-only constraint. Distinct from siblings like leave_room and join_room.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states pre-game only (WAITING_FOR_PLAYERS, WAITING_READY) and cannot use during gameplay. However, does not compare to alternatives or indicate when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

leave_roomA

Vacate this connection's seat and return the caller to the lobby.

Accepts from IN_ROOM (pre-game) OR IN_GAME (mid-match or post-match). Mid-match departures used to leave a zombie room — the opponent was stranded because the engine's turn loop still required input from the now-vacated seat, so the room sat in_game until max_turns × turn_time_limit force-ended empty turns (hours). Fixed here by auto-conceding the leaver's team on the way out: the opponent wins by concede, the room flips to FINISHED, the leaderboard rows land, everyone moves on. Post-match departures are the normal 'back to lobby' flow.

── Locking ── Three phases, no nested locks:

  1. state_lock: peek at (conn, room_id, slot, is_in_game, leaver_team) — everything we'll need. Does NOT mutate.

  2. session.lock (only if we decided to auto-concede): flip session.state.status = GAME_OVER via the same concede tool end_game dispatches use. Guarded by a re-check of session.state.status so we never double- concede a match that finished between phases.

  3. state_lock: original mutation path (pop conn_to_room, vacate seat, clean up pre-game rooms, etc.).

After all locks, call _note_game_over_if_needed to transition the room IN_GAME → FINISHED and record the leaderboard match. That function has its own 3-phase locking protocol.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses critical behavioral traits: auto-concede for mid-match, locking protocol with three phases, and transition to FINISHED state. The internal implementation details (variable names, lock order) are transparent, providing a complete picture of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose in the first sentence, but includes several paragraphs of internal locking implementation that may be excessive for an agent. While structured with headings, it lacks conciseness; the locking details could be summarized without sacrificing essential transparency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description explains the tool's lifecycle: returning to lobby, auto-concede, state transitions, and locking. However, it omits description of the single parameter and what the tool returns (if anything). This gap reduces completeness but overall coverage of behavior and side effects is strong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage for the single required parameter 'connection_id'. The description does not explain the parameter's meaning beyond the name, nor does it provide any guidance on its format or usage. Given the low coverage, the description should compensate but fails to add value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Vacate this connection's seat and return the caller to the lobby.' It also specifies accepted states (IN_ROOM, IN_GAME) and distinguishes from siblings like 'concede' by noting auto-concede behavior. The verb 'vacate' and resource 'connection's seat' are specific, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: from IN_ROOM (pre-game) or IN_GAME (mid-match or post-match). It explains the behavioral difference for mid-match departures (auto-concede) versus post-match (normal lobby return). However, it does not explicitly contrast with alternatives like 'concede' or state when not to use it, which would improve guidelines.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_roomsB

List rooms currently open. Available in any post-anonymous state.

FINISHED rooms are excluded — they're rubble waiting to be vacated and have no relevance to someone picking a match.

── Locking ── Connection state check + rooms.list() + serialization happen under state_lock so the snapshot is internally consistent (no rooms disappearing mid-serialization, no half-built seat dicts).

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It explains the internal locking mechanism for consistency and mentions that FINISHED rooms are excluded. However, it doesn't specify whether the operation is read-only, any side effects, or performance implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is mostly concise with a clear front-loaded purpose statement. However, the technical block about locking is somewhat verbose and may not be essential for the agent's decision-making, adding some unnecessary length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool lacks an output schema, but the description does not describe the return format (e.g., list of room IDs or objects). It also introduces the term 'post-anonymous state' without explanation, leaving knowledge gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter (connection_id) with no description. The tool description provides no explanation of this parameter, leaving the agent without guidance on what connection_id means or how to obtain it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists rooms that are currently open, using the verb 'list' and resource 'rooms'. It distinguishes from siblings like create_room or join_room by focusing on listing. The qualifier 'currently open' and the exclusion of FINISHED rooms further clarify scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions 'Available in any post-anonymous state', providing some context on when to use it. However, it does not explicitly say when not to use it compared to alternatives like get_room_state or preview_room, nor does it mention any prerequisites beyond connection_id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_scenariosA

Enumerate scenarios available on this server.

Walks the packaged games/ directory and returns the sub-directory names that have a readable config.yaml. The client uses this to populate the 'change scenario' dropdown in the room screen.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It describes internal mechanics (walks directory, checks config.yaml) and implies read-only, non-destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, the first is a clear summary, the second adds implementation detail. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Explains purpose, mechanism, and client usage. However, missing explanation of the connection_id parameter and the return format (list of strings) would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, connection_id, is required but not explained in the description. Schema description coverage is 0%, and description adds no meaning beyond the field title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it enumerates scenarios by walking a directory, and distinguishes from siblings like describe_scenario (detail) and get_scenario_bundle (bundle). It specifies the client use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use case (populate dropdown), but lacks explicit when-not-to-use or comparison with other list-like siblings such as list_rooms.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

moveA

Mutating. Move one of your units to a destination tile. The unit must be in READY status and the destination must be within its movement range (check via get_legal_actions). unit_id is the unit's string identifier. dest is an {x, y} dict for the target tile. After moving, the unit's status changes to MOVED — it can still attack, heal, or wait, but cannot move again this turn. Returns the updated unit state. Returns an error if the unit is not yours, not READY, or the destination is unreachable.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
unit_idYes
destYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses mutating nature (first word 'Mutating.'), status changes, return type (updated unit state), and error conditions. With no annotations, description fully carries the behavioral disclosure burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with keyword 'Mutating.' Each sentence adds value: purpose, conditions, parameter details, consequences, return, errors. Could be slightly more structured but efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers prerequisites, side-effects, return value, and error conditions. References get_legal_actions for range checking. No output schema but describes return as updated unit state. Sufficient for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Explains unit_id as string identifier and dest as {x,y} dict. Connection_id is not explained despite being required and having no schema description. 0% coverage means description must compensate; it covers 2 of 3 parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Move one of your units to a destination tile' with specific verb+resource. Distinguishes from siblings like attack, heal, wait by specifying conditions and effects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states prerequisites: unit must be READY, destination must be within movement range (check via get_legal_actions). Also notes consequences: status changes to MOVED, can still attack/heal/wait but not move again. Lists error conditions for invalid moves.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_roomA

Read-only. Return a room's current state: scenario name, board layout, seat occupancy (which players are seated and their ready status), and room configuration (fog-of-war setting, team assignment mode). room_id is the string identifier from list_rooms. Requires set_player_metadata. Use this to inspect a room before joining with join_room, or to check ready status while waiting for the match to start.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
room_idYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Declares 'Read-only' upfront and mentions prerequisite 'Requires set_player_metadata.' This covers key behavioral traits despite no annotations. However, it does not mention potential errors or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise, front-loaded with 'Read-only,' and structured logically. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, it adequately describes return values (scenario, layout, occupancy, config) and usage context. Missing error conditions but otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It explains room_id ('string identifier from list_rooms') but gives no information about connection_id. Only partial parameter meaning added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies 'Read-only. Return a room's current state' and enumerates specific components (scenario name, board layout, etc.). It distinguishes itself from siblings by stating usage for previewing before joining, which is distinct from other tools like get_room_state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states use cases: 'inspect a room before joining with join_room' and 'check ready status while waiting for the match to start.' It also identifies the source for room_id. While it doesn't list when not to use, the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_thoughtA

Record an agent reasoning entry to this match's replay.

Side-channel for networked clients to push their LLM's chain-of-thought to the server so the post-match replay file captures it (the TUI replayer renders agent_thought events alongside actions). Without this, networked replays only show actions; the reasoning lived in the client's TUI panel and was lost.

NOT exposed in the LLM-facing GAME_TOOLS list — the model shouldn't call this itself; the NetworkedAgent's on_thought callback fires it as a side-effect of every assistant response. The connection's pinned (slot → team) mapping determines which side the thought is attributed to.

── Locking ── Resolve (state + room + session + viewer) atomically under state_lock. session.add_thought takes care of its own write synchronisation via the writer lock; the thoughts buffer + hook fire happen inside add_thought and don't need session.lock (action_hooks is a leaf append).

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
textYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and excels: it discloses the side-channel nature, attribution via connection mapping, locking mechanisms (state_lock, writer lock), and that it's triggered as a side-effect. Completely transparent about behavior beyond schema fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections and front-loaded purpose. However, the locking details are somewhat verbose for an AI agent; some sentences could be tightened without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (side-channel, locking, non-LLM-visible), the description covers purpose, invocation rules, behavioral traits, and synchronization. No output schema exists, but the description doesn't need to explain return values; it's complete for agent understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage, the description adds meaning to the parameters: connection_id is linked to attribution via pinned mapping, and text is the reasoning content. It does not detail format constraints, but the context is sufficient for understanding parameter roles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: 'Record an agent reasoning entry to this match's replay.' It clearly identifies the resource (replay) and distinguishes from siblings by explaining its role as a side-channel for replay capture, not a game action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the tool is NOT exposed in GAME_TOOLS and should not be called by the model; it's fired as a side-effect by a callback. This provides clear when-not-to-use guidance and explains the intended invocation path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_issueA

Record an agent-observed problem (bug / confusion / suggestion).

Called by the agent when something during play doesn't match what it expected — rules that seem broken, a scenario that feels inconsistent, tool results that contradict each other, or just "I'm confused about X". The server persists the report to three sinks so it's easy to review later:

  1. Match replay (as an agent_report event, turn-tagged).

  2. Server log, logger silicon.agent_report at INFO.

  3. Per-day jsonl file at ~/.silicon-pantheon/debug-reports/YYYYMMDD.jsonl.

category must be one of: bug, confusion, rules_unclear, scenario_issue, imbalance, suggestion. Any other value is rejected so grep -c on the file gives meaningful counts. Use imbalance specifically for "this scenario feels lopsided" observations (one team has structural advantage that makes the match trivial / unwinnable) — separate from scenario_issue (broken placement / wrong unit / unreachable tile) so balance-tuning reviews can be filtered cleanly.

Always available (no SILICON_DEBUG gate) — whether a player reports depends on whether the prompt tells them to, which IS debug-gated in the client. This keeps the tool usable for anyone who wants to flag something regardless of mode.

── Locking ── Resolve (state + room + session + viewer) atomically under state_lock; the three sink writes happen OUTSIDE the lock (they do I/O — file append, logger write).

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
categoryYes
summaryYes
detailsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully explains the tool's behavior: it persists reports to three sinks (replay, log, jsonl), handles category validation, and describes locking mechanics. This provides sufficient transparency about side effects and conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, sinks, categories, availability, locking). It is front-loaded with the main purpose. While slightly verbose, every sentence adds value, and the structure aids readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description provides comprehensive context: persistence sinks, category semantics, availability, and locking. It covers most behavioral aspects, though it does not detail return values or error handling for invalid categories, which would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It thoroughly explains the 'category' parameter with allowed values and usage, and implies 'summary' as a brief description. However, 'connection_id' is not explicitly described, and 'details' is only mentioned as optional. This leaves some ambiguity for the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool records agent-observed problems like bugs, confusion, or suggestions. It provides specific examples and distinguishes between similar categories such as 'imbalance' and 'scenario_issue', making it distinct from sibling tools like 'record_thought' or 'report_tokens'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description details when to use the tool (when expectations are violated) and provides specific category usage (e.g., 'imbalance' for lopsided scenarios). It also clarifies availability ('Always available') but does not explicitly mention alternatives or when not to use it, which is a minor gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_tokensA

Mutating. Report the number of LLM tokens consumed by your agent this turn so the server can track and display cost statistics for both sides. tokens is a positive integer representing the total token count for this turn's inference. Called by the client harness after each agent turn; not typically called by the agent itself. The value is stored server-side and visible to both teams via get_match_telemetry.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
tokensYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description labels the action as 'Mutating' and explains that the value is stored server-side. However, it lacks detail on side effects, idempotency, or permission requirements. With no annotations, the description carries the full burden but is only moderately transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with 3-4 sentences, front-loaded with the mutation indicator. Every sentence adds value, though it could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple reporting tool with two parameters and no output schema, the description provides sufficient context about purpose, usage, and parameter semantics (except connection_id). The inclusion of server-side storage and visibility via get_match_telemetry adds completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the 'tokens' parameter as a positive integer for the token count, which adds meaning beyond the schema. However, 'connection_id' is not described, and since schema coverage is 0%, the description only partially compensates for the missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool reports LLM token consumption for cost tracking. The description is specific about what is reported and why, and it distinguishes itself from sibling tools like report_issue by focusing on tokens.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly notes that the tool is called by the client harness after each turn and is not typically called by the agent itself. This provides clear guidance on when to use it, though it does not mention alternatives or when not to use it beyond self.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_to_agentA

Mutating. Coach-only tool: queue a natural-language message that will be delivered to the specified team's AI agent at the start of its next turn. team must be 'blue' or 'red'. text is the coaching instruction (e.g. 'push cavalry on the right flank'). The agent sees the message as context but is free to ignore it. Only human coach connections can use this; AI agent connections receive an error. Messages are not visible to the opposing team.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
teamYes
textYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses key behaviors: it mutates state, queues the message for the next turn, the agent may ignore it, and messages are not visible to the opposing team. This provides sufficient transparency for an AI agent to understand the tool's effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first covers purpose, constraints, and parameters; second adds behavioral details. No extraneous information. The description is front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 required parameters, no output schema, and no annotations, the description adequately covers the tool's function, constraints, and parameter semantics. It could mention error handling for invalid team values or connection types, but the core information is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameter descriptions (0% coverage), so the description adds crucial meaning: 'team' must be 'blue' or 'red', 'text' is a coaching instruction. 'connection_id' is implied to identify the human coach connection. While 'connection_id' is not explicitly explained, the context 'Coach-only tool' gives enough hint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the exact action ('queue a natural-language message') and the resource ('team's AI agent'). It also states the delivery timing ('at the start of its next turn'). This clearly distinguishes it from sibling tools like 'attack' or 'move', which are direct game actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly restricts usage to human coach connections and states that AI agent connections receive an error. It also specifies that team must be 'blue' or 'red'. However, it does not explicitly state when not to use this tool or suggest alternatives, though no siblings serve a similar purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_player_metadataA

Mutating. Register your identity with the server. Must be called before any lobby operations (list_rooms, join_room, host_room, etc.). display_name is your player name shown to others. kind must be 'human' or 'agent'. provider is the AI provider name (e.g. 'anthropic', 'openai') — required when kind='agent', ignored for humans. model is the specific model ID (e.g. 'claude-sonnet-4-6'). version is the client software version string. client_protocol_version is an optional integer for wire-format compatibility; clients below the server's minimum version are rejected with an upgrade prompt. Can be called again to update metadata. Returns the confirmed player profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
display_nameYes
kindYes
providerNo
modelNo
versionNo1
client_protocol_versionNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses mutating behavior and parameter effects. It explains conditional requirements (provider for agents), idempotent update behavior, and rejection logic for client_protocol_version, exceeding expectations for transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single paragraph, well-structured, no redundant words. Every sentence earns its place by conveying purpose, prerequisites, parameter details, and update ability. Optimal length for LLM consumption.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters and no output schema, the description covers registration context, parameter semantics, and behavior. It mentions the return value ('confirmed player profile') and all relevant operational details, leaving no gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description compensates by explaining each parameter's purpose and constraints (display_name, kind, provider conditional, model, version, client_protocol_version). Adds critical meaning beyond schema structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool registers identity with the server, a prerequisite for lobby operations. It uses specific verbs ('Register', 'Must be called before') and distinguishes from siblings like heartbeat or whoami by defining its role as an initialization step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('before any lobby operations') and lists excluded situations (e.g., provider ignored for humans). Provides conditions for parameters and mentions update capability, giving clear usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_readyA

Mutating. Toggle your readiness in a room. ready=true signals you are ready to start; ready=false unreadies you. Requires state=in_room (join a room via join_room first). When both seats are filled and both players are ready, the server starts a 10-second countdown and then begins the match automatically. The countdown is cancelled if either player unreadies, leaves, or disconnects. Returns the updated room status including both players' ready states.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
readyYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description fully discloses behavioral traits: it is mutating, requires being in a room, triggers a countdown when both ready, and cancels on unready/leave/disconnect. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4 sentences) and front-loaded with the purpose. It efficiently covers prerequisites, behavior, and return value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers return value (updated room status), prerequisites, behavioral details, and edge cases (countdown cancellation). Complete for a simple toggle tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must explain parameters. It thoroughly explains the 'ready' boolean but does not explicitly describe 'connection_id'. However, the context of toggling your own readiness implies it identifies the player.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: toggling readiness in a room with explicit meaning of true/false. It distinguishes the tool's purpose from siblings by specifying preconditions and the effect on match start.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear prerequisite (state=in_room via join_room) and describes the countdown behavior when both ready. It lacks explicit 'when not to use' but sufficiently guides usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simulate_attackA

Read-only. Predict the outcome of an attack without changing game state: returns expected damage dealt, counter-damage received, and whether either unit would die. attacker_id and target_id are unit string identifiers from get_state. from_tile is an optional {x, y} dict to simulate attacking from a different position than the attacker's current tile (useful for evaluating move-then-attack sequences). Use this to compare attack options before committing with the attack tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
attacker_idYes
target_idYes
from_tileNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description fully discloses the read-only nature, no state change, and specifies the return format (expected damage, counter-damage, unit deaths). This exceeds expectations for a tool without annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences front-load the core purpose and behavior, with no redundant information. Every sentence serves a distinct purpose: purpose, parameter details, and usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description explains return values. It covers all parameters with relevant context, differentiates from the sibling 'attack' tool, and is self-contained for an agent to decide when to use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds essential meaning: it identifies 'attacker_id' and 'target_id' as unit identifiers from 'get_state', and explains 'from_tile' as an optional dict for different positions. Only 'connection_id' lacks explanation, but it is standard.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool predicts attack outcomes without changing game state, listing specific return values. It distinguishes from the sibling 'attack' tool by explicitly stating it is read-only and used for comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using this before committing with 'attack' and explains the optional 'from_tile' parameter for evaluating move-then-attack sequences. It does not explicitly state when not to use, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_room_configA

Host-only: tweak room config while still in the lobby.

Only fields passed (non-None) are updated. Any change resets both seats' ready flags — if readiness was previously agreed upon, the config shift might change the deal. Fails outside the pre-game states (COUNTING_DOWN, IN_GAME, FINISHED).

── Locking ── Input validation + scenario load happen OUTSIDE state_lock (pure I/O). The actual config mutation + readiness reset happen atomically under state_lock.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
scenarioNo
team_assignmentNo
host_teamNo
fog_of_warNo
max_turnsNo
turn_time_limit_sNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors: only non-None fields updated, ready flags reset on any change, atomic mutation under state_lock, and failure conditions outside pre-game states. No annotations, so description carries full burden and does well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with clear sections and about 6 sentences. Could be slightly tighter, but overall well-organized and not overly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite good usage and transparency, missing parameter explanations and no output schema make it incomplete for an agent to correctly invoke the tool, especially with 7 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has zero descriptions (0% coverage) and description does not explain individual parameters like scenario, team_assignment, etc. It only states that only passed (non-None) fields are updated, leaving parameter meaning unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'tweak room config while still in the lobby' with specific verb 'tweak' and resource 'room config', distinguishing it from siblings like create_room, join_room, preview_room, and set_ready.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Specifies 'Host-only' and 'while still in the lobby', and notes it fails outside pre-game states (COUNTING_DOWN, IN_GAME, FINISHED). However, it does not explicitly state when not to use or suggest alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

waitA

Mutating. End this unit's turn without attacking or healing, setting its status to DONE. The unit must be in READY or MOVED status. unit_id is the unit's string identifier. Use when a unit has no useful attack or heal targets this turn but you want to finalize its position after moving. Once all your units are DONE (or you have no more actions), call end_turn to pass control to the opponent.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes
unit_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses mutating nature, status change to DONE, and prerequisites. Could mention if this triggers any automatic opponent turn, but overall clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is informative but a bit verbose; could be more concise. However, it is well-structured and front-loaded with the key verb 'Mutating.'

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simple action, no output schema, and no annotations, the description covers purpose, prerequisites, usage context, and next step completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%; description only explains unit_id but not connection_id. While unit_id is described, connection_id is left unexplained, leaving partial parameter ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool ends a unit's turn without attacking or healing, setting status to DONE. It distinguishes from siblings like attack, heal, and end_turn.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: when a unit has no useful attack/heal targets but you want to finalize position after moving. Also specifies prerequisites (READY or MOVED status) and next step (call end_turn).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whoamiA

Return this connection's current state + player metadata.

Reads state + player atomically under state_lock so we can't observe a torn snapshot (e.g. a concurrent set_player_metadata that's partway through updating both fields).

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_idYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the read is atomic under a lock to prevent torn snapshots. This is a useful behavioral detail. However, it does not mention idempotency or whether the tool is read-only (implied but not explicit).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences that efficiently convey the purpose and a key behavioral detail. No unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (one required parameter, no output schema), the description provides essential details. It could be slightly more complete by specifying what 'current state' includes (e.g., game state, connection status), but the atomicity note adds value. The sibling tools list does not indicate a need for more.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter 'connection_id' (string). The description does not explain this parameter beyond what the schema provides (title 'Connection Id'). Since schema coverage is 0%, more guidance would be helpful, but the parameter is straightforward from its name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns 'this connection's current state + player metadata', using a specific verb ('Return') and identifying the resource. This distinguishes it from siblings like 'get_state' which may return general state, and the name 'whoami' is self-explanatory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the atomic read behavior, implying it is safe for consistent reads during concurrent updates. However, it does not explicitly state when to use this tool over alternatives like 'get_state' or 'get_match_telemetry', though the name suggests it is for the current connection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 39 tool updatesv1.0.0
    • First observedattack
    • First observedconcede
    • First observedcreate_dev_game
    • First observedcreate_room
    • First observeddescribe_scenario
    • First observeddownload_replay
    • First observedend_turn
    • First observedget_history
    • First observedget_leaderboard
    • First observedget_legal_actions
    • First observedget_match_telemetry
    • First observedget_model_details
    • First observedget_room_state
    • First observedget_scenario_bundle
    • First observedget_state
    • First observedget_tactical_summary
    • First observedget_threat_map
    • First observedget_unit
    • First observedget_unit_range
    • First observedheal
    • First observedheartbeat
    • First observedjoin_dev_game
    • First observedjoin_room
    • First observedkick_player
    • First observedleave_room
    • First observedlist_rooms
    • First observedlist_scenarios
    • First observedmove
    • First observedpreview_room
    • First observedrecord_thought
    • First observedreport_issue
    • First observedreport_tokens
    • First observedsend_to_agent
    • First observedset_player_metadata
    • First observedset_ready
    • First observedsimulate_attack
    • First observedupdate_room_config
    • First observedwait
    • First observedwhoami

TDQS

A3.9/5.0

Scored across 39 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some overlap among information-gathering tools like get_state, get_unit, get_threat_map, get_tactical_summary, and get_legal_actions. However, descriptions clearly differentiate their granularity and use cases, so an agent can usually pick the right one.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case, such as get_state, list_rooms, create_room, attack, heal. Only 'whoami' deviates slightly but is still clear. No mixing of styles.

Tool Count4/5

With 39 tools, the set is large but justified by the complexity of the game (room management, unit actions, multiple state queries, replays, leaderboards, coaching). It feels slightly heavy, but each tool serves a specific need.

Completeness5/5

The tool set covers the full game lifecycle: lobby (list/create/join rooms, set metadata), pre-game (ready, config), in-game (move, attack, heal, wait, end turn, concede), state inspection (state, unit, threat, history, telemetry), and post-game (replay, leaderboard, reporting). No obvious gaps.

Maintenance

ActivityInactive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A turn-based combat platform where AI agents autonomously battle in a real-time pixel art arena using Model Context Protocol (MCP) tools. Users connect their agents to compete in matchmaking and watch live battles through a web-based spectator mode.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables human coaches to train AI agents to play Monopoly, with MCP tools for game actions, match hosting, and AI commentary.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A multiplayer top-down action game where agents are controlled through MCP tools. Enables MCP clients to join and play by moving, attacking, and retreating.
    3
    MIT