Skip to main content
Glama

Why

You probably use more than one AI agent. Each one starts from zero. It does not know what you care about, which corners you never cut, or which decisions you always want to make yourself. So you repeat yourself, correct the same mistakes, and hope nothing consequential happens before you look.

Twin Me Up is a small, local, open-source service that gives every agent the same answers to three questions:

  1. How does this person want this kind of work done? Your confirmed guidance, criteria, exceptions and red lines, briefed to the agent at the start of work.

  2. Am I allowed to do this? Explicit grants, scoped to a workflow and a set of actions, with optional expiry. Anything not granted returns ask. Optional hooks enforce that outside the model.

  3. What did I just learn? Your decisions and corrections become candidate lessons. Only you can confirm them.

It is not a chatbot of you, a personality clone or an autonomous replacement for you. The evidence does not support those claims, and the research explains why.

Related MCP server: agent-rewind

What makes it different

Learning you ratify

Agents propose lessons. Only you confirm, revise, reject or retire them. Every lesson keeps its origin, sources and history.

Authority you grant

Agents act on explicit grants for a workflow and named actions, optionally expiring. Actions in the reserved twin. namespace can never be granted to anyone.

Enforcement outside the model

Pre-action hooks for Hermes, Claude Code and pi block or escalate ungranted tool calls. They fail closed.

Evidence, not vibes

Freeze held-out decisions, then test the twin against a generic assistant and a rules-only baseline. Results come with sample-size warnings.

One twin, every agent

One MCP server, a native pi extension, a CLI bridge and function-calling schemas. Thirteen agent systems and frameworks documented, ten verified live.

Yours

Local SQLite with owner-only files, a tamper-evident audit log, portable export, and erasure that removes everything derived from a record. No telemetry.

Compared with what you might use today

A rules file or system prompt

Built-in agent memory

Twin Me Up

Works across every agent you use

Copied into each one

Within one product

One twin, over MCP

Learns from your corrections

No

Often, automatically

Yes, as proposals

You approve what it learns

You write all of it

Usually after the fact

Always, before it counts

Stops actions you have not allowed

No

No

Yes: grants, ask and hooks

Shows whether it actually helps

No

No

Held-out tests against baselines

Where your data lives

Your files

The vendor

Your machine

Quick start

You need Python 3.11 or later and uv (or pipx). macOS and Linux are tested. Windows should work but is untested.

uv tool install twin-me-up        # or: pipx install twin-me-up
twinmeup init                     # your name and a passphrase, in your own terminal
twinmeup connect --list           # every supported agent system
twinmeup connect claude-code      # the exact steps for one of them, with your paths
twinmeup doctor                   # check everything, including a live MCP handshake

twinmeup init asks for your name and a passphrase. The passphrase guards everything only you should do: confirming lessons, granting authority, exporting and erasing. Agents are never given it, and those commands refuse to run without it.

Only need the MCP server? After twinmeup init, any MCP client can start it with uvx twin-me-up. Prefer the latest code? uv tool install git+https://github.com/GitDakky/twin-me-up.

Upgrading? Run uv tool upgrade twin-me-up (or pipx upgrade twin-me-up), then twinmeup doctor. The FAQ explains what an upgrade changes for your twin.

Using Claude Desktop? After twinmeup init, download the .mcpb desktop extension from the latest release and open it. One bundle works on macOS, Windows and Linux.

Install with one prompt

Already working inside an agent? Paste this into it.

Install Twin Me Up for me and connect it to yourself. Twin Me Up is a local, open-source
work twin: it learns how I make decisions, briefs you at the start of work and tells you when
you need my approval. Repository: https://github.com/GitDakky/twin-me-up

Work step by step and show me each command you run.

1. Install it. Prefer uv:
     uv tool install twin-me-up
   If uv is not available, use pipx:
     pipx install twin-me-up
   If PyPI cannot be reached, install from GitHub instead:
     uv tool install git+https://github.com/GitDakky/twin-me-up
   Then check with: twinmeup version

2. Ask me to run `twinmeup init` myself, in my own terminal, and wait until I say it is done.
   It sets my name and a passphrase that only I know. Do not run it for me, do not ask me for
   the passphrase, and never type a passphrase anywhere.

3. Run `twinmeup connect --list`, pick the entry that matches you (or `generic`), then run
   `twinmeup connect <entry>` and carry out the steps it prints to register the MCP server and
   install the skill. If it offers optional enforcement hooks, show me the action map and the
   hook configuration first, and install them only if I agree.

4. Run `twinmeup doctor` and report the result.

5. If your system needs a new session to load MCP tools, tell me. Otherwise call twin_brief
   for workflow "general" and summarise what it says.

While you work with my twin:
- Call twin_brief at the start of a piece of work.
- Call twin_authorise before anything consequential: sending, paying, publishing, deleting or
  committing on my behalf. If the answer is "ask", prepare a draft, request my approval with
  twin_request_approval, and act only once twin_approval_status says it is approved.
- Give every write a request_id, so a retry never records anything twice.
- When I correct you, record it with twin_record_correction.
- Never try to confirm lessons, approve requests, grant authority, export or erase. Those are
  mine, and the twin will refuse you anyway.

The agent installs the package, connects itself and checks the result. The two steps that matter stay with you: choosing the passphrase, and approving any enforcement hooks. The prompt is also in docs/install-prompt.md.

How it works

flowchart LR
    you([You])
    twin[("Your twin<br/>local store")]
    agent["Any agent"]
    hook{{"Pre-action hook"}}
    you -- "confirm lessons<br/>grant and approve" --> twin
    twin -- "candidate lessons<br/>to review" --> you
    agent -- "twin_brief<br/>twin_authorise<br/>request approval" --> twin
    agent -- "record decisions<br/>and corrections" --> twin
    agent -. "every governed tool call" .-> hook
    hook -- "ungranted: block or ask" --> agent
    hook -- "checks grants" --> twin

The loop

  1. Orient. At the start of work the agent calls twin_brief. It gets your confirmed guidance for the workflow, with boundaries and escalation rules always included, and a list of what it is authorised to do.

  2. Check. Before anything consequential it calls twin_authorise. The answer is allow only when a live grant covers the action. Otherwise it is ask: the agent prepares a draft, requests your approval and waits for your decision.

  3. Learn. When you make a decision or correct the agent, it records the decision or the correction and proposes lessons from it.

  4. Ratify. You review the queue and confirm, revise or reject each lesson. Only confirmed lessons reach future briefs.

  5. Prove. You freeze held-out decisions and test the twin against two baselines before trusting it with more.

Tools your agents get

Tool

What it does

twin_brief

Your confirmed guidance and current authority for a workflow. Call it at the start of work.

twin_authorise

May I do this now? Returns allow with the covering grant, or ask.

twin_request_approval

Ask you to approve one action. You decide in your own terminal.

twin_approval_status

Has the request been approved, declined or not yet decided?

twin_search

Find confirmed guidance relevant to a question.

twin_review_queue

Unconfirmed lessons to show you for review.

twin_track_record

Evidence and stage for a workflow: learning, corrections, evaluations and grants.

twin_next_questions

The most valuable unanswered questions about a recorded decision.

twin_record_decision

Capture a real decision: situation, options, choice, reasons.

twin_amend_decision

Merge your answers to follow-up questions into a recorded decision.

twin_record_correction

Record when you edit, override or reject the agent's work.

twin_propose_lesson

Propose a lesson. It has no authority until you confirm it.

What only you can do

These commands need your passphrase, so agents cannot run them.

Command

Purpose

twinmeup init

Set your name and passphrase

twinmeup lesson confirm, reject, revise, retire

Decide what your twin has learned

twinmeup grant add, revoke

Give or withdraw authority

twinmeup approvals approve, decline

Decide what agents have asked to do

twinmeup eval create, add-case, from-episode, freeze

Build held-out evaluation sets

twinmeup export

Write a portable bundle of your twin

twinmeup erase episode

Erase a decision and everything derived from it

Approvals

An agent that needs an action it has not been granted asks for it, then waits:

  1. twin_authorise says ask. The agent prepares a draft and calls twin_request_approval with a one-line summary of what and why.

  2. You see the request with twinmeup approvals list and decide in your own terminal: twinmeup approvals approve <id>, or twinmeup approvals decline <id> --note "why".

  3. The agent checks twin_approval_status and acts only once it says approved.

An approval grants exactly the action requested, once and for an hour, unless you say otherwise (--uses 3, --for 1d). Where a hook enforces, the tool call that acts spends it, so another attempt needs another request. Every approval and decline is also recorded as a decision, so your twin learns where your lines are. Requests survive restarts, and an agent that asks twice gets its first request back.

Write tools also take an optional request_id. A retry with the same id, after a dropped connection or a crash, returns the first result instead of recording twice.

Works with

twinmeup connect <system> prints the exact steps for each of these, using the paths on your machine. All the guides are also in docs/integrations.md.

System

How it connects

Verified live

Hermes Agent

MCP server, skill, pre_tool_call hook

Connected, all tools discovered

pi

Native extension: brief injection, tools, enforcement

Brief injected, tool called, git push blocked

Claude Code

MCP server, skill, PreToolUse hook

Connected

OpenAI Codex CLI

MCP server

Configuration accepted

Gemini CLI

MCP server

Connected

Cursor and Cursor Agent

MCP server

All tools listed

OpenCode

MCP server

Connected

Pi Durable 1.2.0

Extension (experimental)

Ungranted push blocked; one approval allowed exactly one push; a wait survived a crash and restart

VS Code (Copilot agent mode)

MCP server

Documented, not yet run

Goose

MCP extension

Documented, not yet run

Microsoft Agent Framework

MCP stdio tool

Tools listed and called

OpenAI Agents SDK

MCP stdio server

Tools listed and called

LangChain and LangGraph

langchain-mcp-adapters

Tools listed and called

Anything else

MCP, or OpenAI and Anthropic function schemas with a CLI bridge

Checked in October 2026 against current releases. The host checks ran on 0.1.0; 0.2.0 adds two tools to the same MCP server, and the Pi Durable check ran on 0.2.0. The framework checks are reproducible with scripts/interop/frameworks.py. Got it working somewhere marked "not yet run"? Tell us how.

No MCP? Export function-calling schemas and dispatch calls through the CLI:

twinmeup tools schema --format openai > twin-tools.json
twinmeup --actor agent:my-bot tools call twin_authorise '{"workflow": "general", "action": "email.send"}'

Teach your twin

Start small: one workflow you repeat often, such as reviewing quotes or triaging requests.

1. Write down the red lines. These are carried into every brief and never ranked out.

twinmeup probes onboarding      # questions worth answering for a new workflow
twinmeup lesson propose --workflow quote-review --kind boundary \
  --statement "Never instruct a contractor without my written approval." \
  --origin written_rule --confirm

2. Record real decisions. Agents do this with twin_record_decision as you work. You can also add them yourself from JSON (see examples/); records you add yourself ask for your passphrase, because they carry your name.

twinmeup episode add examples/episode.quote-review.json
twinmeup episode gaps <episode-id>      # what the record does not yet explain

3. Review what it proposes. Nothing an agent proposes has authority until you say so.

twinmeup lesson list --status candidate
twinmeup lesson confirm <lesson-id> --note "Yes, always"
twinmeup lesson revise <lesson-id> --statement "Only for quotes over budget"

4. Grant authority narrowly, and let it expire.

twinmeup grant add --workflow quote-review --action draft.prepare --expires 2026-12-31
twinmeup grant list

Lessons come in seven kinds: fact, criterion, exception, escalation, procedure, boundary and preference. Each records whether it was a written rule, elicited from you, inferred by a model or learned from a correction.

Measure it

Do not trust a twin because it sounds like you. Test it on decisions it has not seen.

twinmeup eval create --name holdout --workflow quote-review
twinmeup eval from-episode <set-id> <episode-id>     # or: eval add-case <set-id> case.json
twinmeup eval freeze <set-id>

export OPENROUTER_API_KEY=...                         # or use endpoint: with a local model
for arm in generic rules twin; do
  twinmeup --actor agent:eval eval run <set-id> --arm $arm --responder openrouter:<model>
done
twinmeup eval report <run-id>

Each case is answered three ways with the same model:

Arm

What the model is given

generic

The task and the options

rules

Plus the rules you wrote down explicitly

twin

Plus everything you have confirmed and your past decisions, excluding held-out cases

The twin has earned its keep only if it beats the rules arm. Reports show agreement with your choices and how often the twin correctly escalated, with warnings when the sample is too small to mean much. twin_track_record moves a workflow from observe to draft to supervised as evidence accumulates. A stage is advice, not authority: more autonomy still needs an explicit grant from you.

docs/pilot-guide.md describes a six-week pilot for one workflow.

Safety model

  • Human-only operations need your passphrase. It is stored as a salted scrypt hash and read from your terminal, never from an agent's arguments.

  • Agents cannot set themselves up as you. Setting up an unprotected twin has to be done from a real terminal.

  • Reserved actions. Anything under twin. can never be granted, so no grant can hand an agent control of the twin itself.

  • Approvals cover one action, once. Only you can approve or decline, with your passphrase. An approval grants exactly the action requested, for one use and an hour unless you say otherwise. Where a hook enforces, every tool call is a new attempt, so an id a host reuses cannot ride on a spent approval.

  • Enforcement fails closed. If a hook cannot reach a decision, the tool call is blocked. The example action maps also stop agents running human-only commands, writing to the twin's store or editing the host configuration that registers the hook.

  • Tamper-evident audit. Every write is appended to a hash chain. twinmeup audit verify checks it.

  • Signed, reproducible releases. Packages are built in GitHub Actions and published to PyPI with trusted publishing and attestations. No long-lived tokens exist.

  • Honest limits. Twin Me Up runs as you. Any program running as your user can read your files. The passphrase stops agents using the twin's own commands to act as you, and hooks stop governed tool calls, but neither is a sandbox. For hard isolation, run agents as a different user or in a container.

See SECURITY.md for the threat model and how to report a vulnerability.

Where it can still fail

Twin Me Up narrows what agents may do. It does not make an agent safe on its own.

  • Without a hook, the twin advises. Over MCP alone it tells an agent what it may do, and nothing stops an agent that ignores it. Enforcement needs a pre-action hook: Hermes, Claude Code, Cursor, pi or Pi Durable.

  • Hooks govern only mapped calls. A tool or command your action map does not match is left to the host's own permissions.

  • Without a hook, an approval is time-boxed, not single-use. The hook is what spends it, so over MCP alone an approved action stays allowed until it expires.

  • A grant is not a sandbox. An allowed action runs with the agent's full permissions.

  • Retries are safe only with a request_id. A write retried without one can be recorded twice.

  • Your passphrase is the boundary. Anyone with it and your terminal can confirm lessons and approve requests. Agents never receive it, and a compromised machine is out of scope.

  • Files are private, not encrypted. The store and settings are readable only by your user account. Encryption at rest is not built in yet.

  • A prediction is not consent. The twin learns how you decide, and never treats a forecast of your answer as your approval.

Your data

  • Everything lives in ~/.twinmeup (set TWINMEUP_HOME to move it). Files are readable by you only.

  • twinmeup export twin.bundle.json writes a portable bundle. Held-out evaluation answers stay sealed unless you ask for them.

  • twinmeup erase episode <id> --reason "..." removes a decision and every lesson, handoff and evaluation case derived from it, and redacts it from the audit log while keeping the chain valid.

  • The twin itself never calls a model and sends nothing anywhere. The only network calls are the evaluation responders you choose to configure.

The research

Before writing code we reviewed the primary research on digital twins of people, expertise transfer and AI assistance. The headline results:

Finding

Source

Interview-based agents reach 65.67% raw accuracy on held-out survey items, against 79.53% consistency for the people themselves

Park et al., arXiv:2411.10109v3

Predicting an individual's own new answers is far harder: 0.300 exact accuracy against 0.446 for the same people answering twice

arXiv:2603.29890v1

Experts described 44% of a procedure's steps unprompted and 66% when prompted

PubMed 24667500

AI assistance raised productivity by 15% on average, with large differences between workers

arXiv:2304.11771v2

Unrestricted AI assistance left students 17% below control once it was removed

PNAS, Bastani et al.

That is why the twin never infers authority, why learning needs your confirmation, why it asks follow-up questions about omitted reasons, and why it is tested against baselines instead of trusted on feel. The full review, with every source and the regulatory lines it draws (including the EU AI Act's prohibition on workplace emotion inference), is in docs/research.md.

Command reference

Command

Purpose

twinmeup init

Set up your twin: your name and your passphrase

twinmeup doctor

Check settings, passphrase, store, audit chain and a live MCP handshake

twinmeup version

The installed version

twinmeup status

Record counts and audit-chain health

twinmeup connect <system>

Exact steps to connect an agent system (--list for all)

twinmeup brief

The operating instructions an agent embeds in its prompt

twinmeup handoff

A handoff packet for a receiving agent or colleague

twinmeup authorise

Check authority; exits 0 when allowed and 3 when approval is needed

twinmeup episode add, amend, list, show, gaps

Recorded decisions

twinmeup lesson propose, list, confirm, reject, revise, retire, history

Learned guidance

twinmeup grant add, list, revoke

Authority

twinmeup approvals list, show, approve, decline

Requests from agents; approve and decline are human only

twinmeup eval create, add-case, from-episode, freeze, list, run, report

Held-out evaluation

twinmeup probes onboarding

Interview questions for a new workflow

twinmeup tools list, schema, call

The agent protocol without MCP

twinmeup hook pre-tool-call

Enforcement for host hooks

twinmeup action-map example, matcher, check

Build and test enforcement maps

twinmeup skill export, show

The agent skill that teaches the loop

twinmeup extension export pi, pi-durable

Native extensions for pi and Pi Durable (experimental)

twinmeup audit verify, log

The tamper-evident audit log

twinmeup export

Portable bundle (human only)

twinmeup erase episode

Erasure with derived records (human only)

twin-me-up

The MCP server for uvx twin-me-up. Given a command, the same as twinmeup

Every command has --help. Global options: --home, --actor, --principal and --passphrase-stdin (for scripts you run yourself).

FAQ

No. The twin is deterministic: storage, retrieval, authority and audit. Your agents bring the model. Only eval run with a model responder calls one.

No. It holds the guidance you have confirmed and the decisions you have recorded, and it tells agents what they may do. It does not imitate your voice or personality, and it does not model emotions.

Without hooks the twin is advisory: well-behaved agents follow the skill, but nothing forces them. With hooks (Hermes, Claude Code and pi) or the Pi Durable extension, governed tool calls are checked outside the model, and ungranted ones are blocked or wait for your approval.

Yes, as your own tool. If an organisation deploys twins for its staff, it needs its own assessment of lawful basis, notices and retention, and clear rules on who owns and can revoke each twin. Consent is rarely a sound basis for workplace monitoring. See docs/research.md.

Either. twinmeup is the CLI. twin-me-up is the package's own name: given a command, such as twin-me-up doctor, it does the same as twinmeup. With no command it starts the MCP server, which is what agent hosts and uvx twin-me-up run.

Run uv tool upgrade twin-me-up, or pipx upgrade twin-me-up. If uv says there is nothing to upgrade just after a release, it is reading a cached index: run uv cache clean twin-me-up and try again. A newer version moves your twin to its store format the first time it opens it, and older versions cannot open it after that. Check with twinmeup version and twinmeup doctor.

Give each person their own TWINMEUP_HOME. One twin belongs to one person.

Roadmap

  • Enforcement hooks for more hosts as their hook interfaces allow

  • Encryption at rest for the store

  • Signed bundles for moving a twin between machines

  • A small local review app for lessons and approvals

  • Verified guides for VS Code, Goose and Windows

  • The Pi Durable extension out of experimental, with a verified map for pi's coding tools

Follow along, or pick something up, in issues and discussions.

Contributing

Contributions are very welcome, from a typo fix to a new agent integration. Good first issues are a gentle start, and CONTRIBUTING.md explains the setup, the one-command check and how reviews work. Please report security issues privately, as described in SECURITY.md.

Credit and licence

Twin Me Up was created by GitDakky and is released under the Apache License 2.0. If you redistribute it or build on it, the licence requires you to keep the NOTICE file, which credits the original author. Using it in research? GitHub's "Cite this repository" button gives you a ready-made citation.

If Twin Me Up is useful to you, a star helps other people find it.

Built on the Model Context Protocol.

Available Tools

12 tools
twin_amend_decisionAdd answers to a recorded decisionB

Merge the principal's answers to follow-up questions into a recorded decision.

NameRequiredDescriptionDefault
changesYesFields to merge into the recorded decision, using record_decision names.
episode_idYes
request_idNoOptional idempotency key, for example your tool call id. A retry with the same request_id returns the first result instead of recording twice.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the agent knows this mutates state harmlessly. The word 'merge' usefully signals additive/partial-update semantics rather than a full overwrite, but the description says nothing about permissions, error behavior on a missing episode_id, or how conflicts in merged fields are resolved.

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?

A single well-formed sentence with the action and the destination front-loaded and no filler. It is efficient, though it is arguably too terse to carry the behavioral context a mutating tool needs.

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

Completeness3/5

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

For a mutation tool with no output schema and a nested 'changes' object, the description covers the core intent but omits what the amended decision looks like afterward, whether the prior state is preserved, and the relationship to twin_record_decision. Adequate as a minimum but with clear gaps.

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 67% and the schema already documents 'changes' (merge semantics against record_decision names) and 'request_id' (idempotency key). The description adds the framing that changes are the principal's follow-up answers, but leaves episode_id entirely unexplained beyond its name.

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

Purpose4/5

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

States a specific verb ('merge') and resource (recorded decision) plus the source of the content (the principal's answers to follow-up questions). This distinguishes it from twin_record_decision (which creates the decision) and twin_record_correction, though it does not name those siblings explicitly.

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

Usage Guidelines3/5

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

The mention of 'follow-up questions' implies the usage context (amending an already-recorded decision with answers gathered from twin_next_questions), but there is no explicit when-to-use/when-not-to-use guidance or reference to the alternative tools twin_record_decision and twin_record_correction.

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

twin_approval_statusCheck an approval requestA
Read-onlyIdempotent

Whether the principal has approved, declined or not yet decided a request, and whether the approval is still unused. Poll this while you wait; it changes nothing.

NameRequiredDescriptionDefault
approval_idYesThe approval_id twin_request_approval returned.

TDQS

A3.9/5.0
Behavior3/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 "it changes nothing" largely restates the structured data. The polling guidance adds a useful behavioral cue (safe to call repeatedly while blocked) but nothing about latency, expiry of approvals, or error cases is disclosed.

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?

One sentence, front-loaded with the returned status values, followed by the polling directive. No filler and nothing repeated from the title.

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

Completeness5/5

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

With no output schema, the description carries the return-value burden and does so adequately by enumerating the decision states and the unused flag. Combined with full parameter coverage and rich annotations, an agent has everything needed to call and interpret this tool.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage, and the schema itself explains that approval_id comes from twin_request_approval. The description adds no syntax, format, or validity constraints beyond that, so the baseline 3 applies.

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

Purpose4/5

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

The description states precisely what the tool returns: the principal's decision state (approved/declined/undecided) plus whether the approval is still unused. That makes it clearly distinct from siblings like twin_request_approval or twin_authorise, which act on requests rather than reading their status, though no sibling is named explicitly.

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?

"Poll this while you wait; it changes nothing" gives explicit usage context: this is the tool to call repeatedly while an approval is pending, and it is side-effect free. It stops short of naming an alternative for the case where the approval has already resolved, but the context is clear.

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

twin_authoriseCheck authority for an actionA
Read-onlyIdempotent

Call before any consequential action (sending, paying, committing, writing to live systems). 'allow' means an active grant covers it. 'ask' means stop, prepare a draft and request approval with twin_request_approval.

NameRequiredDescriptionDefault
actionYesThe action you intend to take, for example email.send.
workflowYes
attempt_idNoFor enforcement hooks only: the id of the tool call about to run. It spends one use of an approval; repeating the same attempt_id is safe. Agents leave this unset.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower; the description adds the decision semantics and the required next action, which is genuinely useful context. It does not clarify whether a third outcome (e.g. a hard denial) can occur, which matters for a gate on consequential actions.

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, both earning their place, with the trigger condition front-loaded before the outcome semantics. No filler or restatement of the title.

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 no output schema, the description carries the return-value burden and does explain 'allow' and 'ask'. It leaves open whether other outcomes exist and never explains the required 'workflow' parameter, both of which an agent gating real actions would want.

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 67%: action and attempt_id are documented in the schema, while workflow has no description in either place. The description adds no parameter-level detail (no action naming convention, no workflow semantics), so it does not compensate for the gap — 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 defines a specific function — a pre-flight authority check that returns 'allow' or 'ask' — and spells out what each outcome means. It is clearly distinguishable from the sibling twin_request_approval, which it names as the follow-up path.

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 exactly when to call it ('before any consequential action: sending, paying, committing, writing to live systems') and what to do on each result, routing explicitly to twin_request_approval for the 'ask' case. Nothing is left to inference.

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

twin_briefGet the operating briefA
Read-onlyIdempotent

Call at the start of work in a workflow. Returns the principal's confirmed guidance, hard limits, your authority, stop conditions and how to report back. Embed and follow it.

NameRequiredDescriptionDefault
actionsNoActions you expect to need, for example email.send.
workflowYesWorkflow slug, for example quote-review.
objectiveYesWhat you are about to do, in one sentence.
include_hypothesesNoAlso list unconfirmed proposals, clearly labelled.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. Beyond that, the description discloses the content of the brief (limits, authority, stop conditions, reporting expectations) and an instruction to 'embed and follow it', which is genuine behavioral context. It stops short of describing output format or failure modes.

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 tight sentences, front-loaded with the timing trigger and then the payload. Every clause carries information; there is no filler.

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 no output schema, the description usefully enumerates what the brief contains (guidance, limits, authority, stop conditions, reporting) and the timing trigger. It is nearly complete, though it could note idempotent re-calling or how objective/actions shape the returned guidance.

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 four parameters with format, pattern and examples. The description adds no parameter-level detail, so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and outcome: 'Returns the principal's confirmed guidance, hard limits, your authority, stop conditions and how to report back.' This tells an agent exactly what the tool yields. It does not explicitly contrast itself with siblings like twin_track_record or twin_next_questions, so it falls short of a 5.

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

Usage Guidelines4/5

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

'Call at the start of work in a workflow' gives a clear triggering condition. However, it names no alternatives and states no when-not-to-use case, leaving the agent to infer that later-stage siblings supersede it.

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

twin_next_questionsGet follow-up questions for a decisionC
Read-onlyIdempotent

The most valuable unanswered questions about a recorded decision. Ask them, then amend.

NameRequiredDescriptionDefault
limitNo
episode_idYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so the safety profile is covered. The description adds the useful filtering context that only unanswered, high-value questions are returned. It does not disclose behavior around invalid episode_id or how many results come back when limit is omitted.

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?

Two short sentences, front-loaded with the core scope and ending with the workflow nudge. Nothing is wasted, though the brevity borders on under-specification rather than tightness.

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

Completeness2/5

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

With no output schema, no parameter documentation in the schema, and an ambiguous episode_id, the description should carry more of the burden. It omits result structure, limit behavior, and explicit linkage to the amendment tool, leaving an agent to infer too much.

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

Parameters2/5

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

Schema description coverage is 0% and there are two parameters. The description never explains what episode_id identifies or what limit controls (default 3, max 10), so it fails to compensate for the missing schema documentation.

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

Purpose3/5

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

The description identifies the resource (follow-up questions about a recorded decision) and implies a specific scope ('most valuable unanswered'), but it leads with a noun phrase rather than a verb and never states the operation outright. It is distinguishable from most siblings, though it relies on the title for the 'get' framing.

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

Usage Guidelines3/5

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

'Ask them, then amend' implies a workflow that leads into a decision amendment, which is useful implied guidance. However, it never names the sibling tool (twin_amend_decision) nor states conditions such as when to call this versus twin_brief or twin_review_queue.

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

twin_propose_lessonPropose new guidanceA

Propose a lesson for the principal to confirm. It is never authoritative until confirmed.

NameRequiredDescriptionDefault
kindYes
originNoelicited: the principal said it. inferred: your generalisation. correction: drawn from a correction.inferred
workflowYes
review_byNo
statementYesOne clear, testable rule or fact.
conditionsNo
confidenceNo
request_idNoOptional idempotency key, for example your tool call id. A retry with the same request_id returns the first result instead of recording twice.
episode_idsNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive write, but the description adds genuinely useful lifecycle context that annotations cannot convey: the lesson 'is never authoritative until confirmed', meaning the write is provisional. It stops short of explaining what confirmation involves or how the pending state is surfaced, but the core behavioral caveat is disclosed.

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 short sentences with zero padding; the provisional nature of the tool is front-loaded in the first clause. Nothing in the text is redundant.

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

Completeness3/5

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

For a nine-parameter write tool with low schema coverage and no output schema, the description is thin: it covers the tool's role and lifecycle state but says nothing about the workflow/kind taxonomy, how lessons are reviewed or confirmed, or how to check status (e.g., twin_approval_status). Adequate for orientation, incomplete for correct invocation.

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

Parameters2/5

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

Schema description coverage is only 33%, so several of the nine parameters (kind, workflow, conditions, confidence, episode_ids, review_by) are undocumented in both schema and description. The description adds no parameter meaning whatsoever, leaving the agent to guess at fields like kind, workflow format, and conditions.

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

Purpose4/5

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

States a specific verb and resource ('Propose a lesson') plus the recipient ('for the principal to confirm'), so the agent knows this creates a provisional lesson rather than a settled fact. It does not explicitly distinguish itself from siblings like twin_record_decision or twin_record_correction, so sibling differentiation is left to inference.

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

Usage Guidelines3/5

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

Usage is only implied: the phrase 'for the principal to confirm' suggests this is the pre-confirmation path, but the description never says when to choose this over twin_record_decision, twin_record_correction, or twin_request_approval, and offers no prerequisites or exclusions.

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

twin_record_correctionRecord a correction from the principalA

Call whenever the principal edits, overrides or rejects your work. Captures both versions and the reason as learning material.

NameRequiredDescriptionDefault
reasonNoThe principal's reason, if given.
sourcesNo
workflowYes
situationYesWhat the task was.
request_idNoOptional idempotency key, for example your tool call id. A retry with the same request_id returns the first result instead of recording twice.
agent_proposalYesWhat you proposed or did.
human_decisionYesWhat the principal chose instead.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare write semantics (readOnlyHint=false, destructiveHint=false), so the safety profile is covered. The description adds that the record becomes "learning material," implying an append-only store, but says nothing about immutability, whether corrections can be edited later, or how retries behave beyond the schema's request_id note.

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 short sentences, with the triggering condition front-loaded ahead of the storage behavior. Every clause earns its place and no filler is present.

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

Completeness3/5

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

For a seven-parameter write tool with no output schema, the description covers the core intent but omits practical guidance: whether entries are immutable, how to avoid duplicate records (beyond the schema note), and when to prefer a sibling tool such as twin_record_decision. Adequate but with clear gaps.

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 71% and the description touches the key payload fields implicitly via "both versions and the reason." It adds no guidance on workflow, situation, sources, or request_id, so it neither compensates for nor exceeds what the schema already documents. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb (capture/record) and resource (a correction from the principal), and clarifies that both the agent's version and the human's decision are stored. It is distinguishable from siblings like twin_record_decision, though it does not explicitly draw that line.

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?

"Call whenever the principal edits, overrides or rejects your work" gives an explicit trigger condition, which is strong usage guidance. What is missing is any exclusion or routing rule versus adjacent tools (twin_record_decision, twin_amend_decision, twin_propose_lesson).

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

twin_record_decisionRecord a decision the principal madeB

Capture a real decision: situation, options, choice, reasons for rejected options, cues, what would change it and when to escalate. Returns follow-up questions.

NameRequiredDescriptionDefault
cuesNo
goalNo
chosenNoThe option id the principal chose.
optionsNo
outcomeNo
sourcesNo
rejectedNoOption id to the principal's reason for rejecting it.
workflowYes
rationaleNo
situationYes
request_idNoOptional idempotency key, for example your tool call id. A retry with the same request_id returns the first result instead of recording twice.
escalation_triggersNo
missing_informationNo
reversal_conditionsNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare the safety profile (write, non-destructive, not idempotent, not open-world), so the description's burden is lighter. It adds one useful behavioral fact beyond annotations — 'Returns follow-up questions' — but says nothing about what recording does to downstream state, whether escalation triggers fire anything, or how duplicates are handled.

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?

One dense sentence plus a short return-value fragment, front-loaded with the core verb and the field inventory. Every clause maps to a real parameter, though the comma list is compressed enough that an agent must parse it carefully.

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

Completeness2/5

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

For a 14-parameter mutation tool with 21% schema coverage and no output schema, the description is thin: it covers roughly the decision narrative but omits required-parameter emphasis (workflow and situation are required), provenance via sources, outcome, missing_information, and idempotency. The single-line return note does not compensate for the missing parameter guidance.

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

Parameters3/5

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

Schema description coverage is only 21% across 14 parameters, so the description has to carry weight; it does map several natural-language phrases to parameters (situation, options/choice, reasons for rejected options, cues, 'what would change it' → reversal_conditions, 'when to escalate' → escalation_triggers). However, it leaves workflow, goal, rationale, sources, outcome, and missing_information unexplained, and gives no format or coupling guidance.

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

Purpose4/5

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

States a specific verb+resource ('Capture a real decision') and enumerates the substance being captured (situation, options, choice, rejected-option reasons, cues, escalation triggers), so an agent knows exactly what payload this tool wants. It does not, however, explicitly differentiate itself from twin_amend_decision or twin_record_correction, so it falls short of a 5.

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

Usage Guidelines2/5

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

The word 'real' hints that this records actual (not hypothetical) decisions, but there is no stated when-to-use, no prerequisite, and no routing against the 11 siblings such as twin_amend_decision (existing decision) or twin_record_correction. An agent must infer that this is the creation path.

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

twin_request_approvalAsk the principal to approve an actionA

Call when twin_authorise says 'ask' and the work needs that action. Records one request the principal approves or declines in their own terminal. Do not act until twin_approval_status says approved; an approval covers one attempt unless they say more.

NameRequiredDescriptionDefault
actionYesThe one action you need approved, for example repo.push.
detailsNoAnything that helps them decide: recipients, amounts, a diff summary.
sourcesNo
summaryYesWhat you will do and why, in a sentence or two. The principal decides on this.
workflowYes
request_idNoOptional idempotency key, for example your tool call id. A retry with the same request_id returns the first result instead of recording twice.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare this is a mutation (readOnlyHint=false, destructiveHint=false), and the description adds genuinely new behavioral facts: the principal's decision happens in their own terminal, the caller must not act before approval, and approval is scoped to a single attempt unless extended. It does not say what a decline does or what is returned, but the one-attempt scoping is information the annotations cannot convey.

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

Conciseness5/5

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

Three short sentences, zero filler, and the trigger condition is front-loaded before the constraint and the post-condition. Every clause carries actionable information.

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

Completeness4/5

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

For a 6-parameter mutation tool with no output schema, the description covers the trigger, the gating rule, and the approval scope, which is enough to call it correctly. It leaves the decline path and the shape of the recorded request unstated, minor gaps given the sibling status tool covers outcomes.

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 67%, so most parameters carry their own documentation (action example 'repo.push', details, summary, sources, request_id). The description adds almost nothing parameter-level beyond reiterating that the action/work must be approved. 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: it records one approval request that the principal approves or declines in their own terminal. It also implicitly separates itself from sibling twin_authorise (which decides 'ask') and twin_approval_status (which reports the outcome), so an agent can place it in the workflow without guessing.

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 an explicit trigger condition — 'Call when twin_authorise says ask and the work needs that action' — and names the follow-up gate ('Do not act until twin_approval_status says approved'). This is a precise when-to-use rule with the surrounding siblings named, rather than inferred usage.

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

twin_review_queueList proposals awaiting the principalB
Read-onlyIdempotent

Unconfirmed lessons to present to the principal for confirmation, revision or rejection.

NameRequiredDescriptionDefault
workflowNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds that the queue contains unconfirmed lessons for confirmation, revision, or rejection, but omits return format, pagination, and authentication context.

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?

It is a single, short phrase with no wasted words. It is front-loaded with the resource, though it is a sentence fragment rather than a structured description.

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

Completeness3/5

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

For a simple read-only queue with no output schema, the description gives the essential return content ('unconfirmed lessons'). However, it does not compensate for the undocumented workflow parameter and provides no additional behavioral context beyond what annotations already cover.

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

Parameters1/5

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

The schema has one optional parameter, 'workflow', with 0% description coverage, and the description does not mention it at all. An agent gets no explanation of what the workflow filter does or how omitting it behaves.

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

Purpose4/5

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

The description identifies a clear resource and state: 'Unconfirmed lessons' awaiting the principal. It does not state an explicit verb like 'list' and does not differentiate itself from siblings such as twin_approval_status or twin_search, but the purpose is still clear from the noun phrase.

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

Usage Guidelines3/5

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

The phrase 'to present to the principal' implies the use case—gathering items before a principal review—but there is no explicit when-to-use guidance, prerequisites, or comparison to alternative sibling tools. Usage is inferable rather than stated.

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

twin_track_recordShow how well the twin knows a workflowB
Read-onlyIdempotent

Evidence and stage for a workflow: confirmed learning, corrections, evaluation results, grants and the recommended next step. It recommends; only the principal promotes.

NameRequiredDescriptionDefault
workflowYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, but the description adds real value by resolving the ambiguity created by the name 'track_record' – the tool only surfaces evidence and recommends, it does not promote or mutate state. It still says nothing about cost, latency, or how much history is scanned.

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?

Two compact sentences that front-load what the tool returns before the caveat about promotion. The list is telegraphic but dense; nothing is padding, though the compressed noun stack takes a moment to parse.

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

Completeness3/5

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

There is no output schema, so the description is the only signal about what comes back; it lists the evidence categories and the recommended next step, which is helpful. It nevertheless leaves the stage vocabulary and workflow identifier unexplained for a fairly abstract learning-loop tool.

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

Parameters2/5

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

There is one required parameter with 0% schema description coverage, so the description must carry the burden of explaining what a 'workflow' identifier is and what form it takes. It only alludes to 'a workflow' generically and adds no format, naming, or lookup guidance beyond the regex pattern already in the schema.

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

Purpose4/5

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

States a specific resource (evidence and stage for a workflow) and enumerates the kinds of evidence returned: confirmed learning, corrections, evaluation results, grants, and recommended next step. It partially differentiates from siblings by declaring it only recommends, unlike the promotion/authorise tools, but it never names those siblings.

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

Usage Guidelines3/5

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

Usage is implied rather than stated – an agent infers you call this to inspect how well the twin knows a workflow. The closing clause 'it recommends; only the principal promotes' hints that a different tool handles promotion, but no alternative is named and no when-not condition is given.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.2.1
    • First observedtwin_amend_decision
    • First observedtwin_approval_status
    • First observedtwin_authorise
    • First observedtwin_brief
    • First observedtwin_next_questions
    • First observedtwin_propose_lesson
    • First observedtwin_record_correction
    • First observedtwin_record_decision
    • First observedtwin_request_approval
    • First observedtwin_review_queue
    • First observedtwin_search
    • First observedtwin_track_record

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct step in the principal-agent workflow: brief vs search vs track_record differ by scope and timing; authorise, request_approval, and approval_status form a clear sequence; decision, correction, and lesson tools are clearly separated. Descriptions make intended use unambiguous.

Naming Consistency4/5

All tools use the twin_ prefix and snake_case, which is highly consistent. However, the stems mix verb forms (authorise, search) with noun phrases (approval_status, review_queue, next_questions), so it falls short of a uniform verb_noun pattern.

Tool Count5/5

12 tools is well within the ideal 3–15 range and each maps to a distinct governance function: briefing, authorisation, approvals, decisions, corrections, lessons, and tracking. No obvious redundant or trivial tools.

Completeness4/5

The surface covers the core lifecycle: briefing, authorisation, approval, decision recording/amendment, corrections, lessons, and tracking. Minor gaps exist, such as no explicit decision retrieval by ID or lesson confirmation tool, but these are largely handled by principal-side actions or search.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Gates agent tool execution with human approval, audit trails, and replay-resistant permits, enabling safe use of tools in agent loops.
    16 PyPI
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides AI agents with a transparent proxy and journal for every tool action, including pre-state snapshots and approval gates for risky operations. Enables per-action undo, rewind to a point in time, and a kill switch that agents cannot override.
    6 npm
    Business Source 1.1
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP-compatible AI agents to safely act on business backends by enforcing per-agent permissions, autonomy thresholds, human approval with review-and-edit, and full audit trails.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enforces policy controls for AI agents, including spend limits, action approvals, kill switch, scoped credentials, dry-run diffs, loop prevention, and auditable hash-chained logs.
    MIT