Skip to main content
Glama

Embers: Tabletop RPG Toolkit

Update a vault item

vault_update_item
Idempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesMongo `_id` of the item to update.
oglNo
costNoCost in gold pieces (max 2 decimal places). Vault enforces non-negativity and precision.
nameNoDisplay name.
typeNoItem type. Free-form per ruleset; match the types the ruleset's catalog uses (vault_search_items shows them). Required at create.
usesNo
imageNo
activeNo
damageNo
effectNo
sourceNo
weightNo
_parentNoParent item ObjectId for variant items.
healingNo
masteryNoWeapon mastery name, for rulesets whose weapons carry one, as the ruleset's catalog names it.
rulesetNoRuleset code, from list_rulesets.
summaryNoShort one-line summary.
durationNo
rollModsNo
publisherNo
actionTypeNoAuthoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`.
armorClassNoBase AC value the armor provides.
damageDiceNoBase damage expression (e.g. '1d8').
damageTypeNoDamage types as an array of strings (most items have one type; some have multiples).
diceFloorsNo
equipSlotsNoAllowed equip slot ids, from the ruleset's own slots (an existing item's equipSlots, via vault_get_item, shows them).
parametersNo
propertiesNo
ruleChoiceNo
weaponTypeNoWeapon category, as the ruleset's catalog names it (vault_search_items shows them).
descriptionNoFull item description. Markdown is supported.
resistancesNo
statBonusesNo
mechanicsKeyNo
spellChoicesNo
armorCategoryNoArmor category, as the ruleset's catalog names it (vault_search_items shows them).
baseUpdatedAtYesREQUIRED 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.
prerequisitesNo
forcedMovementNo
maxDexModifierNoCap on the DEX bonus this armor allows, from the item's source text.
preparedSpellsNo
abilityScoreSetNo
damageReductionNo
recurringDamageNo
abilityScoreBumpNo
diceReplacementsNo
spellListChoicesNo
prerequisitesLogicNo
proficiencyChoicesNo
stealthDisadvantageNo
strengthRequirementNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
_idNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed74 schema fields changed
    • changedInput schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / eligible / description
      Previous 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."
    • changedInput schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / description
      Previous 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."
    • changedInput schema / properties / abilityScoreBump / properties / options / items / properties / lines / items / properties / max / maximum
      Previous value: -9007199254740991New value: +30
    • changedInput schema / properties / abilityScoreSet / items / properties / value / maximum
      Previous value: -9007199254740991New value: +30
    • changedInput schema / properties / armorCategory / description
      Previous value: -"Armor category ('Light', 'Medium', 'Heavy', 'Shield')."New value: +"Armor category, as the ruleset's catalog names it (vault_search_items shows them)."
    • changedInput schema / properties / damageReduction / items / properties / requires / items / properties / armorCategories / description
      Previous 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."
    • changedInput schema / properties / damageReduction / items / properties / requires / items / properties / condition / description
      Previous 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)."
    • changedInput schema / properties / damageReduction / items / properties / requires / items / properties / condition / enum
      Previous 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"
      +]
    • changedInput schema / properties / damageReduction / items / properties / requires / items / properties / equipSlot / description
      Previous 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)."
    • changedInput schema / properties / damageReduction / items / properties / requires / items / properties / slot / description
      Previous 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)."
    • changedInput schema / properties / damageReduction / items / properties / requires / items / properties / type / description
      Previous 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."
    • changedInput schema / properties / damageReduction / items / properties / requires / items / properties / weaponProperties / description
      Previous value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all."
    • changedInput schema / properties / diceFloors / items / properties / requires / items / properties / armorCategories / description
      Previous 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."
    • changedInput schema / properties / diceFloors / items / properties / requires / items / properties / condition / description
      Previous 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)."
    • changedInput schema / properties / diceFloors / items / properties / requires / items / properties / condition / enum
      Previous 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"
      +]
    • changedInput schema / properties / diceFloors / items / properties / requires / items / properties / equipSlot / description
      Previous 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)."
    • changedInput schema / properties / diceFloors / items / properties / requires / items / properties / slot / description
      Previous 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)."
    • changedInput schema / properties / diceFloors / items / properties / requires / items / properties / type / description
      Previous 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."
    • changedInput schema / properties / diceFloors / items / properties / requires / items / properties / weaponProperties / description
      Previous value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all."
    • changedInput schema / properties / diceReplacements / items / properties / requires / items / properties / armorCategories / description
      Previous 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."
    • changedInput schema / properties / diceReplacements / items / properties / requires / items / properties / condition / description
      Previous 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)."
    • changedInput schema / properties / diceReplacements / items / properties / requires / items / properties / condition / enum
      Previous 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"
      +]
    • changedInput schema / properties / diceReplacements / items / properties / requires / items / properties / equipSlot / description
      Previous 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)."
    • changedInput schema / properties / diceReplacements / items / properties / requires / items / properties / slot / description
      Previous 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)."
    • changedInput schema / properties / diceReplacements / items / properties / requires / items / properties / type / description
      Previous 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."
    • changedInput schema / properties / diceReplacements / items / properties / requires / items / properties / weaponProperties / description
      Previous value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all."
    • changedInput schema / properties / equipSlots / description
      Previous 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)."
    • changedInput schema / properties / forcedMovement / items / properties / requires / items / properties / armorCategories / description
      Previous 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."
    • changedInput schema / properties / forcedMovement / items / properties / requires / items / properties / condition / description
      Previous 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)."
    • changedInput schema / properties / forcedMovement / items / properties / requires / items / properties / condition / enum
      Previous 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"
      +]
    • changedInput schema / properties / forcedMovement / items / properties / requires / items / properties / equipSlot / description
      Previous 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)."
    • changedInput schema / properties / forcedMovement / items / properties / requires / items / properties / slot / description
      Previous 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)."
    • changedInput schema / properties / forcedMovement / items / properties / requires / items / properties / type / description
      Previous 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."
    • changedInput schema / properties / forcedMovement / items / properties / requires / items / properties / weaponProperties / description
      Previous value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all."
    • changedInput schema / properties / mastery / description
      Previous 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."
    • changedInput schema / properties / maxDexModifier / description
      Previous 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."
    • changedInput schema / properties / prerequisites / items / properties / abilities / description
      Previous value: -"For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+')."New value: +"For abilityScore: ANY listed ability meeting `min` satisfies."
    • changedInput schema / properties / prerequisites / items / properties / proficiency / description
      Previous value: -"For proficiency: the proficiency name (e.g. 'Martial', 'Stealth')."New value: +"For proficiency: the proficiency name, as the ruleset names it."
    • changedInput schema / properties / prerequisites / items / properties / proficiencyType / enum
      Previous value: -[
      -  "skill",
      -  "tool",
      -  "weapon",
      -  "armor",
      -  "save",
      -  "language"
      -]New value: +[
      +  "skill",
      +  "tool",
      +  "save",
      +  "weapon",
      +  "armor",
      +  "language"
      +]
    • changedInput schema / properties / prerequisites / items / properties / type / description
      Previous 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.)"
    • changedInput schema / properties / properties / items / properties / ammoType / description
      Previous value: -"Ammunition type for the Ammunition property (e.g. 'Arrow', 'Bolt')."New value: +"Ammunition type, for a property that uses ammunition."
    • changedInput schema / properties / properties / items / properties / damage / description
      Previous 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."
    • changedInput schema / properties / properties / items / properties / name / description
      Previous value: -"Property identifier (e.g. 'Finesse', 'Versatile', 'Ammunition')."New value: +"Property identifier, as the ruleset's catalog names it (vault_search_items shows them)."
    • changedInput schema / properties / recurringDamage / items / properties / requires / items / properties / armorCategories / description
      Previous 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."
    • changedInput schema / properties / recurringDamage / items / properties / requires / items / properties / condition / description
      Previous 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)."
    • changedInput schema / properties / recurringDamage / items / properties / requires / items / properties / condition / enum
      Previous 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"
      +]
    • changedInput schema / properties / recurringDamage / items / properties / requires / items / properties / equipSlot / description
      Previous 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)."
    • changedInput schema / properties / recurringDamage / items / properties / requires / items / properties / slot / description
      Previous 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)."
    • changedInput schema / properties / recurringDamage / items / properties / requires / items / properties / type / description
      Previous 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."
    • changedInput schema / properties / recurringDamage / items / properties / requires / items / properties / weaponProperties / description
      Previous value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all."
    • changedInput schema / properties / resistances / items / properties / range / description
      Previous 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."
    • changedInput schema / properties / rollMods / items / properties / requires / items / properties / armorCategories / description
      Previous 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."
    • changedInput schema / properties / rollMods / items / properties / requires / items / properties / condition / description
      Previous 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)."
    • changedInput schema / properties / rollMods / items / properties / requires / items / properties / condition / enum
      Previous 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"
      +]
    • changedInput schema / properties / rollMods / items / properties / requires / items / properties / equipSlot / description
      Previous 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)."
    • changedInput schema / properties / rollMods / items / properties / requires / items / properties / slot / description
      Previous 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)."
    • changedInput schema / properties / rollMods / items / properties / requires / items / properties / type / description
      Previous 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."
    • changedInput schema / properties / rollMods / items / properties / requires / items / properties / weaponProperties / description
      Previous value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all."
    • changedInput schema / properties / ruleset / description
      Previous value: -"Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds')."New value: +"Ruleset code, from list_rulesets."
    • changedInput schema / properties / statBonuses / items / properties / durationCount / description
      Previous value: -"Numeric count paired with durationUnit (e.g. count: 3, unit: 'round')."New value: +"Numeric count paired with durationUnit."
    • changedInput schema / properties / statBonuses / items / properties / range / description
      Previous 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."
    • changedInput schema / properties / statBonuses / items / properties / requires / items / properties / armorCategories / description
      Previous 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."
    • changedInput schema / properties / statBonuses / items / properties / requires / items / properties / condition / description
      Previous 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)."
    • changedInput schema / properties / statBonuses / items / properties / requires / items / properties / condition / enum
      Previous 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"
      +]
    • changedInput schema / properties / statBonuses / items / properties / requires / items / properties / equipSlot / description
      Previous 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)."
    • changedInput schema / properties / statBonuses / items / properties / requires / items / properties / slot / description
      Previous 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)."
    • changedInput schema / properties / statBonuses / items / properties / requires / items / properties / type / description
      Previous 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."
    • changedInput schema / properties / statBonuses / items / properties / requires / items / properties / weaponProperties / description
      Previous value: -"For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all."New value: +"Weapon properties to match. AND semantics — match all."
    • changedInput schema / properties / statBonuses / items / properties / target / description
      Previous 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')."
    • changedInput schema / properties / statBonuses / items / properties / trigger / description
      Previous value: -"Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound."New value: +"Action-economy / cost shape of the bonus."
    • changedInput schema / properties / statBonuses / items / properties / triggerEvent / description
      Previous 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)."
    • changedInput schema / properties / statBonuses / items / properties / valueType / enum
      Previous value: -[
      -  "fixed",
      -  "attribute",
      -  "proficiency",
      -  "level",
      -  "halfLevel",
      -  "dice",
      -  "byLevel",
      -  "attackAttribute"
      -]New value: +[
      +  "fixed",
      +  "attribute",
      +  "attackAttribute",
      +  "proficiency",
      +  "level",
      +  "halfLevel",
      +  "dice",
      +  "byLevel"
      +]
    • changedInput schema / properties / type / description
      Previous 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."
    • changedInput schema / properties / weaponType / description
      Previous value: -"Weapon category ('Simple Melee', 'Martial Ranged', etc.)."New value: +"Weapon category, as the ruleset's catalog names it (vault_search_items shows them)."
  2. Changed54 schema fields changed
    • addedInput schema / $schema
      Added value: +"http://json-schema.org/draft-07/schema#"
    • addedInput schema / additionalProperties
      Added value: +{}
    • addedInput schema / properties / _parent
      Added value: +{
      +  "description": "Parent item ObjectId for variant items.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / abilityScoreBump
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "options": {
      +      "description": "Alternatives the player picks exactly ONE of (OR).",
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "lines": {
      +            "description": "Lines that ALL apply when this option is chosen (AND).",
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "amount": {
      +                  "description": "How much each chosen ability goes up (usually positive).",
      +                  "type": "number"
      +                },
      +                "count": {
      +                  "description": "How many distinct abilities this line raises.",
      +                  "maximum": 9007199254740991,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "eligible": {
      +                  "description": "Pool to choose from. Empty / absent = any of the six.",
      +                  "items": {
      +                    "enum": [
      +                      "strength",
      +                      "dexterity",
      +                      "constitution",
      +                      "intelligence",
      +                      "wisdom",
      +                      "charisma"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "max": {
      +                  "description": "Ceiling no chosen score may exceed after the bump (ASI = 20).",
      +                  "maximum": 9007199254740991,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / abilityScoreSet
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "ability": {
      +        "enum": [
      +          "strength",
      +          "dexterity",
      +          "constitution",
      +          "intelligence",
      +          "wisdom",
      +          "charisma"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Score to set the ability to while in effect.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / actionType
      Added value: +{
      +  "description": "Authoring hint — when set, the character sheet's rule modal shows an 'Add to Actions' button that mints an action row with this `type`.",
      +  "type": "string"
      +}
    • addedInput schema / properties / active
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / armorCategory
      Added value: +{
      +  "description": "Armor category ('Light', 'Medium', 'Heavy', 'Shield').",
      +  "type": "string"
      +}
    • addedInput schema / properties / armorClass
      Added value: +{
      +  "description": "Base AC value the armor provides.",
      +  "type": "number"
      +}
    • addedInput schema / properties / baseUpdatedAt
      Added value: +{
      +  "description": "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.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / cost
      Added value: +{
      +  "description": "Cost in gold pieces (max 2 decimal places). Vault enforces non-negativity and precision.",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / damage
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "appliesTo": {
      +      "enum": [
      +        "melee",
      +        "ranged",
      +        "either"
      +      ],
      +      "type": "string"
      +    },
      +    "area": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "shape": {
      +            "enum": [
      +              "cone",
      +              "line",
      +              "sphere",
      +              "cube",
      +              "cylinder",
      +              "emanation",
      +              "radius"
      +            ],
      +            "type": "string"
      +          },
      +          "size": {
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "width": {
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "dice": {
      +      "type": "string"
      +    },
      +    "flat": {
      +      "type": "number"
      +    },
      +    "modifierAbility": {
      +      "enum": [
      +        "strength",
      +        "dexterity",
      +        "constitution",
      +        "intelligence",
      +        "wisdom",
      +        "charisma"
      +      ],
      +      "type": "string"
      +    },
      +    "modifierType": {
      +      "enum": [
      +        "flat",
      +        "proficiency",
      +        "ability"
      +      ],
      +      "type": "string"
      +    },
      +    "onSave": {
      +      "enum": [
      +        "half",
      +        "negates",
      +        "full"
      +      ],
      +      "type": "string"
      +    },
      +    "progression": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "dice": {
      +            "type": "string"
      +          },
      +          "flat": {
      +            "type": "number"
      +          },
      +          "level": {
      +            "maximum": 20,
      +            "minimum": 1,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "save": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "ability": {
      +          "enum": [
      +            "none",
      +            "spellcasting",
      +            "attackAttribute",
      +            "strength",
      +            "dexterity",
      +            "constitution",
      +            "intelligence",
      +            "wisdom",
      +            "charisma"
      +          ],
      +          "type": "string"
      +        },
      +        "dcBase": {
      +          "type": "number"
      +        },
      +        "includesProficiency": {
      +          "type": "boolean"
      +        },
      +        "saveType": {
      +          "enum": [
      +            "strength",
      +            "dexterity",
      +            "constitution",
      +            "intelligence",
      +            "wisdom",
      +            "charisma"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "scaling": {
      +      "enum": [
      +        "fixed",
      +        "byLevel",
      +        "spellSlot"
      +      ],
      +      "type": "string"
      +    },
      +    "scalingAttribute": {
      +      "type": "string"
      +    },
      +    "slotIncrement": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "dice": {
      +          "type": "string"
      +        },
      +        "flat": {
      +          "type": "number"
      +        },
      +        "targets": {
      +          "maximum": 9007199254740991,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "targets": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "count": {
      +          "maximum": 9007199254740991,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "trigger": {
      +      "enum": [
      +        "passive",
      +        "toggled",
      +        "reaction",
      +        "perRoll",
      +        "resource",
      +        "targetBound"
      +      ],
      +      "type": "string"
      +    },
      +    "types": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / damageDice
      Added value: +{
      +  "description": "Base damage expression (e.g. '1d8').",
      +  "type": "string"
      +}
    • addedInput schema / properties / damageReduction
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "amount": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "dice": {
      +            "type": "string"
      +          },
      +          "flat": {
      +            "type": "number"
      +          },
      +          "includesProficiency": {
      +            "type": "boolean"
      +          },
      +          "modifierSource": {
      +            "enum": [
      +              "spellcasting",
      +              "attackAttribute",
      +              "strength",
      +              "dexterity",
      +              "constitution",
      +              "intelligence",
      +              "wisdom",
      +              "charisma"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "range": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "requires": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "armorCategories": {
      +              "description": "For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "condition": {
      +              "description": "For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states).",
      +              "enum": [
      +                "blinded",
      +                "charmed",
      +                "dazed",
      +                "deafened",
      +                "exhaustion",
      +                "frightened",
      +                "grappled",
      +                "incapacitated",
      +                "invisible",
      +                "paralyzed",
      +                "petrified",
      +                "poisoned",
      +                "prone",
      +                "restrained",
      +                "stunned",
      +                "unconscious",
      +                "concentrating",
      +                "grappling",
      +                "dodging",
      +                "hiding",
      +                "raging"
      +              ],
      +              "type": "string"
      +            },
      +            "equipSlot": {
      +              "description": "Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both.",
      +              "enum": [
      +                "mainHand",
      +                "offHand"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.",
      +              "type": "boolean"
      +            },
      +            "slot": {
      +              "description": "For 'equipped' predicates: the body category to match (armor / shield / weapon).",
      +              "enum": [
      +                "armor",
      +                "shield",
      +                "weapon"
      +              ],
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "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.",
      +              "enum": [
      +                "equipped",
      +                "attackingWeapon",
      +                "condition"
      +              ],
      +              "type": "string"
      +            },
      +            "weaponProperties": {
      +              "description": "For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requiresLogic": {
      +        "enum": [
      +          "and",
      +          "or"
      +        ],
      +        "type": "string"
      +      },
      +      "target": {
      +        "enum": [
      +          "self",
      +          "ally",
      +          "any",
      +          "target",
      +          "enemy"
      +        ],
      +        "type": "string"
      +      },
      +      "trigger": {
      +        "enum": [
      +          "passive",
      +          "toggled",
      +          "reaction",
      +          "perRoll",
      +          "resource",
      +          "targetBound"
      +        ],
      +        "type": "string"
      +      },
      +      "types": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / damageType
      Added value: +{
      +  "description": "Damage types as an array of strings (most items have one type; some have multiples).",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / description
      Added value: +{
      +  "description": "Full item description. Markdown is supported.",
      +  "type": "string"
      +}
    • addedInput schema / properties / diceFloors
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "appliesTo": {
      +        "enum": [
      +          "damage",
      +          "damage.melee",
      +          "damage.ranged",
      +          "damage.spell",
      +          "healing"
      +        ],
      +        "type": "string"
      +      },
      +      "floor": {
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "requires": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "armorCategories": {
      +              "description": "For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "condition": {
      +              "description": "For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states).",
      +              "enum": [
      +                "blinded",
      +                "charmed",
      +                "dazed",
      +                "deafened",
      +                "exhaustion",
      +                "frightened",
      +                "grappled",
      +                "incapacitated",
      +                "invisible",
      +                "paralyzed",
      +                "petrified",
      +                "poisoned",
      +                "prone",
      +                "restrained",
      +                "stunned",
      +                "unconscious",
      +                "concentrating",
      +                "grappling",
      +                "dodging",
      +                "hiding",
      +                "raging"
      +              ],
      +              "type": "string"
      +            },
      +            "equipSlot": {
      +              "description": "Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both.",
      +              "enum": [
      +                "mainHand",
      +                "offHand"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.",
      +              "type": "boolean"
      +            },
      +            "slot": {
      +              "description": "For 'equipped' predicates: the body category to match (armor / shield / weapon).",
      +              "enum": [
      +                "armor",
      +                "shield",
      +                "weapon"
      +              ],
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "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.",
      +              "enum": [
      +                "equipped",
      +                "attackingWeapon",
      +                "condition"
      +              ],
      +              "type": "string"
      +            },
      +            "weaponProperties": {
      +              "description": "For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requiresLogic": {
      +        "enum": [
      +          "and",
      +          "or"
      +        ],
      +        "type": "string"
      +      },
      +      "threshold": {
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "trigger": {
      +        "enum": [
      +          "passive",
      +          "toggled",
      +          "reaction",
      +          "perRoll",
      +          "resource",
      +          "targetBound"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / diceReplacements
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "_target": {
      +        "description": "Mongo `_id` reference (24-character hex string).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "dice": {
      +        "type": "string"
      +      },
      +      "progression": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "dice": {
      +              "type": "string"
      +            },
      +            "level": {
      +              "maximum": 20,
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requires": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "armorCategories": {
      +              "description": "For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "condition": {
      +              "description": "For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states).",
      +              "enum": [
      +                "blinded",
      +                "charmed",
      +                "dazed",
      +                "deafened",
      +                "exhaustion",
      +                "frightened",
      +                "grappled",
      +                "incapacitated",
      +                "invisible",
      +                "paralyzed",
      +                "petrified",
      +                "poisoned",
      +                "prone",
      +                "restrained",
      +                "stunned",
      +                "unconscious",
      +                "concentrating",
      +                "grappling",
      +                "dodging",
      +                "hiding",
      +                "raging"
      +              ],
      +              "type": "string"
      +            },
      +            "equipSlot": {
      +              "description": "Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both.",
      +              "enum": [
      +                "mainHand",
      +                "offHand"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.",
      +              "type": "boolean"
      +            },
      +            "slot": {
      +              "description": "For 'equipped' predicates: the body category to match (armor / shield / weapon).",
      +              "enum": [
      +                "armor",
      +                "shield",
      +                "weapon"
      +              ],
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "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.",
      +              "enum": [
      +                "equipped",
      +                "attackingWeapon",
      +                "condition"
      +              ],
      +              "type": "string"
      +            },
      +            "weaponProperties": {
      +              "description": "For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requiresLogic": {
      +        "enum": [
      +          "and",
      +          "or"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / duration
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "concentration": {
      +      "type": "boolean"
      +    },
      +    "count": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "unit": {
      +      "enum": [
      +        "round",
      +        "minute",
      +        "hour",
      +        "day",
      +        "untilShortRest",
      +        "untilLongRest",
      +        "special"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / effect
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "audience": {
      +      "enum": [
      +        "self",
      +        "ally",
      +        "any",
      +        "target",
      +        "enemy"
      +      ],
      +      "type": "string"
      +    },
      +    "conditions": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "applyWhen": {
      +            "enum": [
      +              "always",
      +              "onFail",
      +              "onSuccess"
      +            ],
      +            "type": "string"
      +          },
      +          "durationCount": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "durationUnit": {
      +            "enum": [
      +              "round",
      +              "minute",
      +              "hour",
      +              "day",
      +              "untilShortRest",
      +              "untilLongRest",
      +              "special"
      +            ],
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "target": {
      +            "enum": [
      +              "self",
      +              "target"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "save": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "ability": {
      +          "enum": [
      +            "none",
      +            "spellcasting",
      +            "attackAttribute",
      +            "strength",
      +            "dexterity",
      +            "constitution",
      +            "intelligence",
      +            "wisdom",
      +            "charisma"
      +          ],
      +          "type": "string"
      +        },
      +        "dcBase": {
      +          "type": "number"
      +        },
      +        "includesProficiency": {
      +          "type": "boolean"
      +        },
      +        "saveType": {
      +          "enum": [
      +            "strength",
      +            "dexterity",
      +            "constitution",
      +            "intelligence",
      +            "wisdom",
      +            "charisma"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "triggerEvent": {
      +      "enum": [
      +        "onHit",
      +        "onMiss",
      +        "onDamage",
      +        "startOfYourTurn",
      +        "endOfYourTurn",
      +        "startOfTargetTurn",
      +        "endOfTargetTurn"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / equipSlots
      Added value: +{
      +  "description": "Allowed equip slot ids (e.g. 'mainHand', 'offHand', 'body'). Vocabulary is ruleset-specific.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / forcedMovement
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "audience": {
      +        "enum": [
      +          "self",
      +          "ally",
      +          "any",
      +          "target",
      +          "enemy"
      +        ],
      +        "type": "string"
      +      },
      +      "direction": {
      +        "enum": [
      +          "awayFromSelf",
      +          "towardSelf",
      +          "anywhere"
      +        ],
      +        "type": "string"
      +      },
      +      "distance": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "maxTargetSize": {
      +        "enum": [
      +          "tiny",
      +          "small",
      +          "medium",
      +          "large",
      +          "huge",
      +          "gargantuan"
      +        ],
      +        "type": "string"
      +      },
      +      "requires": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "armorCategories": {
      +              "description": "For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "condition": {
      +              "description": "For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states).",
      +              "enum": [
      +                "blinded",
      +                "charmed",
      +                "dazed",
      +                "deafened",
      +                "exhaustion",
      +                "frightened",
      +                "grappled",
      +                "incapacitated",
      +                "invisible",
      +                "paralyzed",
      +                "petrified",
      +                "poisoned",
      +                "prone",
      +                "restrained",
      +                "stunned",
      +                "unconscious",
      +                "concentrating",
      +                "grappling",
      +                "dodging",
      +                "hiding",
      +                "raging"
      +              ],
      +              "type": "string"
      +            },
      +            "equipSlot": {
      +              "description": "Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both.",
      +              "enum": [
      +                "mainHand",
      +                "offHand"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.",
      +              "type": "boolean"
      +            },
      +            "slot": {
      +              "description": "For 'equipped' predicates: the body category to match (armor / shield / weapon).",
      +              "enum": [
      +                "armor",
      +                "shield",
      +                "weapon"
      +              ],
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "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.",
      +              "enum": [
      +                "equipped",
      +                "attackingWeapon",
      +                "condition"
      +              ],
      +              "type": "string"
      +            },
      +            "weaponProperties": {
      +              "description": "For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requiresLogic": {
      +        "enum": [
      +          "and",
      +          "or"
      +        ],
      +        "type": "string"
      +      },
      +      "triggerEvent": {
      +        "enum": [
      +          "onHit",
      +          "onMiss",
      +          "onDamage",
      +          "startOfYourTurn",
      +          "endOfYourTurn",
      +          "startOfTargetTurn",
      +          "endOfTargetTurn"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / healing
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "dice": {
      +      "type": "string"
      +    },
      +    "flat": {
      +      "type": "number"
      +    },
      +    "modifierSource": {
      +      "enum": [
      +        "level",
      +        "spellcasting",
      +        "strength",
      +        "dexterity",
      +        "constitution",
      +        "intelligence",
      +        "wisdom",
      +        "charisma"
      +      ],
      +      "type": "string"
      +    },
      +    "progression": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "dice": {
      +            "type": "string"
      +          },
      +          "flat": {
      +            "type": "number"
      +          },
      +          "level": {
      +            "maximum": 20,
      +            "minimum": 1,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "scaling": {
      +      "enum": [
      +        "fixed",
      +        "byLevel",
      +        "proficiency",
      +        "spellSlot"
      +      ],
      +      "type": "string"
      +    },
      +    "slotIncrement": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "dice": {
      +          "type": "string"
      +        },
      +        "flat": {
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "target": {
      +      "enum": [
      +        "self",
      +        "ally",
      +        "any",
      +        "multiple"
      +      ],
      +      "type": "string"
      +    },
      +    "targets": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "count": {
      +          "maximum": 9007199254740991,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / id
      Added value: +{
      +  "description": "Mongo `_id` of the item to update.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / image
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "url": {
      +      "description": "Image URL hosted on Embers Images (or any addressable HTTPS URL).",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / mastery
      Added value: +{
      +  "description": "5e24 weapon mastery name (e.g. 'Topple', 'Vex', 'Slow').",
      +  "type": "string"
      +}
    • addedInput schema / properties / maxDexModifier
      Added value: +{
      +  "description": "Cap on DEX bonus from this armor (medium = 2; heavy = 0 typically).",
      +  "type": "number"
      +}
    • addedInput schema / properties / mechanicsKey
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / name
      Added value: +{
      +  "description": "Display name.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / ogl
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / parameters
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "label": {
      +        "type": "string"
      +      },
      +      "max": {
      +        "type": "number"
      +      },
      +      "min": {
      +        "type": "number"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "number",
      +          "string",
      +          "enum"
      +        ],
      +        "type": "string"
      +      },
      +      "unit": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / preparedSpells
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "count": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "progression": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "count": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "level": {
      +            "maximum": 20,
      +            "minimum": 1,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / prerequisites
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "abilities": {
      +        "description": "For abilityScore: ANY listed ability meeting `min` satisfies ('Str or Dex 13+').",
      +        "items": {
      +          "enum": [
      +            "strength",
      +            "dexterity",
      +            "constitution",
      +            "intelligence",
      +            "wisdom",
      +            "charisma"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "category": {
      +        "description": "For rule (filter): matches any held rule in this category.",
      +        "type": "string"
      +      },
      +      "class": {
      +        "description": "For a `level` predicate: a Class rule id that scopes `min` to 'Nth level in that class'. Absent = total character level.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "min": {
      +        "description": "Numeric minimum — character level (level), class level (class), or ability score (abilityScore).",
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "negate": {
      +        "description": "true inverts the predicate — 'must NOT meet this'.",
      +        "type": "boolean"
      +      },
      +      "proficiency": {
      +        "description": "For proficiency: the proficiency name (e.g. 'Martial', 'Stealth').",
      +        "type": "string"
      +      },
      +      "proficiencyType": {
      +        "description": "For proficiency: the family.",
      +        "enum": [
      +          "skill",
      +          "tool",
      +          "weapon",
      +          "armor",
      +          "save",
      +          "language"
      +        ],
      +        "type": "string"
      +      },
      +      "rule": {
      +        "description": "For rule: a specific held Rule id.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "ruleType": {
      +        "description": "For rule (filter): matches any held rule of this type.",
      +        "type": "string"
      +      },
      +      "spell": {
      +        "description": "For spell: a specific known Spell id.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "spellList": {
      +        "description": "For spell (filter): knows any spell from this class list.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Predicate kind: level / abilityScore / rule / spell / proficiency / spellcasting. (A class is required via a `rule` predicate pointing at the class rule.)",
      +        "enum": [
      +          "level",
      +          "abilityScore",
      +          "rule",
      +          "spell",
      +          "proficiency",
      +          "spellcasting"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / prerequisitesLogic
      Added value: +{
      +  "enum": [
      +    "and",
      +    "or"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / proficiencyChoices
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "allowedItems": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "level": {
      +        "enum": [
      +          "proficient",
      +          "expertise"
      +        ],
      +        "type": "string"
      +      },
      +      "mode": {
      +        "enum": [
      +          "specific",
      +          "all"
      +        ],
      +        "type": "string"
      +      },
      +      "progression": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "count": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "level": {
      +              "maximum": 20,
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "types": {
      +        "items": {
      +          "enum": [
      +            "skill",
      +            "tool",
      +            "save",
      +            "weapon",
      +            "armor",
      +            "language"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / properties
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "ammoType": {
      +        "description": "Ammunition type for the Ammunition property (e.g. 'Arrow', 'Bolt').",
      +        "type": "string"
      +      },
      +      "damage": {
      +        "description": "Per-property damage dice override (e.g. Versatile's two-hand dice).",
      +        "type": "string"
      +      },
      +      "display": {
      +        "description": "Display string overriding the raw name.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Property identifier (e.g. 'Finesse', 'Versatile', 'Ammunition').",
      +        "type": "string"
      +      },
      +      "range": {
      +        "additionalProperties": {},
      +        "description": "For ranged properties: normal / long reach in feet.",
      +        "properties": {
      +          "long": {
      +            "type": "number"
      +          },
      +          "normal": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / publisher
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / recurringDamage
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "amount": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "dice": {
      +            "type": "string"
      +          },
      +          "flat": {
      +            "type": "number"
      +          },
      +          "includesProficiency": {
      +            "type": "boolean"
      +          },
      +          "modifierSource": {
      +            "enum": [
      +              "spellcasting",
      +              "attackAttribute",
      +              "strength",
      +              "dexterity",
      +              "constitution",
      +              "intelligence",
      +              "wisdom",
      +              "charisma"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "audience": {
      +        "enum": [
      +          "self",
      +          "ally",
      +          "any",
      +          "target",
      +          "enemy"
      +        ],
      +        "type": "string"
      +      },
      +      "durationCount": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "durationUnit": {
      +        "enum": [
      +          "instantaneous",
      +          "untilStartOfNextTurn",
      +          "untilEndOfNextTurn",
      +          "round",
      +          "minute",
      +          "hour",
      +          "untilShortRest",
      +          "untilLongRest"
      +        ],
      +        "type": "string"
      +      },
      +      "ignoreResistances": {
      +        "type": "boolean"
      +      },
      +      "inheritDamageType": {
      +        "type": "boolean"
      +      },
      +      "range": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "requires": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "armorCategories": {
      +              "description": "For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "condition": {
      +              "description": "For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states).",
      +              "enum": [
      +                "blinded",
      +                "charmed",
      +                "dazed",
      +                "deafened",
      +                "exhaustion",
      +                "frightened",
      +                "grappled",
      +                "incapacitated",
      +                "invisible",
      +                "paralyzed",
      +                "petrified",
      +                "poisoned",
      +                "prone",
      +                "restrained",
      +                "stunned",
      +                "unconscious",
      +                "concentrating",
      +                "grappling",
      +                "dodging",
      +                "hiding",
      +                "raging"
      +              ],
      +              "type": "string"
      +            },
      +            "equipSlot": {
      +              "description": "Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both.",
      +              "enum": [
      +                "mainHand",
      +                "offHand"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.",
      +              "type": "boolean"
      +            },
      +            "slot": {
      +              "description": "For 'equipped' predicates: the body category to match (armor / shield / weapon).",
      +              "enum": [
      +                "armor",
      +                "shield",
      +                "weapon"
      +              ],
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "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.",
      +              "enum": [
      +                "equipped",
      +                "attackingWeapon",
      +                "condition"
      +              ],
      +              "type": "string"
      +            },
      +            "weaponProperties": {
      +              "description": "For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requiresLogic": {
      +        "enum": [
      +          "and",
      +          "or"
      +        ],
      +        "type": "string"
      +      },
      +      "triggerEvent": {
      +        "enum": [
      +          "startOfYourTurn",
      +          "endOfYourTurn",
      +          "startOfTargetTurn",
      +          "endOfTargetTurn",
      +          "whenTargetEntersArea",
      +          "onHit",
      +          "onMiss",
      +          "onDamage"
      +        ],
      +        "type": "string"
      +      },
      +      "types": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / resistances
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "mode": {
      +        "enum": [
      +          "resistance",
      +          "immunity",
      +          "vulnerability"
      +        ],
      +        "type": "string"
      +      },
      +      "range": {
      +        "description": "Aura radius in feet for ally/any-targeted resistances (Warding Aura's 10 ft.). Absent = self-only.",
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "target": {
      +        "description": "Who the resistance protects — mirrors damageReduction's target/range pair. Absent = self.",
      +        "enum": [
      +          "self",
      +          "ally",
      +          "any",
      +          "target",
      +          "enemy"
      +        ],
      +        "type": "string"
      +      },
      +      "trigger": {
      +        "enum": [
      +          "passive",
      +          "toggled",
      +          "reaction",
      +          "perRoll",
      +          "resource",
      +          "targetBound"
      +        ],
      +        "type": "string"
      +      },
      +      "types": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / rollMods
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "audience": {
      +        "enum": [
      +          "self",
      +          "ally",
      +          "any",
      +          "target",
      +          "enemy"
      +        ],
      +        "type": "string"
      +      },
      +      "consumeOnUse": {
      +        "type": "boolean"
      +      },
      +      "durationCount": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "durationUnit": {
      +        "enum": [
      +          "instantaneous",
      +          "untilStartOfNextTurn",
      +          "untilEndOfNextTurn",
      +          "round",
      +          "minute",
      +          "hour",
      +          "untilShortRest",
      +          "untilLongRest"
      +        ],
      +        "type": "string"
      +      },
      +      "mode": {
      +        "enum": [
      +          "advantage",
      +          "disadvantage"
      +        ],
      +        "type": "string"
      +      },
      +      "range": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "requires": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "armorCategories": {
      +              "description": "For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "condition": {
      +              "description": "For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states).",
      +              "enum": [
      +                "blinded",
      +                "charmed",
      +                "dazed",
      +                "deafened",
      +                "exhaustion",
      +                "frightened",
      +                "grappled",
      +                "incapacitated",
      +                "invisible",
      +                "paralyzed",
      +                "petrified",
      +                "poisoned",
      +                "prone",
      +                "restrained",
      +                "stunned",
      +                "unconscious",
      +                "concentrating",
      +                "grappling",
      +                "dodging",
      +                "hiding",
      +                "raging"
      +              ],
      +              "type": "string"
      +            },
      +            "equipSlot": {
      +              "description": "Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both.",
      +              "enum": [
      +                "mainHand",
      +                "offHand"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.",
      +              "type": "boolean"
      +            },
      +            "slot": {
      +              "description": "For 'equipped' predicates: the body category to match (armor / shield / weapon).",
      +              "enum": [
      +                "armor",
      +                "shield",
      +                "weapon"
      +              ],
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "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.",
      +              "enum": [
      +                "equipped",
      +                "attackingWeapon",
      +                "condition"
      +              ],
      +              "type": "string"
      +            },
      +            "weaponProperties": {
      +              "description": "For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requiresLogic": {
      +        "enum": [
      +          "and",
      +          "or"
      +        ],
      +        "type": "string"
      +      },
      +      "rollScope": {
      +        "enum": [
      +          "attack",
      +          "save",
      +          "abilityCheck",
      +          "skillCheck"
      +        ],
      +        "type": "string"
      +      },
      +      "trigger": {
      +        "enum": [
      +          "passive",
      +          "toggled",
      +          "reaction",
      +          "perRoll",
      +          "resource",
      +          "targetBound"
      +        ],
      +        "type": "string"
      +      },
      +      "triggerEvent": {
      +        "enum": [
      +          "onHit",
      +          "onMiss",
      +          "onDamage",
      +          "startOfYourTurn",
      +          "endOfYourTurn",
      +          "startOfTargetTurn",
      +          "endOfTargetTurn"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / ruleChoice
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "allowedCategories": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "allowedRuleParameters": {
      +      "additionalProperties": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "damageType": {
      +            "type": "string"
      +          },
      +          "number": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "range": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "speed": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "allowedRules": {
      +      "items": {
      +        "description": "Mongo `_id` reference (24-character hex string).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "allowedTypes": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "count": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "label": {
      +      "type": "string"
      +    },
      +    "mode": {
      +      "enum": [
      +        "filter",
      +        "specific"
      +      ],
      +      "type": "string"
      +    },
      +    "progression": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "count": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "level": {
      +            "maximum": 20,
      +            "minimum": 1,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "scaling": {
      +      "enum": [
      +        "fixed",
      +        "byLevel"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / ruleset
      Added value: +{
      +  "description": "Ruleset code (e.g. '5th Edition', '5e24', 'PFRPG', 'Savage Worlds').",
      +  "type": "string"
      +}
    • addedInput schema / properties / source
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / spellChoices
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "allowedCategories": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "allowedSchools": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "allowedSpells": {
      +        "items": {
      +          "description": "Mongo `_id` reference (24-character hex string).",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "castingAbility": {
      +        "enum": [
      +          "strength",
      +          "dexterity",
      +          "constitution",
      +          "intelligence",
      +          "wisdom",
      +          "charisma"
      +        ],
      +        "type": "string"
      +      },
      +      "castingAbilityOptions": {
      +        "items": {
      +          "enum": [
      +            "strength",
      +            "dexterity",
      +            "constitution",
      +            "intelligence",
      +            "wisdom",
      +            "charisma"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "freeCast": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "atWill": {
      +            "type": "boolean"
      +          },
      +          "count": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "progression": {
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "count": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": 0,
      +                  "type": "integer"
      +                },
      +                "level": {
      +                  "maximum": 20,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "recovery": {
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "count": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": 0,
      +                  "type": "integer"
      +                },
      +                "on": {
      +                  "enum": [
      +                    "Short",
      +                    "Long"
      +                  ],
      +                  "type": "string"
      +                },
      +                "restoreAll": {
      +                  "type": "boolean"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "label": {
      +        "type": "string"
      +      },
      +      "maxLevel": {
      +        "maximum": 9,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "minLevel": {
      +        "maximum": 9,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "mode": {
      +        "enum": [
      +          "filter",
      +          "specific"
      +        ],
      +        "type": "string"
      +      },
      +      "prepared": {
      +        "type": "boolean"
      +      },
      +      "progression": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "count": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "level": {
      +              "maximum": 20,
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / spellListChoices
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "allowedCategories": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "castingAbility": {
      +        "enum": [
      +          "strength",
      +          "dexterity",
      +          "constitution",
      +          "intelligence",
      +          "wisdom",
      +          "charisma"
      +        ],
      +        "type": "string"
      +      },
      +      "castingAbilityOptions": {
      +        "items": {
      +          "enum": [
      +            "strength",
      +            "dexterity",
      +            "constitution",
      +            "intelligence",
      +            "wisdom",
      +            "charisma"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "label": {
      +        "type": "string"
      +      },
      +      "picks": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "count": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "freeCast": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "atWill": {
      +                  "type": "boolean"
      +                },
      +                "count": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": 0,
      +                  "type": "integer"
      +                },
      +                "progression": {
      +                  "items": {
      +                    "additionalProperties": {},
      +                    "properties": {
      +                      "count": {
      +                        "maximum": 9007199254740991,
      +                        "minimum": 0,
      +                        "type": "integer"
      +                      },
      +                      "level": {
      +                        "maximum": 20,
      +                        "minimum": 1,
      +                        "type": "integer"
      +                      }
      +                    },
      +                    "type": "object"
      +                  },
      +                  "type": "array"
      +                },
      +                "recovery": {
      +                  "items": {
      +                    "additionalProperties": {},
      +                    "properties": {
      +                      "count": {
      +                        "maximum": 9007199254740991,
      +                        "minimum": 0,
      +                        "type": "integer"
      +                      },
      +                      "on": {
      +                        "enum": [
      +                          "Short",
      +                          "Long"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "restoreAll": {
      +                        "type": "boolean"
      +                      }
      +                    },
      +                    "type": "object"
      +                  },
      +                  "type": "array"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "maxLevel": {
      +              "maximum": 9,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "minLevel": {
      +              "maximum": 9,
      +              "minimum": 0,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "prepared": {
      +        "type": "boolean"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / statBonuses
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "attribute": {
      +        "description": "For valueType: 'attribute' — which ability's modifier to use.",
      +        "type": "string"
      +      },
      +      "audience": {
      +        "description": "Who the bonus contributes to. Absent = self.",
      +        "enum": [
      +          "self",
      +          "ally",
      +          "any",
      +          "target",
      +          "enemy"
      +        ],
      +        "type": "string"
      +      },
      +      "dice": {
      +        "description": "For valueType: 'dice' — dice expression (e.g. '1d4').",
      +        "type": "string"
      +      },
      +      "durationCount": {
      +        "description": "Numeric count paired with durationUnit (e.g. count: 3, unit: 'round').",
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "durationUnit": {
      +        "description": "How long the bonus persists once fired. Only meaningful for event-driven bonuses.",
      +        "enum": [
      +          "instantaneous",
      +          "untilStartOfNextTurn",
      +          "untilEndOfNextTurn",
      +          "round",
      +          "minute",
      +          "hour",
      +          "untilShortRest",
      +          "untilLongRest"
      +        ],
      +        "type": "string"
      +      },
      +      "fixed": {
      +        "description": "For valueType: 'fixed' — the literal numeric contribution.",
      +        "type": "number"
      +      },
      +      "progression": {
      +        "description": "For valueType: 'byLevel' — per-level rows; walker picks the row with level <= current level.",
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "dice": {
      +              "type": "string"
      +            },
      +            "flat": {
      +              "type": "number"
      +            },
      +            "level": {
      +              "maximum": 20,
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "range": {
      +        "description": "Aura radius in feet for ally/any-audience bonuses (Aura of Protection's 10 ft.). Absent = no range filter.",
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "requires": {
      +        "description": "Optional predicate list that gates this bonus. Absent / empty = always-on.",
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "armorCategories": {
      +              "description": "For 'equipped' + slot:armor: armor category list (Light / Medium / Heavy). OR semantics — match any.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "condition": {
      +              "description": "For 'condition' predicates: the character-state condition to gate on (5e24 named conditions and ongoing-action states).",
      +              "enum": [
      +                "blinded",
      +                "charmed",
      +                "dazed",
      +                "deafened",
      +                "exhaustion",
      +                "frightened",
      +                "grappled",
      +                "incapacitated",
      +                "invisible",
      +                "paralyzed",
      +                "petrified",
      +                "poisoned",
      +                "prone",
      +                "restrained",
      +                "stunned",
      +                "unconscious",
      +                "concentrating",
      +                "grappling",
      +                "dodging",
      +                "hiding",
      +                "raging"
      +              ],
      +              "type": "string"
      +            },
      +            "equipSlot": {
      +              "description": "Body slot the matched weapon must occupy. mainHand / offHand. Resolved via getRequiredSlots so two-handed grips occupy both.",
      +              "enum": [
      +                "mainHand",
      +                "offHand"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "description": "true inverts the predicate — 'while NOT matching' instead of 'while matching'.",
      +              "type": "boolean"
      +            },
      +            "slot": {
      +              "description": "For 'equipped' predicates: the body category to match (armor / shield / weapon).",
      +              "enum": [
      +                "armor",
      +                "shield",
      +                "weapon"
      +              ],
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "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.",
      +              "enum": [
      +                "equipped",
      +                "attackingWeapon",
      +                "condition"
      +              ],
      +              "type": "string"
      +            },
      +            "weaponProperties": {
      +              "description": "For 'equipped' + slot:weapon OR 'attackingWeapon': weapon-property list. AND semantics — match all.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "requiresLogic": {
      +        "description": "How `requires` predicates compose. 'and' (default) = ALL must hold. 'or' = ANY one is sufficient.",
      +        "enum": [
      +          "and",
      +          "or"
      +        ],
      +        "type": "string"
      +      },
      +      "target": {
      +        "description": "Stat the bonus contributes to (e.g. 'skills.Acrobatics.misc', 'attributes.strength.misc').",
      +        "type": "string"
      +      },
      +      "trigger": {
      +        "description": "Action-economy / cost shape of the bonus. passive / toggled / reaction / perRoll / resource / targetBound.",
      +        "enum": [
      +          "passive",
      +          "toggled",
      +          "reaction",
      +          "perRoll",
      +          "resource",
      +          "targetBound"
      +        ],
      +        "type": "string"
      +      },
      +      "triggerEvent": {
      +        "description": "Game-time event that fires the bonus (onHit / onDamage / startOfYourTurn / etc.). Absent = not event-driven (passive walker contributes whenever `requires` holds).",
      +        "enum": [
      +          "onHit",
      +          "onMiss",
      +          "onDamage",
      +          "startOfYourTurn",
      +          "endOfYourTurn",
      +          "startOfTargetTurn",
      +          "endOfTargetTurn"
      +        ],
      +        "type": "string"
      +      },
      +      "types": {
      +        "description": "Damage type tags for damage.* targets. No-op for non-damage targets.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "valueType": {
      +        "description": "How the contribution is computed. 'fixed' uses `fixed`; 'attribute' uses the mod of `attribute`; 'attackAttribute' uses the action's attack-roll ability (per-attack only); others scale by level/PB/dice.",
      +        "enum": [
      +          "fixed",
      +          "attribute",
      +          "proficiency",
      +          "level",
      +          "halfLevel",
      +          "dice",
      +          "byLevel",
      +          "attackAttribute"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / stealthDisadvantage
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / strengthRequirement
      Added value: +{
      +  "type": "number"
      +}
    • addedInput schema / properties / summary
      Added value: +{
      +  "description": "Short one-line summary.",
      +  "type": "string"
      +}
    • addedInput schema / properties / type
      Added value: +{
      +  "description": "Item type. Free-form per ruleset (Weapon, Armor, Tool, Adventuring Gear, Wondrous Item, etc.). Required at create.",
      +  "type": "string"
      +}
    • addedInput schema / properties / uses
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "count": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "mode": {
      +        "enum": [
      +          "fixed",
      +          "byLevel",
      +          "proficiency"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "progression": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "count": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "countAbility": {
      +              "enum": [
      +                "strength",
      +                "dexterity",
      +                "constitution",
      +                "intelligence",
      +                "wisdom",
      +                "charisma"
      +              ],
      +              "type": "string"
      +            },
      +            "countSource": {
      +              "enum": [
      +                "fixed",
      +                "proficiency",
      +                "abilityMod"
      +              ],
      +              "type": "string"
      +            },
      +            "level": {
      +              "maximum": 20,
      +              "minimum": 1,
      +              "type": "integer"
      +            },
      +            "slotLevel": {
      +              "maximum": 9,
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "recovery": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "count": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "on": {
      +              "enum": [
      +                "Short",
      +                "Long"
      +              ],
      +              "type": "string"
      +            },
      +            "restoreAll": {
      +              "type": "boolean"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "rest": {
      +        "enum": [
      +          "Short",
      +          "Long"
      +        ],
      +        "type": "string"
      +      },
      +      "slotLevel": {
      +        "maximum": 9,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / weaponType
      Added value: +{
      +  "description": "Weapon category ('Simple Melee', 'Martial Ranged', etc.).",
      +  "type": "string"
      +}
    • addedInput schema / properties / weight
      Added value: +{
      +  "type": "number"
      +}
    • addedInput schema / required
      Added value: +[
      +  "id",
      +  "baseUpdatedAt"
      +]
  3. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=true), but the description adds real value beyond them: optimistic-concurrency enforcement, that no fields not supplied are touched, and that a failed write is a no-op. It stops short of describing other mutation behaviors (e.g. validation of nested payloads, permission requirements) but the concurrency contract is the important one.

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

Conciseness5/5

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

Three sentences, front-loaded with the action, then the read-first routing, then the hard requirement and its failure mode. No filler and no repetition of annotation or schema content.

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

Completeness4/5

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

For a high-complexity mutation with an output schema already documenting the new `updatedAt`, the description supplies the critical missing contract (fresh-read token) and leaves field shape to vault_get_item as it explicitly instructs. Reasonably complete, though it could say more about which fields are patchable vs immutable.

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

Parameters3/5

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

Schema description coverage is only 35% across 51 parameters, so the description would ideally compensate. It richly documents baseUpdatedAt's verbatim-copy requirement and scopes `id`, but gives no guidance for the ~49 other optional nested fields; those must be inferred from property names, enums, and a vault_get_item read. Baseline 3 fits the partial compensation.

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

Purpose5/5

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

Specific verb + resource + scope: 'Patch fields on an existing user-authored item by id. Only supplied fields change.' It also distinguishes the tool from the read siblings it names (vault_search_items / vault_get_item), so an agent can tell what this 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.

Usage Guidelines5/5

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

Explicit preconditions and route: confirm the id with vault_search_items / vault_get_item first, and baseUpdatedAt must come from a fresh read of this exact record. It also names the failure mode (OUT_OF_SYNC, nothing written), which is exactly the guidance needed to use it correctly.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources