Skip to main content
Glama

Holonovel

The Holodeck for your rulebooks — rules enforced, worlds remembered.

Start with the project wiki — it routes players, Game Masters, and builders by task.

holonovel MCP server

A holonovel is a Star Trek holodeck program — an interactive story where you step inside as a character and the rules govern. Holonovel builds the server (the Holodeck). Your campaign is the program (the Novel). Your rulebooks become the engine — D&D 5e, Starfinder, or the game on your shelf. Your books. Your server. Your Holodeck.

Table of contents

Related MCP server: rpg-mcp

Run a server

Install

A fresh install is playable without a rulebook. On first start the server creates Torre Nosferatu, a tutorial Novel, and opens it; set TTRPG_STARTER_NOVEL=off to start with an empty world instead.

The base server runs the Holodeck. Rooms, objects, exits, and containment form a real state graph, while scenes, NPCs, lore, and a story journal layer on top, so narration is grounded in stored facts rather than prior chat turns. Requires Node.js 22+.

npx -y holonovel

Add to your MCP client:

"holonovel": {
  "type": "local",
  "command": ["npx", "-y", "holonovel"],
  "enabled": true
}

From a source checkout, run cd holonovel && npm install && npm run start, then point the client at npx tsx src/index.ts in that directory.

Campaign data defaults to the operating system's user-data directory: ~/.local/share/holonovel on Linux, ~/Library/Application Support/holonovel on macOS, or %LOCALAPPDATA%\holonovel on Windows. Set TTRPG_DATA_DIR to override it. An existing .holonovel-state/ beside the server is preserved.

Setup details and first-run checks: Getting Started guide.

Install a ruleset

A ruleset package is a declarative bundle produced by the Build workflow. Copy it into the server's ruleset install directory and the server registers it. That directory is inside the state directory — by default the per-user data location described above.

Packages load lazily: a ruleset's tools and index are read only when you open a campaign bound to it, so unused packages cost nothing at startup. Install, remove, and list packages from the server's own tools, or move files and restart.

Campaign data and installed packages stay in the state directory, outside the server tree, so updating Holonovel leaves both intact. The Building a Server guide covers packaging a rulebook.

How it works

Holonovel is one pipeline — Convert, Build, Holodeck, Novel, Synthesis — that turns a rulebook into a running table.

Convert

Convert takes PDFs, HTML, and web scrapes and turns them into clean Markdown. Multi-column pages are read in the right order, and tables split across page breaks are reassembled. Scanned pages fall back to OCR. The output is structurally sound — headings resolve and references trace.

"Convert the files in ruleset/dnd5e/ to Markdown for the D&D 5e ruleset." "Convert the HTML export in ruleset/starfinder/ for the Starfinder ruleset."

Clean, indexed Markdown ready for the build.

Build

Build reads that Markdown and extracts the mechanics. Dice procedures, combat systems, spell catalogues, equipment tables, condition tracks — modeled elements become tools, resources, or prompts in a declarative ruleset package, while anything that can't be modeled stays searchable. Guidance prose becomes narrative material. The discovery engine reads the source in chunks, measures extraction confidence, and works until the mechanical sections are accounted for. Nothing is fabricated to fill a gap.

"Build the Markdown in ruleset/dnd5e/ into a holonovel." "Package ruleset/starfinder/ as a second ruleset alongside D&D 5e."

One spec reads any rulebook, and the build produces zero hand-written code.

Holodeck

The Holodeck is the narrative world model — the core engine that drives the simulation. It turns a saved Novel into a running game. Every part of a campaign is structured state: rooms, objects, exits, and containment in the spatial model; scenes, NPCs, lore, factions, secrets, vows, countdowns, relationships, decisions, and the story journal in the narrative model; mechanics and ruleset voice alongside them. None is decoration. Each has a defined effect on the others.

That effect is what makes it an engine. A scene sets the place and cast and activates lore whose triggers match its text. An NPC carries identity, disposition, relationships, and a location, so moving them changes who is present and who can speak. A secret stays hidden until knowledge and trigger conditions allow it to surface. A vow creates a decision the Game Master must honor. A countdown advances on schedule and fires its result into the world. A mechanical outcome — damage, a destroyed object, a doused light — mutates the state it touches. The story journal records the consequence, and later scenes can recall it.

The server evaluates these couplings. The AI narrates the result. Nothing is left to a "remember this" instruction, and nothing drifts between turns.

Parser commands act on the spatial model with real containment logic. Go north. Take the lantern. The room, the object, and the inventory are stored records, not claims in narration. Exits connect in both directions, containers hold what they hold, and doors stay locked until something unlocks them. The spatial conventions are drawn from Inform, the interactive-fiction language behind decades of text-adventure classics.

"Go north into the flooded ossuary." "Set the scene here — the ossuary reeks of stale incense and old water." "Have Sister Mora follow me into the ossuary." "Ask Sister Mora what she knows about the buried order." "Advance the reliquary countdown by one day."

The Holodeck is the live simulation; the Novel is its save file.

Novel

A Novel is the save file for a Holodeck game, and it stores the configuration that shapes that game. Server settings supply defaults; each Novel overrides them where the setting is campaign-scoped, and every change is saved with the campaign.

Who plays is configurable. A badge sets your seat at the table and what that seat can see: Player is in the story as a character, Game Master sees and controls the world, Observer watches while the AI runs both roles, and Editor steps outside the story to manage the save. The server enforces the boundary, so GM-only secrets do not leak to the Player badge. Each Novel carries its own active badge, and four autonomy sliders decide how much the AI handles alongside it: level (auto-play, prompt on mechanical actions, or manual), confirmation (execute, confirm, or prompt), safety (safe, moderate, or hardcore), and creativity (predictable, standard, or chaotic). The sliders compose with any badge, so a human can hand off one character, all NPCs, or the whole table without changing seats. The Game Mastering guide covers running the world from the opposite side.

How the story behaves is configurable. Player signals set pace, difficulty, tone, focus, and boundaries. A narrative directive tunes pacing, autonomy, world reactivity, and synthesis in plain language; matching keywords take effect mechanically, and anything else becomes guidance for the narrator. Behavioral settings cover whether the world reacts, whether NPCs and factions pursue goals on their own, when synthesis refreshes, how much memory each tier retains, and whether moments record automatically. Point of view can lock to the active character or stay omniscient, and social scenes can use a manual, natural, list, or pooled speaker order.

What content appears is configurable. A Novel binds to one ruleset at creation and can add supplementary rulesets without changing that binding. The categories used to organize available actions can be reassigned per Novel, and briefing order, enabled action patterns, and journal detail decide which guidance surfaces during play.

Export as JSON or Markdown. Import with merge, replace, or dry-run. Clone, checkpoint, and roll back. A clone carries the full configuration.

"Let the AI run all NPCs and player characters, but pause for mechanical decisions." "Make the game faster and darker, with harder fights." "Let the world react and NPCs act independently; use the rulebook's voice patterns." "Run synthesis whenever the scene changes." "Clone this Novel with its settings."

Every Novel-scoped setting is saved with the Novel, so a clone or checkpoint preserves the exact game you configured.

Synthesis

Synthesis deepens the Holodeck beyond mechanics. Ruleset Wisdom comes from the rulebook and any vendor package during Build — voice examples from example-of-play dialogue, lore templates from setting descriptions, action patterns from resolution sequences, and narrative voice profiles from inspirational media citations. It is build output, active by default, and survives every rebuild and synthesis reversion.

The Synthesis run adds two layers on demand. External research collects web-sourced GM advice, actual-play breakdowns, and designer notes, tagged with source URLs, confidence scores, and freshness timestamps. Internal synthesis reads the Novel itself for patterns the table has already produced. Both are inert by default: the Game Master activates what fits and deactivates what does not, and that activation state is saved with the Novel. Re-running synthesis replaces inactive items and preserves active ones. Reverting removes the synthesis layers; Ruleset Wisdom and player-authored items persist.

Synthesis can run on demand, at the start of a session, or after a scene change.

"Research horror one-shot pacing and actual-play examples, tagged with sources." "Enable the horror pacing guidance that fits this campaign." "Run synthesis after every scene change."

Ruleset Wisdom, synthesis layers, and player-authored items coexist in the Novel without replacing one another.

How it compares

Category

What you're used to

How Holonovel differs

AI storytelling apps

Narrative-first apps with no rule engine — conditions drift, dice are improvised, the world is whatever the model remembers

The server holds the rules, dice, and world state; the AI narrates outcomes it cannot invent.

Generic LLM chat

General-purpose chat with no durable state — forgets conditions mid-combat, invents spells, drifts toward safe outcomes

Mechanics resolve deterministically, state survives restarts, and the game keeps its consequences.

Rules MCP servers

Server-side mechanics and durable saves, but a fixed ruleset or a single SRD seed.

Any rulebook, a containment-based world, and badge-enforced roles in one server.

Rules engines serve one system. Storytellers improvise mechanics. Holonovel does neither: any rulebook becomes enforced mechanics, a spatial world, and a saved campaign. Across the TTRPG MCP servers reviewed in October 2026, no other reviewed server combined rulebook ingestion, spatial containment, and server-side role enforcement — for D&D 5e, Starfinder, or your own book. Questions about a specific table's setup? See the FAQ.

License

Canonical origin: git.gay/flukeatzerocool/Holonovel.

Holonovel is MIT-licensed. Built from:

  • D&D 5e SRD v5.1 (CC BY 4.0 + OGL 1.0a, Wizards of the Coast)

  • Graham Nelson's Inform (Artistic License 2.0, Graham Nelson)

  • if-craft-corpus (CC BY 4.0, pvliesdonk)

  • dmcp (MIT, Shawn Rushefsky)

  • lonelog (CC BY-SA 4.0, zeruhur)

  • BitD SRD (CC BY 3.0, John Harper)

  • Ironsworn: Starforged SRD (CC BY 4.0, Shawn Tomkin)

  • Sly Flourish Lazy GM Resource Document (CC BY 4.0, Mike Shea)

  • The Alexandrian (CC BY 4.0, Justin Alexander)

  • Dungeon World SRD (CC BY 3.0, Sage LaTorra, Adam Koebel)

  • Fate SRD (CC BY 3.0, Evil Hat Productions)

  • Ironsworn SRD (CC BY 4.0, Shawn Tomkin)

RSS. Last updated: 2026-10-26.

Available Tools

36 tools
close_sessionClose Play SessionA
Destructive

Close a play session by returning a recap and saving the current context. The close seals the session's recap and saved context but does not archive or export the Novel; resume it later with open_session. Context and recap state persist and are audited; revert with manage_history (action: undo). Use when: ending a session or checkpointing the narrative context. Do NOT use when: archiving or exporting a Novel — use manage_archive.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true / readOnlyHint=false / idempotent=false; the description goes further, clarifying that close seals but does not archive or export the Novel, that recap and context persist and are audited, and giving an explicit undo path via manage_history (action: undo). That is exactly the extra behavioral context annotations cannot convey.

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?

Front-loaded with what the tool does, followed by effect boundaries, then structured Use when / Do NOT use when clauses. Every sentence carries distinct information with no 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?

Covers side effects, persistence semantics, reversibility, and sibling routing, which is everything an agent needs for a zero-parameter mutation; the existing output schema handles return-shape concerns.

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 tool takes zero parameters, so there is nothing parameter-level to document; baseline 4 applies. The only parameter-like reference is the sibling call manage_history (action: undo), which is clearly specified.

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?

Specific verb (close) plus resource (play session) and both effects (returning a recap, saving context). It explicitly distinguishes itself from open_session for resumption and manage_archive for archiving/exporting.

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 'Use when' (ending a session, checkpointing narrative context) and 'Do NOT use when' (archiving/exporting a Novel — use manage_archive) clauses, plus names open_session as the resume path. Alternatives and exclusions are stated outright.

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

manage_adventureAdventure ManagementA
Destructive

Generate, load, or list adventure content. generate writes an adventure scaffold into the target store (novel by default when one is active; a !force prefix bypasses the guard) and generate_encounter writes one encounter; both persist to the Novel, appear in the audit log, and the most recent write is undoable via manage_history (action: undo). load and list are read-only, and list accepts an optional genre filter. Use when: the GM wants a new adventure scaffold, a single encounter, or to load a prepared module. Do NOT use when: recording a story beat — use manage_story (action: record).

NameRequiredDescriptionDefault
slugNoAdventure module slug (load).
actionYesgenerate, generate_encounter, load, or list.
filterNoOptional genre filter (list).
targetNonovel, codex, or both (generate).
contextNoScene context (generate_encounter).
premiseNoAdventure premise (generate).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag the tool as non-read-only and destructive, but the description adds important context beyond them: generate writes scaffolds into a target store, generate_encounter writes one encounter, writes persist and appear in the audit log, and the most recent write is undoable via manage_history. It also clarifies that load and list are read-only, which materially distinguishes action behavior.

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 definition is dense but front-loaded: it starts with the action modes, then side effects, then usage boundaries. Most sentences earn their place, though the parenthetical about the guard and the phrase 'both persist to the Novel' make some parts tighter and less immediately clear than they could be.

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 four-action tool with six parameters, the description explains the main action modes, write side effects, audit/undo behavior, and when to use an alternative. Output values need not be explained because an output schema exists, but the target/codex/both semantics are slightly muddied by the statement that 'both persist to the Novel'.

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 description coverage is 100%, so the baseline is 3, but the description adds action-level meaning: target defaults to novel, a !force prefix bypasses the guard, list accepts an optional genre filter, and slug is for load. It does not fully restate premise/context semantics, but those are covered by 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 states specific verbs and resources: generate, load, and list adventure content, with generate_encounter explicitly called out as a distinct action. It also distinguishes the tool from manage_story for recording story beats, so an agent can route correctly without opening the schema.

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?

It gives explicit positive usage guidance ('Use when: the GM wants...') and an explicit exclusion ('Do NOT use when: recording a story beat — use manage_story'). This is exactly the when/when-not/alternative structure that helps tool selection.

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

manage_agentAgent Task ManagementA
Destructive

Manage durable NPC/agent tasks and their action lifecycle. create reads goal and optional source_goal; advance appends description; complete, fail, and cancel settle the task and terminal tasks are immutable; autonomy defaults to TTRPG_AGENT_AUTONOMY. Mutating actions persist to the Novel and are audited; list/get are read-only. Use when: creating, starting, advancing, settling, or inspecting tasks. Do NOT use when: surfacing an advisory suggestion — use manage_scene (action: oracle); managing NPC identity — use manage_npc. Revert with manage_history (action: undo).

NameRequiredDescriptionDefault
goalNoTask goal text (create).
actionYescreate, list, get, start, advance, complete, fail, or cancel.
detailNoReturn full agent tasks instead of summary entries (list).
subjectNoEntity or NPC that owns the task (create/list).
task_idNoTask id (get/start/advance/complete/fail/cancel).
autonomyNoadvisory, prompt, or auto (create; default the TTRPG_AGENT_AUTONOMY setting).
descriptionNoAction description (advance).
source_goalNoOriginating goal-pursuit suggestion (create).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructive and non-idempotent behavior, but the description adds that mutating actions persist to the Novel and are audited, that terminal tasks are immutable, and that list/get are read-only. It also gives the revert path via manage_history. It stops short of detailing permissions or the exact effects of cancel/fail on stored data, so 4 rather than 5.

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?

Dense but front-loaded; every clause carries routing, lifecycle, or persistence information with no filler. It could be split for readability, but nothing is wasted.

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?

With an output schema present, return values need not be explained. For a complex 8-action mutation tool, the description covers lifecycle, defaults, persistence, audit, usage, and alternatives completely enough to call it correctly.

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 100%, so the schema already documents each parameter's associated action. The description adds a useful 'advance appends description' semantic and reiterates the autonomy default, but most of its create/source_goal mapping duplicates schema parentheticals.

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?

Names a specific verb (manage) and resource (durable NPC/agent tasks) and scopes it to the action lifecycle, making it clearly distinct from siblings like manage_npc and manage_scene. An agent can identify the tool's domain without opening the schema.

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 'Use when' and 'Do NOT use when' clauses with named alternatives and action paths (manage_scene action: oracle, manage_npc, manage_history undo). This is exactly the routing guidance needed to choose this tool over its siblings.

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

manage_archiveNovel Archive ManagementA
Destructive

Manage Novel archival and checkpoint surfaces. Export writes a file; import writes Novel state and mode selects dry-run (validate only), merge (keep existing entries), or replace (discard current Novel state), while strict aborts on unresolved references. archive is reversible with unarchive; checkpoint_restore replaces the live Novel with the stored checkpoint and is itself undoable; checkpoint subscriptions persist. Use when: exporting or importing a Novel, archiving/unarchiving, cloning/branching, or managing checkpoints. Do NOT use when: creating, resuming, renaming, or ending a Novel — use manage_novel. Revert the most recent mutation with manage_history (action: undo); checkpoint_list is read-only.

NameRequiredDescriptionDefault
dataNoExported Novel JSON (import).
modeNodry-run, merge, or replace (import).
slugNoNovel slug (resume/switch/archive/unarchive/info).
labelNoCheckpoint label (checkpoint_set/list/restore/remove).
scopeNoExport scope (export).
actionYesexport, import, archive, unarchive, clone, branch, checkpoint_set, checkpoint_list, checkpoint_restore, checkpoint_remove.
formatNoOutput format (export).
strictNoFail on any cross-reference mismatch (import).
new_nameNoName for the copy or branch (clone/branch).
from_eventNoEvent-log ordinal to branch from (branch; default latest).
source_slugNoNovel to copy or branch from (clone/branch).
include_checkpointsNoInclude checkpoints in export (default false; export).
trim_audit_sessionsNoKeep only the most recent N sessions' audit entries in the clone (clone; default full copy).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and non-idempotent, but the description adds real substance: export writes a file, import writes Novel state, 'replace' discards current Novel state, strict aborts on unresolved references, archive is reversible via unarchive, and checkpoint_restore is undoable. It stops short of stating permission/auth requirements or what validate-only dry-run returns.

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?

Information is front-loaded with operation semantics first, then the Use/Do-NOT-Use routing, and every clause carries new information. The middle sentence is long and packs four mode behaviors plus strict into one run-on, which costs some scannability.

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 10-action, 13-parameter tool with an output schema and safety annotations, the description covers the risky paths (import modes, replace, checkpoint_restore) and the sibling routing well. Gaps are minor: clone/branch semantics (what actually gets copied, how trim_audit_sessions interacts with a full copy) and export scope/format options live only in the schema.

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 is 100%, so the baseline is 3; the description earns above that by explaining the semantics of 'mode' beyond the enum labels (dry-run = validate only, merge = keep existing entries, replace = discard current state) and by clarifying what 'strict' aborts on. Clone/branch parameters such as trim_audit_sessions and from_event are left entirely to the schema.

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 enumerates the concrete operations (export, import, archive/unarchive, clone/branch, checkpoint_*) it covers on Novel state, and explicitly separates itself from manage_novel. The opening verb 'Manage ... surfaces' is an umbrella phrase, but the following clauses supply the specific verbs the name alone would obscure.

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?

It gives an explicit 'Use when' list (export/import, archive/unarchive, cloning/branching, checkpoints) and a 'Do NOT use when' clause routing Novel CRUD to manage_novel. It also names two further alternatives with their roles: manage_history (action: undo) for reverting mutations and checkpoint_list as the read-only counterpart.

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

manage_beliefBelief ManagementA
Destructive

Manage per-entity evidence, reconciled belief stances, the perception ledger, and a one-entity knowledge query. admit records a subject/predicate/object proposition with a 0..1 weight and does not change a stance until reconcile recomputes it; retract removes the cited evidence and reconciles; the perception ledger is append-only, so correct a mistaken perception with a new record. Mutating actions persist to the Novel; reads are read-only. knowledge_query returns perceptions, beliefs, and known secrets with event provenance, optionally filtered by topic. Use when: inspecting or recording what an entity learned or believes. Do NOT use when: recording objective truth — use manage_causality; recording shared lore — use manage_lore.

NameRequiredDescriptionDefault
topicNoOptional topic filter applied to knowledge_query perceptions, beliefs, and secrets.
actionYesBelief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event. Knowledge: knowledge_query.
detailNoReturn full belief records instead of summary entries (list).
objectNoProposition object (admit).
sourceNoSource key used to correlate duplicate evidence (admit; default the active badge).
statusNoactive, unresolved, or suppressed (admit; default active).
weightNoEvidence support weight 0..1 (admit; default 1).
subjectNoProposition subject (admit).
polarityNopositive or negative (admit).
questionNoBelief question key, or subject|predicate|object (get/evidence).
entity_idNoEntity whose beliefs are queried or mutated.
predicateNoProposition predicate (admit).
evidence_idNoEvidence record id (retract).
source_ordinalNoContributing event-log ordinal (admit; default the latest event ordinal).
perception_kindNomessage, scene, or observation (perception_record; default observation).
perception_senseNoSense that produced the perception (perception_record; default null; REQ-594).
perception_room_idNoRoom identifier for the perception (perception_record; defaults to the entity's room).
perception_summaryNoWhat was perceived (perception_record).
perception_witnessNoWitness kind (perception_record; default inferred; REQ-594).
perception_entity_idNoEntity that perceived (perception_record/perception_for_entity).
perception_confidenceNo0..1 confidence (perception_record; default 0; REQ-594).
perception_event_ordinalNoContributing event-log ordinal (perception_record/perception_for_event; defaults to the latest event).
perception_source_entityNoEntity the perception came from (perception_record; default null).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the evidence-then-reconcile dependency (admit does not change a stance until reconcile runs), that retract removes evidence and reconciles, that the perception ledger is append-only so corrections require a new record, and that mutations persist to the Novel while reads are read-only. No contradiction with destructiveHint=true / readOnlyHint=false.

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?

Front-loaded with the resource scope, then behavioral rules, then use/don't-use routing — a logical order. Dense but nearly every clause carries information; the opening sentence is a slightly long noun pile-up that could be trimmed.

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 12 actions and 23 parameters, the description covers the mutating flow, the append-only constraint, persistence, and alternative tools, and an output schema exists so return values need not be described. Missing only a mapping of which parameters belong to which of the less-mentioned actions (list/get/conflicts), which the schema partially supplies.

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 100% with per-parameter descriptions bound to specific actions, so the schema carries the parameter burden. The description adds a little semantic context (weight being a 0..1 support value, the reconcile gating) but does not explain the 23 parameters or which are required per action, so baseline 3 applies.

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 names the resources clearly — evidence, reconciled belief stances, perception ledger, and knowledge query — and enumerates the key verbs (admit, retract, reconcile, knowledge_query). It omits the read verbs (list, get, evidence, conflicts, perception_list) that appear in the schema enum, so an agent must open the schema to see the full action set.

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 'Use when: inspecting or recording what an entity learned or believes' plus a 'Do NOT use when' clause that routes to manage_causality for objective truth and manage_lore for shared lore. This is exactly the sibling-disambiguation an agent needs for a crowded toolset.

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

manage_causalityCausality ManagementA
Destructive

Manage objective causal state and transition proposals. causal_propose records a proposal without applying it; causal_admit applies the proposal and causal_reject discards it; causal_expected_version guards optimistic concurrency and causal_from records the expected prior value; causal_ingress admits an external event without a proposal. Proposals persist and are audited; list and state are read-only. Use when: proposing, admitting, rejecting, listing, or inspecting causal transitions, or ingressing an external event. Do NOT use when: changing rooms, things, or exits — use manage_world. Revert with manage_history (action: undo).

NameRequiredDescriptionDefault
actionYescausal_propose, causal_admit, causal_reject, causal_list, causal_state, causal_ingress.
causal_keyNoState key within the entity (causal_propose).
causal_fromNoExpected prior value (causal_propose).
causal_scopeNoScope coordinate (causal_propose; default the active Novel slug).
causal_valueNoProposed value (causal_propose/causal_ingress).
causal_domainNolocation or scalar (causal_propose; default location).
causal_entityNoEntity whose objective state is proposed (causal_propose).
causal_proposal_idNoRecorded proposal id (causal_admit/causal_reject).
causal_origin_sourceNonarrative, machine, or ruleset (causal_propose).
causal_source_ordinalNoContributing event-log ordinal (causal_propose; default the latest event).
causal_expected_versionNoOptimistic version guard (causal_propose).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds important context: proposals persist and are audited, causal_propose records without applying, causal_admit applies, causal_reject discards, and list/state are read-only. It stops short of describing audit retention or rejection consequences in depth, but the key behavioral traits are disclosed.

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 dense but front-loaded: purpose, action semantics, usage conditions, exclusions, and revert path all appear in sequence. It is slightly run-on with multiple clauses packed into single sentences, but every sentence carries actionable information.

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 11 parameters, an output schema, and annotations covering safety, the description fills the remaining gaps: action semantics, proposal lifecycle, optimistic concurrency, read-only operations, sibling exclusions, and revert guidance. An agent has enough to select and invoke the tool correctly.

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 is 100%, so the baseline is 3, but the description adds role-level meaning beyond field descriptions: causal_expected_version guards optimistic concurrency, causal_from records the expected prior value, and causal_ingress admits an external event without a proposal. This helps an agent understand how parameters relate to the action workflow.

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 opens with a specific verb+resource ('Manage objective causal state and transition proposals') and then enumerates every action and its effect. An agent can distinguish this tool from manage_world and manage_history without consulting the schema.

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?

It explicitly names when to use ('proposing, admitting, rejecting, listing, or inspecting causal transitions, or ingressing an external event') and when not to use ('changing rooms, things, or exits — use manage_world'), and it routes reverts to manage_history with the exact action. Nothing is left to inference.

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

manage_characterPlayer Character ManagementA
Destructive

Manage player characters: create (quick or step-by-step), stage to roster, import, render a sheet, set the active entity, set personality/voice, patch mechanical stats, send player signals, remove, or list roster characters. sheet and roster_list are read-only; Novel mutations persist, are audited, and are undoable via manage_history (action: undo). update merges provided fields in place (stats shallow-merge; omitted fields are preserved) so one sheet field can change without re-creating the character. The personality{} object aliases description/voice/background/goals, and details{} aliases ability_scores/skills/feats/talents/equipment; a top-level value overrides its grouped alias. stage and roster_remove are exact inverses on the roster; remove deletes the Novel entity and is undoable. Use when: creating or importing a PC, staging or activating one for play, editing its sheet or voice, or handling player feedback. Do NOT use when: managing an NPC — use manage_npc.

NameRequiredDescriptionDefault
povNoPoint-of-view mode (set_active).
nameNoCharacter name; omit (create) to begin step-by-step.
seedNoDeterministic seed (create).
featsNoFeats (create).
goalsNoCharacter goals (create/personality).
statsNoMechanical stat keys to shallow-merge into the entity's stats (update).
valueNoFeedback text (signal).
voiceNoVoice and speech pattern (create/personality).
actionYescreate, stage, import, sheet, set_active, personality, voice, signal, update, remove, roster_remove, or roster_list.
formatNoOutput format (sheet).
signalNoFeedback category (signal).
skillsNoTrained skills (create).
classesNoClass levels (create).
detailsNoGrouped mechanical details (create).
speciesNoSpecies (create).
talentsNoTalents (create).
examplesNoVoice examples (voice).
entity_idNoEntity identifier (stage/sheet/set_active/personality/voice/remove).
equipmentNoStarting equipment (create).
inventoryNoReplace the entity's inventory (update).
roster_idNoRoster identifier (import/roster_remove).
backgroundNoBackstory (create/personality).
descriptionNoNarrative description (create/personality).
personalityNoGrouped personality fields (create).
stat_methodNoStat-generation method (create).
ability_scoresNoAbility scores (create).
stage_to_rosterNoAlso stage into the roster (create).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: it identifies which actions are read-only (sheet, roster_list), states that mutations persist, are audited, and are undoable via manage_history (action: undo), explains that update shallow-merges stats and preserves omitted fields, and notes that stage and roster_remove are exact inverses. This is exactly the mutation/undo/reversibility context that destructiveHint=true alone does not convey.

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 the action inventory, then mutation/undo semantics, then alias precedence, then when/when-not. Dense but no filler; the aliasing sentence is packed tightly and could be slightly more scannable given 27 params.

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 12-action, 27-param tool with an output schema (so return shapes needn't be explained), the description covers persistence, audit, undo, roster inverses, aliasing, and sibling exclusion. It does not clarify the distinction between stage and set_active, or what import expects from roster_id — minor residual gaps.

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 is 100%, so baseline is 3; the description earns extra credit by explaining the personality{} and details{} alias groups and the precedence rule (top-level value overrides the grouped alias) plus stats shallow-merge behavior, none of which the schema states. Several params (seed, stat_method, format, pov, examples) are left entirely to the schema, so it stops short of a 5.

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?

Names a specific resource (player characters) and enumerates the concrete operations: create, stage, import, render sheet, set active, personality/voice, patch stats, signal, remove, roster_list. It also explicitly distinguishes itself from manage_npc, so an agent can route correctly without opening the schema.

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?

Contains an explicit 'Use when:' list (creating/importing a PC, staging or activating one, editing sheet or voice, handling player feedback) and an explicit 'Do NOT use when:' with the named alternative manage_npc. Both selection conditions are stated, not inferred.

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

manage_codexCodex Library ManagementA
Destructive

Manage the server-level codex library of reusable, cross-Novel content (NPCs, characters, scenes, encounters, lore, factions, rooms, things, templates, voice profiles, adventures). Entries persist to .holonovel-state/codex.json outside every Novel and survive restarts; mutations are audited. Out-of-play and badge-free: requires the Editor or Game Master badge, a Player mid-adventure gets [FORBIDDEN], and reads are not badge-filtered. When no Novel is active, the codex is the default store; import and capture require an active Novel. set needs kind + name (the id derives from them); merge=true shallow-merges content. Revert the most recent mutation with manage_history (action: undo). Use when: storing reusable content for later import, or enumerating/reading/deleting it. Do NOT use when: storing Novel-scoped content — use manage_lore (action: set) or manage_note (action: set).

NameRequiredDescriptionDefault
idNoEntry identifier or array of identifiers (for import/get/delete).
kindNoEntry kind (for set/list/capture).
nameNoEntry name (for set).
tagsNoOptional tags (for set).
mergeNoFor set: when true and the entry exists, shallow-merge the provided content into the stored content instead of replacing it.
actionYesset (create/update), list, get, capture (Novel artifact per kind), import (into active Novel), or delete.
contentNoEntry content (for set); when omitted on an existing entry, the stored content is preserved.
entry_idNoEntry identifier (for get/import/delete); alias of `id`.
entity_idNoEntity whose voice to capture (for capture, voice_profile kind).
source_idNoNovel artifact key/name/entity id to capture (for capture). Defaults per kind.
descriptionNoOptional description (for set).
update_sourceNoWhen true, update the source Codex entry in place (for capture).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the mutation/destructive profile, and the description adds substantial context beyond them: persistence to .holonovel-state/codex.json, audit of mutations, the Editor/Game Master badge requirement, the [FORBIDDEN] outcome for an in-play Player, and the fact that reads are not badge-filtered. It also clarifies the default-store behavior when no Novel is active and the merge=true shallow-merge semantics.

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 dense but front-loads the resource and scope before the badge/behavioral details and the use/don't-use routing. Every sentence carries load for a 12-parameter, multi-action tool; it is longer than ideal but not padded.

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, an output schema is present (so return values need not be described), and the description supplies the missing scope, auth, persistence, and action-specific preconditions an agent needs to call it correctly. Nothing material is left out.

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 is 100%, so the baseline is 3, but the description adds value the schema lacks: that `set` requires `kind` + `name` and the id derives from them, plus how merge=true shallow-merges content. It does not attempt to explain the remaining 12 parameters, but the schema already documents those adequately.

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?

States a specific verb (manage) plus the exact resource (the server-level codex library of reusable, cross-Novel content) and enumerates the entry kinds it holds. It explicitly distinguishes itself from siblings by naming manage_lore and manage_note as the tools for Novel-scoped content.

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 'Use when' (storing reusable content for later import, or enumerating/reading/deleting it) and 'Do NOT use when' (Novel-scoped content — use manage_lore or manage_note). It also preconditions import/capture on an active Novel and routes undo to manage_history.

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

manage_combatCombat Encounter ManagementA
Destructive

Manage combat encounters in the active Novel — encounter turn order, participants, and lifecycle, not per-entity conditions. Mutating actions persist to the Novel and are audited; read-only actions do not mutate state. Revert the most recent mutation with manage_history (action: undo). init's seed only reorders the danger set; participants keep their given order. Use when: starting, advancing, ending a fight, or changing its participants. Do NOT use when: applying a status effect — use manage_condition (action: apply).

NameRequiredDescriptionDefault
seedNoOptional deterministic seed (init).
actionYesinit, advance, end, add_participant, remove_participant, or status.
dangersNoOptional non-entity combatants (init).
outcomeNoOptional text describing how combat ended (end).
participantsNoEntity identifiers participating (init).
participant_idNoEntity identifier (add_participant/remove_participant).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations (destructive=true, non-idempotent), it discloses that mutating actions persist and are audited, that read-only actions do not mutate state, that the last mutation can be reverted with manage_history undo, and the subtle seed rule (seed only reorders the danger set; participants keep their given order). That is exactly the behavioral context a destructive-but-revertible tool needs.

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 tightly packed sentences, front-loaded with purpose and scope, then mutation/audit semantics, then seed nuance, then explicit use/do-not-use directives. No filler and no repetition of the enum list already in the schema.

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?

For a 6-parameter mutation tool with an output schema, the description supplies everything the schema cannot: scope, mutation/audit behavior, undo path, a non-obvious seed semantic, and a sibling routing rule. Nothing an agent needs before calling it appears missing.

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 description coverage is 100%, so the baseline is 3, but the description adds semantics the schema cannot: the deterministic seed's actual effect on ordering and the fact that participants retain their supplied order on init. It doesn't touch outcome/dangers, but those are adequately documented inline.

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?

States a specific verb and resource ("Manage combat encounters in the active Novel") and immediately bounds the scope as encounter-level turn order, participants, and lifecycle "not per-entity conditions." This scope boundary lets an agent separate it from manage_condition without opening either schema.

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 "Use when: starting, advancing, ending a fight, or changing its participants" and "Do NOT use when: applying a status effect — use manage_condition (action: apply)." It also names the recovery path via manage_history (action: undo), so both the trigger and the alternatives are covered.

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

manage_conditionCondition ManagementA
Destructive

Manage mechanical or narrative conditions on entities. apply attaches a named condition to one entity; rounds is a positive round count, and omitting it (or passing 0) leaves the condition without an expiry. Re-applying an active condition warns instead of duplicating it, and remove deletes the condition and its round counter. apply and remove require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); list is read-only. Use when: applying, removing, or listing conditions. Do NOT use when: recording damage or combat state — use manage_combat (action: init/advance).

NameRequiredDescriptionDefault
actionYesapply, remove, or list.
roundsNoOptional duration in rounds (apply).
conditionNoThe condition name (apply/remove).
entity_idNoThe entity to affect (apply/remove).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavior: re-applying an active condition warns instead of duplicating it, remove deletes the condition and its round counter, apply/remove require GM or Editor badge, changes persist to the Novel, and they are undoable via manage_history. It also clarifies that list is read-only. These details are consistent with the destructive mutation 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?

The description is compact and front-loaded: it starts with the tool's purpose, then operation details, permissions, persistence, undo behavior, and finally explicit use/exclusion guidance. Every sentence contributes information needed to select and invoke the tool correctly.

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?

For a mutable condition-management tool with an output schema and annotations already present, the description covers the critical operational context: permissions, persistence, undo path, re-application warning, round-expiry behavior, read-only listing, and the main sibling alternative. Nothing essential for correct invocation appears to be missing.

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 description coverage is 100%, so the schema already defines the four parameters at a baseline level. The description meaningfully supplements that by explaining that rounds is a positive round count and that omitting it or passing 0 leaves the condition without expiry, which is behavioral semantics not fully captured by 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 states a specific verb and resource ('Manage mechanical or narrative conditions on entities') and enumerates the supported operations: apply, remove, and list. It also distinguishes the tool from manage_combat, which handles damage or combat state, so an agent can identify its scope without opening the schema.

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?

It gives explicit when-to-use guidance ('Use when: applying, removing, or listing conditions') and an explicit exclusion with an alternative ('Do NOT use when: recording damage or combat state — use manage_combat'). This directly routes the agent between sibling tools.

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

manage_corpusKnowledge CorpusA
Destructive

Manage the cold-reference knowledge corpus. corpus_register indexes a document; route derives its domain from a trusted source profile; grant and deny set per-entity access with the latest decision winning; consume records a read; access checks an entity against the recorded grants. Mutating actions persist access state and are audited; list, get, access, and acquisitions are read-only. Use when: registering, listing, reading, routing, granting/denying access, consuming, or inspecting acquisitions of corpus documents. Do NOT use when: writing Novel lore entries or secrets — use manage_lore. Revert the most recent mutation with manage_history (action: undo).

NameRequiredDescriptionDefault
actionYescorpus_register, corpus_list, corpus_get, corpus_route, corpus_grant, corpus_deny, corpus_access, corpus_consume, corpus_acquisitions.
corpus_bodyNoDocument reference text (corpus_register).
corpus_modeNoread, research, taught, or import (corpus_consume; default read).
corpus_titleNoDocument title (corpus_register).
corpus_deniesNoEntity ids explicitly denied access (corpus_register).
corpus_domainNoKnowledge domain (corpus_register/corpus_route/corpus_list).
corpus_grantsNoEntity ids explicitly granted access (corpus_register).
corpus_domainsNoKnowledge domains the entity may access (corpus_access).
corpus_entity_idNoEntity acquiring or inspected (corpus_consume/corpus_acquisitions/corpus_access/corpus_grant/corpus_deny).
corpus_document_idNoCorpus document id (corpus_get/corpus_route/corpus_grant/corpus_deny/corpus_consume).
corpus_access_publicNoWhether every entity may consume it (corpus_register; default false).
corpus_access_domainsNoKnowledge domains granted access (corpus_register).
corpus_source_profileNoTrusted source profile the domain is routed from (corpus_register; default manual).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.5/5.0
Behavior4/5

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

The annotations only say destructiveHint=true and readOnlyHint=false for the whole tool, so the description adds real value by partitioning the nine actions: list, get, access, and acquisitions are read-only while the rest persist state and are audited. It also discloses the conflict rule ('latest decision winning') and points to undo. It stops short of saying what a deny or unregister actually removes or whether access decisions are reversible outside manage_history.

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 opening purpose line is front-loaded and the use-when / do-not-use-when structure is easy to scan. The middle action-gloss sentence is dense but each clause carries distinct information; no filler or restated title.

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 13-parameter, nine-action tool with full schema coverage, annotations, and an output schema, the description supplies the action semantics, the mutating/read-only split, and the sibling routing an agent needs. The remaining gap is the access-model detail (how per-entity grants, domains, and access_public combine), which the description only gestures at.

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 is 100%, so the baseline is 3, and the description genuinely adds meaning beyond the enum names: 'route derives its domain from a trusted source profile', 'consume records a read', 'access checks an entity against the recorded grants'. That clarifies the intent of corpus_route and corpus_access, which the schema only labels. It does not explain the grants/denies vs access_domains vs access_public interplay explicitly.

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 opens with a specific resource ('cold-reference knowledge corpus') and then enumerates what each of the nine actions does, so an agent can tell corpus operations apart from other 'manage_*' siblings without opening the schema. It explicitly contrasts itself with manage_lore for Novel lore/secrets, which pins down the boundary.

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?

It has an explicit 'Use when:' list covering all intended actions, an explicit 'Do NOT use when:' routing to manage_lore, and a third pointer to manage_history (action: undo) for reversals. Both the positive cases and the exclusion are stated, leaving nothing to inference.

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

manage_countdownCountdown ManagerA
Destructive

Manage countdown timers in the active Novel. set accepts a starting tick count and optional total; advance fires the configured world_effect when the countdown reaches its threshold, and on_scene_transition advances it automatically; direction shifts NPC dispositions only when scope is also set. Mutating actions persist to the Novel and are audited; list is read-only. Use when: starting, advancing, removing, or listing clocks. Do NOT use when: tracking a vow's progress — use manage_vow (action: milestone). Revert with manage_history (action: undo).

NameRequiredDescriptionDefault
nameNoCountdown name (set/advance/remove).
typeNoround or narrative (set).
scopeNoOptional scope name (set).
ticksNoStarting ticks (set).
totalNoOptional capacity for decrement refills (set; defaults to ticks).
actionYesset, advance, remove, or list.
triggersNoOptional world-model triggers (set).
directionNoOptional direction: increment or decrement (set).
world_effectNoOptional world-model effect applied when the countdown fires (set).
on_scene_transitionNoWhen true, advance on each scene transition (set).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false at tool level, so the bar is lower; the description adds valuable per-action nuance that annotations cannot — 'Mutating actions persist to the Novel and are audited; list is read-only' — and clarifies that advance fires world_effect and on_scene_transition auto-advances. It stops short of describing what 'remove' discards or any auth/permission requirements, so not a 5.

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?

Front-loads the core purpose, then uses labeled 'Use when / Do NOT use / Revert' segments that scan well. The middle behavioral clause is densely packed but every sentence carries distinct information, so only minor tightening is possible.

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 10-parameter tool with a nested world_effect object and an output schema (so return values needn't be explained), the description covers actions, per-action mutations, dependency rules, and routing to alternatives. It is essentially complete, with only the destructive 'remove' semantics left unstated.

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 is 100%, so baseline is 3, but the description adds cross-parameter semantics the schema lacks: 'intention' advances on scene transition, and 'direction shifts NPC dispositions only when scope is also set' — a real dependency rule. The set/advance/remove action-per-parameter mapping (name, ticks, total) is also clarified.

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?

States a specific verb+resource ('Manage countdown timers in the active Novel') and then enumerates every action (set/advance/remove/list) with its distinct behavior, so an agent knows exactly what the tool does and how each action differs. It also explicitly names the sibling it is not (manage_vow).

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?

Uses explicit 'Use when: starting, advancing, removing, or listing clocks' and 'Do NOT use when: tracking a vow's progress — use manage_vow (action: milestone)', plus a revert path via manage_history (action: undo). Alternatives and exclusions are both spelled out, nothing left to inference.

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

manage_diagnosticsSession DiagnosticsA
Destructive

Manage session diagnostics and maintenance surfaces separate from play-facing session controls. compress summarizes the audit log while compact prunes it irreversibly; verify compares live state with recorded hashes and replay reads the retained log, and both are read-only; visibility_check records its decision in the audit log while visibility_audit reads recent decisions; health, subscribe, and category reassignment do not change Novel content. compact is GM-only. Use when: reporting health, summarizing or compacting the audit log, subscribing, reassigning a category, appending/reading the event log, verifying or replaying state, or scanning a draft for GM-only disclosure. Do NOT use when: recapping play, setting verbosity, or reordering the briefing — use manage_session.

NameRequiredDescriptionDefault
modeNonormal or terse (verbosity).
textNoObservation text (event).
tierNoCompression tier to assemble (recap; REQ-592).
queryNoOptional search term matched against tool name, description, and title (discover).
actionYeshealth, context_report, compress, compact, subscribe, category, event, history, verify, replay, visibility_check, or visibility_audit.
detailNodiscover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609).
sourceNoEvent source classification (event).
topicsNoNotification topics to subscribe to (subscribe).
audienceNoAudience badge for a visibility check (visibility_check; default the active badge).
categoryNoNew category label, or null/empty to restore the default (category).
gm_notesNoGM-only free-text notes returned only to the Game Master badge (recap).
ordinalsNoExact event ordinals to return in order (history; REQ-591).
sectionsNoOrdered list of briefing sections (briefing_order).
sessionsNoNumber of recent sessions to retain live; triggers irreversible compaction (compact; default TTRPG_AUDIT_RETENTION_SESSIONS).
to_eventNoTarget event ordinal for replay inspection (replay; default the newest retained entry).
supersedeNoOrdinal of an event this observation replaces (event).
tool_nameNoRegistered tool name to reassign (category).
session_idNoArchived session id to include in recap (recap).
max_entriesNoPositive integer; returns a non-mutating summarize prompt over the most recent entries (compress).
budget_tokensNoPositive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610).
through_ordinalNoReturn events up to and including this ordinal (history).
include_supersededNoInclude superseded events (history; default true).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.3/5.0
Behavior5/5

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

Annotations flag the whole tool as destructive and non-idempotent, which alone would be alarming and uninformative; the description disambiguates per action — compact's pruning is 'irreversible' and GM-only, verify and replay are read-only, visibility_check writes to the audit log while visibility_audit does not, and health/subscribe/category do not change Novel content. It also discloses the authorization constraint (GM-only) that no annotation carries.

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?

Front-loaded with purpose, then per-action semantics, then the use/don't-use routing — the right order for a dispatcher tool. The per-action clauses are chained into long run-on sentences ('...and both are read-only; ...while visibility_audit reads...'), which costs some scannability, but for a 12-action tool the length is earned rather than padded.

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?

Output schema and rich annotations are present, so return values need no explanation. The description covers 11 of the 12 actions with at least a behavioral note — `context_report` is the one action never described, and it is also one of the more obscure ones. Otherwise an agent has enough to call any of these actions safely.

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?

With 100% schema description coverage across 22 parameters, the schema already documents each field's meaning and the action it belongs to, so the baseline is 3. The description adds marginal value by tying actions to behaviors (e.g. compact retaining `sessions`, verify comparing hashes), but it gives no syntax, defaults, or interaction detail beyond what the schema states.

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 opens with a specific framing — 'session diagnostics and maintenance surfaces separate from play-facing session controls' — and then enumerates what nearly every action does (compress summarizes, compact prunes, verify compares hashes, replay reads, visibility_check records, visibility_audit reads). It also names the sibling it is not (manage_session), so an agent can route without opening the schema. The only slight weakness is that a 12-action grab-bag (health, subscribe, category reassignment, visibility audit) doesn't map cleanly onto a single 'diagnostics' noun, so the boundary is a little fuzzy.

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 structured as 'Use when:' with a full enumeration of triggering tasks, plus a 'Do NOT use when:' clause that names recapping, setting verbosity, and reordering the briefing and redirects to manage_session. This is exactly the when/when-not/alternative pattern that lets an agent choose correctly without inference.

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

manage_factionFaction ManagementA
Destructive

Manage organizations in the active Novel: create, update, remove, or list factions, each carrying a name, description, goals, resources, and optional territory room names. name is required to create and faction_id targets an existing faction; the progress clock is Novel-internal and not set directly. create, update, and remove require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); remove deletes the faction permanently unless undone, and list is read-only. Use when: creating, revising, removing, or listing factions. Do NOT use when: tracking a faction's territory rooms — use manage_world (action: create_room).

NameRequiredDescriptionDefault
nameNoFaction name (create).
goalsNoOptional goals.
actionYescreate, update, remove, or list.
detailNoReturn full faction records instead of summary entries (list).
resourcesNoOptional resources.
territoryNoOptional territory names.
faction_idNoFaction identifier (update/remove).
descriptionNoOptional description.

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond annotations: states the GM/Editor badge requirement, that changes persist to the Novel, that they're undoable via manage_history (action: undo), that remove is permanent unless undone, that list is read-only, and that the progress clock is Novel-internal and not settable. Annotations confirm destructiveHint=true and this adds the recovery path.

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?

Front-loads the operation set, then permissions/undo behavior, then usage routing. Dense but nearly every clause carries information; the only mild waste is restating 'create, update, remove, or list' inside the 'Use when' clause.

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?

Multi-action mutation tool with an output schema and rich annotations, yet the description still covers authorization, persistence, undo, and destructive semantics. Nothing an agent needs to call it correctly is missing.

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 is 100%, so the baseline is 3, but the description adds action-parameter pairing ('name is required to create', 'faction_id targets an existing faction') and an explicit exclusion (progress clock not set directly) that the per-field schema strings do not convey.

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?

States specific verbs (create, update, remove, list) against a specific resource (factions in the active Novel) and enumerates the fields carried. An agent can distinguish it from manage_world/manage_novel based on the description alone.

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 'Use when' clause enumerates the four triggering actions, and a 'Do NOT use when' clause names the alternative (manage_world action: create_room) for territory-room tracking. Both positive and negative routing are present.

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

manage_historyUndo and Redo HistoryA
Destructive

Undo or redo the most recent state mutation for the active badge, restoring the prior per-badge snapshot and clearing the redo stack on a new mutation. Both directions mutate Novel state and persist immediately (readOnlyHint false). The stack is per badge and capped by TTRPG_MAX_SNAPSHOT_DEPTH, and a pending workflow decision blocks both until resolved with respond_decision. Use when: reverting the last mutation (undo) or restoring an undone one (redo). Do NOT use when: an older change is the target — re-run the owning tool (for example manage_story), because only the most recent mutation is stacked.

NameRequiredDescriptionDefault
actionNoWhich direction to move: undo (revert the last mutation) or redo (re-apply the last undone mutation). Defaults to undo.

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and non-idempotence, so the safety profile is covered. The description earns credit for adding genuinely non-obvious behavior: immediate persistence, per-badge stack scope, a cap via TTRPG_MAX_SNAPSHOT_DEPTH, redo-stack clearing on a new mutation, and blocking by a pending workflow decision. It does not, however, describe what a restored snapshot affects or what the response reports.

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?

Front-loads the action and scope, then behavior, then use/do-not-use routing — a sensible order with no filler. The opening sentence is long and packs several constraints together, which costs a little readability but nothing is redundant.

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?

An output schema exists, so return values are covered, and annotations cover the mutation safety profile. The description supplies the remaining gaps an agent needs (stack scope, depth cap, decision blocking, alternative for older changes) for a two-direction, destructive undo 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 100% and the single enum parameter's description already defines both values and the undo default. The description adds the conceptual constraint that only the most recent mutation is in play, which sharpens interpretation of the 'undo' value but does not add syntax or format detail beyond 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?

States a specific verb pair (undo/redo) plus the exact resource scope: the most recent state mutation for the active badge. The scope ('most recent', 'per-badge') is what distinguishes it from sibling tools like manage_story that also mutate Novel state.

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 'Use when' (reverting the last mutation, restoring an undone one) and 'Do NOT use when' (an older change is the target), naming the correct alternative behavior: re-run the owning tool such as manage_story. It also names respond_decision as the unblocking prerequisite.

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

manage_identityIdentity ManagementA
Destructive

Manage a roster character's durable identity: staged candidates, accepted facets, and the versioned compiled kernel. stage imports or authors identity material; accept replaces a facet, retains the displaced value in an internal history, and bumps the identity version; reject marks a candidate rejected without touching accepted facets; revert restores the most recently displaced facet. bootstrap seeds from a character card; accept's perspective defaults to the candidate's stored perspective. Mutation persists the roster and is audited; list and snapshot are read-only and report current facets only. Use when: staging, accepting, rejecting, reverting, or reading identity material. Do NOT use when: recording what a character knows or believes — use manage_belief; editing narrative personality — use manage_character (action: personality).

NameRequiredDescriptionDefault
cardNoCharacter-card fields to stage (bootstrap).
facetNoIdentity facet key, e.g. name or calling (stage).
valueNoIdentity facet value (stage).
actionYesstage, accept, reject, revert, list, snapshot, or bootstrap.
sourceNoProvenance label for the candidate (stage; default manual).
stabilityNostructural, constitutional, core, or developmental (stage; default core).
perspectiveNoself, biographical, public_reputation, secret, or unknown (stage/accept; default self).
candidate_idNoIdentity candidate id (accept/reject).
character_idYesRoster character id.

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that accept retains the displaced value in internal history and bumps the identity version, that reject leaves accepted facets untouched, that revert restores the most recently displaced facet, that mutation persists the roster and is audited, and that list/snapshot are read-only despite the tool-level readOnlyHint=false. This resolves the annotation ambiguity for a destructive-flagged multi-action 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?

Front-loaded with the resource, then per-action semantics, then the use-when/do-not-use routing; nearly every clause supplies decision-relevant information. It is dense and somewhat run-on, but the only mild redundancy is restating the action list twice.

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?

With 9 parameters, enums, a nested card object, and an output schema that covers return values, the description supplies exactly what the structured fields cannot: per-action behavior, side effects, audit persistence, and sibling routing. Nothing needed to invoke it correctly is missing.

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 is 100%, so the baseline is 3, but the description adds real value by mapping parameters to actions (stage imports/authors, accept/reject use candidate_id, bootstrap seeds from a card) and by clarifying that accept's perspective defaults to the candidate's stored perspective rather than the schema's stated 'self' default. It does not explain the stability tiers (structural/core/developmental) or what a provenance source label is used for.

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?

States a specific verb and resource — managing a roster character's durable identity (staged candidates, accepted facets, versioned kernel) — and enumerates every action in the enum. It also explicitly names the sibling tools it is not, so an agent can separate it from manage_belief and manage_character without opening schemas.

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?

Has an explicit 'Use when' clause enumerating staging, accepting, rejecting, reverting, and reading, plus a 'Do NOT use when' clause that names the correct alternatives (manage_belief for knowledge/beliefs, manage_character with action: personality). This is the full when/when-not/alternative pattern.

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

manage_knowledgeDerived KnowledgeA
Destructive

Manage derived, in-memory knowledge over Novel sources: a semantic index for advisory text ranking and a typed knowledge graph. index_build and graph_build are audited, replace the prior projection in one step, and do not persist a separate copy; they are safe to rebuild from the authoritative Novel file, which is never modified. The read actions never mutate state. Use when: building or rebuilding the index or graph, checking staleness, ranking indexed items, or reading relations and graph structure. Do NOT use when: searching a bound ruleset's index — use manage_ruleset (action: search); recording knowledge — use manage_corpus; recording a relationship — use manage_relationship.

NameRequiredDescriptionDefault
limitNoMaximum candidates to return (index_search; default 5).
queryNoQuery text to rank candidates against (index_search).
actionYesindex_* actions operate the semantic index; graph_* actions operate the knowledge graph.
item_idNoIndexed item id to filter relations (index_relations).
node_idNoGraph node id (graph_neighbors).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and readOnlyHint=false, which alone would make an agent wary; the description resolves that by explaining exactly what is replaced (the prior projection), what is not created (no persisted copy), and that the authoritative Novel file is never modified — so the 'destructive' act is a safe rebuild. It also segregates read actions as non-mutating, which the annotations' tool-level flags cannot express since they are a single set for eleven actions.

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?

Purpose, then behavioral guarantees, then positive and negative routing — a sensible order with no filler. The second sentence is long and compound ('audited, replace the prior projection in one step, and do not persist a separate copy'), which costs a little scannability.

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?

For an eleven-action tool with a rich enum and an existing output schema, the description covers the things the schema cannot: which action families mutate, that rebuilds are safe and reversible from source, and where to go for the three neighboring intents. Return shapes are correctly left to the output schema.

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 100% and each parameter already names its owning action (index_search, index_relations, graph_neighbors), so the schema carries the load. The description adds no format, default, or constraint detail beyond what is structured, which is the baseline-3 case.

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?

States a specific verb and resource — derived, in-memory knowledge over Novel sources — and immediately decomposes it into the two concrete artifacts it manages: a semantic index and a typed knowledge graph. The action families (index_*/graph_*) are named in prose, so an agent knows the tool's surface without opening the schema.

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 'Use when' list covers all four legitimate intents (build/rebuild, staleness check, ranking, relation/graph reads), and the 'Do NOT use when' block routes three distinct wrong turns to manage_ruleset, manage_corpus, and manage_relationship by name. Nothing about selection is left to inference.

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

manage_loreLore ManagementA
Destructive

Manage the active Novel's lore entries — shared, durable world facts every caller recalls. set/update writes a keyed entry with recall triggers, priority, sticky weight, and a badge_scope (game_master hides it from the Player badge); set_secret, reveal, secret_list, and knowledge control Player-visible knowledge. import defaults to a non-mutating dry-run, while merge and replace write. Lore mutations require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); list, get, export, secret_list, and knowledge are read-only. Use when: creating, revising, removing, toggling, grouping, suggesting, listing, exporting, or importing lore, or controlling what an entity knows. Do NOT use when: recording one entity's beliefs or perceptions — use manage_belief; handling cold-reference corpus documents — use manage_corpus.

NameRequiredDescriptionDefault
keyNoLore key (set/update/remove/toggle/group/get).
dataNoJSON or Markdown lorebook data (import).
modeNodry-run, merge, or replace (import).
groupNoGroup name, or null to clear (set/update/group).
actionYesset, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge.
detailNoReturn full lore entries instead of summary entries (list).
formatNoOptional output format (export).
stickyNoOptional sticky weight (set/update).
contentNoLore content (set/update).
priorityNoOptional priority (set/update).
triggersNoOptional recall triggers (set/update).
entity_idNoEntity to reveal to / whose knowledge to read (reveal/knowledge).
badge_scopeNogame_master or shared (set/update).
world_targetNoOptional world-model target reference (set/set_secret).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint=true annotation, the description discloses the GM/Editor badge requirement for mutations, that mutations persist to the Novel, the undo path via manage_history (action: undo), that import defaults to a non-mutating dry-run while merge/replace write, and that game_master badge_scope hides entries from the Player badge. It also enumerates the read-only subset (list, get, export, secret_list, knowledge), which matters because the tool's aggregate annotation is destructive. Idempotency is unaddressed but the disclosure burden is otherwise well covered.

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?

Front-loaded with purpose first, then action families, then behavior, then use/avoid routing — a sensible order for a 14-action mega-tool. It is dense but nearly every clause carries information; the only mild redundancy is restating the read-only action list after already naming them in the action walkthrough.

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 14-parameter, multi-mode tool with an output schema and destructive annotation, the description covers scope, permissions, dry-run defaults, and undo. Gaps are minor: idempotency of set vs. update, and what happens when import merge collides with an existing key.

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 is 100%, so baseline is 3, but the description adds real meaning: badge_scope's game_master value hides the entry from the Player badge (a visibility rule not present in the enum description), and it names the recall triggers/priority/sticky weight fields as write-time concepts. It doesn't explain how triggers actually fire or what sticky weight governs.

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 opening sentence names a specific verb and resource ("Manage the active Novel's lore entries — shared, durable world facts") and immediately enumerates the action families it covers. It explicitly names the siblings it is not (manage_belief, manage_corpus), so an agent can separate it from adjacent tools without opening either schema.

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 provides an explicit "Use when:" list and an explicit "Do NOT use when:" clause that routes to named alternatives (manage_belief for entity beliefs, manage_corpus for cold-reference documents). The condition that selects each alternative is stated, not inferred.

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

manage_noteNote ManagementA
Destructive

Manage Novel-scoped scratch notes, badge-scoped to game_master (default), player, or shared. set replaces the note content; badge_scope defaults to game_master and controls which badge can read it; set_server stores a server-level note with an optional narrative_tag, and list_server returns summaries unless detail is set. Mutations persist to the Novel and are audited. Use when: storing scratch state the caller will reuse. Do NOT use when: recording durable world facts — use manage_lore (action: set). Revert with manage_history (action: undo).

NameRequiredDescriptionDefault
keyNoThe note key (set/remove/set_server/remove_server).
actionYesset, remove, list, set_server, remove_server, or list_server.
detailNoReturn full server notes instead of summary entries (list_server).
contentNoThe note content (set/set_server).
badge_scopeNogame_master, player, or shared (set).
narrative_tagNoOptional narrative tag (set_server).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false; the description adds real context on top: mutations persist to the Novel, are audited, 'set replaces the note content', and badge_scope governs which badge can read the note. It stops short of explaining the remove/remove_server destructive paths, which is the main gap given destructiveHint=true.

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?

Front-loaded with the resource and scope, then action semantics, then use/don't-use rules. Dense but every sentence carries information; the middle sentence is somewhat packed with several action behaviors at once.

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 an output schema and annotations covering safety, the description only needs to carry usage, scoping, and mutation semantics, which it does. The remove and list actions of a six-action tool are never mentioned, leaving a small completeness gap.

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 is 100% so the baseline is 3, but the description adds genuine semantics beyond the schema: badge_scope defaults to game_master and controls read access, set_server takes an optional narrative_tag, and list_server returns summaries unless detail is set. Only remove/list action behavior is left to 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?

Names a concrete resource ('Novel-scoped scratch notes') plus its scoping dimension (badge-scoped to game_master/player/shared), so the agent knows exactly what this tool owns. It also distinguishes itself from manage_lore and manage_history, which is more than most siblings do.

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 'Use when: storing scratch state the caller will reuse' and 'Do NOT use when: recording durable world facts — use manage_lore (action: set)', plus a revert path via manage_history (action: undo). Both the inclusion and exclusion conditions plus named alternatives are present.

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

manage_novelNovel Save ManagementA
Destructive

Manage Novel save files: create, resume, switch, end, rename, description, info, genre, complete_session_zero, save_context, get_context, and list. list returns one line per Novel unless detail is set, and filter selects active, archived, or all. create and save_context persist to the Novel; list, info, and get_context are read-only. Lifecycle changes are not reversible via manage_history, so clone a Novel with manage_archive before a risky change. Use when: handling a campaign's lifecycle or returning to saved context. Do NOT use when: managing content inside the Novel — use the entity tools; use manage_archive for export, import, archive/unarchive, clone/branch, and checkpoints.

NameRequiredDescriptionDefault
dataNoExported Novel JSON (import).
modeNodry-run, merge, or replace (import).
nameNoNovel name (create).
slugNoNovel slug (resume/switch/archive/unarchive/info).
genreNoGenre tag (create/genre).
labelNoCheckpoint label (checkpoint_set/list/restore/remove).
scopeNoExport scope (export).
actionYescreate, resume, switch, end, export, import, rename, description, list, archive, unarchive, info, genre, complete_session_zero, clone, branch, save_context, get_context, checkpoint_set, checkpoint_list, checkpoint_restore, or checkpoint_remove.
detailNoReturn full metadata (list).
filterNoactive, archived, or all (list).
formatNoOutput format (export).
strictNoFail on any cross-reference mismatch (import).
rulesetNoRuleset slug (create).
new_nameNoName for the copy or branch (clone/branch).
new_slugNoNew slug (rename).
from_eventNoEvent-log ordinal to branch from (branch; default latest).
descriptionNoDescription (create/description).
source_slugNoNovel to copy or branch from (clone/branch).
player_goalsNoPlayer goals (save_context).
current_sceneNoCurrent-scene summary (save_context).
codex_adventureNoCodex adventure to seed from (create).
long_term_plansNoLong-term plans (save_context).
short_term_plansNoShort-term plans (save_context).
immediate_situationNoImmediate situation (save_context).
include_checkpointsNoInclude checkpoints in export (default false; export).
trim_audit_sessionsNoKeep only the most recent N sessions' audit entries in the clone (clone; default full copy).
pending_player_actionNoPending player action (save_context).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, and the description goes beyond them by stating which actions persist (create, save_context) versus read-only (list, info, get_context) and that lifecycle changes are not reversible via manage_history, with the mitigation of cloning first. The remaining gap is that it never clarifies whether the destructive enum actions (import, clone, checkpoint_restore) are actually callable here or hard-routed to manage_archive.

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?

Front-loaded with the action scope, then behavior (read-only vs persisting), then a risk warning, then use/do-not-use. It is dense but every sentence carries routing or safety information. The opening enumeration of twelve action names partially duplicates the action enum, which is the main 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?

An output schema exists so return values need no explanation, and the description covers routing, mutation semantics, and irreversibility for a 27-parameter tool. However, with the action enum listing export/import/clone/branch/checkpoint actions that the prose delegates to manage_archive, an agent cannot fully resolve whether those are callable here — a meaningful ambiguity for a destructive 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 100% and each of the 27 parameters is annotated with its owning action, so the schema carries most of the load. The description adds real meaning for `detail` ('list returns one line per Novel unless detail is set') and `filter` (active/archived/all), but says nothing about the remaining parameters beyond the action-level split. Baseline 3 is appropriate.

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 names the resource (Novel save files) and enumerates the concrete actions (create, resume, switch, end, rename, info, save_context, get_context, list), so an agent can tell it handles campaign lifecycle rather than content. It explicitly separates itself from the entity tools and manage_archive. The only blur is that the schema's action enum still lists export/import/clone/branch/checkpoint_* actions the description tells the agent to route elsewhere.

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 'Use when: handling a campaign's lifecycle or returning to saved context' and 'Do NOT use when: managing content inside the Novel — use the entity tools', plus a named alternative (manage_archive) for export/import/archive/clone/checkpoints. Both the positive trigger and the exclusion are stated, leaving nothing to inference.

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

manage_npcNPC ManagementA
Destructive

Manage non-player characters in the active Novel. create requires a name; ruleset_reference links a stat block without copying it; mind is GM-only and never returned to the Player badge; remove deletes the NPC permanently. create, update, and remove require the GM or Editor badge, persist to the Novel, are audited, and are undoable via manage_history (action: undo); list and get are read-only. Use when: introducing, revising, removing, listing, or reading NPCs. Do NOT use when: managing player characters — use manage_character (action: create/import/sheet).

NameRequiredDescriptionDefault
cardNoCharacter Card V3 JSON object or string (import_card).
mindNoOptional GM-only NPC mind (create/update).
nameNoNPC name (create).
goalsNoOptional goals.
actionYescreate, update, remove, list, get, import_card, or export_card.
detailNoReturn full NPC records instead of summary entries (list).
npc_idNoNPC identifier (update/remove/get/export_card).
sourceNoImport provenance URL or description (import_card).
licenseNoImport license attestation (import_card).
personaNoOptional values, traits, and mannerisms (create/update).
locationNoOptional location.
descriptionNoOptional description.
dispositionNoOptional disposition.
confirm_loreNoImport the card's character_book as lore entries (import_card).
talkativenessNoOptional 0-100 social-scene speaking weight; default 50 (create/update).
ruleset_referenceNoOptional ruleset stat-block reference (create).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: states that create requires a name, that ruleset_reference links a stat block without copying it, that mind is GM-only and never returned to the Player badge, that remove is permanent deletion, and that writes require GM/Editor badge, persist, are audited, and are undoable via manage_history. The destructiveHint=true annotation is corroborated rather than contradicted.

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?

Dense semicolon-delimited clauses with zero filler; purpose comes first, per-action semantics next, then when/when-not routing. Everything stated is decision-relevant for a 16-parameter tool.

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 permissions, persistence, audit/undo, visibility, and destructive behavior for the core actions, and an output schema exists so return values need no explanation. Minor gaps: import_plan/import/export operations (card, source, license, detail) get no behavioral framing such as where card data lands or what confirm_lore does.

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 is 100%, so baseline is 3; the description adds real value on top by explaining the semantics of name (required on create), ruleset_reference (reference, not copy), and mind (GM-only, hidden from players), which the schema only labels. It does not add meaning for import_card parameters like license/source or confirm_lore.

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?

Opens with a specific verb+resource ("Manage non-player characters in the active Novel") and then enumerates the action surface (create/update/remove/list/get plus card import/export). It explicitly distinguishes itself from the nearest sibling, manage_relationship-style confusion avoided by calling out 'use manage_relationship' equivalent for NPCs.

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?

Contains an explicit "Use when:" list and a "Do NOT use when:" exclusion that names the alternative (manage_character with its create/import/sheet actions). An agent can route between NPC and PC management without opening either schema.

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

manage_relationshipRelationship ManagementA
Destructive

Manage directed relationships between entities, NPCs, or factions. set is keyed by the ordered (entity_a, entity_b) pair and updates type, value, or description in place rather than duplicating; type is one of ally, rival, neutral, mentor, dependent, or suspicious, and value is an optional numeric strength. get returns outgoing and incoming edges separately. set requires the GM or Editor badge, persists to the Novel, and is undoable via manage_history (action: undo); get is read-only. Use when: setting or reading how two parties relate. Do NOT use when: tracking faction standing or progress — use manage_faction (action: update).

NameRequiredDescriptionDefault
typeNoRelationship type (set).
valueNoOptional relationship strength (set).
actionYesset or get.
entity_aNoThe source entity (set).
entity_bNoThe target entity (set).
entity_idNoEntity whose relationships to list (get).
descriptionNoOptional description (set).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that set requires the GM or Editor badge, persists to the Novel, is undoable via manage_history (action: undo), and that get is read-only. It also explains the in-place (non-duplicating) update semantics, which reconciles with destructiveHint=true rather than contradicting it.

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?

Dense and front-loaded, with the use/do-not-use routing at the end serving a clear purpose. Minor redundancy in restating the enum list that the schema already provides keeps it from a top score.

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?

With an output schema and full annotation coverage present, the description still covers permissions, persistence, undo path, and get's return shape. An agent has everything needed to invoke it correctly and unsafely-avoid mistakes.

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 is 100% so the baseline is 3, but the description adds genuine meaning: the relationship key is the ordered (entity_a, entity_b) pair, value is an optional numeric strength, and get returns outgoing and incoming edges separately. It slightly repeats the enum values already in the schema, which keeps it from a 5.

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?

States specific verbs (set/get) against a specific resource (directed relationships between entities/NPCs/factions) and explicitly differentiates from the sibling manage_faction. An agent can select this without opening the schema.

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?

Contains an explicit 'Use when: setting or reading how two parties relate' and a 'Do NOT use when: tracking faction standing or progress — use manage_faction (action: update)', naming the alternative and its action. Nothing is left to inference.

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

manage_rulesetRuleset Package ManagementA
Destructive

Manage ruleset packages: search an installed ruleset's index, install or remove a package, list installed packages, bind a Novel to a ruleset, or import/remove supplementary Wisdom. search accepts an optional slug, works with no active Novel, and is read-only; install, remove, import_supplementary, and remove_supplementary mutate state, are audited, and are reversible via the paired action. install of an existing slug conflicts, and remove refuses while a Novel is bound to that slug. binding scopes only Novel-dependent features; import_supplementary uses inline wisdom when present and reads source only when absent. Table rolls are resolve_mechanic (action: roll). Use when: searching rules content, managing packages, binding a Novel, or adding/removing supplementary Wisdom. Do NOT use when: the ruleset name is unknown — use manage_session (action: discover).

NameRequiredDescriptionDefault
seedNoDeterministic seed (roll).
slugNoRuleset slug (install/remove/bind/import_supplementary/remove_supplementary).
indexNoSearch index (install).
modelNoExtraction model (install).
queryNoSearch query (search).
tableNoGeneration table to roll on (roll).
toolsNoTool schemas (install).
actionYessearch, install, remove, list, bind, import_supplementary, or remove_supplementary.
sourceNoSupplementary Markdown source path (import_supplementary).
wisdomNoInline supplementary Wisdom items (import_supplementary).
promptsNoPrompts (install).
manifestNoPackage manifest (install).
resourcesNoResources (install).
max_resultsNoMaximum results (search).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations it discloses per-action safety: search is read-only and needs no active Novel; mutating actions are audited and reversible via the paired action; install of an existing slug conflicts; remove refuses while a Novel is bound; binding scopes only Novel-dependent features. These are exactly the behavioral traits annotations cannot express per-action, and they do not contradict the tool-level destructiveHint.

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?

Despite covering seven actions and fourteen params, it is tightly organized: purpose first, then per-action behavior and constraints, then Use-when/Do-not-use routing. Every sentence carries actionable information with no filler.

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?

With an output schema handling return values and annotations covering the safety profile, the description fills the remaining gaps: per-action semantics, mutation/audit/reversibility, conflict and refusal conditions, and routing to siblings. An agent has everything needed to pick the right action correctly.

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 is 100%, so the schema already documents each parameter and its target action, warranting a baseline 3. The description adds genuine value beyond that by noting that search accepts an optional slug (info not present in the schema's slug description), though it does not clarify the remaining install-specific params.

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 enumerates the concrete actions verb+resource (search, install, remove, list, bind, import/remove supplementary Wisdom) in one front-loaded sentence, so an agent can map the tool to its tasks precisely. It also distinguishes itself from resolve_mechanic (rolls) and manage_session (discovery).

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?

It gives an explicit 'Use when:' list and a 'Do NOT use when:' exclusion that names the alternative ('the ruleset name is unknown — use manage_session (action: discover)'). It further routes table rolls to resolve_mechanic, leaving nothing to inference.

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

manage_sceneScene ManagementA
Destructive

Manage the active scene and its narrative framing — scene description, directive, choices, and oracle rolls, distinct from the world model's rooms and things. set overwrites the scene's description and metadata and derives the description from location only when description is omitted; directive replaces the active directive; choices replaces the offered options; oracle resolves a chance question and records the roll. set and directive require the GM or Editor badge, persist to the Novel, are audited, and are undoable via manage_history (action: undo). Use when: setting scene state, issuing a directive, offering choices, or consulting the oracle. Do NOT use when: recording a story beat — use manage_story (action: record); staging presence or autonomy — use manage_staging.

NameRequiredDescriptionDefault
beatNoStory-beat tag (set): setup, escalation, turning_point, climax, resolution, denouement.
seedNoDeterministic seed (oracle).
actionYesset, directive, presence, autonomy, choices, or oracle.
promptNoChoice prompt (choices).
choicesNoList of choices (choices).
contextNoContext for the choice (choices).
locationNoScene location (set).
questionNoQuestion to resolve (oracle).
directiveNoNarrative directive (directive).
atmosphereNoAtmosphere (set).
likelihoodNoLikelihood tier (oracle).
scene_typeNoScene-type tag or array (set).
descriptionNoScene description (set).
time_of_dayNoTime of day (set).
fast_forwardNoNarrative fast-forward (set).
allow_freeformNoAllow free-form response (choices).
adventure_sceneNoAdventure-scene waypoint anchor; empty or null clears (set).
skip_transition_hookNoSkip the scene-transition hook (set).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: set and directive require the GM or Editor badge, persist to the Novel, are audited, and are reversible via manage_history (action: undo). It also discloses that set overwrites existing description/metadata, which corroborates destructiveHint=true. It stops short of noting non-idempotency or the additive side effects of oracle rolls, so it is strong but not complete.

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?

Dense but front-loaded: the purpose leads, per-action semantics follow, then permissions, then explicit use/do-not-use routing. Every sentence carries distinct information, and the 'Use when' / 'Do NOT use when' scaffolding makes it scannable despite the length.

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 an 18-parameter destructive tool, it covers the four actions, the permission model, persistence/audit behavior, and undo path, and the output schema means return values need not be described. The gap is fast_forward and its nested changes/skip_countdowns semantics, which an agent must infer entirely from the schema.

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 is 100%, so the baseline is 3, but the description adds a genuine rule not in the schema: description is derived from location only when description is omitted. It also maps parameters to actions (directive replaces the active directive, choices replaces the offered options). The notable omission is fast_forward, a nested object controlling time skips and NPC changes, which is never explained.

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?

Names a specific verb+resource ('Manage the active scene and its narrative framing') and enumerates the four sub-operations it covers: description, directive, choices, and oracle rolls. It explicitly separates the tool from the world model's 'rooms and things' and from the staging siblings, so an agent can discriminate it without opening the schema.

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 an explicit 'Use when:' list (setting scene state, issuing a directive, offering choices, consulting the oracle) and a 'Do NOT use when:' list that routes to named alternatives — manage_story for recording a beat and manage_staging for presence/autonomy. This is exactly the when/when-not/alternative structure a routing agent needs.

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

manage_sessionSession ManagementA
Destructive

Manage play-facing session controls: recap, verbosity, briefing_order, and tool discovery, distinct from story content and Novel lifecycle. recap accepts an archived session_id, GM-only gm_notes, and an optional compression tier; gm_notes are never returned to a non-GM badge. discover searches names, descriptions, and titles, and detail schema requires query. verbosity is session-scoped; briefing_order persists to the Novel and requires the GM or Editor badge. recap and discover are read-only; a setting is restored by setting it again (no undo snapshot is taken). Use when: recapping play, tuning output verbosity, reordering the briefing, or finding a tool. Do NOT use when: health, audit compaction, event-log, or category operations — use manage_diagnostics; recording story content — use manage_story (action: record).

NameRequiredDescriptionDefault
modeNonormal or terse (verbosity).
tierNoCompression tier to assemble (recap; REQ-592).
queryNoOptional search term matched against tool name, description, and title (discover).
actionYesrecap, verbosity, briefing_order, compress (non-mutating audit summary prompt), compact (GM-only irreversible audit-log compaction), health, context_report (per-section token ledger), subscribe, discover (list/search tools), category (reassign a tool's category), event (append an observation), history (read the event log), verify (compare live state to recorded hashes), replay (read-only event-log inspection), visibility_check (scan a draft for GM-only disclosure), or visibility_audit (recent visibility decisions).
detailNodiscover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609).
gm_notesNoGM-only free-text notes returned only to the Game Master badge (recap).
sectionsNoOrdered list of briefing sections (briefing_order).
session_idNoArchived session id to include in recap (recap).
budget_tokensNoPositive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already signal that the overall tool is mutating and destructive, and the description adds useful behavioral detail: GM-only gm_notes visibility, session-scoped verbosity, briefing_order persistence to the Novel, badge requirements, read-only recap/discover subactions, and the absence of an undo snapshot. It still does not reconcile the destructive 'compact' action that appears in the schema with the instruction to avoid audit compaction, leaving some per-action side effects unclear.

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 dense but appropriately structured for a multi-action tool: it front-loads the purpose, then gives use and do-not-use routing. Some clauses are run-on and the long action list creates slight redundancy, but most sentences carry useful information.

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 complex tool with nine parameters and an output schema, the description covers the main play-facing actions and the most important exclusions, so it is minimally viable. However, it leaves several actions present in the schema, such as compress, context_report, subscribe, verify, replay, and the visibility actions, effectively unexplained, which creates a completeness gap.

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 description coverage is 100%, so the schema already documents all nine parameters. The description adds meaningful semantics beyond the schema, especially that gm_notes are GM-only and never returned to a non-GM badge, that detail schema requires query, and that briefing_order persists while verbosity is session-scoped.

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 names a specific resource and enumerates four play-facing actions (recap, verbosity, briefing_order, discover), and it distinguishes this tool from story content, Novel lifecycle, and manage_diagnostics. However, the action schema includes many additional actions not covered by the description, so the stated purpose is clearer for a subset than for the full 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?

It gives explicit 'Use when' and 'Do NOT use when' guidance, naming alternatives such as manage_diagnostics for health/audit/event-log/category operations and manage_story for recording story content. The routing conditions are concrete enough that an agent can choose between this tool and its siblings without inference.

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

manage_stagingScene Staging ManagementA
Destructive

Manage scene presence, autonomy, and social-cast staging. presence replaces the present set; cast sets the multi-NPC speaker strategy with mute/unmute adjusting its pool; next_speaker runs manual, forced, or pooled selection, where force overrides select; autonomy changes apply to the current scene only. Presence, autonomy, and cast state persist to the Novel and are audited. Use when: setting who is present, adjusting scene autonomy, choosing a speaker strategy, or selecting the next speaker. Do NOT use when: setting the scene, issuing a directive, offering choices, or consulting the oracle — use manage_scene. Revert the most recent mutation with manage_history (action: undo).

NameRequiredDescriptionDefault
muteNoNPC muted from speaker selection (cast).
forceNoNPC forced as the next speaker (cast/next_speaker).
levelNoAutonomy level (autonomy).
actionYespresence, autonomy, cast, or next_speaker.
safetyNoSafety tier (autonomy).
selectNoNPC selected as the manual speaker (cast/next_speaker).
unmuteNoNPC restored to speaker selection (cast).
strategyNoSpeaker-selection strategy (cast).
after_userNoReset the pooled spoken-set for a new user turn (next_speaker).
creativityNoCreativity (autonomy).
entity_idsNoEntities present (presence).
confirmationNoConfirmation mode (autonomy).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.9/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: presence replaces the present set, cast adjusts the speaker pool via mute/unmute, next_speaker supports manual/forced/pooled selection, force overrides select, and autonomy changes apply only to the current scene. It also discloses that presence, autonomy, and cast state persist to the Novel and are audited, which is key for a destructive, non-idempotent mutation 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?

The description is dense but well organized: purpose first, action semantics next, then explicit use/avoid guidance and undo routing. Every sentence contributes operational information, and the semicolon structure keeps it front-loaded despite the 12-parameter surface area.

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, 12 parameters, destructive annotations, and an existing output schema, the description covers the important missing context: action behavior, current-scene scope, persistence/auditing, sibling routing, and undo. Nothing essential for correct invocation appears to be omitted.

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 description coverage is 100%, so the schema already documents all 12 parameters. The description adds meaningful action-to-parameter semantics, such as presence replacing the present set, cast using mute/unmute, next_speaker with force overriding select, and autonomy being scene-local, which goes beyond the field descriptions even though not every autonomy sub-parameter is elaborated.

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 verb and resources: 'Manage scene presence, autonomy, and social-cast staging,' then clarifies each action's role. It explicitly distinguishes itself from manage_scene with a 'Do NOT use when' clause, so an agent can select it confidently.

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?

It gives explicit positive triggers ('Use when: setting who is present, adjusting scene autonomy, choosing a speaker strategy, or selecting the next speaker') and explicit exclusions that route to manage_scene. It also names manage_history (action: undo) for reverting the most recent mutation.

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

manage_storyStory Journal ManagementA
Destructive

Manage the story journal — typed narrative memories (decision, moment, revelation, bond, consequence). record appends an entry and consumes the turn_handle minted by take_turn; update edits a mutable entry; decision and consequence entries are immutable and refuse update or promotion; remove deletes an entry by index; promote copies an entry into lore under a derived or supplied key. list filters by type and paginates with offset and limit, returning previews unless detail is set. Mutations require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); list is read-only. Use when: recording, editing, removing, listing, or promoting story beats. Do NOT use when: recording a durable world fact — use manage_lore (action: set).

NameRequiredDescriptionDefault
keyNoOptional lore key (promote).
typeNoStory entry type (record/update).
entryNoStory entry text (record/update).
indexNoStory entry index (update/remove/promote).
limitNoOptional page size (list).
actionYesrecord, update, remove, list, or promote.
filterNoOptional type filter (list).
offsetNoOptional pagination offset (list).
turn_handleNoTurn handle minted by take_turn (record); consumed on success.

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the crude profile (destructiveHint=true, non-idempotent). The description adds far more: decision and consequence entries are immutable and refuse update/promotion, mutations require the GM or Editor badge, changes persist to the Novel, and they are undoable via manage_history (action: undo), while list is read-only. It also discloses that record consumes the turn_handle minted by take_turn — a hidden side effect no annotation conveys.

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?

It is front-loaded on the resource, then the per-action inventory, then the when/when-not routing — a sensible order with no filler sentences. The single dense paragraph is slightly run-on for nine parameters, but every clause carries information.

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?

For a nine-parameter, five-action mutation tool the description covers action semantics, immutability constraints, permissions, side effects, undo path, and sibling exclusion; return values are covered by the existing output schema, so nothing an agent needs is missing.

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 is 100%, so the baseline is 3, but the description goes further by binding parameters to actions: turn_handle is consumed on record, index applies to update/remove/promote, and list uses filter with offset/limit returning previews unless detail is set. It doesn't cover formatting expectations for entry text, so it stops short of a 5.

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 names a specific resource (the story journal) and then defines each of the five actions — record, update, remove, list, promote — with concrete semantics. It distinguishes itself from siblings by naming manage_lore for durable world facts, so an agent can route correctly without opening the schema.

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 "Use when: recording, editing, removing, listing, or promoting story beats" and "Do NOT use when: recording a durable world fact — use manage_lore (action: set)." That is a named alternative plus the condition that selects it, leaving nothing to inference.

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

manage_synthesisSynthesis ManagementA
Destructive

Manage synthesis content (voice examples, lore templates, action patterns, and other Ruleset Wisdom). Mutating actions (run, revert, activate, deactivate, toggle, toggle_action, player_add, player_remove, record_ruling, revert_ruling) persist to the Novel and are audited; read-only actions (list, player_list, verify) do not mutate state. verify checks each item's stored citation locally and reports pass/weak/unsupported; it never fetches and never changes state. record_ruling writes a ruling and its verified citations to the GM-only ruling ledger; revert_ruling marks a ledger entry reverted; ruling_list reads the ledger newest-first. Undo the latest mutation with manage_history. activate/deactivate with key omitted act on the whole module. Use when: running, reverting, listing, activating, deactivating, toggling, verifying, recording or reading rulings, or player-authoring items. Do NOT use when: browsing the codex — use manage_codex (action: list).

NameRequiredDescriptionDefault
keyNoItem key (activate: number; player_add/player_remove/verify/record_ruling: string).
forceNoRe-run even if unchanged (run).
queryNoQuestion the ruling answers (record_ruling).
actionYesrun, revert, list, activate, deactivate, toggle, toggle_action, player_add, player_remove, player_list, verify, record_ruling, revert_ruling, or ruling_list.
detailNoReturn full entries (list).
moduleNoSynthesis module (activate/deactivate/toggle/player_*/list/verify/record_ruling).
rulingNoRuling text to record (record_ruling).
contentNoItem content (player_add).
enabledNoEnable or disable (toggle).
triggersNoRecall triggers (player_add).
ruling_idNoLedger entry id (revert_ruling).
badge_scopeNoshared or player (player_add).
max_entriesNoMaximum rulings to return, newest first (ruling_list; default 20).
include_revertedNoInclude reverted rulings (ruling_list; default false).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations flag a destructive, non-idempotent, non-read-only tool, and the description goes well beyond that by splitting the action enum into mutating vs read-only sets, stating mutations are audited and persist to the Novel, clarifying that verify is purely local and never fetches, and describing the GM-only ruling ledger lifecycle (record/revert/list newest-first). It even discloses the edge case that activate/deactivate with key omitted act on the whole module.

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?

Front-loaded with purpose, then the mutation/read-only split, then per-action clarifications, then the when/when-not block — a good information hierarchy. It is dense and slightly sprawling for a single sentence-chain, but nearly every clause carries distinct operational information, so waste is minimal.

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?

For a 14-parameter, 14-action multiplexed tool with an output schema already present, the description supplies everything an agent needs to pick the right action, understand side effects, and know where to go for undo or adjacent resources. Return-value detail is correctly omitted since the output schema covers it.

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 is 100% and each parameter already names its owning action, so the schema does the bulk of the work. The description still adds value the schema lacks: the whole-module behavior when key is omitted, ruling_list ordering (newest-first), and the verify pass/weak/unsupported outcome vocabulary.

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?

Opens with a specific verb+resource ('Manage synthesis content') and names the concrete content types (voice examples, lore templates, action patterns, Ruleset Wisdom). It routes away from the nearest lookalike sibling twice (manage_history for undo, manage_codex for browsing), so an agent can distinguish it without opening any schema.

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 'Use when:' enumeration covers every intent the tool serves, and 'Do NOT use when: browsing the codex — use manage_codex (action: list)' names the alternative and the condition selecting it. Undo routing to manage_history is also spelled out, leaving nothing to inference.

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

manage_vowVow ManagementA
Destructive

Track narrative vows, quests, and obligations with milestones. set creates a vow and links a countdown whose ticks follow the difficulty rank track (scope defaults to shared); milestone advances progress; resolve and forsake close the vow with distinct outcomes (fulfilled vs abandoned). Mutations require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); resolve and forsake are terminal in the forward direction. Use when: setting, advancing, resolving, forsaking, or listing vows. Do NOT use when: starting a clock timer — use manage_countdown (action: set).

NameRequiredDescriptionDefault
nameNoVow name (set).
scopeNogame_master, shared, faction, or party (set).
actionYesset, milestone, resolve, forsake, or list.
reasonNoThe reason for abandoning (forsake).
outcomeNoThe resolution outcome (resolve).
partiesNoParties bound by the vow (set).
vow_nameNoVow name (milestone/resolve/forsake).
difficultyNotroublesome, dangerous, formidable, extreme, or epic (set).
descriptionNoVow description (set).
consequencesNoOptional consequences (resolve).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the destructiveHint=true annotation: it states the auth requirement (GM or Editor badge), persistence target (the Novel), the recovery path (undoable via manage_history action: undo), and the asymmetry that resolve/forsake are terminal forward-only. The one gap is that 'destructiveHint' is not reconciled — the description never says what milestone/forsake destroy or whether they overwrite prior state, which matters for a destructive 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?

Front-loaded with purpose, then action semantics, then auth/undo, then use/don't-use routing — a logical order with no filler sentences. The action-semantics clause is dense enough that a skimming agent could miss the resolve/forsake distinction, keeping it just under a 5.

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?

For a 10-parameter, 5-action mutation tool with an output schema, the description covers everything an agent needs to call it correctly: permissions, terminality, undo route, action-level effects, and the sibling it must not be confused with. Return values are correctly left to the output schema.

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 is 100%, so baseline 3 applies, and the description earns a bump by tying parameters to actions (name/difficulty/scope/parties for set; outcome/consequences for resolve; reason for forsake) and by disclosing the undocumented default that scope defaults to 'shared'. It still doesn't explain the difficulty→countdown-tick mapping concretely or why both 'name' and 'vow_name' exist.

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?

Opens with a specific verb+resource ('Track narrative vows, quests, and obligations with milestones') and then enumerates what each action value does — set creates and links a countdown, milestone advances, resolve/forsake close with distinct outcomes. An agent can distinguish this from the many sibling 'manage_*' tools without opening the schema.

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 'Use when:' list covers all five actions, and 'Do NOT use when:' names the confusable sibling and the exact alternative call (manage_countdown, action: set) for the timer case. This is the highest tier of routing guidance.

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

manage_worldWorld Model ManagementA
Destructive

Manage the world model — rooms, things, exits, and their spatial properties. create and update mutate in place and persist to the Novel; all mutations are audited; remove is permanent and requires re-creation; convert replaces the described subtree; generate creates rooms from installed table pools bounded by TTRPG_WORLD_GEN_MAX_ROOMS. create_exit links both directions; create_thing honors location_type only when location is set, and kind forces property defaults. There are no read-only actions here; inspect state with run_command (action: execute). Use when: creating, updating, removing, bulk-converting, or generating locations and objects. Do NOT use when: navigating the world — use run_command (action: execute); proposing objective-state transitions — use manage_causality; recording what an entity believes — use manage_belief.

NameRequiredDescriptionDefault
toNoDestination room alias for room_b (create_exit).
keyNoBound key thing name required to unlock or lock this thing when lockable (create_thing/update_thing).
litNoWhen true the thing is lit (create_thing/update_thing).
fromNoSource room alias for room_a (create_exit).
kindNoOptional thing kind (create_thing).
nameNoRoom/thing name (create/update/remove).
roomNoSource room (create_exit/remove_exit).
seedNoDeterministic seed (generate).
fixedNoWhen true the thing cannot be taken (create_thing/update_thing).
noiseNoAuditory cue text reported by listen (create_thing/update_thing).
scentNoOlfactory cue text reported by smell (create_thing/update_thing).
actionYesWorld: create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate. Causal: causal_propose, causal_admit, causal_reject, causal_list, causal_state, or causal_ingress.
edibleNoWhen true the thing can be eaten (create_thing/update_thing).
lockedNoWhen true the thing starts locked (create_thing/update_thing).
room_aNoSource room (create_exit).
room_bNoDestination room (create_exit).
sourceNoHybrid world-model source text (convert).
optionsNoGeneration options (generate): roles maps installed table names to room, objects, persons, or hazards pools; rooms requests a count bounded by TTRPG_WORLD_GEN_MAX_ROOMS.
locationNoOptional containing room or thing (create_thing/update_thing).
lockableNoWhen true the thing can be locked (create_thing/update_thing).
openableNoWhen true the thing can be opened (create_thing/update_thing).
readableNoWhen true the thing can be read (create_thing/update_thing).
wearableNoWhen true the thing can be worn (create_thing/update_thing).
climbableNoWhen true the thing can be climbed (create_thing/update_thing).
directionNoDirection (create_exit/remove_exit).
drinkableNoWhen true the thing can be drunk (create_thing/update_thing).
enterableNoWhen true the thing can be entered (create_thing/update_thing).
read_textNoText revealed when the thing is read (create_thing/update_thing).
switchableNoWhen true the thing can be switched (create_thing/update_thing).
descriptionNoOptional description (create/update).
switched_onNoWhen true the thing is switched on (create_thing/update_thing).
transparentNoWhen true the thing is transparent (create_thing/update_thing).
location_typeNoWhere the thing is placed (create_thing).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context: mutations are audited and persisted, remove requires re-creation, convert replaces the described subtree, generate is bounded by TTRPG_WORLD_GEN_MAX_ROOMS, create_exit links both directions, and create_thing honors location_type only when location is set. These are non-obvious behavioral traits beyond the annotation flags.

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?

Front-loaded with purpose, then behavior, then routing. Dense but every clause carries decision-relevant information (audit, permanence, env bound, conditional param rules). Semicolon-separated clauses make it slightly harder to scan than ideal, but the length is justified by 10 sub-actions and 33 parameters.

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?

Output schema exists and annotations cover the safety profile, so the description does not need to explain return values. Combined with 100% schema coverage and the explicit use/when-not routing, an agent has everything needed to pick this tool and the correct action.

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 is 100%, so baseline is 3. The description adds cross-parameter semantics the schema does not: location_type is only honored when location is provided, and kind forces property defaults. It does not clarify most of the 33 parameters, but it adds real conditional meaning for a few high-value ones.

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?

Explicit verb-plus-resource: 'Manage the world model — rooms, things, exits', and it enumerates the semantics of each sub-action (create/update mutate in place, remove is permanent, convert replaces subtree, generate pulls from table pools). It also names the exact sibling tools it is not (run_command, manage_causality, manage_belief), so an agent can distinguish it without opening schemas.

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?

Contains explicit 'Use when:' and 'Do NOT use when:' blocks with alternatives for each exclusion. Navigation goes to run_command (action: execute), objective-state transitions to manage_causality, entity beliefs to manage_belief. This is the strongest kind of routing guidance.

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

open_sessionOpen Play SessionA
Destructive

Open a play session by resuming a Novel, activating a badge, and returning a recap. novel selects the slug and badge the seat; both are optional and fall back to the active Novel and current badge; resume and badge changes persist and are audited. Use when: starting or resuming a session, especially after a restart. Do NOT use when: creating a Novel — use manage_novel (action: create); running a turn — use take_turn. Revert with manage_history (action: undo).

NameRequiredDescriptionDefault
badgeNoBadge to activate (open_session).
novelNoNovel slug to resume (open_session).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, and the description adds real context beyond that: changes persist, are audited, and both parameters silently fall back to active defaults. It does not explain what the destructive behavior actually overwrites (e.g., whether an existing badge or session state is clobbered), which is the one thing an agent calling a destructive tool most needs.

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?

Front-loaded with the action, then defaults, then use/don't-use routing and the revert path – every clause carries information. Slightly dense in places (the long compound first sentence, jargon like 'badge the seat'), but no wasted sentences.

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?

Strong coverage for a mutation tool: output schema handles the recap return value and annotations carry the safety profile, so the description only needs routing and default behavior, which it supplies. The remaining gap is the unexplained destructive consequence, which would matter more if annotations were absent.

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 100% schema coverage the baseline is 3, and the description earns a step up by explaining that both parameters are optional and default to the active Novel and current badge. That fallback semantics is behavior the schema's per-field descriptions do not convey.

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?

States a specific verb and resource with its composite effects: opening a session by resuming a Novel, activating a badge, and returning a recap. This is clearly distinguishable from siblings like take_turn, manage_novel, and close_session without opening any schema.

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 'Use when' (starting/resuming a session, especially after a restart) and 'Do NOT use when' clauses route to named alternatives: manage_novel (action: create) for creating, take_turn for running a turn, and manage_history (action: undo) as the revert path. Nothing is left to inference.

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

resolve_mechanicResolve MechanicsA
Destructive

Resolve uncertain actions across the host's base mechanics: Fate Fudge dice, aspects, Fate points, and stress; Ironsworn momentum, moves, and progress; Forged action rolls, stress, trauma, and downtime; and generic ruleset table rolls. Rolls and state changes persist to the Novel and are audited; a roll with no following write is flagged as an uncommitted roll. Revert the most recent mutation with manage_history (action: undo). fate_roll uses dF, ironsworn_move compares an action die against two challenge dice, and forged_action_roll takes the highest of a d6 pool. Use when: resolving a Fate, Ironsworn, or Forged mechanic, or rolling on a ruleset generation table. Do NOT use when: resolving a ruleset skill check — use the bound ruleset's roll tools; managing vows — use manage_vow (action: set).

NameRequiredDescriptionDefault
opNoSub-operation for aspect, fate_point, stress, momentum, progress, or downtime.
addsNoStat and bonuses added to the action die (ironsworn_move).
burnNoBurn momentum to replace the action score (ironsworn_move).
costNoStress cost to resist (forged_stress); defaults to 2.
diceNoFudge dice notation (fate_roll) or dice pool size (forged_action_roll).
nameNoAspect name, progress-track name, move name, action name, or consequence label.
rankNoProgress-track rank (ironsworn_progress).
seedNoDeterministic seed (fate_roll, ironsworn_move, ironsworn_progress, forged_action_roll, roll).
slugNoRuleset slug for a Novel-independent roll (roll).
skillNoSkill name for the roll label (fate_roll).
tableNoGeneration table to roll on (roll).
ticksNoProgress to mark (ironsworn_progress); defaults to 1.
trackNoStress track to mark or clear (fate_stress).
actionYesroll (ruleset table), fate_* (Fate), ironsworn_* (Ironsworn), or forged_* (Forged in the Dark).
amountNoFate points (fate_point), stress (fate_stress, forged_stress, forged_downtime), or momentum (ironsworn_momentum); defaults to 1.
effectNoEffect (forged_action_roll); defaults to standard.
shiftsNoShifts to mark on a stress track (fate_stress); defaults to 1.
targetNoAspect target: 'scene' or an entity/NPC id (fate_aspect); defaults to 'scene'.
modifierNoSkill rating added to the roll (fate_roll).
positionNoPosition (forged_action_roll); defaults to risky.
entity_idNoEntity or NPC id (fate_aspect, fate_point, fate_stress, ironsworn_momentum, ironsworn_move, forged_stress, forged_downtime).
difficultyNoOpposition to beat (fate_roll); defaults to 0.
consequenceNoConsequence to record or clear (fate_stress).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.7/5.0
Behavior5/5

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

Despite the annotations only giving a generic destructive/non-idempotent profile, the description discloses the concrete behavioral contract: rolls and state changes persist to the Novel, are audited, and a roll with no following write is flagged as an uncommitted roll. It also supplies the recovery path (revert the most recent mutation via manage_history with action: undo), which is exactly the context an agent needs before making an irreversible mutation.

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?

Purpose, persistence/audit behavior, undo path, dice mechanics, and use/exclusion guidance are all front-loaded with no filler sentences. The paragraph is dense — a single block packing four distinct concerns — but every sentence carries information an agent needs.

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 an 11-action, 23-parameter mutation tool the description covers the family taxonomy, the audit/undo contract, and the notable roll mechanics; an output schema exists so return values need no explanation. It stops short of explaining the 'op' sub-operation axis or what each of the state-mutating actions (fate_aspect, ironsworn_momentum, forged_downtime) does, leaving that to the schema.

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 is 100%, so the baseline is 3, but the description adds real meaning at the dispatch level: it explains that fate_roll uses dF, ironsworn_move compares an action die against two challenge dice, and forged_action_roll takes the highest of a d6 pool. It does not add per-parameter guidance (e.g., how 'op' sub-operations interact with 'action'), which caps this below 5.

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 opening sentence names a specific verb ('Resolve') and enumerates the exact resources covered: Fate Fudge dice/aspects/Fate points/stress, Ironsworn momentum/moves/progress, Forged action rolls/stress/trauma/downtime, and generic table rolls. It explicitly distinguishes itself from the sibling ruleset roll tools and manage_vow, so an agent can route correctly without opening any schema.

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?

It contains an explicit 'Use when' clause (resolving a Fate, Ironsworn, or Forged mechanic, or rolling on a ruleset generation table) and an explicit 'Do NOT use when' clause naming two alternatives with the sibling and action to use instead (ruleset roll tools; manage_vow action: set). Nothing is left to inference.

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

respond_decisionRespond to Workflow DecisionA
Destructive

Answer a pending workflow decision, atomically draining it and persisting the outcome to the Novel. option must match one of the emitted choices; 'cancel' aborts the workflow and restores its pre-workflow snapshot, while any applied outcome is not reversible. The drain is mutating and audited, and a second call with no pending decision returns STATE_CONFLICT. Use when: the server emitted a [NEED_INPUT] prompt and the caller must choose. Do NOT use when: no decision is pending — use set_badge or a state tool instead.

NameRequiredDescriptionDefault
optionYesThe chosen option, or 'cancel' to abort the workflow and restore its snapshot.
decisionYesThe canonical decision text the workflow is waiting on.

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, but the description adds substantial context beyond them: the drain is atomic and audited, 'cancel' restores the pre-workflow snapshot, an applied outcome is not reversible, and a second call returns STATE_CONFLICT. These are the exact behavioral facts an agent needs before committing.

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?

Effect-first opening sentence, then constraints, then explicit Use/Do-NOT-use blocks — all front-loaded with no filler. Every clause carries either a selection rule or a behavioral consequence.

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?

For a destructive, non-idempotent mutation with two required params, the description covers prerequisites (pending decision), irreversibility, snapshot restore, and the STATE_CONFLICT failure mode; an output schema exists so return values need no explanation.

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 is 100%, so the baseline is 3, but the description adds a real constraint the schema lacks: option must match one of the emitted choices, and the cancel path's snapshot-restore semantics. It stops short of describing the 'decision' parameter's matching rules, so it is not a 5.

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?

States a specific verb and resource ('Answer a pending workflow decision'), plus the effects (atomic drain, persist to Novel). It clearly distinguishes itself from siblings by naming set_badge and a state tool as the alternative when nothing is pending.

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 'Use when: the server emitted a [NEED_INPUT] prompt' and 'Do NOT use when: no decision is pending', and names the concrete alternatives. There is no inference required to select this tool.

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

run_commandParser CommandA
Destructive

Run the spatial parser: execute a parsed command, resolve a movement outcome, or map an intent to tool calls. execute accepts free-form text, mutates world and entity state, persists, and is audited; a mistaken move is reversed by issuing the inverse command because no undo snapshot is taken. resolve computes the same movement without mutating, and suggest returns recommended calls without executing them; source and target apply only to perception queries. On a ruleset-bound Novel the parser is GM-only for navigation and mutation, while the Player badge keeps read-only perception commands. Use when: a player or narrator takes a physical action, needs a movement outcome without mutating, or wants intent mapped to tools. Do NOT use when: the GM creates or edits the model — use manage_world; durable world facts — use manage_lore.

NameRequiredDescriptionDefault
actionNoexecute (parser), resolve (non-mutating intent), suggest (intent → tool calls), visibility (can one actor see another or a thing), or audibility (can one actor hear another). Defaults to execute.
intentNoThe intent to resolve or map (resolve/suggest).
sourceNoObserving actor for visibility/audibility (defaults to the active entity).
targetNoActor or thing being seen or heard (visibility/audibility).
commandNoThe natural-language command (execute).
entity_idNoOptional entity context (suggest).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that execute mutates world and entity state, persists, and is audited; that no undo snapshot is taken so a mistaken move must be reversed with the inverse command; and that resolve/suggest are non-mutating. It also states an authorization rule (GM-only navigation/mutation on a ruleset-bound Novel, Player badge limited to read-only perception) that no annotation conveys. This is consistent with destructiveHint=true and readOnlyHint=false.

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?

Front-loaded with the mode breakdown before the operational caveats, and every sentence carries content (mutation/persistence, no undo, permission model, use/don't-use). It is dense and long for a description, but the density is justified by five distinct modes; splitting the permission sentence out would improve scannability.

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?

An output schema exists, so return values need no explanation; the description instead covers the dimensions that matter for a destructive, multi-mode, permission-gated tool: which action mutates, how to recover from a bad mutation, and who is allowed to call it. Nothing material is missing for correct invocation.

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 is 100%, so baseline would be 3, but the description adds cross-parameter meaning the schema does not: which modes consume free-form text ('execute accepts free-form text') and the scoping rule that 'source and target apply only to perception queries'. That conditional applicability is genuinely useful for avoiding wasted arguments on resolve/suggest.

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?

Opens with a specific verb and resource ('Run the spatial parser') and then enumerates the three primary modes - execute, resolve, suggest - plus the perception modes visibility/audibility. It explicitly separates itself from manage_world and manage_lore, so an agent can pick it out of a crowded 34-tool sibling list without opening the schema.

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?

Contains explicit 'Use when:' triggers (a player or narrator takes a physical action, needs a movement outcome without mutating, wants intent mapped to tools) and explicit 'Do NOT use when:' exclusions that name the correct alternatives (manage_world for model creation/editing, manage_lore for durable world facts). This is the when/when-not/alternatives pattern at full strength.

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

set_badgeSet Active BadgeA
Destructive

Switch the active badge to player, game_master, observer, or none (Editor), gating tool access server-side for the active Novel; always callable. The badge is per Novel and switching re-filters tools/list immediately, so a narrower badge can revoke tools mid-task and switching back restores them; badge changes are mutating session state, audited, and reversible by switching back. Use when: entering the story, spectating, or stepping away to edit. Do NOT use when: answering a pending workflow decision — use respond_decision.

NameRequiredDescriptionDefault
badgeYesThe badge to activate: player, game_master, observer, or none (Editor).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that access is gated server-side for the active Novel, that tools/list is re-filtered immediately, that a narrower badge can revoke tools mid-task, and that changes are audited and reversible. This meaningfully expands on destructiveHint=true, which alone would not tell an agent that the 'destruction' is revocable tool-access loss.

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?

Front-loads the core action and the value list, then layers usage and exclusion in tight labeled clauses; the density is high but nearly every clause carries operational information, though the single opening sentence is long.

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 scope, side effects, reversibility, auditability, timing of the tools/list re-filter, and an explicit exclusion; with an output schema present, no return-value explanation is needed. Nothing an agent needs to call it safely is missing.

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 100% and the enum is fully documented, so the baseline is 3; the description's only added nuance is the per-Novel scoping of the badge, which is about behavior rather than the parameter itself.

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?

States a precise verb+resource ("Switch the active badge") and enumerates the exact target values plus per-Novel scope, so it is unmistakable against siblings like manage_session or respond_decision.

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 "Use when: entering the story, spectating, or stepping away to edit" and an explicit exclusion routing pending workflow decisions to respond_decision -- a named alternative with the condition that selects it.

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

take_turnTake Play TurnA
Read-onlyIdempotent

Resolve a player intent through the parser and mint a turn handle for the story record. The turn is read-only and non-persistent: no Novel state is mutated; the handle is session-scoped, single-use, and consumed by manage_story (action: record), though recording without it still works. Use when: taking a turn before recording its outcome. Do NOT use when: resolving a specific combat round — use manage_combat (action: advance); rolling a ruleset check — use resolve_mechanic (action: roll).

NameRequiredDescriptionDefault
intentYesPlayer intent to resolve (take_turn).
entity_idNoActing entity id (take_turn).

Output Schema

NameRequiredDescription
textNoHuman-readable text envelope mirroring the structured result (REQ-001, REQ-548a).
statusYesMachine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).

TDQS

A4.4/5.0
Behavior4/5

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

Adds real value beyond the annotations: non-persistent, no Novel state mutated, handle is session-scoped and single-use, consumed by manage_story (action: record), and recording works even without it. Slight tension with idempotentHint=true, since each call mints a fresh single-use handle; the description does not reconcile repeated-call behavior, which keeps it from a 5.

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?

Front-loaded with the core action, then lifecycle, then use/don't-use routing — every clause carries distinct information. Slightly dense, with the handle-consumption detail packed mid-sentence, but no filler.

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?

For a 2-parameter tool with full schema coverage, an output schema, and complete annotations, the description supplies the missing pieces: persistence semantics, handle lifecycle, the downstream consumer, and graceful degradation if the handle is skipped. Nothing an agent needs to call it correctly is absent.

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 100%, so 'intent' and 'entity_id' are already documented; the description only adds the notion that intent is fed to the parser. Baseline 3 applies since the schema carries the parameter burden.

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?

States a specific verb chain and resource: resolve a player intent through the parser and mint a turn handle for the story record. It also explicitly distinguishes itself from manage_combat and resolve_mechanic, so an agent can route between them without opening any schema.

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?

Gives an explicit 'Use when: taking a turn before recording its outcome' plus two named 'Do NOT use when' cases with the exact alternative tool and action (manage_combat advance, resolve_mechanic roll). This is the strongest form of routing guidance.

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. 3 tool updatesv2026.10.16
    • Changedmanage_identity2 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"stage, accept, reject, list, snapshot, or bootstrap."New value: +"stage, accept, reject, revert, list, snapshot, or bootstrap."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "stage",
        -  "accept",
        -  "reject",
        -  "list",
        -  "snapshot",
        -  "bootstrap"
        -]New value: +[
        +  "stage",
        +  "accept",
        +  "reject",
        +  "revert",
        +  "list",
        +  "snapshot",
        +  "bootstrap"
        +]
    • Changedmanage_scene11 fields changed
      • removedInput schema / properties / after_user
        Removed value: -{
        -  "description": "Reset the pooled spoken-set for a new user turn (next_speaker).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / confirmation
        Removed value: -{
        -  "description": "Confirmation mode (autonomy).",
        -  "enum": [
        -    "auto",
        -    "confirm",
        -    "prompt"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / creativity
        Removed value: -{
        -  "description": "Creativity (autonomy).",
        -  "enum": [
        -    "predictable",
        -    "standard",
        -    "chaotic"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / entity_ids
        Removed value: -{
        -  "description": "Entities present (presence).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / force
        Removed value: -{
        -  "description": "NPC forced as the next speaker (cast/next_speaker).",
        -  "type": "string"
        -}
      • removedInput schema / properties / level
        Removed value: -{
        -  "description": "Autonomy level (autonomy).",
        -  "enum": [
        -    "full",
        -    "mechanical_prompt",
        -    "manual"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / mute
        Removed value: -{
        -  "description": "NPC muted from speaker selection (cast).",
        -  "type": "string"
        -}
      • removedInput schema / properties / safety
        Removed value: -{
        -  "description": "Safety tier (autonomy).",
        -  "enum": [
        -    "safe",
        -    "moderate",
        -    "hardcore"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / select
        Removed value: -{
        -  "description": "NPC selected as the manual speaker (cast/next_speaker).",
        -  "type": "string"
        -}
      • removedInput schema / properties / strategy
        Removed value: -{
        -  "description": "Speaker-selection strategy (cast).",
        -  "enum": [
        -    "manual",
        -    "natural",
        -    "list",
        -    "pooled"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / unmute
        Removed value: -{
        -  "description": "NPC restored to speaker selection (cast).",
        -  "type": "string"
        -}
    • Changedmanage_world10 fields changed
      • removedInput schema / properties / causal_domain
        Removed value: -{
        -  "description": "location or scalar (causal_propose; default location).",
        -  "enum": [
        -    "location",
        -    "scalar"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / causal_entity
        Removed value: -{
        -  "description": "Entity whose objective state is proposed (causal_propose).",
        -  "type": "string"
        -}
      • removedInput schema / properties / causal_expected_version
        Removed value: -{
        -  "description": "Optimistic version guard (causal_propose).",
        -  "type": "number"
        -}
      • removedInput schema / properties / causal_from
        Removed value: -{
        -  "description": "Expected prior value (causal_propose).",
        -  "type": [
        -    "string",
        -    "number",
        -    "boolean",
        -    "null"
        -  ]
        -}
      • removedInput schema / properties / causal_key
        Removed value: -{
        -  "description": "State key within the entity (causal_propose).",
        -  "type": "string"
        -}
      • removedInput schema / properties / causal_origin_source
        Removed value: -{
        -  "description": "narrative, machine, or ruleset (causal_propose).",
        -  "enum": [
        -    "narrative",
        -    "machine",
        -    "ruleset"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / causal_proposal_id
        Removed value: -{
        -  "description": "Recorded proposal id (causal_admit/causal_reject).",
        -  "type": "string"
        -}
      • removedInput schema / properties / causal_scope
        Removed value: -{
        -  "description": "Scope coordinate (causal_propose; default the active Novel slug).",
        -  "type": "string"
        -}
      • removedInput schema / properties / causal_source_ordinal
        Removed value: -{
        -  "description": "Contributing event-log ordinal (causal_propose; default the latest event).",
        -  "type": "number"
        -}
      • removedInput schema / properties / causal_value
        Removed value: -{
        -  "description": "Proposed value (causal_propose/causal_ingress).",
        -  "type": [
        -    "string",
        -    "number",
        -    "boolean",
        -    "null"
        -  ]
        -}
  2. 8 tool updatesv2026.10.15
    • Changedmanage_causality4 fields changed
      • removedInput schema / properties / causal_from / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / causal_from / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • removedInput schema / properties / causal_value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / causal_value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
    • Changedmanage_diagnostics2 fields changed
      • removedInput schema / properties / category / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / category / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedmanage_lore2 fields changed
      • removedInput schema / properties / group / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / group / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedmanage_ruleset2 fields changed
      • removedInput schema / properties / wisdom / items / properties / key / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / wisdom / items / properties / key / type
        Added value: +[
        +  "string",
        +  "number"
        +]
    • Changedmanage_scene2 fields changed
      • removedInput schema / properties / adventure_scene / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / adventure_scene / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedmanage_synthesis2 fields changed
      • removedInput schema / properties / key / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / key / type
        Added value: +[
        +  "string",
        +  "number"
        +]
    • Changedmanage_world4 fields changed
      • removedInput schema / properties / causal_from / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / causal_from / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
      • removedInput schema / properties / causal_value / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / causal_value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean",
        +  "null"
        +]
    • Changedresolve_mechanic2 fields changed
      • removedInput schema / properties / dice / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / dice / type
        Added value: +[
        +  "string",
        +  "number"
        +]
  3. 18 tool updatesv2026.10.13
    • Changedmanage_agent1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Return full agent tasks instead of summary entries (list).",
        +  "type": "boolean"
        +}
    • Changedmanage_archive14 fields changed
      • removedInput schema / properties / codex_adventure
        Removed value: -{
        -  "description": "Codex adventure to seed from (create).",
        -  "type": "string"
        -}
      • removedInput schema / properties / current_scene
        Removed value: -{
        -  "description": "Current-scene summary (save_context).",
        -  "type": "string"
        -}
      • removedInput schema / properties / description
        Removed value: -{
        -  "description": "Description (create/description).",
        -  "type": "string"
        -}
      • removedInput schema / properties / detail
        Removed value: -{
        -  "description": "Return full metadata (list).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / filter
        Removed value: -{
        -  "description": "active, archived, or all (list).",
        -  "enum": [
        -    "active",
        -    "archived",
        -    "all"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / genre
        Removed value: -{
        -  "description": "Genre tag (create/genre).",
        -  "type": "string"
        -}
      • removedInput schema / properties / immediate_situation
        Removed value: -{
        -  "description": "Immediate situation (save_context).",
        -  "type": "string"
        -}
      • removedInput schema / properties / long_term_plans
        Removed value: -{
        -  "description": "Long-term plans (save_context).",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Novel name (create).",
        -  "type": "string"
        -}
      • removedInput schema / properties / new_slug
        Removed value: -{
        -  "description": "New slug (rename).",
        -  "type": "string"
        -}
      • removedInput schema / properties / pending_player_action
        Removed value: -{
        -  "description": "Pending player action (save_context).",
        -  "type": "string"
        -}
      • removedInput schema / properties / player_goals
        Removed value: -{
        -  "description": "Player goals (save_context).",
        -  "type": "string"
        -}
      • removedInput schema / properties / ruleset
        Removed value: -{
        -  "description": "Ruleset slug (create).",
        -  "type": "string"
        -}
      • removedInput schema / properties / short_term_plans
        Removed value: -{
        -  "description": "Short-term plans (save_context).",
        -  "type": "string"
        -}
    • Changedmanage_belief9 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Belief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event."New value: +"Belief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event. Knowledge: knowledge_query."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "get",
        -  "evidence",
        -  "admit",
        -  "retract",
        -  "conflicts",
        -  "reconcile",
        -  "perception_record",
        -  "perception_list",
        -  "perception_for_entity",
        -  "perception_for_event"
        -]New value: +[
        +  "list",
        +  "get",
        +  "evidence",
        +  "admit",
        +  "retract",
        +  "conflicts",
        +  "reconcile",
        +  "knowledge_query",
        +  "perception_record",
        +  "perception_list",
        +  "perception_for_entity",
        +  "perception_for_event"
        +]
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Return full belief records instead of summary entries (list).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / perception_confidence
        Added value: +{
        +  "description": "0..1 confidence (perception_record; default 0; REQ-594).",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / perception_room_id
        Added value: +{
        +  "description": "Room identifier for the perception (perception_record; defaults to the entity's room).",
        +  "type": "string"
        +}
      • addedInput schema / properties / perception_sense
        Added value: +{
        +  "description": "Sense that produced the perception (perception_record; default null; REQ-594).",
        +  "enum": [
        +    "sight",
        +    "sound",
        +    "telling"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / perception_source_entity
        Added value: +{
        +  "description": "Entity the perception came from (perception_record; default null).",
        +  "type": "string"
        +}
      • addedInput schema / properties / perception_witness
        Added value: +{
        +  "description": "Witness kind (perception_record; default inferred; REQ-594).",
        +  "enum": [
        +    "saw",
        +    "heard",
        +    "inferred",
        +    "told"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / topic
        Added value: +{
        +  "description": "Optional topic filter applied to knowledge_query perceptions, beliefs, and secrets.",
        +  "type": "string"
        +}
    • Changedmanage_causality29 fields changed
      • removedInput schema / properties / climbable
        Removed value: -{
        -  "description": "When true the thing can be climbed (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / description
        Removed value: -{
        -  "description": "Optional description (create/update).",
        -  "type": "string"
        -}
      • removedInput schema / properties / direction
        Removed value: -{
        -  "description": "Direction (create_exit/remove_exit).",
        -  "type": "string"
        -}
      • removedInput schema / properties / drinkable
        Removed value: -{
        -  "description": "When true the thing can be drunk (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / edible
        Removed value: -{
        -  "description": "When true the thing can be eaten (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / enterable
        Removed value: -{
        -  "description": "When true the thing can be entered (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / fixed
        Removed value: -{
        -  "description": "When true the thing cannot be taken (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / from
        Removed value: -{
        -  "description": "Source room alias for room_a (create_exit).",
        -  "type": "string"
        -}
      • removedInput schema / properties / key
        Removed value: -{
        -  "description": "Bound key thing name required to unlock or lock this thing when lockable (create_thing/update_thing).",
        -  "type": "string"
        -}
      • removedInput schema / properties / kind
        Removed value: -{
        -  "description": "Optional thing kind (create_thing).",
        -  "type": "string"
        -}
      • removedInput schema / properties / lit
        Removed value: -{
        -  "description": "When true the thing is lit (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / location
        Removed value: -{
        -  "description": "Optional containing room or thing (create_thing/update_thing).",
        -  "type": "string"
        -}
      • removedInput schema / properties / location_type
        Removed value: -{
        -  "description": "Where the thing is placed (create_thing).",
        -  "enum": [
        -    "room",
        -    "container",
        -    "supporter"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / lockable
        Removed value: -{
        -  "description": "When true the thing can be locked (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / locked
        Removed value: -{
        -  "description": "When true the thing starts locked (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Room/thing name (create/update/remove).",
        -  "type": "string"
        -}
      • removedInput schema / properties / openable
        Removed value: -{
        -  "description": "When true the thing can be opened (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / read_text
        Removed value: -{
        -  "description": "Text revealed when the thing is read (create_thing/update_thing).",
        -  "type": "string"
        -}
      • removedInput schema / properties / readable
        Removed value: -{
        -  "description": "When true the thing can be read (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / room
        Removed value: -{
        -  "description": "Source room (create_exit/remove_exit).",
        -  "type": "string"
        -}
      • removedInput schema / properties / room_a
        Removed value: -{
        -  "description": "Source room (create_exit).",
        -  "type": "string"
        -}
      • removedInput schema / properties / room_b
        Removed value: -{
        -  "description": "Destination room (create_exit).",
        -  "type": "string"
        -}
      • removedInput schema / properties / seed
        Removed value: -{
        -  "description": "Deterministic seed (generate).",
        -  "type": "string"
        -}
      • removedInput schema / properties / source
        Removed value: -{
        -  "description": "Hybrid world-model source text (convert).",
        -  "type": "string"
        -}
      • removedInput schema / properties / switchable
        Removed value: -{
        -  "description": "When true the thing can be switched (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / switched_on
        Removed value: -{
        -  "description": "When true the thing is switched on (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / to
        Removed value: -{
        -  "description": "Destination room alias for room_b (create_exit).",
        -  "type": "string"
        -}
      • removedInput schema / properties / transparent
        Removed value: -{
        -  "description": "When true the thing is transparent (create_thing/update_thing).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / wearable
        Removed value: -{
        -  "description": "When true the thing can be worn (create_thing/update_thing).",
        -  "type": "boolean"
        -}
    • Changedmanage_corpus12 fields changed
      • removedInput schema / properties / badge_scope
        Removed value: -{
        -  "description": "game_master or shared (set/update).",
        -  "enum": [
        -    "game_master",
        -    "shared"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / content
        Removed value: -{
        -  "description": "Lore content (set/update).",
        -  "type": "string"
        -}
      • removedInput schema / properties / data
        Removed value: -{
        -  "description": "JSON or Markdown lorebook data (import).",
        -  "type": "string"
        -}
      • removedInput schema / properties / entity_id
        Removed value: -{
        -  "description": "Entity to reveal to / whose knowledge to read (reveal/knowledge).",
        -  "type": "string"
        -}
      • removedInput schema / properties / format
        Removed value: -{
        -  "description": "Optional output format (export).",
        -  "type": "string"
        -}
      • removedInput schema / properties / group
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Group name, or null to clear (set/update/group)."
        -}
      • removedInput schema / properties / key
        Removed value: -{
        -  "description": "Lore key (set/update/remove/toggle/group/get).",
        -  "type": "string"
        -}
      • removedInput schema / properties / mode
        Removed value: -{
        -  "description": "dry-run, merge, or replace (import).",
        -  "enum": [
        -    "dry-run",
        -    "merge",
        -    "replace"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / priority
        Removed value: -{
        -  "description": "Optional priority (set/update).",
        -  "type": "number"
        -}
      • removedInput schema / properties / sticky
        Removed value: -{
        -  "description": "Optional sticky weight (set/update).",
        -  "type": "number"
        -}
      • removedInput schema / properties / triggers
        Removed value: -{
        -  "description": "Optional recall triggers (set/update).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / world_target
        Removed value: -{
        -  "description": "Optional world-model target reference (set/set_secret).",
        -  "type": "string"
        -}
    • Changedmanage_countdown2 fields changed
      • changedInput schema / properties / ticks / minimum
        Previous value: -1New value: +0
      • addedInput schema / properties / total
        Added value: +{
        +  "description": "Optional capacity for decrement refills (set; defaults to ticks).",
        +  "minimum": 1,
        +  "type": "number"
        +}
    • Changedmanage_diagnostics8 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"health, compress, compact, subscribe, category, event, or history."New value: +"health, context_report, compress, compact, subscribe, category, event, history, verify, replay, visibility_check, or visibility_audit."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "health",
        -  "compress",
        -  "compact",
        -  "subscribe",
        -  "category",
        -  "event",
        -  "history"
        -]New value: +[
        +  "health",
        +  "context_report",
        +  "compress",
        +  "compact",
        +  "subscribe",
        +  "category",
        +  "event",
        +  "history",
        +  "verify",
        +  "replay",
        +  "visibility_check",
        +  "visibility_audit"
        +]
      • addedInput schema / properties / audience
        Added value: +{
        +  "description": "Audience badge for a visibility check (visibility_check; default the active badge).",
        +  "enum": [
        +    "player",
        +    "game_master",
        +    "observer",
        +    "none"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / budget_tokens
        Added value: +{
        +  "description": "Positive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610).",
        +  "type": "number"
        +}
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "discover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609).",
        +  "enum": [
        +    "summary",
        +    "schema"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / ordinals
        Added value: +{
        +  "description": "Exact event ordinals to return in order (history; REQ-591).",
        +  "items": {
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / tier
        Added value: +{
        +  "description": "Compression tier to assemble (recap; REQ-592).",
        +  "enum": [
        +    "recent",
        +    "session",
        +    "arc",
        +    "campaign"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / to_event
        Added value: +{
        +  "description": "Target event ordinal for replay inspection (replay; default the newest retained entry).",
        +  "type": "number"
        +}
    • Changedmanage_faction1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Return full faction records instead of summary entries (list).",
        +  "type": "boolean"
        +}
    • Changedmanage_lore14 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Lore: set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge. Corpus: corpus_register, corpus_list, corpus_get, corpus_route, corpus_grant, corpus_deny, corpus_access, corpus_consume, or corpus_acquisitions."New value: +"set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge."
      • removedInput schema / properties / corpus_access_domains
        Removed value: -{
        -  "description": "Knowledge domains granted access (corpus_register).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / corpus_access_public
        Removed value: -{
        -  "description": "Whether every entity may consume it (corpus_register; default false).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / corpus_body
        Removed value: -{
        -  "description": "Document reference text (corpus_register).",
        -  "type": "string"
        -}
      • removedInput schema / properties / corpus_denies
        Removed value: -{
        -  "description": "Entity ids explicitly denied access (corpus_register).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / corpus_document_id
        Removed value: -{
        -  "description": "Corpus document id (corpus_get/corpus_route/corpus_grant/corpus_deny/corpus_consume).",
        -  "type": "string"
        -}
      • removedInput schema / properties / corpus_domain
        Removed value: -{
        -  "description": "Knowledge domain (corpus_register/corpus_route/corpus_list).",
        -  "type": "string"
        -}
      • removedInput schema / properties / corpus_domains
        Removed value: -{
        -  "description": "Knowledge domains the entity may access (corpus_access).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / corpus_entity_id
        Removed value: -{
        -  "description": "Entity acquiring or inspected (corpus_consume/corpus_acquisitions/corpus_access/corpus_grant/corpus_deny).",
        -  "type": "string"
        -}
      • removedInput schema / properties / corpus_grants
        Removed value: -{
        -  "description": "Entity ids explicitly granted access (corpus_register).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / corpus_mode
        Removed value: -{
        -  "description": "read, research, taught, or import (corpus_consume; default read).",
        -  "enum": [
        -    "read",
        -    "research",
        -    "taught",
        -    "import"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / corpus_source_profile
        Removed value: -{
        -  "description": "Trusted source profile the domain is routed from (corpus_register; default manual).",
        -  "type": "string"
        -}
      • removedInput schema / properties / corpus_title
        Removed value: -{
        -  "description": "Document title (corpus_register).",
        -  "type": "string"
        -}
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Return full lore entries instead of summary entries (list).",
        +  "type": "boolean"
        +}
    • Changedmanage_note1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Return full server notes instead of summary entries (list_server).",
        +  "type": "boolean"
        +}
    • Changedmanage_npc12 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"create, update, remove, list, or get."New value: +"create, update, remove, list, get, import_card, or export_card."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create",
        -  "update",
        -  "remove",
        -  "list",
        -  "get"
        -]New value: +[
        +  "create",
        +  "update",
        +  "remove",
        +  "list",
        +  "get",
        +  "import_card",
        +  "export_card"
        +]
      • addedInput schema / properties / card
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  ],
        +  "description": "Character Card V3 JSON object or string (import_card)."
        +}
      • addedInput schema / properties / confirm_lore
        Added value: +{
        +  "description": "Import the card's character_book as lore entries (import_card).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Return full NPC records instead of summary entries (list).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / license
        Added value: +{
        +  "description": "Import license attestation (import_card).",
        +  "type": "string"
        +}
      • addedInput schema / properties / mind / properties / identity_core
        Added value: +{
        +  "description": "Stable values, bonds, and taboos (GM only).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / mind / properties / shared_notes
        Added value: +{
        +  "description": "Always-known facts (GM only).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / npc_id / description
        Previous value: -"NPC identifier (update/remove/get)."New value: +"NPC identifier (update/remove/get/export_card)."
      • addedInput schema / properties / persona
        Added value: +{
        +  "description": "Optional values, traits, and mannerisms (create/update).",
        +  "type": "string"
        +}
      • addedInput schema / properties / source
        Added value: +{
        +  "description": "Import provenance URL or description (import_card).",
        +  "type": "string"
        +}
      • addedInput schema / properties / talkativeness
        Added value: +{
        +  "description": "Optional 0-100 social-scene speaking weight; default 50 (create/update).",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedmanage_ruleset3 fields changed
      • addedInput schema / properties / wisdom / items / properties / quoted_excerpt
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / wisdom / items / properties / source_snapshot
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / wisdom / items / properties / source_url
        Added value: +{
        +  "type": "string"
        +}
    • Changedmanage_scene6 fields changed
      • addedInput schema / properties / after_user
        Added value: +{
        +  "description": "Reset the pooled spoken-set for a new user turn (next_speaker).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "NPC forced as the next speaker (cast/next_speaker).",
        +  "type": "string"
        +}
      • addedInput schema / properties / mute
        Added value: +{
        +  "description": "NPC muted from speaker selection (cast).",
        +  "type": "string"
        +}
      • addedInput schema / properties / select
        Added value: +{
        +  "description": "NPC selected as the manual speaker (cast/next_speaker).",
        +  "type": "string"
        +}
      • addedInput schema / properties / strategy
        Added value: +{
        +  "description": "Speaker-selection strategy (cast).",
        +  "enum": [
        +    "manual",
        +    "natural",
        +    "list",
        +    "pooled"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / unmute
        Added value: +{
        +  "description": "NPC restored to speaker selection (cast).",
        +  "type": "string"
        +}
    • Changedmanage_session14 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"recap, verbosity, briefing_order, compress (non-mutating audit summary prompt), compact (GM-only irreversible audit-log compaction), health, subscribe, discover (list/search tools), category (reassign a tool's category), event (append an observation), or history (read the event log)."New value: +"recap, verbosity, briefing_order, compress (non-mutating audit summary prompt), compact (GM-only irreversible audit-log compaction), health, context_report (per-section token ledger), subscribe, discover (list/search tools), category (reassign a tool's category), event (append an observation), history (read the event log), verify (compare live state to recorded hashes), replay (read-only event-log inspection), visibility_check (scan a draft for GM-only disclosure), or visibility_audit (recent visibility decisions)."
      • addedInput schema / properties / budget_tokens
        Added value: +{
        +  "description": "Positive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610).",
        +  "type": "number"
        +}
      • removedInput schema / properties / category
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "New category label, or null/empty to restore the default (category)."
        -}
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "discover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609).",
        +  "enum": [
        +    "summary",
        +    "schema"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / include_superseded
        Removed value: -{
        -  "description": "Include superseded events (history; default true).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / max_entries
        Removed value: -{
        -  "description": "Positive integer; returns a non-mutating summarize prompt over the most recent entries (compress).",
        -  "type": "number"
        -}
      • removedInput schema / properties / sessions
        Removed value: -{
        -  "description": "Number of recent sessions to retain live; triggers irreversible compaction (compact; default TTRPG_AUDIT_RETENTION_SESSIONS).",
        -  "type": "number"
        -}
      • removedInput schema / properties / source
        Removed value: -{
        -  "description": "Event source classification (event).",
        -  "enum": [
        -    "player",
        -    "game_master",
        -    "system",
        -    "machine"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / supersede
        Removed value: -{
        -  "description": "Ordinal of an event this observation replaces (event).",
        -  "type": "number"
        -}
      • removedInput schema / properties / text
        Removed value: -{
        -  "description": "Observation text (event).",
        -  "type": "string"
        -}
      • removedInput schema / properties / through_ordinal
        Removed value: -{
        -  "description": "Return events up to and including this ordinal (history).",
        -  "type": "number"
        -}
      • addedInput schema / properties / tier
        Added value: +{
        +  "description": "Compression tier to assemble (recap; REQ-592).",
        +  "enum": [
        +    "recent",
        +    "session",
        +    "arc",
        +    "campaign"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / tool_name
        Removed value: -{
        -  "description": "Registered tool name to reassign (category).",
        -  "type": "string"
        -}
      • removedInput schema / properties / topics
        Removed value: -{
        -  "description": "Notification topics to subscribe to (subscribe).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
    • Changedmanage_staging25 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"presence, autonomy."New value: +"presence, autonomy, cast, or next_speaker."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "presence",
        -  "autonomy"
        -]New value: +[
        +  "presence",
        +  "autonomy",
        +  "cast",
        +  "next_speaker"
        +]
      • removedInput schema / properties / adventure_scene
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Adventure-scene waypoint anchor; empty or null clears (set)."
        -}
      • addedInput schema / properties / after_user
        Added value: +{
        +  "description": "Reset the pooled spoken-set for a new user turn (next_speaker).",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / allow_freeform
        Removed value: -{
        -  "description": "Allow free-form response (choices).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / atmosphere
        Removed value: -{
        -  "description": "Atmosphere (set).",
        -  "type": "string"
        -}
      • removedInput schema / properties / beat
        Removed value: -{
        -  "description": "Story-beat tag (set): setup, escalation, turning_point, climax, resolution, denouement.",
        -  "enum": [
        -    "setup",
        -    "escalation",
        -    "turning_point",
        -    "climax",
        -    "resolution",
        -    "denouement"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / choices
        Removed value: -{
        -  "description": "List of choices (choices).",
        -  "items": {
        -    "properties": {
        -      "description": {
        -        "type": "string"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "label": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "label"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / context
        Removed value: -{
        -  "additionalProperties": {},
        -  "description": "Context for the choice (choices).",
        -  "propertyNames": {
        -    "type": "string"
        -  },
        -  "type": "object"
        -}
      • removedInput schema / properties / description
        Removed value: -{
        -  "description": "Scene description (set).",
        -  "type": "string"
        -}
      • removedInput schema / properties / directive
        Removed value: -{
        -  "description": "Narrative directive (directive).",
        -  "type": "string"
        -}
      • removedInput schema / properties / fast_forward
        Removed value: -{
        -  "description": "Narrative fast-forward (set).",
        -  "properties": {
        -    "changes": {
        -      "description": "NPC changes during the skip.",
        -      "items": {
        -        "properties": {
        -          "condition": {
        -            "type": "string"
        -          },
        -          "disposition": {
        -            "type": "string"
        -          },
        -          "location": {
        -            "type": "string"
        -          },
        -          "npc_id": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "npc_id"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "interval": {
        -      "description": "The time interval to skip.",
        -      "type": "string"
        -    },
        -    "skip_countdowns": {
        -      "description": "Do not advance countdowns during the skip.",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "interval"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "NPC forced as the next speaker (cast/next_speaker).",
        +  "type": "string"
        +}
      • removedInput schema / properties / likelihood
        Removed value: -{
        -  "description": "Likelihood tier (oracle).",
        -  "enum": [
        -    "almost_certain",
        -    "likely",
        -    "50_50",
        -    "unlikely",
        -    "small_chance"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / location
        Removed value: -{
        -  "description": "Scene location (set).",
        -  "type": "string"
        -}
      • addedInput schema / properties / mute
        Added value: +{
        +  "description": "NPC muted from speaker selection (cast).",
        +  "type": "string"
        +}
      • removedInput schema / properties / prompt
        Removed value: -{
        -  "description": "Choice prompt (choices).",
        -  "type": "string"
        -}
      • removedInput schema / properties / question
        Removed value: -{
        -  "description": "Question to resolve (oracle).",
        -  "type": "string"
        -}
      • removedInput schema / properties / scene_type
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "enum": [
        -        "combat",
        -        "social",
        -        "exploration",
        -        "neutral"
        -      ],
        -      "type": "string"
        -    },
        -    {
        -      "items": {
        -        "enum": [
        -          "combat",
        -          "social",
        -          "exploration",
        -          "neutral"
        -        ],
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  ],
        -  "description": "Scene-type tag or array (set)."
        -}
      • removedInput schema / properties / seed
        Removed value: -{
        -  "description": "Deterministic seed (oracle).",
        -  "type": "string"
        -}
      • addedInput schema / properties / select
        Added value: +{
        +  "description": "NPC selected as the manual speaker (cast/next_speaker).",
        +  "type": "string"
        +}
      • removedInput schema / properties / skip_transition_hook
        Removed value: -{
        -  "description": "Skip the scene-transition hook (set).",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / strategy
        Added value: +{
        +  "description": "Speaker-selection strategy (cast).",
        +  "enum": [
        +    "manual",
        +    "natural",
        +    "list",
        +    "pooled"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / time_of_day
        Removed value: -{
        -  "description": "Time of day (set).",
        -  "type": "string"
        -}
      • addedInput schema / properties / unmute
        Added value: +{
        +  "description": "NPC restored to speaker selection (cast).",
        +  "type": "string"
        +}
    • Changedmanage_synthesis9 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"run, revert, list, activate, deactivate, toggle, toggle_action, player_add, player_remove, or player_list."New value: +"run, revert, list, activate, deactivate, toggle, toggle_action, player_add, player_remove, player_list, verify, record_ruling, revert_ruling, or ruling_list."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "run",
        -  "revert",
        -  "list",
        -  "activate",
        -  "deactivate",
        -  "toggle",
        -  "toggle_action",
        -  "player_add",
        -  "player_remove",
        -  "player_list"
        -]New value: +[
        +  "run",
        +  "revert",
        +  "list",
        +  "activate",
        +  "deactivate",
        +  "toggle",
        +  "toggle_action",
        +  "player_add",
        +  "player_remove",
        +  "player_list",
        +  "verify",
        +  "record_ruling",
        +  "revert_ruling",
        +  "ruling_list"
        +]
      • addedInput schema / properties / include_reverted
        Added value: +{
        +  "description": "Include reverted rulings (ruling_list; default false).",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / key / description
        Previous value: -"Item key (activate: number; player_add/player_remove: string)."New value: +"Item key (activate: number; player_add/player_remove/verify/record_ruling: string)."
      • addedInput schema / properties / max_entries
        Added value: +{
        +  "description": "Maximum rulings to return, newest first (ruling_list; default 20).",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedInput schema / properties / module / description
        Previous value: -"Synthesis module (activate/deactivate/toggle/player_*/list)."New value: +"Synthesis module (activate/deactivate/toggle/player_*/list/verify/record_ruling)."
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Question the ruling answers (record_ruling).",
        +  "type": "string"
        +}
      • addedInput schema / properties / ruling
        Added value: +{
        +  "description": "Ruling text to record (record_ruling).",
        +  "type": "string"
        +}
      • addedInput schema / properties / ruling_id
        Added value: +{
        +  "description": "Ledger entry id (revert_ruling).",
        +  "type": "string"
        +}
    • Changedmanage_world3 fields changed
      • addedInput schema / properties / noise
        Added value: +{
        +  "description": "Auditory cue text reported by listen (create_thing/update_thing).",
        +  "type": "string"
        +}
      • addedInput schema / properties / options
        Added value: +{
        +  "description": "Generation options (generate): roles maps installed table names to room, objects, persons, or hazards pools; rooms requests a count bounded by TTRPG_WORLD_GEN_MAX_ROOMS.",
        +  "properties": {
        +    "roles": {
        +      "properties": {
        +        "hazards": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "objects": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "persons": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "room": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "rooms": {
        +      "exclusiveMinimum": 0,
        +      "maximum": 9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / scent
        Added value: +{
        +  "description": "Olfactory cue text reported by smell (create_thing/update_thing).",
        +  "type": "string"
        +}
    • Changedrun_command4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"execute (parser), resolve (non-mutating intent), or suggest (intent → tool calls). Defaults to execute."New value: +"execute (parser), resolve (non-mutating intent), suggest (intent → tool calls), visibility (can one actor see another or a thing), or audibility (can one actor hear another). Defaults to execute."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "execute",
        -  "resolve",
        -  "suggest"
        -]New value: +[
        +  "execute",
        +  "resolve",
        +  "suggest",
        +  "visibility",
        +  "audibility"
        +]
      • addedInput schema / properties / source
        Added value: +{
        +  "description": "Observing actor for visibility/audibility (defaults to the active entity).",
        +  "type": "string"
        +}
      • addedInput schema / properties / target
        Added value: +{
        +  "description": "Actor or thing being seen or heard (visibility/audibility).",
        +  "type": "string"
        +}
  4. 19 tool updates
    • Addedclose_session
    • Addedmanage_archive
    • Addedmanage_causality
    • Addedmanage_corpus
    • Addedmanage_diagnostics
    • Changedmanage_lore1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "set",
        -  "update",
        -  "remove",
        -  "toggle",
        -  "group",
        -  "suggest",
        -  "list",
        -  "get",
        -  "export",
        -  "import",
        -  "set_secret",
        -  "reveal",
        -  "secret_list",
        -  "knowledge",
        -  "corpus_register",
        -  "corpus_list",
        -  "corpus_get",
        -  "corpus_route",
        -  "corpus_grant",
        -  "corpus_deny",
        -  "corpus_access",
        -  "corpus_consume",
        -  "corpus_acquisitions"
        -]New value: +[
        +  "set",
        +  "update",
        +  "remove",
        +  "toggle",
        +  "group",
        +  "suggest",
        +  "list",
        +  "get",
        +  "export",
        +  "import",
        +  "set_secret",
        +  "reveal",
        +  "secret_list",
        +  "knowledge"
        +]
    • Changedmanage_novel1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create",
        -  "resume",
        -  "switch",
        -  "end",
        -  "export",
        -  "import",
        -  "rename",
        -  "description",
        -  "list",
        -  "archive",
        -  "unarchive",
        -  "info",
        -  "genre",
        -  "complete_session_zero",
        -  "clone",
        -  "branch",
        -  "save_context",
        -  "get_context",
        -  "checkpoint_set",
        -  "checkpoint_list",
        -  "checkpoint_restore",
        -  "checkpoint_remove"
        -]New value: +[
        +  "create",
        +  "resume",
        +  "switch",
        +  "end",
        +  "rename",
        +  "description",
        +  "list",
        +  "info",
        +  "genre",
        +  "complete_session_zero",
        +  "save_context",
        +  "get_context"
        +]
    • Changedmanage_ruleset2 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"search, install, remove, list, bind, roll, import_supplementary, or remove_supplementary."New value: +"search, install, remove, list, bind, import_supplementary, or remove_supplementary."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "search",
        -  "install",
        -  "remove",
        -  "list",
        -  "bind",
        -  "roll",
        -  "import_supplementary",
        -  "remove_supplementary"
        -]New value: +[
        +  "search",
        +  "install",
        +  "remove",
        +  "list",
        +  "bind",
        +  "import_supplementary",
        +  "remove_supplementary"
        +]
    • Changedmanage_scene1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "set",
        -  "directive",
        -  "presence",
        -  "autonomy",
        -  "choices",
        -  "oracle"
        -]New value: +[
        +  "set",
        +  "directive",
        +  "choices",
        +  "oracle"
        +]
    • Changedmanage_session1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "recap",
        -  "verbosity",
        -  "briefing_order",
        -  "compress",
        -  "compact",
        -  "health",
        -  "subscribe",
        -  "discover",
        -  "category",
        -  "event",
        -  "history"
        -]New value: +[
        +  "recap",
        +  "verbosity",
        +  "briefing_order",
        +  "discover"
        +]
    • Addedmanage_staging
    • Changedmanage_story1 field changed
      • addedInput schema / properties / turn_handle
        Added value: +{
        +  "description": "Turn handle minted by take_turn (record); consumed on success.",
        +  "type": "string"
        +}
    • Changedmanage_world1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create_room",
        -  "update_room",
        -  "remove_room",
        -  "create_thing",
        -  "update_thing",
        -  "remove_thing",
        -  "create_exit",
        -  "remove_exit",
        -  "convert",
        -  "generate",
        -  "causal_propose",
        -  "causal_admit",
        -  "causal_reject",
        -  "causal_list",
        -  "causal_state",
        -  "causal_ingress"
        -]New value: +[
        +  "create_room",
        +  "update_room",
        +  "remove_room",
        +  "create_thing",
        +  "update_thing",
        +  "remove_thing",
        +  "create_exit",
        +  "remove_exit",
        +  "convert",
        +  "generate"
        +]
    • Addedopen_session
    • Removedresolve_fate
    • Removedresolve_forged
    • Removedresolve_ironsworn
    • Addedresolve_mechanic
    • Addedtake_turn
  5. 1 tool updatev2026.10.12
    • Changedmanage_novel2 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"create, resume, switch, end, export, import, rename, description, list, archive, unarchive, info, genre, clone, branch, save_context, get_context, checkpoint_set, checkpoint_list, checkpoint_restore, or checkpoint_remove."New value: +"create, resume, switch, end, export, import, rename, description, list, archive, unarchive, info, genre, complete_session_zero, clone, branch, save_context, get_context, checkpoint_set, checkpoint_list, checkpoint_restore, or checkpoint_remove."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create",
        -  "resume",
        -  "switch",
        -  "end",
        -  "export",
        -  "import",
        -  "rename",
        -  "description",
        -  "list",
        -  "archive",
        -  "unarchive",
        -  "info",
        -  "genre",
        -  "clone",
        -  "branch",
        -  "save_context",
        -  "get_context",
        -  "checkpoint_set",
        -  "checkpoint_list",
        -  "checkpoint_restore",
        -  "checkpoint_remove"
        -]New value: +[
        +  "create",
        +  "resume",
        +  "switch",
        +  "end",
        +  "export",
        +  "import",
        +  "rename",
        +  "description",
        +  "list",
        +  "archive",
        +  "unarchive",
        +  "info",
        +  "genre",
        +  "complete_session_zero",
        +  "clone",
        +  "branch",
        +  "save_context",
        +  "get_context",
        +  "checkpoint_set",
        +  "checkpoint_list",
        +  "checkpoint_restore",
        +  "checkpoint_remove"
        +]
  6. 8 tool updatesv1.0.5
    • Changedmanage_belief6 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"list, get, evidence, admit, retract, conflicts, or reconcile."New value: +"Belief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "get",
        -  "evidence",
        -  "admit",
        -  "retract",
        -  "conflicts",
        -  "reconcile"
        -]New value: +[
        +  "list",
        +  "get",
        +  "evidence",
        +  "admit",
        +  "retract",
        +  "conflicts",
        +  "reconcile",
        +  "perception_record",
        +  "perception_list",
        +  "perception_for_entity",
        +  "perception_for_event"
        +]
      • addedInput schema / properties / perception_entity_id
        Added value: +{
        +  "description": "Entity that perceived (perception_record/perception_for_entity).",
        +  "type": "string"
        +}
      • addedInput schema / properties / perception_event_ordinal
        Added value: +{
        +  "description": "Contributing event-log ordinal (perception_record/perception_for_event; defaults to the latest event).",
        +  "type": "number"
        +}
      • addedInput schema / properties / perception_kind
        Added value: +{
        +  "description": "message, scene, or observation (perception_record; default observation).",
        +  "enum": [
        +    "message",
        +    "scene",
        +    "observation"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / perception_summary
        Added value: +{
        +  "description": "What was perceived (perception_record).",
        +  "type": "string"
        +}
    • Removedmanage_causal
    • Changedmanage_character4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"create, stage, import, sheet, set_active, personality, voice, signal, remove, roster_remove, or roster_list."New value: +"create, stage, import, sheet, set_active, personality, voice, signal, update, remove, roster_remove, or roster_list."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create",
        -  "stage",
        -  "import",
        -  "sheet",
        -  "set_active",
        -  "personality",
        -  "voice",
        -  "signal",
        -  "remove",
        -  "roster_remove",
        -  "roster_list"
        -]New value: +[
        +  "create",
        +  "stage",
        +  "import",
        +  "sheet",
        +  "set_active",
        +  "personality",
        +  "voice",
        +  "signal",
        +  "update",
        +  "remove",
        +  "roster_remove",
        +  "roster_list"
        +]
      • addedInput schema / properties / inventory
        Added value: +{
        +  "description": "Replace the entity's inventory (update).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / stats
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Mechanical stat keys to shallow-merge into the entity's stats (update).",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedmanage_codex3 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Entry content (for set)."New value: +"Entry content (for set); when omitted on an existing entry, the stored content is preserved."
      • addedInput schema / properties / merge
        Added value: +{
        +  "description": "For set: when true and the entry exists, shallow-merge the provided content into the stored content instead of replacing it.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / visibility
        Removed value: -{
        -  "description": "library, shared, or private (for set).",
        -  "enum": [
        -    "library",
        -    "shared",
        -    "private"
        -  ],
        -  "type": "string"
        -}
    • Removedmanage_corpus
    • Changedmanage_lore14 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge."New value: +"Lore: set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge. Corpus: corpus_register, corpus_list, corpus_get, corpus_route, corpus_grant, corpus_deny, corpus_access, corpus_consume, or corpus_acquisitions."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "set",
        -  "update",
        -  "remove",
        -  "toggle",
        -  "group",
        -  "suggest",
        -  "list",
        -  "get",
        -  "export",
        -  "import",
        -  "set_secret",
        -  "reveal",
        -  "secret_list",
        -  "knowledge"
        -]New value: +[
        +  "set",
        +  "update",
        +  "remove",
        +  "toggle",
        +  "group",
        +  "suggest",
        +  "list",
        +  "get",
        +  "export",
        +  "import",
        +  "set_secret",
        +  "reveal",
        +  "secret_list",
        +  "knowledge",
        +  "corpus_register",
        +  "corpus_list",
        +  "corpus_get",
        +  "corpus_route",
        +  "corpus_grant",
        +  "corpus_deny",
        +  "corpus_access",
        +  "corpus_consume",
        +  "corpus_acquisitions"
        +]
      • addedInput schema / properties / corpus_access_domains
        Added value: +{
        +  "description": "Knowledge domains granted access (corpus_register).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / corpus_access_public
        Added value: +{
        +  "description": "Whether every entity may consume it (corpus_register; default false).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / corpus_body
        Added value: +{
        +  "description": "Document reference text (corpus_register).",
        +  "type": "string"
        +}
      • addedInput schema / properties / corpus_denies
        Added value: +{
        +  "description": "Entity ids explicitly denied access (corpus_register).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / corpus_document_id
        Added value: +{
        +  "description": "Corpus document id (corpus_get/corpus_route/corpus_grant/corpus_deny/corpus_consume).",
        +  "type": "string"
        +}
      • addedInput schema / properties / corpus_domain
        Added value: +{
        +  "description": "Knowledge domain (corpus_register/corpus_route/corpus_list).",
        +  "type": "string"
        +}
      • addedInput schema / properties / corpus_domains
        Added value: +{
        +  "description": "Knowledge domains the entity may access (corpus_access).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / corpus_entity_id
        Added value: +{
        +  "description": "Entity acquiring or inspected (corpus_consume/corpus_acquisitions/corpus_access/corpus_grant/corpus_deny).",
        +  "type": "string"
        +}
      • addedInput schema / properties / corpus_grants
        Added value: +{
        +  "description": "Entity ids explicitly granted access (corpus_register).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / corpus_mode
        Added value: +{
        +  "description": "read, research, taught, or import (corpus_consume; default read).",
        +  "enum": [
        +    "read",
        +    "research",
        +    "taught",
        +    "import"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / corpus_source_profile
        Added value: +{
        +  "description": "Trusted source profile the domain is routed from (corpus_register; default manual).",
        +  "type": "string"
        +}
      • addedInput schema / properties / corpus_title
        Added value: +{
        +  "description": "Document title (corpus_register).",
        +  "type": "string"
        +}
    • Removedmanage_perception
    • Changedmanage_world12 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate."New value: +"World: create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate. Causal: causal_propose, causal_admit, causal_reject, causal_list, causal_state, or causal_ingress."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create_room",
        -  "update_room",
        -  "remove_room",
        -  "create_thing",
        -  "update_thing",
        -  "remove_thing",
        -  "create_exit",
        -  "remove_exit",
        -  "convert",
        -  "generate"
        -]New value: +[
        +  "create_room",
        +  "update_room",
        +  "remove_room",
        +  "create_thing",
        +  "update_thing",
        +  "remove_thing",
        +  "create_exit",
        +  "remove_exit",
        +  "convert",
        +  "generate",
        +  "causal_propose",
        +  "causal_admit",
        +  "causal_reject",
        +  "causal_list",
        +  "causal_state",
        +  "causal_ingress"
        +]
      • addedInput schema / properties / causal_domain
        Added value: +{
        +  "description": "location or scalar (causal_propose; default location).",
        +  "enum": [
        +    "location",
        +    "scalar"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / causal_entity
        Added value: +{
        +  "description": "Entity whose objective state is proposed (causal_propose).",
        +  "type": "string"
        +}
      • addedInput schema / properties / causal_expected_version
        Added value: +{
        +  "description": "Optimistic version guard (causal_propose).",
        +  "type": "number"
        +}
      • addedInput schema / properties / causal_from
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Expected prior value (causal_propose)."
        +}
      • addedInput schema / properties / causal_key
        Added value: +{
        +  "description": "State key within the entity (causal_propose).",
        +  "type": "string"
        +}
      • addedInput schema / properties / causal_origin_source
        Added value: +{
        +  "description": "narrative, machine, or ruleset (causal_propose).",
        +  "enum": [
        +    "narrative",
        +    "machine",
        +    "ruleset"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / causal_proposal_id
        Added value: +{
        +  "description": "Recorded proposal id (causal_admit/causal_reject).",
        +  "type": "string"
        +}
      • addedInput schema / properties / causal_scope
        Added value: +{
        +  "description": "Scope coordinate (causal_propose; default the active Novel slug).",
        +  "type": "string"
        +}
      • addedInput schema / properties / causal_source_ordinal
        Added value: +{
        +  "description": "Contributing event-log ordinal (causal_propose; default the latest event).",
        +  "type": "number"
        +}
      • addedInput schema / properties / causal_value
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Proposed value (causal_propose/causal_ingress)."
        +}
  7. 5 tool updatesv1.0.4
    • Removedmanage_graph
    • Removedmanage_index
    • Addedmanage_knowledge
    • Changedmanage_scene1 field changed
      • changedInput schema / properties / beat / description
        Previous value: -"Story-beat tag (set)."New value: +"Story-beat tag (set): setup, escalation, turning_point, climax, resolution, denouement."
    • Changedmanage_world3 fields changed
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Source room alias for room_a (create_exit).",
        +  "type": "string"
        +}
      • addedInput schema / properties / key
        Added value: +{
        +  "description": "Bound key thing name required to unlock or lock this thing when lockable (create_thing/update_thing).",
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Destination room alias for room_b (create_exit).",
        +  "type": "string"
        +}
  8. 61 tool updatesv1.0.3
    • Removedadventure
    • Removedcharacter
    • Removedcodex
    • Removedcombat
    • Removedcommand
    • Removedcondition
    • Removedcountdown
    • Removedfaction
    • Removedfate
    • Removedforged
    • Removedhelp
    • Removedironsworn
    • Removedlore
    • Addedmanage_adventure
    • Addedmanage_agent
    • Addedmanage_belief
    • Addedmanage_causal
    • Addedmanage_character
    • Addedmanage_codex
    • Addedmanage_combat
    • Addedmanage_condition
    • Addedmanage_corpus
    • Addedmanage_countdown
    • Addedmanage_faction
    • Addedmanage_graph
    • Addedmanage_history
    • Addedmanage_identity
    • Addedmanage_index
    • Addedmanage_lore
    • Addedmanage_note
    • Addedmanage_novel
    • Addedmanage_npc
    • Addedmanage_perception
    • Addedmanage_relationship
    • Addedmanage_ruleset
    • Addedmanage_scene
    • Addedmanage_session
    • Addedmanage_story
    • Addedmanage_synthesis
    • Addedmanage_vow
    • Addedmanage_world
    • Removednote
    • Removednovel
    • Removednpc
    • Removedredo
    • Removedrelationship
    • Addedresolve_fate
    • Addedresolve_forged
    • Addedresolve_ironsworn
    • Removedrespond
    • Addedrespond_decision
    • Removedruleset
    • Addedrun_command
    • Removedscene
    • Removedsession
    • Changedset_badge1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "status": {
        +      "description": "Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Removedstory
    • Removedsynthesis
    • Removedundo
    • Removedvow
    • Removedworld
  9. 6 tool updatesv1.0.2
    • Addedfate
    • Addedforged
    • Addedironsworn
    • Changednpc1 field changed
      • addedInput schema / properties / mind
        Added value: +{
        +  "description": "Optional GM-only NPC mind (create/update).",
        +  "properties": {
        +    "auto_play": {
        +      "description": "When true, the narrator plays this NPC from the directive on initiative.",
        +      "type": "boolean"
        +    },
        +    "directive": {
        +      "description": "Narrator-facing directive describing how to play this NPC (GM only).",
        +      "type": "string"
        +    },
        +    "private_journal": {
        +      "description": "Private journal entries (GM only).",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedsession4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"recap, verbosity, briefing_order, compress, or health."New value: +"recap, verbosity, briefing_order, compress, health, or subscribe."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "recap",
        -  "verbosity",
        -  "briefing_order",
        -  "compress",
        -  "health"
        -]New value: +[
        +  "recap",
        +  "verbosity",
        +  "briefing_order",
        +  "compress",
        +  "health",
        +  "subscribe"
        +]
      • addedInput schema / properties / gm_notes
        Added value: +{
        +  "description": "GM-only free-text notes returned only to the Game Master badge (recap).",
        +  "type": "string"
        +}
      • addedInput schema / properties / topics
        Added value: +{
        +  "description": "Notification topics to subscribe to (subscribe).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedworld3 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, or convert."New value: +"create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create_room",
        -  "update_room",
        -  "remove_room",
        -  "create_thing",
        -  "update_thing",
        -  "remove_thing",
        -  "create_exit",
        -  "remove_exit",
        -  "convert"
        -]New value: +[
        +  "create_room",
        +  "update_room",
        +  "remove_room",
        +  "create_thing",
        +  "update_thing",
        +  "remove_thing",
        +  "create_exit",
        +  "remove_exit",
        +  "convert",
        +  "generate"
        +]
      • addedInput schema / properties / seed
        Added value: +{
        +  "description": "Deterministic seed (generate).",
        +  "type": "string"
        +}
  10. 142 tool updates
    • Removedactivate_synthesis_item
    • Removedadd_combat_participant
    • Removedadvance_combat
    • Removedadvance_countdown
    • Addedadventure
    • Removedapply_condition
    • Removedarchive_novel
    • Removedask_oracle
    • Removedbind_novel_ruleset
    • Addedcharacter
    • Removedcharacter_sheet
    • Removedclone_novel
    • Addedcodex
    • Removedcodex_capture
    • Removedcodex_import
    • Removedcodex_list
    • Removedcodex_set
    • Addedcombat
    • Changedcommand5 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "description": "execute (parser), resolve (non-mutating intent), or suggest (intent → tool calls). Defaults to execute.",
        +  "enum": [
        +    "execute",
        +    "resolve",
        +    "suggest"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / command / description
        Previous value: -"The natural-language command, e.g. 'go north', 'look', 'take torch', 'open door'."New value: +"The natural-language command (execute)."
      • addedInput schema / properties / entity_id
        Added value: +{
        +  "description": "Optional entity context (suggest).",
        +  "type": "string"
        +}
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "The intent to resolve or map (resolve/suggest).",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "command"
        -]
    • Removedcompact_audit_log
    • Removedcompress_audit
    • Addedcondition
    • Removedconvert_source
    • Addedcountdown
    • Removedcreate_character
    • Removedcreate_exit
    • Removedcreate_faction
    • Removedcreate_novel
    • Removedcreate_npc
    • Removedcreate_room
    • Removedcreate_thing
    • Removeddeactivate_synthesis_item
    • Removedend_combat
    • Removedend_novel
    • Removedexport_lorebook
    • Removedexport_novel
    • Addedfaction
    • Removedforsake_vow
    • Removedgenerate_adventure
    • Removedgenerate_encounter
    • Removedget_knowledge
    • Removedget_pause_context
    • Removedget_relationships
    • Changedhelp3 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "description": "list (default) or category (reassign a tool's category).",
        +  "enum": [
        +    "list",
        +    "category"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / category
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "New category label, or null/empty to restore default (category)."
        +}
      • addedInput schema / properties / tool_name
        Added value: +{
        +  "description": "Registered tool name to reassign (category).",
        +  "type": "string"
        +}
    • Removedimport_character
    • Removedimport_lorebook
    • Removedimport_novel
    • Removedinit_combat
    • Removedinstall_ruleset
    • Removedlist_adventures
    • Removedlist_checkpoints
    • Removedlist_notes
    • Removedlist_novels
    • Removedlist_roster_characters
    • Removedlist_rulesets
    • Removedlist_server_notes
    • Removedlist_stories
    • Removedlist_synthesis_items
    • Removedload_adventure
    • Addedlore
    • Removedmark_milestone
    • Addednote
    • Addednovel
    • Removednovel_info
    • Addednpc
    • Removedplayer_list_synthesis
    • Removedplayer_remove_synthesis
    • Removedplayer_signal
    • Removedplayer_synthesize
    • Removedpresent_choices
    • Removedpromote_story_to_lore
    • Removedrecord_story
    • Addedrelationship
    • Removedremove_checkpoint
    • Removedremove_combat_participant
    • Removedremove_condition
    • Removedremove_countdown
    • Removedremove_entity
    • Removedremove_exit
    • Removedremove_faction
    • Removedremove_lore_entry
    • Removedremove_note
    • Removedremove_npc
    • Removedremove_room
    • Removedremove_roster_character
    • Removedremove_ruleset
    • Removedremove_server_note
    • Removedremove_story
    • Removedremove_thing
    • Removedrename_novel
    • Removedresolve_intent
    • Removedresolve_vow
    • Removedrestore_checkpoint
    • Removedresume_novel
    • Removedreveal_secret
    • Removedrevert_synthesis
    • Removedroll_on_table
    • Addedruleset
    • Addedscene
    • Removedsearch_rules
    • Addedsession
    • Removedsession_recap
    • Removedset_active_entity
    • Removedset_autonomy
    • Removedset_briefing_order
    • Removedset_checkpoint
    • Removedset_countdown
    • Removedset_genre
    • Removedset_help_category
    • Removedset_lore_entry
    • Removedset_lore_group
    • Removedset_narrative_directive
    • Removedset_note
    • Removedset_party_presence
    • Removedset_pause_context
    • Removedset_personality
    • Removedset_relationship
    • Removedset_scene_state
    • Removedset_secret
    • Removedset_server_note
    • Removedset_verbosity
    • Removedset_voice_examples
    • Removedset_vow
    • Removedspec_health
    • Removedstage_character
    • Addedstory
    • Removedsuggest_actions
    • Removedsuggest_lore
    • Removedswitch_novel
    • Addedsynthesis
    • Removedsynthesize
    • Removedtoggle_action_patterns
    • Removedtoggle_lore_entry
    • Removedtoggle_synthesis_module
    • Removedunarchive_novel
    • Removedupdate_faction
    • Removedupdate_lore_entry
    • Removedupdate_novel_description
    • Removedupdate_npc
    • Removedupdate_story
    • Addedvow
    • Addedworld
  11. 127 tool updatesv1.0.0
    • First observedactivate_synthesis_item
    • First observedadd_combat_participant
    • First observedadvance_combat
    • First observedadvance_countdown
    • First observedapply_condition
    • First observedarchive_novel
    • First observedask_oracle
    • First observedbind_novel_ruleset
    • First observedcharacter_sheet
    • First observedclone_novel
    • First observedcodex_capture
    • First observedcodex_import
    • First observedcodex_list
    • First observedcodex_set
    • First observedcommand
    • First observedcompact_audit_log
    • First observedcompress_audit
    • First observedconvert_source
    • First observedcreate_character
    • First observedcreate_exit
    • First observedcreate_faction
    • First observedcreate_novel
    • First observedcreate_npc
    • First observedcreate_room
    • First observedcreate_thing
    • First observeddeactivate_synthesis_item
    • First observedend_combat
    • First observedend_novel
    • First observedexport_lorebook
    • First observedexport_novel
    • First observedforsake_vow
    • First observedgenerate_adventure
    • First observedgenerate_encounter
    • First observedget_knowledge
    • First observedget_pause_context
    • First observedget_relationships
    • First observedhelp
    • First observedimport_character
    • First observedimport_lorebook
    • First observedimport_novel
    • First observedinit_combat
    • First observedinstall_ruleset
    • First observedlist_adventures
    • First observedlist_checkpoints
    • First observedlist_notes
    • First observedlist_novels
    • First observedlist_roster_characters
    • First observedlist_rulesets
    • First observedlist_server_notes
    • First observedlist_stories
    • First observedlist_synthesis_items
    • First observedload_adventure
    • First observedmark_milestone
    • First observednovel_info
    • First observedplayer_list_synthesis
    • First observedplayer_remove_synthesis
    • First observedplayer_signal
    • First observedplayer_synthesize
    • First observedpresent_choices
    • First observedpromote_story_to_lore
    • First observedrecord_story
    • First observedredo
    • First observedremove_checkpoint
    • First observedremove_combat_participant
    • First observedremove_condition
    • First observedremove_countdown
    • First observedremove_entity
    • First observedremove_exit
    • First observedremove_faction
    • First observedremove_lore_entry
    • First observedremove_note
    • First observedremove_npc
    • First observedremove_room
    • First observedremove_roster_character
    • First observedremove_ruleset
    • First observedremove_server_note
    • First observedremove_story
    • First observedremove_thing
    • First observedrename_novel
    • First observedresolve_intent
    • First observedresolve_vow
    • First observedrespond
    • First observedrestore_checkpoint
    • First observedresume_novel
    • First observedreveal_secret
    • First observedrevert_synthesis
    • First observedroll_on_table
    • First observedsearch_rules
    • First observedsession_recap
    • First observedset_active_entity
    • First observedset_autonomy
    • First observedset_badge
    • First observedset_briefing_order
    • First observedset_checkpoint
    • First observedset_countdown
    • First observedset_genre
    • First observedset_help_category
    • First observedset_lore_entry
    • First observedset_lore_group
    • First observedset_narrative_directive
    • First observedset_note
    • First observedset_party_presence
    • First observedset_pause_context
    • First observedset_personality
    • First observedset_relationship
    • First observedset_scene_state
    • First observedset_secret
    • First observedset_server_note
    • First observedset_verbosity
    • First observedset_voice_examples
    • First observedset_vow
    • First observedspec_health
    • First observedstage_character
    • First observedsuggest_actions
    • First observedsuggest_lore
    • First observedswitch_novel
    • First observedsynthesize
    • First observedtoggle_action_patterns
    • First observedtoggle_lore_entry
    • First observedtoggle_synthesis_module
    • First observedunarchive_novel
    • First observedundo
    • First observedupdate_faction
    • First observedupdate_lore_entry
    • First observedupdate_novel_description
    • First observedupdate_npc
    • First observedupdate_story

TDQS

A4.1/5.0

Scored across 36 tools

Disambiguation3/5

Many near-neighbor tools exist (manage_lore vs manage_corpus vs manage_knowledge vs manage_belief vs manage_note; manage_session vs manage_diagnostics; manage_novel vs manage_archive vs open_session/close_session; manage_scene vs manage_world vs manage_staging). The descriptions do substantial work with explicit 'Do NOT use when' cross-references, so an agent can usually disambiguate, but the sheer density of overlapping knowledge/memory tools means misselection remains plausible.

Naming Consistency4/5

The dominant pattern is manage_<noun> (17 tools) with a small set of verb_noun outliers (run_command, take_turn, open_session, close_session, set_badge, respond_decision, resolve_mechanic). The convention is mostly predictable, though the heavy use of an 'action' parameter inside manage_* tools makes the tool names less informative than they could be.

Tool Count2/5

36 tools is well above the workable range for a single server; many manage_* tools bundle a dozen actions each, so the effective surface is far larger than 36 implies. Several tools (manage_synthesis, manage_knowledge, manage_codex, manage_diagnostics) feel like separate subsystems that could be split or trimmed.

Completeness4/5

Coverage is unusually broad: world, PCs, NPCs, combat, conditions, factions, relationships, lore, beliefs, knowledge, story, vows, countdowns, sessions, archives, rulesets, codex, and synthesis all have lifecycle support. Minor gaps exist (e.g. entity lookup/search is scattered across manage_session.discover and manage_knowledge, with no first-class entity search), but core workflows are covered.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables creation and management of structured game worlds for text adventures and RPGs with character creation, world generation, and natural language interaction through AI integration.
    1
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    An MCP server that provides 18 tools for dice rolling, luck tests, character management, world state, combat, and save/load, enabling an AI game master to run a solo-play gamebook entirely through deterministic game logic.
    18
    1
    -