Skip to main content
Glama
LiLara-AI

ShadowGraph

Official

ShadowGraph

CI

Local-first decision memory for AI agents. ShadowGraph remembers what an agent decided, what it rejected, why it rejected it, and when that decision should be reconsidered.

Status: Technical Preview / Early Access. Install from GitHub — it is not on npm. See Limitations and Technical Preview status.

Why it matters

Chat memory remembers the conversation. It loses the decision.

Ask an agent three months later why the project uses SQLite and the useful part is already gone:

  • The choice may survive in a summary. The rejected alternative and the reason for rejecting it do not.

  • A fact changes — the deployment goes from single-user to multi-user — and nothing reopens the decision.

  • The same approach fails again, because the failed attempt was never recorded as a failed attempt.

ShadowGraph stores that reasoning as structured, inspectable data instead of prose: what was chosen, what was rejected, why, the assumptions and evidence behind it, failed attempts, outcomes, provenance, confidence history, and the conditions that should trigger a rethink.

The promise is deliberately narrow: important AI decisions should survive sessions and stay explainable, reviewable, and reconsiderable.

Who it is for: developers building agents on MCP, a CLI, or a local HTTP API who need consequential decisions to outlive a session. It is a decision store, not a transcript store, and it keeps everything on your machine.

Related MCP server: Memryzed

Quick Start — 5 minutes

Requirements

  • Node.js 20+ (the optional SQLite backend needs Node 22.5+ for node:sqlite)

  • No runtime npm dependencies, no build step, no account, no network calls

1. Install

ShadowGraph is not published to npm. During the Technical Preview, install it from this repository. A global install puts shadowgraph on your PATH, which is what MCP clients need:

npm install --global github:LiLara-AI/shadowgraph
git clone https://github.com/LiLara-AI/shadowgraph.git
cd shadowgraph
npm install
node src/cli.js setup
node src/cli.js doctor

Replace shadowgraph with node src/cli.js in every command below.

npm install shadowgraph-unified-plugin does not work and fails with E404. The package is private: true and unpublished, and the registry name is not reserved. This README will change if publication is ever approved.

2. JSON arguments and your shell

Every ShadowGraph command takes a single JSON argument, so quoting depends on your shell. Pick the row for the shell you are actually using — this is the most common reason a first command fails:

Shell

Form

Example

bash / zsh / Git Bash (macOS, Linux, WSL)

single quotes, plain JSON

shadowgraph recall '{"project":"demo"}'

Windows PowerShell

single quotes, \" inside

shadowgraph recall '{\"project\":\"demo\"}'

Windows cmd.exe

double quotes, \" inside

shadowgraph recall "{\"project\":\"demo\"}"

The examples below use the bash form. All three are tested on every command in this README.

3. Initialize a store

mkdir shadowgraph-demo
cd shadowgraph-demo
shadowgraph setup
shadowgraph doctor

setup creates .shadowgraph/data.json in the current directory, so run it where you want the store to live. It never rewrites an existing store. doctor then checks Node compatibility, storage readability and writability, graph validity, and the MCP entry point.

Run setup before doctor: on a fresh directory doctor reports Storage is not initialized and exits 1 until a store exists. That is expected, not a failed install.

4. Record a decision, restart, and get it back

shadowgraph decision '{"project":"checkout-service","title":"Choose the datastore","chosen":"SQLite","confidence":0.8,"alternatives":[{"label":"PostgreSQL","reasonRejected":"Single-user local deployment does not justify running a server","reopenWhen":[{"key":"deployment","operator":"equals","value":"multi-user"}]}]}'

shadowgraph fact '{"project":"checkout-service","key":"deployment","value":"single-user","sourceClass":"human_confirmed","confidence":1}'

shadowgraph search '{"query":"datastore","project":"checkout-service"}'

Each command runs in a new process and reopens the store from disk, so the search result comes back across a real restart, not from in-memory state. You now have a decision that carries its rejected alternative, the reason it was rejected, and the condition that should reopen it.

The demo: a decision that reopens itself

This is the whole point of ShadowGraph, in three commands. Continue in the same directory.

The decision is settled, so there is nothing to reconsider yet:

shadowgraph review '{"project":"checkout-service"}'
[]

Now the world changes. The deployment becomes multi-user:

shadowgraph fact '{"project":"checkout-service","key":"deployment","value":"multi-user","sourceClass":"human_confirmed","confidence":1}'

Restart and ask again — passing only the project, never the triggering fact:

shadowgraph review '{"project":"checkout-service"}'
[
  {
    "decisionId": "decision_1788079304730_yjawcg",
    "title": "Choose the datastore",
    "reason": "deployment",
    "alternativesToReconsider": [
      "PostgreSQL"
    ]
  }
]

ShadowGraph read the stored fact, matched it against the rule saved with the decision, and surfaced the alternative that had been rejected for a reason that no longer holds. Your decision IDs will differ; nothing else does.

That is decision memory: not "what did we talk about", but "what did we decide, what did we rule out, and does that still hold?"

For the same story through MCP, the HTTP API, and the JavaScript API — plus recording failed attempts and outcomes — see the decision-memory demo.

Key capabilities

Decision memory. Decisions carry the chosen approach, rejected alternatives with their reasons, assumptions, evidence, and structured reopenWhen rules. Outcomes (successful, mixed, failed, unknown) feed back into confidence.

Reconsideration. review() evaluates reopen rules against stored facts, so it works after a restart without the caller re-supplying what changed. Review signals are persisted and acknowledgeable.

Failed-attempt memory. Attempts record the approach, the result, the environment, and the lesson, so an agent can discover that something was already tried and why it did not work.

Provenance you can audit. Every claim carries a sourceClassagent_claimed, tool_observed, human_confirmed, or production_verified — which records what was claimed about an observation's origin, never proof of it. Ordinary tool input cannot create verified; that requires a separately configured Ed25519 verifier.

Scoped memory and temporal recall. remember() / recall() store preferences, profiles, goals, instructions, procedures, episodes, and notes under a project plus optional userId / agentId / runId. Facts, memories, and relations are bi-temporal, so you can ask what was true asOf a past moment. Retrieval fuses lexical, vector, graph-distance, and temporal signals and declares which signals were unavailable rather than silently degrading.

Project and scope isolation. Omitted project and scope mean the default project and all-null scope — never every project or every user. Purge is previewable, logical by default, and explicitly irreversible in hard mode.

Explainable retrieval. Results expose raw scores, ranks, and reasons, and every bounded response declares its total, pages, and omitted scope. Nothing is silently summarized away.

Local-first and privacy

Everything is a local file. The HTTP server binds to 127.0.0.1 and rejects non-local browser origins. There is no cloud service, no account, no telemetry, and no analytics — ShadowGraph makes no outbound network request unless you explicitly configure one.

The two opt-ins that can send data off the machine are both off by default:

  • Embeddings. No endpoint is configured. A localhost OpenAI-compatible server works once configured; a remote endpoint additionally requires SHADOWGRAPH_ALLOW_REMOTE_EMBEDDINGS=1, because that means memory and query text leave your machine.

  • Markdown export. markdown-sync writes plaintext copies you control. ShadowGraph cannot find or delete those copies later — see Storage, backup, and deletion.

For shared local use, set a Bearer token:

SHADOWGRAPH_API_TOKEN="use-a-random-token-at-least-16-characters" shadowgraph serve

Then send Authorization: Bearer use-a-random-token-at-least-16-characters with every request. This is defense in depth for a local deployment, not a public-internet security model. See SECURITY.md.

Interfaces

MCP

shadowgraph mcp

Compact mode is recommended: it advertises 12 workflow tools while the full graph, memories, facts, alternatives, and outcomes stay stored at full fidelity. Compact mode is a tool-advertisement choice, not lossy storage.

SHADOWGRAPH_MCP_COMPACT=1 shadowgraph mcp

Tool metadata follows the revision initialize negotiates: a session negotiated at 2025-03-26 also receives behavioural annotations, and one at 2025-06-18 or 2025-11-25 also receives output schemas and structured results, while a session at 2024-11-05 keeps the tool members and serialized results it always had. A request for a revision this server does not implement is answered with 2025-11-25, the latest it does. See the MCP compatibility guide for the full table.

The 12 compact tools are shadowgraph_context, shadowgraph_remember, shadowgraph_recall, shadowgraph_record_decision, shadowgraph_record_attempt, shadowgraph_record_fact, shadowgraph_record_outcome, shadowgraph_retrieve, shadowgraph_search, shadowgraph_review, shadowgraph_validate, and shadowgraph_maintain. Full mode advertises 27 — see the MCP compatibility guide for the complete inventory, every protocol revision, and verified client behaviour.

AI tool setup

Install globally first so the client can find shadowgraph on its PATH:

npm install --global github:LiLara-AI/shadowgraph
shadowgraph setup
shadowgraph doctor

Claude Code (user scope):

claude mcp add --scope user --env SHADOWGRAPH_MCP_COMPACT=1 --transport stdio shadowgraph -- shadowgraph mcp

Cursor (.cursor/mcp.json or ~/.cursor/mcp.json):

{"mcpServers":{"shadowgraph":{"type":"stdio","command":"shadowgraph","args":["mcp"],"env":{"SHADOWGRAPH_MCP_COMPACT":"1"}}}}

Codex:

codex mcp add shadowgraph --env SHADOWGRAPH_MCP_COMPACT=1 -- shadowgraph mcp

Hermes Agent:

hermes mcp add shadowgraph --command shadowgraph --connect-timeout 30 --env SHADOWGRAPH_MCP_COMPACT=1 --args mcp

Verified file forms for all four live in integrations/. Set an absolute SHADOWGRAPH_FILE in the client environment when one store must be shared across working directories.

CLI

The commands you will actually use:

shadowgraph setup
shadowgraph doctor
shadowgraph context '{"project":"my-app"}'
shadowgraph decision '{"project":"my-app","title":"Choose the datastore","chosen":"SQLite"}'
shadowgraph fact '{"project":"my-app","key":"deployment","value":"local","sourceClass":"human_confirmed"}'
shadowgraph attempt '{"solution":"Rewrite everything","result":"Regression"}'
shadowgraph outcome '{"decisionId":"DECISION_ID","outcome":{"status":"failed","lessons":["Assumption was wrong"]}}'
shadowgraph review '{"project":"my-app"}'
shadowgraph search '{"query":"database","project":"my-app"}'
shadowgraph remember '{"project":"my-app","memoryType":"preference","key":"editor","text":"Prefers VS Code"}'
shadowgraph recall '{"project":"my-app","query":"development environment"}'

setup · doctor · serve · mcp · stats · list · search · retrieve · recall · remember · markdown-sync · context · review · maintain · signals · ack · validate · repair-plan · backup · restore · decision · attempt · fact · outcome · status · link · traverse · redact · supersede · purge-preview · purge · journal · rebuild · confidence-evidence

Full argument shapes are in the API reference.

HTTP API

shadowgraph serve
curl http://127.0.0.1:8787/health

A read-only dashboard is served at http://127.0.0.1:8787/dashboard. It talks only to the same local origin, and a token entered there is kept in page memory only — never in cookies, local storage, or ShadowGraph data.

GET  /health                 GET  /stats               GET  /records
GET  /search?q=&project=     GET  /review-signals      GET  /validate
GET  /journal

POST /decisions              POST /attempts            POST /memories
POST /recall                 POST /facts               POST /outcomes
POST /review                 POST /context             POST /status
POST /relationships          POST /traverse            POST /redact
POST /supersede              POST /maintain            POST /retrieve
POST /review-signals/ack     POST /repair-plan         POST /backup
POST /restore                POST /rebuild             POST /confidence-evidence
POST /projects/purge-preview

DELETE /projects

/redact returns a privacy-safe export and never mutates. /repair-plan is always non-destructive and returns {apply:false, actions:[...]}. /projects/purge-preview shows deletion counts without changing storage. The server returns 401 when token auth is enabled and missing, 403 for disallowed browser origins, 404 for missing decisions or routes, and 413 for oversized bodies.

JavaScript

import { createShadowGraph } from 'shadowgraph-unified-plugin';

const graph = createShadowGraph();
graph.addDecision({
  project: 'checkout-service',
  title: 'Choose the datastore',
  chosen: 'SQLite',
  confidence: 0.8,
  alternatives: [{
    label: 'PostgreSQL',
    reasonRejected: 'Single-user local deployment does not justify running a server',
    reopenWhen: [{ key: 'deployment', operator: 'equals', value: 'multi-user' }]
  }]
});
graph.addFact({
  project: 'checkout-service',
  key: 'deployment',
  value: 'multi-user',
  sourceClass: 'human_confirmed',
  confidence: 1
});

// review() reads stored facts, so this also works in a fresh process after an
// export/save and load. Do not pass the triggering fact again.
console.log(graph.review({ project: 'checkout-service' }));

The bare-specifier import resolves when ShadowGraph is a dependency of your project (npm install github:LiLara-AI/shadowgraph). With a --global install, use the CLI, HTTP, or MCP surfaces instead, or import from the installed path.

Storage, backup, and deletion

JSON is the zero-dependency default and stores a versioned graph in .shadowgraph/data.json. Set SHADOWGRAPH_FILE to relocate it. Set SHADOWGRAPH_STORAGE=sqlite on Node 22.5+ for the WAL-backed relational adapter. Current exports use schema 5; schemas 1 through 4 remain importable.

State and journal are written in one atomic operation, every save and restore for a destination shares a cross-process lock fence, and a stale write is rejected with a revision conflict rather than silently lost. backup takes a consistent snapshot; restore validates domain and journal consistency before replacing live state, and rolls back on failure. This is process-level rollback safety, not a claim of crash or power-loss durability. The full guarantees — lock timeouts, stale-lock recovery, revision arithmetic, and restore artifact reporting — are in the API reference and the SQLite restore contract.

Deletion is explicit and previewable:

shadowgraph purge-preview '{"project":"release-demo"}'
shadowgraph purge '{"project":"release-demo"}'
shadowgraph purge '{"project":"another-project","mode":"hard"}'

Logical purge (the default) removes project content from the live projection and keeps an auditable, payload-free purge skeleton. Hard purge physically deletes journal entries, creates a declared gap, and cannot be undone.

Purge cannot delete external Markdown exports. ShadowGraph has no way to find plaintext copies in arbitrary workspaces, Git history, cloud sync, backups, or removable media. Delete those separately.

Limitations and Technical Preview status

ShadowGraph 0.40.0 is a Technical Preview / Early Access release. It is not Beta and not stable.

  • Interfaces and the storage schema may still change. Do not use it for data you cannot reproduce.

  • Not on npm. The package is deliberately private: true. No npm publication, Git tag, or GitHub release has been created, and none is authorized.

  • No comparative benchmark has been measured. Comparative benchmark infrastructure was executed, but no arm was measured because no common local/free LLM and embedding endpoint was available. No comparative performance, quality, token, cost, or 'best' claim is supported. ShadowGraph makes no claim of being faster, cheaper, lower-token, more accurate, or better than any other memory system. See the benchmark report.

  • Security review status. An AI-assisted independent security review of commit 4a5e076 (tree 62c1918e) was completed on 2026-08-30 by Antigravity Assistant (Gemini 3.7 Flash), with a PASS result and no unresolved findings. No human third-party security audit has been performed. See SECURITY.md.

  • No default extractor, background watcher, or hosted sync. ShadowGraph records what you tell it to record.

  • Single maintainer. No paid support, no patch SLA, and no bug bounty.

Feedback and support

Technical Preview feedback is the point of this release. Please tell us when something breaks.

What

Where

Bug or incorrect behaviour

Open a bug report

Feature or capability request

Open a feature request

Security vulnerability

Report it privately — never in a public issue

Questions, ideas, "is this useful?"

Discussions

During the preview, these reports are the most valuable:

  • Installation problems — anything between npm install --global and a green doctor.

  • MCP client compatibility — which client, which mode, and what it did or did not discover.

  • Memory usefulness — did recalled context actually change what your agent did?

  • Confusing workflows — where the docs or a command shape sent you the wrong way.

  • Missing decision-memory use cases — decisions you wanted to store and could not.

  • Performance — where it felt slow, and roughly how large the store was.

ShadowGraph has no telemetry and collects nothing automatically, so a report from you is the only signal there is. When pasting output, redact anything private: decision and memory content is your data, and shadowgraph doctor output is usually enough.

Documentation

Document

What it covers

Decision-memory demo

The full worked example through CLI, MCP, HTTP, and JavaScript

API reference

JavaScript, CLI, HTTP, and MCP surfaces

Unified memory guide

remember / recall, scoping, temporal recall, Markdown sync

MCP compatibility

Protocol revisions, tool inventory, verified client behaviour

Contracts

Authoritative guarantees: provenance, lifecycle, journal, completeness, search, confidence, SQLite restore

Architecture decisions

ADR-0006 (memory kernel), ADR-0007 (journal baseline placement)

Vision and principles

What ShadowGraph is for, and what it deliberately will not do

Benchmark report

Honest results — no arm was measured; no comparative claim is supported

Security policy

Threat model, review status, and how to report a vulnerability privately

Contributing

Development setup and pull-request expectations

Changelog

Release history

Checks

npm run check
npm test
npm run check:integrations
npm run check:mcp
npm audit --omit=dev
npm run check:package
npm run smoke:package

GitHub Actions covers Ubuntu and Windows on Node 20, 22, and 24. SQLite gates run only where node:sqlite exists. The strict official MCP Inspector runs full and compact gates, the pinned Glama mcp-proxy@6.4.3 gate proves the revision this server negotiates with it and that the tool list reaches an HTTP scanner unchanged, and the package smoke test runs from a real clean install in every matrix cell.

License

MIT. See LICENSE.

Available Tools

27 tools
shadowgraph_ack_reviewA
Destructive

Acknowledge one persisted review signal by id, closing it as open work. Ids come from shadowgraph_review_signals or shadowgraph_review; use shadowgraph_update_status or shadowgraph_supersede to act on the decision. Overwrites status and acknowledgedAt in place with no journal entry, so a rebuild cannot reconstruct it; a repeat restamps it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesReview signal id, as returned in the id field by shadowgraph_review_signals or in reviewSignals by shadowgraph_maintain. This is the signal id, not the decisionId it refers to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesSignal identifier, used by shadowgraph_ack_review.
kindYesAlways "review".
titleNoDecision title, when the stored decision has one.
reasonYesWhy the signal was raised. Together with decisionId this is the dedupe identity, so the same cause never raises a second signal.
statusYesopen until acknowledged.
createdAtYesISO 8601 time the signal was raised.
decisionIdYesThe decision this signal is about.
acknowledgedAtYesISO 8601 time of the most recent acknowledgement.
alternativesToReconsiderYesAlternative labels to look at again.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing that the operation overwrites status and acknowledgedAt in place, writes no journal entry, cannot be reconstructed by a rebuild, and that a repeat call restamps it. This is valuable destructive-behavior context that an agent could not infer from the annotations alone.

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

Conciseness5/5

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

Three short sentences each serve a distinct purpose: main operation, id source and alternative routing, and side effects. It is front-loaded with the core function and contains no filler or redundant restatement of the tool name.

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?

The definition provides everything needed to invoke the tool correctly: the input id semantics, what operation is performed, how it differs from sibling tools, and the important destructive and non-reconstructible side effects. With the output schema present and the single parameter fully documented, no critical context is missing.

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

Parameters3/5

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

The input schema already covers the id parameter fully at 100% coverage, including its provenance and the warning that it is a signal id rather than a decisionId. The description reinforces that provenance but does not add meaning that the schema does not already provide, so it stays at the baseline for high schema coverage.

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

Purpose5/5

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

The description states a specific action, 'Acknowledge one persisted review signal by id, closing it as open work,' and clearly identifies the resource and scope. It also names sibling tools that handle different operations on decisions, so the agent can distinguish it from shadowgraph_update_status and shadowgraph_supersede.

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

Usage Guidelines5/5

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

It explicitly says when to use this tool: to acknowledge a persisted review signal by id and close it as open work. It also gives the alternative routing, 'use shadowgraph_update_status or shadowgraph_supersede to act on the decision,' which clearly communicates the boundary between acknowledging the signal and acting on the decision.

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

shadowgraph_backupA
Destructive

Write a consistent snapshot of the whole store to a filesystem path on the server. Take one before shadowgraph_purge or shadowgraph_restore; shadowgraph_redact shares data without writing a file. Overwrites any existing file at destination without warning, creates parent directories, and commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
destinationYesServer-side path to write the snapshot to. Required. An existing file there is overwritten; parent directories are created. Use the storage backend’s own extension, .json for JSON stores and .db for SQLite.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceYesPath of the live store the snapshot was taken from.
destinationYesPath the snapshot was written to.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark this as destructive and non-read-only; the description adds concrete behavioral details: overwrites existing files without warning, creates parent directories, and commits a revision. These are meaningful side effects beyond what annotations alone convey. It could mention permissions or failure cases, but the added context is strong.

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 compact sentences front-load the action, then add usage context, an alternative, and side effects. Every sentence earns its place with no filler or redundant restatement of the tool name. The structure is efficient and scannable.

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

Completeness5/5

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

Given the low complexity—one required parameter, full schema coverage, destructive annotations, and an output schema—the description covers everything needed for correct invocation. It adds usage triggers, sibling differentiation, and key side effects. An agent can act on this definition confidently without further research.

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?

The input schema fully documents the single destination parameter at 100% coverage, including overwrite behavior, parent directory creation, and extension guidance. The description restates some of this but does not add new parameter-level meaning beyond the schema. Baseline 3 is appropriate given complete schema coverage.

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

Purpose5/5

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

States a specific verb and resource: 'Write a consistent snapshot of the whole store to a filesystem path on the server.' It clearly differentiates from shadowgraph_redact by noting that the alternative shares data without writing a file. The purpose is unambiguous and distinct from siblings.

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

Usage Guidelines5/5

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

Explicitly says when to use this tool: 'Take one before shadowgraph_purge or shadowgraph_restore.' It also identifies a relevant alternative, shadowgraph_redact, and explains the key difference. This gives direct routing guidance with no inference required.

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

shadowgraph_confidence_evidenceA

Apply one keyed piece of supporting or contradicting evidence to a decision's confidence. Use shadowgraph_record_outcome once the decision has played out, shadowgraph_record_fact for an observation that can reopen it. Reusing key cannot double-count, but restamps the decision and commits a revision; a new observation needs a new key.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesREQUIRED stable dedupe key. Reuse the same key for the same observation so retries cannot double-count; use a NEW key for a genuinely new observation. There is no default, because a generated one would only be stable within a millisecond.
actorNoWho performed this write, such as an agent or person name. Stored for audit; never used to grant trust.
clientNoWhich client software performed this write, such as the host application name.
reasonYesWhy this evidence matters. Required, non-empty, and kept in the audit history.
supportsNoDefaults to true. false records contradicting evidence, moving confidence down instead of up.
sessionIdNoCaller-owned identifier that groups related writes in the audit trail.
decisionIdYesIdentifier of an existing decision, as returned by shadowgraph_record_decision, shadowgraph_search, or shadowgraph_retrieve.
observedAtNoISO 8601 time the evidence was observed. Defaults to now.
sourceClassNoClaimed origin, never proof: agent_claimed (the default), tool_observed, human_confirmed, or production_verified. It weights confidence only. An unrecognised label downgrades to agent_claimed, kept verbatim in sourceRaw.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesStable entity identifier.
goalNoWhat the decision was trying to achieve.
kindYesEntity kind: decision, attempt, memory, fact, relation, review, or alternative.
actorNoWho performed the write.
titleNoShort name of the decision.
chosenNoThe option that was chosen.
clientNoWhich client performed the write.
statusNoLifecycle state. Legacy records may carry a value this build does not recognise; shadowgraph_validate reports those.
outcomeNoThe recorded outcome, or null until one is recorded.
projectNoProject namespace; records imported from a schema that predates projects may carry null.
evidenceNoNormalised evidence entries: source, type, sourceClass, confidence, observedAt, detail.
createdAtNoISO 8601 creation time.
migrationNoPresent only on migrated records; records the legacy value a field was mapped from.
sessionIdNoSession identifier recorded with the write.
sourceRawNoThe original origin label when it differed from sourceClass. Audit only; never evidence.
updatedAtNoISO 8601 time of the last change.
confidenceNoAuditable confidence: initial, current (0-1), policy, a history entry per move, and a basis summarising the contributions it was folded from. Legacy records may lack basis.
supersedesNoIdentifiers of decisions this one replaced.
assumptionsNoAssumptions the decision rests on. Searchable content.
reviewAfterNoISO 8601 instant after which shadowgraph_maintain marks this decision stale.
sourceClassNoClaimed origin class recorded with the write. A claim, never proof.
alternativesNoRejected alternatives, each with id, label, reasonRejected, status, and the reopenWhen rules that make it reconsiderable.
supersededByNoIdentifier of the decision that replaced this one.
schemaVersionNoStorage schema version this entity was written under. A value above the build’s own version is preserved rather than downgraded.
failedAttemptsNoAttempt identifiers or notes attached to this decision.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses side effects beyond the annotations: reusing a key 'cannot double-count, but restamps the decision and commits a revision.' This clarifies non-idempotent behavior and the write/commit nature of the call, complementing the readOnly=false and idempotentHint=false annotations.

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

Conciseness5/5

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

Three dense sentences with no filler. The core purpose is front-loaded, alternatives are named, and the critical key-reuse caveat is stated clearly.

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 tool with 9 parameters, 100% schema coverage, and an output schema, the description provides the missing operational context: when to choose alternatives and what key reuse actually does. Nothing essential for selecting or invoking the tool is omitted.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful key semantics: reusing a key cannot double-count yet still restamps and commits a revision. This complements the schema's dedupe explanation, though it does not deeply elaborate other parameters.

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

Purpose5/5

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

The description opens with a specific verb and object: 'Apply one keyed piece of supporting or contradicting evidence to a decision's confidence.' It also names related siblings and clarifies this tool is for applying evidence, not for recording outcomes or facts.

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

Usage Guidelines5/5

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

It gives explicit routing guidance: use shadowgraph_record_outcome once the decision has played out, and shadowgraph_record_fact for an observation that can reopen it. It also explains the key-reuse caveat, telling agents when a new key is required.

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

shadowgraph_contextA

Build one project's working set before a consequential task: decisions, stale assumptions, failed attempts, open reviews. shadowgraph_search or shadowgraph_retrieve look one thing up, shadowgraph_recall reads scoped memory, shadowgraph_review only evaluates. Not a read: it evaluates reopen rules, can persist signals, and commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
factsNoFact key/value overrides evaluated instead of the stored facts of the same key. Stored facts are used for every key not listed here, so reopen rules still work after a restart.
limitNoMaximum items per collection, 1-1000, applied to each collection independently. Omit for the default of 50.
projectNoProject namespace. Defaults to "default"; an empty string is rejected.
changedFactsNoFact keys that just changed. Only string-form reopenWhen rules match this list; it is an ephemeral signal, not durable state.

Output Schema

ParametersJSON Schema
NameRequiredDescription
projectYesThe project this context describes.
openReviewsYesDecisions currently due for reconsideration.
completenessYesPer-collection completeness. context returns five named collections, so one page object cannot describe it.
activeDecisionsYesDecisions in a current, actionable state: proposed, planned, in_progress, executed, validated, or reconsidered.
staleAssumptionsYesFacts that are no longer active, such as superseded or expired ones, which earlier decisions may still rest on.
suggestedQuestionsYesQuestions for the low-confidence decisions in this project.
failedAttemptsToAvoidYesAttempts whose result mentions failure, regression, or error.

TDQS

A4.4/5.0
Behavior4/5

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

With all annotations false, the description carries the burden of disclosure and largely meets it: 'Not a read: it evaluates reopen rules, can persist signals, and commits a revision' clearly communicates mutation and side effects. It could go further by specifying what a committed revision entails, but it is honest and materially informative.

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, each earning its place: purpose, sibling differentiation, and the critical non-read caveat. The structure front-loads the primary intent before alternatives and caveats.

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?

The description covers purpose, usage boundary, side effects, and sibling routing, and an output schema exists to handle return values. Minor gaps remain around what exactly a 'revision' is and how reopen rules behave, but these do not block correct invocation.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter already has a detailed description. The narrative description adds no parameter-specific semantic value, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Build one project's working set' and lists what that set contains. It then explicitly differentiates itself from shadowgraph_search, shadowgraph_retrieve, shadowgraph_recall, and shadowgraph_review, making sibling confusion unlikely.

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

Usage Guidelines5/5

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

It states when to use this tool ('before a consequential task') and names concrete alternatives for single lookups, scoped memory reads, and evaluations. It also adds the crucial exclusion 'Not a read,' preventing misuse for read-only needs.

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

shadowgraph_journalA
Read-onlyIdempotent

Read the append-oriented journal of complete post-operation snapshots, in sequence order. shadowgraph_rebuild replays it into a projection, shadowgraph_validate diagnoses live data, shadowgraph_search finds records. Reads only. Entries are immutable audit evidence and are never rewritten in place.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum items to return, 1-1000; the default is 50 and completeness.limitSource reports which applied. Out of range is rejected, never silently clamped.
offsetNoItems to skip before this window. Ordering is total and deterministic, so paging cannot drop or duplicate an item.
projectNoReturn only entries recorded for this project. Omit for every project, including entries with no project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesThe window actually applied to the matching items.
itemsYesThe items in this window, in deterministic order.
completenessYesDeclares exactly what this response left out, so a truncated result can never look complete.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior; the description adds that entries are immutable audit evidence, append-only/never rewritten in place, and are complete post-operation snapshots in sequence. This gives the agent meaningful invariants beyond the safety flags.

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

Conciseness4/5

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

Three sentences, each with a distinct job: define the resource, route to alternatives, and state immutability/read-only guarantee. Minor redundancy in 'Reads only' given the readOnly annotation, but no waste.

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

Completeness5/5

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

Given a full input schema, an output schema, and annotations, the description covers what the journal is, how it is ordered, its read-only/immutable nature, and how it relates to the main sibling tools. An agent has everything needed to select and call it.

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?

All three parameters are fully documented in the schema, including defaults, bounds, and ordering guarantees, so the description does not need to add parameter-level detail and does not do so. Baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb ('Read') and resource ('append-oriented journal of complete post-operation snapshots'), and states the sequence ordering. It also distinguishes the tool from three siblings by assigning them distinct jobs (rebuild, validate, search).

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?

It names shadowgraph_rebuild, shadowgraph_validate, and shadowgraph_search with their distinct purposes, which lets an agent infer when journal is the raw-source read rather than those specialized operations. However, the guidance is implicit—it never says 'use X instead' or lists when not to use journal, so it falls just short of fully explicit routing.

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

shadowgraph_maintainA

Run time-based maintenance: make due decisions stale, expire due facts, then evaluate reopen rules. shadowgraph_review only evaluates reopen rules, shadowgraph_validate only reports, shadowgraph_update_status cannot set stale. Writes, and depends on the clock: a repeat at the same instant finds nothing to do but still commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
nowNoISO 8601 instant to treat as the current time. Defaults to the real clock; supplying it makes the run deterministic.
factsNoFact key/value overrides evaluated instead of the stored facts of the same key. Stored facts are used for every key not listed here, so reopen rules still work after a restart.
changedFactsNoFact keys that just changed. Only string-form reopenWhen rules match this list; it is an ephemeral signal, not durable state.

Output Schema

ParametersJSON Schema
NameRequiredDescription
atYesThe instant maintenance ran against.
dueYesDecisions due for reconsideration after the run.
reviewSignalsYesEvery persisted review signal after the run, open and acknowledged alike.
agedDecisionIdsYesCompatibility alias of staleDecisionIds for older callers.
staleDecisionIdsYesDecisions moved to stale because they passed reviewAfter.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate this is not read-only and not idempotent, but the description adds crucial nuance: it commits a revision even when a repeat at the same instant finds nothing to do, and it depends on the clock. This goes beyond the structured metadata and helps an agent predict side effects.

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

Conciseness5/5

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

Three sentences carry all essential information with no repetition or filler. The core behavior is front-loaded, and the sibling comparisons are compact but informative.

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 a complete input schema and an output schema present, the description needs only to explain behavior and tool selection, which it does thoroughly. The note about non-idempotence and clock dependence closes the most likely agent confusion.

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?

The input schema has 100% coverage and already explains all three parameters in detail, including defaults and ephemeral semantics. The description does not add parameter-specific meaning beyond the schema, so the baseline of 3 applies.

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

Purpose5/5

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

The description states a specific action ('Run time-based maintenance') and breaks it into concrete steps: make decisions stale, expire due facts, evaluate reopen rules. It also names sibling tools and differentiates this one by what it does that they cannot. This leaves no ambiguity about the tool's role.

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 contrasts this tool with shadowgraph_review, shadowgraph_validate, and shadowgraph_update_status, stating what each alternative fails to do. It also clarifies that the tool writes and is clock-dependent, so an agent knows when to call it and what to expect.

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

shadowgraph_purgeA
Destructive

Delete one project's decisions, attempts, memories, facts, relationships, events, and retry keys. Run shadowgraph_purge_preview first; shadowgraph_redact shares without deleting, shadowgraph_backup keeps a copy. Irreversible without a backup. logical keeps an auditable journal skeleton; hard also drops entries, leaving a declared gap.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDefaults to logical, which keeps an auditable payload-free journal skeleton. "hard" is irreversible, physically removes journal entries, and leaves a sequence gap that validate() reports.
projectYesProject to delete. Required and non-empty; there is no wildcard.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYesThe mode that was applied.
factsYesFacts that were present.
eventsYesCompatibility events that were present.
journalYesJournal entries that were present for the project.
projectYesThe project that was purged.
recordsYesDecisions, attempts, and memories that were present.
removedYesEntities removed from live state, including alternatives.
relationsYesRelationships that were present.
journalEntryIdYesId of the project.purged entry that records this purge.
idempotencyRemovedYesRetry keys removed with the project.
journalEntriesRemovedYesEntries physically deleted by a hard purge.
journalEntriesRedactedYesEntries reduced to an audit skeleton by a logical purge.
removedJournalSequencesYesSequence numbers a hard purge removed, declared so the resulting gap is explained rather than hidden.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as destructive, but the description adds important context: the operation is irreversible without a backup, and modes behave differently (logical keeps a journal skeleton, hard drops entries leaving a declared gap). This goes beyond the annotation and fully informs the agent about consequences.

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

Conciseness5/5

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

The description is three sentences with no filler. It front-loads the core action and resource, then gives the required preview step, alternatives, irreversibility warning, and mode behavior in an efficient, scannable structure.

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

Completeness5/5

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

For a destructive tool with two parameters, an output schema, and full schema coverage, the description covers everything an agent needs: what is deleted, the prerequisite preview, relevant alternatives, irreversibility, and mode semantics. No critical information is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already explains both parameters. The description adds a concise restatement of logical versus hard behavior, but this largely duplicates what the schema's mode enum and project descriptions already provide. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: 'Delete one project's decisions, attempts, memories, facts, relationships, events, and retry keys.' It also names sibling tools, distinguishing it from shadowgraph_redact and shadowgraph_backup, so an agent can select this tool confidently.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: run shadowgraph_purge_preview first, and notes that shadowgraph_redact is for sharing without deleting while shadowgraph_backup preserves a copy. It also warns about irreversibility without a backup, making the preconditions and alternatives clear.

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

shadowgraph_purge_previewA
Read-onlyIdempotent

Count what a purge of one project would remove, without changing anything. Run this before shadowgraph_purge; it takes the same project name and reports the same counts. Reads only: no storage, journal, or signal change, and no file is written.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYesProject name to preview, matched exactly. Required and non-empty.

Output Schema

ParametersJSON Schema
NameRequiredDescription
factsYesFacts in the project.
eventsYesCompatibility events for the project.
journalYesJournal entries recorded for the project.
projectYesThe project that was previewed.
recordsYesDecisions, attempts, and memories in the project.
relationsYesRelationships touching the project.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds concrete behavioral context beyond this: 'no storage, journal, or signal change, and no file is written.' This reinforces the read-only nature with specific guarantees.

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 short, purposeful sentences. The primary purpose is stated first, followed by usage guidance and explicit read-only guarantees. Every sentence earns its place with no filler or repetition of schema details.

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?

The tool is simple: one parameter, clear annotations, and an output schema present. The description covers purpose, usage timing, sibling relationship, and side-effect guarantees. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

The input schema has 100% description coverage for its single 'project' parameter, so the schema already documents the requirement clearly. The description adds minimal semantic value beyond restating that it uses the 'same project name' as shadowgraph_purge, which is useful but not substantial.

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

Purpose5/5

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

The description uses a specific verb ('Count') and a clear resource ('what a purge of one project would remove'). It explicitly names the sibling it precedes (shadowgraph_purge), making the tool's purpose distinct and immediately identifiable.

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 says 'Run this before shadowgraph_purge,' providing a direct usage directive with the relevant alternative named. It also clarifies the relationship: preview first, then purge with the same project name.

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

shadowgraph_rebuildA
Read-onlyIdempotent

Replay this store's own journal into a projection and report whether the fold was complete. shadowgraph_journal reads the entries themselves, shadowgraph_validate diagnoses the live graph. Reads only: the journal is untouched and the live graph is not replaced by the result.

ParametersJSON Schema
NameRequiredDescriptionDefault
requireFullHistoryNoWhen true, refuse to rebuild if pre-journal metadata-only entries exist, returning rebuildable:false instead of a fold that silently starts later. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesTrue when the fold ran; it does not by itself mean the projection is complete.
legacyYesEntries recognised as pre-journal or non-replayable, each with a why.
reasonYesWhy the projection is not rebuildable, or null when it is.
appliedYesEntries folded into the projection.
skippedYesEntries not folded, each carrying seq, type, and a stable why such as unknown_entry_type or unsupported_schema_version.
duplicatesYesSequence numbers appearing more than once, each { seq, count }. A repeated sequence cannot be totally ordered, so it makes the fold untrustworthy.
projectionYesThe projection folded from the journal.
replayedToYesHighest sequence folded.
rebuildableYesTrue only when every entry in the replay range was folded and the result is trustworthy.
journalEpochYesFirst replayable sequence.
replayedFromYesLowest sequence folded.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds concrete context: 'the journal is untouched and the live graph is not replaced by the result.' This is especially useful because 'rebuild' could otherwise imply destructive replacement. No contradiction with annotations exists.

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, each earning its place: the main action, sibling differentiation, and read-only clarification are all included without redundancy. The most important information is front-loaded.

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?

The tool has an output schema, a single optional parameter that is fully documented, and annotations covering safety and idempotency. The description adds the necessary scoping and no-side-effect guarantees, so an agent has everything needed to call this tool correctly.

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

Parameters3/5

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

The sole parameter, requireFullHistory, is fully documented in the schema with a clear explanation of true/false behavior and its return effect. The description itself adds no parameter-specific information, but with 100% schema coverage, the baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Replay this store's own journal into a projection and report whether the fold was complete.' It further distinguishes itself from shadowgraph_journal and shadowgraph_validate, so an agent can tell exactly which operation this tool performs.

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 names two sibling tools and contrasts them with this one: shadowgraph_journal reads entries, shadowgraph_validate diagnoses the live graph, while shadowgraph_rebuild replays the journal into a projection. This gives clear guidance on when to choose this tool versus alternatives.

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

shadowgraph_recallA
Read-onlyIdempotent

Recall scoped memory and records by fusing lexical, vector, graph-distance, and temporal ranks. shadowgraph_search is plain content matching, shadowgraph_retrieve adds graph neighbours, shadowgraph_remember writes memory. Reads only. Every response declares which signals were available, so absent ones are never renamed.

ParametersJSON Schema
NameRequiredDescriptionDefault
asOfNoISO 8601 instant to select by valid time, returning what was true then rather than now. Also enables temporal ranking.
limitNoMaximum items to return, 1-1000; the default is 50 and completeness.limitSource reports which applied. Out of range is rejected, never silently clamped.
queryNoFree text to rank against. An empty query still returns scope-matching records ranked by the remaining signals.
scopeNoScope selector. Omitted or partial fields mean explicit nulls, not "any": identity is the exact (project, userId, agentId, runId, memoryType, key) tuple, so a run-scoped memory never leaks into a user-only read.
offsetNoItems to skip before this window. Ordering is total and deterministic, so paging cannot drop or duplicate an item.
focalIdNoEntity id to measure graph distance from. Without it the graph signal reports available:false.
projectNoProject to recall from. Defaults to "default" for memory records rather than meaning all projects.
memoryTypeNoRestrict memory candidates to this type.
preferRecentNoEnable temporal ranking against now. Ignored when asOf is supplied, which already selects a point in time.
queryEmbeddingNoCaller-supplied query vector. Omit to use the configured provider; with neither, the semantic signal reports available:false and a reason.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesThe window actually applied to the matching items.
itemsYesThe items in this window, in deterministic order.
completenessYesDeclares exactly what this response left out, so a truncated result can never look complete.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so 'Reads only' is redundant but harmless. The unique addition is 'Every response declares which signals were available, so absent ones are never renamed', a valuable behavioral guarantee about response transparency beyond the annotations. No contradiction with annotations.

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

Conciseness5/5

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

Three sentences with no filler; the core function is front-loaded, followed by sibling differentiation and a behavioral guarantee. Every sentence earns its place.

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?

The description covers operation, scope, safety, signal-availability behavior, and sibling routing, which is complete for a read-only tool with a rich input and output schema. The schema handles parameter details and return values, so nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with detailed documentation for all 10 parameters, so the baseline is 3. The description adds high-level context about signal fusion but does not detail specific parameters beyond what the schema already provides.

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

Purpose5/5

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

The leading verb 'Recall' plus the explicit fusion mechanism ('lexical, vector, graph-distance, and temporal ranks') identifies the operation precisely. It then contrasts with shadowgraph_search and shadowgraph_retrieve, making the function unmistakable and differentiating it from siblings.

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 names sibling tools and their distinguishing behaviors ('shadowgraph_search is plain content matching, shadowgraph_retrieve adds graph neighbours, shadowgraph_remember writes memory'), giving an agent clear routing criteria. The implication that recall is for when fused ranking is needed is sufficient guidance.

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

shadowgraph_record_attemptA

Record one attempt and how it turned out, so the same approach is not blindly retried. Use shadowgraph_record_decision for the choice itself, shadowgraph_record_outcome for how one played out. Appends an attempt and a journal entry; without idempotencyKey a retry records a second one.

ParametersJSON Schema
NameRequiredDescriptionDefault
actorNoWho performed this write, such as an agent or person name. Stored for audit; never used to grant trust.
clientNoWhich client software performed this write, such as the host application name.
reasonNoWhy it turned out that way. Searchable content.
resultYesWhat happened. Required, non-empty, and searchable content. Wording such as failed, error, or regression is what makes the attempt surface in shadowgraph_context as one to avoid.
projectNoProject namespace. Defaults to "default"; an empty string is rejected.
solutionYesWhat was tried. Required, non-empty, and searchable content.
sessionIdNoCaller-owned identifier that groups related writes in the audit trail.
environmentNoWhere it was tried, such as a runtime, OS, or version. Searchable content, so a later attempt can be matched to the same environment.
sourceClassNoClaimed origin, never proof: agent_claimed (the default), tool_observed, human_confirmed, or production_verified. It weights confidence only. An unrecognised label downgrades to agent_claimed, kept verbatim in sourceRaw.
idempotencyKeyNoRetry key scoped by project and operation: reuse it so a retry returns the first result instead of writing a duplicate. Without it every call creates a new entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesStable entity identifier.
kindYesEntity kind: decision, attempt, memory, fact, relation, review, or alternative.
actorNoWho performed the write.
clientNoWhich client performed the write.
reasonNoWhy it turned out that way.
resultNoWhat happened.
projectNoProject namespace; records imported from a schema that predates projects may carry null.
solutionNoWhat was tried.
createdAtNoISO 8601 creation time.
relatedToNoIdentifiers of related entities.
sessionIdNoSession identifier recorded with the write.
sourceRawNoThe original origin label when it differed from sourceClass. Audit only; never evidence.
updatedAtNoISO 8601 time of the last change.
environmentNoWhere it was tried.
sourceClassNoClaimed origin class recorded with the write. A claim, never proof.
reusableWhenNoConditions under which the attempt is worth repeating.
schemaVersionNoStorage schema version this entity was written under. A value above the build’s own version is preserved rather than downgraded.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses side effects beyond the annotations: it appends both an attempt and a journal entry, and warns that without idempotencyKey a retry records a second entity. This complements idempotentHint=false by explaining the concrete consequence.

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?

Two sentences front-load the core purpose, then provide sibling routing and a behavioral caveat. Every clause earns its place with no repetition of schema content.

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

Completeness5/5

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

For a 10-parameter write tool with full schema coverage and an output schema, the description supplies essential context: purpose, sibling differentiation, side effects, and idempotency behavior. Nothing necessary for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 10 parameters. The description does not add parameter details beyond what the schema provides, but it does not need to; the baseline of 3 is appropriate since the schema carries the burden.

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

Purpose5/5

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

States a specific verb and resource ('Record one attempt and how it turned out') and explicitly distinguishes itself from shadowgraph_record_decision and shadowgraph_record_outcome. An agent can tell this tool apart from closely related siblings without opening their schemas.

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

Usage Guidelines5/5

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

Names the exact sibling tools for adjacent cases ('Use shadowgraph_record_decision for the choice itself, shadowgraph_record_outcome for how one played out') and frames when this tool applies ('so the same approach is not blindly retried'). The guidance is explicit and actionable.

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

shadowgraph_record_decisionA

Record one decision: chosen option, assumptions, evidence, and rejected alternatives with reopenWhen rules. Use shadowgraph_record_attempt for something tried, shadowgraph_record_fact for an observation, shadowgraph_remember for a note. Appends a decision and a journal entry; without idempotencyKey each call adds another and commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalNoWhat the decision is meant to achieve. Searchable content.
actorNoWho performed this write, such as an agent or person name. Stored for audit; never used to grant trust.
titleYesShort name of the decision. Required, non-empty, and searchable content.
chosenYesThe option actually chosen. Required, non-empty, and searchable content.
clientNoWhich client software performed this write, such as the host application name.
projectNoProject namespace. Defaults to "default"; an empty string is rejected.
evidenceNoSupporting evidence. Counted as declared evidence in the confidence basis, but never re-checked.
sessionIdNoCaller-owned identifier that groups related writes in the audit trail.
confidenceNoStarting confidence, 0-1. Defaults to 0.5. Later outcomes and evidence move it from this baseline; it is a degree of belief, never a verification status.
assumptionsNoWhat the decision takes for granted. Record each as a fact too if it should be able to reopen the decision.
sourceClassNoClaimed origin, never proof: agent_claimed (the default), tool_observed, human_confirmed, or production_verified. It weights confidence only. An unrecognised label downgrades to agent_claimed, kept verbatim in sourceRaw.
alternativesNoOptions considered and rejected. Alternatives belong to the decision and have no separate write API; they are what shadowgraph_review reconsiders.
idempotencyKeyNoRetry key scoped by project and operation: reuse it so a retry returns the first result instead of writing a duplicate. Without it every call creates a new entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesStable entity identifier.
goalNoWhat the decision was trying to achieve.
kindYesEntity kind: decision, attempt, memory, fact, relation, review, or alternative.
actorNoWho performed the write.
titleNoShort name of the decision.
chosenNoThe option that was chosen.
clientNoWhich client performed the write.
statusNoLifecycle state. Legacy records may carry a value this build does not recognise; shadowgraph_validate reports those.
outcomeNoThe recorded outcome, or null until one is recorded.
projectNoProject namespace; records imported from a schema that predates projects may carry null.
evidenceNoNormalised evidence entries: source, type, sourceClass, confidence, observedAt, detail.
createdAtNoISO 8601 creation time.
migrationNoPresent only on migrated records; records the legacy value a field was mapped from.
sessionIdNoSession identifier recorded with the write.
sourceRawNoThe original origin label when it differed from sourceClass. Audit only; never evidence.
updatedAtNoISO 8601 time of the last change.
confidenceNoAuditable confidence: initial, current (0-1), policy, a history entry per move, and a basis summarising the contributions it was folded from. Legacy records may lack basis.
supersedesNoIdentifiers of decisions this one replaced.
assumptionsNoAssumptions the decision rests on. Searchable content.
reviewAfterNoISO 8601 instant after which shadowgraph_maintain marks this decision stale.
sourceClassNoClaimed origin class recorded with the write. A claim, never proof.
alternativesNoRejected alternatives, each with id, label, reasonRejected, status, and the reopenWhen rules that make it reconsiderable.
supersededByNoIdentifier of the decision that replaced this one.
schemaVersionNoStorage schema version this entity was written under. A value above the build’s own version is preserved rather than downgraded.
failedAttemptsNoAttempt identifiers or notes attached to this decision.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses the write behavior beyond the annotations: it 'appends a decision and a journal entry', says each call 'commits a revision', and flags the non-idempotent nature without idempotencyKey. This complements the sparse boolean annotations with actionable side-effect context.

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?

Two dense sentences earn their place: the first states the core action and content, the second routes to alternatives and reveals the side-effect/idempotency behavior. No filler and the most decision-relevant information is front-loaded.

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 13-parameter write tool, the combination of a fully documented schema, an explicit side-effect statement, and clear sibling routing leaves nothing essential missing. An output schema exists, so the description does not need to explain return values.

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?

The input schema already describes all 13 parameters with 100% coverage, so the baseline of 3 applies. The description lightly signals the important parameters (chosen option, assumptions, evidence, rejected alternatives, reopenWhen rules) but adds no meaning beyond the schema's own field descriptions.

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

Purpose5/5

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

The description states a specific verb ('Record') and exact resource ('one decision') and enumerates the content it captures: chosen option, assumptions, evidence, and rejected alternatives with reopenWhen rules. It also distinguishes itself from sibling tools by naming shadowgraph_record_attempt, shadowgraph_record_fact, and shadowgraph_remember and what each is for.

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

Usage Guidelines5/5

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

It explicitly tells an agent when to pick this tool over closely related options ('Use shadowgraph_record_attempt for something tried, shadowgraph_record_fact for an observation, shadowgraph_remember for a note'). This is direct routing guidance rather than leaving the choice to inference.

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

shadowgraph_record_factA

Record one observed fact as a project and key, with a claimed provenance class and optional validity window. Use for the fact keys reopenWhen rules name; shadowgraph_remember stores durable memory that is not an observation. Supersedes the previous active fact, keeping it as history. No input can make a fact verified. Each call commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesFact name, unique per project among active facts. Required and non-empty. Use the same key that a decision’s reopenWhen rules refer to.
actorNoWho performed this write, such as an agent or person name. Stored for audit; never used to grant trust.
valueNoAny lossless JSON value: string, finite number, boolean, null, array, or object.
clientNoWhich client software performed this write, such as the host application name.
sourceNoLegacy alias for sourceClass. An unknown label downgrades to agent_claimed with the raw label kept in sourceRaw.
projectNoProject namespace. Defaults to "default"; an empty string is rejected.
expiresAtNoISO 8601 instant after which shadowgraph_maintain expires this fact. Combined with validTo, the earlier boundary wins.
sessionIdNoCaller-owned identifier that groups related writes in the audit trail.
confidenceNoHow much the caller trusts this observation, 0-1. Defaults to 0.5. It does not verify anything.
sourceClassNoClaimed origin, never proof: agent_claimed (the default), tool_observed, human_confirmed, or production_verified. It weights confidence only. An unrecognised label downgrades to agent_claimed, kept verbatim in sourceRaw.
idempotencyKeyNoRetry key scoped by project and operation: reuse it so a retry returns the first result instead of writing a duplicate. Without it every call creates a new entity.
verificationStatusNoOnly "contradicted" may be set by a caller, because it lowers trust. "verified" and "expired" are rejected: verification is not self-assertable and expiry is owned by shadowgraph_maintain.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoStable entity identifier.
keyYesFact name, unique per project among active facts.
kindNoEntity kind: decision, attempt, memory, fact, relation, review, or alternative.
actorNoWho performed the write.
valueNoThe observed value, any lossless JSON value.
clientNoWhich client performed the write.
sourceNoLegacy alias of sourceClass, retained for compatibility.
statusNoactive, superseded, or expired.
projectNoProject namespace; records imported from a schema that predates projects may carry null.
temporalNoBi-temporal window: validFrom, validTo, recordedAt, invalidatedAt.
createdAtNoISO 8601 creation time.
expiresAtNoCaller-declared expiry instant, or null.
sessionIdNoSession identifier recorded with the write.
sourceRawNoThe original origin label when it differed from sourceClass. Audit only; never evidence.
updatedAtNoISO 8601 time of the last change.
confidenceNoCaller-declared confidence in the observation, 0-1.
observedAtNoISO 8601 time the fact was observed.
sourceClassNoClaimed origin class recorded with the write. A claim, never proof.
verificationNoPresent only on a signed verification: the attestation this build checked.
schemaVersionNoStorage schema version this entity was written under. A value above the build’s own version is preserved rather than downgraded.
validityPolicyNoDeclared expiry inputs and the effective expiration boundary derived from them.
verificationStatusNounverified, contradicted, expired, or verified. Only the separately configured signed-evidence verifier can produce verified.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that a call supersedes the previous active fact while retaining history, that verification cannot be self-asserted, and that each call commits a revision. These are meaningful behavioral traits needed for safe invocation and are not redundant with readOnlyHint/idempotentHint/destructiveHint.

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

Conciseness5/5

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

Four short sentences, each earning its place: the core operation is front-loaded, followed by usage routing and key behavioral caveats. There is no filler or duplicated schema content.

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

Completeness5/5

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

Given the rich 100%-covered input schema and existing output schema, the description covers what an agent needs for selection and invocation: what a fact is, when to use it, how it replaces prior facts, and the verification limitation. Remaining details live in the schema where they belong.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all 12 parameters. The description adds high-level framing ('claimed provenance class', 'optional validity window') but no detail beyond what the schema's sourceClass and expiresAt descriptions already provide, so the baseline applies.

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?

Description states a specific action ('Record one observed fact') with resource scope ('as a project and key') and distinguishes itself from shadowgraph_remember by defining the fact-key use case that triggers reopenWhen rules. This lets an agent select it correctly among the many record_* siblings.

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

Usage Guidelines5/5

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

It explicitly says when to use the tool ('Use for the fact keys reopenWhen rules name') and points to the alternative for non-observations ('shadowgraph_remember stores durable memory that is not an observation'). This is direct when/when-not guidance rather than leaving selection to inference.

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

shadowgraph_record_outcomeA

Record how a decision turned out and move its confidence by an evidence-weighted amount. shadowgraph_confidence_evidence records evidence short of an outcome, shadowgraph_update_status changes the lifecycle state. One outcome contribution per decision, so re-recording replaces rather than stacking, restamps it, and commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
outcomeYesThe outcome to record.
decisionIdYesIdentifier of an existing decision, as returned by shadowgraph_record_decision, shadowgraph_search, or shadowgraph_retrieve.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesStable entity identifier.
goalNoWhat the decision was trying to achieve.
kindYesEntity kind: decision, attempt, memory, fact, relation, review, or alternative.
actorNoWho performed the write.
titleNoShort name of the decision.
chosenNoThe option that was chosen.
clientNoWhich client performed the write.
statusNoLifecycle state. Legacy records may carry a value this build does not recognise; shadowgraph_validate reports those.
outcomeNoThe recorded outcome, or null until one is recorded.
projectNoProject namespace; records imported from a schema that predates projects may carry null.
evidenceNoNormalised evidence entries: source, type, sourceClass, confidence, observedAt, detail.
createdAtNoISO 8601 creation time.
migrationNoPresent only on migrated records; records the legacy value a field was mapped from.
sessionIdNoSession identifier recorded with the write.
sourceRawNoThe original origin label when it differed from sourceClass. Audit only; never evidence.
updatedAtNoISO 8601 time of the last change.
confidenceNoAuditable confidence: initial, current (0-1), policy, a history entry per move, and a basis summarising the contributions it was folded from. Legacy records may lack basis.
supersedesNoIdentifiers of decisions this one replaced.
assumptionsNoAssumptions the decision rests on. Searchable content.
reviewAfterNoISO 8601 instant after which shadowgraph_maintain marks this decision stale.
sourceClassNoClaimed origin class recorded with the write. A claim, never proof.
alternativesNoRejected alternatives, each with id, label, reasonRejected, status, and the reopenWhen rules that make it reconsiderable.
supersededByNoIdentifier of the decision that replaced this one.
schemaVersionNoStorage schema version this entity was written under. A value above the build’s own version is preserved rather than downgraded.
failedAttemptsNoAttempt identifiers or notes attached to this decision.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses important non-obvious behavior: one outcome contribution per decision, re-recording replaces rather than stacks, restamps the observation time, and commits a revision. This goes well beyond the bare annotations and gives the agent a realistic model of side effects.

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

Conciseness5/5

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

Three sentences, each earning its place: purpose, sibling differentiation, and replacement semantics. The most important and distinguishing information is front-loaded, with no redundant filler.

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

Completeness5/5

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

For a two-parameter tool with a fully documented schema and an output schema, the description covers the essential behavioral context: what the tool does, how it differs from related tools, and the non-idempotent replacement behavior. Nothing critical is missing for safe invocation.

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?

The input schema has 100% coverage with detailed descriptions for both decisionId and outcome, including how each status affects confidence and how sourceClass weights movement. The description adds only the general notion of evidence-weighted movement, which is a reasonable baseline since the schema carries the parameter detail.

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

Purpose5/5

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

The description states a specific action ('Record how a decision turned out') and the resulting effect ('move its confidence by an evidence-weighted amount'). It also explicitly differentiates itself from shadowgraph_confidence_evidence and shadowgraph_update_status, which helps an agent distinguish this tool from close siblings.

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 gives clear boundaries: shadowgraph_confidence_evidence is for evidence short of an outcome, shadowgraph_update_status is for lifecycle state changes, and this tool is for recording an outcome. It also notes that re-recording replaces prior recording, providing practical guidance for repeated use.

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

shadowgraph_redactA
Read-onlyIdempotent

Return a redacted copy of the store export, with secret-looking keys and values replaced. shadowgraph_backup writes an unredacted snapshot to disk, shadowgraph_purge actually removes data. Reads only, writes no file, and redacts journal payloads too, so a secret cannot survive in the audit trail.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNoLimit the export to one project. Omit to redact everything.
patternsNoCase-insensitive regular expressions matched against key names, replacing the default set (password, secret, token, api[-_]?key, authorization, private[-_]?key). Supplying this replaces the defaults rather than adding to them; idempotency keys, evidence references, and signatures are always redacted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
factsYesObserved facts with their provenance claims.
eventsYesCompatibility event log.
journalYesThe append-oriented journal.
recordsYesDecisions, attempts, and memories.
revisionYesConcurrency token of the state this export was taken from.
relationsYesRelationships.
journalSeqYesHighest journal sequence issued.
idempotencyYesRetry-key entries, each { key, value }.
journalEpochYesFirst replayable sequence, or null when nothing is replayable.
reviewSignalsYesPersisted review signals.
schemaVersionYesStorage schema version of this export.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations already declaring readOnlyHint=true and idempotentHint=true, the description adds concrete behavioral guarantees: no file is written, and journal payloads are also redacted so secrets cannot survive in the audit trail. This is meaningful context that annotations alone do not provide.

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

Conciseness5/5

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

The description is compact, front-loaded with the core purpose, and every sentence adds value: purpose, sibling contrast, and behavioral guarantees. There is no filler or repetition of schema-only details.

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

Completeness5/5

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

For a 2-parameter, no-required-parameter tool with an output schema, the description is complete: it states the operation, differentiates from destructive and backup siblings, and discloses the critical journal-redaction behavior. Nothing necessary for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters and the default pattern set. The description adds the general notion of 'secret-looking keys and values' but does not significantly extend the parameter semantics already present in the input schema.

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

Purpose5/5

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

The description uses a specific verb ('Return') and resource ('redacted copy of the store export'), and immediately differentiates itself from shadowgraph_backup and shadowgraph_purge. An agent can tell exactly what the tool does without opening the schema.

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

Usage Guidelines4/5

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

The description clearly positions the tool as a safe, non-writing alternative to shadowgraph_backup and shadowgraph_purge, and states that it reads only and writes no file. It does not explicitly enumerate all when-not-to-use scenarios, but the contrast with the two most relevant siblings provides clear routing guidance.

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

shadowgraph_rememberA

Add or reconcile one scoped memory, or apply an ADD/UPDATE/DELETE/NOOP plan, by identity tuple. Use shadowgraph_record_decision for a choice, shadowgraph_record_fact for an observation, shadowgraph_recall to read memory back. Identical content is a NOOP, new content supersedes and keeps history, DELETE invalidates; every call commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoStable caller-chosen name within this scope and type, such as hotel-style. Reusing it reconciles that memory rather than adding a second one.
tagsNoFree-form labels stored with the memory. Part of the compared content, so changing them produces a new version.
textNoThe memory content itself. Stored verbatim, searched as content, and compared to decide ADD, UPDATE, or NOOP.
actorNoWho performed this write, such as an agent or person name. Stored for audit; never used to grant trust.
scopeNoScope selector. Omitted or partial fields mean explicit nulls, not "any": identity is the exact (project, userId, agentId, runId, memoryType, key) tuple, so a run-scoped memory never leaks into a user-only read.
clientNoWhich client software performed this write, such as the host application name.
projectNoProject namespace. Defaults to "default"; an empty string is rejected.
validToNoISO 8601 instant after which it stops being true, or null for open-ended. Must be later than validFrom.
metadataNoCaller-owned JSON object kept with the memory. Part of the compared content, so changing it produces a new version.
embeddingNoCaller-supplied vector for this text. Omit to use the configured embedding provider; with no provider the record is still stored and recall reports semantic.available=false instead of renaming lexical overlap as semantic.
sessionIdNoCaller-owned identifier that groups related writes in the audit trail.
validFromNoISO 8601 instant from which this memory is true in the modeled world. Defaults to the write time. Writes for one identity must arrive in non-decreasing validFrom order.
memoryTypeNoWhich kind of memory this is, and part of its identity. preference and profile are durable user facts, goal a desired state, instruction an operating constraint, procedure reusable steps, episode a recallable event, note general knowledge.
operationsNoA batch plan. Supply this instead of a single memory, typically from an extraction step. Every operation is validated before the first one is applied, so a malformed late operation cannot leave a half-applied batch.
sourceClassNoClaimed origin, never proof: agent_claimed (the default), tool_observed, human_confirmed, or production_verified. It weights confidence only. An unrecognised label downgrades to agent_claimed, kept verbatim in sourceRaw.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=false, idempotent=false), the description adds meaningful behavior: identical content is a NOOP, new content supersedes while keeping history, DELETE invalidates, and every call commits a revision. This clarifies the mutation model and confirms why the operation is neither idempotent nor genuinely destructive.

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 dense sentences carry distinct value: what the tool does, which siblings to use instead, and core behavioral semantics. The most important action is front-loaded, and no sentence is filler.

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

Completeness5/5

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

For a complex 15-parameter tool with a rich output schema and fully commented input schema, the description covers the essential selection and invocation information: single-memory vs batch plan, identity-tuple reconciliation, history preservation, and sibling routing. Remaining operational details live appropriately in the schema definitions.

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?

The input schema is exhaustively self-documenting with 100% description coverage, so the description does not need to repeat parameter details. It adds useful framing like 'by identity tuple' and the reconcile/supersede/NOOP behavior, but does not independently clarify individual parameters beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Add or reconcile one scoped memory, or apply an ADD/UPDATE/DELETE/NOOP plan.' It clearly distinguishes itself from sibling tools by directing decision memories to shadowgraph_record_decision, factual observations to shadowgraph_record_fact, and reads to shadowgraph_recall.

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 sibling alternatives ('Use shadowgraph_record_decision for a choice, shadowgraph_record_fact for an observation, shadowgraph_recall to read memory back'), giving an agent clear routing signals. It also clarifies the batch-plan mode versus single-memory mode as two valid ways to invoke this tool.

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

shadowgraph_repair_planA
Read-onlyIdempotent

Return the non-destructive repair plan implied by the current diagnostics. Use after shadowgraph_validate; there is no apply tool, so the caller carries out every action with ordinary tools. Never mutates: the result always carries apply:false, and anything ambiguous is routed to manual_review.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
applyYesAlways false: this tool proposes, it never repairs.
actionsYesOne action per diagnostic.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate readOnly, idempotent, and non-destructive, and the description adds useful behavior beyond that: the result always carries apply:false, and ambiguous cases are routed to manual_review. This clarifies what the tool actually returns and what it cannot do.

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 short sentences, with the core purpose front-loaded and every sentence adding necessary operational detail. No filler or repetition beyond what serves the agent's decision-making.

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?

The description fully covers the operational context: when to call it, what it returns, that it never applies changes, and how ambiguity is handled. Since an output schema exists, return-value details do not need to be restated.

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

Parameters4/5

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

The tool has zero parameters, so there is nothing for the description to clarify. Schema coverage is trivially complete, and the baseline for zero-parameter tools is 4.

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

Purpose5/5

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

The description uses a specific verb ('Return') and a specific resource ('the non-destructive repair plan implied by the current diagnostics'). It clearly distinguishes this from siblings like shadowgraph_validate and shadowgraph_redact by emphasizing that it only returns a plan and never applies changes.

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?

It explicitly states when to use the tool ('Use after shadowgraph_validate') and explains that the caller must execute the plan with ordinary tools because no apply tool exists. It does not spell out explicit when-not-to-use conditions, but the guidance is unambiguous enough for correct selection.

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

shadowgraph_restoreA
Destructive

Replace the entire live store with the contents of a JSON or SQLite backup. Recovery only, never a merge: shadowgraph_purge removes one project, shadowgraph_backup makes the snapshot this reads. Destructive: every record and journal entry is replaced and a strictly greater revision installed. A failure is rolled back.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesServer-side path of the backup to install. Required. It must match the configured storage backend: a JSON export cannot overwrite a SQLite database. The backup file itself is never rewritten.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceYesPath the backup was read from.
recordsNoRecords installed. JSON restores only.
unchangedNoTrue when source and destination were the same path and nothing was replaced.
destinationYesPath of the store that was replaced.
artifactCleanupNoCleanup outcome: status complete, incomplete, or unknown, plus any per-path errors.
recoveryArtifactNoRetained recovery copy, when one is left behind.
rollbackArtifactNoRetained rollback copy of the previous store, when one is left behind.
unknownArtifactsNoArtifact paths whose existence could not be determined, each { path, code }.
retainedArtifactsNoRollback or recovery files still present after the restore.
temporaryArtifactNoRetained temporary file, when one is left behind.

TDQS

A5/5.0
Behavior5/5

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

The annotations already flag destructive behavior, but the description adds meaningful detail: every record and journal entry is replaced, a strictly greater revision is installed, and a failure is rolled back. This goes well beyond what the annotations alone communicate.

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 dense sentences carry the core action, the sibling differentiation, the destructive consequences, and the rollback guarantee. There is no filler or repetition; every sentence contributes essential information.

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

Completeness5/5

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

For a destructive, single-parameter restore operation, the description covers what it does, when to use it, what it destroys, how it relates to backup/purge, and failure behavior. The output schema exists and annotations cover the remaining concerns, so nothing needed for safe invocation is missing.

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?

Although the schema already documents the source path thoroughly, the description adds the accepted backup formats ('JSON or SQLite') and the rest of the schema reinforces required backend compatibility. With only one required parameter and full schema coverage, the parameter meaning is exceptionally clear.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Replace the entire live store with the contents of a JSON or SQLite backup.' It also distinguishes itself from close siblings by noting that shadowgraph_purge removes one project and shadowgraph_backup creates the snapshot this tool reads.

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

Usage Guidelines5/5

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

It explicitly states this is 'Recovery only, never a merge,' which tells an agent when to choose it and when not to. It also names the relevant alternatives and what they do, making the tool's role in the workflow clear.

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

shadowgraph_retrieveA
Read-onlyIdempotent

Retrieve records matching a content query together with their one-hop graph neighbours. shadowgraph_search returns matches only, shadowgraph_recall ranks scoped memory, shadowgraph_traverse walks from a known id, shadowgraph_context builds a project working set. Reads only. A neighbour can appear with no content match of its own.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoRestrict results to decisions or to attempts. A structured filter, never a content match.
limitNoMaximum items to return, 1-1000; the default is 50 and completeness.limitSource reports which applied. Out of range is rejected, never silently clamped.
queryNoWhitespace-separated terms matched against the declared content fields (title, goal, chosen, assumption, evidence, alternative, attempt solution, attempt result, attempt reason, environment), exactly as in shadowgraph_search. Omit to retrieve by filters alone.
offsetNoItems to skip before this window. Ordering is total and deterministic, so paging cannot drop or duplicate an item.
statusNoReturn only decisions in this lifecycle state. A structured filter, so matching it is never counted as a content match.
projectNoRestrict to one project, including which neighbours may be pulled in.
minConfidenceNoReturn only decisions whose current confidence is at least this value, 0-1. A structured filter, never a content match.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesThe window actually applied to the matching items.
itemsYesThe items in this window, in deterministic order.
completenessYesDeclares exactly what this response left out, so a truncated result can never look complete.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known without description. The description adds genuinely useful behavior beyond that: results include one-hop neighbours and 'a neighbour can appear with no content match of its own', which is non-obvious and affects how an agent interprets results. It does not contradict any annotation.

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

Conciseness5/5

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

Four short sentences, all informative, with the core operation front-loaded before the sibling comparison. The 'Reads only' sentence and the neighbour-without-match note each add a distinct fact; there is no filler or repetition of schema content.

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

Completeness5/5

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

For a read-only, idempotent, 7-parameter tool with an output schema, the description is complete: it defines the core behavior, distinguishes it from four relevant alternatives, and flags the non-obvious neighbour behavior. Return-value format is covered by the existing output schema, so nothing an agent needs to select or invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter (kind, limit, query, offset, status, project, minConfidence) has its own detailed schema description. The tool description therefore does not need to compensate for undocumented parameters, and the baseline of 3 applies. It does add a small cross-reference by saying the query matches 'exactly as in shadowgraph_search', but the schema already carries the semantics.

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

Purpose5/5

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

The description opens with a specific verb-resource pair: 'Retrieve records matching a content query together with their one-hop graph neighbours', which precisely identifies the tool's function and its unique feature. It also names four sibling tools and states what they do instead, making the differentiation immediate and unambiguous.

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 names the sibling alternatives (shadowgraph_search, shadowgraph_recall, shadowgraph_traverse, shadowgraph_context) and contrasts what each returns or does, so an agent knows when to pick this tool over each one. The phrase 'shadowgraph_search returns matches only' provides a concrete when-not signal, and 'shadowgraph_traverse walks from a known id' covers the main other entry point.

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

shadowgraph_reviewA

List decisions whose rejected alternatives are due again, from reopenWhen rules over stored facts. shadowgraph_review_signals reads persisted ones, shadowgraph_ack_review closes one, shadowgraph_maintain ages first. Persists one signal per newly due decision, deduped by decision and reason; a repeat commits a revision. Returns a bare JSON array.

ParametersJSON Schema
NameRequiredDescriptionDefault
factsNoFact key/value overrides evaluated instead of the stored facts of the same key. Stored facts are used for every key not listed here, so reopen rules still work after a restart.
projectNoReview only this project. Omit to review every project.
changedFactsNoFact keys that just changed. Only string-form reopenWhen rules match this list; it is an ephemeral signal, not durable state.

TDQS

A4.5/5.0
Behavior5/5

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

Although the description begins with 'List,' it transparently discloses the write behavior: 'Persists one signal per newly due decision, deduped by decision and reason; a repeat commits a revision.' It also adds a return-format note, which is useful since no output schema exists. These details go well beyond the sparse annotations.

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

Conciseness5/5

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

The description is dense but well-organized: core purpose first, then sibling differentiation, then side-effect and return behavior. Every sentence adds distinct value without fluff or repetition of the schema.

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

Completeness5/5

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

Despite the absence of an output schema, the description covers the essential behavioral context: what the tool lists, when signals persist, how deduplication works, what a repeat does, what it returns, and how it relates to sibling tools. An agent has enough to decide whether to invoke it and what to expect.

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?

The input schema already describes all three parameters with 100% coverage, so the baseline is 3. The description does not add parameter-specific semantics, but the schema's descriptions are sufficient, including the ephemeral nature of changedFacts and the override behavior of facts.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List decisions whose rejected alternatives are due again, from reopenWhen rules over stored facts.' It clearly identifies the tool's core function and distinguishes it from shadowgraph_review_signals by noting that sibling reads persisted signals while this one lists newly due decisions.

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?

The description names relevant siblings and their roles ('shadowgraph_review_signals reads persisted ones, shadowgraph_ack_review closes one, shadowgraph_maintain ages first'), giving an agent a clear map of alternatives. However, it stops short of an explicit 'use this when / use that instead' conditional, leaving some inference to the agent.

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

shadowgraph_review_signalsA
Read-onlyIdempotent

List the review signals already persisted, optionally narrowed to a project or to open or acknowledged ones. shadowgraph_review re-evaluates reopen rules and can create signals, shadowgraph_ack_review closes one. Reads only. Acknowledged signals are retained rather than deleted. Returns a bare JSON array, not paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by state. Omit to return both.
projectNoOnly signals whose decision belongs to this project. Omit for every project.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already carry readOnlyHint, idempotentHint, and destructiveHint, and the description adds meaningful behavior beyond those: acknowledged signals are 'retained rather than deleted', and the tool returns a 'bare JSON array, not paginated'. These details affect how the agent interprets results and avoids assuming pagination or destructive cleanup.

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

Conciseness5/5

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

The description front-loads the core action and filters, then uses parenthetical-style sibling differentiation and behavioral notes. Every sentence adds distinct value: listing, alternative routing, safety, retention semantics, and return shape. There is no redundant filler.

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

Completeness5/5

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

For a simple two-optional-parameter read tool with no output schema, the description covers everything an agent needs: what it lists, how to filter, how it differs from related tools, safety, retention behavior, and the exact return shape. The lack of an output schema is compensated by the explicit 'bare JSON array, not paginated' statement.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter already documented in the input schema. The description's mention of narrowing 'to a project or to open or acknowledged ones' paraphrases the schema rather than adding new semantic meaning, so the baseline score of 3 applies.

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

Purpose5/5

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

The description opens with the specific verb 'List' and the resource 'review signals', then immediately clarifies the optional filters (project, open/acknowledged). It distinguishes itself from the closely named shadowgraph_review and shadowgraph_ack_review by describing what those tools do differently, so an agent can confidently identify which tool fits.

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 contrasts this tool with shadowgraph_review ('re-evaluates reopen rules and can create signals') and shadowgraph_ack_review ('closes one'), making the alternative selection criteria clear. It also states 'Reads only', which tells the agent this is the safe inspection tool among the review-related siblings.

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

shadowgraph_supersedeA

Mark one decision superseded by a replacement in the same project. shadowgraph_update_status handles ordinary lifecycle moves, shadowgraph_link any other relationship. Nothing is deleted: the previous decision stays searchable. A repeat returns the same result and commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
decisionIdYesThe decision being replaced. It becomes superseded and is excluded from current context.
replacementIdYesThe decision replacing it. Must be in the same project and must not be superseded, archived, abandoned, or stale.

Output Schema

ParametersJSON Schema
NameRequiredDescription
previousYesA stored decision, including its alternatives and auditable confidence basis.
relationYesThe supersedes relationship, or null when a repeated supersession found none to report.
replacementYesA stored decision, including its alternatives and auditable confidence basis.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, open-world, idempotent, and destructive hints. The description adds meaningful context beyond those flags: nothing is deleted, repeats return the same result but still commit a revision, and superseded decisions are excluded from current context. This is especially useful because idempotentHint is false yet the call appears repeatable.

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

Conciseness5/5

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

Four short sentences, each carrying distinct information: the operation, sibling differentiation, persistence behavior, and repeat semantics. The main purpose is front-loaded, and there is no redundant wording.

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 two-parameter operation with a fully described schema and an output schema, the description covers all essential behavioral aspects: what it does, constraints, side effects, and repeat behavior. No missing information would prevent correct invocation.

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

Parameters3/5

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

Schema coverage is 100% and both parameter descriptions are already detailed, stating which decision is replaced and which one replaces it, including validity constraints. The description adds little beyond the schema because the schema already conveys the semantic relationship and project-scope requirement.

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

Purpose5/5

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

States a specific verb ('Mark') and resource ('decision superseded by a replacement') with a project-scope constraint. It names sibling tools that handle other cases, so an agent can distinguish this operation without opening other definitions.

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

Usage Guidelines5/5

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

Explicitly routes ordinary lifecycle moves to shadowgraph_update_status and other relationships to shadowgraph_link, clarifying when to choose this tool. It also notes the same-project requirement and the non-deletion behavior, giving the agent clear selection criteria.

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

shadowgraph_traverseA
Read-onlyIdempotent

Walk relationships outward from one entity id and return what is reached. Find ids first with shadowgraph_search or shadowgraph_recall; shadowgraph_retrieve searches content and adds neighbours. Reads only. Memory outside the requested project and scope stays hidden.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity id to start from. Must exist.
depthNoHow many relationship hops to follow, 1-10. Defaults to 1. Anything outside the range is rejected.
scopeNoScope selector. Omitted or partial fields mean explicit nulls, not "any": identity is the exact (project, userId, agentId, runId, memoryType, key) tuple, so a run-scoped memory never leaks into a user-only read.
projectNoProject whose memory nodes are visible during the walk. Defaults to "default"; decisions, facts, and attempts are not filtered by it.
relationNoFollow only relationships with this exact name. Omit to follow all of them.
directionNoout follows relationships whose from is in the frontier, in follows their to, both follows either. Defaults to both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rootYesThe entity the walk started from.
depthYesThe hop limit that was applied.
nodesYesEntities reached, root first. Mixed kinds, including alternatives synthesised from their decision.
directionYesThe direction that was applied.
relationsYesRelationships traversed. Named relations, not "edges".

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description adds a meaningful behavioral boundary: memory outside the requested project and scope stays hidden. This goes beyond the annotations and clarifies the privacy/visibility model.

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 tightly written sentences with no filler. The purpose is front-loaded, followed by sibling routing, then the read-only and scope-boundary behavior. Every sentence earns its place.

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

Completeness4/5

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

With a rich output schema and strong annotations, the description covers what is needed for selection and invocation: prerequisites, alternative tools, and the scope-privacy boundary. Minor gaps like result shape are already addressed by the output schema.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already has detailed semantic documentation. The description only adds context for the starting id; depth, scope, relation, and direction semantics are fully handled by the schema, so baseline 3 is appropriate.

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?

Description states a specific action and resource: walking relationships outward from one entity id and returning what is reached. It also distinguishes itself from siblings by directing the agent to shadowgraph_search or shadowgraph_recall for finding ids and noting shadowgraph_retrieve's content-plus-neighbors behavior.

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?

Provides clear routing guidance: find ids first with shadowgraph_search or shadowgraph_recall, and use shadowgraph_retrieve when content search plus neighbors is needed. It does not exhaustively state when not to use the tool, but the context is strong enough for correct selection.

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

shadowgraph_update_statusA

Move one decision to another lifecycle state. shadowgraph_supersede replaces a decision, shadowgraph_maintain alone produces stale, shadowgraph_record_outcome records the result. stale and superseded are system-owned and rejected. Setting the current state writes nothing but still commits a revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesTarget state. Legal moves are proposed to planned/in_progress/abandoned/archived; planned to in_progress/abandoned/archived; in_progress to executed/failed/abandoned/archived; executed to validated/failed/reconsidered/archived; validated to reconsidered/archived; failed to reconsidered/abandoned/archived; reconsidered to planned/in_progress/abandoned/archived; stale to reconsidered/archived; abandoned to archived. stale and superseded cannot be set by a caller.
decisionIdYesIdentifier of an existing decision, as returned by shadowgraph_record_decision, shadowgraph_search, or shadowgraph_retrieve.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesStable entity identifier.
goalNoWhat the decision was trying to achieve.
kindYesEntity kind: decision, attempt, memory, fact, relation, review, or alternative.
actorNoWho performed the write.
titleNoShort name of the decision.
chosenNoThe option that was chosen.
clientNoWhich client performed the write.
statusNoLifecycle state. Legacy records may carry a value this build does not recognise; shadowgraph_validate reports those.
outcomeNoThe recorded outcome, or null until one is recorded.
projectNoProject namespace; records imported from a schema that predates projects may carry null.
evidenceNoNormalised evidence entries: source, type, sourceClass, confidence, observedAt, detail.
createdAtNoISO 8601 creation time.
migrationNoPresent only on migrated records; records the legacy value a field was mapped from.
sessionIdNoSession identifier recorded with the write.
sourceRawNoThe original origin label when it differed from sourceClass. Audit only; never evidence.
updatedAtNoISO 8601 time of the last change.
confidenceNoAuditable confidence: initial, current (0-1), policy, a history entry per move, and a basis summarising the contributions it was folded from. Legacy records may lack basis.
supersedesNoIdentifiers of decisions this one replaced.
assumptionsNoAssumptions the decision rests on. Searchable content.
reviewAfterNoISO 8601 instant after which shadowgraph_maintain marks this decision stale.
sourceClassNoClaimed origin class recorded with the write. A claim, never proof.
alternativesNoRejected alternatives, each with id, label, reasonRejected, status, and the reopenWhen rules that make it reconsiderable.
supersededByNoIdentifier of the decision that replaced this one.
schemaVersionNoStorage schema version this entity was written under. A value above the build’s own version is preserved rather than downgraded.
failedAttemptsNoAttempt identifiers or notes attached to this decision.

TDQS

A4.3/5.0
Behavior4/5

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

The description adds meaningful non-obvious behavior beyond the annotations: stale and superseded are system-owned and rejected, and setting the current state 'writes nothing but still commits a revision.' This clarifies side effects and edge-case behavior. It does not contradict the annotations, and the annotations already signal a mutating operation.

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 short sentences cover the core action, sibling differentiation, and two important behavioral caveats. The main purpose is front-loaded, and every sentence adds value without redundancy.

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

Completeness5/5

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

For a two-parameter tool with a fully documented schema and an output schema present, the description covers the operation, alternatives, restrictions, and the subtle current-state behavior. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the status parameter's legal-move matrix is fully documented in the schema. The description adds general operational context but does not need to restate parameter details. Baseline 3 is appropriate because the schema carries the parameter-semantics burden.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Move one decision to another lifecycle state.' It also differentiates this tool from close siblings by noting what shadowgraph_supersede, shadowgraph_maintain, and shadowgraph_record_outcome do, making the tool's purpose unmistakable.

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?

The description gives useful context for choosing among related tools by contrasting update_status with supersede, maintain, and record_outcome. It also states constraints such as stale and superseded being system-owned. It does not explicitly spell out a 'use X when...' rule, but the alternatives are clearly named and their roles distinguished.

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

shadowgraph_validateA
Read-onlyIdempotent

Report graph integrity diagnostics by severity, without modifying storage. shadowgraph_repair_plan shows what a fix would involve, shadowgraph_rebuild tests whether the journal reproduces the data. Reads only. Legacy data is named rather than guess-repaired, and newer-schema data is reported, not downgraded.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYesFalse when any error or unsupported issue is present.
countsYesIssue counts per severity.
issuesYesEvery diagnostic found, each with a stable code and severity.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the read-only nature is covered. The description adds valuable behavior beyond annotations: it reports by severity, never modifies storage, names legacy data instead of guess-repairing, and reports newer-schema data without downgrading it. No contradiction with annotations.

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

Conciseness5/5

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

Three sentences with no filler; the primary purpose and read-only behavior are front-loaded, then sibling distinctions and legacy-data handling are stated economically. Every sentence earns its place.

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 parameters, an output schema available, and strong annotations, the description covers all necessary guidance: what it reports, that it is read-only, how it relates to sibling tools, and how it handles legacy and newer-schema data. Nothing important is missing.

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

Parameters4/5

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

The tool has zero parameters and the schema is an empty object, so there are no parameter semantics for the description to clarify. Baseline 4 applies because parameter explanation is not needed.

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

Purpose5/5

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

The description states a specific verb and resource: 'Report graph integrity diagnostics by severity.' It also differentiates itself from shadowgraph_repair_plan and shadowgraph_rebuild by describing what those tools do versus this one, so an agent can distinguish them.

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?

The description clearly identifies the tool's diagnostic role and contrasts it with shadowgraph_repair_plan (what a fix would involve) and shadowgraph_rebuild (tests journal reproduction). It does not explicitly state 'use when' or list exclusions beyond those two, but the context is clear enough for selection.

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

TDQS

A4.1/5.0
Disambiguation4/5

Most tools have clearly distinct purposes and the descriptions cross-reference related tools, so an agent can usually select correctly. However review vs review_signals and search/retrieve/recall are close enough that a model needs to read carefully to avoid selecting the wrong read/evaluate variant.

Naming Consistency4/5

All tools share the shadowgraph_ prefix and snake_case style, which gives the surface a consistent feel. But the pattern mixes bare verbs (review, rebuild, search), noun phrases (context, journal, confidence_evidence), and verb_noun forms (record_decision, purge_preview), so it is not fully predictable.

Tool Count2/5

27 tools is above the threshold for a heavy surface, and several clusters are over-fragmented: search/retrieve/recall/context/traverse, review/review_signals, and purge/purge_preview could be consolidated. While the domain is broad, the count feels excessive for an agent to navigate.

Completeness4/5

The core decision/memory lifecycle is well covered: record, recall, update, supersede, review, backup, restore, purge. The main gaps are the explicitly missing unlink operation for relationships and no direct apply tool for repair_plan, though agents can work around these via other tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Persistent graph-based memory for AI agents, stored as plain markdown — no vector DB. Typed nodes and 11 relation types via 5 MCP tools (search, get, create, link, related), stdio and HTTP/SSE transports.
    3
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Local-first cross-agent memory for AI coding agents. Persistent, shared memory over MCP — what you tell one agent can be recalled by another — with all data stored in a single local SQLite file, no cloud and no API keys.
  • A
    license
    A
    quality
    A
    maintenance
    Local-first, source-traceable memory for AI agents — no LLM at ingest, $0 per message, zero data egress. Gives Claude Code, Cursor, and any MCP client one shared persistent memory with semantic recall, belief revision, selective forgetting, and a provenance guard that blocks acting on stale or unconfirmed memories.
    23
    14
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Self-hosted decision memory for AI coding agents. Captures decisions with the alternatives you rejected, and warns before an agent re-proposes a rejected approach.
    4
    81
    Apache 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/LiLara-AI/shadowgraph'

If you have feedback or need assistance with the MCP directory API, please join our Discord server