Skip to main content
Glama

Check a value against the fact it cites, before you publish it

emem_echo_verify
Read-onlyIdempotent

Verify a cited value against the signed fact before publishing, returning matches or drift to catch transcription errors.

Instructions

Grade a value you are about to emit against the signed fact your citation points at. Returns matches and, when it does not, the drift between what you were about to say and what emem holds. This is the step that turns a transcription error into a caught event instead of a silent wrong number: a model that resolves a fact correctly can still retype 0.2411 for 0.241103, and nothing else in the loop notices. Memory algebra: the verify operation (https://emem.dev/docs/model.html).

When to use: Call immediately before publishing, logging, or handing on any value you took from an emem fact, and treat a false matches as a gate rather than a warning. Pair it with value_verbatim from resolve: quote that exact decimal string rather than reformatting the number, then echo-verify what you actually emitted. For a due-diligence or compliance record this is what lets you assert every cited value was echo-verified with a signed check per citation instead of a promise. Accepts a bare cid too, so a damaged citation still grades rather than failing closed.

Example arguments: {"token":"emem:fact:defi.zb572.xoso.zb1ec:4qj3l4mgh7ch5kvxmkqspjdl6y42oqhm42khh3gostccpixkbz5q","claimed_value":"-0.0522"}

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tokenYesThe citation you used. Any form resolve accepts, including a bare cid, which answers with `degraded: true`: a bare cid asserts no location, so the cell-binding check is skipped and the grade covers the value only. A cid that is not 52 characters is refused as a damaged citation rather than as a missing one, and must not be retried.
strictNoRequire BYTE-IDENTICAL equality. Default false, which also accepts a numerically equal value spelled differently (0.50 for 0.5). It changes exactly one outcome: the numerically-equal-but-respelled case, which passes by default and becomes `drift: "reformatted"` here. `rounded` and `wrong` already fail either way, so `strict` never turns a pass into a pass. It is also inert when `claimed_value` came in as a JSON number, because the respelling then happened in the JSON parser, before this tool saw it.
claimed_valueYesThe value you are about to publish, as a string or a number. Send it as a STRING, character for character as you will emit it. A JSON number is stringified before the comparison, so `0.50` arrives as `0.5` and `0.2411000` as `0.2411` (measured against the live responder): the trailing digits this check exists to defend are gone before it runs. Quote `value_verbatim` from resolve as a string and echo the exact characters you will publish.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
driftNoThe difference between what you wrote and what emem holds, when they disagree. Explicit null on an exact match: the key is always present, so branch on its value rather than on whether it exists. Declaring this `string` alone was a live schema violation on every matching call, which is how it was found.
tokenYesThe citation you passed, echoed back exactly as sent.
matchesYesWhether what you were about to publish agrees with the signed fact. Treat false as a gate, not a warning.
receiptNo
degradedNoTrue when a bare cid was passed and the cell binding could not be checked.
fact_cidNo
claimed_valueYesEchoed back, so a log line carries both sides of the comparison.
canonical_tokenNoThe token in its canonical spelling, whatever form you passed.
offline_verify_atNoWhere to re-run this check without trusting this responder.
resolved_value_verbatimNoThe fact's value as the exact decimal string it was signed as. Quote this rather than reformatting it.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv1.3.8
    • changedInput schema / properties / claimed_value / description
      Previous value: -"The value you are about to publish, as a string or a number. A string is compared verbatim first, which is what catches a retype a float comparison would forgive."New value: +"The value you are about to publish, as a string or a number. Send it as a STRING, character for character as you will emit it. A JSON number is stringified before the comparison, so `0.50` arrives as `0.5` and `0.2411000` as `0.2411` (measured against the live responder): the trailing digits this check exists to defend are gone before it runs. Quote `value_verbatim` from resolve as a string and echo the exact characters you will publish."
    • changedInput schema / properties / strict / description
      Previous value: -"Require BYTE-IDENTICAL equality. Default false, which also accepts a numerically equal value spelled differently (0.50 for 0.5)."New value: +"Require BYTE-IDENTICAL equality. Default false, which also accepts a numerically equal value spelled differently (0.50 for 0.5). It changes exactly one outcome: the numerically-equal-but-respelled case, which passes by default and becomes `drift: \"reformatted\"` here. `rounded` and `wrong` already fail either way, so `strict` never turns a pass into a pass. It is also inert when `claimed_value` came in as a JSON number, because the respelling then happened in the JSON parser, before this tool saw it."
    • changedInput schema / properties / token / description
      Previous value: -"The citation you used. Any form resolve accepts, including a bare cid (answers degraded)."New value: +"The citation you used. Any form resolve accepts, including a bare cid, which answers with `degraded: true`: a bare cid asserts no location, so the cell-binding check is skipped and the grade covers the value only. A cid that is not 52 characters is refused as a damaged citation rather than as a missing one, and must not be retried."
  2. Changed2 schema fields changedv1.3.5
    • changedOutput schema / properties / drift / description
      Previous value: -"Present when it does not match: the difference between what you wrote and what emem holds."New value: +"The difference between what you wrote and what emem holds, when they disagree. Explicit null on an exact match: the key is always present, so branch on its value rather than on whether it exists. Declaring this `string` alone was a live schema violation on every matching call, which is how it was found."
    • changedOutput schema / properties / drift / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
  3. Changed1 schema field changedv1.3.4
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "canonical_token": {
      +      "description": "The token in its canonical spelling, whatever form you passed.",
      +      "type": "string"
      +    },
      +    "claimed_value": {
      +      "description": "Echoed back, so a log line carries both sides of the comparison.",
      +      "type": "string"
      +    },
      +    "degraded": {
      +      "description": "True when a bare cid was passed and the cell binding could not be checked.",
      +      "type": "boolean"
      +    },
      +    "drift": {
      +      "description": "Present when it does not match: the difference between what you wrote and what emem holds.",
      +      "type": "string"
      +    },
      +    "fact_cid": {
      +      "type": "string"
      +    },
      +    "matches": {
      +      "description": "Whether what you were about to publish agrees with the signed fact. Treat false as a gate, not a warning.",
      +      "type": "boolean"
      +    },
      +    "offline_verify_at": {
      +      "description": "Where to re-run this check without trusting this responder.",
      +      "type": "string"
      +    },
      +    "receipt": {
      +      "type": "object"
      +    },
      +    "resolved_value_verbatim": {
      +      "description": "The fact's value as the exact decimal string it was signed as. Quote this rather than reformatting it.",
      +      "type": "string"
      +    },
      +    "token": {
      +      "description": "The citation you passed, echoed back exactly as sent.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "matches",
      +    "token",
      +    "claimed_value"
      +  ],
      +  "type": "object"
      +}
  4. Addedv1.3.0

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations, the description discloses several non-obvious behaviors: bare cid produces degraded:true while skipping the cell-binding check, non-52-character cids are refused as damaged, strict changes exactly one outcome, and JSON numbers lose trailing digits before comparison. This is substantial behavioral context that annotations alone cannot convey.

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

Conciseness4/5

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

The description is front-loaded with the core behavior, then moves into usage, edge cases, and an example. It is longer than strictly necessary because of motivational framing ('nothing else in the loop notices') and repeated schema guidance, but the organization keeps the extra length usable.

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

Completeness5/5

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

For a verification tool with an output schema and non-destructive/idempotent annotations, the description covers the essential call scenario, return semantics, failure modes, damaged-citation handling, exact-string requirement, and a concrete example. An agent has what it needs to invoke the tool correctly.

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

Parameters4/5

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

The input schema already explains all three parameters with 100% coverage, so the baseline is met. The prose adds practical emphasis on sending claimed_value as an exact string and pairing it with value_verbatim, which reinforces the schema's warnings, though it largely echoes rather than substantially extends the schema.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Grade a value you are about to emit against the signed fact your citation points at,' and it states the main outcome (matches/drift). It does not explicitly contrast itself with sibling tools such as emem_verify_receipt, so it stops just short of full sibling differentiation.

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

Usage Guidelines4/5

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

'When to use: Call immediately before publishing, logging, or handing on any value you took from an emem fact' is an explicit trigger, and it gives clear behavior guidance ('treat a false matches as a gate'). It names a companion operation (value_verbatim from resolve) but does not list when-not-to-use conditions or explicit alternatives, so it lacks the full exclusion guidance for a 5.

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