Embers: Tabletop RPG Toolkit
Server Details
Characters, campaigns, adventures & worlds for D&D 5e/5.5e, Pathfinder, Savage Worlds, Fate, & more.
- Status
- Healthy
- Uptime
- 57.5% over 77 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 146 tools
The imagine_/play_/vault_ prefixes carve out distinct domains, and detailed descriptions distinguish most tools. However, there are near-parallel page tools across three subsystems (imagine_create_adventure_page, imagine_create_world_page, play_create_page), plus overlapping character tools (vault_search_characters, vault_search_monsters, play_list_campaign_characters, play_list_my_characters), and ten nearly identical name generators that differ only by culture, so selection still requires careful reading.
Within each domain the verb_noun snake_case pattern holds well (vault_create_item, play_add_campaign_rule, imagine_update_world_page). The exception is the submission/support cluster, which uses unprefixed names (create_submission, reply_to_submission, list_my_submissions) alongside whoami and list_rulesets, breaking the otherwise predictable domain-prefixed scheme.
146 tools is an extreme surface, far beyond the 3-15 range appropriate for a coherent set. Even granting that the server bundles four substantial domains (support, imagine, play, vault), the volume makes whole-set comprehension and correct tool selection very difficult.
Coverage is unusually thorough: full CRUD for worlds, adventures, pages, campaigns, sessions, moves, characters, items, rules, and spells, plus batch reads, tag search, link/unlink, companion management, and pbem workflows. Minor gaps exist (e.g. no explicit imagine page batch update, some destructive ops are one-way), but agents have workarounds.
Available Tools
146 toolscreate_submissionReport a bug or request a featureAInspect
File a bug report or a feature request with Embers on the calling user's behalf. Pass type (bug or request), a short title, and a description. Optional attachments are ids from upload_submission_screenshot. Returns the created submission; the user can track it with list_my_submissions and get_submission.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | `bug` for something broken, `request` for an enhancement. | |
| title | Yes | Short title. Required. | |
| attachments | No | Upload ids from upload_submission_screenshot to attach. Optional, up to ten. | |
| description | Yes | What happened, or what the user wants. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as non-read-only, so a create operation is expected. The description adds useful behavioral context beyond that: the submission is filed on the calling user's behalf, it returns the created submission, and the user can track it via the listed tools. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences cover what the tool does, required inputs and the attachment source, and what happens with the result. The most important information is front-loaded before optional detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter creation tool with a full schema, required and optional fields are clear, the attachment dependency is stated, and related tracking tools are named. The only omitted items, such as auth or rate limits, are not expected for this kind of straightforward submission tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the parameter details. The description still adds value by naming the required parameters in order and clarifying that attachments must be IDs from upload_submission_screenshot, a relationship not fully expressed in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and resource: 'File a bug report or a feature request with Embers...' and explicitly distinguishes the two type values. This makes the tool's purpose unmistakable and sets it apart from tracking tools like get_submission and list_my_submissions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use it: to file a bug or request on the user's behalf. It also points to upload_submission_screenshot for attachments and to get_submission/list_my_submissions for tracking, but it does not explicitly state when not to use it or mention reply_to_submission as the follow-up alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_submissionRead one of my submissionsARead-onlyIdempotentInspect
Read one of the calling user's submissions: the original report, its screenshots, the current status, and the activity feed (replies both ways and status changes). Pass submissionId from list_my_submissions. Another user's submission is forbidden.
| Name | Required | Description | Default |
|---|---|---|---|
| submissionId | Yes | Mongo `_id` of one of the caller's submissions (from list_my_submissions). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, establishing the safety profile. The description adds meaningful behavioral context by specifying the exact contents returned (original report, screenshots, current status, activity feed with replies and status changes) and the access restriction. This goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that leads with the core purpose, then details the return contents, the source of the parameter, and the restriction. Every clause earns its place, and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is an output schema (not shown but indicated), the description need not explain return format. It covers the scope, the contents, the parameter source, and the access constraint. For a simple read tool with one parameter, this is complete and unambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides a complete description of submissionId ('Mongo `_id` of one of the caller's submissions (from list_my_submissions)') with 100% coverage. The description repeats the source (list_my_submissions) but adds no new semantics beyond what the schema already states, so it stays at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Read') and the resource ('one of the calling user's submissions') and enumerates exactly what is returned (original report, screenshots, current status, activity feed). It also differentiates this from list_my_submissions by referencing it as the source of the ID, and from other submission tools (create, reply, upload) by its read-only nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs how to obtain the parameter ('Pass `submissionId` from list_my_submissions') and includes a strong constraint ('Another user's submission is forbidden'). However, it does not explicitly contrast with alternative tools like reply_to_submission or upload_submission_screenshot, though the read-only intent is clear from the description and annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_create_adventureCreate an adventureAInspect
Create a new adventure owned by the calling user. Required: name and ruleset (imagine has no app-wide ruleset default for adventures). Other fields pass through to imagine.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | URL-safe slug. Lowercase letters, numbers, and hyphens. Imagine auto-suggests at create time when omitted. | |
| name | Yes | Adventure name. Required. | |
| image | No | Header image URL. | |
| level | No | Recommended character level range. Each side optional; null means unset. | |
| world | No | Optional World _id this adventure belongs to. | |
| active | No | ||
| public | No | ||
| status | No | ||
| ruleset | Yes | Ruleset code. Required at create time; imagine has no default ruleset for adventures. | |
| summary | No | Short summary; capped at 150 characters by imagine. | |
| version | No | ||
| keywords | No | Comma-separated keyword string used by adventure-wide tag/search. | |
| barImages | No | GM-curated reference images displayed in a fixed bar across the adventure (maps, handouts, NPC portraits). | |
| partySize | No | Recommended party size range. | |
| publisher | No | ||
| companions | No | ||
| description | No | Full adventure description. Markdown supported. | |
| imageCarousel | No | ||
| estimatedHours | No | ||
| contentWarnings | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is a mutating, non-destructive, non-idempotent operation, so the description does not need to repeat those. It adds useful ownership context and the no-default-ruleset caveat, but it does not disclose side effects, failure modes, or any creation-time behavior beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, and the most important information is front-loaded. The ownership, required fields, and ruleset caveat are all stated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter create tool with nested objects, the description establishes ownership and required fields but leaves optional behavior, defaults, status semantics, and nested-object handling to the schema. The output schema and annotations help, but the description alone is only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds essentially no parameter meaning beyond the schema: name and ruleset being required is already in the schema, and 'Other fields pass through to imagine' is vague. With 20 parameters and moderate schema coverage, the description does little to help an agent understand optional-field behavior or nested structures.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb ('Create'), a unique resource ('adventure'), and scoping ('owned by the calling user'), making it easy to distinguish from sibling tools like imagine_create_world and imagine_create_adventure_page. The required-field note reinforces the core action without blurring the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes the context: use this when creating a new adventure for the calling user, and it calls out the ruleset requirement and the lack of a default. It does not explicitly name alternatives for when not to use this tool, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_create_adventure_pageCreate an adventure pageAInspect
Create a new page inside an adventure. Required: adventureId, name. Use this for scene descriptions, encounter rooms, NPC profiles, plot beats. Valid documentType values: generic, act, scene, location, character, handout, lore, appendix, map. Items and rules are NOT page types; author them in vault and reference them, not as adventure pages. Set the tags array so the page is filterable in adventure-page listings; the page's documentType is also auto-added to the searchable keyword set.
| Name | Required | Description | Default |
|---|---|---|---|
| map | No | Location shape: Mongo `_id` of the Map this location belongs to. Pass null to clear. | |
| goal | No | ||
| link | No | URL-safe slug. Lowercase letters, numbers, hyphens, slashes. | |
| name | Yes | Page name. Required. | |
| tags | No | Tag list. Imagine stores as a comma-separated `keywords` string. | |
| image | No | ||
| active | No | ||
| mapPin | No | ||
| aliases | No | ||
| content | No | Page body in markdown. Imagine renders this verbatim. WARNING: REPLACED wholesale on update; prefer imagine_replace_in_adventure_page for surgical edits. | |
| details | No | Label/value list of arbitrary metadata pairs. | |
| summary | No | Short page summary. Max 150 characters (matches the AdventurePage Mongoose schema's maxlength). Sibling Adventure and WorldPage summaries share the same cap; legacy World summaries cap at 255 (cross-app convention). | |
| duration | No | ||
| parentId | No | Mongo `_id` of the parent page (for tree structure). | |
| template | No | Template id when authored from a template. | |
| menuOrder | No | ||
| vaultRefs | No | Participants on the page. Each entry `{ vaultId?, type?, count?, name? }`. | |
| adventureId | Yes | Adventure to add the page to. | |
| locationKey | No | ||
| documentType | No | Structural type. Drives shape-specific fields. | |
| treasureRefs | No | Treasure entries. Same shape as `vaultRefs`. | |
| outboundLinks | No | AdventurePage ids this page links to. Imagine recomputes this on save when missing; explicit values override. | |
| relationships | No | Sibling AdventurePage ids the page relates to. | |
| worldPageRefs | No | Mongo `_id` list of referenced world pages. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a mutating, non-idempotent, non-destructive operation, and the description adds behavioral nuance beyond that: 'Set the tags array so the page is filterable' and 'documentType is also auto-added to the searchable keyword set.' It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and required fields, and most sentences earn their place by adding use cases or exclusions. The only mild redundancy is restating the documentType enum that already exists in the input schema, but it remains compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-parameter create tool, the description covers the essentials: required fields, permitted document types, non-goals, and tag/filter behavior. The output schema covers return values and the input schema documents most optional fields, so an agent can safely select and invoke the tool; a minor gap is that omitting documentType is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 67% of parameters, and the description adds useful semantics for the most decision-critical ones: required adventureId/name, the valid documentType enum, and tag filtering behavior. However, it does not compensate for the several schema-undocumented optional fields such as goal, mapPin, locationKey, aliases, and menuOrder.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and resource: 'Create a new page inside an adventure.' It reinforces scope with concrete use cases ('scene descriptions, encounter rooms, NPC profiles, plot beats') and clearly distinguishes itself from vault item/rule creation tools by stating those are NOT page types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool and gives an exclusion with routing guidance: 'Items and rules are NOT page types; author them in vault and reference them, not as adventure pages.' This tells an agent both what this tool is for and when to choose an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_create_worldCreate an imagine worldAInspect
Create a new world owned by the calling user. Required: name. Other fields (summary, description, link) pass through to imagine, which validates and assigns defaults where appropriate. Worlds do not carry a ruleset of their own; ruleset lives on the adventure(s) under the world instead.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | URL-safe slug for the world (lowercase letters, digits, hyphens). Imagine auto-suggests at create time when omitted. | |
| menu | No | Site menu entries — label + optional link/pageId/order. | |
| name | Yes | World name. Required. | |
| image | No | ||
| active | No | ||
| public | No | Whether the world is public. Only Premium, VIP, and admin accounts can change whether a world is public; the server refuses the change from anyone else. A new world is public unless set otherwise. | |
| favicon | No | ||
| summary | No | Short summary; capped at 255 characters. Cross-app convention (per dev-sites/AGENTS.md); the Mongoose World schema still accepts up to 500 as a legacy inconsistency being migrated, but new authoring should keep summaries under 255. | |
| calendar | No | Optional calendar definition (months[] + eras[]). | |
| keywords | No | ||
| showInvite | No | Whether the world's public page shows an invite button. Only the world's owner or an admin with Admin Mode on can change it; a contributor's value is ignored. | |
| description | No | Full world description. Markdown supported. | |
| customDomain | No | Optional custom domain pointing at the world's public site. | |
| imageCarousel | No | ||
| isExampleWorld | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false), so the bar is lower. The description adds genuine context beyond them: the created object is owned by the caller, the extra fields are passed through to imagine for validation and default assignment, and worlds deliberately carry no ruleset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences that are front-loaded with the core action and requirement. Nothing is redundant, though the ruleset remark is architecturally useful rather than strictly invocation-critical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be explained, and the schema carries rich per-field docs. However, for a 15-parameter mutation the description omits practical behavior an agent would want — duplicate/link-collision handling, and confirmation that no confirmation step is needed given idempotentHint=false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, a mid-range baseline. The description only calls out name (required), summary, description, and link, and says the rest 'pass through' — it adds little syntax or constraint detail beyond what the schema's per-field descriptions (public, showInvite, summary cap) already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new world owned by the calling user') and clarifies the world's place in the hierarchy versus adventures. It stops short of naming a sibling tool (e.g. imagine_create_adventure) as an explicit alternative, so it is clear but not fully disambiguated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Required: name' plus the note that a world hosts adventures underneath it hints at when to reach for this tool, but there is no explicit when-to-use or when-not-to-use guidance relative to imagine_create_adventure, imagine_create_world_page, or imagine_update_world.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_create_world_pageCreate a world pageAInspect
Create a new page inside a world. Required: worldId, name. Use this for NPCs, locations, organizations, events. Valid documentType values: generic, character, location, organization, event, lore, religion, cosmology. Items and rules are NOT page types; author them in vault and reference them, not as world pages. Set the tags array so the page is filterable via imagine_list_world_pages_by_tags; the page's documentType is also auto-added to the searchable keyword set. Pass visibility: 'gm' for a GM-only page (seen only by the world's owner, its contributors, and an admin with Admin Mode on; 404 and absent from lists for everyone else) or visibility: 'masked' for a page that participates in lists and backlinks under maskName ('Redacted' when unset) with its real name, link, and content hidden until revealed.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | URL-safe slug. Lowercase letters, numbers, hyphens, slashes. Choosing a page link needs Premium, VIP, or admin: without it, create ignores the link and derives one from the name, and an update that changes it is refused. | |
| name | Yes | Page name. Required. | |
| tags | No | Tag list. Stored as a comma-separated `keywords` string on the wire. | |
| image | No | ||
| active | No | ||
| aliases | No | ||
| content | No | Page body in markdown. Imagine renders this verbatim. REPLACED wholesale on update. | |
| details | No | ||
| gmNotes | No | GM-only notes attached to the page. | |
| ruleset | No | ||
| summary | No | Short page summary; capped at 150 characters by imagine. | |
| worldId | Yes | World to add the page to. | |
| maskName | No | What everyone who does not edit the world (its owner, a contributor, or an admin with Admin Mode on) sees instead of the page's name while visibility is 'masked'. Empty renders as 'Redacted'. | |
| parentId | No | Mongo `_id` of the parent world page (tree structure). | |
| template | No | ||
| eventDate | No | Optional in-world event date for chronology-shape pages. | |
| menuLabel | No | ||
| menuOrder | No | ||
| showInMenu | No | ||
| visibility | No | Page visibility. 'gm' pages exist only for the world's owner, its contributors, and an admin with Admin Mode on — every other viewer gets a 404 and the page is absent from lists, search, backlinks, and breadcrumbs. 'masked' pages participate in lists, tags, backlinks, and breadcrumbs but present maskName/maskSummary and an id-based URL to everyone else; the real name, link, content, and aliases stay hidden until the page is flipped to public. Hidden pages are barred from the world menu. Default: 'public'. | |
| maskSummary | No | Optional teaser everyone who does not edit the world sees on the masked page; the real summary and content stay hidden. Max 255 characters. | |
| documentType | No | ||
| isWorldChild | No | ||
| outboundLinks | No | ||
| relationships | No | ||
| showBreadcrumbs | No | ||
| vaultCharacterId | No | Bind this page to a vault character (for character-shape world pages). | |
| playCampaignCharacters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a non-read-only, non-idempotent, non-destructive open-world mutation. The description goes well beyond that: it explains visibility='gm' yields 404s and absence from lists/search/backlinks, describes masked-page mechanics (maskName default 'Redacted', hidden real name/link/content), and notes that setting a custom page link is gated behind Premium/VIP/admin and otherwise silently ignored. This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and required fields, then layered detail on documentTypes, tags, and visibility. The dense final sentences on visibility are long but each carries decision-relevant information (404 behavior, mask semantics). Appropriately sized for a 28-parameter tool, though slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be explained. Given the tool's high complexity and partial schema coverage, the description covers the highest-risk semantics (visibility, permissions, documentType constraints). Some lesser parameters lack explanation, but an agent can call the tool correctly on the critical paths.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is mid-range (46%) across 28 params, so the description must add meaning. It does add real value on documentType valid values and prohibitions, the tags→searchable-keyword behavior, and visibility/maskName semantics. However, many parameters (image, active, aliases, details, ruleset, template, menu controls, relationships, outboundLinks, vaultCharacterId, playCampaignCharacters) remain unexplained in both schema and description, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new page inside a world'), lists required fields, and enumerates the intended use cases (NPCs, locations, organizations, events). It actively distinguishes itself from sibling authoring tools by stating items and rules are NOT page types and belong in vault, so an agent can route correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use it (pages for NPCs/locations/orgs/events), an explicit exclusion (items and rules go to vault), and guidance that tags enable filtering via imagine_list_world_pages_by_tags. It does not address create-vs-update routing or how it differs from imagine_create_adventure_page, but the alternatives it does name are the important ones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_delete_adventureDelete an adventureADestructiveIdempotentInspect
Soft-delete an adventure by id. The adventure is moved to the user's deleted-adventures list and can be restored from the imagine UI. Pages inside are tombstoned with it. Caller must be the adventure's owner or an admin with Admin Mode on; contributors get 404. Destructive. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry the safety profile (destructive=true, idempotent=true, readOnly=false), and the description adds genuinely new behavior: the delete is reversible via a deleted-adventures list restorable from the UI, contained pages are tombstoned alongside it, and authorization is enforced by role with a 404 for contributors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the operation and its soft-delete nature, followed by routing effects, authorization, and the confirmation instruction. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be described. The description still covers the mutation's scope (pages tombstoned), recoverability, auth requirements, and the confirmation step — everything an agent needs to call this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id) and schema coverage is 100%, with the schema itself explaining it is the Mongo `_id`. The description adds nothing beyond 'by id', so this is the expected baseline when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (soft-delete), resource (adventure), and lookup key (by id), and the word 'soft' immediately separates it from the hard-delete siblings like imagine_delete_adventure_page. An agent can identify the operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions: caller must be owner or admin with Admin Mode on, contributors get 404, and it instructs the agent to confirm with the user first. It does not, however, name a competing sibling or state when to choose deletion over e.g. imagine_update_adventure, so it falls short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_delete_adventure_pageDelete an adventure pageADestructiveIdempotentInspect
Permanently delete an adventure page by id. Imagine does not soft-delete pages, so this is unrecoverable. Caller must own or have edit access on the page. Destructive. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description clearly discloses irreversibility ('unrecoverable', 'does not soft-delete'), access requirements, and destructiveness. This adds meaningful context beyond the destructiveHint and idempotentHint annotations, especially emphasizing the need for user confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, information-dense sentences with no filler. The main action is front-loaded, followed by critical irreversibility, access, and safety guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive operation with output schema presentfallback, the description covers the essential behavioral aspects: what it does, irreversibility, access requirements, and user-confirmation requirement. Nothing an agent needs to call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the only parameter 'id' is fully described as a Mongo _id. The description adds only 'by id', which repeats the schema. No additional parameter meaning is necessary, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (adventure page by id). The phrase 'Permanently delete' plus 'does not soft-delete' distinguishes this from similar delete tools for other resources and from update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context: caller must own or have edit access, and should confirm with the user first. It does not explicitly name alternatives or exclusion conditions, but the prerequisites and confirmation guidance make usage conditions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_delete_worldDelete an imagine worldADestructiveIdempotentInspect
Soft-delete a world by id. The world is moved to the user's deleted-worlds list and can be restored from the imagine UI. Pages and adventures inside are tombstoned with it. Caller must be the world's owner or an admin with Admin Mode on; contributors get 404. Destructive. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the world. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=true): it discloses that the delete is soft and restorable from the UI, that nested pages and adventures are tombstoned with it, and that unauthorized contributors receive a 404 rather than a permission error. That is exactly the behavioral context an agent needs before invoking a destructive cascade.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and its soft-delete nature, then layers restoration, cascade, authorization, and the confirmation requirement in five tight sentences with no filler. Every sentence carries distinct, actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with an output schema, the description covers everything an agent needs: reversibility, cascade scope, authorization rules, and the confirmation requirement. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single id parameter is documented as the Mongo `_id`. The description only echoes 'by id' and adds no format or lookup guidance, so the schema carries the full burden. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Soft-delete a world by id') and immediately qualifies the operation as a soft-delete rather than a hard purge. An agent can distinguish it from siblings like imagine_delete_adventure and imagine_delete_world_page 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions: caller must be the world's owner or an admin with Admin Mode on, and contributors get 404. It also instructs 'Confirm with the user first.' It stops short of naming an alternative tool or the exact condition under which a caller should pick this over another delete, so it is clear context rather than a full when/when-not matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_delete_world_pageDelete a world pageADestructiveIdempotentInspect
Soft-delete a world page by id. The page is moved to the world's trash, keeps its link and aliases reserved, and can be restored from the imagine UI for 45 days before it is purged permanently. Caller must own or have edit access on the page. Destructive. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the world page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, but the description adds crucial context: the page moves to trash, keeps link and aliases reserved, restore window of 45 days, and permanent purge after. This goes beyond annotations by clarifying the soft-delete nature, which is essential for the agent to know the action is reversible. Slight deduction for not specifying exact response format, but the description is behaviorally rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact paragraph of four sentences, each with a purpose: what it does, what happens after, who can call it, and the safety warning. It front-loads the key actionable verb 'soft-delete' and does not waste words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is simple with one parameter, the description covers the action, outcome, permissions, reversibility, and safety confirmation. It doesn't describe return values, but there is an output schema (though its content is not provided in the context), so the description needn't. It also doesn't mention error conditions, but for a delete tool this is not critical. Overall, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema describes the 'id' parameter as 'Mongo _id of the world page.' The description doesn't add much about the parameter, but since the schema is complete, baseline is 3. Credit for the description's phrase 'by id' which reinforces the parameter's role, but most semantic weight is on the schema. Thus 4 is justified for not needing more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (soft-delete), the resource (world page by id), and the key behavioral nuance (soft-delete vs delete). It distinguishes itself from sibling delete tools like imagine_delete_world and imagine_delete_adventure_page by specifying 'world page' and the soft-delete mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: caller must own or have edit access, and confirms the user before use. It also implies when not to use by contrasting with other delete tools (which likely do hard deletes) via the soft-delete detail. It provides clear prerequisites and safety steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_braxylian_nameGenerate Braxylian namesARead-onlyInspect
Generate hard-edged names from the Braxyl, the plains culture of the world Veylantia — guttural men, flowing women. kind chooses person or place; for people, gender (mixed/male/female) and surname apply. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person or place. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. | |
| surname | No | Append a surname. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds that it returns an array of names and that gender/surname only apply to people, but never discloses the non-determinism implied by idempotentHint=false (repeated calls yield new names) or any rate/size behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the cultural scope then the parameter applicability and return shape. The flavor phrase ('guttural men, flowing women') is arguably decorative but does help an agent judge whether this generator matches the desired naming style.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All four optional params are documented in the schema, annotations carry the safety profile, and an output schema exists so return values need not be enumerated. Only minor gaps remain: no statement of randomness/non-determinism and no cross-reference to the sibling generators.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with enums documented for kind and gender, so the baseline is 3. The description's only added meaning is the conditional applicability rule ('for people, gender and surname apply'), which the schema only partly conveys for surname.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Generate ... names') scoped to the Braxyl culture of Veylantia, which is the real discriminator among the many sibling culture-name generators (draconic, lorean, shoren, etc.). It never explicitly says it differs from those siblings, but the cultural identifier effectively lets an agent pick it over the rest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the culture flavor hints at when this generator fits, but there is no when-to-use/when-not statement and no sibling routing among the seven other generate_*_name tools. The clause about which parameters apply for people is parameter scoping, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_draconic_nameGenerate draconic namesARead-onlyInspect
Generate dragon names using the harsh phonetics of the Draconic tongue. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many names to generate (1–50). Defaults to 5. | |
| length | No | Preferred name length. Defaults to medium. | |
| includeEpithet | No | Append a draconic epithet. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read/generation operation. The description adds the behavioral trait that it returns an array of names, which is useful. However, it does not disclose details like randomness, uniqueness, or whether the same input yields different outputs, which would be valuable for a generation tool. The description does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the core purpose. The second sentence about the return type is useful but could be considered redundant given the output schema exists. Still, it is concise and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the output schema, and the annotations covering safety, the description is nearly complete. It could mention that the tool is non-deterministic or that names are randomly generated, but for a simple name generator with fully documented parameters, the current description is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 three parameters (count, length, includeEpithet) with descriptions and defaults. The description adds no additional parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('generate') and resource ('draconic names'), and the title 'imagine_generate_draconic_name' is clearly reflected. It distinguishes itself from sibling tools like imagine_generate_npc by focusing on name generation, and the description's mention of 'harsh phonetics of the Draconic tongue' adds flavor that clarifies the resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a creative-generation use case, and the sibling list shows many other generation tools (e.g., imagine_generate_npc, vault_build_monster), but the description does not explicitly state when to use this tool versus alternatives. It is clear enough for an agent to infer that this is for generating draconic names, not NPCs or other entities, but it lacks explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_gallance_nameGenerate Gallance namesARead-onlyInspect
Generate melodious, French-flavored noble names from the Gallance culture of the world Veylantia. kind chooses person, place, or house; for people, gender (mixed/male/female) and surname apply. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person, place, or house. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. | |
| surname | No | Append a surname. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the non-idempotent hint is consistent with random name generation. The description adds the conditional behavior that gender/surname apply only to people and that the return is an array, but does not add rich operational context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the purpose before the parameter notes. Slight redundancy in "Returns an array of names," which the output schema already covers, but overall tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 adequately covers the discriminators (culture, kind, conditional gender/surname). The only meaningful gap is the absence of cross-tool routing guidance among the sibling name generators.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 four parameters; baseline is 3. The description adds a modest linking semantic (gender and surname apply only when kind=person), but mostly restates what the enum descriptions already convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Generate ... names") and adds a distinguishing flavor ("melodious, French-flavored noble names from the Gallance culture of the world Veylantia"), which meaningfully separates it from the eight other imagine_generate_*_name siblings. It stops short of explicitly naming those alternatives, but the cultural qualifier is enough to identify the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the culture qualifier (use it when you want Gallance names), and the `kind` clause scopes when gender/surname matter. However, there is no explicit when-to-use framing and no guidance on choosing this over the sibling name generators (Braxylian, Lorean, etc.), leaving the routing decision to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_lorean_nameGenerate Lorean namesBRead-onlyInspect
Generate plain, weathered names from the Lorean Freeholds, the refugee holdfasts of the world Korinth. kind chooses person or place; for people, gender (mixed/male/female) and surname apply. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person or place. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. | |
| surname | No | Append a surname. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the read-only, non-destructive safety profile, so the description need not restate it. What it does add is flavor scope and a return-type note. However, idempotentHint=false means repeated identical calls produce different results, and the description never mentions that the output is randomly generated and non-repeatable — a materially useful fact for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the purpose before the parameter notes. The setting-flavor clause ("the refugee holdfasts of the world Korinth") is slightly decorative but contributes useful scoping context for choosing among the cultural generators.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obliged to document the return structure, and it still gives a one-line summary. For a zero-required-parameter generator with fully covered schema, everything needed to invoke it correctly is present; only the non-determinism caveat is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 four parameters including defaults and enums. The description reinforces the conditional linkage (kind chooses person/place; gender and surname only apply to people) but adds no syntax or semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Generate plain, weathered names") and identifies the culture scope ("Lorean Freeholds... Korinth"), which is the axis that separates it from the eight sibling name generators. It never explicitly names a sibling or says 'unlike X', so differentiation relies on the agent noticing the cultural flavor word.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus any of the other imagine_generate_*_name siblings, nor any prerequisites or exclusions. Usage is only implied by the flavor text about the setting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_npcGenerate an NPCARead-onlyInspect
Generate a random NPC with personality, occupation, and (optionally) a secret. Returns an NPC object.
| Name | Required | Description | Default |
|---|---|---|---|
| includeSecret | No | Include a hidden secret for the NPC. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=false. The description adds useful context by noting the output is a random NPC object and that a secret may be included. It does not contradict the annotations, though it adds only modest behavioral detail beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence communicates the tool's purpose, contents, optionality, and return type with no filler. Every element earns its place, and the core action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, full schema coverage, an output schema, and safety annotations, the description is sufficiently complete. It lacks explicit usage guidance or alternatives, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single parameter includeSecret already has a clear description with its default value. The main description's phrase '(optionally) a secret' adds no meaningful information beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Generate'), a clear resource ('a random NPC'), and the key content fields (personality, occupation, optional secret), plus the return type. This clearly distinguishes it from sibling tools like vault_create_character or imagine_generate_draconic_name, even without explicitly naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: call this when you need a random NPC with personality and occupation. However, it does not mention alternatives or exclusion criteria, such as when to use vault_build_pc/vault_create_character for a hand-crafted character instead. The context is clear but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_pelegorian_nameGenerate Pelegorian namesARead-onlyInspect
Generate soft, melodic, Mediterranean-flavored names from Pelegor, the seafaring city-states of the world Veylantia. kind chooses person or place; for people, gender (mixed/male/female) and surname apply. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person or place. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. | |
| surname | No | Append a surname. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds that the output is an array of names and hints at the generative behavior, but says nothing about determinism or rate/count constraints beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the cultural flavor before the parameter mechanics. Every sentence contributes, though the return-value sentence is partially redundant with the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be detailed, and annotations carry the safety profile. The description supplies the flavor and the person/place parameter interplay, which is enough for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 notes that kind selects person or place and that gender/surname apply to people, but this largely restates the per-field schema descriptions rather than adding new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (generate names) scoped to a named culture/region (Pelegor, Veylantia) and the flavor it targets. This distinguishes it in spirit from the many sibling culture generators, though it never explicitly names or contrasts them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: pick this when you want Pelegorian names. There is no explicit when-to-use or when-not guidance and no routing to the other imagine_generate_*_name siblings, so an agent choosing between cultures gets no help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_shoren_nameGenerate Shoren namesBRead-onlyInspect
Generate clipped, consonant-struck names from Shoren, a country of the world Veylantia. kind chooses person / place / house; for people, gender is mixed / male / female. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person, place, or house. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a read-only, non-destructive, non-open-world call, so the safety profile is covered. The description adds stylistic context ("clipped, consonant-struck") but glosses over other useful behavior implied by idempotentHint=false, namely that repeat calls yield different names. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the generation verb and resource, with a clear return statement at the end. Slight redundancy with the schema's enum descriptions keeps it out of the top band.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All three parameters are optional with full schema coverage, an output schema exists so return shape needn't be spelled out, and annotations cover the safety profile. The description is sufficient to call the tool correctly, missing only alternative-tool routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so kind, gender, and count are fully documented in the schema; the description only restates the kind and gender enums. No extra meaning (format, constraints, interaction between kind and gender defaults) is added beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Generate ... names from Shoren") and pins the flavor to a named culture in a named world, which separates it from the nine other imagine_generate_*_name siblings. It stops short of explicitly saying it is the Shoren-specific generator among them, but the differentiation is clear from the text itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use/when-not guidance and no mention of alternatives such as the sibling culture-name generators or imagine_translate_shoren. The kind/gender semantics are parameter documentation, not invocation guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_strykaran_nameGenerate Strykaran namesARead-onlyInspect
Generate names from the Strykaran people of the world Veylantia — soft and Slavic-flavored. kind chooses person or place; for people, gender (mixed/male/female) and surname apply. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person or place. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. | |
| surname | No | Append a surname. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the aesthetic character of the output but omits the one non-obvious behavioral trait declared by annotations — idempotentHint=false, i.e. that repeated calls yield different names rather than the same set. A 3 reflects modest added context against an already-covered safety surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences: the cultural identity and flavor come first, then the parameter applicability. No filler, no repetition, and the most decision-relevant information (which culture) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so explaining return values is unnecessary and the brief 'returns an array of names' is harmless redundancy. The definition covers what an agent needs to invoke it correctly; the only unaddressed element is the non-idempotent regeneration behavior implied by annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The description adds genuine conditional semantics beyond the schema: gender and surname apply only when kind='person', a dependency the schema does not state for surname. It adds little for count or the enum values themselves, which the schema already enumerates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (generate names) and pinpoints the exact culture/world it serves ('Strykaran people of the world Veylantia — soft and Slavic-flavored'). That flavor note meaningfully separates it from the many sibling culture generators (braxylian, draconic, gallance, etc.), though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for selection: the ethnic/aesthetic flavor tells the agent which of the sister name generators fits, and it explains that `kind` selects person vs place with gender/surname applying only to people. There are no explicit exclusions or when-not conditions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_tarithan_nameGenerate Tarithan namesARead-onlyInspect
Generate hard, lyrical names from Tarithan, the mountain realm of the world Veylantia. kind chooses person or place; for people, gender (mixed/male/female) and surname apply. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person or place. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. | |
| surname | No | Append a surname. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description usefully states the return shape (an array of names), but it omits the notable behavioral fact behind idempotentHint=false — that repeated identical calls yield different names. It also says nothing about the count cap or default behavior beyond what the schema says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load what the tool produces and the realm it draws from before getting to parameters. No filler, though the trailing parameter recap is partly redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return format needn't be spelled out, and the description still gives the gist (array of names). For a zero-required-parameter generator the description is sufficient to invoke it correctly; only the sibling-disambiguation context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters including `count` are already fully documented with defaults and ranges. The description restates `kind`, `gender`, and `surname` but adds no format, constraint, or interaction detail beyond the schema, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (generate names) and pins the domain to Tarithan within Veylantia, which is exactly what separates it from the nine sibling imagine_generate_*_name tools. The `kind` clause further clarifies that it covers both persons and places.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the generator to pick when the target culture is Tarithan, but the description never states that explicitly nor contrasts it with imagine_generate_braxylian_name or the other realm generators. No when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_generate_thalassan_nameGenerate Thalassan namesARead-onlyInspect
Generate vowel-flooded, sibilant names from Thalassa, the sea culture of the world Veylantia. kind chooses person / place / house; for people, gender is mixed / male / female. Returns an array of names.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What to name: person, place, or house. Defaults to person. | |
| count | No | How many names to generate (1–50). Defaults to 5. | |
| gender | No | For people: mixed (a balanced blend of male and female), male, or female. Defaults to mixed. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, and non-idempotent behavior, so the safety and repeatability profile is covered. The description adds the return shape (an array of names) but nothing about rate limits, determinism, or why idempotentHint is false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences that lead with the cultural flavor defining the output style and then cover parameter behavior. Front-loaded and largely waste-free, with only slight overlap against the schema's own parameter descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple generator with an output schema present, the description is complete enough: it conveys the flavor, the selectable kinds, the gender option, and the array return. It doesn't need to restate return details, and the minor gap (count range) is fully covered in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters with defaults and enums; this is the baseline. The description repeats the meaning of `kind` and `gender` but adds no syntax, format, or constraint detail beyond the schema and omits `count` entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Generate) and resource (names) scoped to Thalassa, the sea culture of Veylantia, which implicitly distinguishes it from the many sibling generators (braxylian, draconic, lorean, etc.). The culture/world naming gives an agent a clear identity, though it never explicitly contrasts itself with the other name tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers this is the right tool when it needs a Thalassan-culture name. There is no explicit when-to-use, when-not-to-use, or named alternative among the eight sibling name generators.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_get_adventureGet an adventureARead-onlyIdempotentInspect
Fetch one adventure by id with its settings, ruleset, recommended level, and any user-linked play campaigns. The campaign link is informational only and is set by the user; imagine and play do not auto-sync state between them. If the adventure is one part of a series, parent is populated as { _id, name, link, active } — use imagine_list_adventure_parts on the parent id to see the sibling parts. Caller must have at least 'view' access, with one exception: on a PRIVATE adventure with linked play campaigns, a caller who is a member (the owner or any accepted seat, watchers included) of one of those campaigns gets a minimal recaps-only shape instead of a 403 — { _id, name, link, image, recapsOnly: true, hasLinkedCampaigns: true }, enough to call imagine_get_adventure_recaps, none of the adventure content. Non-owner viewers of public adventures get a hasLinkedCampaigns boolean in place of the stripped playCampaignIds.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnly/idempotent/non-destructive), and the description goes well beyond them: the 'view' access requirement, the 403 exception for members of linked play campaigns and the exact minimal recaps-only shape returned, and the substituted `hasLinkedCampaigns` boolean for non-owner viewers. This is unusually rich disclosure of authorization and response variance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the campaign-link caveat are front-loaded, and every sentence carries substantive information rather than filler. It is long, and spelling out exact response shapes overlaps with the existing output schema, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-id read tool this covers permissions, the alternate response shapes, the informational nature of campaign links, and pointers to the follow-up tools. With an output schema present, it need not describe return values further, so the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single `id` parameter, which the schema already documents as the Mongo `_id`. The description's 'by id' adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Fetch one adventure by id') and enumerates the payload contents (settings, ruleset, recommended level, linked play campaigns). This distinguishes it from siblings like imagine_list_my_adventures and imagine_get_adventure_page without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions: caller needs at least 'view' access, and it routes to imagine_list_adventure_parts for sibling parts and imagine_get_adventure_recaps for the recaps-only shape. It also warns the campaign link is informational and not auto-synced. It stops short of an explicit 'prefer X over Y' rule against adjacent getters, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_get_adventure_pageGet an adventure pageARead-onlyIdempotentInspect
Fetch one adventure page by id with its full markdown body, tags, and parent reference. By default the gateway dereferences bracketed tag-* and child-* shortcodes and inlines a compact <expansion> block right after each literal. (rule-* shortcodes are NOT expanded on adventure pages because adventures do not carry a curated rule / spell / item association list; they remain as literals.) Pass raw: true to skip expansion when round-tripping the body back through imagine_update_adventure_page. Cross-references in the response: parent (resolve via imagine_get_adventure_page), worldPageRefs (array of world-page ids, resolve via imagine_get_world_page), and vaultRefs (array of {vaultId, type, count} for rules / spells / items / characters; resolve via the matching vault_get_* tool by type). Pair with imagine_list_adventure_pages to locate the id first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure page. | |
| raw | No | When true, return the page body verbatim with bracketed shortcodes left as literals. Default: shortcodes are dereferenced and a compact <expansion> block is inlined after each literal. Pass raw=true when round-tripping a body back through imagine_update_adventure_page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the default dereferencing behavior, the fact that rule-* shortcodes are NOT expanded and why, and the raw:true escape hatch. It also explains the shape of cross-references (parent, worldPageRefs, vaultRefs) and how to resolve them. This goes well beyond the annotations (readOnly, idempotent, non-destructive) and adds real behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core fetch behavior, then explains expansion behavior, then cross-reference resolution, then pairing with the list tool. Every sentence earns its place, though the cross-reference sentence is long and could be slightly more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the annotations cover safety, the description covers everything an agent needs: what is returned, how expansion works, when to use raw, how to resolve cross-references, and how to find the id. No critical gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds value by explaining the default vs raw behavior and the round-tripping use case, which enriches the raw parameter's meaning beyond the schema's description. The id parameter is straightforward and needs no extra explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches one adventure page by id, and specifies the returned content (markdown body, tags, parent reference). It also distinguishes itself from sibling tools like imagine_get_adventure_pages (plural) and imagine_get_world_page by naming the resource type and the resolution targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use raw:true (round-tripping through imagine_update_adventure_page) and when not to (default expansion). It also tells the agent to pair with imagine_list_adventure_pages to locate the id first, and gives resolution guidance for cross-references. This is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_get_adventure_pagesGet many adventure pages at onceARead-onlyIdempotentInspect
Batch read of adventure pages by id (up to 50 per call). Use this when you need to walk an act and read several scenes' bodies — one call instead of one tool invocation per page. Each returned page carries the same shape imagine_get_adventure_page produces (full markdown body, ancestors, prev/next sibling navigation, expanded shortcodes by default). The response is { pages: [...], missing: [...] }; ids the caller can't view, or that don't exist, land silently in missing rather than failing the whole batch.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Mongo `_id` list of adventure pages to fetch. Returns each page's full body, ancestors, and prev/next-sibling navigation in one round trip. Cap: 50 ids per request. Pages the caller can't view are silently omitted into a separate `missing` list rather than failing the batch. | |
| raw | No | When true, return each page body verbatim with bracketed shortcodes left as literals. Default: shortcodes are dereferenced and a compact <expansion> block is inlined after each literal, same as imagine_get_adventure_page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent; the description adds valuable behavior beyond that: silent omission into a `missing` array instead of failing the batch, the 50-id cap, and default shortcode expansion with a raw escape hatch. These details materially affect how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences cover operation+cap, use case, return shape, and failure semantics with no filler. The most decision-relevant facts are front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the rich schema and output schema, the description gives the agent everything needed to invoke the tool correctly: batch limits, per-page output shape, shortcode behavior, and the distinction between returned pages and missing ids. Nothing relevant is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters in detail: Mongo `_id` list, 50-id cap, silent missing behavior, and the raw toggle. The description adds the return-shape relationship to imagine_get_adventure_page, but that is contextual framing rather than new parameter-level semantics. With 100% schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation and resource: 'Batch read of adventure pages by id.' The 50-per-call cap and the reference to imagine_get_adventure_page clearly distinguish this from the single-page sibling, so an agent can identify it at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends this tool when walking an act and reading several scenes' bodies, framing it as one call instead of one tool invocation per page. It doesn't explicitly spell out the reverse case ('use imagine_get_adventure_page for a single page'), but the use context and sibling relationship are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_get_adventure_recapsGet the session recaps for an adventureARead-onlyIdempotentInspect
Fetch the play-session recaps written while running this adventure, grouped by linked play campaign. Each campaign entry carries the sessions tagged with this adventure (via the session's imagineAdventureId) in date order, and each session carries its player-recap pages (author + markdown body). Read-through to play: the caller must be a member (the owner or any accepted seat, watchers included) of a linked campaign, or an admin with Admin Mode on, to read its sessions — on a PRIVATE adventure this is the recaps-only path. Members see public recaps plus their own private ones; an admin with Admin Mode on sees every recap. Campaigns with no tagged sessions are omitted. Returns { campaigns: [] } when the adventure has no linked campaigns or nothing is visible to the caller. This replaces the manual walk of play_list_campaign_sessions + play_list_pages per session.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly/idempotent/non-destructive), and the description adds substantial extra context: per-caller visibility rules (public + own private vs admin-sees-all), omission of campaigns with no tagged sessions, and the exact empty-result shape ({ campaigns: [] }). This is behavior beyond what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and grouping semantics, then layers permission and edge-case detail. Dense but every sentence carries information; the permission enumeration is somewhat long but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values needn't be spelled out, yet the description still gives the grouping shape and empty case. Permission model, visibility scoping, and omission behavior are all covered — nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` param is fully documented there as the Mongo `_id` of the adventure, so baseline 3 applies. The description clarifies the entity relationship (sessions tagged via imagineAdventureId) that determines the result set but adds no format or syntax detail about the parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fetch the play-session recaps ... grouped by linked play campaign') and explicitly distinguishes itself from the manual alternative (play_list_campaign_sessions + play_list_pages). An agent can tell what this returns and how it differs from the sibling list 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the read-through-to-play condition (caller must be a member of a linked campaign or an admin with Admin Mode on), notes the recaps-only path for PRIVATE adventures, and states it replaces the two-step manual walk of the sibling tools. When-to-use and the alternative are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_get_worldGet an imagine worldARead-onlyIdempotentInspect
Fetch one world by id with its settings, membership, and any user-linked play campaigns. The campaign link is informational only and is not auto-synced. Caller must have at least 'view' access to the world.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the world. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context beyond that: the campaign link is informational only and not auto-synced, and the caller must have view access. These details help the agent understand the tool's side effects and authorization requirements, which annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no waste. The first sentence states the primary purpose and return content, the second clarifies a critical caveat, and the third states a permission prerequisite. It is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (indicated) and only one parameter, the description is complete for correct invocation. It covers what the tool returns, the caveat about campaign links, and the required access level. No essential behavioral or usage information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'id', which is described as 'Mongo _id of the world'. The description does not add additional semantics beyond restating that it fetches by id; it does not provide format examples or extra constraints. Since the schema fully documents the parameter, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch', the resource 'world', the identifier 'by id', and enumerates the specific data returned (settings, membership, user-linked play campaigns). It differentiates from sibling tools like imagine_get_world_page or imagine_list_my_worlds by specifying the exact scope and fields, so an agent can distinguish it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear context: it is for fetching a single world by id with specific details, and it explicitly states the permission requirement ('Caller must have at least view access'). However, it does not explicitly mention when not to use it or name alternatives (e.g., imagine_list_my_worlds for listing), so it lacks explicit exclusions but still gives clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_get_world_pageGet a world pageARead-onlyIdempotentInspect
Fetch one world page by id with its full markdown body, tags, and parent reference. By default the gateway dereferences bracketed shortcodes (tag-, child-, rule-*) and inlines a compact <expansion> block right after each literal so the LLM has the resolved content alongside what the author wrote. The original literal is preserved. Pass raw: true to skip expansion (useful when round-tripping the body back through imagine_update_world_page). Cross-references in the response: parent (another world page, resolve via imagine_get_world_page) and vaultCharacterId (vault character, resolve via vault_get_character). Pair with imagine_list_world_pages or imagine_search_world_pages to locate the id first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the world page. | |
| raw | No | When true, return the page body verbatim with bracketed shortcodes left as literals. Default: shortcodes are dereferenced and a compact <expansion> block is inlined after each literal so the LLM has the same content the human sees rendered. Pass raw=true if you're round-tripping a body back to imagine via imagine_update_world_page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=true, idempotentHint=true), the description discloses the default expansion behavior (dereferencing shortcodes and inlining <expansion> blocks) and the preservation of the original literal. It also clarifies the effect of raw:true, providing substantial behavioral detail that the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence serves a purpose: it starts with the core operation, then explains the default expansion, the raw override, cross-reference resolution, and how to locate the id. It is longer than strictly necessary but well-structured and front-loaded with the main function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description appropriately omits return format details, but it adds valuable cross-reference resolution hints (parent and vaultCharacterId) and workflow guidance on locating the id. The tool is fully contextualized for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the input schema (100% coverage), so the baseline is 3. The description re-explains the raw parameter's behavior and adds a round-tripping use case, but this adds only marginal value beyond the schema, not enough to raise the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Fetch one world page by id') and enumerates the returned content (full markdown body, tags, parent reference). It differentiates itself from siblings by pairing with list/search tools to locate the id, implying this tool is for retrieval of a single known page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises pairing with imagine_list_world_pages or imagine_search_world_pages to locate the id, and explains the raw:true option for round-tripping bodies back to imagine_update_world_page. This gives clear workflow context, though it does not describe when not to use the tool relative to other getters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_link_adventure_to_campaignLink a play campaign to an adventureAInspect
Add a play campaign to an adventure's playCampaignIds[], the one stored copy of the link. The campaign's imagineAdventures[] on play_get_campaign lists the adventure from it, which backs the session Adventure tag (imagineAdventureId on play_update_session). The caller must be the campaign's owner or gamemaster (403 otherwise; 404 for an unknown campaign) and have 'edit' access on the adventure. The controller returns 400 if the link already exists; call this only when you've confirmed the link isn't already present (or be ready to handle the 400). Use play_list_my_campaigns to locate the campaign id first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure. | |
| campaignId | Yes | Mongo `_id` of the play campaign to link. Get it from `play_list_my_campaigns` or `play_list_participated_campaigns`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only convey readOnly=false, idempotent=false, destructive=false. The description goes far beyond: it explains the side effect (mutating playCampaignIds[]), the derived effect on the campaign's imagineAdventures[] and session Adventure tag, and details error codes (403, 404, 400) with conditions. This fully discloses behavioral impact without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, but every sentence contributes: core action, side effects, access control, error codes, preconditions, and a pointer to a helper tool. It is front-loaded with the primary verb and object, and no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating link operation, the description covers all essential context: what, where, side effects, permissions, error handling, and input sourcing. With an output schema present (though not shown) and annotations covering safety, nothing an agent needs to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds value by explicitly stating where to get campaignId (from play_list_my_campaigns or play_list_participated_campaigns) and that id is a Mongo _id of the adventure. This enriches the schema's minimal descriptions, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Add a play campaign to an adventure's playCampaignIds[]'. It names the specific resource, the exact array field being modified, and distinguishes itself from the sibling tools imagine_unlink_adventure_from_campaign and imagine_link_world_to_campaign by specifying the exact data model.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to call it ('call this only when you've confirmed the link isn't already present'), provides error-handling guidance ('or be ready to handle the 400'), and directs the agent to use play_list_my_campaigns to find the campaign ID. It also states required permissions (owner/gamemaster + edit access on adventure).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_link_world_to_campaignLink a play campaign to a worldAInspect
Link a play campaign to a world. The link is stored once, in the world's playCampaignIds[]; the campaign's imagineWorldIds on play_get_campaign is read from it. Linking also shares house rules between the world and the campaign (each side's house-rule associations are added to the other). The caller must be the campaign's owner or gamemaster (403 otherwise; 404 for an unknown campaign). By default also imports the campaign's existing characters as world-page character refs (set importCharacters: false to skip). Returns 400 if the link already exists, so call this only when you've confirmed the link isn't already present (or be ready to handle the 400). Caller must have 'edit' access on the world.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the world. | |
| campaignId | Yes | Mongo `_id` of the play campaign to link. Get it from `play_list_my_campaigns` or `play_list_participated_campaigns`. | |
| importCharacters | No | When true (the backend default), play characters already attached to the campaign are imported as world-page character refs on the imagine side. Pass `false` to skip that import and only register the link. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses side effects beyond annotations: the link is stored in the world's playCampaignIds[], house rules are shared both ways, characters are imported by default, and the tool returns 400 if the link already exists. It also specifies the required 'edit' access. This far exceeds the annotations' minimal hints and accurately describes the operation's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but front-loads the core purpose in the first sentence. Each subsequent sentence adds crucial operational detail (storage, house rules, permissions, error handling). It is not verbose or redundant, though it could be split into bullet points for easier parsing. Still, it is appropriately sized for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity—linking two entities, sharing house rules, importing characters, and requiring specific permissions—the description covers all key aspects: storage mechanism, side effects, default behavior, error cases, and access requirements. It also includes the output schema, so return values need not be explained. The description is fully sufficient for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already explained in detail (e.g., id and campaignId are Mongo _ids, importCharacters has a description of its effect and default). The tool description adds no new parameter-specific meaning beyond what the schema provides, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact action 'Link a play campaign to a world' with clear verb and resource, and the detailed explanation of storage and effects distinguishes it from the sibling imagine_link_adventure_to_campaign. It leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call it ('call this only when you've confirmed the link isn't already present'), notes the required caller permissions (owner/gamemaster), and mentions the alternative of setting importCharacters to false to skip character import. It provides clear conditions for use and implies when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_list_adventure_pagesList pages in an adventureARead-onlyIdempotentInspect
List pages belonging to one adventure. Returns a tree-friendly summary per page (id, name, link, documentType, parent, menuOrder, locationKey, summary, image). Optional narrowing filters: parent (only direct children of that page — useful for an 'open this act' workflow), documentType (only pages of that type — useful for 'list every scene'). Both filters are combinable. Pair with imagine_get_adventure_page (single) or imagine_get_adventure_pages (batch) for full bodies.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure. | |
| parent | No | Optional. Mongo `_id` of a parent page. When set, only direct children of that page are returned (an act + its scenes pattern). Use imagine_list_adventure_pages without `parent` first to discover ids. | |
| documentType | No | Optional. Narrow to a single documentType (e.g. 'scene' to list every scene in the adventure). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, so the description only needs to add behavioral context. It adds that the result is tree-friendly, that parent filtering returns only direct children, and that both filters are combinable. These details go beyond the schema without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with no filler. The core action and return type are front-loaded, followed by filter semantics and sibling guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema covers the return shape, annotations cover the safety profile, and all three parameters are fully described in both schema and description. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all three parameters at 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying direct-children semantics, showing realistic workflows for each filter, and stating that the filters are combinable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List pages belonging to one adventure,' and immediately clarifies it returns summaries rather than full page bodies. It also distinguishes itself from sibling tools like imagine_get_adventure_page and imagine_get_adventure_pages by naming them and describing the split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use context for each optional filter: parent for an 'open this act' workflow, documentType for 'list every scene.' It also explicitly tells the agent to pair with imagine_get_adventure_page or imagine_get_adventure_pages when full bodies are needed, making alternatives and exclusions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_list_adventure_partsList the parts of a series adventureARead-onlyIdempotentInspect
List the active parts (child adventures) of a series parent, ordered by menuOrder then name. Adventures can be grouped one level deep: an umbrella adventure (the campaign arc) with full adventures as its parts. Returns slim catalog-card fields per part (id, name, summary, image, ruleset, level, status, stock, link, version, parent, menuOrder). Parts the caller can't view are silently omitted. Returns an empty list for adventures that aren't a series parent. To make an adventure a part, set parent via imagine_update_adventure.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the description adds valuable behavioral context: only active parts are listed, ordering by menuOrder then name, one-level grouping, silent omission of unviewable parts, and empty-list behavior for non-parents. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and ordering, then adds behavioral edge cases and return fields without waste. Every sentence earns its place, and the field list is useful because it tells the agent exactly what shape to expect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter list tool with an output schema, the description covers all necessary behavior: ordering, active filter, permission-related omission, non-parent result, and how to create parts. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single id parameter with 100% coverage, so the baseline is 3. The description adds meaning by clarifying that the id must be a series parent, which is needed to interpret the empty-list case. This contextual enrichment goes slightly beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a precise verb and resource: list active child adventures (parts) of a series parent, with explicit ordering. This distinguishes it from sibling list tools like imagine_list_adventure_pages and imagine_list_my_adventures, so an agent can select it without guessing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the tool is for series-parent adventures and explicitly covers the non-parent case (empty list), plus how to make an adventure a part. It does not name alternative tools, but the context is unambiguous enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_list_my_adventuresList my adventuresARead-onlyIdempotentInspect
List the adventures the calling user owns or has access to. Returns slim catalog-card fields per adventure (id, name, summary, image, ruleset, level, status, stock, link, version, createdAt, updatedAt, parent, menuOrder). A non-null parent marks the adventure as one part of a series — see imagine_list_adventure_parts. To read a specific adventure's full body and configuration, call imagine_get_adventure with the id.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful context beyond annotations by explaining the slim catalog-card scope, the series semantics of `parent`, and the relationship to detail-fetching tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the core action and scope, the second lists the return fields, and the third handles related-tool routing. It is front-loaded and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an existing output schema, comprehensive annotations, and no parameters, the description covers everything an agent needs to decide to call this tool and interpret the series-parent concept. Pagination and ordering are not mentioned, but nothing in the context signals they are essential for this simple list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is no parameter documentation gap for the description to fill. The baseline of 4 applies because no semantic burden is placed on the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the adventures the calling user owns or has access to.' It clearly differentiates this tool from the related imagine_list_adventure_parts and imagine_get_adventure by stating what this tool returns versus what those tools are for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided for related operations: when an adventure has a non-null `parent`, the reader is directed to imagine_list_adventure_parts, and when full body/config is needed, imagine_get_adventure is named. This gives an agent actionable routing without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_list_my_worldsList my imagine worldsARead-onlyIdempotentInspect
List the worlds the calling user owns or has access to via membership. Returns slim catalog-card fields per world (id, name, summary, image, link, createdAt, updatedAt). To read a specific world's full body and configuration, call imagine_get_world with the id.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, and destructiveHint. The description adds value by specifying the return fields ('id, name, summary, image, link, createdAt, updatedAt') and the slim catalog-card nature, giving the agent a concrete expectation of output shape beyond what annotations provide. It doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The first sentence states purpose and scope; the second lists return fields and points to the sibling tool. Fully front-loaded, no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter list operation with an output schema already present, the description covers the essential context: scope of access, return field summary, and the escape hatch to get full details. An agent can call it correctly without further info. The description is thorough given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description has no parameter details to add. Per baseline, a 0-param tool gets a 4. The description correctly avoids inventing parameter notes and focuses on behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('worlds'), and clearly scopes it to 'owns or has access to via membership.' It also distinguishes itself from imagine_get_world, which reads a specific world's full body, so an agent knows this is a catalog listing operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this over an alternative: 'To read a specific world's full body and configuration, call imagine_get_world with the id.' This is a clear routing statement. It also implicitly communicates the use case of listing all accessible worlds without needing parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_list_world_pagesList pages in a worldARead-onlyIdempotentInspect
List all pages belonging to one world. Returns a tree-friendly summary (id, name, link, parentId, tags). Pair with imagine_get_world_page to fetch full content.
| Name | Required | Description | Default |
|---|---|---|---|
| worldId | Yes | Mongo `_id` of the world. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value beyond them by disclosing the return payload shape (id, name, link, parentId, tags) and that the result is a hierarchy-friendly summary rather than full content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver purpose, return shape, and a companion-tool pointer with no filler. The core scope is front-loaded, making the definition easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with one well-documented parameter, an output schema, and rich safety annotations, the description covers what an agent needs: scope, return type, and how to fetch full content. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the single required parameter is 100%, with worldId described as a Mongo _id. The description only reinforces 'one world' without adding new parameter syntax, format, or edge-case details, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('all pages belonging to one world'), and identifies the return format as a tree-friendly summary, which distinguishes it from content-fetching siblings like imagine_get_world_page and tag-filtered variants. This is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear workflow guidance by pairing this tool with imagine_get_world_page for full content, implying this tool is for summaries and navigation. It does not explicitly contrast with imagine_list_world_pages_by_tags or imagine_search_world_pages, so it misses full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_list_world_pages_by_tagsList world pages by tagsARead-onlyIdempotentInspect
Filter pages within a world by one or more tags. The page's documentType is concatenated into the same keyword set imagine searches, so a tag query of 'character' also matches every page with documentType=character. Use mode='and' to require every tag; mode='or' (default) returns pages matching any tag. Common patterns: all NPCs (tag='npc'), all locations (tag='location'), every character-type page (tag='character').
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Tag-matching mode. 'or' (default) returns pages matching any tag; 'and' requires every tag. | |
| tags | Yes | Comma-separated list of tags (e.g. 'npc,villain' or just 'location'). | |
| worldId | Yes | World id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as read-only, idempotent, and non-destructive, and the description adds valuable hidden behavior: documentType is folded into the same keyword set, so a tag like 'character' also matches documentType=character. It also discloses the default mode ('or'), which is genuinely useful and not obvious from the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action, then adds only high-value details about documentType, mode behavior, and common patterns. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, annotations cover safety, and all parameters are documented in the schema, the description provides the remaining behavioral context an agent needs: how tags interact with documentType, the default/mode choices, and typical use cases. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond the schema by explaining the unexpected documentType matching behavior and giving concrete tag examples. It clarifies the tags parameter more deeply than the schema's 'comma-separated list' description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Filter pages within a world by one or more tags.' It also clarifies what makes this tool distinct from plain listing/searching by explaining tag matching semantics, so an agent can identify it among siblings like imagine_list_world_pages and imagine_search_world_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage patterns ('all NPCs', 'all locations', 'every character-type page') and explains when to use mode 'and' vs 'or'. It does not explicitly name the sibling alternatives or say when not to use them, but the examples make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_replace_in_adventure_pageReplace text inside one adventure pageAIdempotentInspect
Surgical find-and-replace inside one adventure page's content. Every byte outside the matched ranges is preserved exactly, so this is the safe primitive for terminology passes (e.g. renaming a monster across a page) where imagine_update_adventure_page's whole-body replace would risk dropping formatting whitespace the LLM can't see in JSON. find matches literally (no regex). All occurrences are replaced in a single pass. Optional expectedOccurrences is a staleness guard — when set, a count mismatch returns 409 with no save instead of silently doing a partial edit. Returns { adventurePage, occurrences }.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure page. | |
| find | Yes | Literal substring to replace inside the page's `content`. Match is literal (no regex); metacharacters are treated as ordinary characters. | |
| replace | Yes | Substring to put in place of every occurrence of `find`. May be empty to delete the matched text. | |
| expectedOccurrences | No | Optional staleness guard. When set, the live page MUST contain exactly this many occurrences of `find` or the call fails with 409 and no save lands. Pre-count by fetching the page first if you want this protection. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description discloses key behaviors: byte-level preservation outside matches, single-pass replacement of all occurrences, the staleness guard returning 409 without saving on count mismatch, and the literal match semantics. This adds substantial behavioral context the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The first sentence front-loads the core purpose and key differentiator, the second covers matching, guard, and return. Every phrase earns its place, and the structure is easily scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential operational context: the safe usage, the alternative to avoid, the literal matching, the option for a staleness guard with its 409 behavior, and the return format. It even tells the agent to pre-count occurrences if protection is desired. With an output schema available, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents each parameter, including the literal match behavior and the staleness guard. The description adds context like 'single pass' and return value, but these are already implied by schema descriptions and output schema. It provides no new parameter-specific semantics beyond reinforcing the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Replace text inside one adventure page's content'. It distinguishes itself from the sibling imagine_update_adventure_page by emphasizing 'surgical find-and-replace' that preserves every byte outside matched ranges, making its unique intent explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: it is the 'safe primitive for terminology passes' and directly contrasts with imagine_update_adventure_page, which 'would risk dropping formatting whitespace the LLM can't see in JSON.' This clearly tells an agent when to pick this tool over the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_search_world_pagesSearch world pages by textARead-onlyIdempotentInspect
Text search over page titles and raw markdown bodies within one world. Returns ranked summary results. Bracketed shortcodes (e.g. [[tag-card:goblin]]) match as literal text, not by the resolved content of the referenced entity, so this tool can miss content the human sees rendered. For category lookups (NPCs, locations, monsters), prefer imagine_list_world_pages_by_tags with the tag or documentType value.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query text. Required. | |
| worldId | Yes | Mongo `_id` of the world to search within. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: the search scope (titles + raw markdown), the ranked-summary return shape, and critically the shortcode limitation where literal-text matching can miss rendered content. It stops short of pagination or result-limit behavior, but the output schema covers return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose, return shape, the key gotcha, and the routing alternative. Information is front-loaded (purpose first) with the caveat and sibling guidance after. No filler, no repetition of schema or annotation content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only search tool, the definition is complete: annotations cover safety, the output schema covers return values, the description covers scope, the known failure mode, and the correct sibling alternative. An agent has everything needed to decide when to call this tool and what to expect from it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: query and worldId each have meaningful descriptions in the schema. The description only marginally augments this by clarifying that the query runs against titles and raw markdown 'within one world,' reinforcing worldId's scoping role. Baseline 3 is appropriate since the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Text search over page titles and raw markdown bodies within one world.' It also explicitly distinguishes itself from the sibling tool imagine_list_world_pages_by_tags by scoping this tool to raw text search and the sibling to category/tag lookups. The title and description align cleanly with no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit routing guidance: 'For category lookups (NPCs, locations, monsters), prefer imagine_list_world_pages_by_tags with the tag or documentType value.' It also flags when results may be incomplete (shortcodes matching literally), so an agent can warn the user or switch strategies. This is rare, explicit when-not-to-use guidance naming the exact alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_translate_shorenTranslate to ShorenARead-onlyIdempotentInspect
Translate English text into the Shoren tongue of the world Veylantia — clipped and consonant-struck. Deterministic: the same input always yields the same Shoren. Mark the verb with asterisks (I ran home) to move it to the end, the Shoren way. Returns { translation }.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | English text to translate, up to 2000 characters. Mark the verb with asterisks (I *ran* home) to honor Shoren's verb-last word order. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so safety and determinism are covered. The description's 'Deterministic: the same input always yields the same Shoren' largely restates idempotentHint, and the return shape restates the existing output schema, so it adds little beyond the structured data; the verb-marking rule is behavioral but is also present in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, followed by behavioral notes and the return shape; every sentence is short and the verb-marking example is concretely useful. Slight redundancy with annotations/schema keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one fully documented parameter, an output schema that already defines { translation }, and annotations covering the safety profile, the description supplies the remaining flavor context and an example. Nothing critical is missing for correct invocation, though it could have named its nearest sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'text' parameter, including the asterisk verb-marking convention and length limit. The description restates that same asterisk convention with an example but adds no new format or constraint detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — translating English text into the Shoren tongue of Veylantia — with a flavor descriptor ('clipped and consonant-struck'). It is distinguishable from most siblings, but it never mentions the closest sibling, imagine_generate_shoren_name, so an agent must infer on its own that this tool translates arbitrary prose rather than generating a name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose ('translate English text'), and the asterisk convention hints at how to get verb-last output. However, there is no explicit when-to-use/when-not guidance and no routing to alternatives such as the Shoren name generator, leaving selection partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_unlink_adventure_from_campaignUnlink a play campaign from an adventureAIdempotentInspect
Remove a play campaign from an adventure's playCampaignIds[]. Inverse of imagine_link_adventure_to_campaign; the adventure drops out of the campaign's imagineAdventures[] (session tags are left in place — inert while unlinked, re-lit on re-link). A link to a campaign that no longer exists is still removed. Caller must be the campaign's owner or gamemaster and have 'edit' access on the adventure.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the adventure. | |
| campaignId | Yes | Mongo `_id` of the play campaign to link. Get it from `play_list_my_campaigns` or `play_list_participated_campaigns`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: session tags remain inert while unlinked and re-lit on re-link, dangling links to non-existent campaigns are still removed, and exact caller permissions are specified. This goes well beyond the idempotentHint and destructiveHint annotations and gives an agent a realistic picture of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: the core action, the inverse relationship, the inert-tag side effect, the dangling-link edge case, and the auth requirement. The most important information is front-loaded, and there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema and strong annotations, the description covers all essential operational concerns: side effects, edge cases, permissions, and relationship semantics. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both `id` and `campaignId` adequately. The description adds a little semantic color around the link relationship and the dangling-campaign edge case, but does not materially extend parameter meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Remove a play campaign from an adventure's `playCampaignIds[]`.' It clearly differentiates this from the inverse link tool and from `imagine_unlink_world_from_campaign` by scoping the operation to adventures. The title and description consistently identify exactly what is being unlinked.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names its inverse (`imagine_link_adventure_to_campaign`) and gives clear context for when this operation applies. It also states the caller prerequisites. It stops short of explicitly listing sibling alternatives or when-not-to-use conditions, but the purpose is unambiguous enough for an agent to select the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_unlink_world_from_campaignUnlink a play campaign from a worldAIdempotentInspect
Unlink a play campaign from a world: removes the campaign from the world's playCampaignIds[]. Pass removeSyncedHouseRules: true to also remove the house rules the link shared between the world and the campaign. The caller must be the campaign's owner or gamemaster. Caller must have 'edit' access on the world.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the world. | |
| campaignId | Yes | Mongo `_id` of the play campaign to unlink. | |
| removeSyncedHouseRules | No | When true, also removes the house rules the link shared between the world and the campaign. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it identifies the exact data structure modified (`playCampaignIds[]`), describes the optional house-rule removal side effect, and states permission requirements. This goes well beyond the readOnly/destructive/idempotent hints while not contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: purpose and core effect, optional flag behavior, and access prerequisites. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description covers the operation, optional side effect, and authorization requirements. It is missing only minor contextual details such as behavior when the link does not exist, but the idempotentHint annotation partially covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 three parameters. The description adds a bit of shared context around `removeSyncedHouseRules`, but does not substantially extend the parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and object: 'Unlink a play campaign from a world,' and then states the exact mechanism: 'removes the campaign from the world's `playCampaignIds[]`.' This clearly distinguishes it from sibling unlink tools for adventures and makes the tool's function unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage context: when to add `removeSyncedHouseRules: true` and explicit caller requirements ('The caller must be the campaign's owner or gamemaster. Caller must have 'edit' access on the world.'). It does not explicitly name alternatives, but the intended use case is clear and the guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_update_adventureUpdate an adventureAIdempotentInspect
PUT updates to one adventure by id. Only supplied fields are sent. Caller must have 'edit' on the adventure. Series grouping: set parent to group this adventure as one part of an umbrella adventure (depth-1 only — see the field description for the validation rules and the append-to-end ordering default); pass parent: null to ungroup. Linked play campaigns list the adventure under its current name, so a rename shows on them immediately. REQUIRES baseUpdatedAt: copy updatedAt from a fresh imagine_get_adventure read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Adventure id. | |
| link | No | URL-safe slug. Lowercase letters, numbers, and hyphens. Imagine auto-suggests at create time when omitted. | |
| name | No | Adventure name. | |
| image | No | Header image URL. | |
| level | No | Recommended character level range. Each side optional; null means unset. | |
| world | No | Optional World _id this adventure belongs to. | |
| active | No | ||
| parent | No | Series grouping: `_id` of the umbrella adventure this adventure is one part of. Depth is capped at one level — the parent cannot itself be a part, and an adventure that has parts cannot become a part (400 either way). The parent must be active and viewable by the caller (owner / contributor / public / stock), else 404. Pass null (or '') to clear. Setting a NEW parent without `menuOrder` appends the adventure to the end of the series. | |
| public | No | ||
| status | No | ||
| ruleset | No | Ruleset code, from list_rulesets. Required at create. | |
| summary | No | Short summary; capped at 150 characters by imagine. | |
| version | No | ||
| keywords | No | Comma-separated keyword string used by adventure-wide tag/search. | |
| barImages | No | GM-curated reference images displayed in a fixed bar across the adventure (maps, handouts, NPC portraits). | |
| menuOrder | No | Sort position among sibling parts of the same series parent. Send alone to reorder an existing part; omit when setting `parent` so the server appends to the end. | |
| partySize | No | Recommended party size range. | |
| publisher | No | ||
| companions | No | ||
| description | No | Full adventure description. Markdown supported. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| imageCarousel | No | ||
| estimatedHours | No | ||
| contentWarnings | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, but the description adds substantial behavior beyond them: partial-update semantics, the 'edit' permission requirement, optimistic-concurrency via baseUpdatedAt with OUT_OF_SYNC and 'nothing is written' on failure, and rename propagation to linked campaigns. This is exactly the context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb+resource, then permission, then the two highest-risk behaviors (series grouping, baseUpdatedAt). Dense but every sentence carries operational weight; only the parent clause is slightly redundant with the field description it points to.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-param mutation tool with an output schema and rich annotations, the description covers the contract-completing details an agent needs: partial update, auth, concurrency guard, and side effects on linked campaigns. Return values are covered by the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 24 parameters and only 63% schema description coverage, the schema does most of the heavy lifting. The description adds real value for the tricky parameters (baseUpdatedAt workflow, parent grouping/ungrouping, menuOrder append default) but explicitly defers to the field description for parent validation and does not address the remaining undocumented fields. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('PUT updates to one adventure by id') and is clearly distinguishable from siblings like imagine_update_adventure_page and imagine_create_adventure. The scope of a partial update ('Only supplied fields are sent') is stated up front, so an agent knows exactly what this tool mutates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisites and routing: caller needs 'edit', and it explicitly directs the agent to a fresh imagine_get_adventure read before calling, with the OUT_OF_SYNC failure described. It does not spell out when to prefer a sibling like imagine_update_adventure_page, but for the common case the when-to-use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_update_adventure_pageUpdate an adventure pageAIdempotentInspect
PUT updates to one adventure page by id. Only supplied fields are sent; every field on the AdventurePage shape (name, content, summary, image, documentType, tags, parentId, link, menuOrder, aliases, details, worldPageRefs, vaultRefs, treasureRefs, scene-shape goal/duration, location-shape locationKey/map/mapPin) can be updated through this tool. Read-aloud / moving-on / tactics are NOT fields — author them inline in content as [[read-aloud]] / [[moving-on]] / [[tactics]] callout blocks. Caller must have 'edit'. WARNING about content: imagine REPLACES the body with whatever you send. To fix wording inside an existing body without losing formatting whitespace, prefer imagine_replace_in_adventure_page (surgical). To append, fetch the page first with imagine_get_adventure_page (raw=true), concatenate, and send the combined body back. REQUIRES baseUpdatedAt: copy updatedAt from a fresh imagine_get_adventure_page read of this page; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written — writing from memory of an earlier read is not possible.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Adventure page id. | |
| map | No | Location shape: Mongo `_id` of the Map this location belongs to. Pass null to clear. | |
| goal | No | ||
| link | No | URL-safe slug. Lowercase letters, numbers, hyphens, slashes. | |
| name | No | Page name. | |
| tags | No | Tag list. Imagine stores as a comma-separated `keywords` string. | |
| image | No | ||
| active | No | ||
| mapPin | No | ||
| aliases | No | ||
| content | No | Page body in markdown. Imagine renders this verbatim. WARNING: REPLACED wholesale on update; prefer imagine_replace_in_adventure_page for surgical edits. | |
| details | No | Label/value list of arbitrary metadata pairs. | |
| summary | No | Short page summary. Max 150 characters (matches the AdventurePage Mongoose schema's maxlength). Sibling Adventure and WorldPage summaries share the same cap; legacy World summaries cap at 255 (cross-app convention). | |
| duration | No | ||
| parentId | No | Mongo `_id` of the parent page (for tree structure). | |
| template | No | Template id when authored from a template. | |
| menuOrder | No | ||
| vaultRefs | No | Participants on the page. Each entry `{ vaultId?, type?, count?, name? }`. | |
| locationKey | No | ||
| documentType | No | Structural type. Drives shape-specific fields. | |
| treasureRefs | No | Treasure entries. Same shape as `vaultRefs`. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| outboundLinks | No | AdventurePage ids this page links to. Imagine recomputes this on save when missing; explicit values override. | |
| relationships | No | Sibling AdventurePage ids the page relates to. | |
| worldPageRefs | No | Mongo `_id` list of referenced world pages. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal this is a write operation, but the description adds substantial behavioral detail: only supplied fields are sent, content is replaced wholesale, stale baseUpdatedAt values are rejected with OUT_OF_SYNC and nothing is written, and successful updates return a new updatedAt. It also discloses that read-aloud/moving-on/tactics are not fields but must be authored inline as callout blocks, which is valuable beyond the schema and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, with the core verb, resource, and warnings front-loaded before alternatives and prerequisites. Every major sentence earns its place, though the long field enumeration and repeated warning about content could arguably be tightened without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 25-parameter write tool with concurrency requirements and several nearby siblings, this description is unusually complete: it covers update semantics, the wholesale-content hazard, the required optimistic-locking workflow, the permission requirement, and the correct alternative for surgical edits. An output schema exists, so the absence of return-value detail is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 68%, so the description does not need to fully re-document parameters, but it adds important meaning beyond the schema: the warning that content is replaced wholesale, the detailed required meaning of baseUpdatedAt, and the clarification that read-aloud/moving-on/tactics are not fields. It does not deeply explain the handful of parameters lacking schema descriptions, but it compensates reasonably for the main risk areas in an update tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('PUT updates to one adventure page by id') and goes on to enumerate the full set of updateable fields, which clearly differentiates it from sibling get/create/replace tools. It also names the sibling surgical alternative, so an agent can distinguish this tool from imagine_replace_in_adventure_page without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus alternatives: prefer imagine_replace_in_adventure_page for surgical content edits, and fetch via imagine_get_adventure_page with raw=true when appending. It also states the required permission ('Caller must have edit') and the mandatory fresh-read workflow for baseUpdatedAt, giving unambiguous selection and invocation guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_update_worldUpdate an imagine worldAIdempotentInspect
PUT updates to one world by id. Caller must have 'edit' access (the owner, a contributor, or an admin with Admin Mode on). showInvite changes only for the world's owner or an admin with Admin Mode on; from a contributor it is ignored. Only supplied fields are sent; imagine merges them onto the existing document. REQUIRES baseUpdatedAt: copy updatedAt from a fresh imagine_get_world read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the world. | |
| link | No | URL-safe slug for the world (lowercase letters, digits, hyphens). Imagine auto-suggests at create time when omitted. | |
| menu | No | Site menu entries — label + optional link/pageId/order. | |
| name | No | World name. | |
| image | No | ||
| active | No | ||
| public | No | Whether the world is public. Only Premium, VIP, and admin accounts can change whether a world is public; the server refuses the change from anyone else. A new world is public unless set otherwise. | |
| favicon | No | ||
| summary | No | Short summary; capped at 255 characters. Cross-app convention (per dev-sites/AGENTS.md); the Mongoose World schema still accepts up to 500 as a legacy inconsistency being migrated, but new authoring should keep summaries under 255. | |
| calendar | No | Optional calendar definition (months[] + eras[]). | |
| keywords | No | ||
| showInvite | No | Whether the world's public page shows an invite button. Only the world's owner or an admin with Admin Mode on can change it; a contributor's value is ignored. | |
| description | No | Full world description. Markdown supported. | |
| customDomain | No | Optional custom domain pointing at the world's public site. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| imageCarousel | No | ||
| isExampleWorld | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) by disclosing merge semantics ('only supplied fields are sent; imagine merges them'), optimistic-concurrency behavior (stale/fabricated baseUpdatedAt → OUT_OF_SYNC with nothing written), and field-level permission nuance (showInvite ignored for contributors). This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation, then permissions, then merge behavior, then the critical baseUpdatedAt requirement. Four tight sentences with no filler; each clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter, nested-object mutation tool with an output schema, the description covers the highest-risk aspects (access control, merge semantics, concurrency guard) and defers return values to the output schema. Nothing essential to a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 65%, but the description compensates by explaining the two most consequential parameters: baseUpdatedAt (how to obtain it, why it is required, the rejection behavior) and showInvite (who may change it). It does not add syntax detail for the remaining nested/optional fields, which the schema partially covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with explicit scope: 'PUT updates to one world by id.' It also names the sibling read tool (imagine_get_world) it depends on, so an agent can distinguish this world-level update from the world-page and adventure update siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisites (must have 'edit' access as owner, contributor, or admin with Admin Mode) and the mandatory workflow (copy updatedAt from a fresh imagine_get_world read first). It does not explicitly name when to choose this over imagine_update_world_page, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imagine_update_world_pageUpdate a world pageAIdempotentInspect
PUT updates to one world page by id. Only supplied fields are sent. Caller must have 'edit' on the world page. Imagine REPLACES the content body with whatever you send. To append, fetch the page first with imagine_get_world_page, concatenate, and send the combined body back. REQUIRES baseUpdatedAt: copy updatedAt from a fresh imagine_get_world_page read of this page; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written — writing from memory of an earlier read is not possible. Set visibility: 'gm' to make a page GM-only (the world's owner, contributors, and an admin with Admin Mode on only; hidden from and 404 for everyone else), 'masked' to keep it participating in lists/backlinks under maskName with the real identity hidden, or 'public' to reveal it. Hidden pages are stripped from the world menu.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | World page id. | |
| link | No | URL-safe slug. Lowercase letters, numbers, hyphens, slashes. Choosing a page link needs Premium, VIP, or admin: without it, create ignores the link and derives one from the name, and an update that changes it is refused. | |
| name | No | Page name. | |
| tags | No | Tag list. Stored as a comma-separated `keywords` string on the wire. | |
| image | No | ||
| active | No | ||
| aliases | No | ||
| content | No | Page body in markdown. Imagine renders this verbatim. REPLACED wholesale on update. | |
| details | No | ||
| gmNotes | No | GM-only notes attached to the page. | |
| ruleset | No | ||
| summary | No | Short page summary; capped at 150 characters by imagine. | |
| maskName | No | What everyone who does not edit the world (its owner, a contributor, or an admin with Admin Mode on) sees instead of the page's name while visibility is 'masked'. Empty renders as 'Redacted'. | |
| parentId | No | Mongo `_id` of the parent world page (tree structure). | |
| template | No | ||
| eventDate | No | Optional in-world event date for chronology-shape pages. | |
| menuLabel | No | ||
| menuOrder | No | ||
| showInMenu | No | ||
| visibility | No | Page visibility. 'gm' pages exist only for the world's owner, its contributors, and an admin with Admin Mode on — every other viewer gets a 404 and the page is absent from lists, search, backlinks, and breadcrumbs. 'masked' pages participate in lists, tags, backlinks, and breadcrumbs but present maskName/maskSummary and an id-based URL to everyone else; the real name, link, content, and aliases stay hidden until the page is flipped to public. Hidden pages are barred from the world menu. Default: 'public'. | |
| maskSummary | No | Optional teaser everyone who does not edit the world sees on the masked page; the real summary and content stay hidden. Max 255 characters. | |
| documentType | No | ||
| isWorldChild | No | ||
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| outboundLinks | No | ||
| relationships | No | ||
| showBreadcrumbs | No | ||
| vaultCharacterId | No | Bind this page to a vault character (for character-shape world pages). | |
| playCampaignCharacters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=false, idempotentHint=true, and destructiveHint=false, the description goes well beyond them: it discloses the wholesale content replacement, the OUT_OF_SYNC rejection of stale/memorized tokens with 'nothing is written', the visibility side effects (404s, list/backlink participation, menu stripping), and that follow-up writes must use the updatedAt returned by this call. That is dense, actionable behavioral context for a 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The four paragraphs are front-loaded with the highest-risk facts first (id, replace semantics, permission, sync token) and every sentence is functional. The one cost is redundancy: the baseUpdatedAt and visibility passages restate, nearly verbatim, what the schema's own property descriptions already say, which inflates length without adding new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 29-parameter, nested-object mutation on a permissioned resource with an output schema present, the description covers the workflow (read-then-write), authorization, failure mode with error code, destructive side effect, and visibility semantics. Nothing an agent needs to call this safely is missing, and 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 48% across 29 parameters, so the description is expected to carry weight; it does so for the three riskiest fields (content replacement, baseUpdatedAt freshness/OUT_OF_SYNC, and the three visibility modes), but leaves the majority of parameters (image, active, aliases, ruleset, template, menu ordering, etc.) to the schema alone. Strong on the fields that cause damage, silent on the rest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: 'PUT updates to one world page by id', and immediately clarifies partial-update semantics ('Only supplied fields are sent'). This cleanly separates it from imagine_create_world_page, imagine_get_world_page, and imagine_update_adventure_page without the agent needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the permission prerequisite ('edit' on the world page), the mandatory baseUpdatedAt precondition, and gives an explicit alternative path when a different intent is present ('To append, fetch the page first with imagine_get_world_page, concatenate, and send the combined body back'). The replace-vs-append distinction is exactly the when/when-not guidance an agent needs before writing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_submissionsList my bug reports and requestsARead-onlyIdempotentInspect
List the calling user's own submissions (bug reports and feature requests) with each one's status: new, reviewing, clarification (Embers is waiting on the user), planned, resolved, declined, or closed (read-only, 30 days after resolved or declined).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context by explaining the meaning of the 'clarification' status (Embers is waiting on the user) and the 'closed' status read-only behavior, which goes beyond the schema. It does not mention ordering, pagination, or rate limits, but these are not critical for a simple read-only list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the primary action and scope, then efficiently packs the status list with useful clarifications. Every element earns its place, and there is no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (no parameters, simple listing operation) and the presence of an output schema (which the description need not explain), the description is complete. It specifies exactly what is returned (submissions with statuses) and adds value by explaining the meaning of two important statuses. An agent can invoke this tool correctly with no additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, and the schema coverage is 100% (empty object). With no parameters to document, the description naturally does not add parameter-level detail. The baseline score of 4 for 0-parameter tools applies here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and scope ('the calling user's own submissions'), specifies the resource type ('bug reports and feature requests'), and enumerates all possible statuses. This distinguishes it from sibling tools like get_submission (retrieves one submission) and create_submission (creates one).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this is for listing the caller's own submissions, which distinguishes it from any hypothetical tool that lists all submissions. However, it does not explicitly reference sibling tools like get_submission for single-item retrieval or mention when not to use it, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rulesetsList allowed rulesetsARead-onlyIdempotentInspect
Return the ruleset codes the calling user is permitted to use across the Embers ecosystem. Includes the always-public rulesets plus any restricted rulesets the user has been granted access to. Use this before populating any ruleset selector or before filtering vault/play/imagine results by ruleset.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds value by explaining that it returns user-specific permitted codes and includes both public and restricted entries, which goes beyond the annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The action and scope are front-loaded, and the usage guidance is brief and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (no parameters, output schema exists), and the description fully covers what it returns and when to use it. Nothing missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema coverage is trivially 100%, and the baseline is 4. The description correctly omits parameter details because none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb 'Return' and the resource 'ruleset codes the calling user is permitted to use'. It distinguishes itself by mentioning the inclusion of always-public and restricted rulesets, and its unique role among siblings (no other tool lists permitted rulesets).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this before populating any ruleset selector or before filtering vault/play/imagine results by ruleset', giving clear guidance on when to invoke it. It does not mention when not to use it or alternatives, but given the unique purpose, this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_accept_friend_requestAccept a friend requestAIdempotentInspect
Accept a pending friend request directed at the calling user. Pass friendId — the _id of the friend record on the calling user's friends list (from play_list_pending_friends), NOT the requester's user id.
| Name | Required | Description | Default |
|---|---|---|---|
| friendId | Yes | `_id` of the friend record on the calling user's friends list. NOT the other user's id. Use play_list_pending_friends (for accept/decline) or play_list_my_friends (for remove) to obtain it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description makes clear this is an action on a pending friend request, which is consistent with the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true). It does not add much behavioral context beyond what the annotations and verb already convey, such as what state changes occur or what happens on success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no filler. The action is stated first, and the parameter warning is front-loaded with the most important clarification about what friendId is not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with 100% schema coverage, a clear description, an output schema, and annotations covering idempotency and destructiveness, nothing essential is missing. The description gives the agent enough to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents friendId. The description reinforces the critical distinction that friendId is the friend record's _id, not the requester's user id, but it does not add meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: accept a pending friend request directed at the calling user. It distinguishes itself from related friend-request siblings by emphasizing that the request must be pending and targeted at the caller, so an agent can tell it apart from send, decline, cancel, or remove.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: there is a pending friend request directed at the calling user. It also routes the agent to play_list_pending_friends as the source for the required ID. It does not explicitly name alternatives like play_decline_friend_request, but the usage context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_add_campaign_characterAdd a character to a campaignAInspect
Attach a vault character to a play campaign so the character participates in play. Play places the attachment on the campaign leg matching the vault character's own ruleset — the campaign must have an active leg for that ruleset. Caller must hold a seat at the table (the campaign's owner, or an accepted gamemaster or player) and be able to edit the character (its owner, or an admin with Admin Mode on). Use vault_search_characters to locate the character id first.
| Name | Required | Description | Default |
|---|---|---|---|
| npc | No | true if this character is added as a DM-controlled NPC; false / omitted = player character. | |
| campaignId | Yes | Campaign id. | |
| characterId | Yes | Vault character id to add. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply the generic mutation profile (not read-only, not idempotent, not destructive, closed-world). The description goes well beyond them by disclosing the leg-matching mechanic, the active-leg prerequisite, and the concrete authorization requirements (owner/accepted GM or player seat, owner or Admin Mode).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose and mechanic first, then preconditions and auth, then the lookup hint. No filler, no repetition of schema fields, and every sentence carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, permission-gated tool, the description covers the action, its placement rule, the prerequisite state, and the authorization model; an output schema exists so return values need not be described. 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.
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 campaignId, characterId, and the npc flag; baseline is therefore 3. The description adds only the sourcing hint for characterId and omits any discussion of the npc parameter's DM-controlled semantics, so it adds marginal value only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Attach a vault character to a play campaign') and immediately explains the effect: the character participates in play and the attachment lands on the campaign leg matching the character's ruleset. This is precise enough to distinguish it from sibling attachment tools like play_add_campaign_item or vault_attach_companion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions - the campaign must have an active leg for the character's ruleset, the caller must hold a seat, and must be able to edit the character - plus a routing hint to vault_search_characters for the id. It does not name explicit alternatives or a when-not-to-use case, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_add_campaign_itemAdd an item to a campaign's allowlistAInspect
Add a vault item to a campaign's allowlist. The item always lands on the leg matching the ITEM's own ruleset — the campaign must have a leg for that ruleset or play answers 400. The optional ruleset param never retargets; it only confirms the expected leg, and a mismatch answers 400. Caller must be the campaign's owner, a gamemaster or player with an accepted seat (watchers excluded), or an admin with Admin Mode on.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Vault document id (`itemId`). Required. | |
| ruleset | No | Optional confirmation of the target leg's ruleset. The entity always lands on the leg matching its OWN ruleset — this param never retargets; when present, play verifies it matches that leg and answers 400 on a mismatch. Omit unless you want the placement double-checked. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-readonly, open-world, non-idempotent, non-destructive. Description adds critical behavior: ruleset-based placement, 400 on missing leg or ruleset mismatch, and authorization requirements (owner, gamemaster, player with accepted seat, admin with Admin Mode). This goes well beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and placement, then permissions. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers placement rules, error conditions, and authorization. Output schema exists, so return values needn't be explained. Missing explicit mention of idempotency or side effects beyond allowlist addition, but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description clarifies that the `ruleset` param never retargets and only confirms the expected leg, adding meaning beyond the schema's description, which already says similar but the tool description reinforces the 'never retargets' point.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Add') and resource ('vault item to a campaign's allowlist'), clearly distinguishing from siblings like play_add_campaign_character or play_add_campaign_spell.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains that the item lands on the leg matching its own ruleset and that the campaign must have a leg for that ruleset, else 400. Implicitly gives when-to-use and constraints, but doesn't explicitly name alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_add_campaign_legAdd a ruleset leg to a campaignAInspect
Add a new active leg to a campaign for the given ruleset, letting the same campaign (same sessions, players, and history) also run under that ruleset. The new leg starts empty — no rules, items, spells, or characters; fill it with the add tools. One leg per ruleset: play answers 409 if a leg for this ruleset already exists. Caller must be the campaign owner or an accepted gamemaster; ordinary players get 403.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset | No | Ruleset code for the new leg; list_rulesets returns the codes this account can use. Required. One leg per ruleset — play answers 409 if the campaign already has a leg for this ruleset, 400 for an unknown code, and 403 for a ruleset this account is not entitled to. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that the new leg starts empty (no rules/items/spells/characters), that duplicate ruleset legs yield a 409, and that the caller must be the owner or an accepted gamemaster or receive a 403. These are exactly the preconditions and side effects an agent needs for a non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the empty-leg behavior, then the constraint and auth in a compact, well-ordered three-sentence block with no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 no explanation; the description covers authorization, emptiness, and the duplicate-ruleset error path, leaving nothing an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 both parameters including the 400/403/409 error conditions for the ruleset code. The description only restates 'for the given ruleset' and the 409, adding little beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a new active leg to a campaign for the given ruleset') and explains the concept of a 'leg' as the same campaign running under another ruleset. This clearly distinguishes it from the sibling add tools (play_add_campaign_rule/item/spell/character) which fill the leg rather than create it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the scenario for the call and routes the agent onward ('fill it with the add tools'), and gives the selection constraint 'one leg per ruleset'. It does not name an explicit alternative tool, but there is no direct competing tool, so the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_add_campaign_ruleAdd a rule to a campaign's allowlistAInspect
Add a vault rule to a campaign's allowlist. The rule always lands on the leg matching the RULE's own ruleset — the campaign must have a leg for that ruleset or play answers 400. The optional ruleset param never retargets; it only confirms the expected leg, and a mismatch answers 400 (e.g. "This rule is X, not Y"). Caller must be the campaign's owner, a gamemaster or player with an accepted seat (watchers excluded), or an admin with Admin Mode on.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleId | Yes | Vault document id (`ruleId`). Required. | |
| ruleset | No | Optional confirmation of the target leg's ruleset. The entity always lands on the leg matching its OWN ruleset — this param never retargets; when present, play verifies it matches that leg and answers 400 on a mismatch. Omit unless you want the placement double-checked. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (readOnly=false, idempotent=false, openWorld=true); the description adds substantive behavior beyond that: the rule always lands on the leg matching its own ruleset, the campaign must have that leg, the optional param never retargets, and two distinct 400 conditions with an example message. Authorization is also fully enumerated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then behavior, then authorization; every sentence carries distinct information with no filler. It is dense and packs three edge cases into one paragraph, which is justified but leaves little breathing room.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 no explanation, and the description covers the remaining gaps: placement semantics, both error conditions, and the full authorization matrix. Nothing an agent needs 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.
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: it clarifies that placement is governed by the RULE's own ruleset (not the caller or the campaign) and that `ruleset` is a confirmation-only field with a documented failure mode. This goes slightly beyond the schema's own wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a vault rule to a campaign's allowlist'), which cleanly distinguishes it from play_remove_campaign_rule and the sibling add tools (play_add_campaign_spell/item/character). An agent can identify the operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition for use ('the campaign must have a leg for that ruleset or play answers 400') and spells out who may call it. It does not name an alternative tool or a when-not scenario, but the context is clear enough to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_add_campaign_spellAdd a spell to a campaign's allowlistAInspect
Add a vault spell to a campaign's allowlist. The spell always lands on the leg matching the SPELL's own ruleset — the campaign must have a leg for that ruleset or play answers 400. The optional ruleset param never retargets; it only confirms the expected leg, and a mismatch answers 400. Caller must be the campaign's owner, a gamemaster or player with an accepted seat (watchers excluded), or an admin with Admin Mode on.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset | No | Optional confirmation of the target leg's ruleset. The entity always lands on the leg matching its OWN ruleset — this param never retargets; when present, play verifies it matches that leg and answers 400 on a mismatch. Omit unless you want the placement double-checked. | |
| spellId | Yes | Vault document id (`spellId`). Required. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the leg-routing rule (the spell always lands on the leg matching its own ruleset), the two 400 failure conditions, and the precise authorization model (owner, GM, accepted-seat player, admin with Admin Mode; watchers excluded). This is exactly the operational 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler, and the core placement rule is front-loaded ahead of the failure conditions and auth requirements. Every sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 placement semantics, error conditions, and authorization fully. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 restates the ruleset param's non-retargeting/confirmation behavior, which is already spelled out verbatim in the schema; it adds little parameter meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a vault spell to a campaign's allowlist'), which cleanly distinguishes it from the sibling play_add_campaign_item, play_add_campaign_rule, and play_remove_campaign_spell. An agent can identify what the tool does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: the campaign must already have a leg for the spell's ruleset or the call answers 400, and the caller must hold an owner/gamemaster/accepted-seat/admin role. It does not name sibling alternatives (e.g., the remove counterpart) or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_cancel_friend_requestCancel a friend requestADestructiveIdempotentInspect
Cancel a friend request the calling user previously sent. Pass friendId — the _id of the friend record on the calling user's own friends list (the one the caller initiated).
| Name | Required | Description | Default |
|---|---|---|---|
| friendId | Yes | `_id` of the friend record on the calling user's friends list. NOT the other user's id. Use play_list_pending_friends (for accept/decline) or play_list_my_friends (for remove) to obtain it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as destructive and idempotent. The description adds meaningful behavioral context beyond those hints: it can only cancel requests the calling user initiated, and it targets the friend record on the user's own friends list, not the other user's id. This helps the agent avoid common misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with no filler. The action and the key disambiguation are front-loaded, and the parameter guidance is placed exactly where it is relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, output-schema-bearing mutation tool with annotations covering destructiveness and idempotency, the description is complete. It identifies the target, the required parameter, how to source that parameter, and the boundary of what it can cancel.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds value by emphasizing that friendId is the friend record on the caller's own friends list and specifically the one the caller initiated, and by directing the agent to the sibling list tools that produce this value. This goes slightly beyond the schema's own wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Cancel') and resource ('a friend request the calling user previously sent'), and clarifies scope by noting it must be a request the calling user initiated. This clearly distinguishes it from siblings like play_accept_friend_request, play_decline_friend_request, and play_remove_friend.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when the tool applies (only to requests the calling user previously sent) and the parameter description points to play_list_pending_friends and play_list_my_friends as sources for the required friendId. It does not explicitly state when NOT to use this tool versus decline or remove, but the caller-initiated qualifier largely disambiguates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_check_recap_existsCheck if the user already wrote a recap for a sessionARead-onlyIdempotentInspect
Cheap boolean check — returns { exists: boolean } for whether the calling user has an active player-recap page attached to the given session. Use this to gate play_create_page so you don't write a duplicate recap.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Mongo `_id` of the session. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description is not burdened with those. It adds value by stating it's a 'cheap boolean check' and scoping to the 'calling user' and 'active player-recap page,' which are behavioral details beyond the schema. It does not mention error conditions, but given the simplicity and annotation coverage, this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The core purpose and return shape are front-loaded in the first sentence, and the usage guidance in the second. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple existence check with one well-documented parameter, annotations covering safety, and an output schema hinted in the description, nothing essential is missing. The description covers the return value, scope, and intended usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for sessionId, so the schema fully documents the parameter. The description does not add any extra semantics beyond what the schema provides, thus the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb (check) and resource (recap existence) with a precise return contract ({ exists: boolean }). It differentiates itself from siblings like play_create_page by focusing on the read-only existence check, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use it: 'Use this to gate play_create_page so you don't write a duplicate recap.' This names the alternative tool and the condition that selects this check, providing direct and unambiguous guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_consume_pbem_emailsLink inbox emails to a moveAInspect
Mark inbox emails consumed and link them to the move they were collated into. Use after play_create_move / play_update_move when building a move from emails. Only 'new' items in the move's campaign are affected. GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| moveId | Yes | The move the items were collated into. | |
| itemIds | Yes | Inbox item ids that were collated into the move. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a mutation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds valuable behavioral context beyond annotations: it marks emails as consumed, links them to a move, restricts effects to 'new' items, and notes GM-only access. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero fluff: action, usage timing, and scope condition. The core function is front-loaded, and every sentence earns its place. The GM-only note is concise and necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter tool with an output schema and annotations, the description covers when to use, what it does, and its scope. It could clarify what 'consumed' means for the inbox (e.g., removal vs. archiving) or define 'new', but these are minor given the output schema likely conveys return state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented. The description adds a behavioral constraint ('Only new items... affected') that indirectly relates to itemIds, but it does not add parameter-specific meaning beyond schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Mark inbox emails consumed and link them to the move'), a clear resource and target, and the use context ('after play_create_move / play_update_move'). It distinguishes from sibling PBEM tools by specifying 'consumed' and 'collated into', which implies a state change tied to a move rather than simple dismissal or resolution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use the tool: after play_create_move/play_update_move when building a move from emails. It also gives a scoping condition ('Only new items... affected'). It does not list alternatives or explicit when-not-to-use scenarios, but the context is clear enough for correct routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_create_campaignCreate a play campaignAInspect
Create a new campaign owned by the calling user. Required: name. ruleset becomes the campaign's first leg (campaigns hold ruleset-specific material in per-ruleset legs; add more with play_add_campaign_leg). Play writes only name, summary, description, image, public, hideSections, dismissedSessionZeroNudge, xCardEnabled, and showCreatureDetails at create and ignores any other field; seats come from the invite tools. Creating it public needs Premium, VIP, or admin.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name. Required. | |
| image | No | Image URL. Stored as a plain string. | |
| public | No | Whether non-members can see the campaign. Making the campaign public needs Premium, VIP, or admin. | |
| ruleset | No | Ruleset code; list_rulesets returns the codes this account can use. Becomes the campaign's first leg. Play enforces required and a known code on the backend (400) and answers 403 for a ruleset this account is not entitled to; the gateway lets it be omitted so the LLM gets a clean backend error if it forgets. | |
| summary | No | Short campaign summary. Max 150 characters. | |
| description | No | Full campaign description. Markdown supported. | |
| hideSections | No | ||
| xCardEnabled | No | ||
| showCreatureDetails | No | Whether players see a creature's details (its health and armor class, per ruleset) at the top of a token's details on the campaign's battlemaps. A battlemap shows them only when every one of its campaigns has this on. Off by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by listing the exact field whitelist Play persists at create time and stating that any other field is silently ignored. It also discloses the entitlement rule for `public` (Premium/VIP/admin) and the backend error semantics (400 for bad ruleset, 403 for unentitled ruleset), which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb, ownership, and the required parameter in the first sentence, then packs constraints and routing into the rest. Dense and mostly waste-free, though the trailing clause about the gateway letting `ruleset` be omitted is verbose relative to its value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations are present, so the description only needs creation semantics, which it covers thoroughly including the field whitelist and entitlements. Minor gaps remain on the nested `hideSections` object and the undescribed `xCardEnabled` flag.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds real meaning over the 78%-covered schema: `ruleset` is not just a tag but becomes the first leg, and the description enumerates which of the nine parameters are actually written. It does not explain `hideSections` sub-keys or `xCardEnabled`, which remain undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('Create a new campaign') plus ownership scope ('owned by the calling user'). It distinguishes itself from play_update_campaign and from leg/seat operations by naming play_add_campaign_leg and the invite tools as the means to extend a campaign.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the only required field (name) and routes follow-up work to alternatives: more legs go to play_add_campaign_leg, players go to the invite tools. It does not cover when a caller should prefer e.g. imagine_create_adventure instead, so it stops just short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_create_moveCreate a moveAInspect
Record a new play-by-email move on a campaign. Required: campaignId. Optional: name (defaults 'Move '), number (defaults next-in-sequence), date dd/mm/yy (defaults today), description, sessionId (chapter), parentId (child scene; excludes sessionId), playerIds (visibility restriction to listed campaign players). GM-only: caller must be the campaign owner or an accepted gamemaster.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Move date in `dd/mm/yy` format. Defaults to today on create. Play parses this server-side on both create and update. | |
| name | No | Move name / title (e.g. 'Move 185', 'Interlude 12'). Defaults to 'Move <number>' when omitted on create. | |
| number | No | Game label number. Non-unique (parallel scenes share one). Defaults to the campaign's high-water + 1 on create. Display position is `order`, not this. | |
| parentId | No | Parent move, making this a child scene (split party). Same campaign only, one level deep (a child cannot be a parent; a move with children cannot become a child). Children render on the parent's page, stay out of the feed and chapter lists, and cannot carry a sessionId. Pass null to detach back into the feed. | |
| playerIds | No | Visibility restriction: user ids from the campaign's player roster. Empty/omitted = visible to every campaign participant. When set, the move is invisible to players not listed (dropped from lists, 404 on read); the GM always sees it. Pass [] on update to reopen the move to everyone. | |
| sessionId | No | Chapter session to group this move under. Must belong to the same campaign. Pass null to detach the move back to the unchaptered feed. | |
| campaignId | Yes | Campaign the move belongs to. Required. Caller must be the campaign owner or an accepted gamemaster. | |
| description | No | The collated round: GM narration, player contributions, rolls. Markdown supported. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide only false hints, so the description carries most of the behavioral disclosure burden. It does so well by revealing the GM-only requirement, defaulting behavior for name/number/date, and visibility restrictions via playerIds. It does not describe the response shape, but an output schema exists, and the description does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well organized: a one-line purpose, then required vs. optional parameters, then the GM-only constraint. Every sentence earns its place, and the core action is front-loaded. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter creation tool, the description together with the fully covered schema and output schema gives an agent everything needed to call it correctly: required campaignId, default behaviors, key constraints, and authorization. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed parameter explanations already present, so the baseline is 3. The description condenses important information such as 'parentId (child scene; excludes sessionId)' and 'playerIds (visibility restriction)', but it mostly mirrors the schema rather than adding new semantic meaning. It is useful for quick scanning but does not materially extend the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Record a new play-by-email move on a campaign.' This clearly distinguishes it from sibling tools like play_create_session or play_create_page, and the PBEM qualifier makes the domain explicit. Even without reading the schema, an agent knows exactly what artifact this tool creates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: creating a new move, with campaignId required. It also gives an important exclusion (parentId excludes sessionId) and a caller restriction (GM-only: campaign owner or accepted gamemaster). However, it does not explicitly name alternatives such as play_update_move for editing existing moves, so it falls just short of the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_create_pageCreate a pageAInspect
Create a new page. Required: name. Set documentType: 'player-recap' and ref: { refType: 'session', refId: <sessionId> } to make a session recap — play sends notifications to the other campaign players on recap create. Before creating a recap, call play_check_recap_exists first to avoid duplicates.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | What the page is attached to. Required for character notes; optional for free-form pages. Allowed on update too (Mongoose has no immutability constraint), though re-anchoring a page is unusual. | |
| link | No | URL-safe slug. Lowercase letters, numbers, and hyphens only. Setting or changing a page link needs Premium, VIP, or admin. | |
| name | Yes | Page name / title. Required. | |
| active | No | ||
| public | No | ||
| summary | No | Short page summary. Max 255 characters. | |
| keywords | No | Comma-separated keyword string. | |
| promptId | No | Mongo `_id` reference (24-character hex string). | |
| description | No | Markdown body. | |
| documentType | No | What kind of page this is. Defaults to 'generic'. Use 'player-recap' for a session recap. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the write/non-idempotent/non-destructive profile, and the description adds a genuine side effect not in structured fields: play sends notifications to other campaign players when a recap is created. It also discloses the duplicate-avoidance requirement. It omits permission requirements (the schema, not the description, notes link changes need Premium/VIP/admin).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, and the required parameter is front-loaded before the recap recipe and the prerequisite check. Every sentence carries actionable content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the required param, the primary recap workflow, the side effect, and the prerequisite call. Given 10 parameters and a permission-gated link field, a bit more on permissions/constraints would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3; the description earns above that by showing how name, documentType, and the nested ref object (refType: 'session', refId) combine into a working recap call, which the schema documents only field-by-field. It does not touch the remaining optional params (public, link, keywords), but those are reasonably covered by schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new page') and immediately narrows into a concrete sub-case (session recap via documentType/ref). It is clear what the tool does, but it does not explicitly distinguish itself from the many sibling create tools (imagine_create_adventure_page, play_create_session, etc.) sharing the same verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a real usage condition (set documentType: 'player-recap' plus ref to make a recap) and an explicit prerequisite: call play_check_recap_exists first to avoid duplicates. It names the alternative instead of leaving routing to inference, though it never states when a page should not be created or how it relates to play_update_page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_create_sessionCreate a sessionAInspect
Create a new session for a campaign. Required: campaignId and date (dd/mm/yy format). Other fields (name, description, planned battlemaps) are optional and pass through to play. Caller must be the campaign's owner, a gamemaster or player with an accepted seat (watchers excluded), or an admin with Admin Mode on.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Planned or actual session date in `dd/mm/yy` format. Required. | |
| name | No | Session name / title. | |
| image | No | ||
| status | No | ||
| summary | No | Short session summary. Max 150 characters. | |
| battlemaps | No | ||
| campaignId | Yes | Campaign the session belongs to. Required. | |
| characters | No | ||
| description | No | Session body / notes / recap. Markdown supported. | |
| sessionImages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a mutation (readOnlyHint=false) that is neither idempotent nor destructive. The description adds genuinely useful behavioral context beyond that: the exact authorization profile required and which fields flow through to the play service. It does not explain the consequences of the non-idempotent hint (e.g., duplicate sessions on repeat calls), which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose first, then required/optional fields, then authorization. Every sentence carries information and there is no filler, though the auth sentence is dense and could be slightly easier to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 described, and the description covers purpose, required inputs, and access control. It is nearly complete for a creation tool; the only shortfall is no note on the non-idempotent behavior or how duplicate/invalid sessions are handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so this field must compensate. The description names the two required params (campaignId, date with format) and lists three optional fields (name, description, planned battlemaps), but leaves image, status, summary, characters, and sessionImages undocumented in both places. Partial compensation warrants a baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a new session for a campaign'), which clearly distinguishes it from siblings like play_update_session, play_get_session, and play_create_campaign. An agent can identify the operation and 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the eligibility conditions for calling (owner, gamemaster, accepted-seat player, or admin with Admin Mode on; watchers excluded), which is meaningful context for selecting the tool. It does not, however, contrast with alternatives such as play_update_session or play_create_campaign, so it stops short of explicit when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_decline_friend_requestDecline a friend requestADestructiveIdempotentInspect
Decline a pending friend request directed at the calling user. Pass friendId from play_list_pending_friends.
| Name | Required | Description | Default |
|---|---|---|---|
| friendId | Yes | `_id` of the friend record on the calling user's friends list. NOT the other user's id. Use play_list_pending_friends (for accept/decline) or play_list_my_friends (for remove) to obtain it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, covering the mutation nature. The description adds the constraint that the request must be pending and directed at the calling user, and specifies the exact source for the ID, giving operational context beyond the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the purpose, the second tells how to obtain the parameter. Purpose is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter tool with an output schema present. The description covers the operation, the origin of the required ID, and implicitly its scope (pending, calling user). Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter description already includes the 'NOT the other user's id' clarification and the list-source guidance. The tool description's mention of friendId from play_list_pending_friends is redundant with the schema, so it adds minimal new meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Decline') and resource ('pending friend request') scoped to the calling user, and the qualifier 'pending' plus the source list clearly differentiates it from accept, cancel, and remove siblings. An agent knows exactly what this tool does and how it differs from peers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to pass friendId from play_list_pending_friends, and the schema description reinforces that play_list_pending_friends is for accept/decline while play_list_my_friends is for remove, effectively routing the agent to the correct list and tool for this operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_delete_campaignDelete a play campaignADestructiveIdempotentInspect
Permanently delete a campaign by id. Removes all of its sessions, invites, and members. Caller must be the campaign's owner or an admin with Admin Mode on; a gamemaster cannot delete it. Destructive. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is partly covered, but the description goes further by naming exactly what is destroyed (sessions, invites, members), stating permanence, and specifying the auth/Admin Mode requirement. That is the cascade and permission context an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences with the core action and cascade front-loaded, then constraints, then a safety instruction. Slight redundancy in the standalone 'Destructive.' sentence, which duplicates destructiveHint=true, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with an output schema present (so return values need not be explained), the description covers action, cascade effect, permissions, irreversibility, and confirmation. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` parameter is documented in the schema as the Mongo `_id`. The description only restates 'by id' and adds no format or sourcing guidance, so the schema carries this dimension. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Permanently delete) and resource (campaign by id), and immediately distinguishes it from sibling deletions like play_delete_session or play_delete_page by declaring the cascade: all sessions, invites, and members go with it. An agent can tell exactly what this tool does and its blast radius.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit authorization gates (owner, or admin with Admin Mode on) and an explicit exclusion (a gamemaster cannot delete it), plus a procedural instruction to confirm with the user first. This is when-to-use, when-not, and preconditions in one compact block.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_delete_characterDetach a character from playADestructiveIdempotentInspect
Detach a character from play's tracking. Removes any campaign references but does NOT delete the underlying vault character document. Caller must own the character, be an admin with Admin Mode on, or be the GM of the character's campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the play character record. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely useful context beyond that: exactly what is destroyed (campaign references), what is preserved (the vault document), and the authorization model required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the operation, the non-destructive caveat, then the permission model, ordered by importance. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need not be explained, and annotations cover the safety profile. Scope, side effects, and auth are all present; only reversibility/re-add semantics are left unstated, a minor gap for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single well-described 'id' parameter, so the schema carries the semantics. The description adds no format or usage detail for the parameter, making 3 the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Detach a character from play's tracking') and explicitly distinguishes itself from the sibling vault_delete_character by noting it 'does NOT delete the underlying vault character document.' An agent can route between the two 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear caller conditions ('must own the character, be an admin with Admin Mode on, or be the GM of the character's campaign'), which tells the agent who may invoke it. It implies but never explicitly states when to prefer this over vault_delete_character, so it stops short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_delete_moveDelete a moveADestructiveIdempotentInspect
Permanently delete a move by id. Its child moves are detached back into the feed, not deleted. GM-only. Destructive — the move's collated round text is lost. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the move. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true), the description adds substantial behavioral detail: deletion is permanent, collated round text is lost, child moves are detached back into the feed, and operator authorization is GM-only. This is exactly the context needed to use a destructive tool safely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying essential information: the core operation, the side-effect on child moves, and the authorization/destructive warning. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one fully documented parameter, a provided output schema, and rich annotations, the description still adds all necessary behavioral context: permanence, child-move behavior, GM restriction, lost text, and user confirmation. No relevant gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the only parameter, id, is already described as the Mongo _id of the move. The description confirms deletion happens 'by id' but adds no new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: permanently delete a move by its id. It also states the key nuance—child moves are detached, not deleted—which distinguishes it from related move/session tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when it applies (GM-only) and instructs the agent to confirm with the user first, which is critical usage guidance. It doesn't explicitly mention alternatives or excluded cases, but the GM-only gate and destructive warning provide clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_delete_pageDelete a pageADestructiveIdempotentInspect
Soft-delete a page by id (30-day TTL via deactivated_at, recoverable in the app UI within the window). Allowed for the page's owner, an admin with Admin Mode on, or the GM of the page's campaign for a page the table sees (a public page, or a GM-side page: dm-notes, campaign-logistics). A player's private pages and recaps answer to their author (or an admin with Admin Mode on) alone, and a character's player notes (player-notes) to the character's player (or an admin with Admin Mode on), never the GM. Destructive. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds value beyond them: the delete is soft with a 30-day TTL tracked via deactivated_at and is recoverable only in the app UI within that window. It also discloses the full authorization model, which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and reversibility window in the first clause; the dense authorization matrix is justified but jargon-heavy (dm-notes, player-notes, GM-side) and could be tightened. No wasted sentences overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be described, and annotations carry the safety profile. Together with the reversibility window and permission rules, the description covers everything an agent needs to decide whether it may call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id), and the schema already documents it at 100% coverage as the Mongo _id. The description's 'by id' adds no format, source, or lookup guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with the crucial qualifier 'soft-delete by id', which distinguishes it from a hard delete and from sibling deletes (play_delete_campaign, play_delete_session, imagine_delete_*_page). The TTL mechanism (deactivated_at) confirms the exact semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong preconditions — who may delete a page (owner, admin in Admin Mode, GM of a public or GM-side page) and who may not — plus an explicit 'Confirm with the user first' instruction. It stops short of naming an alternative tool or the inverse (e.g., how to restore), so it is clear context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_delete_sessionDelete a sessionADestructiveIdempotentInspect
Permanently delete a session by id, including its notes and any session-image / battlemap attachments. Caller must be the session's owner, an admin with Admin Mode on, or the campaign's GM (its owner or an accepted gamemaster); players get 403. Destructive. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them: it enumerates exactly what is destroyed (notes and attachments), specifies the authorization model, and states the 403 outcome for unauthorized callers. This is rich behavioral context layered on top of the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with zero filler, and the destructive scope is front-loaded before the authorization and confirmation guidance. Every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be explained. With the destructive scope, authorization rules, and confirmation nudge all present, an agent has everything needed to invoke this correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is already fully documented as the Mongo `_id`. The description only restates "by id" without adding format or sourcing detail, so it neither compensates for nor exceeds the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Permanently delete a session") and immediately defines scope by naming the collateral data removed (notes, session-image/battlemap attachments). This distinguishes it clearly from siblings like play_update_session and play_get_session without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit caller conditions (owner, admin with Admin Mode on, campaign GM or accepted gamemaster) and the negative case (players get 403), plus an operational instruction ("Confirm with the user first"). It doesn't name alternative tools, but the when-to-use/when-not guidance is concrete and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_disable_pbem_inboxDisable a campaign's PBEM inboxAIdempotentInspect
Disable the inbox: mail to the campaign's address stops routing (bounces at the webhook). The address is kept and re-enables unchanged. GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Mongo `_id` of the play campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains what actually happens: mail stops routing, bounces at the webhook, and the address is kept and can be re-enabled unchanged. This aligns with destructiveHint=false and idempotentHint=true while adding meaningful operational detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences deliver the action, the behavioral consequence, the preserved state, and the permission requirement. Every sentence earns its place and the key action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema and supportive annotations, this description is complete: it states who can use it, what happens to incoming mail, and what happens to the address. No critical decision-making information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single campaignId parameter is already fully documented in the schema. The description adds no additional parameter-level meaning beyond tying the action to 'the campaign's address,' which is appropriate given the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Disable the inbox' for a campaign's PBEM inbox. It also clarifies the concrete consequence—mail stops routing and bounces—and the retained address, clearly distinguishing it from enable or regenerate operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you want to disable a campaign's PBEM inbox while keeping the address, and it explicitly restricts usage to GMs. It does not explicitly name the sibling enable tool, but 're-enables unchanged' strongly implies the counterpart operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_dismiss_pbem_emailDismiss a PBEM inbox emailAIdempotentInspect
Mark an inbox email dismissed (misdirected mail, noise). The item is retained with status 'dismissed', not deleted. GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Mongo `_id` of the inbox item. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds specific behavioral detail beyond what annotations already provide: the item is retained, its status becomes 'dismissed', and it is not deleted. It also discloses the GM-only permission requirement, which is not present in annotations or schema. The description aligns with destructiveHint=false and idempotentHint=true, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences, no filler, and every element earns its place. The action is front-loaded, followed by the retention behavior and the GM-only restriction. This is efficient and easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with full schema coverage, annotations, and an output schema present, the description covers the action, the state change, the non-destructive nature, and the required role. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter itemId is already described as the Mongo _id of the inbox item. The description does not add further parameter-level detail, but since the schema fully documents the parameter, no additional compensation is required. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Mark an inbox email dismissed'. It also clarifies the purpose (misdirected mail, noise) and distinguishes the action from deletion by adding 'retained with status dismissed, not deleted'. This is clear and differentiates the tool from related PBEM email operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (misdirected/noise emails) and an access restriction ('GM-only'). It does not explicitly name alternative tools like play_resolve_pbem_email or state when not to use it, but the context is sufficient for an agent to make a reasonable choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_enable_pbem_inboxEnable a campaign's PBEM inboxAIdempotentInspect
Enable the play-by-email inbox on a campaign. Mints the campaign's unique inbound address on first enable (subsequent enables keep the existing address). Returns the pbem block including the address players CC. GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Mongo `_id` of the play campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by revealing that the first enable mints a unique inbound address, that subsequent enables preserve it, and that the return block contains the address players CC. It also discloses the GM-only access restriction. No contradiction with the idempotentHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core purpose front-loaded offense, followed by the most decision-relevant behavior and access restriction. Every sentence adds value with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with a rich output schema and annotations, the description provides the required accessibility role, idempotence behavior, return-value context, and parameter context. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single parameter as the Mongo _id of the play campaign, so the description does not need to add much. It only reinforces that the action targets a campaign, which is adequate given 100% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action ('Enable the play-by-email inbox') on a clear resource ('a campaign') and adds distinctive details about address minting. This distinguishes it from related siblings like play_disable_pbem_inbox and play_regenerate_pbem_address.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly specifies that this is a GM-only operation and describes what happens on repeated enables. It does not explicitly compare against sibling PBEM tools such as play_regenerate_pbem_address or play_consume_pbem_emails, but the intended invocation context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_find_friendFind a friend by name or emailARead-onlyIdempotentInspect
Search the play user directory by name or email substring. Used to locate a user before sending a friend request. Rate-limited by play to deter scraping.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Substring to search names and emails against. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false). The description adds non-obvious behavioral context beyond that: substring matching over names and emails, and rate-limiting imposed by the platform to deter scraping. This is useful operational information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the main action, the motivating use case, and a rate-limit caution. The verb and resource are front-loaded, and there is no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only search tool with an output schema present, the description covers what the tool does, why an agent would use it, and a key operational caveat. Nothing an agent needs to decide whether to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the query parameter is documented as 'Substring to search names and emails against.' The description essentially restates this scope, only adding that the search targets the 'play user directory.' With high schema coverage, the description need not add much parameter-level detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search the play user directory by name or email substring.' This clearly identifies the tool as a lookup operation and distinguishes it from sibling tools like play_send_friend_request or play_list_my_friends, since it is the discovery step rather than the action step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a concrete use case: 'Used to locate a user before sending a friend request.' This gives clear context for when to call the tool. It does not explicitly name alternatives or exclusions, but the intended position in the friend-request workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_get_campaignGet a play campaignARead-onlyIdempotentInspect
Fetch one campaign by id, including settings and any DM/player metadata. Readable by a participant (the owner, a gamemaster, a player, or a watcher), by anyone when the campaign is public, and by an admin with Admin Mode on. The campaign's ruleset-specific material lives in its legs array — one entry per ruleset, each carrying { ruleset, active, rules, items, spells, characters }; inactive legs are hidden from normal UI but never deleted. There is no campaign-level ruleset field. Defaults to a summary shape: each leg's raw rule/item/spell ObjectId arrays are replaced with resolved [{ _id, name }, ...] lists the LLM can act on. Pass detail: 'full' to receive the raw ObjectId arrays instead. Each leg's rules, items, and spells are the campaign's house rules in that leg's ruleset. The response's imagineWorldIds and imagineAdventures ([{ id, name }, ...], each adventure's current name) list the Imagine worlds and adventures linked to this campaign; they are read from the worlds' and adventures' own links and are read-only here (change them with the imagine link/unlink tools). The imagineAdventures ids are the valid values for a session's imagineAdventureId tag.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the campaign. | |
| detail | No | Response shape. 'summary' (default) trims raw-ObjectId arrays and full character sheets to a compact LLM-friendly form; 'full' returns the populated document with every field inline. | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial non-obvious behavior: inactive legs are hidden from UI but never deleted, there is no campaign-level ruleset field, imagine link data is read-only here, and access varies by role. This is well beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and the subsequent sentences each carry distinct information (legs shape, detail modes, imagine links). It is dense and reads as one continuous block, but the length is justified by the campaign model's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return-value explanation is optional, yet the description covers the leg structure, the summary/full shapes, and the imagine link arrays. Combined with the auth rules, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 explaining the semantic effect of `detail`: summary resolves raw ObjectId arrays into `[{ _id, name }, ...]` lists, while 'full' returns raw populated arrays. That meaning is not fully captured by the schema's own enum descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Fetch one campaign by id') and immediately scopes what is returned ('including settings and any DM/player metadata'). It also names the sibling tools responsible for mutation ('change them with the imagine link/unlink tools'), so an agent can distinguish read from list and link operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the authorization context: readable by a participant, by anyone if public, and by an admin with Admin Mode on. It also routes the agent to the imagine link/unlink tools for changes. It stops short of contrasting itself with play_list_my_campaigns or play_list_participated_campaigns, so it lacks a full when-not/alternative rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_get_character_noteGet a character note (DM or player)AIdempotentInspect
Fetch the DM-side or player-side note attached to a play character. Lazy-creates the note on first read if absent, so this endpoint always returns a note. Readable by the character's player (or an admin with Admin Mode on) and the campaign's GM; the DM-side note (dm-notes) is the GM's alone, and anyone else gets 403.
| Name | Required | Description | Default |
|---|---|---|---|
| characterId | Yes | Mongo `_id` of the play character (NOT the vault character id). | |
| documentType | Yes | Which note to fetch: 'dm-notes' (GM-only) or 'player-notes' (visible to the campaign). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a genuinely non-obvious behavior: lazy-creation on first read, which explains why readOnlyHint is false for a 'get' tool. It also spells out the authorization model, including the 403 condition for the GM-only dm-notes, none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, none wasted: purpose first, behavior second, permissions third. Dense but front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the definition need not explain return values; it fully covers the two things an agent needs beyond structured data – the lazy-create side effect and the access control rules.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 access semantics that map directly to documentType ('the DM-side note (dm-notes) is the GM's alone'). The characterId caveat lives only in the schema, so the description does not improve on both parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch the DM-side or player-side note attached to a play character') and immediately distinguishes the two document variants. An agent can tell it apart from play_update_character_note 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context on when this works and who can call it, plus the useful fact that it always returns a note. It does not explicitly route to play_update_character_note for writes, which is the obvious sibling, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_get_moveGet a moveARead-onlyIdempotentInspect
Fetch one move by id, including its full markdown body, plus a children array of its child scenes (split party) filtered the same way. A restricted move reads as 404 for players not on its list; the GM and an admin with Admin Mode on read every move. Readable by anyone who may view the move's campaign (a participant, anyone when the campaign is public, or an admin with Admin Mode on), and by the move's owner.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the move. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive. The description adds genuinely useful behavior: restricted moves return 404 for non-listed players, while the GM and Admin Mode admins bypass restrictions, and it discloses that children scenes are filtered the same way. That is real value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return shape, and every sentence carries information. The last two sentences overlap somewhat in restating access rules, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't be explained, and the description still covers the important edge case (404 for restricted moves) and the full permission model. Nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is a single parameter whose schema already documents it as the Mongo `_id`. The description only echoes 'by id', adding no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (one move by id) and further specifies the return shape (full markdown body plus a children array of split-party child scenes). This clearly separates it from list-type siblings like play_list_campaign_moves and play_list_session_moves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use ('by id', filtered children) and extensive access conditions, but never explicitly routes the agent away from alternatives such as play_get_page or play_list_campaign_moves. Clear context, no explicit when-not, so a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_get_pageGet a pageARead-onlyIdempotentInspect
Fetch one page by id, including its full markdown body. Readable by the page's owner or an admin with Admin Mode on; by the campaign's GM for a GM-side page (GM notes, logistics); and, for a public page, by anyone who may view its campaign (any participant, or anyone when the campaign is public); a public page with no ref (no campaign, session, or character) is readable by anyone. Returns { page, canEdit }; canEdit says whether this caller may update and delete the page. For a character's player notes it is the character's player's answer: the campaign's GM may update player notes through play_update_character_note but never delete them, so the GM gets canEdit: false here.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent, so the description focuses on the return shape ({ page, canEdit }) and explains exactly what canEdit means for each caller, including the subtle character-player-notes case where the GM gets canEdit: false. That is behavioral context beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The return type and canEdit semantics are front-loaded in the second sentence, with permission rules following. It is dense but every clause carries authorization or return-value meaning; a touch long for one param but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover safety, an output schema exists, the one param is fully documented, and the description supplies the remaining necessary context: access-control rules and the meaning of canEdit for each role. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is documented as the Mongo _id. The description adds the practical note that owner/GM/admin permissions determine readability, which matters for callers choosing an id, though it doesn't add format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch one page by id') and adds the distinguishing detail that the full markdown body is returned. The agent can tell it apart from list/update/delete page siblings immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The permission clauses give clear context for when this tool applies (owner, admin, GM-side page, public page) and reference the sibling play_update_character_note for a related operation. It doesn't explicitly state when NOT to use it versus play_list_pages or the capsules siblings, but the contextual guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_get_sessionGet a sessionARead-onlyIdempotentInspect
Fetch one session by id, including its notes, battlemap references, and session-image attachments. Readable by anyone who may view the session's campaign (a participant, anyone when the campaign is public, or an admin with Admin Mode on), and by the session's owner.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the session. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, destructiveHint and openWorldHint, so the safety profile is free. The description adds genuinely new context: the permissions model (participant, public campaign, Admin Mode admin, or owner). It omits what happens on a missing id or denied access, which keeps it short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the operation and its payload first, the access rule second. No filler, no repetition of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't be explained further, and the description still summarizes the key payload (notes, battlemap refs, images). With annotations covering the read-only/idempotent profile and the one param fully documented, an agent has everything needed to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single param already documents itself as the Mongo `_id`. The description's 'by id' adds no format, validation, or source-of-id detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('one session by id') and enumerates what the record includes (notes, battlemap references, session-image attachments). It implicitly contrasts with the list-style siblings (play_list_campaign_sessions, play_list_my_sessions) but never names an alternative, so differentiation is inferred rather than spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an authorization condition (who may read the session) rather than a usage rule for when to pick this tool over play_list_campaign_sessions or play_list_my_sessions. Usage is implied by 'by id' but no exclusions or alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_invite_campaign_playerInvite a player to a campaignAInspect
Send a campaign invite to another user. Caller must be the campaign's GM (its owner or an accepted gamemaster); players, watchers, and admins get 403. Play rate-limits this endpoint (per-caller and per-campaign) to deter spam.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Role to invite the user as. 'player' is the default and almost always what you want; 'watcher' is read-only; 'gamemaster' grants co-DM permissions. | player |
| userId | Yes | User id of the invitee. Required. Pair with play_find_friend if you only have a name or email; invite-by-email is not supported at this endpoint. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructive=false, idempotent=false); the description adds the authorization model (owner or accepted gamemaster required) and rate-limit behavior (per-caller and per-campaign) that annotations cannot express. These are exactly the failure modes an agent needs to anticipate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then permission, then rate limiting in descending order of importance. No sentence is filler and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Moderate-complexity mutation with a rich schema and an output schema, so return values need no explanation. Purpose, permissions, failure mode, and rate limits are all covered; the only omitted detail is duplicate/already-member behavior, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the role enum is already documented with meaning for player/watcher/gamemaster, so the schema carries the parameter burden. The description adds nothing about individual parameters, which is the expected baseline when coverage is this high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Send a campaign invite to another user.' Combined with the name, this is immediately distinguishable from the reciprocal sibling play_respond_to_campaign_invite and from play_send_friend_request; no ambiguity about the action performed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the decisive precondition for use (caller must be the campaign's GM) and an explicit exclusion (players, watchers, and admins get 403), which tells an agent when this call will fail. It stops short of routing to alternatives (e.g. invite-by-email or friend-request flows), so it is clear context without full when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_charactersList characters in a campaignARead-onlyIdempotentInspect
List the characters participating in a play campaign. Returns play-side character refs; pair with vault_get_character for full character data. Defaults to a summary shape (id, name, image, npc flag, short description); pass detail: 'full' to receive each character's full vault sheet inline. Each row's characterOwner is the vault character's own owner; that owner (or an admin with Admin Mode on) edits the sheet with vault_update_character, whoever attached it (owner) does not. Each row's status is its seat's (an inactive seat sits out of the table), and companionIds lists the character's Owned companions, who sit at the table with it.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Response shape. 'summary' (default) trims raw-ObjectId arrays and full character sheets to a compact LLM-friendly form; 'full' returns the populated document with every field inline. | summary |
| campaignId | Yes | Mongo `_id` of the campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond by disclosing default response shape, the ownership distinction between `owner` and `characterOwner` (including edit rights), that `status` reflects the seat's state, and that `companionIds` enumerates Owned companions seated with the character. That is substantial behavioral context not available from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and zero filler; every clause carries a semantic payload. Some sentences are dense run-ons about ownership and seats, but nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param read tool with full schema coverage, annotations, and an output schema, the description covers everything an agent needs: what it lists, response shape options, and the meaning of the less-obvious returned fields. Return-format detail is appropriately delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 descriptionadds practical meaning to `detail` by enumerating the summary fields (id, name, image, npc flag, short description) and clarifying 'full' returns the vault sheet inline. campaignId gets no added meaning, but the enriched enum guidance lifts this above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'List the characters participating in a play campaign.' It distinguishes itself from vault_get_character by noting it returns play-side refs rather than full sheets, though it never explicitly contrasts with close siblings like play_list_campaign_players or play_list_campaign_companions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable routing: pair with vault_get_character for full data, or pass detail: 'full' to get sheets inline. It also clarifies who may edit (characterOwner or admin with Admin Mode) via vault_update_character. No explicit 'when not to use' statement, but the alternatives are named with conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_companionsList companions in a campaignARead-onlyIdempotentInspect
List the companions (buddies) attached to a play campaign's characters — the supporting cast a table sees beyond the roster. Read-only; the tie itself is managed on the vault character sheet (vault_attach_companion / vault_detach_companion). Monster-typed companions are excluded server-side. One entry per (Main, companion) pair, so a companion linked by two characters appears twice; each entry carries companionOf: { characterId, name, userId } naming the character it accompanies, canEdit (whether the caller may edit the companion character), canOpenInVault (whether the caller may open it in the vault: its editor, the campaign's GM, or whoever may edit the Main it is tied to), plus display fields (name, type, ruleset, image, description) and a projected primaryToken slice or null. Pair with vault_get_character on companionCharacterId for the companion's full sheet.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Mongo `_id` of the campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the read-only/idempotent/non-destructive profile, and the description adds substantial information beyond them: monster-typed companions are excluded server-side, entries are per (Main, companion) pair so duplicates are expected, and it decodes permission-bearing fields (canEdit, canOpenInVault) including who qualifies for vault access. That is exactly the kind of edge-case and authorization context annotations can't express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded and every sentence carries some information, but the later half enumerates return fields (companionOf, canEdit, canOpenInVault, display fields, primaryToken) in a single dense paragraph — much of which an output schema already covers. Slightly overwritten, though not wasteful enough to penalize heavily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter list tool, the description covers scope, sibling routing, permission semantics, duplication behavior, server-side filtering, and the natural follow-up call. Nothing an agent needs to invoke or interpret the result is missing, even setting the output schema aside.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter (campaignId) is already documented in the schema as the campaign's Mongo _id. The description adds no further meaning about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the companions (buddies) attached to a play campaign's characters') and immediately scopes it ('the supporting cast a table sees beyond the roster'), which cleanly separates it from the sibling play_list_campaign_characters. An agent can identify the tool's job 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the management counterparts (vault_attach_companion / vault_detach_companion) so the agent knows this tool isn't the place to mutate ties, and it prescribes the follow-up call ('Pair with vault_get_character on companionCharacterId'). It stops short of an explicit when-not-to-use statement or a direct contrast with sibling list tools, so it's strong context without full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_itemsList items allowed in a campaignARead-onlyIdempotentInspect
List the campaign's house items: the items it holds as active house-rule associations. Subset of the broader vault catalog. Each sits on the leg matching its own ruleset: omit ruleset to list the items across every leg, or set it to scope the list to that one leg.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset | No | Optional leg filter. Omitted, the list unions entries across every leg of the campaign; set to a ruleset to scope the list to that leg only. | |
| campaignId | Yes | Mongo `_id` of the campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the full safety profile (readOnly, idempotent, non-destructive, closed-world), and an output schema exists, so the description's job is to add domain context. It does so by defining the 'house item' subset relative to the broader vault catalog and by explaining the leg/ruleset scoping model, which is real behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with the core purpose front-loaded and the filtering behavior following. Every clause carries meaning, though the ruleset guidance is somewhat duplicated from the schema, which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters, rich annotations, and an output schema, the definition covers what an agent needs: the subset semantics, the leg model, and the filter behavior. Nothing essential is missing, though it could have routed the agent away from the broader vault catalog search tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 both parameters. The description's ruleset sentence largely restates the schema's own description of that parameter rather than adding new syntax or edge-case meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the campaign's house items') and clarifies the domain term by defining house items as 'the items it holds as active house-rule associations', which separates it from vault_search_items and play_list_campaign_rules. It does not explicitly name the adjacent sibling tools, so it falls just short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance on how to use the optional ruleset filter (omit for all legs, set to scope to one leg), which is genuinely useful usage context. However, it offers no when-to-use comparison against alternatives such as vault_search_items or play_list_campaign_rules; usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_movesList moves in a campaignARead-onlyIdempotentInspect
List the play-by-email moves of one campaign — the move feed. Sorted by shelf position (order), newest first by default; pass order: 'asc' for reading order. Defaults to a summary shape: each move's description is a ~240-character prose preview (image URLs and [[...]] markers don't count toward the budget) carrying a descriptionTruncated flag; detail: 'full' returns complete bodies. Child moves (split-party scenes) are excluded unless children: true. Restricted moves are server-filtered: players see only moves they're listed on; the GM and an admin with Admin Mode on see all. Readable by anyone who may view the campaign (a participant, anyone when the campaign is public, or an admin with Admin Mode on).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Cap the number of moves returned. Hard-capped at 200 server-side. | |
| order | No | 'desc' (default) returns the feed shape — newest shelf position first. 'asc' returns reading order. | desc |
| detail | No | Response shape. 'summary' (default) trims each move's description to a ~240-character prose preview so a long campaign doesn't overflow the tool-result budget — image URLs and [[...]] markers don't count toward the budget and the cut lands on a word boundary — and adds a `descriptionTruncated` boolean flagging whether more remains. 'full' returns complete bodies. | summary |
| children | No | Include child moves (split-party scenes). Default false: the feed shape, parentless moves only — children render on their parent's page. Pass true when you need every move, e.g. to pick an append target. | |
| campaignId | Yes | Mongo `_id` of the play campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations by disclosing server-side permission filtering (players see only moves they're listed on; GM and Admin Mode admins see all) and the read-authorization rule for the campaign. That is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that is front-loaded with the core purpose before parameter details; every sentence carries information. It is on the long side and packs many semicolons, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation isn't required, yet the description still explains the summary vs full shapes and the truncation flag. Permissions, defaults, and sorting are all covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions are already detailed, so the description largely restates order/detail/children/limit semantics. It adds framing around the summary shape's descriptionTruncated flag and word-boundary cut, but that content is also present in the schema, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the play-by-email moves of one campaign — the move feed') and distinguishes itself from siblings like play_list_session_moves by scoping to campaign moves. An agent can identify what the tool returns 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete guidance on parameter-driven use cases ('pass order: asc for reading order', 'pass children: true when you need every move, e.g. to pick an append target'). It does not name sibling alternatives such as play_get_move or play_list_session_moves for related reads, so routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_playersList players in a campaignARead-onlyIdempotentInspect
List the players in a play campaign with their roles, invite status, and any per-player flags.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Mongo `_id` of the campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds the output fields but does not describe behavioral details such as whether pending invites are included, ordering, or authentication requirements. This is acceptable but not a strong addition beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the action and resource, then adds the meaningful output components. There is no filler or repetition of schema field names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one parameter idempotent to call, the description plus annotations and output schema are sufficient. The agent knows what it lists, what fields are surfaced, and that the call is safe to make.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the only parameter, campaignId, is documented as a Mongo `_id`. The description adds no parameter-specific detail, but the schema already carries the full semantic burden, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List the players in a play campaign' and adds the fields returned (roles, invite status, per-player flags). It is clear, but it does not explicitly distinguish itself from sibling tools like play_list_campaign_characters or play_list_campaign_sessions, so it earns a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the name and the one-line description, but there is no explicit guidance about when to use this tool versus other campaign list tools or exclusions. It is not misleading, but it leaves the agent to infer usage from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_rulesList rules allowed in a campaignARead-onlyIdempotentInspect
List the campaign's house rules: the rules it holds as active house-rule associations. Subset of the broader vault catalog. Each sits on the leg matching its own ruleset: omit ruleset to list the rules across every leg, or set it to scope the list to that one leg.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset | No | Optional leg filter. Omitted, the list unions entries across every leg of the campaign; set to a ruleset to scope the list to that leg only. | |
| campaignId | Yes | Mongo `_id` of the campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the semantic detail that results are 'active house-rule associations' scoped per leg, but nothing about volume, ordering, or permissions beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core purpose before the leg-scoping detail. Some phrasing ('the rules it holds as active house-rule associations') is mildly redundant but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be explained, and both parameters are schema-documented. The description covers purpose and the key scoping behavior adequately for a simple two-parameter list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented in the schema, including the ruleset leg-filter semantics. The description largely restates that same behavior, adding no 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the campaign's house rules') and clarifies that these are active house-rule associations, a subset of the broader vault catalog. This distinguishes it from catalog-wide siblings like vault_search_rules and list_rulesets, though it never names those tools directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives usage context for the ruleset parameter (omit to union all legs, set to scope to one leg), which is genuinely helpful. However, it offers no when-to-use guidance relative to siblings such as play_add_campaign_rule or vault_search_rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_sessionsList sessions in a campaignARead-onlyIdempotentInspect
List sessions belonging to one campaign. Readable by anyone who may view the campaign (a participant, anyone when the campaign is public, or an admin with Admin Mode on). Defaults to a compact summary shape ordered by most-recently-updated; pass detail: 'full' for the populated shape.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | 'recent' (default) orders by updatedAt descending so the freshest sessions come back first; 'date' removes the gateway's `recent` override and defers to the play backend's default ordering for the endpoint. | recent |
| limit | No | Cap the number of sessions returned. Hard-capped at 200 server-side. | |
| detail | No | Response shape. 'summary' (default) returns id + name + status + date + campaign-ref only; 'full' returns the populated session document including battlemap refs and the full description body. | summary |
| campaignId | Yes | Mongo `_id` of the play campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuinely new behavioral context: the authorization model (participant, public campaign viewer, or Admin Mode admin) and the default ordering and response shape, which an agent cannot derive from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the purpose, then access, then defaults. Minor redundancy in restating the `detail` parameter that the schema already explains, but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 authorization and default response shape. It omits pagination semantics (limit is described as a cap with no mention of how to page past 200), which is a small gap for a list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 sort, limit, detail, and campaignId in detail. The description only restates the `detail: 'full'` option and the default ordering, adding no syntax, format, or constraint information beyond the schema — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource with scope: 'List sessions belonging to one campaign.' That scoping implicitly separates it from play_list_my_sessions and play_list_session_moves, but it never names or contrasts those siblings explicitly, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear access condition ('Readable by anyone who may view the campaign...') and states defaults, which implies when the call will succeed. However, there is no explicit when-to-use guidance versus alternatives like play_get_session or play_list_my_sessions, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_campaign_spellsList spells allowed in a campaignARead-onlyIdempotentInspect
List the campaign's house spells: the spells it holds as active house-rule associations. Subset of the broader vault catalog. Each sits on the leg matching its own ruleset: omit ruleset to list the spells across every leg, or set it to scope the list to that one leg.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset | No | Optional leg filter. Omitted, the list unions entries across every leg of the campaign; set to a ruleset to scope the list to that leg only. | |
| campaignId | Yes | Mongo `_id` of the campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the useful structural fact that entries are partitioned by ruleset leg and are a subset of the vault catalog, but says nothing about pagination, ordering, or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core definition before the ruleset scoping detail. Nothing is wasted, though the term 'leg' is used without definition, slightly reducing immediate clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters, full schema coverage, and an output schema that carries return values, the description covers what an agent needs to invoke the tool correctly. The remaining gap is the absence of any routing guidance against the large set of sibling list tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description's explanation of `ruleset` largely restates the schema's own description, adding no syntax or format detail beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the campaign's house spells') and clarifies the semantic scope ('active house-rule associations' and 'subset of the broader vault catalog'), which distinguishes it from vault_search_spells. It does not explicitly name a sibling tool, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to use the `ruleset` parameter (omit to union all legs, set to scope to one leg), which is usage guidance, but it never says when to choose this tool over the sibling vault_search_spells or how it relates to play_list_campaign_rules. Usage is implied rather than delineated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_my_campaignsList campaigns I runARead-onlyIdempotentInspect
List campaigns where the calling user is the DM/owner. Each campaign's ruleset-specific material lives in its legs array — one entry per ruleset, each carrying { ruleset, active, ... }; there is no campaign-level ruleset field. Defaults to a compact summary shape: identification fields, counts of rules/items/spells/sessions/players/characters, and the character roster (playId + vaultId pairs). Pass detail: 'full' to receive the full campaign documents (raw ObjectId arrays for the legs' allowlists, full descriptions, X-card history).
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Response shape. 'summary' (default) trims raw-ObjectId arrays and full character sheets to a compact LLM-friendly form; 'full' returns the populated document with every field inline. | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though readOnlyHint and idempotentHint annotations already establish the safety profile, the description adds important behavioral detail: the `legs` array structure, the absence of a campaign-level ruleset field, and the difference between the default summary shape and `detail: 'full'`. This is exactly the kind of non-obvious behavior an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, structural gotcha, default output, and full-output behavior are all covered in two sentences. The most important selection predicate is front-loaded, and no content is wasted on restating the name or obvious schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one optional parameter, strong annotations, and an output schema present, the description covers everything needed to select and invoke the tool correctly: ownership filter, response shape, and the key `legs`-array nuance. Nothing essential is missing for an agent to make an informed call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes the `detail` enum. The description goes further by explaining what the summary shape contains (counts plus `playId`/`vaultId` roster pairs) and what full shape adds (raw ObjectId arrays, full descriptions, X-card history). This gives the agent concrete expectations for each parameter value beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List campaigns where the calling user is the DM/owner.' This clearly distinguishes the tool from siblings like play_list_participated_campaigns, which would include campaigns the user merely participates in. The title and description align without being tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly defines the selection predicate — campaigns the calling user owns — and explains the summary vs. full output choice, giving the agent enough context to know when it applies. However, it does not explicitly contrast itself with sibling alternatives such as play_list_participated_campaigns or play_get_campaign, so it stops short of full when-to-use/when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_my_charactersList my play charactersARead-onlyIdempotentInspect
List the characters the calling user has in any of their campaigns (DM or player). For a single character's full sheet data, use vault_get_character with the returned id.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description only needs to add context beyond those. It does this by specifying the caller-scoped nature of the results and the DM-or-player coverage. Mentioning the returned id also implies the output contains character ids usable by vault_get_character, which is helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp sentences with no filler. The primary action is stated first, and the alternative tool reference is placed second. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with an output schema and safety annotations, the description is complete. It tells the agent what results are returned, who they belong to, and how to follow up for full character details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, and schema description coverage is 100%, so parameter semantics are trivially satisfied. The baseline of 4 for no-parameter tools applies; the description does not need to add parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'List the characters the calling user has in any of their campaigns (DM or player).' It also distinguishes itself from related tools like vault_get_character by noting that full sheet data belongs there. The scope is explicit and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool versus vault_get_character: for a quick list of a user's characters across campaigns, and for full sheet data use vault_get_character with the returned id. It does not explicitly mention play_list_campaign_characters as an alternative for per-campaign listing, but it provides enough routing guidance to be useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_my_friendsList my friendsARead-onlyIdempotentInspect
List the calling user's accepted friends. Returns each friend's display name and id, suitable for campaign-invite or friend-lookup workflows.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive. The description adds context about the scope ('calling user's accepted friends') and the return content (display name and id), which is useful beyond the annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very brief, front-loads the purpose and scope, and adds a single sentence on typical use cases. Every sentence earns its place, with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with no parameters, and the description mentions the return fields (name and id), which is sufficient for an agent to know what to expect. An output schema exists, so detailed return structure is likely covered there. Slightly missing is whether the list is sorted or if pagination applies, but for a simple list tool this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the schema is empty with 100% coverage. The description clarifies the output fields, which helps agents understand what they'll receive, but parameters are nonexistent, so the baseline of 4 (for no params) is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists the calling user's accepted friends, specifies the returned data (display name and id), and mentions intended use cases (campaign-invite or friend-lookup). It is distinct from sibling tools like play_list_pending_friends and play_find_friend.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for retrieving accepted friends, distinct from pending friend requests (play_list_pending_friends) and searching for specific friends (play_find_friend). However, it doesn't explicitly state when not to use this tool or mention alternatives, but the use-case mention provides decent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_my_sessionsList my sessionsARead-onlyIdempotentInspect
List sessions the calling user is part of across all their campaigns (DM or player). Defaults to a compact summary shape ordered by most-recently-updated. Pass detail: 'full' to receive the populated session document (battlemap refs, full description). Use limit to cap the array size.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | 'recent' (default) orders by updatedAt descending so the freshest sessions come back first; 'date' removes the gateway's `recent` override and defers to the play backend's default ordering for the endpoint. | recent |
| limit | No | Cap the number of sessions returned. Hard-capped at 200 server-side. | |
| detail | No | Response shape. 'summary' (default) returns id + name + status + date + campaign-ref only; 'full' returns the populated session document including battlemap refs and the full description body. | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent; the description adds non-obvious behavior: the response defaults to a compact summary shape, is ordered by most-recently-updated, and can be expanded via detail='full' to include battlemap refs and full descriptions. It does not mention the sort='date' option, but the schema covers it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core purpose, then defaults, then configuration options. Every sentence adds information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema, 100% schema coverage, and clear annotations, this description provides all selection and invocation context: scope, default ordering, response shape, and how to request full detail or cap results. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with every parameter (sort, limit, detail) already described in the input schema. The description reinforces detail and limit but adds no new parameter semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'List sessions the calling user is part of across all their campaigns (DM or player).' This scope distinguishes it from sibling tools like play_list_campaign_sessions (campaign-scoped) and play_get_session (single session).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states this is the cross-campaign, user-centric listing tool ('across all their campaigns'), which implies when to prefer it over campaign-scoped alternatives. However, it does not explicitly name a sibling or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_pagesList play pagesARead-onlyIdempotentInspect
List play pages, optionally filtered by what they're attached to and/or by documentType. To find session recaps, pass refType: 'session', refId: '<sessionId>', documentType: 'player-recap'. Defaults to a compact summary shape; pass detail: 'full' for the page body markdown inline. Returns the pages the caller may read: public pages of campaigns they may view, public pages with no ref, their own pages, and, when refId scopes the list to one record, that campaign's GM-side pages (dm-notes, campaign-logistics) for its GM. An admin with Admin Mode on gets every page.
| Name | Required | Description | Default |
|---|---|---|---|
| refId | No | Filter pages by the referenced entity's Mongo `_id`. Pair with `refType` to scope the lookup. | |
| detail | No | Response shape. 'summary' (default) drops the markdown `description` body and trims the owner populate, keeping identification + `ref` + `documentType` + the short `summary` field. 'full' returns the populated page document including the full body. | summary |
| refType | No | Filter pages by the entity type they reference. One of: campaign, session, character. | |
| documentType | No | Filter pages by documentType: 'player-recap' (session recap), 'dm-notes' / 'player-notes' (character-attached notes), 'campaign-logistics' (the campaign's one logistics page, managed by its own endpoint), or 'generic' (free-form). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds genuinely useful context beyond that by enumerating the visibility scope (public campaign pages, ref-less public pages, own pages, GM-side pages when refId scopes to one record) and the Admin Mode bypass. Pagination/row-limit behavior is the only notable omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the recap recipe are front-loaded, and the default-vs-full behavior follows predictably. The closing visibility sentence is a long four-clause enumeration that is dense but each clause carries distinct authorization meaning, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return shapes, and it correctly avoids doing so while still covering the two things structured fields can't express: the authorization scoping rules and how to combine filters for the common recap lookup. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter documentation is already strong and the baseline is 3. The description goes beyond it by showing how refType, refId, and documentType compose in one call and by spelling out the observable effect of detail:'full' (page body markdown inline) rather than just restating the enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List play pages') and immediately narrows scope to what it can be filtered by and what it returns. An agent can distinguish it from the many page-list siblings (play_list_user_pages, imagine_list_adventure_pages) by domain, but the description never names or contrasts those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete recipe for a primary use case ('To find session recaps, pass refType: session, refId, documentType: player-recap'), which tells the agent exactly how to invoke it for that scenario, plus the default vs. detail:'full' choice. It stops short of stating when *not* to use it or naming a sibling as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_participated_campaignsList campaigns I play inARead-onlyIdempotentInspect
List campaigns where the calling user is a player (not the DM). Each campaign's ruleset-specific material lives in its legs array — one entry per ruleset, each carrying { ruleset, active, ... }; there is no campaign-level ruleset field. Pair with play_list_my_campaigns for a complete view of the user's campaign involvement.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds valuable behavioral context by explaining the structure of the legs array and the absence of a campaign-level ruleset field, which helps the agent anticipate response shape and interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core purpose is front-loaded, and the additional structural detail about the legs array earns its place by clarifying a non-obvious data shape. It is both concise and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only list tool with an output schema and strong annotations, the description covers everything needed: what it returns, the key structural nuance, and how it relates to the sibling tool. There is no significant missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is an empty object, so parameter semantics are trivially complete. Baseline 4 is appropriate since the description doesn't need to add parameter details and doesn't introduce any confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states precisely what the tool does: it lists campaigns where the calling user is a player, explicitly excluding the DM role. It also distinguishes the tool from play_list_my_campaigns by positioning it as the player-only view, making sibling differentiation clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: when you need campaigns where the user is a player, not a DM. It also names the sibling play_list_my_campaigns and recommends pairing them for a complete view, though it doesn't explicitly say when to choose one over the other beyond the player/DM distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_pbem_inboxList a campaign's PBEM inboxARead-onlyIdempotentInspect
List the captured inbound emails on a play-by-email campaign. Each item carries the matched player (or null when unmatched), sender display name, sent time, subject, verbatim body, a distilled replyText (latest contribution with quoted history stripped), senderIsGamemaster (true when the sender is the campaign owner or an accepted gamemaster — the move builder boxes GM emails), and senderDisplayName (the GM-set attribution name for the matched player, empty when unset). GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by item status. 'new' (default) is the pending pile awaiting triage; 'consumed' items are linked to a published move; 'dismissed' items were discarded by the GM. | new |
| campaignId | Yes | Mongo `_id` of the play campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only, idempotent, and non-destructive. The description adds value beyond annotations by explaining GM-only access, the null matched-player case, replyText stripping quoted history, and the senderIsGamemaster/senderDisplayName semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the follow-up sentence packs useful return-field semantics without filler. The long parenthetical about the move builder is slightly dense, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool, the description covers the access restriction, the status-filtered subject matter, and the meaning of the returned fields. With a full parameter schema, readOnly/idempotent annotations, and an output schema present, nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with campaignId and status fully described including the enum meanings and default. The description reinforces the item-level concepts but does not add parameter-level details beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific action 'List' and a precise resource: captured inbound emails on a play-by-email campaign. It also explains what each returned item contains, leaving no ambiguity about what the tool does and how it differs from mutation siblings like play_consume_pbem_emails or play_dismiss_pbem_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'GM-only' note gives an access constraint, and the title implies the use case of reviewing a campaign's PBEM inbox. However, the free-text description never explicitly says when to choose this over related tools such as play_consume_pbem_emails or play_resolve_pbem_email; the usage guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_pending_friendsList pending friend requestsARead-onlyIdempotentInspect
List friend requests directed at the calling user that have not yet been accepted or declined.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds the scoping constraint (pending requests for the calling user), which is useful for selection but does not disclose additional behavioral aspects like pagination, ordering, or return format beyond what the output schema presumably covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tight sentence with no filler. It front-loads the verb and resource and clearly states the filtering condition, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with no parameters and an output schema present, the description is complete. It clearly defines the input scope and result semantics. Minor missing details like pagination limits could be added but are not critical given the tool's simplicity and the presence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the description correctly avoids repeating schema information. Since there are no params to explain, a baseline of 4 is appropriate; the description provides no additional parameter details because none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'friend requests', and the specific scope: 'directed at the calling user that have not yet been accepted or declined.' This precisely distinguishes it from sibling tools like play_list_my_friends (which lists all friends) and accept/decline/cancel actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by specifying the pending status and target user, but it does not explicitly state when to use this tool versus alternatives (e.g., play_list_my_friends, play_accept_friend_request). No when-not or alternative guidance is provided beyond the inherent scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_session_movesList a chapter's movesARead-onlyIdempotentInspect
List the moves grouped under one session (a play-by-email 'chapter'), in reading order with full bodies by default; detail: 'summary' trims each description to a ~240-character prose preview with a descriptionTruncated flag. Restricted moves are server-filtered: players see only moves they're listed on; the GM and an admin with Admin Mode on see all. Readable by anyone who may view the session's campaign (a participant, anyone when the campaign is public, or an admin with Admin Mode on), and by the session's owner.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Response shape. 'full' (default) returns complete bodies in reading order. 'summary' trims each move's description to a ~240-character prose preview — image URLs and [[...]] markers don't count toward the budget and the cut lands on a word boundary — and adds a `descriptionTruncated` boolean flagging whether more remains. | full |
| sessionId | Yes | Mongo `_id` of the chapter session. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/non-destructive annotations by disclosing server-side visibility filtering (players see only moves they are listed on; GM and Admin-Mode admins see all), the full read-permission model, and the truncation behavior with its descriptionTruncated flag. This is exactly the auth- and content-filtering context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose before the detail option and permission rules. Dense and mostly earned, though the detail/truncation explanation partially duplicates the schema description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is not required, and the description covers filtering, permissions, and truncation. Pagination behavior for a list endpoint is not mentioned, a minor gap given the rich annotation and schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented, and the description largely restates the detail enum's truncation semantics rather than adding new meaning. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('the moves grouped under one session'), and pins the scope to a single session/chapter, which implicitly separates it from the campaign-wide play_list_campaign_moves and the single-move play_get_move. 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the detail='summary' option and who may read the data, giving clear context for invocation, but never routes the agent to an alternative (e.g. campaign-level listing or single-move retrieval) or states when this tool should not be used. Usage is implied rather than contrasted with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_list_user_pagesList pages authored by a userARead-onlyIdempotentInspect
List the pages a given user has authored. Pass own user id (from whoami) to see private pages too; for another user, only their public pages that the caller may read come back (pages of campaigns the caller may view, or with no ref). Defaults to summary shape.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Response shape. 'summary' (default) drops the markdown `description` body and trims the owner populate, keeping identification + `ref` + `documentType` + the short `summary` field. 'full' returns the populated page document including the full body. | summary |
| userId | Yes | Mongo `_id` of the user whose pages to list. Pass own user id (from `whoami`) to see private pages too; for another user, only their public pages that the caller may read come back (pages of campaigns the caller may view, or with no ref). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a read-only, idempotent, non-destructive operation. The description adds important context about privacy filtering and the default response shape, which goes beyond annotations. It does not discuss pagination or error behavior, but the annotations lower the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste. The privacy behavior is front-loaded right after the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple two-parameter read operation with an output schema and annotations, the description covers the essential access-control nuance and default shape. Pagination is not mentioned, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented in the schema. The description repeats the semantics of userId and mentions the default detail shape, but adds little beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List'), resource ('pages'), and scope constraint ('authored by a given user'). Clear enough that an agent can distinguish it from siblings like play_list_pages or imagine_list_adventure_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains a key usage distinction: passing your own user id (from whoami) reveals private pages, while another user's id yields only public pages readable by the caller. It doesn't explicitly name alternative list tools, but the context is clear enough to guide usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_regenerate_pbem_addressRegenerate a campaign's inbound addressADestructiveIdempotentInspect
Mint a fresh inbound address for the campaign (leak recovery). The old address stops routing IMMEDIATELY and every player must switch to the new one — confirm with the user first. GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Mongo `_id` of the play campaign. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds rich behavioral context beyond the annotations: the old address stops routing immediately, every player must switch, confirmation is required, and the operation is GM-only. This substantially exceeds what 'destructiveHint: true' alone conveys and gives an agent the necessary risk framing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, efficiently front-loading the core action and then the critical consequences. Every clause earns its place: leak recovery, immediate routing stop, player impact, user confirmation, and GM-only restriction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-obvious operation, the description covers all essential context: why to call it, what will happen, who is allowed, and what prerequisite coordination is needed. With an output schema and clear parameter documentation present, nothing necessary for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter campaignId is already well-documented as a Mongo _id. The description does not need to add parameter detail, but it also does not add anything beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Mint a fresh inbound address for the campaign') and identifies the purpose via 'leak recovery'. It also explains the concrete consequence—old address stops routing immediately—which distinguishes this from any similar-looking play_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use it: as leak recovery, with the explicit directives to confirm with the user first and only for GMs. It does not name alternatives or exclusions, but none of the siblings appear to be a direct substitute, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_remove_campaign_itemRemove an item from a campaign's allowlistADestructiveIdempotentInspect
Remove a vault item from a campaign's allowlist. Removal targets the leg matching the ITEM's own ruleset; the optional ruleset param only confirms that leg (mismatch answers 400), never retargets. Caller must be the campaign's owner, a gamemaster or player with an accepted seat (watchers excluded), or an admin with Admin Mode on.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Vault document id (`itemId`) to remove. Required. | |
| ruleset | No | Optional confirmation of the target leg's ruleset. The entity always lands on the leg matching its OWN ruleset — this param never retargets; when present, play verifies it matches that leg and answers 400 on a mismatch. Omit unless you want the placement double-checked. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint and idempotentHint, and the description adds substantial context on top: the exact authorization roles required, the 400 response on ruleset mismatch, and the non-retargeting semantics of the optional param. These are behavioral facts an agent cannot infer from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences, front-loaded with the action and scope, followed by the targeting rule and auth gate. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be described, and the description covers the side effect (allowlist removal), the targeting constraint, the error case, and the authorization requirement. Complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains the ruleset param's confirm-only behavior in nearly identical terms, so the description largely duplicates structured data. With full coverage the baseline of 3 is appropriate; it adds no syntax or format beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a vault item from a campaign's allowlist') and is clearly distinguishable from sibling removers like play_remove_campaign_rule and play_remove_campaign_spell. The scope ('leg matching the item's own ruleset') sharpens what is being removed beyond a generic delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions for calling: caller must be owner, gamemaster, or player with an accepted seat (watchers excluded), or an admin with Admin Mode on. It also warns the optional ruleset param only confirms and never retargets. It does not name alternative tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_remove_campaign_playerRemove a player from a campaignADestructiveIdempotentInspect
Remove a player from a campaign. Caller must be the campaign's GM (its owner or an accepted gamemaster). The campaign owner cannot be removed. playerId is the player-record id returned by play_list_campaign_players (the embedded player doc id, NOT the user's id).
| Name | Required | Description | Default |
|---|---|---|---|
| playerId | Yes | Embedded player document id from play_list_campaign_players. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint, idempotentHint and non-readOnly, so safety basics are covered. The description adds real value beyond that: the required GM role, the owner-removal prohibition, and id provenance. It does not describe failure/error behavior, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the permission rule, then the id caveat. No filler; each sentence carries a distinct constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not cover returns, and it fully covers the preconditions (GM role, owner protection) and the one easily-confused parameter. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 crucial disambiguation the schema lacks: playerId is the embedded player-doc id from play_list_campaign_players, NOT the user's id. That prevents a likely wrong-argument failure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (remove) plus resource (player from campaign) stated in the first clause. It is clearly distinguished from sibling mutation tools like play_add_campaign_player and play_invite_campaign_player.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit authorization context (caller must be GM – owner or accepted gamemaster) and a hard exclusion (owner cannot be removed), which tells the agent when the call will succeed or fail. No alternate tool is named for the non-permitted cases, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_remove_campaign_ruleRemove a rule from a campaign's allowlistADestructiveIdempotentInspect
Remove a vault rule from a campaign's allowlist. Removal targets the leg matching the RULE's own ruleset; the optional ruleset param only confirms that leg (mismatch answers 400), never retargets. Caller must be the campaign's owner, a gamemaster or player with an accepted seat (watchers excluded), or an admin with Admin Mode on.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleId | Yes | Vault document id (`ruleId`) to remove. Required. | |
| ruleset | No | Optional confirmation of the target leg's ruleset. The entity always lands on the leg matching its OWN ruleset — this param never retargets; when present, play verifies it matches that leg and answers 400 on a mismatch. Omit unless you want the placement double-checked. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/idempotent/write, but the description adds material context beyond them: the authorization model (owner, GM, accepted-seat player, admin with Admin Mode, watchers excluded), the leg-targeting rule, and the 400 error on ruleset mismatch. This is rich behavioral disclosure not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, all front-loaded on the core action before targeting and permission details. The ruleset sentence duplicates the schema, costing a little conciseness, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation tool with an output schema and full annotation coverage, the description supplies everything else an agent needs: authorization, targeting semantics, and error behavior. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 ruleset's confirmation-only behavior almost verbatim; the description largely restates it. Baseline 3 is appropriate when the schema carries parameter meaning, with only marginal added framing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a vault rule from a campaign's allowlist'), which cleanly distinguishes it from sibling mutation tools like play_add_campaign_rule and from vault_delete_rule (which removes the rule itself, not its allowlist membership). An agent can tell what it does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides prerequisites (caller must be owner/GM/accepted-seat player/admin with Admin Mode) and conditional param guidance ('Omit unless you want the placement double-checked'), which is strong usage context. It does not explicitly name alternatives such as vault_delete_rule or play_remove_campaign_item, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_remove_campaign_spellRemove a spell from a campaign's allowlistADestructiveIdempotentInspect
Remove a vault spell from a campaign's allowlist. Removal targets the leg matching the SPELL's own ruleset; the optional ruleset param only confirms that leg (mismatch answers 400), never retargets. Caller must be the campaign's owner, a gamemaster or player with an accepted seat (watchers excluded), or an admin with Admin Mode on.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset | No | Optional confirmation of the target leg's ruleset. The entity always lands on the leg matching its OWN ruleset — this param never retargets; when present, play verifies it matches that leg and answers 400 on a mismatch. Omit unless you want the placement double-checked. | |
| spellId | Yes | Vault document id (`spellId`) to remove. Required. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so most of the behavior is structured. The description nonetheless adds real value beyond them: the leg-matching semantics, the 400-on-mismatch error, and the full caller-permission matrix (including watcher exclusion). That is more than the annotations provide, though it stops short of describing reversal or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences, front-loading the action, then the tricky ruleset/leg nuance, then the permission gate. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full annotation coverage, the description need not explain returns. It covers the action, the non-obvious leg-targeting behavior, the error case, and the authorization requirements, leaving nothing essential for a correct call unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 three params, including that ruleset only confirms and never retargets. The description reinforces the ruleset semantics in prose but adds little the schema does not already say; the baseline for full coverage is 3, nudged up for the emphasis on the confirmation/mismatch behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Remove a vault spell from a campaign's allowlist.' This clearly separates it from the sibling play_add_campaign_spell and the item/rule/player removal tools, though it never names an alternative to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for invocation via the authorization rules (owner, gamemaster/player with accepted seat, watchers excluded, admin with Admin Mode). It also implies why you'd omit or supply the optional ruleset param, but offers no explicit when-not or named-alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_remove_friendRemove a friendADestructiveIdempotentInspect
Remove an existing friend connection. Pass friendId from play_list_my_friends. Destructive on the social graph; both sides lose the connection.
| Name | Required | Description | Default |
|---|---|---|---|
| friendId | Yes | `_id` of the friend record on the calling user's friends list. NOT the other user's id. Use play_list_pending_friends (for accept/decline) or play_list_my_friends (for remove) to obtain it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive and not read-only. The description adds meaningful behavioral context beyond those flags: 'Destructive on the social graph; both sides lose the connection,' which tells the agent the exact blast radius and impact. It does not address auth or reversibility, but the annotations carry the core safety signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. It front-loads the action, then supplies the parameter source, then the destructive consequence. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, destructive tool with an output schema and rich parameter documentation, the description is complete. It covers what the tool does, where the parameter comes from, and the social-graph consequence, leaving no important selection or invocation gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter description already explains that `friendId` is the friend record `_id` on the calling user's friends list, NOT the other user's id, and how to obtain it. The description repeats the provenance ('Pass `friendId` from play_list_my_friends') but adds no new parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Remove an existing friend connection.' It distinguishes this from pending-request operations by emphasizing 'existing friend connection,' which separates it from tools like play_cancel_friend_request, play_accept_friend_request, and play_decline_friend_request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational guidance by telling the agent to pass `friendId` from play_list_my_friends, which indicates the correct source and workflow. It does not explicitly name alternative tools for accept/decline/cancel, but the 'existing friend connection' framing implies the boundary; the schema's parameter description further clarifies that play_list_pending_friends is for accept/decline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_resolve_pbem_emailAssign an unmatched email to a playerAIdempotentInspect
Resolve an unmatched inbox email to an accepted campaign member. Pass remember: true to auto-match future emails from the same sender address (stored as an HMAC key, never the address). GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Mongo `_id` of the inbox item. | |
| playerId | Yes | User `_id` of the accepted campaign member this email's sender is. | |
| remember | No | When true, future emails from the same sender address auto-match this player (stored as an HMAC key, never the address). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses GM-only authorization, the persistent side effect of auto-matching future emails when remember is true, and the privacy behavior of storing only an HMAC key, never the address. This adds meaningful behavioral context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The core action is front-loaded, followed by the optional remember behavior and the permission constraint, each earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete for a tool with a rich output schema and fully documented parameters. The only notable gap is the absence of explicit routing guidance against related PBEM email tools, such as dismissing instead of resolving.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with 100% coverage, including the HMAC-key note on remember. The description restates some of this information but does not substantially expand on the schema's parameter meanings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Resolve an unmatched inbox email to an accepted campaign member.' It clearly separates this from siblings like play_dismiss_pbem_email and play_consume_pbem_emails by targeting unmatched emails and assigning them to a player.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context about when the tool is appropriate: an unmatched inbox email should be resolved to an accepted campaign member, and GM-only restricts who may call it. It does not explicitly contrast with dismissal or bulk-consumption siblings, so it lacks explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_respond_to_campaign_inviteAccept or decline a campaign inviteAInspect
Respond to a pending campaign invite directed at the calling user. The campaign id is the campaign the invite belongs to; accept decides yes/no.
| Name | Required | Description | Default |
|---|---|---|---|
| accept | Yes | true to accept the invite; false to decline. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate that this is a mutating, non-idempotent operation, so the description does not need to restate that. It adds useful scope context ('pending', 'directed at the calling user'), but it does not disclose what happens after responding, such as whether the invite is consumed or what side effects accepting has.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short, front-loaded sentences with no filler. The action and scope come first, then the parameter clarifications, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter action with full schema coverage, an output schema, and relevant annotations, the description is complete enough. It identifies the target resource, the caller-scope constraint, and the meaning of the decision parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already have clear descriptions ('Campaign id.' and 'true to accept the invite; false to decline.'). The prose adds only minor natural-language clarification that campaignId is the campaign the invite belongs to and that accept decides yes/no.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Respond to a pending campaign invite directed at the calling user.' It clearly distinguishes this from sibling friend-request tools like play_accept_friend_request and play_decline_friend_request by specifying the campaign-invite scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'pending campaign invite directed at the calling user' gives clear conditions for when to use the tool. It does not explicitly name alternatives or exclusions, but the context is sufficient to route an agent to the correct tool without opening other schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_send_friend_requestSend a friend requestAIdempotentInspect
Send a friend request to another user. Pass targetUserId (the recipient's User _id) — use play_find_friend to look them up first.
| Name | Required | Description | Default |
|---|---|---|---|
| targetUserId | Yes | Mongo `_id` of the user to send the friend request to. Use play_find_friend to locate it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already signal a non-read-only, non-destructive, idempotent state change, and the description does not contradict them. It adds little beyond the schema (the targetUserId format and lookup step), but for this simple action the task-facing behavior is adequately implied. It could have noted that success creates a pending request that requires acceptance, but this is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact, front-loaded sentence with no filler; the action, parameter, and lookup prerequisite all appear in the first clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required parameter, full schema coverage, an output schema, and annotations covering safety semantics, the description plus structured data leave no practical gap. The explicit lookup-first instruction completes the workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents targetUserId as the recipient's Mongo _id and tells the agent to use play_find_friend. The description restates this, adding a slightly clearer sequencing cue ('look them up first') but no new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific action 'Send a friend request' and clearly identifies the resource ('another user'). It also names the target identifier and points to play_find_friend, which separates it from sibling request-management tools like play_accept_friend_request or play_cancel_friend_request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precondition: look up the recipient with play_find_friend before sending. It does not enumerate exclusions such as 'do not use for accepting/declining/cancelling', but the verb and the named lookup sibling make the context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_set_campaign_leg_activeActivate or deactivate a campaign legAIdempotentInspect
Toggle a campaign leg's active flag by ruleset. Deactivating hides the leg from normal UI (the campaign stops appearing to viewers whose active ruleset matches it) but never deletes it — all of its content and attachments survive and reactivating restores them. Play refuses to deactivate the last active leg (400). Caller must be the campaign owner or an accepted gamemaster; ordinary players get 403.
| Name | Required | Description | Default |
|---|---|---|---|
| active | Yes | true to activate the leg; false to deactivate it (hidden from normal UI, never deleted). Play refuses to deactivate the last active leg (400). | |
| ruleset | No | Ruleset of the leg to toggle. Required. | |
| campaignId | Yes | Campaign id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains that deactivation hides but never deletes, that content and attachments survive and reactivation restores them, that the last active leg is refused with 400, and that only the owner or a gamemaster may call it (403 for ordinary players). This is exactly the kind of auth, error, and side-effect detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the core action, then consequences, then error/auth conditions. No filler; each sentence carries distinct, load-bearing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 described, and the description already covers side effects, reversibility, error codes, and permission requirements. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 three parameters, and the description adds only a general 'by ruleset' reference. Baseline 3 is appropriate when the schema carries parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (toggle) and resource (a campaign leg's `active` flag) and scopes it 'by ruleset'. An agent can immediately distinguish this from additive siblings like play_add_campaign_leg or general updates like play_update_campaign.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys the effect and constraints of toggling, which implies when it applies, but never explicitly routes the agent between this and alternatives (e.g., play_update_campaign or play_add_campaign_leg). Usage context is present but not framed as when-to-use/when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_set_pbem_display_nameSet a player's PBEM attribution nameAIdempotentInspect
Set the name a campaign member's emails are attributed to when collated into a move (e.g. the character they play). Applies to all of that player's emails; blank clears it back to their Embers name. GM-only.
| Name | Required | Description | Default |
|---|---|---|---|
| playerId | Yes | User `_id` of the accepted campaign member. | |
| campaignId | Yes | Mongo `_id` of the play campaign. | |
| displayName | Yes | Name this player's emails are attributed to when collated into a move (e.g. their character). Pass an empty string to clear it back to the player's Embers name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true and destructiveHint=false, so the description doesn't need to restate those. It adds useful behavioral context: the setting applies globally to all of the player's emails, and blank clears it. It doesn't mention permissions (GM-only) or side effects beyond the attribution, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the main action, and includes the key edge case (blank clears) without any fluff. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover idempotency and non-destructiveness, the description is nearly complete. It could mention GM-only permission or that this is a per-campaign setting, but the core behavior and parameter semantics are fully covered. A small gap remains around permissions and scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 three parameters thoroughly. The description adds the 'applies to all of that player's emails' context and the blank-clears behavior, which complements the displayName parameter description. However, it doesn't add much beyond what the schema already says, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set the name a campaign member's emails are attributed to when collated into a move'), the resource (player/campaign), and the effect (applies to all of that player's emails; blank clears it). It distinguishes itself from siblings like play_create_move or play_update_move by focusing on email attribution display name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the context: it applies to all of a player's emails and that passing an empty string clears it back to the player's Embers name. It doesn't explicitly name alternative tools or when not to use it, but the context is clear enough for an agent to select it for setting attribution names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_update_campaignUpdate a play campaignAIdempotentInspect
PUT updates to one campaign by id. Caller must be the campaign's owner, an admin with Admin Mode on, or the campaign's GM (an accepted gamemaster). Play writes only name, summary, description, image, public, hideSections, dismissedSessionZeroNudge, xCardEnabled, and showCreatureDetails, plus active for the owner or an admin with Admin Mode on, and ignores any other field; seats change only through the invite tools; making the campaign public needs Premium, VIP, or admin. Only supplied fields are sent. legs is NOT writable here (it is stripped): add a leg with play_add_campaign_leg, toggle one with play_set_campaign_leg_active, and change a leg's contents with the add/remove rule/item/spell/character tools. REQUIRES baseUpdatedAt: copy updatedAt from a fresh play_get_campaign read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the campaign. | |
| name | No | Campaign name. | |
| image | No | Image URL. Stored as a plain string. | |
| active | No | ||
| public | No | Whether non-members can see the campaign. Making the campaign public needs Premium, VIP, or admin. | |
| summary | No | Short campaign summary. Max 150 characters. | |
| description | No | Full campaign description. Markdown supported. | |
| hideSections | No | ||
| xCardEnabled | No | ||
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| showCreatureDetails | No | Whether players see a creature's details (its health and armor class, per ruleset) at the top of a token's details on the campaign's battlemaps. A battlemap shows them only when every one of its campaigns has this on. Off by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations (readOnly=false, idempotent=true, destructive=false): it discloses the permission model, the field whitelist with `active` restricted to owner/admin, that unknown fields are ignored, the Premium/VIP/admin gate on making a campaign public, that only supplied fields are sent, and the optimistic-concurrency contract with OUT_OF_SYNC and no write. That is substantive behavioral context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation, then permissions, then field scope, then the concurrency requirement – a sensible information hierarchy with no throwaway sentences. It is dense and long, with a small amount of repetition against the schema (public/Premium, baseUpdatedAt), which keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-param, nested-object mutation with an output schema present, the description covers the gaps an agent needs: authorization, field whitelist, ignored fields, concurrency protocol, and the post-write updatedAt handoff for follow-up writes. Return values need not be explained because the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 73% and the description compensates well: it explains which of the 11 parameters are actually writable, that `legs` is stripped despite additionalProperties allowing it, and elaborates on baseUpdatedAt's freshness requirement. Some content (the Premium gate on `public`, the baseUpdatedAt read-first instruction) duplicates the schema descriptions, so not a perfect 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'PUT updates to one campaign by id.' Immediately distinguishes itself from sibling update tools (play_update_session, play_update_move, play_update_page) by naming the resource and the exact field whitelist it touches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states who may call it (owner, Admin Mode admin, accepted GM) and routes excluded operations to alternatives by name: legs go to play_add_campaign_leg / play_set_campaign_leg_active, seats go through the invite tools, leg contents through the add/remove rule/item/spell/character tools. An agent can determine when to use this tool and when not to without guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_update_character_noteUpdate a character note (DM or player)AIdempotentInspect
Update the DM-side or player-side note attached to a play character. PUT semantics — description replaces the current body. The player-side note (player-notes) is updated by the character's player (or an admin with Admin Mode on) or the campaign's GM; the DM-side note (dm-notes) by the campaign's GM alone, and a player gets 403. Triggers a notification (to the character owner if a GM updated, to GMs if a player updated). REQUIRES baseUpdatedAt: copy updatedAt from a fresh play_get_character_note read of the same note; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional new name for the note. | |
| characterId | Yes | Mongo `_id` of the play character (NOT the vault character id). | |
| description | Yes | Note body markdown. PUT semantics: replaces the existing body. | |
| documentType | Yes | Which note to update: 'dm-notes' or 'player-notes'. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false); the description adds substantial context beyond them — concurrency control via baseUpdatedAt, the OUT_OF_SYNC failure with no partial write, the exact 403 authorization boundary, and notification side effects to owner/GMs. This is exactly the behavioral depth annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each carrying distinct information (purpose, PUT semantics, permission matrix, concurrency requirement) with the core action front-loaded. No filler and no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't explain returns, and annotations cover the safety profile; the remaining risk areas for a mutation tool — authorization, optimistic concurrency, side effects, and the required read-then-write flow — are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 integrates the parameters into a workflow the schema states only in fragments: documentType is tied to the permission model, and baseUpdatedAt is framed as a copy-from-fresh-read proof with a named rejection error. The added value is real but largely reinforces the already-detailed schema descriptions, so it lands just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update the DM-side or player-side note attached to a play character') and immediately distinguishes the two note variants the tool operates on. The title's '(DM or player)' is expanded into a concrete scope, and the sibling play_get_character_note is named for the read counterpart, so the 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use with alternatives: it names play_get_character_note as the required preceding read, states the permission model per note type (player/owner/admin for player-notes; GM-only for dm-notes with a 403 otherwise), and defines PUT replacement semantics. Nothing about selecting or invoking the tool correctly 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.
play_update_moveUpdate a moveAIdempotentInspect
Update a move by id: name, description, number (game label), date, order (shelf position), sessionId (chapter; null detaches), parentId (child scene; null detaches; setting it clears the chapter), or playerIds (visibility; [] reopens to everyone). Only supplied fields are sent. GM-only. REQUIRES baseUpdatedAt: copy updatedAt from a fresh play_get_move read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the move to update. | |
| date | No | Move date in `dd/mm/yy` format. Defaults to today on create. Play parses this server-side on both create and update. | |
| name | No | Move name / title (e.g. 'Move 185', 'Interlude 12'). Defaults to 'Move <number>' when omitted on create. | |
| order | No | Shelf position within the campaign (the feed's only sort key; GM drag-reordering rewrites it). Positive integer. | |
| number | No | Game label number. Non-unique (parallel scenes share one). Defaults to the campaign's high-water + 1 on create. Display position is `order`, not this. | |
| parentId | No | Parent move, making this a child scene (split party). Same campaign only, one level deep (a child cannot be a parent; a move with children cannot become a child). Children render on the parent's page, stay out of the feed and chapter lists, and cannot carry a sessionId. Pass null to detach back into the feed. | |
| playerIds | No | Visibility restriction: user ids from the campaign's player roster. Empty/omitted = visible to every campaign participant. When set, the move is invisible to players not listed (dropped from lists, 404 on read); the GM always sees it. Pass [] on update to reopen the move to everyone. | |
| sessionId | No | Chapter session to group this move under. Must belong to the same campaign. Pass null to detach the move back to the unchaptered feed. | |
| description | No | The collated round: GM narration, player contributions, rolls. Markdown supported. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds substantial context: partial-update semantics ('Only supplied fields are sent'), optimistic concurrency requirement, GM-only access, and side effects of null values like 'null detaches' and 'setting it clears the chapter'. This exceeds what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one dense but well-organized paragraph that front-loads the supported fields and places the critical concurrency warning prominently. It is compact for 10 parameters. A line break before the baseUpdatedAt warning would improve scannability, but every sentence is necessary and non-redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-parameter mutation tool, the description covers update semantics, required precondition (fresh read), failure mode, GM restriction, and field-level dependencies. The output schema exists, so return-value details need not be spelled out. Highly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with rich descriptions, so the description need not repeat them. The description adds semantic gloss: 'null detaches', '[] reopens to everyone', 'sessionId (chapter; null detaches)', and the critical baseUpdatedAt provenance rule. Given the schema already documents each parameter, a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update a move by id', then enumerates all mutable fields and their semantics. It distinguishes from siblings like play_create_move and play_delete_move by being explicitly an update. The title and description align, and the resource (move) is clearly differentiated from page/session/campaign tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage guidance: it lists only-supplied-fields-are-sent behavior, states GM-only requirement, and explicitly instructs the agent to copy baseUpdatedAt from a fresh play_get_move read. It warns against stale or fabricated values and explains the OUT_OF_SYNC failure mode. This gives clear when-to-use context against sibling read tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_update_pageUpdate a pageAIdempotentInspect
Update a page by id. PUT semantics — supplied fields replace their current values. To append to a recap body, fetch first via play_get_page, concatenate, and send back. Allowed for the page's owner, an admin with Admin Mode on, or the GM of the page's campaign for a page the table sees (a public page, or a GM-side page: dm-notes, campaign-logistics); a player's private pages and recaps answer to their author (or an admin with Admin Mode on) alone. REQUIRES baseUpdatedAt: copy updatedAt from a fresh play_get_page read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written — writing from memory of an earlier read is not possible.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the page to update. | |
| ref | No | What the page is attached to. Required for character notes; optional for free-form pages. Allowed on update too (Mongoose has no immutability constraint), though re-anchoring a page is unusual. | |
| link | No | URL-safe slug. Lowercase letters, numbers, and hyphens only. Setting or changing a page link needs Premium, VIP, or admin. | |
| name | No | Page name / title. | |
| active | No | ||
| public | No | ||
| summary | No | Short page summary. Max 255 characters. | |
| keywords | No | Comma-separated keyword string. | |
| promptId | No | Mongo `_id` reference (24-character hex string). | |
| description | No | Markdown body. | |
| documentType | No | What kind of page this is. Defaults to 'generic'. Use 'player-recap' for a session recap. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations covering the safety/idempotency profile, the description still adds substantial behavioral context: optimistic concurrency via baseUpdatedAt, the OUT_OF_SYNC rejection with a guarantee that 'nothing is written', the append-vs-replace distinction, and detailed ownership rules. It also warns that writing from memory of an earlier read is not possible — genuinely non-obvious behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded ('Update a page by id. PUT semantics...') and the append guidance appears before the permission wall. The permission sentence is long and clause-heavy, but each clause encodes a distinct authorization case rather than filler; the baseUpdatedAt sentence slightly restates the schema but earns its place by explaining the OUT_OF_SYNC failure mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with nested objects, an output schema, and full annotations, the description supplies the missing pieces an agent must know — auth rules, concurrency contract, replace-vs-append semantics — and correctly omits return-value documentation since an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the baseline is already 3, but the description adds real meaning for baseUpdatedAt (it is proof-of-freshness, not just a timestamp, and must be copied verbatim from a fresh read) and clarifies the replace-vs-append semantics for body fields. It doesn't explain other params such as link's Premium requirement beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Update a page by id') and immediately qualifies the semantics ('PUT semantics — supplied fields replace their current values'), which distinguishes it from play_create_page, play_delete_page, and play_get_page. An agent knows exactly what operation this is 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to `play_get_page` for the fetch-append-send workflow and spells out the authorization conditions that gate usage (owner, Admin Mode admin, campaign GM for public/dm-notes/campaign-logistics pages). It does not, however, address when to prefer it over near-neighbors like play_update_character_note, play_update_move, or play_update_session, so the sibling routing is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_update_sessionUpdate a sessionAIdempotentInspect
Update a session by id. Use this to append session notes, change the date, rename, or tag the session with the Imagine adventure it belongs to (imagineAdventureId — valid ids come from the campaign's imagineAdventures list on play_get_campaign; null untags). Only the fields you supply are sent. Caller must be the session's owner, an admin with Admin Mode on, or the campaign's GM (its owner or an accepted gamemaster); players get 403. REQUIRES baseUpdatedAt: copy updatedAt from a fresh play_get_session read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the session to update. | |
| date | No | Session date in `dd/mm/yy` format. | |
| name | No | Session name / title. | |
| image | No | ||
| status | No | ||
| dateDay | No | ||
| summary | No | Short session summary. Max 150 characters. | |
| dateYear | No | ||
| dateMonth | No | ||
| battlemaps | No | ||
| characters | No | ||
| description | No | Session body / notes / recap. Markdown supported. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| sessionImages | No | ||
| imagineAdventureId | No | Imagine adventure this session is part of. Must be one of the ids in the campaign's `imagineAdventures` list (see play_get_campaign); adventures are linked to the campaign with imagine_link_adventure_to_campaign. Pass null to untag the session. Omit to leave unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: partial-update semantics ('Only the fields you supply are sent'), the authorization matrix (owner / Admin Mode admin / campaign GM), the 403 outcome for players, and the optimistic-concurrency contract (stale or fabricated baseUpdatedAt -> OUT_OF_SYNC with nothing written). The annotations only give idempotent/non-destructive/openWorld flags; this description supplies the operational contract they omit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core action and its editable fields come first, then scoping, then auth, then the concurrency requirement. Every sentence carries load, though the back half is a long run of parenthetical qualifiers that could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format needn't be described, and annotations cover the safety profile; the description completes the picture with partial-update behavior, authorization, and the concurrency handshake for follow-up writes. It is not fully complete only because several of the 15 parameters remain undocumented in both description and schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 47% (below 50%), so the description needs to carry weight, and it does for the two hardest fields: baseUpdatedAt (why it exists, where to copy it from, what a stale value triggers) and imagineAdventureId (valid id source, null-untag, omit-unchanged). However, roughly half the parameters (image, status semantics, battlemaps, characters, sessionImages, the date* fields) get no added meaning beyond the schema. Partial compensation justifies a 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and then enumerates the concrete capabilities (append notes, change date, rename, tag with imagineAdventureId), which lets an agent distinguish it from create_session / delete_session / get_session without opening a schema. The `by id` scoping and the tagged-adventure example are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (the four enumerated edits), what it requires (fresh read of the record for baseUpdatedAt), which tools supply needed data (play_get_session, play_get_campaign's imagineAdventures), null-vs-omit semantics for untagging, and who is denied ('players get 403'). Nothing material 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.
reply_to_submissionReply on one of my submissionsAInspect
Post a reply on one of the calling user's submissions, for example to answer a clarification question from Embers. Pass submissionId and text; optional attachments are ids from upload_submission_screenshot. The original report cannot be edited, and a closed submission takes no replies.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The reply. Optional only when attachments are provided. | |
| attachments | No | Upload ids from upload_submission_screenshot to attach. Optional, up to ten. | |
| submissionId | Yes | Mongo `_id` of one of the caller's submissions. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say the tool is not read-only, not idempotent, not destructive), the description discloses useful behavioral constraints: replies only work on the caller's submissions, the original report cannot be edited, and closed submissions reject replies. This gives the agent realistic expectations about side effects and failure conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: the core action appears in the first sentence, followed by parameter guidance and constraints in the next two sentences. Every sentence adds value, with no fluff or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with a full schema and an output schema present, the description covers the essential context: what the tool does, who can use it, what parameters matter, how attachments relate to another tool, and the key edge case (closed submissions). Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a meaningful description in the schema. The tool description adds a little context by tying attachments to upload_submission_screenshot and emphasizing the text/attachment pairing, but does not significantly go beyond what the schema already documents. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Post a reply') and resource ('one of the calling user's submissions'), and includes a concrete motivating example ('answer a clarification question from Embers'). This clearly distinguishes it from sibling tools like create_submission or get_submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: reply to a submission, optionally attach screenshots, and notes that a closed submission takes no replies. It also clarifies a limitation ('The original report cannot be edited'). It does not explicitly name alternative tools for when to use something else, but the guidance is sufficient for the primary workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_submission_screenshotUpload a screenshot for a submissionAInspect
Upload one screenshot to attach to a bug report, request, or reply. Pass mimeType and the base64 data. Returns { id, url }; pass the id in attachments on create_submission or reply_to_submission.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The image bytes, base64-encoded (no data: prefix). Up to 8 MB decoded. | |
| mimeType | Yes | Image type of the screenshot. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and don't convey substantial safety or side-effect information. The description adds the useful fact that the tool returns `{ id, url }` and that the id is used later, but it doesn't disclose idempotency, storage, or auth considerations beyond the schema's size limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first states the tool's purpose, the second covers required parameters and the return/usage contract. It is front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter upload tool with complete schema documentation, an output schema, and a clear workflow, the description covers everything needed to call it correctly and integrate the result with submission creation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, with `data` and `mimeType` already documented including base64 formatting, size, and enum values. The description only repeats the parameter names, adding no semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action: uploads a single screenshot to attach to a bug report, request, or reply. It also names the consumer tools (create_submission and reply_to_submission), which distinguishes it from sibling operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly defines the workflow: upload first, then pass the returned id in `attachments` on create_submission or reply_to_submission. It does not explicitly describe when not to use it or compare with alternatives, but no direct upload sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_attach_companionAttach a companion to a characterAInspect
Attach a buddy (animal companion, hireling, follower, granted NPC, stock monster) to a Main character the user may edit (their own, or any for an admin with Admin Mode on). The row appears in the sheet's Companions section. Mode is decided by ownership: 'owned' for a character the Main character's owner already owns (its values are then edited on its own document via vault_update_character — the row is a live window, no copy is made, no character slot is used); 'link' for a character someone else owns (the source is never written; track its hit points and uses via vault_update_companion_state). The same source may be attached more than once — each row is independent. Response is { companion, companions, updatedAt }; ADOPT the returned updatedAt as the Main character's fresh stamp for any follow-up write.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the Main character (owned by the calling user, or any character for an admin with Admin Mode on) the companion is attached to. | |
| mode | Yes | 'owned' when the Main character's owner owns the companion character (edits then write through to that character's own document; vault answers 403 otherwise). 'link' for a character anyone else owns — stock monsters, a GM's NPC — tracked via a local overlay that never writes to the source. To get a fully-editable copy of a creature the user does NOT own, vault_clone_character it first, then attach the copy with mode 'owned'. | |
| characterId | Yes | Mongo `_id` of the character to attach as the companion. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutability profile (readOnly false, idempotent false, destructive false); the description goes well beyond by disclosing that 'owned' rows write through with no copy and no character-slot consumption, that 'link' never writes the source, that the same source can be attached repeatedly as independent rows, and by telling the caller to adopt the returned updatedAt as the fresh stamp for follow-up writes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and mode rule are front-loaded in the first two sentences and each remaining sentence carries information (ownership rule, write-through behavior, response shape). It is dense and somewhat redundant with the schema's mode text, which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with an output schema, everything an agent needs is present: eligibility, mode selection, side effects on source documents, multiplicity semantics, and the follow-up-write stamp. Return values themselves are covered by the output schema, so no gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema's own `mode` description is unusually thorough (enum semantics, 403 condition, clone-then-attach path), so the description largely restates rather than extends parameter meaning. The only added guidance, the updatedAt stamp, concerns the response rather than an input parameter, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb (attach) and resource (a buddy/companion of enumerated kinds) to a Main character, and immediately bounds who may edit that character (owner, or admin in Admin Mode). It also names the sibling operations an agent might otherwise confuse it with (vault_update_character, vault_update_companion_state, vault_clone_character).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit decision rule for choosing between the two modes ('owned' by ownership vs 'link' for someone else's character), states the failure condition (403 otherwise), and names an alternative workflow for a case this tool does not serve ('To get a fully-editable copy ... vault_clone_character it first, then attach with mode owned').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_build_monsterBuild a monsterAInspect
Create a complete monster character in one call, in a ruleset the monster builder supports (the ruleset field's list; list_rulesets gives each code's label). Replaces the vault_create_character + multiple vault_update_character pattern for monster authoring — fully typed input schema, so structured fields cannot be silently stringified. Caller passes source-text values (final AC, skill bonuses, attack bonuses); vault computes the stored base values, derives proficient / expertise / misc flags, formats spell-list markdown, creates recharge trackables, generates the challenge, legendary-intro, and alternate-form speed notes. Sets type: 'monster', settings.autoPassiveBonuses: false, and the derived core.experience automatically. The authoring guide at vault_get_authoring_guide({ rulesetCode: <the monster's ruleset>, entityType: 'monster' }) documents every field's source-text meaning and is the conventions reference for what shape to send. Returns the created character document.
| Name | Required | Description | Default |
|---|---|---|---|
| ac | Yes | AC block. `total` is the value the sheet should display (the source-text number). Vault computes the stored base from it, the `armorWeight` given, and any shield/magic/misc bonuses, per the guide Rule 1. | |
| cr | Yes | Challenge Rating as a number, a fraction as its decimal (e.g. 0.125 for CR 1/8); vault answers an error for a value that is not a challenge rating. Vault looks up XP reward + level-equivalent XP + proficiency bonus. | |
| hp | Yes | Maximum hit points. | |
| gear | No | Gear listed on the stat block, source text. Each becomes an items[] entry with `equipped: false` (monsters don't use equip slots) per Rule 19. Server-side template fill adds the currency items separately. | |
| name | Yes | Display name. Required. | |
| size | Yes | Size text, source-exact: a single value or the variable form ('X or Y') per the guide Rule 18. Stored verbatim in `core.size`. | |
| saves | No | Saving throw bonuses for the proficient ones only. Vault derives `attributes[].proficient = true` and a `misc` adjustment so the sheet total lands on the source bonus. | |
| speed | Yes | Speed block, in feet. `walk` is the base walking speed; the other modes become rules[] entries with the listed range. `alternateForm` carries a stat block's parenthetical alternate-form speed text, source-exact, per the guide Rule 5; lands in notes[]. | |
| senses | No | The stat block's senses other than the passive one the sheet derives, each as `name` and `detail` (the source text after the name). Each becomes a rules[] entry. The monster authoring guide covers which senses to author. | |
| skills | No | Skill bonuses for proficient / expertise skills only. Vault derives the proficient + expertise flags + misc so the sheet total matches the source bonus per the guide Rule 6. | |
| traits | No | Trait entries, source text. Use `summary` for a parenthetical usage limit per the guide Rule 14, and `detail` for a short qualifier per Rule 17; senses go under `senses`. | |
| actions | No | Action entries. `type` per the guide Rule 3. For attacks, pass `attackBonus` + `attackAttribute` + `damageDice` + `damageType` + `damageAttribute`; vault back-derives `attack.misc`. The guide Rule 3 gives `attackAttribute` for a spell attack. `recharge` takes the source's recharge text and creates a matching trackables[] checkbox the sheet renders as a cooldown; the guide gives the form. | |
| ruleset | No | A ruleset the monster builder supports. The authoring guide and the conversion math are ruleset-specific; other rulesets will land via their own build tools. | |
| abilities | Yes | Ability scores as numbers, one per ability score key. Vault computes modifiers, attack/damage/save/skill/initiative derivations. | |
| alignment | Yes | Alignment text, source-exact. | |
| languages | No | Languages text, source-exact. Stored in `core.languages`. | |
| immunities | No | Combined immunities row, source-exact, damage and condition entries as the source writes them. Use this when the source has one combined immunities row. | |
| hitDiceSize | No | Hit-die size from the stat block. Omitted, the app chooses the die. | |
| resistances | No | Resistances row, source-exact text. | |
| creatureType | Yes | Creature type, source text. Preserved verbatim into `core.race` per the guide Rule 16 'preserve original text'. | |
| hitDiceCount | Yes | Number of hit dice (the count, e.g. 12 for a creature with 12d8 listed in HP). | |
| spellcasting | No | Innate spellcasting block per the guide Rule 4: the casting ability, save DC, and the spells grouped by their source frequency text. Vault formats the spell list as markdown per that rule and lands it as a single rules[] entry. | |
| legendaryIntro | No | Intro paragraph of the stat block's legendary section (the prose about how those actions work for this creature). Lands in notes[] under the name the guide Rule 8 gives. Individual legendary entries go in `actions[]` with the matching `type`. | |
| additionalNotes | No | Any free-form notes[] entries the LLM wants to author beyond the auto-generated challenge, legendary-intro, and alternate-form speed rows. Use sparingly — most stat-block content has a dedicated structured field above. | |
| initiativeBonus | No | The listed initiative bonus. Pass it only if it differs from the bonus the sheet derives; vault keeps the difference in `offense.initiative.misc` per the guide Rule 17. | |
| vulnerabilities | No | Vulnerabilities row. | |
| damageImmunities | No | Split form: damage-only immunities, source-exact. Use only if the source has a separate damage immunities row. | |
| damageResistances | No | Split form: damage-only resistances, source-exact. Use only if the source has a separate damage resistances row. | |
| conditionImmunities | No | Split form: condition-only immunities, source-exact. Use only if the source has a separate condition immunities row. | |
| damageVulnerabilities | No | Split form: damage-only vulnerabilities, source-exact. | |
| sourceProficiencyBonus | No | Override the PB derived from CR. Use only when the source stat block explicitly lists a PB other than the one its CR gives. A PB larger than the sheet's keeps the difference in misc automatically, per the guide Rule 15. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that the vault back-derives base values and proficiency/expertise/misc flags, formats spell-list markdown, creates recharge trackables, generates challenge/legendary-intro/alternate-form notes, and auto-sets type, settings.autoPassiveBonuses and core.experience. It also states the input convention (caller passes source-text finals, vault computes stored bases), which is the key behavioral contract.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the replaced pattern, then the conversion behavior, then the guide pointer. Some clauses are long and dense, but each carries information an agent needs before calling; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 31-parameter, deeply nested, non-idempotent creation tool with an output schema, the description supplies the workflow, the replacement guidance, the derivation contract, the side effects, and a pointer to the authoritative field guide. Nothing an agent needs in order 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 31 parameters (baseline 3). The description adds a cross-cutting semantic layer the schema cannot: the source-text-in / derived-value-out convention for AC, skills and attack bonuses, plus the pointer to the authoring guide as the per-field meaning reference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a complete monster character in one call') and immediately distinguishes itself from the vault_create_character + vault_update_character sibling pattern. An agent can tell it is the monster-authoring entry point 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the pattern it replaces (create_character + multiple update_character calls) and routes the agent to list_rulesets for ruleset codes and vault_get_authoring_guide for field conventions. It stops short of an explicit 'do not use for PCs, use vault_build_pc instead' exclusion, which the dense sibling set would have benefited from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_build_pcBuild a player characterAInspect
Assemble a complete, playable player character in one call from a flat draft of choices, in a ruleset with guided creation (the ruleset field's list). Vault validates every pick against the user's own + stock content and builds the full sheet — ability scores (with background bump), skills, saves, hit points, starting equipment + derived weapon actions, granted rules / feats / abilities, trackables, and a creation-recap note. Read vault_get_pc_creation_options first to get legal ids and pools. Required: name, classRuleId, abilityScoreMethod, abilityScoreAssignments, skillProficiencies, toolProficiencies, startingEquipmentLabel. Required when present: backgroundFeatRuleId (an open featOpen background's feat, from the originFeatCategory feats — the build rejects the draft without it). Optional: speciesRuleId, backgroundRuleId, backgroundSkillProficiencies (when the background grants skills as a choice), the background bump (backgroundBumpMode + backgroundBumpAssignments), backgroundFeatRuleId (as a swap on a fixed-feat background), languages, languageChoicePicks (background/species language-choice grants), alignment, description/image/appearances/token, and the choice maps (proficiencyChoicePicks, abilityChoices, speciesAbilityChoices, backgroundFeatChoices, equipmentChoices, weaponAbilityChoices, abilityBumpPicks) plus the spell maps (spellChoicePicks, spellListChoicePicks, preparedSpellPicks, castingAbilityPicks) for spellcasters / spell-list-choice grants. proficiencyChoicePicks and spellChoicePicks are keyed ":" and only needed where a grant's count is smaller than its option pool. castingAbilityPicks is required for any spellChoices block surfacing castingAbilityOptions — the projection only surfaces that array when a pick is genuinely needed (a spellListChoices block's ability pick rides its spellListChoicePicks entry as castingAbility instead). The projected spellChoices/spellListChoices arrays may hold null entries (blocks inert at the starting level) — count them when keying picks by index. A feat chosen via an ability's ruleChoice (in abilityChoices/speciesAbilityChoices) brings its own sub-choices — supply them in those same maps keyed by the picked feat's _id. A repeatable feat filling the background slot (backgroundFeatRuleId) instead prefixes its pick keys bg:<featId>. The created character is owned by the calling user and returned in full. On an invalid draft vault returns the specific reason (e.g. a pick out of pool, a wrong pick count, a missing required choice) as a tool error — fix the draft and retry.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Character name. Required. | |
| image | No | Character portrait — `{ url }`. | |
| token | No | Default battlemap token art — `{ url }`. | |
| ruleset | Yes | A ruleset with guided character creation: the one the options were read for with `vault_get_pc_creation_options`. | |
| alignment | No | ||
| languages | No | The character's OWN chosen language names. The build adds any language the ruleset gives every character. `constants.languages.options` + `pickCount` are the conventional pool and count, but vault stores whatever is passed here — free-form names are allowed and the count is not enforced. (Languages a background/species GRANTS go in `languageChoicePicks`, not here.) | |
| appearances | No | Appearance roster — `[{ url }]`. The portrait (`image`) is typically the default appearance. | |
| classRuleId | Yes | Required. `_id` of a base Class rule (from `vault_get_pc_creation_options({ kind: 'class' })`). | |
| description | No | Character description / biography. | |
| speciesRuleId | No | `_id` of the heritage rule (from `kind: 'species'`). | |
| abilityChoices | No | Picks for a class ability's `choice` (ruleChoice). Key is the ability rule `_id`; value is exactly `choice.count` picked option `_id`s from `choice.options`. Each option carries a `type`. When a picked option carries its OWN sub-choices (any type — an Ability or a Feat), supply them in `proficiencyChoicePicks` / `spellChoicePicks` / `spellListChoicePicks` / `preparedSpellPicks` keyed by the picked option's `_id`, just like the background feat. | |
| abilityBumpPicks | No | Ability-score-increase picks for any applied rule carrying an `abilityScoreBump` (a feat / ability that raises a score by your choice). Key is the granting rule `_id`; value is `{ option, lines }`: `option` is the 0-based index of the chosen alternative in that bump's `options` (the player picks exactly ONE — the OR), and `lines` is parallel to that option's `lines`, each entry the lowercase ability names assigned to that line (the AND). Each line needs exactly its `count` distinct abilities drawn from its `eligible` pool (empty = any ability in the schema's abilities list), none exceeding its `max`. The build bakes the increases onto the ability scores before it derives the rest of the sheet. A `repeatable` feat filling the background slot keys `bg:<featId>` instead of `<featId>`. | |
| backgroundRuleId | No | `_id` of a Background rule (from `kind: 'background'`). | |
| equipmentChoices | No | Resolves equipment groups in the chosen bundle. Key is the group parent item `_id` (a `startingEquipmentOptions[].items[]` entry that carries `group.options`); value is the picked member `_id`. Every group in the chosen bundle needs an entry. | |
| spellChoicePicks | No | Picks for `spellChoices` blocks across ALL applied rules (class/species/feat/abilities). Key is `"<ruleId>:<blockIndex>"` (the Rule `_id` and the 0-based index into that rule's `spellChoices` AS PROJECTED — the array may contain null entries holding the position of blocks that grant nothing at the starting level; count them when indexing, never compact the array). Value is the chosen spell `_id`s. Only supply where a block's `count` < its option-pool size — a whole-pool block is granted automatically. Each block's options come from `vault_get_pc_creation_options` (an applied ability/feat's `spellChoices[].options`). A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<blockIndex>`. | |
| toolProficiencies | Yes | The class tool picks. Exactly `class.toolChoices.count` names from `class.toolChoices.options`. If an option is a group, pick a concrete member name, not the group. Empty array if none. | |
| abilityScoreMethod | Yes | How ability scores were chosen. See `constants.abilityScoreMethods` for the array / point-buy budget / costs. | |
| backgroundBumpMode | No | Required when the background grants an ability bump; each mode's amounts are the wizard constants' `backgroundBumpModeOptions`. | |
| preparedSpellPicks | No | Which spells the player keeps prepared, for rules carrying a `preparedSpells` count. Key is the granting rule `_id`; value is spell `_id`s drawn from the character's preparable granted spells — `spellChoices` picks, whole-pool fixed grants, and `spellListChoices` picks alike — EXCLUDING any granted by a block whose `prepared` flag is true (an always-prepared grant; the options projection ships `prepared` on each block so you can tell) and any the count does not cover (the rule authoring guide's preparedSpells section says which). The rule authoring guide.s preparedSpells section gives the required count; vault rejects picks that do not fit. A `repeatable` feat filling the background slot keys `bg:<featId>` instead of `<featId>`. | |
| skillProficiencies | Yes | The class skill picks. Exactly `class.skillChoices.count` names, each from `class.skillChoices.options`, no duplicates. Empty array if the class grants no skill choices. | |
| castingAbilityPicks | No | Spellcasting-ability picks for `spellChoices` blocks that carry `castingAbilityOptions` (a grant that lets the player choose the casting ability). Key is `"<ruleId>:<blockIndex>"` (same keying as `spellChoicePicks`); value is ONE lowercase ability name from that block's `castingAbilityOptions`. The projection surfaces `castingAbilityOptions` only when a pick is genuinely required (a fixed ability or a single option self-resolves server-side) — so whenever you see the array, supply a pick or the build rejects the draft. The resolved ability is stamped on each granted spell (`spells[].castingAbility`). A `repeatable` background feat prefixes the key `bg:<featId>:<blockIndex>` (same keying as spellChoicePicks). | |
| languageChoicePicks | No | Picks for a background's or species' language-CHOICE grant (`background.languages.choose` / `species.languages.choose`). Key is the granting rule's `_id`; value is exactly `languages.choose.count` names from `languages.choose.options` (an empty options pool means any `constants.languages.options`). The grant's `languages.fixed` are auto-applied and need no pick. Distinct from `languages` (the character's own picks). | |
| backgroundFeatRuleId | No | The background's feat, from the `originFeatCategory` feats. REQUIRED when `background.featOpen` is true (an open slot — the build rejects the draft without it); optional on a fixed-feat background, where supplying it swaps the authored default. Must be a feat in the `originFeatCategory` (from `kind: 'feat'`). | |
| spellListChoicePicks | No | Picks for `spellListChoices` blocks (choose ONE of the block's lists, then spells from that one list). Key is `"<ruleId>:<blockIndex>"` (the projected array may contain null entries holding the position of blocks the build skips — count them when indexing, never compact); value is `{ category, picks }` where `category` is one of the block's `categories` and `picks` is `{ "<pickIndex>": [spellId, …] }` — the chosen spells for each pick, drawn from that pick's `optionsByCategory[category]`. When the block carries `castingAbilityOptions`, also set `castingAbility` (one lowercase ability name from those options) — the build rejects the draft without it. A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<blockIndex>`. | |
| weaponAbilityChoices | No | For a weapon in the chosen bundle whose attack ability is a player pick: key is the item `_id`, value is the attack ability (one of the schema's enum). | |
| backgroundFeatChoices | No | Picks for the background feat's `choice` (ruleChoice) AND for any choice carried by the feat's granted abilities. Key is the feat `_id` (its own choice) or the granted ability's `_id` (that ability's choice); value is the picked rule `_id`s. | |
| speciesAbilityChoices | No | Same as `abilityChoices`, for a species ability's `choice`. A picked option's own sub-choices (any type — Ability or Feat) go in the proficiency/spell pick maps keyed by that option's `_id`. | |
| proficiencyChoicePicks | No | Picks for proficiencyChoices grants across ALL applied rules (class/species/feat/abilities). Key is `"<ruleId>:<grantIndex>"` (the Rule `_id` and the 0-based index into that rule's `proficiencyChoices`); value is the chosen names (skills/tools/saves/weapons/armor/languages). Only supply for grants where `count` < the option-pool size — fixed grants (count >= pool) are auto-applied and need no pick. A grant with `level: "expertise"` grants the expertise state rather than proficiency, from the pool the rule authoring guide describes (proficiencyChoices). A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<grantIndex>` (not `<featId>:<grantIndex>`). | |
| startingEquipmentLabel | Yes | The chosen equipment bundle — must equal one `class.startingEquipmentOptions[].label` exactly. | |
| abilityScoreAssignments | Yes | Final ability scores by ability key, every key required. Must satisfy the chosen `abilityScoreMethod` as `constants.abilityScoreMethods` describes it (still send every value you intend). | |
| abilityScorePointBudget | No | Budget override for an ability-score method that spends a budget. Defaults to that method's budget in `constants.abilityScoreMethods`. Ignored for a method without one. | |
| backgroundBumpAssignments | No | Background ability-score bump per key, as `backgroundBumpMode` distributes it (each mode's amounts are the wizard constants' `backgroundBumpModeOptions`, from `vault_get_pc_creation_options` kind `constants`). Keys not bumped are omitted or 0. Only the background's `abilityScores` keys are eligible. | |
| backgroundSkillProficiencies | No | The background skill picks, when the background grants skills as a CHOICE (`background.skillChoices`). Exactly `background.skillChoices.count` names from `background.skillChoices.options`, no duplicates. Parallel to `skillProficiencies` (the class picks). Omit when the background has no `skillChoices` block; a background's fixed `skillProficiencies` are auto-applied and need no pick. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only flagging a non-read-only, non-idempotent mutation, the description carries real weight: it discloses that the build validates every pick against user+stock content, builds the full sheet, assigns ownership to the calling user, and returns it in full. It also specifies error behavior — invalid drafts surface the specific reason (out-of-pool pick, wrong count, missing choice) as a tool error to fix and retry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and prerequisite are front-loaded, and for a 33-parameter tool with intricate choice-map keying most sentences do carry needed information. However, it is delivered as one monolithic paragraph with no structural separation, making the dense required/optional/keying/error sections harder to parse than they need to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly complex build tool with nested choice maps and an existing output schema, the description covers the prerequisite, the graded requirement levels, keying conventions, spellcasting edge cases, and failure semantics. Nothing an agent needs to assemble a valid draft and recover from rejection is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 97%, so the baseline is 3, but the description adds cross-cutting rules the schema presents piecemeal: the required-when-present semantics of backgroundFeatRuleId, the '<ruleId>:<grantIndex>' keying convention, and the 'bg:<featId>' prefixing for repeatable feats filling the background slot. It does not add genuinely new parameter meaning beyond consolidating schema-level detail, so it stops short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a precise verb+resource ('Assemble a complete, playable player character in one call from a flat draft of choices') and scopes it to rulesets with guided creation. It enumerates the concrete artifacts produced (ability scores, skills, saves, HP, equipment, feats, trackables, recap note), which clearly separates it from raw-create siblings like vault_create_character.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite ('Read vault_get_pc_creation_options first to get legal ids and pools') and a rich required/optional/required-when-present breakdown. It does not explicitly contrast with the adjacent siblings (vault_create_character, vault_level_up_pc), so the alternative-selection guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_clone_characterClone a vault characterAInspect
Duplicate any vault character the calling user can see — their own characters, stock template content, and other users' authored characters are all valid sources. The server does the deep-copy (stats, skills, items, rules, spells, trackables, all of it) — caller passes only the source id and optionally a new name. The new character is owned by the caller (not the source's original owner) and counts against the caller's character entitlement limit. When name is omitted, the clone is named <source name> (Copy). Use this instead of fetching the source sheet and re-POSTing it via vault_create_character.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the source character to clone. | |
| name | No | Optional name for the new character. Defaults to `<source name> (Copy)` when omitted, matching the web client's clone behavior. Whitespace-only values are rejected at the schema layer so a silently-trimmed-to-empty name can't reach the backend. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: deep-copy semantics, ownership transfer to the caller, entitlement/quota impact, and default naming when name is omitted. These are non-obvious consequences not inferable from readOnlyHint or destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight, purposeful sentences. It front-loads the core scope, then covers mechanics, ownership/quota, and the alternative without filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, this is complete: it covers source scope, deep-copy behavior, ownership, quota effects, naming, and the correct alternative. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents both parameters, including the default naming behavior and whitespace validation. The description reiterates that name is optional but adds no genuinely new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Duplicate any vault character') and enumerates valid source types, which clearly distinguishes it from vault_create_character and other vault tools. It also names the key alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directly tells the agent when to use this tool: whenever cloning any visible character. It names the alternative (vault_create_character) and explains why this tool should be preferred over fetching and re-POSTing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_create_characterCreate a vault characterAInspect
Create a new character in the user's vault. Requires name and ruleset. The vault server fills the per-ruleset sheet skeleton (the ruleset's attributes, skills, defense scaffolding, and the rest) for any sections the caller omits — a minimal { name, ruleset } body produces the same shape the web and iOS clients create. The passthrough schema accepts richer structure when you want to set sections inline at create time. Set type: "monster" (lowercase) to mark a monster. The new character is owned by the calling user. Note: characters can be linked to active play campaigns; modify them with care if so.
| Name | Required | Description | Default |
|---|---|---|---|
| core | No | ||
| dead | No | ||
| name | Yes | Character name. Required. | |
| type | No | Character type. Free-form per ruleset. Set to 'monster' (lowercase) to mark an authored monster; vault's character list endpoint filters that value out of the default catalog view. | |
| image | No | ||
| items | No | ||
| notes | No | ||
| rules | No | ||
| speed | No | ||
| active | No | ||
| skills | No | ||
| spells | No | ||
| stress | No | ||
| actions | No | ||
| aspects | No | ||
| defense | No | ||
| offense | No | ||
| ruleset | Yes | Ruleset code, from list_rulesets (the codes this account can use). Required. Restricted rulesets require an entitlement grant on the account — vault answers 403 for ungranted or unknown codes. | |
| settings | No | ||
| attributes | No | ||
| trackables | No | ||
| description | No | ||
| personality | No | ||
| activeStates | No | The states the player declared on the sheet (one of the schema's enum). The sheet's Rage button sets one and spends a Rage use; a rest clears them. Writing it directly spends no use. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent write. Beyond that, the description adds genuinely useful behavior: the server auto-fills omitted sheet sections, the result is owned by the calling user, and created characters may be linked to active campaigns so later edits need care. It does not mention entitlement/403 behavior (that lives in the schema), so it is not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the required fields and the server-fills-skeleton behavior, then layers the monster flag and the campaign caveat. Six sentences is on the long side but each carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 adequately covers the minimal-body contract and the monster/ownership/campaign caveats. What is missing for a tool with 24 parameters, a nested passthrough body, and three near-identical siblings is any statement of which creation path to choose and what the key optional sections are for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 24 parameters and only 17% schema description coverage, the description carries meaningful weight by explaining that the body is a passthrough whose omitted sections are server-filled, and by calling out `type: "monster"` (lowercase) semantics. Still, most of the 24 top-level parameters (items, rules, defense, offense, trackables, etc.) get no orientation in the description, so the gap is only partially closed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new character in the user's vault') and names the two required fields, so the action is unambiguous. However, it never distinguishes itself from the very similar siblings vault_build_pc, vault_build_monster, and vault_clone_character, so an agent cannot tell from the description alone which of these four creation paths applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives real context — a minimal `{ name, ruleset }` body is sufficient because the server fills the sheet skeleton, and the passthrough schema allows richer inline structure. But it offers no explicit when-to-use versus vault_build_pc / vault_build_monster / vault_get_pc_creation_options, which is the main routing decision an agent faces here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_create_itemCreate a vault itemBInspect
Create a new user-authored item of any of the ruleset's item types. Vault validates ruleset-specific fields (damage, properties, equip slots, weight); send them via the passthrough schema. The new item is owned by the calling user.
| Name | Required | Description | Default |
|---|---|---|---|
| ogl | No | ||
| cost | No | Cost in gold pieces (max 2 decimal places). Vault enforces non-negativity and precision. | |
| name | Yes | Display name. Required. | |
| type | Yes | Item type. Required. | |
| uses | No | ||
| image | No | ||
| active | No | ||
| damage | No | ||
| effect | No | ||
| source | No | ||
| weight | No | ||
| _parent | No | Parent item ObjectId for variant items. | |
| healing | No | ||
| mastery | No | Weapon mastery name, for rulesets whose weapons carry one, as the ruleset's catalog names it. | |
| ruleset | No | Ruleset code, from list_rulesets. | |
| summary | No | Short one-line summary. | |
| duration | No | ||
| rollMods | No | ||
| publisher | No | ||
| actionType | No | Authoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`. | |
| armorClass | No | Base AC value the armor provides. | |
| damageDice | No | Base damage expression (e.g. '1d8'). | |
| damageType | No | Damage types as an array of strings (most items have one type; some have multiples). | |
| diceFloors | No | ||
| equipSlots | No | Allowed equip slot ids, from the ruleset's own slots (an existing item's equipSlots, via vault_get_item, shows them). | |
| parameters | No | ||
| properties | No | ||
| ruleChoice | No | ||
| weaponType | No | Weapon category, as the ruleset's catalog names it (vault_search_items shows them). | |
| description | No | Full item description. Markdown is supported. | |
| resistances | No | ||
| statBonuses | No | ||
| mechanicsKey | No | ||
| spellChoices | No | ||
| armorCategory | No | Armor category, as the ruleset's catalog names it (vault_search_items shows them). | |
| prerequisites | No | ||
| forcedMovement | No | ||
| maxDexModifier | No | Cap on the DEX bonus this armor allows, from the item's source text. | |
| preparedSpells | No | ||
| abilityScoreSet | No | ||
| damageReduction | No | ||
| recurringDamage | No | ||
| abilityScoreBump | No | ||
| diceReplacements | No | ||
| spellListChoices | No | ||
| prerequisitesLogic | No | ||
| proficiencyChoices | No | ||
| stealthDisadvantage | No | ||
| strengthRequirement | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, idempotentHint=false). The description adds one useful behavioral fact: owned by the calling user. It omits what validation failures look like, whether duplicate names are allowed, and what the passthrough schema is or where to find it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load the action and scope, then validation and ownership. No filler, though the 'passthrough schema' mention raises a question it never resolves.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 49-param creation tool with a nested, ruleset-driven schema needs more than three sentences: an agent lacks guidance on the passthrough schema, required ruleset linkage, defaults, and failure modes. The existence of an output schema removes only the need to describe returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
49 parameters with 33% schema description coverage. The description mentions only that ruleset-specific fields (damage, properties, equip slots, weight) ride through the passthrough schema, but never defines that schema, its location, or guidance on nested structures like uses, statBonuses, and spellChoices. It does not compensate for the large description gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Create') and resource ('a new user-authored item of any of the ruleset's item types'), and the ownership outcome. An agent can distinguish it from vault_update_item and vault_create_spell without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage via 'user-authored' and 'ruleset-specific fields... send them via the passthrough schema', but no explicit when-to-use/when-not or named alternative (e.g., vault_clone_character or vault_update_item). It does not state prerequisites such as a required ruleset code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_create_ruleCreate a vault ruleBInspect
Create a new user-authored rule of any rule type (the type field lists them). The new rule is owned by the calling user and is a 'house rule' unless the caller is an admin with Admin Mode on. Vault validates the payload; missing required fields return a vault error.
| Name | Required | Description | Default |
|---|---|---|---|
| age | No | ||
| ogl | No | ||
| feat | No | Mongo `_id` reference (24-character hex string). | |
| name | Yes | Display name. Required. | |
| size | No | ||
| type | No | Rule category. Required at create time; vault rejects without it. | |
| uses | No | ||
| image | No | ||
| range | No | How far the ability reaches when invoked: `kind`, plus `distance` and its `unit` for a kind that takes a distance. Absent: the rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the default. | |
| speed | No | ||
| active | No | ||
| damage | No | ||
| effect | No | ||
| hitDie | No | ||
| source | No | ||
| _parent | No | Mongo `_id` reference (24-character hex string). | |
| actions | No | Action-cost marker, for rulesets whose rules carry one; the value is the source text. | |
| healing | No | ||
| ruleset | No | Ruleset code, from list_rulesets. | |
| summary | No | Short one-line summary. | |
| duration | No | ||
| featOpen | No | ||
| keywords | No | ||
| rollMods | No | ||
| abilities | No | ||
| languages | No | ||
| publisher | No | ||
| actionType | No | Authoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`. | |
| categories | No | ||
| diceFloors | No | ||
| parameters | No | ||
| repeatable | No | A rule that may be taken/granted more than once, each time as a distinct instance with its own sub-choices — a repeatable feat, or a class ability its class grants at several levels. | |
| ruleChoice | No | ||
| description | No | Full rule body. Markdown is supported. | |
| resistances | No | ||
| statBonuses | No | ||
| toolChoices | No | ||
| creatureType | No | ||
| mechanicsKey | No | ||
| savingThrows | No | ||
| skillChoices | No | ||
| spellChoices | No | ||
| abilityScores | No | ||
| actionEconomy | No | What invoking the ability costs on a turn. The rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the absent default. Distinct from the mechanics actionType (a kind-of-action label). | |
| armorTraining | No | ||
| multiclassing | No | What multiclassing INTO this class grants (weapon/armor lists apply fixed; skillChoices/toolChoices render pickers). Absent = no multiclass proficiencies. | |
| prerequisites | No | ||
| castingAbility | No | The ability this rule's spellcasting keys off. Author it on a class's Spellcasting ability rule; vault's creation and level-up wizards write it to the character-wide Spellcasting Ability (first-wins, never overwriting), and a multiclass whose ability differs stamps its granted spells per-entry. Distinct from a spell block's castingAbility, which overrides per grant. Absent = the rule says nothing about the character's casting ability. | |
| forcedMovement | No | ||
| preparedSpells | No | ||
| spellAbilities | No | ||
| abilityScoreSet | No | ||
| damageReduction | No | ||
| recurringDamage | No | ||
| abilityScoreBump | No | ||
| diceReplacements | No | ||
| levelProgression | No | ||
| spellListChoices | No | ||
| casterProgression | No | How this class contributes to the combined multiclass spell-slot pool; the engine applies each progression's rule. Authorable on a base class or a subclass (a subclass that grants the casting carries it). Absent = non-caster. | |
| startingEquipment | No | ||
| toolProficiencies | No | ||
| prerequisitesLogic | No | ||
| proficiencyChoices | No | ||
| skillProficiencies | No | ||
| weaponProficiencies | No | ||
| defaultAbilityScores | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds genuine behavioral facts beyond that: ownership semantics, the house-rule/admin-mode distinction, and validation behavior ('missing required fields return a vault error'). It does not mention auth requirements for admins or what the response contains, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, and each sentence adds a distinct fact (scope, ownership, validation). Efficient with no filler, though it is arguably too terse for a tool of this complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be explained, and annotations cover safety. Still, for a 66-parameter creation tool with heavy nested objects, the description gives no pointer to the authoring guide or lookup tools that the schema itself references, leaving the agent under-oriented for a first call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 66 parameters and only 23% schema description coverage, the description must carry much more of the parameter burden, but it only gestures at the `type` field ('the `type` field lists them') and at required fields generally. The vast nested structures (damage, statBonuses, requires predicates, actionEconomy) get no orientation from the description, so the low-coverage schema is not compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new user-authored rule') and scopes it ('of any rule type'), which cleanly separates it from vault_update_rule and vault_delete_rule in the sibling list. It does not explicitly name a sibling or a disambiguation condition, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description carries real context about ownership ('owned by the calling user', 'house rule' unless admin with Admin Mode on), which implicitly signals when this tool applies rather than update/delete. However, it never states when to prefer this over alternatives such as vault_update_rule, nor that vault_get_authoring_guide and vault_search_rules are the prerequisite sources for a valid payload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_create_spellCreate a vault spellBInspect
Create a new user-authored spell or power. Vault validates ruleset-specific required fields (level, casting time, components, range, duration, etc.); send them via the passthrough schema. The new spell is owned by the calling user.
| Name | Required | Description | Default |
|---|---|---|---|
| ogl | No | ||
| area | No | Area of effect. `shape`; `size` (ft); `width` for a line. | |
| name | Yes | Display name. Required. | |
| rank | No | Rank, for rulesets whose spells carry one. Free-form. | |
| type | No | Spell type (the ruleset's name for a spell). Required at create. | |
| uses | No | ||
| level | No | Spell level, within the schema's range. The spell authoring guide gives the convention. | |
| range | No | Range. `kind`; `distance` and its `unit` for a ranged spell (absent unit = feet). | |
| active | No | ||
| damage | No | ||
| effect | No | ||
| ritual | No | Ritual tag: the spell can be cast as a ritual. | |
| school | No | Spell school name. | |
| source | No | ||
| _parent | No | Parent spell ObjectId for variant spells. | |
| actions | No | Action-cost marker, for rulesets whose spells carry one; the value is the source text. | |
| classes | No | Class-membership list for rulesets whose spells do not use `categories` (the spell authoring guide covers `categories`). Free-form per ruleset. | |
| healing | No | ||
| ruleset | No | Ruleset code, from list_rulesets. | |
| summary | No | Short one-line summary. | |
| duration | No | Spell duration. `unit`; `count` for a timed unit; concentration flag; upTo flag for a non-concentration capped duration ("Up to 1 minute"). | |
| rollMods | No | ||
| publisher | No | ||
| actionType | No | Authoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`. | |
| categories | No | Go-forward class membership. The field `spellChoices[].allowedCategories` filters on; the vault UI labels it 'Class(es)'. Free-form, taggable. | |
| components | No | Components: verbal/somatic/material flags, plus material text, gp cost, and consumed flag. | |
| diceFloors | No | ||
| parameters | No | ||
| ruleChoice | No | ||
| castingTime | No | Casting time. `unit`, plus `count` for a timed unit. | |
| description | No | Full spell body. Markdown is supported. | |
| higherLevel | No | Scaling text: what changes when the spell is cast at a higher level or scales with the caster, source text. | |
| resistances | No | ||
| statBonuses | No | ||
| mechanicsKey | No | ||
| spellChoices | No | ||
| prerequisites | No | ||
| forcedMovement | No | ||
| preparedSpells | No | ||
| abilityScoreSet | No | ||
| damageReduction | No | ||
| reactionTrigger | No | For a casting time taken in response to a trigger, the trigger text, source text. | |
| recurringDamage | No | ||
| abilityScoreBump | No | ||
| diceReplacements | No | ||
| spellListChoices | No | ||
| prerequisitesLogic | No | ||
| proficiencyChoices | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower, and the description still adds real value: it discloses that Vault server-side validates ruleset-specific required fields (level, casting time, components, range, duration) and that the created spell is owned by the calling user. It does not mention auth/permission requirements or rate limits, but the validation and ownership details go meaningfully beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the purpose front-loaded, followed by validation behavior and ownership. Nothing is redundant or padded, which is notable for a tool with 48 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be described. However, for a 48-parameter create tool the description covers only a fraction of the surface and never points to the sibling authoring guide or list_rulesets, which the schema fields themselves reference. Adequate but leaving clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low at 44% across 48 parameters, so the description carries a heavy compensation burden. It names only about five fields (level, casting time, components, range, duration) without explaining their semantics, and the 'passthrough schema' note is the only structural hint. This leaves most parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new user-authored spell or power'), so an agent can immediately tell it apart from vault_update_spell, vault_delete_spell, and vault_get_spell by name. It stops short of explicitly naming those siblings or the search/list alternatives, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what to do with the fields ('send them via the passthrough schema') but gives no when-to-use/when-not guidance and never names an alternative (e.g., vault_update_spell for edits, vault_get_authoring_guide for conventions). Usage is only implied by the verb 'Create'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_delete_characterDelete a vault characterADestructiveIdempotentInspect
Permanently delete a character by id. Caution: a deleted character is removed from any campaigns or expeditions referencing it. Run vault_get_character first to inspect linkage.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the description need not restate those. It adds valuable behavioral context beyond annotations by disclosing the cascade effect (removal from referencing campaigns/expeditions) and recommending a pre-deletion inspection step. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence immediately states the action and target; the second delivers the critical caution and prerequisite. This is front-loaded, focused, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete operation, the description covers the essential concerns: permanence, cascade effects, and a recommended pre-step. The presence of an output schema means return-value details do not need to be in the description. Minor gaps remain (e.g., failure conditions if the character is referenced), but the description is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the schema already defines 'id' as the Mongo `_id` of the vault document. The description merely echoes 'by id' without adding further semantic detail (e.g., id format, validation constraints, or relationship to other resources). Baseline 3 is appropriate because the schema carries the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Permanently delete') and resource ('a character by id'), making the tool's purpose unambiguous. It also differentiates from similar siblings like vault_delete_item or vault_delete_rule by explicitly targeting characters, and the 'vault' prefix separates it from play_delete_character.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: deletion is permanent and cascades to campaigns/expeditions referencing the character. It gives a direct prerequisite ('Run vault_get_character first to inspect linkage'), which is actionable guidance, though it does not explicitly mention when not to use this tool or alternative tools like vault_unlink_character.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_delete_itemDelete a vault itemBDestructiveIdempotentInspect
Permanently delete a user-authored item by id. Cannot delete stock content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true, so the description correctly states 'permanently delete' which aligns. However, it does not add context about irreversibility, potential cascading effects, or authorization requirements. The description adds minimal value beyond the annotations, but it does clarify permanence, which is slightly beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only 2 sentences and is front-loaded with the action and restriction. It is concise and to the point, with no superfluous information. It could be slightly more structured, but it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one param, no output schema details, annotations cover destructive nature), the description is adequate but does not address how to distinguish vault items from stock content or what happens after deletion. Since an output schema exists, return value explanation is not needed, but the restrictions and implications are not fully fleshed out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description for the 'id' parameter is minimal ('Mongo `_id`'), and the tool description does not elaborate on what kind of identifier is needed or how to obtain it. Since schema coverage is 100%, but the schema description provides little semantic depth, the description should compensate but does not. It only says 'by id', which is redundant with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'delete' and the resource 'vault item', and explicitly notes that stock content cannot be deleted, which distinguishes it from other delete tools. It could be improved by contrasting with similar delete tools like vault_delete_character, but it is otherwise clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not specify when to use this tool versus alternatives, such as vault_delete_character, or when not to use it. It only mentions the restriction on stock content, which is a constraint but not a usage guideline. No exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_delete_ruleDelete a vault ruleADestructiveIdempotentInspect
Permanently delete a user-authored rule by id. Cannot delete stock content. Pair with vault_get_rule first to confirm the target.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description doesn't need to restate those. The description adds the key behavioral constraint that stock content cannot be deleted, which is beyond the annotations. It also clarifies the operation is permanent, which reinforces the destructive nature. This adds value beyond the structured data without 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the action and scope; the second provides a critical safety guideline. Every word earns its place, and the most important information (permanence, user-authored only) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete tool with a full output schema and annotations covering destructive/idempotent behavior, the description is nearly complete. The only minor gap is that it doesn't describe what happens if the id doesn't exist or if the user lacks permission, but the output schema likely covers error responses. The 'pair with vault_get_rule' guidance compensates for potential misuse. A 4 is fair given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the only parameter 'id' is fully described as the Mongo `_id` of the vault document. The description adds that the id refers to a user-authored rule, which is a slight semantic enrichment, but the schema already carries the main meaning. Baseline 3 is correct because the schema does the heavy lifting and the description adds only marginal context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Permanently delete'), a specific resource ('user-authored rule'), and identifies it by id. It also distinguishes from stock content deletion, which is a clear scope boundary. The title 'Delete a vault rule' is reinforced with the permanent and user-authored qualifiers, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to pair with vault_get_rule first to confirm the target, which is a clear usage guideline. It does not explicitly name alternatives or when-not-to-use, but the sibling list includes vault_delete_character, vault_delete_item, vault_delete_spell, and the 'Cannot delete stock content' exclusion provides context. A 4 is appropriate because it gives actionable guidance but doesn't fully enumerate alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_delete_spellDelete a vault spellADestructiveIdempotentInspect
Permanently delete a user-authored spell by id. Cannot delete stock content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as destructive and non-read-only, and the description adds meaningful context: the deletion is 'permanent' and limited to user-authored spells. This goes beyond the annotation hints and clarifies an important behavioral boundary. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The core action and the key restriction are both stated up front, and every word contributes to the agent's understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete operation with annotations covering destructive behavior and an output schema present, the description is complete. The permanent-deletion warning and stock-content restriction give the agent the essential operational context it needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single `id` parameter as a Mongo `_id` with 100% coverage. The description mentions deletion 'by id' but adds no additional semantic detail beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Permanently delete a user-authored spell by id.' It also adds a scoping constraint ('Cannot delete stock content') that clearly distinguishes the tool's intended target from other content types. This is easily differentiated from sibling tools like vault_delete_character or vault_delete_rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the key usage condition explicit: only user-authored spells can be deleted, and stock content cannot. It does not name alternative tools, but the resource-specific scope and the exclusion are sufficient for an agent to decide when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_detach_companionDetach a companion from a characterADestructiveIdempotentInspect
Remove a companion row from a Main character's sheet by the ROW's _id (from the companions[] array — not the buddy's own character id). Detaching an 'owned' row leaves the referenced character in the user's vault untouched; detaching a 'link' row discards the locally-tracked overlay counters (the source character is untouched either way). Response is { companions, updatedAt }; ADOPT the returned updatedAt as the Main character's fresh stamp.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the Main character carrying the companion row. | |
| companionId | Yes | The companion ROW's `_id` from the Main character's `companions[]` array — NOT the buddy character's own `_id`. Read it off vault_get_character. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that detaching an 'owned' row leaves the referenced character untouched, while a 'link' row discards local overlay counters. It also explains the response shape and instructs the agent to adopt the returned `updatedAt`, adding valuable operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: the action, the identifier caveat, the two row-type behaviors, and the response/updatedAt instruction are all operational essentials. It is well-structured and front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has two fully described parameters, clear annotations, and an output schema, and the description covers the behavioral nuances and response handling. An agent has everything it needs to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds critical disambiguation: `companionId` is the row `_id` from `companions[]`, not the buddy character's id, and should be sourced from vault_get_character. This prevents a highly plausible misuse that the schema alone might not fully communicate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Remove') and resource ('companion row from a Main character's sheet') and clarifies the exact identifier by which removal happens. It clearly differentiates from related vault operations by specifying the row `_id` rather than a character id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool applies by distinguishing 'owned' rows from 'link' rows and explaining the different consequences. It does not explicitly name alternatives like vault_attach_companion, but the use case is evident from the semantics and sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_authoring_guideGet a vault authoring guideARead-onlyIdempotentInspect
Fetch a markdown reference guide that teaches the conventions for authoring a specific entity type in a specific ruleset. Returns the full markdown body, including front-matter metadata (ruleset, entityType, version) at the top. Entity types: 'monster' — monster stat-block authoring (the field map, the stat block math, action types, spell formatting, resistances/immunities, keywords, a worked example), authored via vault_build_monster or vault_create_character + vault_update_character; 'rule' — classes / species / backgrounds / feats / abilities (the type taxonomy, the parent→Ability grant model, type-specific section fields, and the shared mechanics blocks: proficiencyChoices, spellChoices, spellListChoices, preparedSpells, freeCast, uses, ruleChoice, statBonuses), authored via vault_create_rule + vault_update_rule; 'spell' — the spell detail header (casting time / range / area / components / duration), the categories (Class(es)) membership convention, and the damage/healing/effect mechanics blocks, authored via vault_create_spell + vault_update_spell. Pass the ruleset code you are authoring for (list_rulesets gives the codes). Call this BEFORE authoring the matching entity so the result follows the established conventions instead of inferring shape from one-off samples. Returns a 'not found' tool error when the requested entityType / rulesetCode combination does not have a published guide yet.
| Name | Required | Description | Default |
|---|---|---|---|
| entityType | Yes | Entity the guide covers: 'monster', 'rule' (classes / species / backgrounds / feats / abilities), or 'spell'. Lowercase. A ruleset / entity pair with no published guide returns not found. | |
| rulesetCode | No | Ruleset code, from list_rulesets. Use the code, not the display label. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/no-destructive, so safety is covered. The description adds genuinely new behavior: it returns the full markdown body with front-matter metadata and returns a 'not found' tool error for unpublished entityType/rulesetCode pairs. That error-path disclosure is the key value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage are front-loaded, and the entity-type breakdown is dense but earns its length because it tells the agent what to author next. It is a single long paragraph, making it slightly heavy to scan, and a couple of clauses (e.g. restating rulesetCode from list_rulesets) do not add much.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param read-only lookup with an output schema already defining the return shape, the description covers purpose, routing to siblings, parameter meaning, and the failure mode (published-guide not found). Nothing an agent needs in order 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.
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 meaning beyond the schema by spelling out what each entityType value encompasses (stat-block math for 'monster', parent→Ability grant model for 'rule', categories membership for 'spell') and clarifying that rulesetCode must be the code, not the display label.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Fetch a markdown reference guide') and scopes it precisely to entity type + ruleset. It then enumerates exactly what each guide covers ('monster', 'rule', 'spell'), so an agent can distinguish it from the sibling authoring tools (vault_create_rule, vault_build_monster, etc.) 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use directive ('Call this BEFORE authoring the matching entity so the result follows the established conventions instead of inferring shape from one-off samples') and points at list_rulesets for the ruleset code. It stops short of naming alternative tools or explicit exclusions, so it is strong but not fully complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_characterGet a vault characterARead-onlyIdempotentInspect
Fetch one character document by id. Defaults to a summary shape: combat-relevant top-level fields (attributes, defense, offense, AC, HP, actions, skills) preserved; bulk text bodies on populated rule/item/spell refs and inline snapshots trimmed; notes/trackables reduced to names + key fields. Pass detail: 'full' for the populated shape with every description inline. The companions[] array (buddy ties — see vault_attach_companion) rides along untrimmed in both shapes, overlay state included; each row's _ref is a bare character id you can fetch with this tool. linkGroup, when present, is the id shared by this persona's linked sheets in other rulesets (created via vault_spawn_linked_character); it rides reads only and is not writable through the update tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. | |
| detail | No | Response shape. 'summary' (default) trims the bulk text bodies on the populated rules / items / spells refs and on the inline snapshots, preserving combat-relevant top-level fields. 'full' returns the populated document with every description inline. | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/not destructive/idempotent, and the description adds substantial behavioral detail: what the summary shape trims, what `full` restores, that `companions[]` rides along untrimmed with `state`, and that `linkGroup` is read-only. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: the core action is front-loaded, followed by shape behavior, then related fields and cross-tool references. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and annotations cover the read-only safety profile, the description is complete for an agent to call this tool correctly: it explains the id-based fetch, both response shapes, companion array handling, and linkGroup read semantics. Nothing important is left missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds meaningful operational meaning beyond the schema, especially for `detail`: it explains exactly what gets preserved, trimmed, or inlined in each shape. It doesn't add anything new about `id`, but the schema already covers that fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Fetch one character document by id.' The scope is unambiguous and the name vault_get_character matches the action, while the description clearly differentiates it from list/search tools and other vault_get_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for choosing the summary vs. full detail shape, explains how companion `_ref` values can be resolved by this tool, and warns that `linkGroup` is read-only via the update tool. It does not explicitly name when to prefer this over vault_search_characters, but the usage is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_itemGet a vault itemARead-onlyIdempotentInspect
Fetch one item document by id, including damage info, weight, properties, equip slots, and ammo settings. Pair with vault_search_items to locate the id first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the read-only nature is covered. The description adds the list of returned fields, which is useful context beyond the annotations, but it does not disclose any additional behavioral traits like error conditions, auth requirements, or return format. Since the annotations carry the safety profile, the description adds moderate value but doesn't go further.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no unnecessary words. The core action ('Fetch one item document by id') is front-loaded, and the pairing instruction is useful without redundancy. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only getter with an output schema and comprehensive annotations, the description is complete. It tells the agent what the tool does, what fields are included, and how to obtain the id (via vault_search_items). The output schema covers return values, and annotations cover safety, so no further detail is necessary for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for the single parameter 'id' with a clear description ('Mongo `_id` of the vault document'). The description simply says 'by id', adding no new semantic information beyond what the schema already states. Therefore, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), resource ('item document'), and key operation (by id). It lists the included fields (damage info, weight, properties, equip slots, ammo settings), which distinguishes it from other vault_get_* tools, and explicitly names the sibling 'vault_search_items' as the way to locate the id first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit workflow: 'Pair with vault_search_items to locate the id first.' This clearly tells the agent when to use this tool (when an id is available and full item details are needed) and points to the alternative for finding the id. It doesn't explicitly state when not to use it, but the pairing instruction is practical and sufficient for a get-by-id tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_levelup_optionsRead a character's level-up planARead-onlyIdempotentInspect
Read the level-up plan for a character whose ruleset has guided level-up (vault answers an error naming the ruleset otherwise) — the same computation vault's web wizard renders. Without classRuleId: the CHOOSER (the character's class entries with stored levels, the multiclass candidates each with warn-only prerequisite warnings[], xp.minimumForNext, atMaxLevel). A character with NO class entries (a hand-made sheet) gets RECORD mode instead: needsClassRecord: true plus recordOptions[] (every usable base class with subclasses[] and its subclassLevel) — record the existing classes with vault_record_pc_classes first, then re-read; the target plan and vault_level_up_pc reject a class-less character. With classRuleId: the TARGET PLAN for advancing that class one level — features[] (gained at the new level) / subclassFeatures[] / growth[] (held rules whose choice counts grew; their counts are DELTAS, "pick N more") each carrying its open choice blocks in the creation-option shape, plus multiclassGrants (entering a new class: fixed proficiency lines + skill/tool pickers), hitPoints {hitDie, average, conModifier}, prerequisiteWarnings[] (multiclass entry is warn-only, the player may proceed), spellSlots (combined multiclass pool preview, null when the plan has no combined pool), and xp {current, minimumForNewTotal}. Add subclassRuleId (at a subclass level, before committing the pick) to preview that candidate's features. ruleChoice pools arrive prerequisite-FILTERED — every listed option is one the character qualifies for at the level being gained. Read this before vault_level_up_pc and key every pick off what it returns.
| Name | Required | Description | Default |
|---|---|---|---|
| characterId | Yes | `_id` of the character to level (owned by the calling user, or any character for an admin with Admin Mode on). | |
| classRuleId | No | Omit for the CHOOSER (the character's class entries with their stored levels, the multiclass candidates with warn-only prerequisite warnings, the XP floor for the next level, atMaxLevel). Supply a base Class rule `_id` — one of the chooser's `classEntries[].classRuleId` to advance a held class, or a `multiclassOptions[]._id` to enter a new class — for the TARGET PLAN: `features[]` / `subclassFeatures[]` / `growth[]` (each feature in the creation option shape with its open choice blocks: `choice` {label,count,options}, spellChoices (each block carries `prepared` — true = its spells land always-prepared and are EXCLUDED from the preparedSpellPicks pool), spellListChoices (same `prepared` flag), preparedSpells, proficiencyChoices, abilityScoreBump; `growth[]` entries are already-held rules whose counts grew this level — their `count`s are DELTAS, "pick N more"), `multiclassGrants` (when entering a new class), `hitPoints` {hitDie, average, conModifier}, `prerequisiteWarnings[]` (warn-only), `spellSlots` (the combined multiclass pool preview, null when the plan has no combined pool), `openPickCount`, and `xp` {current, minimumForNewTotal}. ruleChoice pools arrive PREREQUISITE-FILTERED (an unqualified pick is also rejected on apply). | |
| subclassRuleId | No | With classRuleId, previews a tentative subclass pick before committing: the candidate's features (and their open choices) resolve into `subclassFeatures[]`. The pick itself still travels in `vault_level_up_pc.abilityChoices`, keyed by the class's subclass-choice ability. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the read-only/idempotent safety profile; the description adds substantial context beyond that — mode-dependent behavior, the error the vault returns when the ruleset lacks guided level-up, prerequisite-filtered pools, warn-only warnings, DELTA semantics for growth counts, and null handling for spellSlots.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a dense wall of parenthetical prose that heavily overlaps the already-detailed schema descriptions. It is information-dense yet verbose and repeats structured content, so it is appropriately sized but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be explained, and the description nonetheless covers the mode branches, cross-tool workflow, and edge cases. For a complex three-mode tool it is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions are themselves detailed, so the baseline is 3; the description adds mode-selection meaning (omit vs. supply classRuleId, and subclassRuleId as a tentative preview whose pick still travels via vault_level_up_pc). Much of this duplicates the schema, but the front-loaded mode disambiguation adds real value over the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (read the level-up plan for a character) and then disambiguates three distinct modes — CHOOSER, RECORD, and TARGET PLAN — based on parameters. An agent can tell exactly what it will get and how it differs from vault_level_up_pc and vault_record_pc_classes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('Read this before vault_level_up_pc and key every pick off what it returns') and names the prerequisite alternative ('record the existing classes with vault_record_pc_classes first, then re-read'). It also notes that the target plan and vault_level_up_pc reject a class-less character, giving clear when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_pc_creation_optionsRead character-creation optionsARead-onlyIdempotentInspect
Read the legal choices for guided character creation — the same projections vault's web wizard reads. Pass ruleset (one with guided creation: the ruleset field's list; list_rulesets gives each code's label) and kind to select one list: 'class' / 'species' / 'background' / 'feat' return the option projections (the calling user's own content plus stock, each option carrying its nested choices: skillChoices, toolChoices, startingEquipmentOptions, and per applied ability/feat — proficiencyChoices, spellChoices, spellListChoices, preparedSpells, and choice whose options carry a type; a background option also carries skillChoices + languages, a species option carries languages; background bump modes / feat, etc.); 'feat' returns every feat (a feat picked via an ability's choice carries its own proficiency/spell sub-choices); 'constants' returns the static reference data (skill list with attributes, ability-score methods with each method's data, language options + pick count, alignments, background bump modes, max ability score, and originFeatCategory — the feat category the background's open feat slot is restricted to; filter the 'feat' list to it for the background pick). Use this BEFORE vault_build_pc so every id and pick you send is one the user is actually entitled to. Start with 'constants' and 'class', then read 'species' / 'background' / 'feat' as the build takes shape.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which creation list to read. 'class' / 'species' / 'background' / 'feat' return the option projections (the user's own + stock content they may pick, with each option's nested choices — skillChoices, toolChoices, startingEquipmentOptions, and per applied ability/feat: proficiencyChoices {types,count,options}, spellChoices {count,options,prepared}, spellListChoices {categories,picks[].optionsByCategory,prepared}, preparedSpells {count} (a block's `prepared: true` = its spells land always-prepared and are EXCLUDED from the preparedSpellPicks pool), abilityScoreBump {options[].lines[]:{amount,count,eligible,max}} (supply the player's pick via `vault_build_pc.abilityBumpPicks`), and `choice` {count,options} where each option carries a `type`. The spellChoices / spellListChoices arrays are INDEX-ALIGNED with the authored blocks — a null entry holds the position of a block that grants nothing at the starting level; skip it when rendering but count it when keying picks. A 'background' option ALSO carries its own `skillChoices {count,options}` (a background skill-choice grant → supply picks via `vault_build_pc.backgroundSkillProficiencies`) and `languages {fixed, choose:{count,options}}`; a 'species' option carries `languages {fixed, choose}`. For a `languages.choose` grant, supply the picks via `vault_build_pc.languageChoicePicks` keyed by that rule's `_id`; `languages.fixed` apply automatically). 'feat' returns EVERY feat (the background slot uses the `originFeatCategory` feats; a feat picked via an ability's `choice` may be any) — a picked feat carries its own proficiency/spell sub-choices. Each 'feat' option carries `repeatable`; a `repeatable` feat filling the background slot keys its `vault_build_pc` picks with a `bg:` prefix. 'constants' returns the static reference data (skill list, ability-score methods and each method's data, language options, alignments, background bump modes, max ability score, and originFeatCategory — the feat category the background's open feat slot is restricted to; filter the 'feat' list to it for the background pick). Read 'constants' plus 'class' first; read 'species'/'background'/'feat' as the build takes shape. | |
| ruleset | No | A ruleset with guided character creation. Send the same ruleset to `vault_build_pc`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), but the description adds substantial behavioral context: it returns the calling user's own content plus stock, it mirrors the web wizard's projections, it explains nested choice structures, index-aligned null placeholders, repeatable feat key prefixes, and the originFeatCategory restriction. This is rich context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely long and dense, and large portions duplicate the already exhaustive input schema descriptions. While the purpose and sequencing are front-loaded, the sheer volume means many sentences do not earn their place, making it hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of guided character creation and the presence of a rich output schema, the description is complete enough: it covers ordering, entitlement filtering, what each kind returns, and key relationships to vault_build_pc. Return-value details are appropriately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the input schema already exhaustively documents both parameters, including each kind's returned structures. The description largely restates the same kind semantics, adding only a minor reference to list_rulesets for ruleset labels. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('legal choices for guided character creation'), and distinguishes itself from the build tool by positioning as the pre-read step before vault_build_pc. An agent can immediately tell this tool returns option projections rather than performing a mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this BEFORE vault_build_pc, gives an ordering ('Start with constants and class, then read species/background/feat as the build takes shape'), and points to list_rulesets for ruleset labels. It leaves no ambiguity about when and in what sequence to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_ruleGet a vault ruleARead-onlyIdempotentInspect
Fetch one rule document by id, including nested abilities, requirements, ability score bonuses, and starting equipment references. Pair with vault_search_rules to locate the id first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral detail by specifying that the returned document includes nested abilities, requirements, ability score bonuses, and starting equipment references, going beyond the bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both functional: the first states the operation and result contents, the second gives the practical lookup workflow. There is no redundant phrasing or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter getter with an output schema present and annotations covering safety, the description is complete. It identifies the resource, the necessary id, the included content, and how to obtain the id via vault_search_rules. No critical usage information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already defines id as the MongoDB `_id` of the vault document. The description merely says "by id," adding no new semantic information about the parameter. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Fetch one rule document by id," which clearly distinguishes this from vault_search_rules (search/listing) and vault_create_rule/update_rule/delete_rule (mutations). It also enumerates the nested content included, leaving no ambiguity about what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit workflow: "Pair with vault_search_rules to locate the id first." This tells the agent when this tool is appropriate after a search. It does not spell out when not to use it, but for a single-document fetch tool this is acceptable and clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_spellGet a vault spellARead-onlyIdempotentInspect
Fetch one spell document by id, including its level, casting time, range, components, duration, and full description. Pair with vault_search_spells to locate the id first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the vault document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds useful context about what the fetched document includes (level, casting time, range, components, duration, full description), but does not mention missing-id or not-found behavior. Overall it adds some value beyond the annotations without being richly behaviorally descriptive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence defines the operation and what is returned; the second sentence gives the companion workflow. Everything included earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple get-by-id operation with one well-documented parameter, rich annotations, and an output schema present. The description covers the essential workflow and the pointer to vault_search_spells closes the only real ambiguity: where the id comes from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter id is already documented in the schema as a Mongo `_id` of the vault document. The description reinforces that this id is the retrieval key and points to vault_search_spells as the source of the id, but it does not need to add more detail because the schema already fully explains the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a specific resource ('one spell document'), and the retrieval mechanism ('by id'), while enumerating the key fields returned. It is clearly distinguishable from siblings like vault_search_spells, which locates documents rather than fetching a single one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names vault_search_spells as the companion tool to use first for locating the id, giving the agent a concrete workflow. This handles the main routing decision: search to find the id, then fetch by id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_level_up_pcLevel up a player characterAInspect
Advance a character one level in a class, in one call, from a flat draft of choices, for a ruleset with guided level-up (vault answers an error naming the ruleset otherwise). A class-less character (no Class entries) is rejected — record its existing classes with vault_record_pc_classes first. Vault validates every pick against the plan's pools (prerequisites enforced; grown choices demand only their delta counts) and mutates the character: the class entry's stored level bumps (or a new class entry lands with the class's multiclassGrants), the level's features snapshot onto the sheet (a subclass picked through the class's subclass-choice ability lands as its own entry and cascades its features), ability-score increases bake, HP and hit dice grow per the hitPoints choice, use-counters resize (spent uses stay spent), the combined multiclass spell-slot pool reconciles, core.class updates to " , ...", XP floors at the new level's minimum (or your exact xp), and a level-up note records the choices; the engine applies every rule behind those changes. Read vault_get_levelup_options first — required: characterId, classRuleId, hitPoints. Supply abilityChoices for every feature choice the plan surfaced (including the subclass pick and grown choice lists), the sub-pick maps for anything the picked options themselves carry, multiclassSkillProficiencies/multiclassToolProficiencies when entering a class, and optional exact xp. The updated character and a summary of what changed are returned. On an invalid draft vault returns the specific reason as a tool error — fix the draft and retry; if a surfaced pick genuinely cannot be satisfied, allowIncomplete: true applies the level and skips the shortfall instead.
| Name | Required | Description | Default |
|---|---|---|---|
| xp | No | The character's total XP after this level-up, for tables tracking exact XP. Must be >= the plan's `xp.minimumForNewTotal`; omit to let vault floor the stored XP at that minimum. | |
| hitPoints | Yes | How the level's hit points are gained: `method` is one of the schema's methods (the plan's `hitPoints` fields carry what each one uses); `value` is a die the PLAYER rolled, for a method that takes one. | |
| characterId | Yes | `_id` of the character to level (owned by the calling user, or any character for an admin with Admin Mode on). | |
| classRuleId | Yes | Required. The base Class rule to advance one level — a held class entry (its stored level bumps) or a class the character doesn't hold yet (multiclass: a new class entry is stamped). From the chooser's `classEntries[].classRuleId` / `multiclassOptions[]._id`. | |
| abilityChoices | No | ruleChoice picks, keyed by the OWNING rule's `_id`: a gained feature's choice (the class's subclass-choice ability — value = the picked subclass `_id`; a choice among feats — value = the picked feat `_id`) AND a grown held rule's choice (`growth[]` entries — supply the NEW picks only, the delta count). A picked option's own sub-choices (a feat's skill picks, its abilityScoreBump) go in the other maps keyed by the picked option's `_id`, exactly as in `vault_build_pc`. Pools are prerequisite-filtered; an unqualified pick rejects the draft. | |
| allowIncomplete | No | Sanctioned partial apply: `true` lets vault accept UNDER-filled pick families — the level lands and only what was picked is granted; the shortfall is simply skipped (the player can edit the sheet later). Overfilled, duplicate, out-of-pool, and prerequisite-failing picks still reject. Use it as the escape when a surfaced pick cannot be satisfied; never as a shortcut past picks you can supply. | |
| abilityBumpPicks | No | Ability-score-increase picks for a gained rule carrying an `abilityScoreBump`: `{ option, lines }` keyed by the granting rule's `_id`, same shape as `vault_build_pc`. The engine applies whatever the increase changes elsewhere on the sheet. | |
| spellChoicePicks | No | Picks for spellChoices blocks on gained/grown rules, keyed `"<ruleId>:<blockIndex>"` (authored index — the projected array may hold nulls; count them). Grown blocks demand only the DELTA count ("learn N more spells"). | |
| preparedSpellPicks | No | "Prepare N more" picks for rules whose preparedSpells count grew, keyed by the granting rule's `_id`. The pool is the character's UNPREPARED granted leveled spells plus any picked this level-up; send exactly the plan's surfaced count. | |
| castingAbilityPicks | No | Spellcasting-ability picks for blocks surfacing `castingAbilityOptions`, keyed like spellChoicePicks. | |
| spellListChoicePicks | No | Picks for a NEWLY gained rule's spellListChoices — `{ category, picks, castingAbility? }` keyed `"<ruleId>:<blockIndex>"`, exactly as in `vault_build_pc`. | |
| proficiencyChoicePicks | No | Picks for proficiencyChoices grants on gained/grown rules, keyed `"<ruleId>:<grantIndex>"` — same keying and rules as `vault_build_pc`. Grown grants demand only the DELTA count the plan surfaced. An EXPERTISE grant picks from the pool the rule authoring guide describes (vault_get_authoring_guide, entityType .rule., proficiencyChoices); vault rejects picks that do not fit. | |
| multiclassToolProficiencies | No | Tool picks for the entered class's `multiclassGrants.toolChoices` (multiclass only): exactly `count` names from its (group-expanded) options. | |
| multiclassSkillProficiencies | No | Skill picks for the entered class's `multiclassGrants.skillChoices` (multiclass only): exactly `count` names from its options. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/idempotency/safety profile, but the description goes well beyond them by enumerating exactly what mutates: level bump or new class entry with `multiclassGrants`, feature snapshotting and subclass cascade, ability bumps, HP/hit dice growth, use-counter resize, spell-slot pool reconciliation, `core.class` rewrite, XP flooring, and a level-up note. It also discloses error behavior (specific reason as a tool error) and the partial-apply semantics of `allowIncomplete`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the core action well, but the body is a dense run-on paragraph stitched with semicolons that would be far more scannable as a short list. Almost every clause carries real information, so it is not padding, but the wall-of-text structure taxes comprehension for a 14-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully notes the returned character plus a `summary`. It covers prerequisites, error recovery, partial-apply, multiclass entry, and every major side effect, leaving no significant gap for an agent to fill in.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 each field and a baseline of 3 would be defensible. The description adds cross-parameter conditional meaning, though: which picks are required in which cases (abilityChoices for every surfaced `choice`, multiclass proficiency maps only when entering a class, grown choices demanding only delta counts), which the schema's per-field docs do not fully tie together.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Advance a character one level in a class, in one call') and immediately distinguishes itself from siblings by naming the prerequisite tool (`vault_get_levelup_options`) and the fallback (`vault_record_pc_classes`). An agent can tell this apart from `vault_build_pc`, `vault_update_character`, and `vault_record_pc_classes` 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and prerequisites: read `vault_get_levelup_options` first, record classes via `vault_record_pc_classes` before leveling a class-less character, and fix-and-retry on invalid drafts with `allowIncomplete: true` as a named escape hatch. It also states when-not to use the escape ('never as a shortcut past picks you can supply').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_list_linked_charactersList a character's linked sheetsARead-onlyIdempotentInspect
List the linked sibling sheets of a character the user may edit (their own, or any for an admin with Admin Mode on) — every OTHER sheet in its linkGroup (the same persona in other rulesets, created via vault_spawn_linked_character). Returns summary rows (_id, name, ruleset, image, dead, active, linkGroup); follow with vault_get_character on a returned id for a full sheet. A character with no linkGroup returns an empty list. 404 for an unknown character or one the user may not edit.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the character (owned by the calling user, or any character for an admin with Admin Mode on). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read profile (readOnly, idempotent, non-destructive), and the description adds genuine behavior: empty list when no linkGroup exists, 404 for unknown/non-editable characters, and the permission scoping. It does not address pagination or ordering, but for a sibling list that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences that are front-loaded with purpose, then workflow, then edge cases. Slightly long but each clause (linkGroup definition, sibling-tool routing, error states) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return fields needn't be spelled out, yet the description still names the summary-row keys and the follow-up call. Permission model, empty-result, and 404 cases are all covered, leaving nothing an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` parameter is already documented as the Mongo `_id` with the same ownership/admin qualifier the description repeats. The description adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus a precisely scoped resource (linked sibling sheets — every OTHER sheet in a character's linkGroup), and it distinguishes itself from vault_get_character (summary vs. full sheet) and vault_spawn_linked_character (which creates the links). An agent can identify this tool without inspecting siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear routing: use this to find sibling sheets, then call vault_get_character for the full sheet, and states the edit-permission context (own character or admin with Admin Mode). It lacks an explicit 'do not use this for X' exclusion against vault_get_character/vault_search_characters, but the workflow guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_record_pc_classesRecord a class-less character's existing classesAInspect
The class-less on-ramp to the level-up flow. A hand-made character with no Class entries on its sheet can't level up (vault rejects the plan and the apply) — this tool records the class(es) and level(s) the character is ALREADY playing so the wizard can take over at the next level. It stamps identity snapshots ONLY: no features, proficiencies, HP, or trackables are granted — the sheet is trusted to already carry everything. Call vault_get_levelup_options first: RECORD mode (needsClassRecord: true) ships recordOptions[] (base classes with subclasses[] and subclassLevel) and totalLevel, the character's XP-derived level. The recorded levels must sum to EXACTLY that totalLevel (XP is the authority; vault never rewrites it) and a row may carry a subclass only at/above the option's subclassLevel. Rejected once any class entry exists. On success vault sets each class snapshot's stored level, attaches subclasses, updates core.class, appends a note, and returns { character, summary } — then call vault_get_levelup_options again for the normal chooser.
| Name | Required | Description | Default |
|---|---|---|---|
| classes | Yes | One row per class the character already has, distinct classes only. The levels MUST sum to exactly the RECORD-mode chooser's `totalLevel` (the character's XP-derived level) — vault rejects any other split and never rewrites XP. | |
| characterId | Yes | `_id` of the class-less character (owned by the calling user, or any character for an admin with Admin Mode on). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states exactly what is and is not mutated (identity snapshots only — no features, proficiencies, HP, or trackables), the rejection condition, the post-write side effects (sets stored levels, attaches subclasses, updates core.class, appends a note), and the response shape. This is unusually rich disclosure for a non-destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the purpose and the gag rule come first, then the sequencing, then the write semantics and follow-up call. Some sentences are long and pack multiple constraints, but none are filler and all information is actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't be spelled out, yet the description still names { character, summary } and the required follow-up call. Between the description, the 100%-covered schema, and the preconditions, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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: levels must sum to exactly the XP-derived totalLevel, a row may carry a subclass only at/above the option's subclassLevel, and rows must be distinct classes sourced from recordOptions. Slightly redundant with the schema's own class-field descriptions, which caps it at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (record), resource (classes/levels), and the precise situation it exists for: the 'class-less on-ramp to the level-up flow.' It is clearly distinguishable from vault_level_up_pc and vault_get_levelup_options, both of which it references by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: call vault_get_levelup_options first, read RECORD mode/recordOptions/totalLevel, then call this tool, then call vault_get_levelup_options again for the normal chooser. It also names the exclusion condition (rejected once any class entry exists) and the prerequisite state (character with no Class entries).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_search_charactersSearch vault charactersARead-onlyIdempotentInspect
Search PCs and NPCs (any character whose type is NOT the lowercase monster marker) the user owns, plus stock template characters. Use this to locate a player character or NPC the user has authored. Authored monsters are hidden — for creature stat blocks use the dedicated vault_search_monsters tool instead. Defaults to a compact summary shape (identification + image + class/race/background + linkGroup — the id tying a persona's per-ruleset linked sheets together; sheets sharing a linkGroup are the same persona in different rulesets); pass detail: 'full' to receive each character's full sheet (attributes, skills, rules, items, spells) inline.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Substring match on character name (case-insensitive). Use `^name$` for an exact match. | |
| skip | No | Pagination offset; pair with `limit` to walk results. | |
| sort | No | Comma-separated field list. Prefix with `-` for descending (e.g. `-updatedAt,name`). | |
| type | No | Character type filter (substring, case-insensitive). '^PC$' / '^NPC$' for the common user-authored cases. To search authored monsters, use the dedicated `vault_search_monsters` tool — this character search hides them by default (the lowercase `monster` type marker is filtered out unless you opt in via that sibling tool). | |
| limit | No | Page size; defaults to 50 when omitted. Hard cap of 200. | |
| detail | No | Response shape. 'summary' (default) returns identification + summary fields; 'full' returns the complete document shape (every field inline) that non-MCP clients receive by default. | summary |
| ruleset | No | Ruleset code, from list_rulesets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: authored monsters are hidden by default, the default return is a compact summary and 'detail: full' inlines the entire sheet, and linkGroup ties per-ruleset linked sheets to one persona. It does not describe pagination behavior or rate limits, keeping it short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the monster exclusion are front-loaded, and each sentence carries information. It is dense and long for a search tool, but nearly every clause (linkGroup, detail modes, monster routing) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read tool with an output schema, the description covers scope, sibling routing, the hidden-monster rule, and return-shape selection. 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.
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. The description nevertheless adds meaning for the `detail` parameter by contrasting the 'summary' shape (identification + image + class/race/background + linkGroup) with 'full' (attributes, skills, rules, items, spells inline), and it defines what linkGroup represents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search PCs and NPCs... plus stock template characters') and precisely defines scope by the lowercase 'monster' type marker. It explicitly distinguishes itself from the sibling 'vault_search_monsters', so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to locate a player character or NPC the user has authored' gives an explicit when-to-use, and 'for creature stat blocks use the dedicated vault_search_monsters tool instead' names the alternative and the condition that selects it. 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.
vault_search_itemsSearch vault itemsARead-onlyIdempotentInspect
Search the item library the user has access to (stock items plus their own house items). Use this to locate an item by name, type (the catalog's own item types), or ruleset. Defaults to a compact summary shape (identification + summary + weight + cost + publisher / source); pass detail: 'full' to receive each item's full description and properties array inline.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Substring match on item name (case-insensitive). Use `^name$` for an exact match. | |
| skip | No | Pagination offset; pair with `limit` to walk results. | |
| sort | No | Comma-separated field list. Prefix with `-` for descending (e.g. `-updatedAt,name`). | |
| type | No | Item type (substring, case-insensitive). Vault item types are ruleset-specific strings; an unfiltered search shows the types a ruleset's catalog uses. | |
| limit | No | Page size; defaults to 50 when omitted. Hard cap of 200. | |
| stock | No | true = official content only; false = user-authored only; omit to include both. | |
| detail | No | Response shape. 'summary' (default) returns identification + summary fields; 'full' returns the complete document shape (every field inline) that non-MCP clients receive by default. | summary |
| ruleset | No | Ruleset code, from list_rulesets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent profile, so the description's contribution is the response-shape behavior: default to a compact summary and the requirement to pass detail:'full' for inline properties. That is genuine behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with scope and purpose before the response-shape detail. The second sentence is dense but every clause carries meaning; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter search tool with an output schema present, the description covers purpose, scope, and response shape without needing to explain return values. Pagination behavior is left to the schema's skip/limit descriptions, which is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented. The description restates name/type/ruleset filtering and the detail default, adding only the nuance that item types are catalog/ruleset-specific — helpful but largely redundant with the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (item library) and scopes it precisely: stock items plus the user's own house items. This distinguishes it cleanly from the many sibling search tools (vault_search_spells, vault_search_rules, vault_search_characters, vault_search_monsters).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it — 'locate an item by name, type, or ruleset' — giving the agent concrete selection criteria among filter dimensions. It does not, however, name the sibling search tools or state exclusions, so an agent must infer the item-vs-spell/rule boundary from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_search_monstersSearch vault monstersARead-onlyIdempotentInspect
Search authored monsters (characters with the lowercase type: monster marker) the user owns, plus any stock template monsters. This is the right tool for creature stat-block lookups; vault_search_characters deliberately hides monsters by default and this sibling exists so the LLM doesn't have to remember the filter trick. The type filter is baked into the call. Defaults to a compact summary shape; pass detail: 'full' to receive each monster's full stat block (attributes, defense, offense, AC, HP, actions, skills) inline. Pair with vault_get_character on a returned id for the full document.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Substring match on monster name (case-insensitive). Use `^name$` for an exact match. | |
| skip | No | Pagination offset; pair with `limit` to walk results. | |
| sort | No | Comma-separated field list. Prefix with `-` for descending (e.g. `-updatedAt,name`). | |
| limit | No | Page size; defaults to 50 when omitted. Hard cap of 200. | |
| detail | No | Response shape. 'summary' (default) returns identification + summary fields; 'full' returns the complete document shape (every field inline) that non-MCP clients receive by default. | summary |
| ruleset | No | Ruleset code, from list_rulesets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real behavioral context: the `type: monster` filter is baked into the call, results default to a compact shape, and `detail: 'full'` inlines full stat blocks. It stops short of covering pagination or rate behavior, but the value-added disclosure is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first clause and proceeds logically through sibling differentiation, response shape, and follow-up. Four dense sentences with no filler, though it is near the upper bound of ideal length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be spelled out, yet the description still summarizes the two response shapes. It covers routing, the baked-in filter, response detail, and chaining, leaving nothing an agent needs to call it correctly missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes beyond the schema by explaining the implicit baked-in type filter (which is not even a parameter) and clarifying the practical effect of `detail: 'full'` (full stat block inline vs compact summary), adding meaning above the raw enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search authored monsters... the user owns, plus any stock template monsters') and explicitly distinguishes itself from the sibling `vault_search_characters`, explaining why the separate tool exists. An agent can tell exactly what this returns 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('the right tool for creature stat-block lookups'), why-not-the-sibling ('vault_search_characters deliberately hides monsters by default'), and a follow-up pairing ('Pair with vault_get_character on a returned id'). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_search_rulesSearch vault rulesARead-onlyIdempotentInspect
Search the rules library the user has access to (stock content plus their own house rules). Use this to locate a rule by name, type (the type field lists the rule types), or ruleset. Defaults to a compact summary shape (identification + summary + categories + publisher / source); pass detail: 'full' to receive each rule's full description and embedded sub-document arrays inline.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Substring match on rule name (case-insensitive). Use `^name$` for an exact match. | |
| skip | No | Pagination offset; pair with `limit` to walk results. | |
| sort | No | Comma-separated field list. Prefix with `-` for descending (e.g. `-updatedAt,name`). | |
| type | No | Rule category to filter to. | |
| limit | No | Page size; defaults to 50 when omitted. Hard cap of 200. | |
| stock | No | true = official/WOTC content only; false = user-authored house rules only; omit to include both. | |
| detail | No | Response shape. 'summary' (default) returns identification + summary fields; 'full' returns the complete document shape (every field inline) that non-MCP clients receive by default. | summary |
| ruleset | No | Ruleset code, from list_rulesets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral value by disclosing the default response shape and the opt-in `detail: 'full'` payload expansion, which changes what the caller receives.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with scope and purpose, then the filter axes, then the response-shape default. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 optional params, an output schema, and complete annotations, the description covers the decision-relevant knobs (filters and detail mode). Pagination/sort/stock are left to the schema, which is acceptable but a brief note on paging would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by explaining what each `detail` mode actually returns (identification/summary/categories/publisher vs full description plus embedded sub-document arrays) and by framing the filterable fields, adding meaning beyond the schema's own wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search the rules library') plus the access scope (stock content plus user house rules), and names the three lookup axes (name, type, ruleset). An agent can distinguish it from vault_get_rule and list_rulesets 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to locate a rule by name, type, or ruleset' gives clear positive usage context, and the mention of ruleset codes implies list_rulesets as a feeder. It stops short of explicit exclusions (e.g., 'use vault_get_rule when you already have an id').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_search_spellsSearch vault spellsARead-onlyIdempotentInspect
Search the spell library the user has access to (stock spells plus their own house spells). Use this to locate a spell or power by name, ruleset, or type. Defaults to a compact summary shape (identification + summary + level + school + classes + categories + publisher / source); pass detail: 'full' to receive each spell's full description inline.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Substring match on spell name (case-insensitive). Use `^name$` for an exact match. | |
| skip | No | Pagination offset; pair with `limit` to walk results. | |
| sort | No | Comma-separated field list. Prefix with `-` for descending (e.g. `-updatedAt,name`). | |
| type | No | Spell type (the ruleset's name for a spell). | |
| limit | No | Page size; defaults to 50 when omitted. Hard cap of 200. | |
| stock | No | true = official content only; false = user-authored only; omit to include both. | |
| detail | No | Response shape. 'summary' (default) returns identification + summary fields; 'full' returns the complete document shape (every field inline) that non-MCP clients receive by default. | summary |
| ruleset | No | Ruleset code, from list_rulesets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, so the bar is lower. The description still adds real context: the library scope (stock + house content) and the default compact response shape with an opt-in for full descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences with no waste: scope first, then use case, then the response-shape toggle. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter coverage, the description needn't explain return values. It completes the picture by stating which content is searchable and the default response shape, which is enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the `detail` enum thoroughly ('summary' vs 'full'), name matching, and pagination. The description largely restates the `detail` behavior and adds little parameter meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('search the spell library') and pins down scope precisely: stock spells plus the user's own house spells. This distinguishes it cleanly from siblings like vault_get_spell (single fetch) and vault_search_items/rules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case ('locate a spell or power by name, ruleset, or type') and routes to the full-detail mode. It stops short of naming the retrieval alternative (vault_get_spell) or stating when search is the wrong choice, so it's clear context but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_spawn_linked_characterSpawn a linked character sheet in another rulesetAInspect
Create a linked sibling sheet for a character the user may edit (their own, or any for an admin with Admin Mode on), in a different ruleset; the new sheet belongs to the source's owner — the same persona with sheets in multiple rulesets, tied together by a shared linkGroup id. The server builds the new sheet from the target ruleset's template and copies only the descriptive/identity fields in the sync manifest (name, description, image, appearance, personality, and similar); mechanical and build data (class, level, attributes, skills, rules/items/spells, notes) stays ruleset-local and starts fresh. After the spawn, edits to a manifest field on any linked sheet cascade to its siblings automatically. Play campaign assignments of the source are replicated onto campaign legs matching the new ruleset where they exist. One sheet per ruleset per group: vault answers 409 when the source is already that ruleset or a linked sibling already occupies it, 403 when the source's owner lacks the grant for a restricted ruleset, and 404 for an unknown source or one the user may not edit. This is NOT vault_clone_character — clone deep-copies the whole ruleset-specific sheet; spawn deliberately does not.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the source character (owned by the calling user, or any character for an admin with Admin Mode on). The new sheet belongs to the source's owner, so the ruleset grant and the character limit are the owner's. | |
| ruleset | No | Ruleset code for the new linked sheet, from list_rulesets (the codes this account can use). Required. Must differ from the source's ruleset; restricted rulesets require the owner's entitlement grant (vault answers 403). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-destructive, non-idempotent, closed-world — so the safety profile is already covered. The description adds real behavioral value beyond that: exactly which fields cascade versus stay ruleset-local, that mechanical data starts fresh, and that campaign legs are replicated. That extra context is meaningful but the bulk of it (copy semantics) is about side effects rather than the mutation's risk, so a mid-high 3 is fair.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficiently front-loads the primary action before the NOT-clone distinction and error codes, and every sentence carries information. It is nonetheless a dense, semicolon-heavy single block that could be broken into shorter beats for faster scanning, so it falls just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, cross-ruleset tool with an output schema present, the description supplies the copy manifest, cascade behavior, campaign replication, and exact error codes — everything an agent needs to call it correctly. Return values are covered by the output schema and need not be restated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning beyond the schema: the id's ownership/permission implications (owner's grant and character limit govern), the 'must differ from source ruleset' constraint, and the source-code reference to list_rulesets. The 'one sheet per ruleset per group' rule is an extra semantic constraint the schema does not encode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a linked sibling sheet for a character ... in a different ruleset') and immediately names the sibling it is not ('This is NOT vault_clone_character'). An agent can distinguish spawn from clone and from create_character 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes away from the alternative tool and gives the selecting condition (clone deep-copies the whole sheet; spawn deliberately copies only manifest fields). It also states a hard constraint — one sheet per ruleset per group — with the resulting 409/403/404 codes, so the agent knows both when to use it and when it will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_unlink_characterUnlink a character from its linked-sheet groupADestructiveIdempotentInspect
Remove one character from its linked-sheet group by clearing its linkGroup. The sheet keeps every field it has — nothing is deleted — but it stops cascading descriptive-field edits to its former siblings and stops receiving theirs. The remaining siblings keep the group (a group of one is inert). There is no re-join: a later vault_spawn_linked_character from this sheet mints a NEW group. Vault answers 404 when the character is unknown, one the user may not edit, or has no linkGroup to clear (so a repeated unlink reads as 404, not an error state). Returns { unlinked: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the character (owned by the calling user, or any character for an admin with Admin Mode on). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it clarifies that nothing is deleted despite destructiveHint=true (only the cascade relationship is severed), explains why it is both idempotent and destructive (no re-join), and specifies the 404 conditions for unknown, uneditable, or already-unlinked characters. This is exactly the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers consequences, reversibility, edge-case status codes, and return shape in tightly packed sentences with no filler. Every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full picture for a one-parameter mutation: effect on the character, effect on siblings, irreversibility, error semantics, and return value (even restating it alongside the output schema). Nothing needed to invoke or interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single 'id' parameter (Mongo _id, owner or admin scope) is already fully documented in the schema. The description references the `linkGroup` concept but adds no syntax or format detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove one character from its linked-sheet group by clearing its linkGroup') and immediately distinguishes this from the inverse operation (vault_spawn_linked_character) and from list/link siblings. An agent can identify the tool's exact effect 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this applies and names the alternative path for re-joining (a later vault_spawn_linked_character mints a NEW group), which steers the agent correctly. It stops short of explicit 'use this when / do not use this when' phrasing and does not contrast with vault_delete_character or vault_detach_companion, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_update_characterUpdate a vault characterAIdempotentInspect
Patch fields on an existing character by id. Only supplied fields change, with one distinction: object sub-docs (defense, core, offense, speed, personality, settings) deep-merge — nested keys you omit are preserved — but ARRAY fields (items, spells, rules, skills, actions, trackables, attributes, notes) are atomic: the array you send replaces the stored array wholesale. To add or edit one array entry, vault_get_character first, modify the returned array, and send the complete array back. Sending null for a field is treated the same as omitting it (the field keeps its current value) — null does NOT clear; to clear a text field send an empty string. This is also the canonical tool for editing a play campaign character's HP, conditions, or inventory; play characters are pointers to vault characters and play has no direct character-write endpoint. AC caution: when the character's settings.autoPassiveBonuses is true (the default for new characters in rulesets with sheet automation), the armor and shield rows of defense.armorClass are derived from equipped items and recomputed on every sheet load — change AC by setting equipped on the character's armor/shield items, not by writing those rows; when the toggle is false, defense.armorClass is manually authored and writing it directly is correct. settings.privateSheet: true hides the character's sheet from signed-out visitors on the web (its page stays public); turning it on takes a membership (member, premium, vip, or admin) and is refused otherwise, while turning it off is always allowed. Caution: mutations may affect any active play campaign or expedition referencing this character. Consider running vault_get_character first to inspect linkage. REQUIRES baseUpdatedAt: copy updatedAt from a fresh vault_get_character read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written — writing from memory of an earlier read is not possible. companions is NOT writable here (it is stripped): manage buddy ties with vault_attach_companion / vault_detach_companion, and a linked buddy's tracked values with vault_update_companion_state. linkGroup is NOT writable here either (also stripped): linked-sheet group membership is created by vault_spawn_linked_character and only vault's unlink endpoint clears it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the character to update. | |
| core | No | ||
| dead | No | ||
| name | No | Character display name. | |
| type | No | Character type. Free-form per ruleset. Set to 'monster' (lowercase) to mark an authored monster; vault's character list endpoint filters that value out of the default catalog view. | |
| image | No | ||
| items | No | ||
| notes | No | ||
| rules | No | ||
| speed | No | ||
| active | No | ||
| skills | No | ||
| spells | No | ||
| stress | No | ||
| actions | No | ||
| aspects | No | ||
| defense | No | ||
| offense | No | ||
| ruleset | No | Ruleset code, from list_rulesets (the codes this account can use). Restricted rulesets require an entitlement grant on the account — vault answers 403 for ungranted or unknown codes. | |
| settings | No | ||
| attributes | No | ||
| trackables | No | ||
| description | No | ||
| personality | No | ||
| activeStates | No | The states the player declared on the sheet (one of the schema's enum). The sheet's Rage button sets one and spends a Rage use; a rest clears them. Writing it directly spends no use. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false and idempotent=true; the description adds substantial non-obvious behavior: deep-merge for object sub-docs vs wholesale replacement for arrays, null treated as omission with empty string as the clear mechanism, and the OUT_OF_SYNC rejection that guarantees nothing is written on a stale read. It also discloses the privateSheet membership requirement and the autoPassiveBonuses AC derivation that overrides manual writes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core merge/array distinction before diving into AC, privateSheet, and play-campaign caveats, and every paragraph earns its place given the tool's complexity. It is dense and long, but the density reflects genuinely distinct rules rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-param mutation tool with a rich output schema and annotations, the description covers the sync contract, merge semantics, AC derivation pitfall, permissions on privateSheet, play-character editing scope, and stripped fields with their replacement tools. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 23% schema coverage across 26 params, the description must compensate, and it carries the highest-value semantics: merge vs atomic-replace rules per field group, null vs empty-string clearing, how to edit a single array entry, the role of baseUpdatedAt, and the AC/privateSheet gotchas. It does not document individual field meanings (items, rules, trackables schemas), which remain largely undescribed, so it falls short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Patch fields on an existing character by id.' It immediately distinguishes the tool from create/clone/delete siblings, and later clarifies it is the canonical write path for play campaign characters' HP/conditions/inventory, which no sibling covers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when this tool is the right one (play campaign character edits, direct AC via equipped items), names prerequisites (fresh vault_get_character for baseUpdatedAt, OUT_OF_SYNC otherwise), and routes non-writable fields to named alternatives (vault_attach_companion/vault_detach_companion, vault_update_companion_state, vault_spawn_linked_character). 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.
vault_update_companion_stateUpdate a linked companion's tracked valuesAIdempotentInspect
Write a LINK-mode companion row's transient overlay — the locally-tracked hit points, temp HP, hit dice, death saves, exhaustion, stress marks, and trackable/free-cast counters for a buddy the user doesn't own. The source character is never written. The state you send replaces the row's stored overlay wholesale: vault_get_character the Main first, modify that row's state, send it back complete. Maximums never belong in the overlay (they derive from the source; vault drops them). Rows in 'owned' (or legacy 'clone') mode have no overlay — edit the referenced character directly with vault_update_character instead. REQUIRES baseUpdatedAt: copy updatedAt from a fresh vault_get_character read of the MAIN character; a stale value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the Main character carrying the companion row. | |
| state | Yes | The row's complete replacement overlay. ATOMIC: what you send replaces the stored `state` wholesale — vault_get_character first, modify the returned row's `state`, and send it back complete. Stores current values only; maximums always derive from the source character and are dropped if sent. | |
| companionId | Yes | The companion ROW's `_id` from the Main character's `companions[]` array — NOT the buddy character's own `_id`. | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly false, idempotent true, destructive false), and the description adds rich context beyond them: the source character is never written, maxes are dropped, the overlay replaces wholesale, and stale baseUpdatedAt is rejected with OUT_OF_SYNC writing nothing. The only small gap is it does not detail response shape, though an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Sentences are long and dense but front-load the core action, then layer the atomic-replace rule, the sibling alternative, and the baseUpdatedAt prerequisite in a logical order. Every sentence carries distinct operational meaning; slightly verbose for a description but justified by the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested, atomic write tool with 100% schema coverage and an output schema, this description covers the mutation semantics, the source-vs-overlay split, the sync-proof requirement, and the failure mode. An agent has everything needed to call it correctly without the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the parameters and baseline would be 3. The description goes beyond it by explaining the read-modify-write pattern for `state`, that it is an atomic wholesale replacement, that maximums are dropped, and that `baseUpdatedAt` must be copied verbatim from a fresh read — meaningful semantics not derivable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Write a LINK-mode companion row's transient overlay') and enumerates exactly which fields it covers (HP, temp HP, hit dice, death saves, exhaustion, stress, counters). It also explicitly distinguishes itself from vault_update_character for owned/clone rows, so an agent can differentiate it from siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (LINK-mode transient overlay for an unowned buddy), when-not-to-use ('Rows in owned or legacy clone mode have no overlay — edit the referenced character directly with vault_update_character instead'), and the required workflow (vault_get_character the Main first, modify, send back complete). 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.
vault_update_itemUpdate a vault itemAIdempotentInspect
Patch fields on an existing user-authored item by id. Only supplied fields change. Use vault_search_items / vault_get_item to confirm the id first. REQUIRES baseUpdatedAt: copy updatedAt from a fresh vault_get_item read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the item to update. | |
| ogl | No | ||
| cost | No | Cost in gold pieces (max 2 decimal places). Vault enforces non-negativity and precision. | |
| name | No | Display name. | |
| type | No | Item type. Free-form per ruleset; match the types the ruleset's catalog uses (vault_search_items shows them). Required at create. | |
| uses | No | ||
| image | No | ||
| active | No | ||
| damage | No | ||
| effect | No | ||
| source | No | ||
| weight | No | ||
| _parent | No | Parent item ObjectId for variant items. | |
| healing | No | ||
| mastery | No | Weapon mastery name, for rulesets whose weapons carry one, as the ruleset's catalog names it. | |
| ruleset | No | Ruleset code, from list_rulesets. | |
| summary | No | Short one-line summary. | |
| duration | No | ||
| rollMods | No | ||
| publisher | No | ||
| actionType | No | Authoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`. | |
| armorClass | No | Base AC value the armor provides. | |
| damageDice | No | Base damage expression (e.g. '1d8'). | |
| damageType | No | Damage types as an array of strings (most items have one type; some have multiples). | |
| diceFloors | No | ||
| equipSlots | No | Allowed equip slot ids, from the ruleset's own slots (an existing item's equipSlots, via vault_get_item, shows them). | |
| parameters | No | ||
| properties | No | ||
| ruleChoice | No | ||
| weaponType | No | Weapon category, as the ruleset's catalog names it (vault_search_items shows them). | |
| description | No | Full item description. Markdown is supported. | |
| resistances | No | ||
| statBonuses | No | ||
| mechanicsKey | No | ||
| spellChoices | No | ||
| armorCategory | No | Armor category, as the ruleset's catalog names it (vault_search_items shows them). | |
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| prerequisites | No | ||
| forcedMovement | No | ||
| maxDexModifier | No | Cap on the DEX bonus this armor allows, from the item's source text. | |
| preparedSpells | No | ||
| abilityScoreSet | No | ||
| damageReduction | No | ||
| recurringDamage | No | ||
| abilityScoreBump | No | ||
| diceReplacements | No | ||
| spellListChoices | No | ||
| prerequisitesLogic | No | ||
| proficiencyChoices | No | ||
| stealthDisadvantage | No | ||
| strengthRequirement | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses patch semantics ('Only supplied fields change'), optimistic-concurrency behavior, the OUT_OF_SYNC rejection code, and atomicity ('nothing is written'). That is exactly the kind of mutation/conflict context annotations alone 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and scope, then the conflict requirement in emphatic caps. No filler; every clause carries instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no explanation, and the description covers the write path, the required token, and the failure mode. The remaining gap is the sparse coverage of the many optional fields, which the description never addresses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 35% across 51 params, so the description should compensate. It does explain the critical baseUpdatedAt token, but that information largely duplicates the schema's own detailed description, and the many optional nested fields get no description-level help.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('Patch fields'), resource ('existing user-authored item'), and scope ('by id'). The 'item' resource and 'user-authored' qualifier cleanly separate it from siblings like vault_update_rule, vault_update_spell, and vault_create_item without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisite workflow ('Use vault_search_items / vault_get_item to confirm the id first') and a hard precondition (baseUpdatedAt from a fresh read). It stops short of naming a when-not or an alternative mutation path, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_update_ruleUpdate a vault ruleAIdempotentInspect
Patch fields on an existing user-authored rule by id. Only the fields you supply are changed; everything else is preserved. Use vault_search_rules / vault_get_rule first to confirm the id and current state. REQUIRES baseUpdatedAt: copy updatedAt from a fresh vault_get_rule read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the rule to update. | |
| age | No | ||
| ogl | No | ||
| feat | No | Mongo `_id` reference (24-character hex string). | |
| name | No | Display name of the rule. | |
| size | No | ||
| type | No | Rule category. Required at create time; vault rejects without it. | |
| uses | No | ||
| image | No | ||
| range | No | How far the ability reaches when invoked: `kind`, plus `distance` and its `unit` for a kind that takes a distance. Absent: the rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the default. | |
| speed | No | ||
| active | No | ||
| damage | No | ||
| effect | No | ||
| hitDie | No | ||
| source | No | ||
| _parent | No | Mongo `_id` reference (24-character hex string). | |
| actions | No | Action-cost marker, for rulesets whose rules carry one; the value is the source text. | |
| healing | No | ||
| ruleset | No | Ruleset code, from list_rulesets. | |
| summary | No | Short one-line summary. | |
| duration | No | ||
| featOpen | No | ||
| keywords | No | ||
| rollMods | No | ||
| abilities | No | ||
| languages | No | ||
| publisher | No | ||
| actionType | No | Authoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`. | |
| categories | No | ||
| diceFloors | No | ||
| parameters | No | ||
| repeatable | No | A rule that may be taken/granted more than once, each time as a distinct instance with its own sub-choices — a repeatable feat, or a class ability its class grants at several levels. | |
| ruleChoice | No | ||
| description | No | Full rule body. Markdown is supported. | |
| resistances | No | ||
| statBonuses | No | ||
| toolChoices | No | ||
| creatureType | No | ||
| mechanicsKey | No | ||
| savingThrows | No | ||
| skillChoices | No | ||
| spellChoices | No | ||
| abilityScores | No | ||
| actionEconomy | No | What invoking the ability costs on a turn. The rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the absent default. Distinct from the mechanics actionType (a kind-of-action label). | |
| armorTraining | No | ||
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| multiclassing | No | What multiclassing INTO this class grants (weapon/armor lists apply fixed; skillChoices/toolChoices render pickers). Absent = no multiclass proficiencies. | |
| prerequisites | No | ||
| castingAbility | No | The ability this rule's spellcasting keys off. Author it on a class's Spellcasting ability rule; vault's creation and level-up wizards write it to the character-wide Spellcasting Ability (first-wins, never overwriting), and a multiclass whose ability differs stamps its granted spells per-entry. Distinct from a spell block's castingAbility, which overrides per grant. Absent = the rule says nothing about the character's casting ability. | |
| forcedMovement | No | ||
| preparedSpells | No | ||
| spellAbilities | No | ||
| abilityScoreSet | No | ||
| damageReduction | No | ||
| recurringDamage | No | ||
| abilityScoreBump | No | ||
| diceReplacements | No | ||
| levelProgression | No | ||
| spellListChoices | No | ||
| casterProgression | No | How this class contributes to the combined multiclass spell-slot pool; the engine applies each progression's rule. Authorable on a base class or a subclass (a subclass that grants the casting carries it). Absent = non-caster. | |
| startingEquipment | No | ||
| toolProficiencies | No | ||
| prerequisitesLogic | No | ||
| proficiencyChoices | No | ||
| skillProficiencies | No | ||
| weaponProficiencies | No | ||
| defaultAbilityScores | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses patch semantics ('only the fields you supply are changed; everything else is preserved'), a mandatory concurrency token (baseUpdatedAt from a fresh read), and the exact failure mode (OUT_OF_SYNC, 'nothing is written'). This is behavioral context an agent cannot infer from readOnlyHint/idempotentHint/destructiveHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with purpose, then patch semantics, then prerequisite, then the hard requirement in caps. No filler; each sentence carries distinct, load-bearing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 annotations already cover the safety profile. The description covers the two things that matter most for a mutation tool of this complexity: patch semantics and the stale-write guard. Only the large undocumented parameter surface keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 68 parameters at only 25% schema description coverage, the schema leaves much undocumented, and the description names only 'id' and 'baseUpdatedAt'. It adds real semantic value on the concurrency parameter but does not enumerate or clarify the remaining fields, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Patch fields on an existing user-authored rule by id.' The 'user-authored' qualifier usefully narrows scope, but the description never names or contrasts a sibling (e.g. vault_create_rule, vault_update_item/spell), so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite workflow: 'Use vault_search_rules / vault_get_rule first to confirm the id and current state,' and the REQUIRES clause makes the read-before-write sequence mandatory. It provides clear context but no explicit when-not-to-use guidance (e.g. directing new rules to vault_create_rule).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_update_spellUpdate a vault spellAIdempotentInspect
Patch fields on an existing user-authored spell by id. Only supplied fields change. Use vault_search_spells / vault_get_spell to confirm the id first. REQUIRES baseUpdatedAt: copy updatedAt from a fresh vault_get_spell read; a stale or fabricated value is rejected with OUT_OF_SYNC and nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mongo `_id` of the spell to update. | |
| ogl | No | ||
| area | No | Area of effect. `shape`; `size` (ft); `width` for a line. | |
| name | No | Display name. | |
| rank | No | Rank, for rulesets whose spells carry one. Free-form. | |
| type | No | Spell type (the ruleset's name for a spell). Required at create. | |
| uses | No | ||
| level | No | Spell level, within the schema's range. The spell authoring guide gives the convention. | |
| range | No | Range. `kind`; `distance` and its `unit` for a ranged spell (absent unit = feet). | |
| active | No | ||
| damage | No | ||
| effect | No | ||
| ritual | No | Ritual tag: the spell can be cast as a ritual. | |
| school | No | Spell school name. | |
| source | No | ||
| _parent | No | Parent spell ObjectId for variant spells. | |
| actions | No | Action-cost marker, for rulesets whose spells carry one; the value is the source text. | |
| classes | No | Class-membership list for rulesets whose spells do not use `categories` (the spell authoring guide covers `categories`). Free-form per ruleset. | |
| healing | No | ||
| ruleset | No | Ruleset code, from list_rulesets. | |
| summary | No | Short one-line summary. | |
| duration | No | Spell duration. `unit`; `count` for a timed unit; concentration flag; upTo flag for a non-concentration capped duration ("Up to 1 minute"). | |
| rollMods | No | ||
| publisher | No | ||
| actionType | No | Authoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`. | |
| categories | No | Go-forward class membership. The field `spellChoices[].allowedCategories` filters on; the vault UI labels it 'Class(es)'. Free-form, taggable. | |
| components | No | Components: verbal/somatic/material flags, plus material text, gp cost, and consumed flag. | |
| diceFloors | No | ||
| parameters | No | ||
| ruleChoice | No | ||
| castingTime | No | Casting time. `unit`, plus `count` for a timed unit. | |
| description | No | Full spell body. Markdown is supported. | |
| higherLevel | No | Scaling text: what changes when the spell is cast at a higher level or scales with the caster, source text. | |
| resistances | No | ||
| statBonuses | No | ||
| mechanicsKey | No | ||
| spellChoices | No | ||
| baseUpdatedAt | Yes | REQUIRED proof that you are working from the latest version: copy the `updatedAt` value verbatim from a FRESH read of this exact record (use the matching get tool first). Values from memory, from an earlier conversation, or guessed timestamps are rejected with OUT_OF_SYNC and nothing is written. After a successful update, the response carries the new `updatedAt` — use that for any follow-up write. | |
| prerequisites | No | ||
| forcedMovement | No | ||
| preparedSpells | No | ||
| abilityScoreSet | No | ||
| damageReduction | No | ||
| reactionTrigger | No | For a casting time taken in response to a trigger, the trigger text, source text. | |
| recurringDamage | No | ||
| abilityScoreBump | No | ||
| diceReplacements | No | ||
| spellListChoices | No | ||
| prerequisitesLogic | No | ||
| proficiencyChoices | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: patch semantics ('only supplied fields change'), optimistic concurrency via baseUpdatedAt, the failure mode (OUT_OF_SYNC with no write), and the fact that the response returns a new updatedAt for follow-up writes. This is exactly the operational detail an agent needs and the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, zero filler, and the two highest-risk facts (id confirmation, baseUpdatedAt requirement) are front-loaded before the failure consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 50-parameter nested-object mutation with an output schema, the description covers the dominant risk (stale-write rejection) and the patch contract, so it is largely complete. The remaining gap is patch behavior on nested arrays (merge vs replace), which an agent editing a spell's damage or effects list would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 46% across 50 params, but the description compensates for the two required ones: id via the routing instruction and baseUpdatedAt as a verbatim copy from a fresh read with its rejection consequence. It also implies merge-not-replace semantics for the 48 optional fields, though it never says how arrays/nested objects are treated on patch.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: 'Patch fields on an existing user-authored spell by id.' The word 'Patch' and 'user-authored' distinguish it from vault_create_spell, vault_get_spell, and the update_item/update_rule siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to vault_search_spells / vault_get_spell to confirm the id before calling, which is clear when-to-use context. It does not, however, state when to prefer this over creating a new spell or what happens if the spell is not user-authored (a stated scope that is never enforced in guidance).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiWho am IARead-onlyIdempotentInspect
Returns the Embers user identity and OAuth scopes the connected client is authorized for.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which cover the safe, side-effect-free nature. The description adds meaningful behavioral context by specifying that the returned scopes are specifically those the connected client is authorized for, which is not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence delivers the complete purpose with no filler. Key information is front-loaded, and every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only identity/scope lookup with an output schema and comprehensive annotations, the description is complete. It tells the agent what the tool returns and leaves the detailed return structure to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so parameter semantics are trivially satisfied. The description does not need to document parameters and correctly focuses on the output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('Returns') and resource ('Embers user identity and OAuth scopes'), making the tool's purpose immediately clear. It also distinguishes this introspection tool from all sibling tools, none of which overlap with identity/scope retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the use case: checking who the connected client is and which OAuth scopes it has. There are no sibling alternatives for this purpose, and no additional exclusions are needed for such a simple, parameterless introspection tool.
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.
9 tool updates
- Added
imagine_generate_braxylian_name - Added
imagine_generate_gallance_name - Added
imagine_generate_lorean_name - Added
imagine_generate_pelegorian_name - Added
imagine_generate_shoren_name - Added
imagine_generate_strykaran_name - Added
imagine_generate_tarithan_name - Added
imagine_generate_thalassan_name - Added
imagine_translate_shoren
9 tool updates
- Removed
imagine_generate_braxylian_name - Removed
imagine_generate_gallance_name - Removed
imagine_generate_lorean_name - Removed
imagine_generate_pelegorian_name - Removed
imagine_generate_shoren_name - Removed
imagine_generate_strykaran_name - Removed
imagine_generate_tarithan_name - Removed
imagine_generate_thalassan_name - Removed
imagine_translate_shoren
9 tool updates
- Added
imagine_generate_braxylian_name - Added
imagine_generate_gallance_name - Added
imagine_generate_lorean_name - Added
imagine_generate_pelegorian_name - Added
imagine_generate_shoren_name - Added
imagine_generate_strykaran_name - Added
imagine_generate_tarithan_name - Added
imagine_generate_thalassan_name - Added
imagine_translate_shoren
2 tool updates
- Added
imagine_generate_draconic_name - Added
imagine_generate_npc
11 tool updates
- Removed
imagine_generate_braxylian_name - Removed
imagine_generate_draconic_name - Removed
imagine_generate_gallance_name - Removed
imagine_generate_lorean_name - Removed
imagine_generate_npc - Removed
imagine_generate_pelegorian_name - Removed
imagine_generate_shoren_name - Removed
imagine_generate_strykaran_name - Removed
imagine_generate_tarithan_name - Removed
imagine_generate_thalassan_name - Removed
imagine_translate_shoren
9 tool updates
- Added
imagine_generate_braxylian_name - Added
imagine_generate_gallance_name - Added
imagine_generate_lorean_name - Added
imagine_generate_pelegorian_name - Added
imagine_generate_shoren_name - Added
imagine_generate_strykaran_name - Added
imagine_generate_tarithan_name - Added
imagine_generate_thalassan_name - Added
imagine_translate_shoren
9 tool updates
- Removed
imagine_generate_braxylian_name - Removed
imagine_generate_gallance_name - Removed
imagine_generate_lorean_name - Removed
imagine_generate_pelegorian_name - Removed
imagine_generate_shoren_name - Removed
imagine_generate_strykaran_name - Removed
imagine_generate_tarithan_name - Removed
imagine_generate_thalassan_name - Removed
imagine_translate_shoren
11 tool updates
- Added
imagine_generate_braxylian_name - Added
imagine_generate_draconic_name - Added
imagine_generate_gallance_name - Added
imagine_generate_lorean_name - Added
imagine_generate_npc - Added
imagine_generate_pelegorian_name - Added
imagine_generate_shoren_name - Added
imagine_generate_strykaran_name - Added
imagine_generate_tarithan_name - Added
imagine_generate_thalassan_name - Added
imagine_translate_shoren
11 tool updates
- Removed
imagine_generate_braxylian_name - Removed
imagine_generate_draconic_name - Removed
imagine_generate_gallance_name - Removed
imagine_generate_lorean_name - Removed
imagine_generate_npc - Removed
imagine_generate_pelegorian_name - Removed
imagine_generate_shoren_name - Removed
imagine_generate_strykaran_name - Removed
imagine_generate_tarithan_name - Removed
imagine_generate_thalassan_name - Removed
imagine_translate_shoren
9 tool updates
- Added
imagine_generate_braxylian_name - Added
imagine_generate_gallance_name - Added
imagine_generate_lorean_name - Added
imagine_generate_pelegorian_name - Added
imagine_generate_shoren_name - Added
imagine_generate_strykaran_name - Added
imagine_generate_tarithan_name - Added
imagine_generate_thalassan_name - Added
imagine_translate_shoren
9 tool updates
- Removed
imagine_generate_braxylian_name - Removed
imagine_generate_gallance_name - Removed
imagine_generate_lorean_name - Removed
imagine_generate_pelegorian_name - Removed
imagine_generate_shoren_name - Removed
imagine_generate_strykaran_name - Removed
imagine_generate_tarithan_name - Removed
imagine_generate_thalassan_name - Removed
imagine_translate_shoren
11 tool updates
- Added
imagine_generate_braxylian_name - Added
imagine_generate_draconic_name - Added
imagine_generate_gallance_name - Added
imagine_generate_lorean_name - Added
imagine_generate_npc - Added
imagine_generate_pelegorian_name - Added
imagine_generate_shoren_name - Added
imagine_generate_strykaran_name - Added
imagine_generate_tarithan_name - Added
imagine_generate_thalassan_name - Added
imagine_translate_shoren
11 tool updates
- Removed
imagine_generate_braxylian_name - Removed
imagine_generate_draconic_name - Removed
imagine_generate_gallance_name - Removed
imagine_generate_lorean_name - Removed
imagine_generate_npc - Removed
imagine_generate_pelegorian_name - Removed
imagine_generate_shoren_name - Removed
imagine_generate_strykaran_name - Removed
imagine_generate_tarithan_name - Removed
imagine_generate_thalassan_name - Removed
imagine_translate_shoren
2 tool updates
- Changed
play_create_campaign1 field changed- added
Input schema / properties / showCreatureDetailsAdded value: +{ + "description": "Whether players see a creature's details (its health and armor class, per ruleset) at the top of a token's details on the campaign's battlemaps. A battlemap shows them only when every one of its campaigns has this on. Off by default.", + "type": "boolean" +}
- Changed
play_update_campaign1 field changed- added
Input schema / properties / showCreatureDetailsAdded value: +{ + "description": "Whether players see a creature's details (its health and armor class, per ruleset) at the top of a token's details on the campaign's battlemaps. A battlemap shows them only when every one of its campaigns has this on. Off by default.", + "type": "boolean" +}
8 tool updates
- Changed
vault_create_character4 fields changed- added
Input schema / properties / activeStatesAdded value: +{ + "description": "The states the player declared on the sheet (one of the schema's enum). The sheet's Rage button sets one and spends a Rage use; a rest clears them. Writing it directly spends no use.", + "items": { + "enum": [ + "raging" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
- Changed
vault_create_item26 fields changed- added
Input schema / properties / damageReduction / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceFloors / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceReplacements / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / forcedMovement / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / recurringDamage / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / resistances / items / properties / requiresAdded value: +{ + "description": "Predicates that gate the resistance (Rage's: a 'condition' predicate on 'raging'). Absent = always.", + "items": { + "additionalProperties": {}, + "properties": { + "abilities": { + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" + }, + "armorCategories": { + "description": "Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any.", + "items": { + "type": "string" + }, + "type": "array" + }, + "condition": { + "description": "For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there.", + "enum": [ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" + ], + "type": "string" + }, + "equipSlot": { + "description": "Body slot the matched weapon must occupy (one of the schema's enum).", + "enum": [ + "mainHand", + "offHand" + ], + "type": "string" + }, + "negate": { + "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.", + "type": "boolean" + }, + "slot": { + "description": "The equipped body category to match (one of the schema's enum).", + "enum": [ + "armor", + "shield", + "weapon" + ], + "type": "string" + }, + "type": { + "description": "Predicate type (one of the schema's enum): what the predicate gates on.", + "enum": [ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" + ], + "type": "string" + }, + "weaponProperties": { + "description": "Weapon properties to match. AND semantics — match all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / resistances / items / properties / requiresLogicAdded value: +{ + "enum": [ + "and", + "or" + ], + "type": "string" +} - added
Input schema / properties / resistances / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any target makes the character sheet list the resistance while `requires` holds." - added
Input schema / properties / rollMods / items / properties / abilitiesAdded value: +{ + "description": "The abilities whose rolls the modifier covers (lowercase ids). Empty or absent covers every ability.", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rollMods / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / rollMods / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any audience, and not `consumeOnUse`, opens the character sheet's dice roller in this mode on the rolls it covers while `requires` holds." - added
Input schema / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
- Changed
vault_create_rule26 fields changed- added
Input schema / properties / damageReduction / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceFloors / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceReplacements / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / forcedMovement / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / recurringDamage / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / resistances / items / properties / requiresAdded value: +{ + "description": "Predicates that gate the resistance (Rage's: a 'condition' predicate on 'raging'). Absent = always.", + "items": { + "additionalProperties": {}, + "properties": { + "abilities": { + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" + }, + "armorCategories": { + "description": "Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any.", + "items": { + "type": "string" + }, + "type": "array" + }, + "condition": { + "description": "For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there.", + "enum": [ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" + ], + "type": "string" + }, + "equipSlot": { + "description": "Body slot the matched weapon must occupy (one of the schema's enum).", + "enum": [ + "mainHand", + "offHand" + ], + "type": "string" + }, + "negate": { + "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.", + "type": "boolean" + }, + "slot": { + "description": "The equipped body category to match (one of the schema's enum).", + "enum": [ + "armor", + "shield", + "weapon" + ], + "type": "string" + }, + "type": { + "description": "Predicate type (one of the schema's enum): what the predicate gates on.", + "enum": [ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" + ], + "type": "string" + }, + "weaponProperties": { + "description": "Weapon properties to match. AND semantics — match all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / resistances / items / properties / requiresLogicAdded value: +{ + "enum": [ + "and", + "or" + ], + "type": "string" +} - added
Input schema / properties / resistances / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any target makes the character sheet list the resistance while `requires` holds." - added
Input schema / properties / rollMods / items / properties / abilitiesAdded value: +{ + "description": "The abilities whose rolls the modifier covers (lowercase ids). Empty or absent covers every ability.", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rollMods / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / rollMods / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any audience, and not `consumeOnUse`, opens the character sheet's dice roller in this mode on the rolls it covers while `requires` holds." - added
Input schema / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
- Changed
vault_create_spell26 fields changed- added
Input schema / properties / damageReduction / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceFloors / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceReplacements / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / forcedMovement / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / recurringDamage / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / resistances / items / properties / requiresAdded value: +{ + "description": "Predicates that gate the resistance (Rage's: a 'condition' predicate on 'raging'). Absent = always.", + "items": { + "additionalProperties": {}, + "properties": { + "abilities": { + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" + }, + "armorCategories": { + "description": "Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any.", + "items": { + "type": "string" + }, + "type": "array" + }, + "condition": { + "description": "For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there.", + "enum": [ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" + ], + "type": "string" + }, + "equipSlot": { + "description": "Body slot the matched weapon must occupy (one of the schema's enum).", + "enum": [ + "mainHand", + "offHand" + ], + "type": "string" + }, + "negate": { + "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.", + "type": "boolean" + }, + "slot": { + "description": "The equipped body category to match (one of the schema's enum).", + "enum": [ + "armor", + "shield", + "weapon" + ], + "type": "string" + }, + "type": { + "description": "Predicate type (one of the schema's enum): what the predicate gates on.", + "enum": [ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" + ], + "type": "string" + }, + "weaponProperties": { + "description": "Weapon properties to match. AND semantics — match all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / resistances / items / properties / requiresLogicAdded value: +{ + "enum": [ + "and", + "or" + ], + "type": "string" +} - added
Input schema / properties / resistances / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any target makes the character sheet list the resistance while `requires` holds." - added
Input schema / properties / rollMods / items / properties / abilitiesAdded value: +{ + "description": "The abilities whose rolls the modifier covers (lowercase ids). Empty or absent covers every ability.", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rollMods / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / rollMods / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any audience, and not `consumeOnUse`, opens the character sheet's dice roller in this mode on the rolls it covers while `requires` holds." - added
Input schema / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
- Changed
vault_update_character4 fields changed- added
Input schema / properties / activeStatesAdded value: +{ + "description": "The states the player declared on the sheet (one of the schema's enum). The sheet's Rage button sets one and spends a Rage use; a rest clears them. Writing it directly spends no use.", + "items": { + "enum": [ + "raging" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
- Changed
vault_update_item26 fields changed- added
Input schema / properties / damageReduction / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceFloors / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceReplacements / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / forcedMovement / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / recurringDamage / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / resistances / items / properties / requiresAdded value: +{ + "description": "Predicates that gate the resistance (Rage's: a 'condition' predicate on 'raging'). Absent = always.", + "items": { + "additionalProperties": {}, + "properties": { + "abilities": { + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" + }, + "armorCategories": { + "description": "Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any.", + "items": { + "type": "string" + }, + "type": "array" + }, + "condition": { + "description": "For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there.", + "enum": [ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" + ], + "type": "string" + }, + "equipSlot": { + "description": "Body slot the matched weapon must occupy (one of the schema's enum).", + "enum": [ + "mainHand", + "offHand" + ], + "type": "string" + }, + "negate": { + "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.", + "type": "boolean" + }, + "slot": { + "description": "The equipped body category to match (one of the schema's enum).", + "enum": [ + "armor", + "shield", + "weapon" + ], + "type": "string" + }, + "type": { + "description": "Predicate type (one of the schema's enum): what the predicate gates on.", + "enum": [ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" + ], + "type": "string" + }, + "weaponProperties": { + "description": "Weapon properties to match. AND semantics — match all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / resistances / items / properties / requiresLogicAdded value: +{ + "enum": [ + "and", + "or" + ], + "type": "string" +} - added
Input schema / properties / resistances / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any target makes the character sheet list the resistance while `requires` holds." - added
Input schema / properties / rollMods / items / properties / abilitiesAdded value: +{ + "description": "The abilities whose rolls the modifier covers (lowercase ids). Empty or absent covers every ability.", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rollMods / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / rollMods / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any audience, and not `consumeOnUse`, opens the character sheet's dice roller in this mode on the rolls it covers while `requires` holds." - added
Input schema / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
- Changed
vault_update_rule26 fields changed- added
Input schema / properties / damageReduction / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceFloors / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceReplacements / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / forcedMovement / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / recurringDamage / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / resistances / items / properties / requiresAdded value: +{ + "description": "Predicates that gate the resistance (Rage's: a 'condition' predicate on 'raging'). Absent = always.", + "items": { + "additionalProperties": {}, + "properties": { + "abilities": { + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" + }, + "armorCategories": { + "description": "Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any.", + "items": { + "type": "string" + }, + "type": "array" + }, + "condition": { + "description": "For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there.", + "enum": [ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" + ], + "type": "string" + }, + "equipSlot": { + "description": "Body slot the matched weapon must occupy (one of the schema's enum).", + "enum": [ + "mainHand", + "offHand" + ], + "type": "string" + }, + "negate": { + "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.", + "type": "boolean" + }, + "slot": { + "description": "The equipped body category to match (one of the schema's enum).", + "enum": [ + "armor", + "shield", + "weapon" + ], + "type": "string" + }, + "type": { + "description": "Predicate type (one of the schema's enum): what the predicate gates on.", + "enum": [ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" + ], + "type": "string" + }, + "weaponProperties": { + "description": "Weapon properties to match. AND semantics — match all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / resistances / items / properties / requiresLogicAdded value: +{ + "enum": [ + "and", + "or" + ], + "type": "string" +} - added
Input schema / properties / resistances / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any target makes the character sheet list the resistance while `requires` holds." - added
Input schema / properties / rollMods / items / properties / abilitiesAdded value: +{ + "description": "The abilities whose rolls the modifier covers (lowercase ids). Empty or absent covers every ability.", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rollMods / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / rollMods / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any audience, and not `consumeOnUse`, opens the character sheet's dice roller in this mode on the rolls it covers while `requires` holds." - added
Input schema / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
- Changed
vault_update_spell26 fields changed- added
Input schema / properties / damageReduction / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceFloors / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / diceReplacements / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / forcedMovement / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / recurringDamage / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / resistances / items / properties / requiresAdded value: +{ + "description": "Predicates that gate the resistance (Rage's: a 'condition' predicate on 'raging'). Absent = always.", + "items": { + "additionalProperties": {}, + "properties": { + "abilities": { + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" + }, + "armorCategories": { + "description": "Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any.", + "items": { + "type": "string" + }, + "type": "array" + }, + "condition": { + "description": "For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there.", + "enum": [ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" + ], + "type": "string" + }, + "equipSlot": { + "description": "Body slot the matched weapon must occupy (one of the schema's enum).", + "enum": [ + "mainHand", + "offHand" + ], + "type": "string" + }, + "negate": { + "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.", + "type": "boolean" + }, + "slot": { + "description": "The equipped body category to match (one of the schema's enum).", + "enum": [ + "armor", + "shield", + "weapon" + ], + "type": "string" + }, + "type": { + "description": "Predicate type (one of the schema's enum): what the predicate gates on.", + "enum": [ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" + ], + "type": "string" + }, + "weaponProperties": { + "description": "Weapon properties to match. AND semantics — match all.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / resistances / items / properties / requiresLogicAdded value: +{ + "enum": [ + "and", + "or" + ], + "type": "string" +} - added
Input schema / properties / resistances / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any target makes the character sheet list the resistance while `requires` holds." - added
Input schema / properties / rollMods / items / properties / abilitiesAdded value: +{ + "description": "The abilities whose rolls the modifier covers (lowercase ids). Empty or absent covers every ability.", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / rollMods / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +] - added
Input schema / properties / rollMods / items / properties / trigger / descriptionAdded value: +"'passive' with an absent, self, or any audience, and not `consumeOnUse`, opens the character sheet's dice roller in this mode on the rolls it covers while `requires` holds." - added
Input schema / properties / statBonuses / items / properties / requires / items / properties / abilitiesAdded value: +{ + "description": "For 'attackAbility' predicates: the attack-roll abilities that match (lowercase ids; any one matches). Empty or absent matches any ability. Rage's damage uses ['strength'].", + "items": { + "enum": [ + "strength", + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states). The sheet evaluates only the declared states (the character's `activeStates`); a predicate on any other condition never holds there." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / enumPrevious value: -[ - "equipped", - "attackingWeapon", - "condition" -]New value: +[ + "equipped", + "attackingWeapon", + "condition", + "attackAbility" +]
16 tool updates
- Changed
imagine_create_world1 field changed- added
Input schema / properties / showInvite / descriptionAdded value: +"Whether the world's public page shows an invite button. Only the world's owner or an admin with Admin Mode on can change it; a contributor's value is ignored."
- Changed
imagine_create_world_page4 fields changed- changed
Input schema / properties / link / descriptionPrevious value: -"URL-safe slug. Lowercase letters, numbers, hyphens, slashes."New value: +"URL-safe slug. Lowercase letters, numbers, hyphens, slashes. Choosing a page link needs Premium, VIP, or admin: without it, create ignores the link and derives one from the name, and an update that changes it is refused." - changed
Input schema / properties / maskName / descriptionPrevious value: -"What non-contributors see instead of the page's name while visibility is 'masked'. Empty renders as 'Redacted'."New value: +"What everyone who does not edit the world (its owner, a contributor, or an admin with Admin Mode on) sees instead of the page's name while visibility is 'masked'. Empty renders as 'Redacted'." - changed
Input schema / properties / maskSummary / descriptionPrevious value: -"Optional teaser non-contributors see on the masked page; the real summary and content stay hidden. Max 255 characters."New value: +"Optional teaser everyone who does not edit the world sees on the masked page; the real summary and content stay hidden. Max 255 characters." - changed
Input schema / properties / visibility / descriptionPrevious value: -"Page visibility. 'gm' pages exist only for the world's owner and contributors — every other viewer gets a 404 and the page is absent from lists, search, backlinks, and breadcrumbs. 'masked' pages participate in lists, tags, backlinks, and breadcrumbs but present maskName/maskSummary and an id-based URL to non-contributors; the real name, link, content, and aliases stay hidden until the page is flipped to public. Hidden pages are barred from the world menu. Default: 'public'."New value: +"Page visibility. 'gm' pages exist only for the world's owner, its contributors, and an admin with Admin Mode on — every other viewer gets a 404 and the page is absent from lists, search, backlinks, and breadcrumbs. 'masked' pages participate in lists, tags, backlinks, and breadcrumbs but present maskName/maskSummary and an id-based URL to everyone else; the real name, link, content, and aliases stay hidden until the page is flipped to public. Hidden pages are barred from the world menu. Default: 'public'."
- Changed
imagine_update_world1 field changed- added
Input schema / properties / showInvite / descriptionAdded value: +"Whether the world's public page shows an invite button. Only the world's owner or an admin with Admin Mode on can change it; a contributor's value is ignored."
- Changed
imagine_update_world_page4 fields changed- changed
Input schema / properties / link / descriptionPrevious value: -"URL-safe slug. Lowercase letters, numbers, hyphens, slashes."New value: +"URL-safe slug. Lowercase letters, numbers, hyphens, slashes. Choosing a page link needs Premium, VIP, or admin: without it, create ignores the link and derives one from the name, and an update that changes it is refused." - changed
Input schema / properties / maskName / descriptionPrevious value: -"What non-contributors see instead of the page's name while visibility is 'masked'. Empty renders as 'Redacted'."New value: +"What everyone who does not edit the world (its owner, a contributor, or an admin with Admin Mode on) sees instead of the page's name while visibility is 'masked'. Empty renders as 'Redacted'." - changed
Input schema / properties / maskSummary / descriptionPrevious value: -"Optional teaser non-contributors see on the masked page; the real summary and content stay hidden. Max 255 characters."New value: +"Optional teaser everyone who does not edit the world sees on the masked page; the real summary and content stay hidden. Max 255 characters." - changed
Input schema / properties / visibility / descriptionPrevious value: -"Page visibility. 'gm' pages exist only for the world's owner and contributors — every other viewer gets a 404 and the page is absent from lists, search, backlinks, and breadcrumbs. 'masked' pages participate in lists, tags, backlinks, and breadcrumbs but present maskName/maskSummary and an id-based URL to non-contributors; the real name, link, content, and aliases stay hidden until the page is flipped to public. Hidden pages are barred from the world menu. Default: 'public'."New value: +"Page visibility. 'gm' pages exist only for the world's owner, its contributors, and an admin with Admin Mode on — every other viewer gets a 404 and the page is absent from lists, search, backlinks, and breadcrumbs. 'masked' pages participate in lists, tags, backlinks, and breadcrumbs but present maskName/maskSummary and an id-based URL to everyone else; the real name, link, content, and aliases stay hidden until the page is flipped to public. Hidden pages are barred from the world menu. Default: 'public'."
- Changed
play_create_campaign3 fields changed- removed
Input schema / properties / activeRemoved value: -{ - "type": "boolean" -} - changed
Input schema / properties / public / descriptionPrevious value: -"Whether non-members can see the campaign."New value: +"Whether non-members can see the campaign. Making the campaign public needs Premium, VIP, or admin." - removed
Input schema / properties / sessionsRemoved value: -{ - "items": { - "description": "Mongo `_id` reference (24-character hex string).", - "minLength": 1, - "type": "string" - }, - "type": "array" -}
- Changed
play_create_page1 field changed- changed
Input schema / properties / link / descriptionPrevious value: -"URL-safe slug. Lowercase letters, numbers, and hyphens only."New value: +"URL-safe slug. Lowercase letters, numbers, and hyphens only. Setting or changing a page link needs Premium, VIP, or admin."
- Changed
play_list_user_pages1 field changed- changed
Input schema / properties / userId / descriptionPrevious value: -"Mongo `_id` of the user whose pages to list. Pass own user id (from `whoami`) to see private pages too; for another user, only public pages come back."New value: +"Mongo `_id` of the user whose pages to list. Pass own user id (from `whoami`) to see private pages too; for another user, only their public pages that the caller may read come back (pages of campaigns the caller may view, or with no ref)."
- Changed
play_update_campaign2 fields changed- changed
Input schema / properties / public / descriptionPrevious value: -"Whether non-members can see the campaign."New value: +"Whether non-members can see the campaign. Making the campaign public needs Premium, VIP, or admin." - removed
Input schema / properties / sessionsRemoved value: -{ - "items": { - "description": "Mongo `_id` reference (24-character hex string).", - "minLength": 1, - "type": "string" - }, - "type": "array" -}
- Changed
play_update_page1 field changed- changed
Input schema / properties / link / descriptionPrevious value: -"URL-safe slug. Lowercase letters, numbers, and hyphens only."New value: +"URL-safe slug. Lowercase letters, numbers, and hyphens only. Setting or changing a page link needs Premium, VIP, or admin."
- Changed
vault_attach_companion2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Mongo `_id` of the Main character (owned by the calling user) the companion is attached to."New value: +"Mongo `_id` of the Main character (owned by the calling user, or any character for an admin with Admin Mode on) the companion is attached to." - changed
Input schema / properties / mode / descriptionPrevious value: -"'owned' when the calling user owns the companion character (edits then write through to that character's own document; vault answers 403 if the user does not own it). 'link' for a character someone else owns — stock monsters, a GM's NPC — tracked via a local overlay that never writes to the source. To get a fully-editable copy of a creature the user does NOT own, vault_clone_character it first, then attach the copy with mode 'owned'."New value: +"'owned' when the Main character's owner owns the companion character (edits then write through to that character's own document; vault answers 403 otherwise). 'link' for a character anyone else owns — stock monsters, a GM's NPC — tracked via a local overlay that never writes to the source. To get a fully-editable copy of a creature the user does NOT own, vault_clone_character it first, then attach the copy with mode 'owned'."
- Changed
vault_get_levelup_options1 field changed- changed
Input schema / properties / characterId / descriptionPrevious value: -"`_id` of the character to level (must belong to the calling user)."New value: +"`_id` of the character to level (owned by the calling user, or any character for an admin with Admin Mode on)."
- Changed
vault_level_up_pc1 field changed- changed
Input schema / properties / characterId / descriptionPrevious value: -"`_id` of the character to level (must belong to the calling user)."New value: +"`_id` of the character to level (owned by the calling user, or any character for an admin with Admin Mode on)."
- Changed
vault_list_linked_characters1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Mongo `_id` of the character (owned by the calling user)."New value: +"Mongo `_id` of the character (owned by the calling user, or any character for an admin with Admin Mode on)."
- Changed
vault_record_pc_classes1 field changed- changed
Input schema / properties / characterId / descriptionPrevious value: -"`_id` of the class-less character (must belong to the calling user)."New value: +"`_id` of the class-less character (owned by the calling user, or any character for an admin with Admin Mode on)."
- Changed
vault_spawn_linked_character2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Mongo `_id` of the source character (owned by the calling user)."New value: +"Mongo `_id` of the source character (owned by the calling user, or any character for an admin with Admin Mode on). The new sheet belongs to the source's owner, so the ruleset grant and the character limit are the owner's." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code for the new linked sheet, from list_rulesets (the codes this account can use). Required. Must differ from the source's ruleset; restricted rulesets require an entitlement grant (vault answers 403)."New value: +"Ruleset code for the new linked sheet, from list_rulesets (the codes this account can use). Required. Must differ from the source's ruleset; restricted rulesets require the owner's entitlement grant (vault answers 403)."
- Changed
vault_unlink_character1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Mongo `_id` of the character (owned by the calling user)."New value: +"Mongo `_id` of the character (owned by the calling user, or any character for an admin with Admin Mode on)."
9 tool updates
- Added
imagine_generate_braxylian_name - Added
imagine_generate_gallance_name - Added
imagine_generate_lorean_name - Added
imagine_generate_pelegorian_name - Added
imagine_generate_shoren_name - Added
imagine_generate_strykaran_name - Added
imagine_generate_tarithan_name - Added
imagine_generate_thalassan_name - Added
imagine_translate_shoren
2 tool updates
- Changed
vault_create_character1 field changed- added
Input schema / properties / offense / properties / spellCasting / properties / bonusesAdded value: +{ + "description": "The character's Misc bonuses on the spell / feature attack bonus and save DC (the sheet's Spellcasting section). The array is written whole: send every row to keep.", + "items": { + "additionalProperties": {}, + "properties": { + "bonus": { + "description": "Flat bonus the row adds.", + "type": "number" + }, + "description": { + "description": "What the bonus is (an item, a feature, a house rule).", + "type": "string" + }, + "saveDc": { + "description": "Adds to the spell / feature save DC. Defaults to false.", + "type": "boolean" + }, + "toHit": { + "description": "Adds to the spell / feature attack bonus. Defaults to true.", + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" +}
- Changed
vault_update_character1 field changed- added
Input schema / properties / offense / properties / spellCasting / properties / bonusesAdded value: +{ + "description": "The character's Misc bonuses on the spell / feature attack bonus and save DC (the sheet's Spellcasting section). The array is written whole: send every row to keep.", + "items": { + "additionalProperties": {}, + "properties": { + "bonus": { + "description": "Flat bonus the row adds.", + "type": "number" + }, + "description": { + "description": "What the bonus is (an item, a feature, a house rule).", + "type": "string" + }, + "saveDc": { + "description": "Adds to the spell / feature save DC. Defaults to false.", + "type": "boolean" + }, + "toHit": { + "description": "Adds to the spell / feature attack bonus. Defaults to true.", + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" +}
34 tool updates
- Changed
imagine_update_adventure1 field changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG'). Required at create."New value: +"Ruleset code, from list_rulesets. Required at create."
- Changed
play_add_campaign_item2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_add_campaign_leg3 fields changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset for the new leg. Required. One leg per ruleset — play answers 409 if the campaign already has a leg for this ruleset."New value: +"Ruleset code for the new leg; list_rulesets returns the codes this account can use. Required. One leg per ruleset — play answers 409 if the campaign already has a leg for this ruleset, 400 for an unknown code, and 403 for a ruleset this account is not entitled to." - removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_add_campaign_rule2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_add_campaign_spell2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_create_campaign3 fields changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds'). Becomes the campaign's first leg. Play enforces required on the backend; the gateway lets it be omitted so the LLM gets a clean backend error if it forgets."New value: +"Ruleset code; list_rulesets returns the codes this account can use. Becomes the campaign's first leg. Play enforces required and a known code on the backend (400) and answers 403 for a ruleset this account is not entitled to; the gateway lets it be omitted so the LLM gets a clean backend error if it forgets." - removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_list_campaign_items2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_list_campaign_rules2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_list_campaign_spells2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_remove_campaign_item2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_remove_campaign_rule2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_remove_campaign_spell2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
play_set_campaign_leg_active2 fields changed- removed
Input schema / properties / ruleset / enumRemoved value: -[ - "5th Edition", - "5e24", - "PFRPG", - "PFRPG2", - "PF Playtest", - "Savage Worlds", - "Savage Embers", - "Solarian Conflict", - "Embers RPG", - "Universal", - "Fate Core", - "Fate Accelerated" -] - added
Input schema / properties / ruleset / minLengthAdded value: +1
- Changed
vault_build_monster30 fields changed- changed
Input schema / properties / abilities / descriptionPrevious value: -"Six ability scores as numbers. Gateway computes modifiers, attack/damage/save/skill/initiative derivations."New value: +"Ability scores as numbers, one per ability score key. Vault computes modifiers, attack/damage/save/skill/initiative derivations." - changed
Input schema / properties / ac / descriptionPrevious value: -"AC block. `total` is the value the sheet should display (source-text value, like '16'). Gateway computes the stored base by subtracting DEX modifier (with medium/heavy armor weight caps) and any shield/magic/misc bonuses. Per the guide Rule 1."New value: +"AC block. `total` is the value the sheet should display (the source-text number). Vault computes the stored base from it, the `armorWeight` given, and any shield/magic/misc bonuses, per the guide Rule 1." - changed
Input schema / properties / actions / descriptionPrevious value: -"Action entries. `type` per the guide Rule 3 (Melee / Range / Special / Reaction / Legendary / Bonus). For attacks, pass `attackBonus` + `attackAttribute` + `damageDice` + `damageType` + `damageAttribute`; gateway back-derives `attack.misc`. For ranged spell attacks (Hurl Flame etc.) use the spellcasting attribute, not strength/dexterity. `recharge: '5-6'` (or '6', '4-6') creates a matching trackables[] checkbox the sheet renders as a cooldown."New value: +"Action entries. `type` per the guide Rule 3. For attacks, pass `attackBonus` + `attackAttribute` + `damageDice` + `damageType` + `damageAttribute`; vault back-derives `attack.misc`. The guide Rule 3 gives `attackAttribute` for a spell attack. `recharge` takes the source's recharge text and creates a matching trackables[] checkbox the sheet renders as a cooldown; the guide gives the form." - changed
Input schema / properties / actions / items / properties / type / enumPrevious value: -[ - "Melee", - "Range", - "Special", - "Reaction", - "Legendary", - "Bonus" -]New value: +[ + "Melee", + "Range", + "Special", + "Bonus", + "Reaction", + "Legendary", + "Lair" +] - changed
Input schema / properties / additionalNotes / descriptionPrevious value: -"Any free-form notes[] entries the LLM wants to author beyond the auto-generated Challenge / Legendary Actions / Speed-alternate-form rows. Use sparingly — most stat-block content has a dedicated structured field above."New value: +"Any free-form notes[] entries the LLM wants to author beyond the auto-generated challenge, legendary-intro, and alternate-form speed rows. Use sparingly — most stat-block content has a dedicated structured field above." - changed
Input schema / properties / alignment / descriptionPrevious value: -"Alignment text, e.g. 'Unaligned' or 'Neutral Evil'."New value: +"Alignment text, source-exact." - changed
Input schema / properties / conditionImmunities / descriptionPrevious value: -"5e split form: condition-only immunities. Use only if the source says 'Condition Immunities' as a separate row."New value: +"Split form: condition-only immunities, source-exact. Use only if the source has a separate condition immunities row." - changed
Input schema / properties / cr / descriptionPrevious value: -"Challenge Rating. Must be one of the canonical 5e24 values: 0, 0.125 (CR 1/8), 0.25 (CR 1/4), 0.5 (CR 1/2), or any integer 1-30. Gateway looks up XP reward + level-equivalent XP + proficiency bonus."New value: +"Challenge Rating as a number, a fraction as its decimal (e.g. 0.125 for CR 1/8); vault answers an error for a value that is not a challenge rating. Vault looks up XP reward + level-equivalent XP + proficiency bonus." - changed
Input schema / properties / creatureType / descriptionPrevious value: -"Creature type — source text, e.g. 'Elemental', 'Humanoid', 'Dragon (Chromatic)'. Preserved verbatim into `core.race` per the guide Rule 16 'preserve original text'."New value: +"Creature type, source text. Preserved verbatim into `core.race` per the guide Rule 16 'preserve original text'." - changed
Input schema / properties / damageImmunities / descriptionPrevious value: -"5e (2014) split form: damage-only immunities. Use only if the source says 'Damage Immunities' as a separate row."New value: +"Split form: damage-only immunities, source-exact. Use only if the source has a separate damage immunities row." - changed
Input schema / properties / damageResistances / descriptionPrevious value: -"5e split form: damage-only resistances. Use only if the source says 'Damage Resistances'."New value: +"Split form: damage-only resistances, source-exact. Use only if the source has a separate damage resistances row." - changed
Input schema / properties / damageVulnerabilities / descriptionPrevious value: -"5e split form: damage-only vulnerabilities."New value: +"Split form: damage-only vulnerabilities, source-exact." - changed
Input schema / properties / gear / descriptionPrevious value: -"Gear listed on the stat block ('Greatsword, Splint Armor'). Each becomes an items[] entry with `equipped: false` (monsters don't use equip slots) per Rule 19. Server-side template fill adds the four currency items separately."New value: +"Gear listed on the stat block, source text. Each becomes an items[] entry with `equipped: false` (monsters don't use equip slots) per Rule 19. Server-side template fill adds the currency items separately." - changed
Input schema / properties / hitDiceSize / descriptionPrevious value: -"Hit-die size mapped from creature size per 5e24 MM: Tiny d4, Small d6, Medium d8, Large d10, Huge d12, Gargantuan d20. Defaults to d8 when omitted (Medium creatures, by far the common case)."New value: +"Hit-die size from the stat block. Omitted, the app chooses the die." - changed
Input schema / properties / hitDiceSize / enumPrevious value: -[ - "d4", - "d6", - "d8", - "d10", - "d12", - "d20" -]New value: +[ + "d4", + "d6", + "d8", + "d10", + "d12", + "d20", + "d100" +] - changed
Input schema / properties / immunities / descriptionPrevious value: -"5e24 combined Immunities text (damage + condition, semicolon-separated): 'Fire, Poison; Frightened, Poisoned'. Use this when the source says 'Immunities'."New value: +"Combined immunities row, source-exact, damage and condition entries as the source writes them. Use this when the source has one combined immunities row." - changed
Input schema / properties / initiativeBonus / descriptionPrevious value: -"Override the initiative bonus only if the listed value differs from the DEX modifier. Per the guide Rule 17, gateway sets `offense.initiative.misc = listed − DEX-mod`."New value: +"The listed initiative bonus. Pass it only if it differs from the bonus the sheet derives; vault keeps the difference in `offense.initiative.misc` per the guide Rule 17." - changed
Input schema / properties / languages / descriptionPrevious value: -"Languages text, source-exact (e.g. '—' or 'Common, Draconic, telepathy 60 ft.'). Stored in `core.languages`."New value: +"Languages text, source-exact. Stored in `core.languages`." - changed
Input schema / properties / legendaryIntro / descriptionPrevious value: -"Legendary Actions intro paragraph (the prose about how legendary actions work for this creature). Per the guide Rule 8, lands in notes[] under name 'Legendary Actions'. Individual legendary action entries go in `actions[]` with `type: 'Legendary'`."New value: +"Intro paragraph of the stat block's legendary section (the prose about how those actions work for this creature). Lands in notes[] under the name the guide Rule 8 gives. Individual legendary entries go in `actions[]` with the matching `type`." - removed
Input schema / properties / ruleset / constRemoved value: -"5e24" - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Only '5e24' is supported. The authoring guide and the conversion math are 5e24-specific; other rulesets will land via their own build tools."New value: +"A ruleset the monster builder supports. The authoring guide and the conversion math are ruleset-specific; other rulesets will land via their own build tools." - added
Input schema / properties / ruleset / enumAdded value: +[ + "5e24" +] - changed
Input schema / properties / saves / descriptionPrevious value: -"Saving throw bonuses for the proficient ones only. Gateway derives `attributes[].proficient = true` and a `misc` adjustment so the sheet's `ability + PB + misc` lands on the source bonus."New value: +"Saving throw bonuses for the proficient ones only. Vault derives `attributes[].proficient = true` and a `misc` adjustment so the sheet total lands on the source bonus." - changed
Input schema / properties / senses / descriptionPrevious value: -"Senses other than passive perception: darkvision, blindsight, tremorsense, truesight. Each becomes a rules[] Ability entry with `name` ('Darkvision') and `detail` ('120 ft.'). Passive Perception is NOT authored — sheet derives it from the Perception skill."New value: +"The stat block's senses other than the passive one the sheet derives, each as `name` and `detail` (the source text after the name). Each becomes a rules[] entry. The monster authoring guide covers which senses to author." - changed
Input schema / properties / size / descriptionPrevious value: -"Size text — single value ('Medium') or variable form ('Medium or Small') per the guide Rule 18. Stored verbatim in `core.size`."New value: +"Size text, source-exact: a single value or the variable form ('X or Y') per the guide Rule 18. Stored verbatim in `core.size`." - changed
Input schema / properties / skills / descriptionPrevious value: -"Skill bonuses for proficient / expertise skills only. Gateway derives the proficient + expertise flags + misc so the sheet total matches the source bonus per the guide Rule 6."New value: +"Skill bonuses for proficient / expertise skills only. Vault derives the proficient + expertise flags + misc so the sheet total matches the source bonus per the guide Rule 6." - changed
Input schema / properties / sourceProficiencyBonus / descriptionPrevious value: -"Override the PB derived from CR. Use only when the source stat block explicitly lists a non-standard PB (e.g. a CR-low legendary creature with PB +5). For PB +7 and above the high-PB misc compensation per the guide Rule 15 kicks in automatically."New value: +"Override the PB derived from CR. Use only when the source stat block explicitly lists a PB other than the one its CR gives. A PB larger than the sheet's keeps the difference in misc automatically, per the guide Rule 15." - changed
Input schema / properties / speed / descriptionPrevious value: -"Speed block. `walk` is the base walking speed in feet. Non-walking modes (climb / fly / swim / burrow) become rules[] Ability entries with the listed range. `alternateForm` carries the parenthetical text from lycanthrope-style stat blocks ('40 ft. in boar form') per the guide Rule 5; lands in notes[]."New value: +"Speed block, in feet. `walk` is the base walking speed; the other modes become rules[] entries with the listed range. `alternateForm` carries a stat block's parenthetical alternate-form speed text, source-exact, per the guide Rule 5; lands in notes[]." - changed
Input schema / properties / spellcasting / descriptionPrevious value: -"Innate spellcasting block per the guide Rule 4. Gateway formats the spell list as markdown with two-space hard breaks between frequency rows and italic spell names: `**At will:** *detect evil and good* \\n**1/day each:** *commune*, *raise dead*`. Lands as a single rules[] Ability entry named 'Innate Spellcasting'."New value: +"Innate spellcasting block per the guide Rule 4: the casting ability, save DC, and the spells grouped by their source frequency text. Vault formats the spell list as markdown per that rule and lands it as a single rules[] entry." - changed
Input schema / properties / traits / descriptionPrevious value: -"Trait entries (Web-Dweller, Molten Body, Pack Tactics, etc.). Use `summary` for parenthetical usage limits per Rule 14 (e.g. 'Legendary Resistance' name + '3/Day, or 4/Day in Lair' summary + body description). Use `detail` for the kind of short qualifier on entries like Darkvision (but darkvision itself goes under `senses`)."New value: +"Trait entries, source text. Use `summary` for a parenthetical usage limit per the guide Rule 14, and `detail` for a short qualifier per Rule 17; senses go under `senses`."
- Changed
vault_build_pc20 fields changed- changed
Input schema / properties / abilityBumpPicks / descriptionPrevious value: -"Ability-score-increase picks for any applied rule carrying an `abilityScoreBump` (a feat / ability that raises a score by your choice — e.g. an ASI). Key is the granting rule `_id`; value is `{ option, lines }`: `option` is the 0-based index of the chosen alternative in that bump's `options` (the player picks exactly ONE — the OR), and `lines` is parallel to that option's `lines`, each entry the lowercase ability names assigned to that line (the AND). Each line needs exactly its `count` distinct abilities drawn from its `eligible` pool (empty = any of the six), none exceeding its `max`. The build bakes the increases onto the ability scores before HP, so a Constitution increase feeds level-1 HP. A `repeatable` feat filling the background slot keys `bg:<featId>` instead of `<featId>`."New value: +"Ability-score-increase picks for any applied rule carrying an `abilityScoreBump` (a feat / ability that raises a score by your choice). Key is the granting rule `_id`; value is `{ option, lines }`: `option` is the 0-based index of the chosen alternative in that bump's `options` (the player picks exactly ONE — the OR), and `lines` is parallel to that option's `lines`, each entry the lowercase ability names assigned to that line (the AND). Each line needs exactly its `count` distinct abilities drawn from its `eligible` pool (empty = any ability in the schema's abilities list), none exceeding its `max`. The build bakes the increases onto the ability scores before it derives the rest of the sheet. A `repeatable` feat filling the background slot keys `bg:<featId>` instead of `<featId>`." - changed
Input schema / properties / abilityChoices / descriptionPrevious value: -"Picks for a class ability's `choice` (ruleChoice). Key is the ability rule `_id`; value is exactly `choice.count` picked option `_id`s from `choice.options`. Each option carries a `type`. When a picked option carries its OWN sub-choices (any type — an Ability like a Cleric's Divine Order → Thaumaturge, or a Feat granted 'of your choice'), supply them in `proficiencyChoicePicks` / `spellChoicePicks` / `spellListChoicePicks` / `preparedSpellPicks` keyed by the picked option's `_id`, just like the background feat."New value: +"Picks for a class ability's `choice` (ruleChoice). Key is the ability rule `_id`; value is exactly `choice.count` picked option `_id`s from `choice.options`. Each option carries a `type`. When a picked option carries its OWN sub-choices (any type — an Ability or a Feat), supply them in `proficiencyChoicePicks` / `spellChoicePicks` / `spellListChoicePicks` / `preparedSpellPicks` keyed by the picked option's `_id`, just like the background feat." - changed
Input schema / properties / abilityScoreAssignments / descriptionPrevious value: -"Final ability scores by key, all six required. Must satisfy the chosen `abilityScoreMethod`: standard-array uses [15,14,13,12,10,8] in any order; point-buy each in 8..15 within the budget; class-array is taken from the class's defaultAbilityScores (still send the six values you intend)."New value: +"Final ability scores by ability key, every key required. Must satisfy the chosen `abilityScoreMethod` as `constants.abilityScoreMethods` describes it (still send every value you intend)." - changed
Input schema / properties / abilityScorePointBudget / descriptionPrevious value: -"Point-buy budget override. Defaults to 27 (5e24). Only used for `abilityScoreMethod: 'point-buy'`."New value: +"Budget override for an ability-score method that spends a budget. Defaults to that method's budget in `constants.abilityScoreMethods`. Ignored for a method without one." - changed
Input schema / properties / alignment / enumPrevious value: -[ - "Lawful Good", - "Neutral Good", - "Chaotic Good", - "Lawful Neutral", - "Neutral", - "Chaotic Neutral", - "Lawful Evil", - "Neutral Evil", - "Chaotic Evil" -]New value: +[ + "Lawful Good", + "Lawful Neutral", + "Lawful Evil", + "Neutral Good", + "Neutral", + "Neutral Evil", + "Chaotic Good", + "Chaotic Neutral", + "Chaotic Evil" +] - changed
Input schema / properties / backgroundBumpAssignments / descriptionPrevious value: -"Background ability-score bump per key. 'twoOne' mode: one ability +2 and a different one +1. 'oneOneOne' mode: three different abilities +1. Keys not bumped are omitted or 0. Only the background's `abilityScores` keys are eligible."New value: +"Background ability-score bump per key, as `backgroundBumpMode` distributes it (each mode's amounts are the wizard constants' `backgroundBumpModeOptions`, from `vault_get_pc_creation_options` kind `constants`). Keys not bumped are omitted or 0. Only the background's `abilityScores` keys are eligible." - changed
Input schema / properties / backgroundBumpMode / descriptionPrevious value: -"Required when the background grants an ability bump. 'twoOne' = +2/+1; 'oneOneOne' = +1/+1/+1."New value: +"Required when the background grants an ability bump; each mode's amounts are the wizard constants' `backgroundBumpModeOptions`." - changed
Input schema / properties / backgroundFeatRuleId / descriptionPrevious value: -"The background's Origin feat. REQUIRED when `background.featOpen` is true (an open slot — the build rejects the draft without it); optional on a fixed-feat background, where supplying it swaps the authored default. Must be an Origin-category feat (from `kind: 'feat'`)."New value: +"The background's feat, from the `originFeatCategory` feats. REQUIRED when `background.featOpen` is true (an open slot — the build rejects the draft without it); optional on a fixed-feat background, where supplying it swaps the authored default. Must be a feat in the `originFeatCategory` (from `kind: 'feat'`)." - changed
Input schema / properties / castingAbilityPicks / descriptionPrevious value: -"Spellcasting-ability picks for `spellChoices` blocks that carry `castingAbilityOptions` (the lineage \"Intelligence, Wisdom, or Charisma is your spellcasting ability\" wording). Key is `\"<ruleId>:<blockIndex>\"` (same keying as `spellChoicePicks`); value is ONE lowercase ability name from that block's `castingAbilityOptions`. The projection surfaces `castingAbilityOptions` only when a pick is genuinely required (a fixed ability or a single option self-resolves server-side) — so whenever you see the array, supply a pick or the build rejects the draft. The resolved ability is stamped on each granted spell (`spells[].castingAbility`). A `repeatable` background feat prefixes the key `bg:<featId>:<blockIndex>` (same keying as spellChoicePicks)."New value: +"Spellcasting-ability picks for `spellChoices` blocks that carry `castingAbilityOptions` (a grant that lets the player choose the casting ability). Key is `\"<ruleId>:<blockIndex>\"` (same keying as `spellChoicePicks`); value is ONE lowercase ability name from that block's `castingAbilityOptions`. The projection surfaces `castingAbilityOptions` only when a pick is genuinely required (a fixed ability or a single option self-resolves server-side) — so whenever you see the array, supply a pick or the build rejects the draft. The resolved ability is stamped on each granted spell (`spells[].castingAbility`). A `repeatable` background feat prefixes the key `bg:<featId>:<blockIndex>` (same keying as spellChoicePicks)." - changed
Input schema / properties / languages / descriptionPrevious value: -"The character's OWN chosen language names (e.g. ['Elvish','Draconic']). 'Common' is added server-side. `constants.languages.options` + `pickCount` are the conventional pool and count, but vault stores whatever is passed here — free-form names are allowed and the count is not enforced. (Languages a background/species GRANTS go in `languageChoicePicks`, not here.)"New value: +"The character's OWN chosen language names. The build adds any language the ruleset gives every character. `constants.languages.options` + `pickCount` are the conventional pool and count, but vault stores whatever is passed here — free-form names are allowed and the count is not enforced. (Languages a background/species GRANTS go in `languageChoicePicks`, not here.)" - changed
Input schema / properties / preparedSpellPicks / descriptionPrevious value: -"Which leveled spells the player keeps prepared, for rules carrying a `preparedSpells` count. Key is the granting rule `_id`; value is spell `_id`s drawn from the character's granted leveled spells — `spellChoices` picks, whole-pool fixed grants, and `spellListChoices` picks alike — EXCLUDING spells that are already prepared: cantrips, and any spell granted by a block whose `prepared` flag is true (an always-prepared grant; the options projection ships `prepared` on each block so you can tell). The required count is the grant's count CLAMPED to that pool's size — send exactly min(count, preparable leveled spells). A `repeatable` feat filling the background slot keys `bg:<featId>` instead of `<featId>`."New value: +"Which spells the player keeps prepared, for rules carrying a `preparedSpells` count. Key is the granting rule `_id`; value is spell `_id`s drawn from the character's preparable granted spells — `spellChoices` picks, whole-pool fixed grants, and `spellListChoices` picks alike — EXCLUDING any granted by a block whose `prepared` flag is true (an always-prepared grant; the options projection ships `prepared` on each block so you can tell) and any the count does not cover (the rule authoring guide's preparedSpells section says which). The rule authoring guide.s preparedSpells section gives the required count; vault rejects picks that do not fit. A `repeatable` feat filling the background slot keys `bg:<featId>` instead of `<featId>`." - changed
Input schema / properties / proficiencyChoicePicks / descriptionPrevious value: -"Picks for proficiencyChoices grants across ALL applied rules (class/species/feat/abilities). Key is `\"<ruleId>:<grantIndex>\"` (the Rule `_id` and the 0-based index into that rule's `proficiencyChoices`); value is the chosen names (skills/tools/saves/weapons/armor/languages). Only supply for grants where `count` < the option-pool size — fixed grants (count >= pool) are auto-applied and need no pick. A grant with `level: \"expertise\"` draws from the character's PROFICIENT skills (proficiency from every source applies first, then expertise), granting the expertise state rather than proficiency. A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<grantIndex>` (not `<featId>:<grantIndex>`)."New value: +"Picks for proficiencyChoices grants across ALL applied rules (class/species/feat/abilities). Key is `\"<ruleId>:<grantIndex>\"` (the Rule `_id` and the 0-based index into that rule's `proficiencyChoices`); value is the chosen names (skills/tools/saves/weapons/armor/languages). Only supply for grants where `count` < the option-pool size — fixed grants (count >= pool) are auto-applied and need no pick. A grant with `level: \"expertise\"` grants the expertise state rather than proficiency, from the pool the rule authoring guide describes (proficiencyChoices). A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<grantIndex>` (not `<featId>:<grantIndex>`)." - removed
Input schema / properties / ruleset / defaultRemoved value: -"5e24" - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset. Only '5e24' supports guided creation today."New value: +"A ruleset with guided character creation: the one the options were read for with `vault_get_pc_creation_options`." - changed
Input schema / properties / speciesAbilityChoices / descriptionPrevious value: -"Same as `abilityChoices`, for a species ability's `choice` (e.g. a Human's 'Versatile' → an Origin feat). A picked option's own sub-choices (any type — Ability or Feat) go in the proficiency/spell pick maps keyed by that option's `_id`."New value: +"Same as `abilityChoices`, for a species ability's `choice`. A picked option's own sub-choices (any type — Ability or Feat) go in the proficiency/spell pick maps keyed by that option's `_id`." - changed
Input schema / properties / speciesRuleId / descriptionPrevious value: -"`_id` of a Species/Race rule (from `kind: 'species'`)."New value: +"`_id` of the heritage rule (from `kind: 'species'`)." - changed
Input schema / properties / spellChoicePicks / descriptionPrevious value: -"Picks for `spellChoices` blocks across ALL applied rules (class/species/feat/abilities). Key is `\"<ruleId>:<blockIndex>\"` (the Rule `_id` and the 0-based index into that rule's `spellChoices` AS PROJECTED — the array may contain null entries holding the position of blocks that grant nothing at level 1; count them when indexing, never compact the array). Value is the chosen spell `_id`s. Only supply where a block's `count` < its option-pool size — a whole-pool block is granted automatically. Each block's options come from `vault_get_pc_creation_options` (an applied ability/feat's `spellChoices[].options`). A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<blockIndex>`."New value: +"Picks for `spellChoices` blocks across ALL applied rules (class/species/feat/abilities). Key is `\"<ruleId>:<blockIndex>\"` (the Rule `_id` and the 0-based index into that rule's `spellChoices` AS PROJECTED — the array may contain null entries holding the position of blocks that grant nothing at the starting level; count them when indexing, never compact the array). Value is the chosen spell `_id`s. Only supply where a block's `count` < its option-pool size — a whole-pool block is granted automatically. Each block's options come from `vault_get_pc_creation_options` (an applied ability/feat's `spellChoices[].options`). A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<blockIndex>`." - changed
Input schema / properties / spellListChoicePicks / descriptionPrevious value: -"Picks for `spellListChoices` blocks (the Magic Initiate shape: choose ONE class list, then spells from that one list). Key is `\"<ruleId>:<blockIndex>\"` (the projected array may contain null entries holding the position of blocks the build skips — count them when indexing, never compact); value is `{ category, picks }` where `category` is one of the block's `categories` and `picks` is `{ \"<pickIndex>\": [spellId, …] }` — the chosen spells for each pick, drawn from that pick's `optionsByCategory[category]`. When the block carries `castingAbilityOptions`, also set `castingAbility` (one lowercase ability name from those options) — the build rejects the draft without it. A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<blockIndex>`."New value: +"Picks for `spellListChoices` blocks (choose ONE of the block's lists, then spells from that one list). Key is `\"<ruleId>:<blockIndex>\"` (the projected array may contain null entries holding the position of blocks the build skips — count them when indexing, never compact); value is `{ category, picks }` where `category` is one of the block's `categories` and `picks` is `{ \"<pickIndex>\": [spellId, …] }` — the chosen spells for each pick, drawn from that pick's `optionsByCategory[category]`. When the block carries `castingAbilityOptions`, also set `castingAbility` (one lowercase ability name from those options) — the build rejects the draft without it. A `repeatable` feat filling the background slot prefixes its keys `bg:<featId>:<blockIndex>`." - changed
Input schema / properties / weaponAbilityChoices / descriptionPrevious value: -"For finesse weapons in the chosen bundle: key is the item `_id`, value is the attack ability ('strength' or 'dexterity')."New value: +"For a weapon in the chosen bundle whose attack ability is a player pick: key is the item `_id`, value is the attack ability (one of the schema's enum)." - changed
Input schema / requiredPrevious value: -[ - "name", - "classRuleId", - "abilityScoreMethod", - "abilityScoreAssignments", - "skillProficiencies", - "toolProficiencies", - "startingEquipmentLabel" -]New value: +[ + "ruleset", + "name", + "classRuleId", + "abilityScoreMethod", + "abilityScoreAssignments", + "skillProficiencies", + "toolProficiencies", + "startingEquipmentLabel" +]
- Changed
vault_create_character46 fields changed- changed
Input schema / properties / actions / items / properties / actions / descriptionPrevious value: -"PF Playtest action-economy marker (F/1/2/3/R)."New value: +"Action-cost marker, for rulesets whose actions carry one; the value is the source text." - changed
Input schema / properties / actions / items / properties / attack / properties / attribute / descriptionPrevious value: -"Ability driving the to-hit roll (e.g. 'strength', 'charisma' for spell attacks)."New value: +"Ability driving the to-hit roll." - changed
Input schema / properties / actions / items / properties / rof / descriptionPrevious value: -"Savage Worlds Rate of Fire."New value: +"Rate of fire, for rulesets whose actions carry one." - changed
Input schema / properties / actions / items / properties / type / descriptionPrevious value: -"Action type. 5e24 uses 'Melee' / 'Range' / 'Special' / 'Reaction' / 'Legendary' / 'Bonus'."New value: +"Action type, as the ruleset's sheet names it." - changed
Input schema / properties / aspects / items / properties / kind / descriptionPrevious value: -"One of 'high concept', 'trouble', 'character', 'consequence'."New value: +"The aspect's kind. The values are the ones the ruleset's sheet template uses; read a character of that ruleset (vault_get_character) to see them." - changed
Input schema / properties / aspects / items / properties / shifts / descriptionPrevious value: -"Consequence/condition slots only: harm absorbed. Fate: 2 Mild, 4 Moderate, 6 Severe, 8 Extreme (Fate Accelerated omits Extreme). Demon Hunters conditions: 5 Mild, 10 Moderate, 15 Severe."New value: +"Consequence/condition slots only: the harm the slot absorbs, as the ruleset's sheet template sets it per slot." - changed
Input schema / properties / attributes / items / properties / misc / descriptionPrevious value: -"Misc bonus on the save (5e/5e24). Used for high-PB monster compensation."New value: +"Misc bonus on the save. The monster authoring guide covers when a monster uses it." - changed
Input schema / properties / attributes / items / properties / name / descriptionPrevious value: -"Ability name: strength / dexterity / constitution / intelligence / wisdom / charisma. Lowercase."New value: +"Ability id, lowercase (a value from the abilities list the typed tools' schemas carry)." - changed
Input schema / properties / attributes / items / properties / proficient / descriptionPrevious value: -"Save proficiency flag (5e/5e24). When true, PB is added to the save."New value: +"Save proficiency flag. The sheet applies it to the save total." - changed
Input schema / properties / attributes / items / properties / score / descriptionPrevious value: -"Raw ability score (e.g. 17). Modifier is derived by the sheet."New value: +"Raw ability score. Modifier is derived by the sheet." - changed
Input schema / properties / core / properties / race / descriptionPrevious value: -"Creature type for monsters (e.g. 'Elemental', 'Humanoid', 'Dragon (Chromatic)'); race for PCs."New value: +"Creature type for monsters (source text); race for PCs." - changed
Input schema / properties / core / properties / refresh / descriptionPrevious value: -"Session-start resource: fate points (Fate — Refresh) or faith dice (Demon Hunters — Devotion). The total the character resets to at the start of a session."New value: +"Session-start resource: the total the character resets to at the start of a session. The sheet template of the character's ruleset labels it." - changed
Input schema / properties / core / properties / size / descriptionPrevious value: -"Creature size. Exact source text including 'or' for variable sizes ('Medium or Small')."New value: +"Creature size. Exact source text including 'or' for variable sizes ('X or Y')." - changed
Input schema / properties / defense / properties / armorClass / descriptionPrevious value: -"Layered AC rows the sheet sums. IMPORTANT (5e24): when the character's `settings.autoPassiveBonuses` is true — the default for new 5e24 characters — the `armor` and `shield` rows are DERIVED from equipped items and recomputed on every sheet load, so writing them here gets overwritten. Change AC by setting `equipped: true/false` on the character's armor/shield items instead. When the toggle is false (and on all other rulesets), these rows are manually authored and writing them here is correct. `magic` and `misc` are manual in both modes. Check the toggle with vault_get_character before writing."New value: +"Layered AC rows the sheet sums. IMPORTANT: when the character's `settings.autoPassiveBonuses` is true — the default for new characters in rulesets with sheet automation — the `armor` and `shield` rows are DERIVED from equipped items and recomputed on every sheet load, so writing them here gets overwritten. Change AC by setting `equipped: true/false` on the character's armor/shield items instead. When the toggle is false (and on rulesets without sheet automation), these rows are manually authored and writing them here is correct. `magic` and `misc` are manual in both modes. Check the toggle with vault_get_character before writing." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / bonus / descriptionPrevious value: -"Base AC value the sheet adds DEX to. See the 5e24 monster guide Rule 1 for the math."New value: +"Base AC value the sheet builds the total from. The monster authoring guide's Rule 1 gives the math." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / description / descriptionPrevious value: -"Armor name ('Natural Armor', 'Chain Shirt') or null when AC derives from DEX only."New value: +"Armor name, source text, or null when no armor applies." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / heavy / descriptionPrevious value: -"True suppresses DEX contribution entirely (heavy armor)."New value: +"True for heavy armor; the engine applies that armor weight's rule to the total." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / medium / descriptionPrevious value: -"True caps DEX contribution to +2 (medium armor)."New value: +"True for medium armor; the engine applies that armor weight's rule to the total." - changed
Input schema / properties / defense / properties / exhaustion / descriptionPrevious value: -"5e24 Exhaustion level (0-6). Absent = 0 (not exhausted). Each level is -2 to d20 Tests and -5 ft Speed; level 6 = death. A Long Rest via the vault rest control reduces it by 1."New value: +"Exhaustion level, within the schema's range. Absent = not exhausted. The engine applies its effects and reduces it on a rest taken through the vault rest control." - changed
Input schema / properties / defense / properties / hitDice / properties / current / descriptionPrevious value: -"Unspent hit dice count. When `pools` is present (5e24 class characters), this is the derived sum of pool currents — keep it consistent with pools on write."New value: +"Unspent hit dice count. When `pools` is present, this is the derived sum of pool currents — keep it consistent with pools on write." - changed
Input schema / properties / defense / properties / hitDice / properties / dice / descriptionPrevious value: -"Without `pools` (monsters, non-5e24): per-die expression, NOT the multiplied total — size-mapped Tiny d4 / Small d6 / Medium d8 / Large d10 / Huge d12 / Gargantuan d20, see monster guide Rule 20. When `pools` is present (5e24 class characters): the derived compound string ('5d10 + 5d6') — keep it consistent with pools on write."New value: +"Without `pools` (monsters, and sheets without pools): one die expression ('1dX'), NOT the multiplied total; the monster guide's Rule 20 gives a monster's die. When `pools` is present: the derived compound string, one 'NdX' term per pool joined by ' + ' — keep it consistent with pools on write." - changed
Input schema / properties / defense / properties / hitDice / properties / pools / descriptionPrevious value: -"5e24 per-die-size Hit Dice pools — the AUTHORITATIVE representation (one entry per die size a multiclass character has). Maintained by creation, level-up, and a one-shot backfill; player edits win. The server does NOT re-derive the legacy fields on write, so when writing hit dice for a character with pools, write pools AND the legacy current/dice consistently (current = sum of pool currents; dice = compound string)."New value: +"Per-die-size Hit Dice pools, present on class characters the creation and level-up tools maintain — the AUTHORITATIVE representation (one entry per die size a multiclass character has). Maintained by creation, level-up, and a one-shot backfill; player edits win. The server does NOT re-derive the legacy fields on write, so when writing hit dice for a character with pools, write pools AND the legacy current/dice consistently (current = sum of pool currents; dice = compound string)." - changed
Input schema / properties / defense / properties / hitDice / properties / pools / items / properties / dice / descriptionPrevious value: -"Die size of this pool, e.g. 'd10'."New value: +"Die size of this pool." - changed
Input schema / properties / items / items / properties / sourceSpell / descriptionPrevious value: -"Auto-managed. Link to the spell that manufactured this companion armor item (e.g. Mage Armor, which the vault sheet offers as an equippable Light armor). The sheet sets and maintains it; if it's present on an item you're editing, preserve it verbatim, and never set, change, or invent it. Dropping it on a round-trip de-links the companion and leaves a duplicate item on the sheet."New value: +"Auto-managed. Link to the spell that manufactured this companion armor item (a spell the vault sheet offers as equippable armor). The sheet sets and maintains it; if it's present on an item you're editing, preserve it verbatim, and never set, change, or invent it. Dropping it on a round-trip de-links the companion and leaves a duplicate item on the sheet." - changed
Input schema / properties / offense / properties / initiative / properties / attribute / descriptionPrevious value: -"Ability whose modifier drives initiative. Typically 'dexterity'."New value: +"Ability whose modifier drives initiative, lowercase." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / rules / items / properties / type / descriptionPrevious value: -"Rule type (Ability / Feat / Class / Background / etc.). Vault validates against its rulestype enum on save."New value: +"Rule type. Vault validates it on save." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds'). Required. Restricted rulesets require an entitlement grant on the account — vault answers 403 for ungranted or unknown codes. Check list_rulesets for the codes this account can use."New value: +"Ruleset code, from list_rulesets (the codes this account can use). Required. Restricted rulesets require an entitlement grant on the account — vault answers 403 for ungranted or unknown codes." - changed
Input schema / properties / settings / properties / autoPassiveBonuses / descriptionPrevious value: -"When true, the per-character rules engine layer contributes statBonuses from rules / items / feats. On 5e24 it ALSO derives the armor/shield rows of defense.armorClass from equipped items, recomputed on every sheet load — manual writes to those rows do not stick while this is true. Monsters should set this to false."New value: +"When true, the per-character rules engine layer contributes statBonuses from rules / items / feats. On rulesets with sheet automation it ALSO derives the armor/shield rows of defense.armorClass from equipped items, recomputed on every sheet load — manual writes to those rows do not stick while this is true. Monsters should set this to false." - changed
Input schema / properties / settings / properties / hiddenSections / descriptionPrevious value: -"Sheet-section keys the player chose to hide while the section is empty ('spells', 'abilities', 'feats', 'origin', 'actionCards', 'hindrances', 'edges', 'stunts', 'extras'). A section with content always renders regardless of this list — the preference means 'hide when empty', never 'hide my data'."New value: +"Keys of the character sheet's sections the player chose to hide while the section is empty. A section with content always renders regardless of this list — the preference means 'hide when empty', never 'hide my data'." - changed
Input schema / properties / skills / items / properties / rating / descriptionPrevious value: -"Fate: ladder position, -2 (Terrible) to +8 (Legendary); also an FAE approach's rating. Demon Hunters: the trait's die size (4, 6, 8, 10, or 12), or 0 for an unrated Fringe discipline."New value: +"The rating, on the ruleset's own scale. The ruleset's sheet template sets it; read a character of that ruleset (vault_get_character) to see the values." - changed
Input schema / properties / spells / items / properties / recovery / descriptionPrevious value: -"Per-rest recovery rows for a finite free-cast counter, stamped from the granting rule's freeCast.recovery whenever the counter is created or grown (creation build and level-up). The vault rest control refills the counter from these when the player declares a Short/Long rest. Absent = the counter doesn't refresh on rest."New value: +"Per-rest recovery rows for a finite free-cast counter, stamped from the granting rule's freeCast.recovery whenever the counter is created or grown (creation build and level-up). The vault rest control refills the counter from these when the player declares the rest a row's `on` field names. Absent = the counter doesn't refresh on rest." - changed
Input schema / properties / stress / items / properties / name / descriptionPrevious value: -"Track name — 'Physical Stress' / 'Mental Stress' in Fate Core, 'Stress' in Fate Accelerated."New value: +"Track name, as the ruleset's sheet template names its tracks." - changed
Input schema / properties / trackables / items / properties / slotLevel / descriptionPrevious value: -"Spell-slot level of this pool (Pact Magic: one pool whose level rises with character level), stamped at build from the granting rule's uses[].slotLevel. The sheet shows it on the trackable row ('Level N'). Absent = an ordinary counter."New value: +"Spell-slot level of this pool, stamped at build from the granting rule's uses[].slotLevel. The sheet shows it on the trackable row ('Level N'). Absent = an ordinary counter."
- Changed
vault_create_item73 fields changed- changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / eligible / descriptionPrevious value: -"Pool to choose from. Empty / absent = any of the six."New value: +"Pool to choose from. Empty / absent = any ability in the schema's abilities list." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / descriptionPrevious value: -"Ceiling no chosen score may exceed after the bump (ASI = 20)."New value: +"Ceiling no chosen score may exceed after the bump. The rule authoring guide's abilityScoreBump section shows the values." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / abilityScoreSet / items / properties / value / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / armorCategory / descriptionPrevious value: -"Armor category ('Light', 'Medium', 'Heavy', 'Shield')."New value: +"Armor category, as the ruleset's catalog names it (vault_search_items shows them)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / equipSlots / descriptionPrevious value: -"Allowed equip slot ids (e.g. 'mainHand', 'offHand', 'body'). Vocabulary is ruleset-specific."New value: +"Allowed equip slot ids, from the ruleset's own slots (an existing item's equipSlots, via vault_get_item, shows them)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / mastery / descriptionPrevious value: -"5e24 weapon mastery name (e.g. 'Topple', 'Vex', 'Slow')."New value: +"Weapon mastery name, for rulesets whose weapons carry one, as the ruleset's catalog names it." - changed
Input schema / properties / maxDexModifier / descriptionPrevious value: -"Cap on DEX bonus from this armor (medium = 2; heavy = 0 typically)."New value: +"Cap on the DEX bonus this armor allows, from the item's source text." - changed
Input schema / properties / prerequisites / items / properties / abilities / descriptionPrevious value: -"For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+')."New value: +"For abilityScore: ANY listed ability meeting `min` satisfies." - changed
Input schema / properties / prerequisites / items / properties / proficiency / descriptionPrevious value: -"For proficiency: the proficiency name (e.g. 'Martial', 'Stealth')."New value: +"For proficiency: the proficiency name, as the ruleset names it." - changed
Input schema / properties / prerequisites / items / properties / proficiencyType / enumPrevious value: -[ - "skill", - "tool", - "weapon", - "armor", - "save", - "language" -]New value: +[ + "skill", + "tool", + "save", + "weapon", + "armor", + "language" +] - changed
Input schema / properties / prerequisites / items / properties / type / descriptionPrevious value: -"Predicate kind: level / abilityScore / rule / spell / proficiency / spellcasting. (A class is required via a `rule` predicate pointing at the class rule.)"New value: +"Predicate kind. (A class is required via a `rule` predicate pointing at the class rule.)" - changed
Input schema / properties / properties / items / properties / ammoType / descriptionPrevious value: -"Ammunition type for the Ammunition property (e.g. 'Arrow', 'Bolt')."New value: +"Ammunition type, for a property that uses ammunition." - changed
Input schema / properties / properties / items / properties / damage / descriptionPrevious value: -"Per-property damage dice override (e.g. Versatile's two-hand dice)."New value: +"Per-property damage dice override, for a property that changes the weapon's damage." - changed
Input schema / properties / properties / items / properties / name / descriptionPrevious value: -"Property identifier (e.g. 'Finesse', 'Versatile', 'Ammunition')."New value: +"Property identifier, as the ruleset's catalog names it (vault_search_items shows them)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / resistances / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-targeted resistances (Warding Aura's 10 ft.). Absent = self-only."New value: +"Aura radius in feet for ally/any-targeted resistances. Absent = self-only." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / weaponType / descriptionPrevious value: -"Weapon category ('Simple Melee', 'Martial Ranged', etc.)."New value: +"Weapon category, as the ruleset's catalog names it (vault_search_items shows them)."
- Changed
vault_create_rule73 fields changed- changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / eligible / descriptionPrevious value: -"Pool to choose from. Empty / absent = any of the six."New value: +"Pool to choose from. Empty / absent = any ability in the schema's abilities list." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / descriptionPrevious value: -"Ceiling no chosen score may exceed after the bump (ASI = 20)."New value: +"Ceiling no chosen score may exceed after the bump. The rule authoring guide's abilityScoreBump section shows the values." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / abilityScoreSet / items / properties / value / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / actionEconomy / descriptionPrevious value: -"What invoking the ability costs on a turn: 'Action', 'Bonus Action', or 'Reaction'. Distinct from the mechanics actionType (a kind-of-action label). Absent = the ability takes the action."New value: +"What invoking the ability costs on a turn. The rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the absent default. Distinct from the mechanics actionType (a kind-of-action label)." - added
Input schema / properties / actionEconomy / enumAdded value: +[ + "Action", + "Bonus Action", + "Reaction" +] - changed
Input schema / properties / actions / descriptionPrevious value: -"PF Playtest action-economy marker (F/1/2/3/R)."New value: +"Action-cost marker, for rulesets whose rules carry one; the value is the source text." - changed
Input schema / properties / casterProgression / descriptionPrevious value: -"How this class contributes to the combined multiclass spell-slot pool: full casters count every level, half/third round up, 'pact' (Pact Magic) keeps its own pool and never joins. Authorable on a base class or a subclass (a third-caster subclass carries it). Absent = non-caster."New value: +"How this class contributes to the combined multiclass spell-slot pool; the engine applies each progression's rule. Authorable on a base class or a subclass (a subclass that grants the casting carries it). Absent = non-caster." - changed
Input schema / properties / castingAbility / descriptionPrevious value: -"The ability this rule's spellcasting keys off ('Intelligence is your spellcasting ability for your Wizard spells'). Author it on a class's Spellcasting ability rule; vault's creation and level-up wizards write it to the character-wide Spellcasting Ability (first-wins, never overwriting), and a multiclass whose ability differs stamps its granted spells per-entry. Distinct from a spell block's castingAbility, which overrides per grant. Absent = the rule says nothing about the character's casting ability."New value: +"The ability this rule's spellcasting keys off. Author it on a class's Spellcasting ability rule; vault's creation and level-up wizards write it to the character-wide Spellcasting Ability (first-wins, never overwriting), and a multiclass whose ability differs stamps its granted spells per-entry. Distinct from a spell block's castingAbility, which overrides per grant. Absent = the rule says nothing about the character's casting ability." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / prerequisites / items / properties / abilities / descriptionPrevious value: -"For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+')."New value: +"For abilityScore: ANY listed ability meeting `min` satisfies." - changed
Input schema / properties / prerequisites / items / properties / proficiency / descriptionPrevious value: -"For proficiency: the proficiency name (e.g. 'Martial', 'Stealth')."New value: +"For proficiency: the proficiency name, as the ruleset names it." - changed
Input schema / properties / prerequisites / items / properties / proficiencyType / enumPrevious value: -[ - "skill", - "tool", - "weapon", - "armor", - "save", - "language" -]New value: +[ + "skill", + "tool", + "save", + "weapon", + "armor", + "language" +] - changed
Input schema / properties / prerequisites / items / properties / type / descriptionPrevious value: -"Predicate kind: level / abilityScore / rule / spell / proficiency / spellcasting. (A class is required via a `rule` predicate pointing at the class rule.)"New value: +"Predicate kind. (A class is required via a `rule` predicate pointing at the class rule.)" - changed
Input schema / properties / range / descriptionPrevious value: -"How far the ability reaches when invoked — self, touch, or ranged with a distance ('feet' default, 'miles' for long reaches). Absent = runtime defaults (self-heals on the user, targeted abilities at touch)."New value: +"How far the ability reaches when invoked: `kind`, plus `distance` and its `unit` for a kind that takes a distance. Absent: the rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the default." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / repeatable / descriptionPrevious value: -"A rule that may be taken/granted more than once, each time as a distinct instance with its own sub-choices — a repeatable Feat (Skilled, Resilient), or a class's Ability Score Improvement ability, which its class grants at several levels."New value: +"A rule that may be taken/granted more than once, each time as a distinct instance with its own sub-choices — a repeatable feat, or a class ability its class grants at several levels." - changed
Input schema / properties / resistances / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-targeted resistances (Warding Aura's 10 ft.). Absent = self-only."New value: +"Aura radius in feet for ally/any-targeted resistances. Absent = self-only." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds', 'Universal')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / type / enumPrevious value: -[ - "Ability", - "Feat", - "Action Card", - "Hindrance", - "Edge", - "Class", - "Background", - "Race", - "Species", - "Ancestry", - "Glossary", - "Stunt", - "Extra" -]New value: +[ + "Ability", + "Feat", + "Glossary", + "Action Card", + "Hindrance", + "Edge", + "Class", + "Background", + "Race", + "Species", + "Ancestry", + "Stunt", + "Extra" +]
- Changed
vault_create_spell80 fields changed- changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / eligible / descriptionPrevious value: -"Pool to choose from. Empty / absent = any of the six."New value: +"Pool to choose from. Empty / absent = any ability in the schema's abilities list." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / descriptionPrevious value: -"Ceiling no chosen score may exceed after the bump (ASI = 20)."New value: +"Ceiling no chosen score may exceed after the bump. The rule authoring guide's abilityScoreBump section shows the values." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / abilityScoreSet / items / properties / value / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / actions / descriptionPrevious value: -"PF Playtest action-economy marker (F/1/2/3/R)."New value: +"Action-cost marker, for rulesets whose spells carry one; the value is the source text." - changed
Input schema / properties / area / descriptionPrevious value: -"Area of effect. shape ∈ cone|cube|cylinder|emanation|line|sphere; size (ft); width for line."New value: +"Area of effect. `shape`; `size` (ft); `width` for a line." - changed
Input schema / properties / castingTime / descriptionPrevious value: -"Casting time. unit ∈ action|bonusAction|reaction|minute|hour; count for minute/hour."New value: +"Casting time. `unit`, plus `count` for a timed unit." - changed
Input schema / properties / classes / descriptionPrevious value: -"Class-membership list for non-5.5e rulesets (e.g. PFRPG); 5.5e spells use `categories` instead. Free-form per ruleset."New value: +"Class-membership list for rulesets whose spells do not use `categories` (the spell authoring guide covers `categories`). Free-form per ruleset." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / duration / descriptionPrevious value: -"Spell duration. unit ∈ instantaneous | round | minute | hour | day | untilDispelled | untilDispelledOrTriggered | special; count for timed units; concentration flag; upTo flag for a non-concentration capped duration (\"Up to 1 minute\")."New value: +"Spell duration. `unit`; `count` for a timed unit; concentration flag; upTo flag for a non-concentration capped duration (\"Up to 1 minute\")." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / higherLevel / descriptionPrevious value: -"Higher-Level / cantrip-scaling text (what changes when cast with a higher slot)."New value: +"Scaling text: what changes when the spell is cast at a higher level or scales with the caster, source text." - changed
Input schema / properties / level / descriptionPrevious value: -"Spell level. 0 for cantrips; 1–9 for leveled spells (5e/5e24)."New value: +"Spell level, within the schema's range. The spell authoring guide gives the convention." - changed
Input schema / properties / level / maximumPrevious value: -9007199254740991New value: +9 - changed
Input schema / properties / level / minimumPrevious value: --9007199254740991New value: +0 - changed
Input schema / properties / prerequisites / items / properties / abilities / descriptionPrevious value: -"For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+')."New value: +"For abilityScore: ANY listed ability meeting `min` satisfies." - changed
Input schema / properties / prerequisites / items / properties / proficiency / descriptionPrevious value: -"For proficiency: the proficiency name (e.g. 'Martial', 'Stealth')."New value: +"For proficiency: the proficiency name, as the ruleset names it." - changed
Input schema / properties / prerequisites / items / properties / proficiencyType / enumPrevious value: -[ - "skill", - "tool", - "weapon", - "armor", - "save", - "language" -]New value: +[ + "skill", + "tool", + "save", + "weapon", + "armor", + "language" +] - changed
Input schema / properties / prerequisites / items / properties / type / descriptionPrevious value: -"Predicate kind: level / abilityScore / rule / spell / proficiency / spellcasting. (A class is required via a `rule` predicate pointing at the class rule.)"New value: +"Predicate kind. (A class is required via a `rule` predicate pointing at the class rule.)" - changed
Input schema / properties / range / descriptionPrevious value: -"Range. kind ∈ self|touch|ranged|sight|unlimited|special; distance for ranged; unit ∈ feet|miles (default feet)."New value: +"Range. `kind`; `distance` and its `unit` for a ranged spell (absent unit = feet)." - changed
Input schema / properties / rank / descriptionPrevious value: -"PFRPG2 rank field. Free-form."New value: +"Rank, for rulesets whose spells carry one. Free-form." - changed
Input schema / properties / reactionTrigger / descriptionPrevious value: -"When castingTime.unit is 'reaction', the trigger text ('which you take when…')."New value: +"For a casting time taken in response to a trigger, the trigger text, source text." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / resistances / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-targeted resistances (Warding Aura's 10 ft.). Absent = self-only."New value: +"Aura radius in feet for ally/any-targeted resistances. Absent = self-only." - changed
Input schema / properties / ritual / descriptionPrevious value: -"5.5e ritual tag — the spell can be cast as a ritual (no spell slot)."New value: +"Ritual tag: the spell can be cast as a ritual." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / school / descriptionPrevious value: -"Spell school (Abjuration, Conjuration, Divination, Enchantment, Evocation, Illusion, Necromancy, Transmutation)."New value: +"Spell school name." - changed
Input schema / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / type / descriptionPrevious value: -"Spell type. 5e / 5e24 use 'Spell'; Savage Worlds uses 'Power'. Required at create."New value: +"Spell type (the ruleset's name for a spell). Required at create."
- Changed
vault_get_authoring_guide2 fields changed- changed
Input schema / properties / entityType / descriptionPrevious value: -"Entity the guide covers. Published for 5e24: 'monster', 'rule' (classes / species / backgrounds / feats / abilities), and 'spell'. Other entity types and rulesets land as separate guides over time. Lowercase."New value: +"Entity the guide covers: 'monster', 'rule' (classes / species / backgrounds / feats / abilities), or 'spell'. Lowercase. A ruleset / entity pair with no published guide returns not found." - changed
Input schema / properties / rulesetCode / descriptionPrevious value: -"Ruleset data value (e.g. '5th Edition', '5e24', 'PFRPG', 'PFRPG2', 'PF Playtest', 'Savage Worlds', 'Savage Embers', 'Solarian Conflict', 'Embers RPG'). Use the data value, not the display label."New value: +"Ruleset code, from list_rulesets. Use the code, not the display label."
- Changed
vault_get_levelup_options1 field changed- changed
Input schema / properties / classRuleId / descriptionPrevious value: -"Omit for the CHOOSER (the character's class entries with their stored levels, the multiclass candidates with warn-only prerequisite warnings, the XP floor for the next level, atMaxLevel). Supply a base Class rule `_id` — one of the chooser's `classEntries[].classRuleId` to advance a held class, or a `multiclassOptions[]._id` to enter a new class at level 1 — for the TARGET PLAN: `features[]` / `subclassFeatures[]` / `growth[]` (each feature in the creation option shape with its open choice blocks: `choice` {label,count,options}, spellChoices (each block carries `prepared` — true = its spells land always-prepared and are EXCLUDED from the preparedSpellPicks pool), spellListChoices (same `prepared` flag), preparedSpells, proficiencyChoices, abilityScoreBump; `growth[]` entries are already-held rules whose counts grew this level — their `count`s are DELTAS, \"pick N more\"), `multiclassGrants` (when entering a new class), `hitPoints` {hitDie, average, conModifier}, `prerequisiteWarnings[]` (warn-only), `spellSlots` (the combined multiclass pool preview, null unless 2+ contributing casters), `openPickCount`, and `xp` {current, minimumForNewTotal}. ruleChoice pools arrive PREREQUISITE-FILTERED (an unqualified pick is also rejected on apply)."New value: +"Omit for the CHOOSER (the character's class entries with their stored levels, the multiclass candidates with warn-only prerequisite warnings, the XP floor for the next level, atMaxLevel). Supply a base Class rule `_id` — one of the chooser's `classEntries[].classRuleId` to advance a held class, or a `multiclassOptions[]._id` to enter a new class — for the TARGET PLAN: `features[]` / `subclassFeatures[]` / `growth[]` (each feature in the creation option shape with its open choice blocks: `choice` {label,count,options}, spellChoices (each block carries `prepared` — true = its spells land always-prepared and are EXCLUDED from the preparedSpellPicks pool), spellListChoices (same `prepared` flag), preparedSpells, proficiencyChoices, abilityScoreBump; `growth[]` entries are already-held rules whose counts grew this level — their `count`s are DELTAS, \"pick N more\"), `multiclassGrants` (when entering a new class), `hitPoints` {hitDie, average, conModifier}, `prerequisiteWarnings[]` (warn-only), `spellSlots` (the combined multiclass pool preview, null when the plan has no combined pool), `openPickCount`, and `xp` {current, minimumForNewTotal}. ruleChoice pools arrive PREREQUISITE-FILTERED (an unqualified pick is also rejected on apply)."
- Changed
vault_get_pc_creation_options2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"Which 5e24 creation list to read. 'class' / 'species' / 'background' / 'feat' return the option projections (the user's own + stock content they may pick, with each option's nested choices — skillChoices, toolChoices, startingEquipmentOptions, and per applied ability/feat: proficiencyChoices {types,count,options}, spellChoices {count,options,prepared}, spellListChoices {categories,picks[].optionsByCategory,prepared}, preparedSpells {count} (a block's `prepared: true` = its spells land always-prepared and are EXCLUDED from the preparedSpellPicks pool), abilityScoreBump {options[].lines[]:{amount,count,eligible,max}} (supply the player's pick via `vault_build_pc.abilityBumpPicks`), and `choice` {count,options} where each option carries a `type`. The spellChoices / spellListChoices arrays are INDEX-ALIGNED with the authored blocks — a null entry holds the position of a block that grants nothing at level 1; skip it when rendering but count it when keying picks. A 'background' option ALSO carries its own `skillChoices {count,options}` (a background skill-choice grant → supply picks via `vault_build_pc.backgroundSkillProficiencies`) and `languages {fixed, choose:{count,options}}`; a 'species' option carries `languages {fixed, choose}`. For a `languages.choose` grant, supply the picks via `vault_build_pc.languageChoicePicks` keyed by that rule's `_id`; `languages.fixed` apply automatically). 'feat' returns EVERY feat (the background slot uses Origin-category feats; a feat picked via an ability's `choice` may be any) — a picked feat carries its own proficiency/spell sub-choices. Each 'feat' option carries `repeatable`; a `repeatable` feat filling the background slot keys its `vault_build_pc` picks with a `bg:` prefix. 'constants' returns the static reference data (skill list, ability-score methods and their arrays/point-buy costs, language options, alignments, background bump modes, max ability score, and originFeatCategory — the feat category the background's open feat slot is restricted to; filter the 'feat' list to it for the background pick). Read 'constants' plus 'class' first; read 'species'/'background'/'feat' as the build takes shape."New value: +"Which creation list to read. 'class' / 'species' / 'background' / 'feat' return the option projections (the user's own + stock content they may pick, with each option's nested choices — skillChoices, toolChoices, startingEquipmentOptions, and per applied ability/feat: proficiencyChoices {types,count,options}, spellChoices {count,options,prepared}, spellListChoices {categories,picks[].optionsByCategory,prepared}, preparedSpells {count} (a block's `prepared: true` = its spells land always-prepared and are EXCLUDED from the preparedSpellPicks pool), abilityScoreBump {options[].lines[]:{amount,count,eligible,max}} (supply the player's pick via `vault_build_pc.abilityBumpPicks`), and `choice` {count,options} where each option carries a `type`. The spellChoices / spellListChoices arrays are INDEX-ALIGNED with the authored blocks — a null entry holds the position of a block that grants nothing at the starting level; skip it when rendering but count it when keying picks. A 'background' option ALSO carries its own `skillChoices {count,options}` (a background skill-choice grant → supply picks via `vault_build_pc.backgroundSkillProficiencies`) and `languages {fixed, choose:{count,options}}`; a 'species' option carries `languages {fixed, choose}`. For a `languages.choose` grant, supply the picks via `vault_build_pc.languageChoicePicks` keyed by that rule's `_id`; `languages.fixed` apply automatically). 'feat' returns EVERY feat (the background slot uses the `originFeatCategory` feats; a feat picked via an ability's `choice` may be any) — a picked feat carries its own proficiency/spell sub-choices. Each 'feat' option carries `repeatable`; a `repeatable` feat filling the background slot keys its `vault_build_pc` picks with a `bg:` prefix. 'constants' returns the static reference data (skill list, ability-score methods and each method's data, language options, alignments, background bump modes, max ability score, and originFeatCategory — the feat category the background's open feat slot is restricted to; filter the 'feat' list to it for the background pick). Read 'constants' plus 'class' first; read 'species'/'background'/'feat' as the build takes shape." - added
Input schema / properties / rulesetAdded value: +{ + "description": "A ruleset with guided character creation. Send the same ruleset to `vault_build_pc`.", + "enum": [ + "5e24" + ], + "type": "string" +}
- Changed
vault_level_up_pc6 fields changed- changed
Input schema / properties / abilityBumpPicks / descriptionPrevious value: -"Ability-score-increase picks for a gained rule carrying an `abilityScoreBump` (the ASI feat picked at level 4+): `{ option, lines }` keyed by the granting rule's `_id`, same shape as `vault_build_pc`. A Constitution increase raises HP retroactively for every level already held."New value: +"Ability-score-increase picks for a gained rule carrying an `abilityScoreBump`: `{ option, lines }` keyed by the granting rule's `_id`, same shape as `vault_build_pc`. The engine applies whatever the increase changes elsewhere on the sheet." - changed
Input schema / properties / abilityChoices / descriptionPrevious value: -"ruleChoice picks, keyed by the OWNING rule's `_id`: a gained feature's choice (a Fighting Style; the class's subclass-choice ability at level 3 — value = the picked subclass `_id`; an ASI ability — value = the picked feat `_id`) AND a grown held rule's choice (`growth[]` entries, e.g. new invocations — supply the NEW picks only, the delta count). A picked option's own sub-choices (a feat's skill picks, its abilityScoreBump) go in the other maps keyed by the picked option's `_id`, exactly as in `vault_build_pc`. Pools are prerequisite-filtered; an unqualified pick rejects the draft."New value: +"ruleChoice picks, keyed by the OWNING rule's `_id`: a gained feature's choice (the class's subclass-choice ability — value = the picked subclass `_id`; a choice among feats — value = the picked feat `_id`) AND a grown held rule's choice (`growth[]` entries — supply the NEW picks only, the delta count). A picked option's own sub-choices (a feat's skill picks, its abilityScoreBump) go in the other maps keyed by the picked option's `_id`, exactly as in `vault_build_pc`. Pools are prerequisite-filtered; an unqualified pick rejects the draft." - changed
Input schema / properties / classRuleId / descriptionPrevious value: -"Required. The base Class rule to advance one level — a held class entry (its stored level bumps) or a class the character doesn't hold yet (multiclass: a second class entry is stamped at level 1). From the chooser's `classEntries[].classRuleId` / `multiclassOptions[]._id`."New value: +"Required. The base Class rule to advance one level — a held class entry (its stored level bumps) or a class the character doesn't hold yet (multiclass: a new class entry is stamped). From the chooser's `classEntries[].classRuleId` / `multiclassOptions[]._id`." - changed
Input schema / properties / hitPoints / descriptionPrevious value: -"How the level's hit points are gained: `{method:'average'}` takes the fixed average (the plan's `hitPoints.average`); `{method:'roll', value}` records a die the PLAYER rolled — value must be 1..the class's hit die. The Constitution modifier is added server-side either way."New value: +"How the level's hit points are gained: `method` is one of the schema's methods (the plan's `hitPoints` fields carry what each one uses); `value` is a die the PLAYER rolled, for a method that takes one." - changed
Input schema / properties / proficiencyChoicePicks / descriptionPrevious value: -"Picks for proficiencyChoices grants on gained/grown rules, keyed `\"<ruleId>:<grantIndex>\"` — same keying and rules as `vault_build_pc`. Grown grants demand only the DELTA count the plan surfaced. An EXPERTISE grant's pool is the character's proficient skills MINUS those that already carry Expertise (narrowed to the grant's own options for mode 'specific'); when that pool is at/below the count, vault auto-grants and expects NO picks."New value: +"Picks for proficiencyChoices grants on gained/grown rules, keyed `\"<ruleId>:<grantIndex>\"` — same keying and rules as `vault_build_pc`. Grown grants demand only the DELTA count the plan surfaced. An EXPERTISE grant picks from the pool the rule authoring guide describes (vault_get_authoring_guide, entityType .rule., proficiencyChoices); vault rejects picks that do not fit." - changed
Input schema / properties / spellListChoicePicks / descriptionPrevious value: -"Picks for a NEWLY gained rule's spellListChoices (the Magic Initiate shape) — `{ category, picks, castingAbility? }` keyed `\"<ruleId>:<blockIndex>\"`, exactly as in `vault_build_pc`."New value: +"Picks for a NEWLY gained rule's spellListChoices — `{ category, picks, castingAbility? }` keyed `\"<ruleId>:<blockIndex>\"`, exactly as in `vault_build_pc`."
- Changed
vault_search_characters1 field changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds', 'Universal')."New value: +"Ruleset code, from list_rulesets."
- Changed
vault_search_items2 fields changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds', 'Universal')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / type / descriptionPrevious value: -"Item type (substring, case-insensitive). Vault item types are ruleset-specific strings. Common 5e / 5e24 examples: 'Weapon', 'Armor', 'Tool', 'Adventuring Gear', 'Wondrous Item'."New value: +"Item type (substring, case-insensitive). Vault item types are ruleset-specific strings; an unfiltered search shows the types a ruleset's catalog uses."
- Changed
vault_search_monsters1 field changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds', 'Universal')."New value: +"Ruleset code, from list_rulesets."
- Changed
vault_search_rules2 fields changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds', 'Universal')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / type / enumPrevious value: -[ - "Ability", - "Feat", - "Action Card", - "Hindrance", - "Edge", - "Class", - "Background", - "Race", - "Species", - "Ancestry", - "Glossary", - "Stunt", - "Extra" -]New value: +[ + "Ability", + "Feat", + "Glossary", + "Action Card", + "Hindrance", + "Edge", + "Class", + "Background", + "Race", + "Species", + "Ancestry", + "Stunt", + "Extra" +]
- Changed
vault_search_spells2 fields changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds', 'Universal')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / type / descriptionPrevious value: -"Spell type. 5e / 5e24 use 'Spell'; Savage Worlds uses 'Power'."New value: +"Spell type (the ruleset's name for a spell)."
- Changed
vault_spawn_linked_character1 field changed- changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code for the new linked sheet (e.g. '5th Edition', '5e24', 'Fate Core'). Required. Must differ from the source's ruleset; restricted rulesets require an entitlement grant (vault answers 403). Check list_rulesets for the codes this account can use."New value: +"Ruleset code for the new linked sheet, from list_rulesets (the codes this account can use). Required. Must differ from the source's ruleset; restricted rulesets require an entitlement grant (vault answers 403)."
- Changed
vault_update_character46 fields changed- changed
Input schema / properties / actions / items / properties / actions / descriptionPrevious value: -"PF Playtest action-economy marker (F/1/2/3/R)."New value: +"Action-cost marker, for rulesets whose actions carry one; the value is the source text." - changed
Input schema / properties / actions / items / properties / attack / properties / attribute / descriptionPrevious value: -"Ability driving the to-hit roll (e.g. 'strength', 'charisma' for spell attacks)."New value: +"Ability driving the to-hit roll." - changed
Input schema / properties / actions / items / properties / rof / descriptionPrevious value: -"Savage Worlds Rate of Fire."New value: +"Rate of fire, for rulesets whose actions carry one." - changed
Input schema / properties / actions / items / properties / type / descriptionPrevious value: -"Action type. 5e24 uses 'Melee' / 'Range' / 'Special' / 'Reaction' / 'Legendary' / 'Bonus'."New value: +"Action type, as the ruleset's sheet names it." - changed
Input schema / properties / aspects / items / properties / kind / descriptionPrevious value: -"One of 'high concept', 'trouble', 'character', 'consequence'."New value: +"The aspect's kind. The values are the ones the ruleset's sheet template uses; read a character of that ruleset (vault_get_character) to see them." - changed
Input schema / properties / aspects / items / properties / shifts / descriptionPrevious value: -"Consequence/condition slots only: harm absorbed. Fate: 2 Mild, 4 Moderate, 6 Severe, 8 Extreme (Fate Accelerated omits Extreme). Demon Hunters conditions: 5 Mild, 10 Moderate, 15 Severe."New value: +"Consequence/condition slots only: the harm the slot absorbs, as the ruleset's sheet template sets it per slot." - changed
Input schema / properties / attributes / items / properties / misc / descriptionPrevious value: -"Misc bonus on the save (5e/5e24). Used for high-PB monster compensation."New value: +"Misc bonus on the save. The monster authoring guide covers when a monster uses it." - changed
Input schema / properties / attributes / items / properties / name / descriptionPrevious value: -"Ability name: strength / dexterity / constitution / intelligence / wisdom / charisma. Lowercase."New value: +"Ability id, lowercase (a value from the abilities list the typed tools' schemas carry)." - changed
Input schema / properties / attributes / items / properties / proficient / descriptionPrevious value: -"Save proficiency flag (5e/5e24). When true, PB is added to the save."New value: +"Save proficiency flag. The sheet applies it to the save total." - changed
Input schema / properties / attributes / items / properties / score / descriptionPrevious value: -"Raw ability score (e.g. 17). Modifier is derived by the sheet."New value: +"Raw ability score. Modifier is derived by the sheet." - changed
Input schema / properties / core / properties / race / descriptionPrevious value: -"Creature type for monsters (e.g. 'Elemental', 'Humanoid', 'Dragon (Chromatic)'); race for PCs."New value: +"Creature type for monsters (source text); race for PCs." - changed
Input schema / properties / core / properties / refresh / descriptionPrevious value: -"Session-start resource: fate points (Fate — Refresh) or faith dice (Demon Hunters — Devotion). The total the character resets to at the start of a session."New value: +"Session-start resource: the total the character resets to at the start of a session. The sheet template of the character's ruleset labels it." - changed
Input schema / properties / core / properties / size / descriptionPrevious value: -"Creature size. Exact source text including 'or' for variable sizes ('Medium or Small')."New value: +"Creature size. Exact source text including 'or' for variable sizes ('X or Y')." - changed
Input schema / properties / defense / properties / armorClass / descriptionPrevious value: -"Layered AC rows the sheet sums. IMPORTANT (5e24): when the character's `settings.autoPassiveBonuses` is true — the default for new 5e24 characters — the `armor` and `shield` rows are DERIVED from equipped items and recomputed on every sheet load, so writing them here gets overwritten. Change AC by setting `equipped: true/false` on the character's armor/shield items instead. When the toggle is false (and on all other rulesets), these rows are manually authored and writing them here is correct. `magic` and `misc` are manual in both modes. Check the toggle with vault_get_character before writing."New value: +"Layered AC rows the sheet sums. IMPORTANT: when the character's `settings.autoPassiveBonuses` is true — the default for new characters in rulesets with sheet automation — the `armor` and `shield` rows are DERIVED from equipped items and recomputed on every sheet load, so writing them here gets overwritten. Change AC by setting `equipped: true/false` on the character's armor/shield items instead. When the toggle is false (and on rulesets without sheet automation), these rows are manually authored and writing them here is correct. `magic` and `misc` are manual in both modes. Check the toggle with vault_get_character before writing." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / bonus / descriptionPrevious value: -"Base AC value the sheet adds DEX to. See the 5e24 monster guide Rule 1 for the math."New value: +"Base AC value the sheet builds the total from. The monster authoring guide's Rule 1 gives the math." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / description / descriptionPrevious value: -"Armor name ('Natural Armor', 'Chain Shirt') or null when AC derives from DEX only."New value: +"Armor name, source text, or null when no armor applies." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / heavy / descriptionPrevious value: -"True suppresses DEX contribution entirely (heavy armor)."New value: +"True for heavy armor; the engine applies that armor weight's rule to the total." - changed
Input schema / properties / defense / properties / armorClass / properties / armor / properties / medium / descriptionPrevious value: -"True caps DEX contribution to +2 (medium armor)."New value: +"True for medium armor; the engine applies that armor weight's rule to the total." - changed
Input schema / properties / defense / properties / exhaustion / descriptionPrevious value: -"5e24 Exhaustion level (0-6). Absent = 0 (not exhausted). Each level is -2 to d20 Tests and -5 ft Speed; level 6 = death. A Long Rest via the vault rest control reduces it by 1."New value: +"Exhaustion level, within the schema's range. Absent = not exhausted. The engine applies its effects and reduces it on a rest taken through the vault rest control." - changed
Input schema / properties / defense / properties / hitDice / properties / current / descriptionPrevious value: -"Unspent hit dice count. When `pools` is present (5e24 class characters), this is the derived sum of pool currents — keep it consistent with pools on write."New value: +"Unspent hit dice count. When `pools` is present, this is the derived sum of pool currents — keep it consistent with pools on write." - changed
Input schema / properties / defense / properties / hitDice / properties / dice / descriptionPrevious value: -"Without `pools` (monsters, non-5e24): per-die expression, NOT the multiplied total — size-mapped Tiny d4 / Small d6 / Medium d8 / Large d10 / Huge d12 / Gargantuan d20, see monster guide Rule 20. When `pools` is present (5e24 class characters): the derived compound string ('5d10 + 5d6') — keep it consistent with pools on write."New value: +"Without `pools` (monsters, and sheets without pools): one die expression ('1dX'), NOT the multiplied total; the monster guide's Rule 20 gives a monster's die. When `pools` is present: the derived compound string, one 'NdX' term per pool joined by ' + ' — keep it consistent with pools on write." - changed
Input schema / properties / defense / properties / hitDice / properties / pools / descriptionPrevious value: -"5e24 per-die-size Hit Dice pools — the AUTHORITATIVE representation (one entry per die size a multiclass character has). Maintained by creation, level-up, and a one-shot backfill; player edits win. The server does NOT re-derive the legacy fields on write, so when writing hit dice for a character with pools, write pools AND the legacy current/dice consistently (current = sum of pool currents; dice = compound string)."New value: +"Per-die-size Hit Dice pools, present on class characters the creation and level-up tools maintain — the AUTHORITATIVE representation (one entry per die size a multiclass character has). Maintained by creation, level-up, and a one-shot backfill; player edits win. The server does NOT re-derive the legacy fields on write, so when writing hit dice for a character with pools, write pools AND the legacy current/dice consistently (current = sum of pool currents; dice = compound string)." - changed
Input schema / properties / defense / properties / hitDice / properties / pools / items / properties / dice / descriptionPrevious value: -"Die size of this pool, e.g. 'd10'."New value: +"Die size of this pool." - changed
Input schema / properties / items / items / properties / sourceSpell / descriptionPrevious value: -"Auto-managed. Link to the spell that manufactured this companion armor item (e.g. Mage Armor, which the vault sheet offers as an equippable Light armor). The sheet sets and maintains it; if it's present on an item you're editing, preserve it verbatim, and never set, change, or invent it. Dropping it on a round-trip de-links the companion and leaves a duplicate item on the sheet."New value: +"Auto-managed. Link to the spell that manufactured this companion armor item (a spell the vault sheet offers as equippable armor). The sheet sets and maintains it; if it's present on an item you're editing, preserve it verbatim, and never set, change, or invent it. Dropping it on a round-trip de-links the companion and leaves a duplicate item on the sheet." - changed
Input schema / properties / offense / properties / initiative / properties / attribute / descriptionPrevious value: -"Ability whose modifier drives initiative. Typically 'dexterity'."New value: +"Ability whose modifier drives initiative, lowercase." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / rules / items / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / rules / items / properties / type / descriptionPrevious value: -"Rule type (Ability / Feat / Class / Background / etc.). Vault validates against its rulestype enum on save."New value: +"Rule type. Vault validates it on save." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds'). Restricted rulesets require an entitlement grant on the account — vault answers 403 for ungranted or unknown codes. Check list_rulesets for the codes this account can use."New value: +"Ruleset code, from list_rulesets (the codes this account can use). Restricted rulesets require an entitlement grant on the account — vault answers 403 for ungranted or unknown codes." - changed
Input schema / properties / settings / properties / autoPassiveBonuses / descriptionPrevious value: -"When true, the per-character rules engine layer contributes statBonuses from rules / items / feats. On 5e24 it ALSO derives the armor/shield rows of defense.armorClass from equipped items, recomputed on every sheet load — manual writes to those rows do not stick while this is true. Monsters should set this to false."New value: +"When true, the per-character rules engine layer contributes statBonuses from rules / items / feats. On rulesets with sheet automation it ALSO derives the armor/shield rows of defense.armorClass from equipped items, recomputed on every sheet load — manual writes to those rows do not stick while this is true. Monsters should set this to false." - changed
Input schema / properties / settings / properties / hiddenSections / descriptionPrevious value: -"Sheet-section keys the player chose to hide while the section is empty ('spells', 'abilities', 'feats', 'origin', 'actionCards', 'hindrances', 'edges', 'stunts', 'extras'). A section with content always renders regardless of this list — the preference means 'hide when empty', never 'hide my data'."New value: +"Keys of the character sheet's sections the player chose to hide while the section is empty. A section with content always renders regardless of this list — the preference means 'hide when empty', never 'hide my data'." - changed
Input schema / properties / skills / items / properties / rating / descriptionPrevious value: -"Fate: ladder position, -2 (Terrible) to +8 (Legendary); also an FAE approach's rating. Demon Hunters: the trait's die size (4, 6, 8, 10, or 12), or 0 for an unrated Fringe discipline."New value: +"The rating, on the ruleset's own scale. The ruleset's sheet template sets it; read a character of that ruleset (vault_get_character) to see the values." - changed
Input schema / properties / spells / items / properties / recovery / descriptionPrevious value: -"Per-rest recovery rows for a finite free-cast counter, stamped from the granting rule's freeCast.recovery whenever the counter is created or grown (creation build and level-up). The vault rest control refills the counter from these when the player declares a Short/Long rest. Absent = the counter doesn't refresh on rest."New value: +"Per-rest recovery rows for a finite free-cast counter, stamped from the granting rule's freeCast.recovery whenever the counter is created or grown (creation build and level-up). The vault rest control refills the counter from these when the player declares the rest a row's `on` field names. Absent = the counter doesn't refresh on rest." - changed
Input schema / properties / stress / items / properties / name / descriptionPrevious value: -"Track name — 'Physical Stress' / 'Mental Stress' in Fate Core, 'Stress' in Fate Accelerated."New value: +"Track name, as the ruleset's sheet template names its tracks." - changed
Input schema / properties / trackables / items / properties / slotLevel / descriptionPrevious value: -"Spell-slot level of this pool (Pact Magic: one pool whose level rises with character level), stamped at build from the granting rule's uses[].slotLevel. The sheet shows it on the trackable row ('Level N'). Absent = an ordinary counter."New value: +"Spell-slot level of this pool, stamped at build from the granting rule's uses[].slotLevel. The sheet shows it on the trackable row ('Level N'). Absent = an ordinary counter."
- Changed
vault_update_companion_state2 fields changed- changed
Input schema / properties / state / properties / exhaustion / descriptionPrevious value: -"5e24 Exhaustion level (0-6) tracked locally for the buddy."New value: +"Exhaustion level, within the schema's range, tracked locally for the buddy." - changed
Input schema / properties / state / properties / hitDice / properties / pools / items / properties / dice / descriptionPrevious value: -"Die size of this pool, e.g. 'd10'. Must match a pool on the source character."New value: +"Die size of this pool. Must match a pool on the source character."
- Changed
vault_update_item74 fields changed- changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / eligible / descriptionPrevious value: -"Pool to choose from. Empty / absent = any of the six."New value: +"Pool to choose from. Empty / absent = any ability in the schema's abilities list." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / descriptionPrevious value: -"Ceiling no chosen score may exceed after the bump (ASI = 20)."New value: +"Ceiling no chosen score may exceed after the bump. The rule authoring guide's abilityScoreBump section shows the values." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / abilityScoreSet / items / properties / value / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / armorCategory / descriptionPrevious value: -"Armor category ('Light', 'Medium', 'Heavy', 'Shield')."New value: +"Armor category, as the ruleset's catalog names it (vault_search_items shows them)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / equipSlots / descriptionPrevious value: -"Allowed equip slot ids (e.g. 'mainHand', 'offHand', 'body'). Vocabulary is ruleset-specific."New value: +"Allowed equip slot ids, from the ruleset's own slots (an existing item's equipSlots, via vault_get_item, shows them)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / mastery / descriptionPrevious value: -"5e24 weapon mastery name (e.g. 'Topple', 'Vex', 'Slow')."New value: +"Weapon mastery name, for rulesets whose weapons carry one, as the ruleset's catalog names it." - changed
Input schema / properties / maxDexModifier / descriptionPrevious value: -"Cap on DEX bonus from this armor (medium = 2; heavy = 0 typically)."New value: +"Cap on the DEX bonus this armor allows, from the item's source text." - changed
Input schema / properties / prerequisites / items / properties / abilities / descriptionPrevious value: -"For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+')."New value: +"For abilityScore: ANY listed ability meeting `min` satisfies." - changed
Input schema / properties / prerequisites / items / properties / proficiency / descriptionPrevious value: -"For proficiency: the proficiency name (e.g. 'Martial', 'Stealth')."New value: +"For proficiency: the proficiency name, as the ruleset names it." - changed
Input schema / properties / prerequisites / items / properties / proficiencyType / enumPrevious value: -[ - "skill", - "tool", - "weapon", - "armor", - "save", - "language" -]New value: +[ + "skill", + "tool", + "save", + "weapon", + "armor", + "language" +] - changed
Input schema / properties / prerequisites / items / properties / type / descriptionPrevious value: -"Predicate kind: level / abilityScore / rule / spell / proficiency / spellcasting. (A class is required via a `rule` predicate pointing at the class rule.)"New value: +"Predicate kind. (A class is required via a `rule` predicate pointing at the class rule.)" - changed
Input schema / properties / properties / items / properties / ammoType / descriptionPrevious value: -"Ammunition type for the Ammunition property (e.g. 'Arrow', 'Bolt')."New value: +"Ammunition type, for a property that uses ammunition." - changed
Input schema / properties / properties / items / properties / damage / descriptionPrevious value: -"Per-property damage dice override (e.g. Versatile's two-hand dice)."New value: +"Per-property damage dice override, for a property that changes the weapon's damage." - changed
Input schema / properties / properties / items / properties / name / descriptionPrevious value: -"Property identifier (e.g. 'Finesse', 'Versatile', 'Ammunition')."New value: +"Property identifier, as the ruleset's catalog names it (vault_search_items shows them)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / resistances / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-targeted resistances (Warding Aura's 10 ft.). Absent = self-only."New value: +"Aura radius in feet for ally/any-targeted resistances. Absent = self-only." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / type / descriptionPrevious value: -"Item type. Free-form per ruleset (Weapon, Armor, Tool, Adventuring Gear, Wondrous Item, etc.). Required at create."New value: +"Item type. Free-form per ruleset; match the types the ruleset's catalog uses (vault_search_items shows them). Required at create." - changed
Input schema / properties / weaponType / descriptionPrevious value: -"Weapon category ('Simple Melee', 'Martial Ranged', etc.)."New value: +"Weapon category, as the ruleset's catalog names it (vault_search_items shows them)."
- Changed
vault_update_rule73 fields changed- changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / eligible / descriptionPrevious value: -"Pool to choose from. Empty / absent = any of the six."New value: +"Pool to choose from. Empty / absent = any ability in the schema's abilities list." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / descriptionPrevious value: -"Ceiling no chosen score may exceed after the bump (ASI = 20)."New value: +"Ceiling no chosen score may exceed after the bump. The rule authoring guide's abilityScoreBump section shows the values." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / abilityScoreSet / items / properties / value / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / actionEconomy / descriptionPrevious value: -"What invoking the ability costs on a turn: 'Action', 'Bonus Action', or 'Reaction'. Distinct from the mechanics actionType (a kind-of-action label). Absent = the ability takes the action."New value: +"What invoking the ability costs on a turn. The rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the absent default. Distinct from the mechanics actionType (a kind-of-action label)." - added
Input schema / properties / actionEconomy / enumAdded value: +[ + "Action", + "Bonus Action", + "Reaction" +] - changed
Input schema / properties / actions / descriptionPrevious value: -"PF Playtest action-economy marker (F/1/2/3/R)."New value: +"Action-cost marker, for rulesets whose rules carry one; the value is the source text." - changed
Input schema / properties / casterProgression / descriptionPrevious value: -"How this class contributes to the combined multiclass spell-slot pool: full casters count every level, half/third round up, 'pact' (Pact Magic) keeps its own pool and never joins. Authorable on a base class or a subclass (a third-caster subclass carries it). Absent = non-caster."New value: +"How this class contributes to the combined multiclass spell-slot pool; the engine applies each progression's rule. Authorable on a base class or a subclass (a subclass that grants the casting carries it). Absent = non-caster." - changed
Input schema / properties / castingAbility / descriptionPrevious value: -"The ability this rule's spellcasting keys off ('Intelligence is your spellcasting ability for your Wizard spells'). Author it on a class's Spellcasting ability rule; vault's creation and level-up wizards write it to the character-wide Spellcasting Ability (first-wins, never overwriting), and a multiclass whose ability differs stamps its granted spells per-entry. Distinct from a spell block's castingAbility, which overrides per grant. Absent = the rule says nothing about the character's casting ability."New value: +"The ability this rule's spellcasting keys off. Author it on a class's Spellcasting ability rule; vault's creation and level-up wizards write it to the character-wide Spellcasting Ability (first-wins, never overwriting), and a multiclass whose ability differs stamps its granted spells per-entry. Distinct from a spell block's castingAbility, which overrides per grant. Absent = the rule says nothing about the character's casting ability." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / prerequisites / items / properties / abilities / descriptionPrevious value: -"For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+')."New value: +"For abilityScore: ANY listed ability meeting `min` satisfies." - changed
Input schema / properties / prerequisites / items / properties / proficiency / descriptionPrevious value: -"For proficiency: the proficiency name (e.g. 'Martial', 'Stealth')."New value: +"For proficiency: the proficiency name, as the ruleset names it." - changed
Input schema / properties / prerequisites / items / properties / proficiencyType / enumPrevious value: -[ - "skill", - "tool", - "weapon", - "armor", - "save", - "language" -]New value: +[ + "skill", + "tool", + "save", + "weapon", + "armor", + "language" +] - changed
Input schema / properties / prerequisites / items / properties / type / descriptionPrevious value: -"Predicate kind: level / abilityScore / rule / spell / proficiency / spellcasting. (A class is required via a `rule` predicate pointing at the class rule.)"New value: +"Predicate kind. (A class is required via a `rule` predicate pointing at the class rule.)" - changed
Input schema / properties / range / descriptionPrevious value: -"How far the ability reaches when invoked — self, touch, or ranged with a distance ('feet' default, 'miles' for long reaches). Absent = runtime defaults (self-heals on the user, targeted abilities at touch)."New value: +"How far the ability reaches when invoked: `kind`, plus `distance` and its `unit` for a kind that takes a distance. Absent: the rule authoring guide (vault_get_authoring_guide, entityType 'rule') gives the default." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / repeatable / descriptionPrevious value: -"A rule that may be taken/granted more than once, each time as a distinct instance with its own sub-choices — a repeatable Feat (Skilled, Resilient), or a class's Ability Score Improvement ability, which its class grants at several levels."New value: +"A rule that may be taken/granted more than once, each time as a distinct instance with its own sub-choices — a repeatable feat, or a class ability its class grants at several levels." - changed
Input schema / properties / resistances / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-targeted resistances (Warding Aura's 10 ft.). Absent = self-only."New value: +"Aura radius in feet for ally/any-targeted resistances. Absent = self-only." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds', 'Universal')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / type / enumPrevious value: -[ - "Ability", - "Feat", - "Action Card", - "Hindrance", - "Edge", - "Class", - "Background", - "Race", - "Species", - "Ancestry", - "Glossary", - "Stunt", - "Extra" -]New value: +[ + "Ability", + "Feat", + "Glossary", + "Action Card", + "Hindrance", + "Edge", + "Class", + "Background", + "Race", + "Species", + "Ancestry", + "Stunt", + "Extra" +]
- Changed
vault_update_spell80 fields changed- changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / eligible / descriptionPrevious value: -"Pool to choose from. Empty / absent = any of the six."New value: +"Pool to choose from. Empty / absent = any ability in the schema's abilities list." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / descriptionPrevious value: -"Ceiling no chosen score may exceed after the bump (ASI = 20)."New value: +"Ceiling no chosen score may exceed after the bump. The rule authoring guide's abilityScoreBump section shows the values." - changed
Input schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / abilityScoreSet / items / properties / value / maximumPrevious value: -9007199254740991New value: +30 - changed
Input schema / properties / actions / descriptionPrevious value: -"PF Playtest action-economy marker (F/1/2/3/R)."New value: +"Action-cost marker, for rulesets whose spells carry one; the value is the source text." - changed
Input schema / properties / area / descriptionPrevious value: -"Area of effect. shape ∈ cone|cube|cylinder|emanation|line|sphere; size (ft); width for line."New value: +"Area of effect. `shape`; `size` (ft); `width` for a line." - changed
Input schema / properties / castingTime / descriptionPrevious value: -"Casting time. unit ∈ action|bonusAction|reaction|minute|hour; count for minute/hour."New value: +"Casting time. `unit`, plus `count` for a timed unit." - changed
Input schema / properties / classes / descriptionPrevious value: -"Class-membership list for non-5.5e rulesets (e.g. PFRPG); 5.5e spells use `categories` instead. Free-form per ruleset."New value: +"Class-membership list for rulesets whose spells do not use `categories` (the spell authoring guide covers `categories`). Free-form per ruleset." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / damageReduction / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceFloors / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / diceReplacements / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / duration / descriptionPrevious value: -"Spell duration. unit ∈ instantaneous | round | minute | hour | day | untilDispelled | untilDispelledOrTriggered | special; count for timed units; concentration flag; upTo flag for a non-concentration capped duration (\"Up to 1 minute\")."New value: +"Spell duration. `unit`; `count` for a timed unit; concentration flag; upTo flag for a non-concentration capped duration (\"Up to 1 minute\")." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / forcedMovement / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / higherLevel / descriptionPrevious value: -"Higher-Level / cantrip-scaling text (what changes when cast with a higher slot)."New value: +"Scaling text: what changes when the spell is cast at a higher level or scales with the caster, source text." - changed
Input schema / properties / level / descriptionPrevious value: -"Spell level. 0 for cantrips; 1–9 for leveled spells (5e/5e24)."New value: +"Spell level, within the schema's range. The spell authoring guide gives the convention." - changed
Input schema / properties / level / maximumPrevious value: -9007199254740991New value: +9 - changed
Input schema / properties / level / minimumPrevious value: --9007199254740991New value: +0 - changed
Input schema / properties / prerequisites / items / properties / abilities / descriptionPrevious value: -"For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+')."New value: +"For abilityScore: ANY listed ability meeting `min` satisfies." - changed
Input schema / properties / prerequisites / items / properties / proficiency / descriptionPrevious value: -"For proficiency: the proficiency name (e.g. 'Martial', 'Stealth')."New value: +"For proficiency: the proficiency name, as the ruleset names it." - changed
Input schema / properties / prerequisites / items / properties / proficiencyType / enumPrevious value: -[ - "skill", - "tool", - "weapon", - "armor", - "save", - "language" -]New value: +[ + "skill", + "tool", + "save", + "weapon", + "armor", + "language" +] - changed
Input schema / properties / prerequisites / items / properties / type / descriptionPrevious value: -"Predicate kind: level / abilityScore / rule / spell / proficiency / spellcasting. (A class is required via a `rule` predicate pointing at the class rule.)"New value: +"Predicate kind. (A class is required via a `rule` predicate pointing at the class rule.)" - changed
Input schema / properties / range / descriptionPrevious value: -"Range. kind ∈ self|touch|ranged|sight|unlimited|special; distance for ranged; unit ∈ feet|miles (default feet)."New value: +"Range. `kind`; `distance` and its `unit` for a ranged spell (absent unit = feet)." - changed
Input schema / properties / rank / descriptionPrevious value: -"PFRPG2 rank field. Free-form."New value: +"Rank, for rulesets whose spells carry one. Free-form." - changed
Input schema / properties / reactionTrigger / descriptionPrevious value: -"When castingTime.unit is 'reaction', the trigger text ('which you take when…')."New value: +"For a casting time taken in response to a trigger, the trigger text, source text." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / recurringDamage / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / resistances / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-targeted resistances (Warding Aura's 10 ft.). Absent = self-only."New value: +"Aura radius in feet for ally/any-targeted resistances. Absent = self-only." - changed
Input schema / properties / ritual / descriptionPrevious value: -"5.5e ritual tag — the spell can be cast as a ritual (no spell slot)."New value: +"Ritual tag: the spell can be cast as a ritual." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / rollMods / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / ruleset / descriptionPrevious value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds')."New value: +"Ruleset code, from list_rulesets." - changed
Input schema / properties / school / descriptionPrevious value: -"Spell school (Abjuration, Conjuration, Divination, Enchantment, Evocation, Illusion, Necromancy, Transmutation)."New value: +"Spell school name." - changed
Input schema / properties / statBonuses / items / properties / durationCount / descriptionPrevious value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit." - changed
Input schema / properties / statBonuses / items / properties / range / descriptionPrevious value: -"Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter."New value: +"Aura radius in feet for ally/any-audience bonuses. Absent = no range filter." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / armorCategories / descriptionPrevious value: -"For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any."New value: +"Armor categories to match, as the items' `armorCategory` values name them. OR semantics — match any." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / descriptionPrevious value: -"For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states)."New value: +"For 'condition' predicates: the character-state condition to gate on (named conditions and ongoing-action states)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / condition / enumPrevious value: -[ - "blinded", - "charmed", - "dazed", - "deafened", - "exhaustion", - "frightened", - "grappled", - "incapacitated", - "invisible", - "paralyzed", - "petrified", - "poisoned", - "prone", - "restrained", - "stunned", - "unconscious", - "concentrating", - "grappling", - "dodging", - "hiding", - "raging" -]New value: +[ + "blinded", + "charmed", + "concentration", + "deafened", + "exhaustion", + "frightened", + "grappled", + "incapacitated", + "invisible", + "paralyzed", + "petrified", + "poisoned", + "prone", + "restrained", + "stunned", + "unconscious", + "dazed", + "grappling", + "dodging", + "hiding", + "raging" +] - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / equipSlot / descriptionPrevious value: -"Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both."New value: +"Body slot the matched weapon must occupy (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / slot / descriptionPrevious value: -"For 'equipped' predicates: the body category to match (armor / shield / weapon)."New value: +"The equipped body category to match (one of the schema's enum)." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / type / descriptionPrevious value: -"Predicate type. 'equipped' = character-scoped (gates on what's equipped). 'attackingWeapon' = attack-scoped (gates on the current action's source weapon). 'condition' = gates on a character-state condition."New value: +"Predicate type (one of the schema's enum): what the predicate gates on." - changed
Input schema / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / descriptionPrevious value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all." - changed
Input schema / properties / statBonuses / items / properties / target / descriptionPrevious value: -"Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc')."New value: +"Stat the bonus contributes to (e.g. 'skills.<skill>.misc', 'attributes.<ability>.misc')." - changed
Input schema / properties / statBonuses / items / properties / trigger / descriptionPrevious value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus." - changed
Input schema / properties / statBonuses / items / properties / triggerEvent / descriptionPrevious value: -"Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds)."New value: +"Game-time event that fires the bonus (one of the schema's trigger events). Absent = not event-driven (passive walker contributes whenever `requires` holds)." - changed
Input schema / properties / statBonuses / items / properties / valueType / enumPrevious value: -[ - "fixed", - "attribute", - "proficiency", - "level", - "halfLevel", - "dice", - "byLevel", - "attackAttribute" -]New value: +[ + "fixed", + "attribute", + "attackAttribute", + "proficiency", + "level", + "halfLevel", + "dice", + "byLevel" +] - changed
Input schema / properties / type / descriptionPrevious value: -"Spell type. 5e / 5e24 use 'Spell'; Savage Worlds uses 'Power'. Required at create."New value: +"Spell type (the ruleset's name for a spell). Required at create."
Related MCP Connectors
Tabletop RPG campaign wiki for game masters: NPCs, places, sessions, encounters, notes, roll tables
D&D and TTRPG campaign manager for GMs: your AI reads and writes a live, typed campaign database.
Dungeons & Dragons (D&D) and TTRPG companion: SessionKeeper sessions, NPCs, wiki, DM prep.
Connect any AI to your Foundry VTT world: actors, combat, dice, journals, tokens, compendiums.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceConnects AI assistants to TTRPG campaign data for managing characters, sessions, locations, factions, items, quests, and more.4MIT
- AlicenseAqualityAmaintenanceHolonovel turns a tabletop RPG rulebook and an AI client into a running game. The server enforces every rule and remembers your campaign as structured state the AI can't forget; the AI just narrates. D&D 5e, Starfinder, or any rulebook.36MIT
- AlicenseNot gradedqualityBmaintenanceConnect to your TTRPG campaign's repository and database. Instead of retrieving prose, its 48 tools (20 read, 28 write) return typed state: 14 entity schemas (NPCs, factions, locations, sessions, lore), relationship and knowledge-graph queries, wiki blocks, and a narrative-state bundle of open threads and canon facts.2MIT

archivistofficial
AlicenseNot gradedqualityDmaintenanceProvides read-only SRD lookup and deterministic enrichment tools for D&D 5e content generation, including search, entity retrieval, and generation of monsters, spells, items, NPCs, and encounters.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.