Skip to main content
Glama
littlebigbrains

@littlebigbrain/mcp

lbb_evals

Manage ground-truth evaluations for app questions and searches: label traces, freeze golden queries, run commit checks, and compare workflow experiments.

Instructions

Managed evals: ground truth for the questions an app asks and the searches it runs. A query run with request (lbb_query, also mode=question) records a trace: the question, the query that answered it, the type of that query (query_type: sparql, hybrid = search by meaning with conditions, search = search by meaning alone) and one item per result (hit or row); trace reads it back with the item ids. label has two forms. On a question's trace, valid alone judges the whole answer: valid=true makes the trace's query the golden query of the question; valid=false with sparql gives the right query, which becomes the golden query; valid=false alone marks the answer wrong; route with valid=true (or valid=false with sparql) names the route the question expects, and valid=true alone takes the trace's route. item + valid (or items) judges one result, a citation of the answer: the ground truth of the hits of a search by meaning, and a result marked wrong must not come back for any type. golden freezes a stored query or a search (every result it returns now is relevant). run checks every golden at the current commit: a question is asked again through the query rewriter, then the type of the query it wrote is compared with the expected type, its rows with the rows of the golden query at the same commit (query_check), and its results with the judged results, and the router's pick with the golden's route (route_check, which does not change the verdict); a search is done again; new results open a review trace. run_answers checks your own app's answers instead: ask each question golden's request with your own loop, then send answers=[{golden, sparql, route}] (route = the route of lbb_query mode=question with route mode, sparql absent for an unanswerable question, error for a failure); the server runs each query and checks it the same way, and the runs form the app's own series (runner; results with runner reads them). judge lets the platform's judge model (the hosted frontier model) label unlabeled results. summary, traces, goldens, results, and settings read state. Model checks: a judge model checks a sample of the model calls LBB makes for the graph (rerank, route, ask = the answer of a question, rewrite, fit, propose, label). checks_summary reads a month per job and model (checks, score, right, partly, wrong, reviews) and the judge's agreement with people; checks lists the month's checks, newest first, with the judge's verdict, score and reason and the ground truth (truth). review_check records a person's review of one check (call_id): agree=true keeps the judge's verdict; agree=false with verdict (and an optional score, reference and note) corrects it. The review becomes the call's ground truth, so show the check to the user and review only what the user confirmed. Datasets: named sets of examples with the outputs a correct run gives, which workflow tests and template evals share. The kind values holds per item an input text (name, text, iri), the property values a correct run writes (values) and those it must leave out (leave_out). datasets lists the graph's datasets, newest first, without their items (one page with next_cursor); datasets_get reads one (id) with its items; datasets_export returns it as a template's samples, records (records.json) and expected (expected.json). datasets_create makes one with name and items (at most 500), install (the settings it is graded with: each property's value type, units, context) and about, or from a workflow test's answers with source={kind: test, id}. datasets_items adds items to a dataset (id); an item with the name of one it holds replaces it. Delete a dataset with lbb_evals_delete, which asks the person first. A dataset ends with its graph. Experiments: two configurations of a workflow, A and B, on the items of a dataset, with the difference of B against A and its 95% interval. A is the workflow as it runs now; b changes one part: {model: {use: extract or decide, model: {provider, model, effort}}} (a model from lbb_model_choice action=choices options) or {revision: wrev_…} (a kept settings revision), not both. Each arm runs as a workflow test that writes nothing to the graph and spends model budget; each item is graded against the dataset's labels. experiments_estimate shows the cost first (items, the cost of both arms, the limit, the budget left): call it, show the user the figures, and start only what the user confirmed. experiments_create starts one (workflow, dataset, b, optionally max_items up to 200 and max_cost_usd up to 100, default 5); poll experiment (id) until its status is done, failed or cancelled, and read report.delta with ci_low and ci_high (outcome too_few under 10 items, else better, worse or same) and the item rows. experiments lists them (workflow, dataset, status, one page with next_cursor); experiments_cancel stops one, keeping what it compared. None of them changes the workflow or the graph. To use B, make the change with the experiment's id: lbb_model_choice_manage action=put_choice (or lbb_workflows_manage action=activate) with experiment, after the user confirmed; it fails with experiment_outdated when the workflow moved since.

Input Schema

NameRequiredDescriptionDefault
bNoexperiments_estimate, experiments_create: what B changes in A: {model: {use, model: {provider, model, effort}}} or {revision}, not both.
byNolabel: who labels (an agent name).
idNodatasets_get, datasets_export, datasets_items: the dataset's id (ds_…). experiment, experiments_cancel: the experiment's id (exp_…).
jobNochecks: only the checks of one job.
itemNolabel: the result id (a hit's `id`, or an item id from trace) to label with `valid`.
kindNodatasets_create: what the items hold: values (the default).
nameNodatasets_create: the dataset's name.
noteNolabel / review_check: why. review_check: at most 2,000 characters.
aboutNodatasets_create: what the dataset is, in sentences.
afterNochecks: the next_after of the previous page.
agreeNoreview_check: true = the judge is right, false = correct it with verdict.
graphNoGraph to target; defaults to the connection's graph
itemsNolabel: several results at once, each {id, valid, note}. datasets_create, datasets_items: the examples, at most 500, each {name, text, values, leave_out, iri, case}; values and leave_out hold {property, value, accept, stated, quote, reason, source}; source says which person's answer gave a label (kind test or review, id, at): send it back as read, or leave it out.
limitNo
monthNochecks_summary / checks: the month, yyyy-mm (UTC). Defaults to the current month.
routeNolabel: with valid=true, or valid=false with sparql, the route the question expects.
scoreNoreview_check with agree=false: the right score, 0 to 1. Omit for the judge's score of that verdict.
top_kNogolden: the top_k of a search golden.
validNolabel: true = the result answers the request (thumbs up), false = it does not. Without item or items, on a question's trace: the whole answer is right (true) or wrong (false).
actionYes
cursorNodatasets, experiments: the next_cursor of the page before.
detailNoResponse detail level. Defaults to compact.
runnerNorun_answers / results: your app's name, lower-case letters, digits and -, at most 40 characters (default app). results without runner reads the server's runs.
sourceNodatasets_create: {"kind": "test", "id": <test id>}: the answers of a workflow test become the items, and its settings the install.
sparqlNogolden: the query to freeze (the search text for surface=search). label: with valid=false and no item, the right query for the question; the server checks and runs it once.
statusNoexperiments: only the experiments with this status.
answersNorun_answers: one answer per question golden your app asked: golden (its id), sparql (the query whose rows hold the answer; leave it out when the question is unanswerable), entailment, as_of_commit_seq, route (as the router returned it), reply, error (your app failed), cost_micro_usd.
call_idNoreview_check: the check's `call` id, from checks.
datasetNoexperiments_estimate, experiments_create: the dataset (ds_…) whose items both arms run. experiments: only the experiments on this dataset.
installNodatasets_create: the settings it is graded with.
requestNogolden: the user's words the query answers.
surfaceNogolden: which surface the query runs on (default sparql).
verdictNochecks: only the checks whose ground truth has this verdict. review_check with agree=false: the right verdict.
reviewedNochecks: true = only the checks a person reviewed, false = only the others.
trace_idNotrace / label / judge: the trace id from lbb_query.
workflowNoexperiments_estimate, experiments_create: the workflow to compare. experiments: only the experiments of this workflow.
embeddingNogolden: the embedding, for surface=search.
golden_idNoaccept / delete: the golden id.
max_itemsNoexperiments_estimate, experiments_create: run the dataset's first items only (default 200).
referenceNoreview_check with agree=false: the right answer. A rerank or label check: {"grades": {"<hit id>": 0..3}}; a route or fit check: {"picks": {"<question id>": "<option>"}}.
unlabeledNotraces: only traces without a label.
consistencyNorun / run_answers / accept: strong reads the head, eventual the last published commit.
max_cost_usdNoexperiments_estimate, experiments_create: the cost limit of both arms in US dollars (default 5).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changedv0.17.0
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "summary",
      -  "traces",
      -  "trace",
      -  "label",
      -  "judge",
      -  "goldens",
      -  "golden",
      -  "accept",
      -  "delete",
      -  "run",
      -  "run_answers",
      -  "results",
      -  "settings",
      -  "checks_summary",
      -  "checks",
      -  "review_check",
      -  "datasets",
      -  "datasets_get",
      -  "datasets_export",
      -  "datasets_create",
      -  "datasets_items"
      -]New value: +[
      +  "summary",
      +  "traces",
      +  "trace",
      +  "label",
      +  "judge",
      +  "goldens",
      +  "golden",
      +  "accept",
      +  "delete",
      +  "run",
      +  "run_answers",
      +  "results",
      +  "settings",
      +  "checks_summary",
      +  "checks",
      +  "review_check",
      +  "datasets",
      +  "datasets_get",
      +  "datasets_export",
      +  "datasets_create",
      +  "datasets_items",
      +  "experiments",
      +  "experiment",
      +  "experiments_estimate",
      +  "experiments_create",
      +  "experiments_cancel"
      +]
    • addedInput schema / properties / b
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "experiments_estimate, experiments_create: what B changes in A: {model: {use, model: {provider, model, effort}}} or {revision}, not both.",
      +  "properties": {
      +    "model": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "model": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "effort": {
      +              "description": "The effort of a Claude model",
      +              "type": "string"
      +            },
      +            "model": {
      +              "description": "A model of the use's options",
      +              "type": "string"
      +            },
      +            "provider": {
      +              "description": "anthropic, typesafe or mock",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "provider",
      +            "model"
      +          ],
      +          "type": "object"
      +        },
      +        "use": {
      +          "description": "The use whose model B changes",
      +          "enum": [
      +            "extract",
      +            "decide"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "use",
      +        "model"
      +      ],
      +      "type": "object"
      +    },
      +    "revision": {
      +      "description": "A kept settings revision of the workflow (wrev_…)",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / cursor / description
      Previous value: -"datasets: the next_cursor of the page before."New value: +"datasets, experiments: the next_cursor of the page before."
    • addedInput schema / properties / dataset
      Added value: +{
      +  "description": "experiments_estimate, experiments_create: the dataset (ds_…) whose items both arms run. experiments: only the experiments on this dataset.",
      +  "type": "string"
      +}
    • changedInput schema / properties / id / description
      Previous value: -"datasets_get, datasets_export, datasets_items: the dataset's id (ds_…)."New value: +"datasets_get, datasets_export, datasets_items: the dataset's id (ds_…). experiment, experiments_cancel: the experiment's id (exp_…)."
    • changedInput schema / properties / items / description
      Previous value: -"label: several results at once, each {id, valid, note}. datasets_create, datasets_items: the examples, at most 500, each {name, text, values, leave_out, iri, case}; values and leave_out hold {property, value, accept, stated, quote, reason}."New value: +"label: several results at once, each {id, valid, note}. datasets_create, datasets_items: the examples, at most 500, each {name, text, values, leave_out, iri, case}; values and leave_out hold {property, value, accept, stated, quote, reason, source}; source says which person's answer gave a label (kind test or review, id, at): send it back as read, or leave it out."
    • changedInput schema / properties / items / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "id": {
      -        "type": "string"
      -      },
      -      "note": {
      -        "type": "string"
      -      },
      -      "valid": {
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "valid"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "case": {
      -        "description": "What the example shows, in one sentence",
      -        "type": "string"
      -      },
      -      "iri": {
      -        "description": "The instance the input came from",
      -        "type": "string"
      -      },
      -      "leave_out": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "accept": {
      -              "description": "Other spellings a text value may take, lower case",
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "property": {
      -              "type": "string"
      -            },
      -            "quote": {
      -              "description": "Words of the text that state the value",
      -              "type": "string"
      -            },
      -            "reason": {
      -              "description": "Why a value is left out",
      -              "type": "string"
      -            },
      -            "stated": {
      -              "description": "The number and unit as the text states them, e.g. 450 mm",
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "Numbers compare as numbers, text in lower case. In leave_out, null means no value at all",
      -              "type": [
      -                "number",
      -                "string",
      -                "boolean",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "property",
      -            "value"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "name": {
      -        "description": "The input's name, unique in the dataset; the same name replaces",
      -        "type": "string"
      -      },
      -      "source": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "id": {
      -            "type": "string"
      -          },
      -          "kind": {
      -            "enum": [
      -              "test",
      -              "review",
      -              "answer_key"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "kind"
      -        ],
      -        "type": "object"
      -      },
      -      "text": {
      -        "description": "The input text, at most 40,000 characters",
      -        "maxLength": 40000,
      -        "type": "string"
      -      },
      -      "values": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "accept": {
      -              "description": "Other spellings a text value may take, lower case",
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "property": {
      -              "type": "string"
      -            },
      -            "quote": {
      -              "description": "Words of the text that state the value",
      -              "type": "string"
      -            },
      -            "reason": {
      -              "description": "Why a value is left out",
      -              "type": "string"
      -            },
      -            "stated": {
      -              "description": "The number and unit as the text states them, e.g. 450 mm",
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "Numbers compare as numbers, text in lower case. In leave_out, null means no value at all",
      -              "type": [
      -                "number",
      -                "string",
      -                "boolean",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "property",
      -            "value"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "note": {
      +        "type": "string"
      +      },
      +      "valid": {
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "valid"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "case": {
      +        "description": "What the example shows, in one sentence",
      +        "type": "string"
      +      },
      +      "iri": {
      +        "description": "The instance the input came from",
      +        "type": "string"
      +      },
      +      "leave_out": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "accept": {
      +              "description": "Other spellings a text value may take, lower case",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "property": {
      +              "type": "string"
      +            },
      +            "quote": {
      +              "description": "Words of the text that state the value",
      +              "type": "string"
      +            },
      +            "reason": {
      +              "description": "Why a value is left out",
      +              "type": "string"
      +            },
      +            "source": {
      +              "additionalProperties": false,
      +              "description": "Who gave the label and when: a person's answer on a test (wtest_…) or a review item (rev_…). Send it back as read, or leave it out",
      +              "properties": {
      +                "at": {
      +                  "type": "string"
      +                },
      +                "id": {
      +                  "type": "string"
      +                },
      +                "kind": {
      +                  "enum": [
      +                    "test",
      +                    "review"
      +                  ],
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "kind",
      +                "id",
      +                "at"
      +              ],
      +              "type": "object"
      +            },
      +            "stated": {
      +              "description": "The number and unit as the text states them, e.g. 450 mm",
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Numbers compare as numbers, text in lower case. In leave_out, null means no value at all",
      +              "type": [
      +                "number",
      +                "string",
      +                "boolean",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "property",
      +            "value"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "name": {
      +        "description": "The input's name, unique in the dataset; the same name replaces",
      +        "type": "string"
      +      },
      +      "source": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "id": {
      +            "type": "string"
      +          },
      +          "kind": {
      +            "enum": [
      +              "test",
      +              "review",
      +              "answer_key"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "kind"
      +        ],
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "The input text, at most 40,000 characters",
      +        "maxLength": 40000,
      +        "type": "string"
      +      },
      +      "values": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "accept": {
      +              "description": "Other spellings a text value may take, lower case",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "property": {
      +              "type": "string"
      +            },
      +            "quote": {
      +              "description": "Words of the text that state the value",
      +              "type": "string"
      +            },
      +            "reason": {
      +              "description": "Why a value is left out",
      +              "type": "string"
      +            },
      +            "source": {
      +              "additionalProperties": false,
      +              "description": "Who gave the label and when: a person's answer on a test (wtest_…) or a review item (rev_…). Send it back as read, or leave it out",
      +              "properties": {
      +                "at": {
      +                  "type": "string"
      +                },
      +                "id": {
      +                  "type": "string"
      +                },
      +                "kind": {
      +                  "enum": [
      +                    "test",
      +                    "review"
      +                  ],
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "kind",
      +                "id",
      +                "at"
      +              ],
      +              "type": "object"
      +            },
      +            "stated": {
      +              "description": "The number and unit as the text states them, e.g. 450 mm",
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Numbers compare as numbers, text in lower case. In leave_out, null means no value at all",
      +              "type": [
      +                "number",
      +                "string",
      +                "boolean",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "property",
      +            "value"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / max_cost_usd
      Added value: +{
      +  "description": "experiments_estimate, experiments_create: the cost limit of both arms in US dollars (default 5).",
      +  "exclusiveMinimum": 0,
      +  "maximum": 100,
      +  "type": "number"
      +}
    • addedInput schema / properties / max_items
      Added value: +{
      +  "description": "experiments_estimate, experiments_create: run the dataset's first items only (default 200).",
      +  "maximum": 200,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / status
      Added value: +{
      +  "description": "experiments: only the experiments with this status.",
      +  "enum": [
      +    "queued",
      +    "running",
      +    "done",
      +    "failed",
      +    "cancelled"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / workflow
      Added value: +{
      +  "description": "experiments_estimate, experiments_create: the workflow to compare. experiments: only the experiments of this workflow.",
      +  "type": "string"
      +}
  2. Changed21 schema fields changedv0.16.0
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / about
      Added value: +{
      +  "description": "datasets_create: what the dataset is, in sentences.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "summary",
      -  "traces",
      -  "trace",
      -  "label",
      -  "judge",
      -  "goldens",
      -  "golden",
      -  "accept",
      -  "delete",
      -  "run",
      -  "run_answers",
      -  "results",
      -  "settings",
      -  "checks_summary",
      -  "checks",
      -  "review_check"
      -]New value: +[
      +  "summary",
      +  "traces",
      +  "trace",
      +  "label",
      +  "judge",
      +  "goldens",
      +  "golden",
      +  "accept",
      +  "delete",
      +  "run",
      +  "run_answers",
      +  "results",
      +  "settings",
      +  "checks_summary",
      +  "checks",
      +  "review_check",
      +  "datasets",
      +  "datasets_get",
      +  "datasets_export",
      +  "datasets_create",
      +  "datasets_items"
      +]
    • addedInput schema / properties / answers / items / properties / as_of_commit_seq / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / answers / items / properties / cost_micro_usd / maximum
      Added value: +9007199254740991
    • removedInput schema / properties / answers / items / properties / reply / additionalProperties
      Removed value: -false
    • addedInput schema / properties / answers / items / properties / route / properties / probabilities / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / cursor
      Added value: +{
      +  "description": "datasets: the next_cursor of the page before.",
      +  "type": "string"
      +}
    • addedInput schema / properties / id
      Added value: +{
      +  "description": "datasets_get, datasets_export, datasets_items: the dataset's id (ds_…).",
      +  "type": "string"
      +}
    • addedInput schema / properties / install
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "datasets_create: the settings it is graded with.",
      +  "properties": {
      +    "context": {
      +      "type": "string"
      +    },
      +    "properties": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "description": "Each property's value type: text, keyword, i64, f64 or bool",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "units": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "description": "The unit of each number property",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / items / description
      Previous value: -"label: several results at once."New value: +"label: several results at once, each {id, valid, note}. datasets_create, datasets_items: the examples, at most 500, each {name, text, values, leave_out, iri, case}; values and leave_out hold {property, value, accept, stated, quote, reason}."
    • removedInput schema / properties / items / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / items / items / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "note": {
      +        "type": "string"
      +      },
      +      "valid": {
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "valid"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "case": {
      +        "description": "What the example shows, in one sentence",
      +        "type": "string"
      +      },
      +      "iri": {
      +        "description": "The instance the input came from",
      +        "type": "string"
      +      },
      +      "leave_out": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "accept": {
      +              "description": "Other spellings a text value may take, lower case",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "property": {
      +              "type": "string"
      +            },
      +            "quote": {
      +              "description": "Words of the text that state the value",
      +              "type": "string"
      +            },
      +            "reason": {
      +              "description": "Why a value is left out",
      +              "type": "string"
      +            },
      +            "stated": {
      +              "description": "The number and unit as the text states them, e.g. 450 mm",
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Numbers compare as numbers, text in lower case. In leave_out, null means no value at all",
      +              "type": [
      +                "number",
      +                "string",
      +                "boolean",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "property",
      +            "value"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "name": {
      +        "description": "The input's name, unique in the dataset; the same name replaces",
      +        "type": "string"
      +      },
      +      "source": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "id": {
      +            "type": "string"
      +          },
      +          "kind": {
      +            "enum": [
      +              "test",
      +              "review",
      +              "answer_key"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "kind"
      +        ],
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "The input text, at most 40,000 characters",
      +        "maxLength": 40000,
      +        "type": "string"
      +      },
      +      "values": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "accept": {
      +              "description": "Other spellings a text value may take, lower case",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "property": {
      +              "type": "string"
      +            },
      +            "quote": {
      +              "description": "Words of the text that state the value",
      +              "type": "string"
      +            },
      +            "reason": {
      +              "description": "Why a value is left out",
      +              "type": "string"
      +            },
      +            "stated": {
      +              "description": "The number and unit as the text states them, e.g. 450 mm",
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Numbers compare as numbers, text in lower case. In leave_out, null means no value at all",
      +              "type": [
      +                "number",
      +                "string",
      +                "boolean",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "property",
      +            "value"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / items / items / properties
      Removed value: -{
      -  "id": {
      -    "type": "string"
      -  },
      -  "note": {
      -    "type": "string"
      -  },
      -  "valid": {
      -    "type": "boolean"
      -  }
      -}
    • removedInput schema / properties / items / items / required
      Removed value: -[
      -  "id",
      -  "valid"
      -]
    • removedInput schema / properties / items / items / type
      Removed value: -"object"
    • addedInput schema / properties / kind
      Added value: +{
      +  "description": "datasets_create: what the items hold: values (the default).",
      +  "enum": [
      +    "values"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / limit / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / name
      Added value: +{
      +  "description": "datasets_create: the dataset's name.",
      +  "type": "string"
      +}
    • addedInput schema / properties / reference / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / source
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "datasets_create: {\"kind\": \"test\", \"id\": <test id>}: the answers of a workflow test become the items, and its settings the install.",
      +  "properties": {
      +    "id": {
      +      "type": "string"
      +    },
      +    "kind": {
      +      "const": "test",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "id"
      +  ],
      +  "type": "object"
      +}
  3. Changed8 schema fields changedv0.14.0
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "summary",
      -  "traces",
      -  "trace",
      -  "label",
      -  "judge",
      -  "goldens",
      -  "golden",
      -  "accept",
      -  "delete",
      -  "run",
      -  "results",
      -  "settings",
      -  "checks_summary",
      -  "checks",
      -  "review_check"
      -]New value: +[
      +  "summary",
      +  "traces",
      +  "trace",
      +  "label",
      +  "judge",
      +  "goldens",
      +  "golden",
      +  "accept",
      +  "delete",
      +  "run",
      +  "run_answers",
      +  "results",
      +  "settings",
      +  "checks_summary",
      +  "checks",
      +  "review_check"
      +]
    • addedInput schema / properties / answers
      Added value: +{
      +  "description": "run_answers: one answer per question golden your app asked: golden (its id), sparql (the query whose rows hold the answer; leave it out when the question is unanswerable), entailment, as_of_commit_seq, route (as the router returned it), reply, error (your app failed), cost_micro_usd.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "as_of_commit_seq": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "cost_micro_usd": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "entailment": {
      +        "enum": [
      +          "none",
      +          "subclass",
      +          "rdfs",
      +          "owl"
      +        ],
      +        "type": "string"
      +      },
      +      "error": {
      +        "type": "string"
      +      },
      +      "golden": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "reply": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "citations": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "text": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "text"
      +        ],
      +        "type": "object"
      +      },
      +      "route": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "by": {
      +            "enum": [
      +              "caller",
      +              "router",
      +              "rewriter"
      +            ],
      +            "type": "string"
      +          },
      +          "confidence": {
      +            "type": "number"
      +          },
      +          "kind": {
      +            "enum": [
      +              "lookup",
      +              "aggregate",
      +              "search",
      +              "history",
      +              "schema",
      +              "unanswerable"
      +            ],
      +            "type": "string"
      +          },
      +          "probabilities": {
      +            "additionalProperties": {
      +              "type": "number"
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "kind",
      +          "confidence",
      +          "by"
      +        ],
      +        "type": "object"
      +      },
      +      "sparql": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "golden"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / consistency / description
      Previous value: -"run / accept: strong reads the head, eventual the last published commit."New value: +"run / run_answers / accept: strong reads the head, eventual the last published commit."
    • changedInput schema / properties / job / enum
      Previous value: -[
      -  "rerank",
      -  "route",
      -  "rewrite",
      -  "fit",
      -  "propose",
      -  "label"
      -]New value: +[
      +  "rerank",
      +  "route",
      +  "ask",
      +  "rewrite",
      +  "fit",
      +  "propose",
      +  "label"
      +]
    • addedInput schema / properties / route
      Added value: +{
      +  "description": "label: with valid=true, or valid=false with sparql, the route the question expects.",
      +  "enum": [
      +    "lookup",
      +    "aggregate",
      +    "search",
      +    "history",
      +    "schema",
      +    "unanswerable"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / runner
      Added value: +{
      +  "description": "run_answers / results: your app's name, lower-case letters, digits and -, at most 40 characters (default app). results without runner reads the server's runs.",
      +  "type": "string"
      +}
    • changedInput schema / properties / sparql / description
      Previous value: -"golden: the query to freeze (the search text for surface=search)."New value: +"golden: the query to freeze (the search text for surface=search). label: with valid=false and no item, the right query for the question; the server checks and runs it once."
    • changedInput schema / properties / valid / description
      Previous value: -"label: true = the result answers the request (thumbs up), false = it does not."New value: +"label: true = the result answers the request (thumbs up), false = it does not. Without item or items, on a question's trace: the whole answer is right (true) or wrong (false)."
  4. Changed11 schema fields changedv0.9.0
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "summary",
      -  "traces",
      -  "trace",
      -  "label",
      -  "judge",
      -  "goldens",
      -  "golden",
      -  "accept",
      -  "delete",
      -  "run",
      -  "results",
      -  "settings"
      -]New value: +[
      +  "summary",
      +  "traces",
      +  "trace",
      +  "label",
      +  "judge",
      +  "goldens",
      +  "golden",
      +  "accept",
      +  "delete",
      +  "run",
      +  "results",
      +  "settings",
      +  "checks_summary",
      +  "checks",
      +  "review_check"
      +]
    • addedInput schema / properties / after
      Added value: +{
      +  "description": "checks: the next_after of the previous page.",
      +  "type": "string"
      +}
    • addedInput schema / properties / agree
      Added value: +{
      +  "description": "review_check: true = the judge is right, false = correct it with verdict.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / call_id
      Added value: +{
      +  "description": "review_check: the check's `call` id, from checks.",
      +  "type": "string"
      +}
    • addedInput schema / properties / job
      Added value: +{
      +  "description": "checks: only the checks of one job.",
      +  "enum": [
      +    "rerank",
      +    "route",
      +    "rewrite",
      +    "fit",
      +    "propose",
      +    "label"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / month
      Added value: +{
      +  "description": "checks_summary / checks: the month, yyyy-mm (UTC). Defaults to the current month.",
      +  "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
      +  "type": "string"
      +}
    • addedInput schema / properties / note / description
      Added value: +"label / review_check: why. review_check: at most 2,000 characters."
    • addedInput schema / properties / reference
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "review_check with agree=false: the right answer. A rerank or label check: {\"grades\": {\"<hit id>\": 0..3}}; a route or fit check: {\"picks\": {\"<question id>\": \"<option>\"}}.",
      +  "type": "object"
      +}
    • addedInput schema / properties / reviewed
      Added value: +{
      +  "description": "checks: true = only the checks a person reviewed, false = only the others.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / score
      Added value: +{
      +  "description": "review_check with agree=false: the right score, 0 to 1. Omit for the judge's score of that verdict.",
      +  "maximum": 1,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / verdict
      Added value: +{
      +  "description": "checks: only the checks whose ground truth has this verdict. review_check with agree=false: the right verdict.",
      +  "enum": [
      +    "right",
      +    "partly",
      +    "wrong"
      +  ],
      +  "type": "string"
      +}
  5. Addedv0.5.2

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare non-readonly, non-destructive, closed-world behavior. The description adds substantial operational context: run_answers executes each query server-side, experiments spend model budget and write nothing to the graph, review_check becomes the call's ground truth, run checks at the current commit, and dataset deletion lives in a sibling tool.

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

Conciseness3/5

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

The content is front-loaded and the length is justified by 43 parameters and 26 actions, but it is delivered as one dense paragraph with little formatting. Many clauses are necessary, yet the wall-of-text presentation makes scanning harder than it should be.

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

Completeness5/5

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

With no output schema, the description still explains what state reads return, what checks_summary contains, how experiment report.delta and confidence intervals work, and how run_answers results form a series. Given the complexity, it is complete enough for an agent to call the tool correctly.

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

Parameters5/5

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

Schema description coverage is 95%, but the description still adds meaning beyond the schema: the two label forms, b's model/revision mutual exclusion, the answers shape for run_answers, source={kind:test,id} for dataset creation, and reference structures for review_check. It also explains parameter combinations such as valid=false with sparql.

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 opening sentence establishes a specific domain: managed evals as ground truth for app questions and searches, then names the major resources (traces, labels, goldens, checks, datasets, experiments). It also distinguishes sibling behavior by routing dataset deletion to lbb_evals_delete, though the 26-action scope prevents a single compact verb-resource summary.

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

Usage Guidelines5/5

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

The description explicitly states when to use run versus run_answers, when to call experiments_estimate before experiments_create, when deletion belongs to lbb_evals_delete, and how to apply an experiment via lbb_model_choice_manage after user confirmation. It provides the kind of when/when-not/alternative guidance an agent needs.

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