Torus
Sends daily or weekly research digests to Discord, including thesis alerts, status and confidence changes, theses coming due, and scorecard moves.
Delivers research alerts and daily or weekly digests through ntfy push notifications.
Sends daily or weekly research digests to Slack, including thesis alerts, status and confidence changes, theses coming due, and scorecard moves.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TorusIs NVIDIA still supply-bound?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Torus
Stock research memory for Claude Code, Claude Desktop and Codex. Torus gives Claude a memory for your equity research. Before it answers, Claude sees what you already know about a company: your theses, the sourced facts behind them, its suppliers, customers and competitors, and the ideas you ruled out. New research builds on the old, and every new fact is saved with its source. When a new SEC filing or news story threatens a thesis, Torus warns you: on your desktop as it happens, and in a daily or weekly digest by email, Slack, Discord or ntfy.

Ask Claude "Is NVIDIA still supply-bound?" and it starts from what you already concluded, not from scratch. Torus keeps:
the companies you cover and how they connect: suppliers, customers, competitors
claims about them, each tied to its source (a 10-K, an earnings call, an article)
your investment theses: bullish or bearish, the claims they rest on, and what would break them
ideas you ruled out, so you don't research them again
When a 10-K, 10-Q, 8-K or news item lands, Torus works out which of your theses it touches, through which supplier or customer link, and how much it matters. It also keeps the research honest (what's gone stale, what rests on one source, what a skeptic would say) and tracks how your calls did against the market.
Built for analysts, portfolio managers and serious individual investors.
Your model, your subscription. Torus never calls an LLM itself. Claude does the reasoning, and cheaper Haiku subagents do the bookkeeping.
Local-first. Your research stays in one SQLite file under
~/.torus(override withTORUS_HOME).Time-aware. Every fact records when it was true and when you believed it, so you can ask what you thought on any past date. Nothing is deleted: corrections are new versions.
Torus is a research memory, not financial advice. See CHANGELOG.md for what's in each release.
Pick your app
Torus works in three apps. All of them share one graph on your machine, so you can research in one and pick up in another.
Claude Desktop | Codex (desktop app and CLI) | Claude Code | |
Prior research recalled before Claude answers | Yes ( | Yes ( | Yes, automatically on every prompt (hook) |
Sources and claims recorded while researching | Yes (live capture) | Yes (live capture) | Yes (balanced capture, curator fills gaps) |
"Torus recorded ..." receipt after each turn | Yes | Yes | Yes |
Workflows: onboard, review alerts, challenge, memo... | Prompts in the "+" menu | Torus skills |
|
Filing and news alerts, audit, scorecard, memos, explorer | Yes | Yes | Yes |
Desktop notifications and the digest (they come from the watchers, not the app) | Yes | Yes | Yes |
Background Haiku subagents (mapper, curator, challenger) | No: the same steps run in the chat | No: the same steps run in the chat | Yes |
Claude Desktop
pip install torus-kg
torus setupThe package is called torus-kg on PyPI; the command it installs is torus. torus setup asks
for the email the SEC requires, downloads the SEC ticker list, adds Torus to Claude Desktop's
settings (it keeps a .bak copy and leaves your other servers alone), and schedules the filing
watchers. Restart Claude Desktop, then try the Onboard companies prompt from the "+" menu
with a few tickers.
Codex
The same two commands. torus setup adds [mcp_servers.torus] to ~/.codex/config.toml (or
$CODEX_HOME) and installs the Torus skills (torus-research, torus-onboard, torus-review
and so on) under ~/.codex/skills. If you already wrote a [mcp_servers.torus] entry yourself,
setup leaves it as it is. Restart Codex, then ask it to onboard your tickers.
Claude Code
See Getting started below. torus setup also prints the two
/plugin commands.
torus setup configures the apps it finds; pass --claude-desktop or --codex to configure one
anyway, or --no-codex / --no-claude-desktop to skip one. torus doctor checks each app's
entry and that the server starts, and torus doctor --fix repairs what it can.
Just looking? torus demo builds a small sample graph (NVIDIA, TSMC, Micron and AMD theses,
an alert from a TSMC filing, the semis starter pack) in its own folder, TORUS_HOME/demo, and
opens it in the explorer. Your own graph is untouched, and every piece of sample research is
marked [demo].
Related MCP server: Chronos MCP
How it works
Why this helps. Research done in chat is usually thrown away: the next session starts from scratch, and nothing connects new information to what you already concluded. Torus keeps the working parts of the research, not just the final report:
Without Torus | With Torus |
Every session re-reads the same filings and rediscovers the same facts | Each session starts from earlier theses, claims and ruled-out ideas |
A new tool starts empty, so it's useless for weeks |
|
A report says "TSMC capacity is the constraint", but not where that came from | Every claim links to its source, with a verbatim quote, a confidence and the date it was true |
A TSMC filing arrives and nobody notices that it undermines your NVIDIA view | Impact analysis follows supplier and customer links and raises an alert on that thesis |
Every routine filing pings you, so you stop looking | Alerts weigh what kind of event it is and whether it matches what you said would break the thesis |
The changes in a 150-page 10-K are buried | Torus lists the new, dropped and reworded risk-factor sentences since the last filing |
Old conclusions get overwritten, and wrong ones linger | Every change is versioned; the audit flags what's stale or thinly sourced; undo keeps history |
Dead ends get explored again | Ruled-out ideas are recalled alongside the theses |
Nobody checks whether high-conviction calls were actually right | The scorecard tracks each thesis against its stock and measures your calibration |
Getting started (about 5 minutes)
You need Python 3.11+ and Claude Code.
1. Install the torus command. The plugin's hooks and MCP server run it, so this step is
required:
pip install torus-kg2. Set it up:
torus init --refresh-reference --contact you@example.com # SEC ticker list (the SEC asks for an email)
torus config set sec_contact you@example.com # used when reading and watching filings
torus doctor # check that everything is in order3. Add the plugin in Claude Code:
/plugin marketplace add sekhar14/torus
/plugin install torus@torusYou'll be asked for a capture mode:
Mode | What Claude records while researching | The curator (Haiku) records later |
| theses, key claims with sources, ideas ruled out | supporting claims, extra sources, links |
| everything | anything missed |
| theses and ideas ruled out | everything else |
4. Tell Torus what you cover (recommended). In Claude Code:
/torus:onboard NVDA AMD TSM AVGOor from a portfolio or watchlist export: torus onboard --file portfolio.csv (any CSV with a
ticker or symbol column), then /torus:onboard to finish the mapping. Torus adds the
companies, watches their SEC filings, suggests matching starter packs, and a Haiku subagent maps
each company's suppliers, customers, competitors and customer concentration from its latest
annual report, citing the filing.
5. Keep the watchers running:
torus schedule install # checks filings, news and prices every hourThis uses Task Scheduler on Windows, launchd on macOS and cron on Linux.
6. Research as usual, e.g. "Is NVIDIA still supply-bound? Check TSMC's CoWoS plans." The
next time you mention NVIDIA, Claude sees the earlier thesis, claims and ruled-out ideas before it
starts. After each turn Torus tells you what it recorded ("Torus recorded 1 thesis, 3 claims
and 2 sources this turn"), and /torus:undo reverts anything you don't want.
What you can ask
You don't need to remember commands; ask in plain words and Claude uses the right Torus tools.
You say | What happens |
"Is NVIDIA still supply-bound?" | Claude starts from your earlier NVIDIA research, then records new claims, sources and the updated thesis |
"What changed in TSMC's latest 20-F risk factors?" | Torus lists the new, dropped and reworded sentences against last year's filing |
"Add this earnings call transcript to Torus" | The transcript becomes sourced claims linked to the theses it bears on |
"Any news that affects my theses?" | Open alerts, each with the path that explains it, judged one thesis at a time |
"What happened this week?" | The digest: new alerts by thesis, status and confidence changes, theses coming due, scorecard moves |
"What happens to my theses if TSMC's Arizona fab is delayed a year?" | Every thesis the event would reach, through which links, and the likely direction |
"Poke holes in my Micron thesis" | A skeptic subagent researches the counter-case; you approve any risks it proposes |
"Is my research still current?" | The audit: expired assumptions, theses past their horizon, single-source claims, conflicts |
"How have my calls done?" | Returns against SPY in each thesis's direction, outcomes, and how calibrated your confidence is |
"Write up my NVIDIA thesis to share" | A memo with every claim traced to its source |
"Undo what you just recorded about AMD" | Those records are retracted or archived; history keeps them |
Commands in Claude Code
Command | What it does |
| Start covering companies: watch them, seed starter packs, map their links from 10-Ks |
| Theses at risk, open alerts, recent changes, graph health |
| Judge open alerts: did the event support, weaken or break the thesis? |
| Read a filing, transcript, PDF or page into sourced claims; or what changed since the last filing |
| Which theses would a hypothetical event reach, and how? Records nothing |
| A devil's-advocate subagent stress-tests a thesis and proposes risks and triggers |
| Find expired, thinly sourced or conflicting research and theses past their horizon |
| How your theses did against a benchmark, and whether your confidence is calibrated |
| Write a thesis up as a sourced memo (Markdown and HTML) |
| See what recent sessions recorded and revert any of it |
| Have the Haiku curator add past sessions' findings to the graph |
| Open the visual graph explorer |
Behind them, the MCP server gives Claude 45 tools, from brief, recall and record_claim to
filing_diff, whatif, digest and scorecard. Claude Desktop and Codex see 33 of them by
default (the analyst toolset): the queue and low-level graph tools are hidden. Set
TORUS_TOOLSET=full in the server's env to show them all.
Claude Desktop and Codex in detail
Neither app loads the Claude Code plugin, so the MCP server carries the workflow itself. When
TORUS_HARNESS is claude-desktop or codex (torus setup sets it):
Instructions. The server tells the model to call
briefwith the user's question before researching a company, to record sources and claims as it goes (capture modelive, since no curator reads the chat later), and to end each turn with a "Torus recorded ..." receipt. The wording is model-neutral, since Codex runs OpenAI models.Workflows. Each
/torus:command is also an MCP prompt (Claude Desktop's "+" menu) and a Codex skill, rendered from the same source insrc/torus/workflows/. Steps a Claude Code subagent would do (mapping companies from their 10-Ks, arguing the counter-case) run in the chat instead.Save this chat. With no curator, the Save this chat to Torus prompt (or asking "save this chat to Torus") records whatever the chat found and didn't record yet.
Undo. Records are tracked per chat, so "what did you record?" and "undo that" work as in Claude Code (
recent_records,undo_records).
Claude in a web browser, ChatGPT and Copilot can't use Torus: they only reach MCP servers at a public address, and Torus runs on your machine.
Configuring by hand. torus setup writes these for you. In Claude Desktop (Settings >
Developer > Edit Config; %APPDATA%\Claude\claude_desktop_config.json on Windows,
~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"torus": {
"command": "/full/path/to/torus",
"args": ["serve"],
"env": { "TORUS_HARNESS": "claude-desktop" }
}
}
}In Codex (~/.codex/config.toml):
[mcp_servers.torus]
command = "/full/path/to/torus"
args = ["serve"]
[mcp_servers.torus.env]
TORUS_HARNESS = "codex"Use the full path (where torus on Windows, which torus on macOS and Linux): desktop apps don't
see your shell's PATH. If you set TORUS_HOME, add it under env so every app shares one
graph. Other env settings: TORUS_CAPTURE_MODE (live, balanced, curator) and
TORUS_TOOLSET (analyst, full). Other MCP clients (Cursor, VS Code and so on) may work
with the same entry, but they aren't tested.
Reading SEC filings
Torus reads filings from EDGAR for Claude, so research cites primary sources instead of summaries of them:
By section. A 10-K, 10-Q or 20-F is split into its items, so Claude can read just
business,risk_factors,mdna,legal,market_riskorfinancials(or an item number), page by page. Any earlier filing of the same form is available too.What changed. Torus compares a section with the same section of the previous filing and returns the new, dropped and reworded sentences, most rewritten first.
Cited. Claims from a filing carry the filing's URL as evidence (kind
filing) and a verbatim quote, and count as primary sources in the audit and the challenge.
Filings are downloaded once and cached as text in TORUS_HOME/sources/edgar. Reading them needs
sec_contact set: the SEC asks every client for a contact email.
The visual explorer
torus explore # the whole graph
torus explore NVDA --hops 2 # NVIDIA and everything within two links
torus explore --no-open # write the file without opening a browserThis writes a single self-contained HTML file (default ~/.torus/explorer.html) and opens it in
your browser. It works offline and needs nothing installed, so you can share the file.

The screenshots use the semis starter pack plus illustrative [demo] research
(scripts/seed_demo.py). In the one above, the [demo] NVIDIA thesis is selected. A TSMC 8-K
raised an alert on it, and the panel shows why: the thesis has a trigger on TSMC, an assumption
claim that names TSMC, and TSMC supplies NVIDIA, the thesis's subject. It also shows how the
score was built: a strong graph connection, a low-materiality 8-K item (8.01, "other events"),
boosted because the filing's wording matches the thesis's trigger.
Nodes: companies are blue circles; darker means you have research on them. Theses are squares coloured by status (green active, amber at risk, red broken). Events are diamonds, red when they have an open alert.
Lines: solid arrows mean supplies, dashed lines mean competes with, and a thick red line is an alert from an event to a thesis. Faint lines come from a starter pack and haven't been confirmed by your research yet.
Click any node for details. A company shows its links, theses, recent claims with sources, and ideas ruled out. A thesis shows what it rests on, its triggers, its history and its alerts, with the path that explains each one.
Move around: drag nodes, scroll to zoom, drag the background to pan, and press Fit to reset. Double-click a node to release it.
Search by name or ticker. Filters hide theses, events, competitor links or starter links.
Go back in time: drag the slider at the bottom to see the graph as it stood on an earlier date (what Torus knew then, and each thesis's status at the time), or press Replay to watch the research grow. Links retired since then don't reappear.
Link to a node or a date: add
#select=and a name or ticker to the file's address, e.g.explorer.html#select=NVDA, to open with that node selected, or#at=2026-09-20to open the graph as it stood that day. Combine them with&:#select=NVDA&at=2026-09-20.

The same demo graph as it stood on 20 September: the starter pack wasn't added yet, the AMD thesis was still active (it broke in October), and the TSMC alert had just arrived.
The file is a snapshot. Run torus explore again after new research.
Starter packs and graph tools
Starter packs give impact analysis a web of widely reported links from day one. Each link is marked as a starter link until research confirms it, and never overrides a link your research recorded.
Pack | Covers | Companies | Links |
| Chip equipment, foundry and memory, chip designers, their big buyers | 23 | 52 |
| Hyperscale clouds and the software that runs on them; databases, apps, observability, security | 19 | 34 |
| Large US banks, card networks and issuers, payments, bank technology | 18 | 25 |
| Integrated majors, US producers, oilfield services, refiners, pipelines, LNG | 19 | 26 |
| Drugmakers and biotechs, lab suppliers, wholesalers, pharmacy benefit managers | 20 | 25 |
torus graph packs # the packs above
torus graph seed software # add one (safe to repeat)
torus graph neighbors TSM --hops 2 # links around a company
torus graph paths ASML AMD # how two companies connect: ASML -SUPPLIES-> TSMC -SUPPLIES-> AMDClaude has the same tools through MCP (neighbors, find_paths, impact, seed_starter_pack).
When research re-records a starter link, it becomes yours.
Watchers: filings and news become alerts
torus watch run checks once:
SEC EDGAR: new filings (8-K, 10-Q, 10-K, 20-F, 6-K, ...) by watched companies. New 10-K, 10-Q and 20-F events also say what changed in the risk factors since the previous filing ("Risk factors: 12 new, 8 reworded, 3 dropped sentences. New: ...").
RSS/Atom feeds: items that mention companies already in your graph.
Prices: daily closes for theses on the scorecard.
Each new item becomes an event. Torus then walks the graph (suppliers, customers, competitors)
and opens alerts on theses it may affect. Review them with /torus:review. At the end of the
pass, strong new alerts show up as desktop notifications, and a
scheduled digest goes out if one is due.
torus watch add NVDA # optional: onboarded companies and open theses' companies are watched automatically
torus feed add https://example.com/semis.rss --name "Semis wire"
torus watch list # what is watched, and why
torus watch run # one pass; exit code 1 if any source failed
torus schedule install # run it every hour; --every 6 for every 6 hours
torus schedule status # or: torus schedule removeThe first check of a company or feed looks back 7 days. After that, only new items are processed.
Alerts that matter
A routine supplier 10-Q shouldn't interrupt you; a bankruptcy filing should. Each alert scores
graph score × materiality × (1 + trigger match):
graph score: how closely the event's companies connect to the thesis: its subject, a company its assumptions name, or a supplier, customer or competitor one or two links away.
materiality: what kind of event it is. 8-K items are weighted (bankruptcy 1.0, results 0.9, material agreement 0.8, shareholder vote results 0.1), a 10-Q is 0.4, and news wording raises or caps it ("export controls" 0.9, "3 stocks to buy" 0.2). Events you add yourself count fully.
trigger match: how much of one of the thesis's triggers the event's wording covers, so "TSMC delays CoWoS expansion" boosts a thesis whose trigger is "CoWoS capacity slips". Write triggers in the words a headline would use.
Each alert shows how its score was built, with a label to read it by: strong (1.0 and up, as much as a fully material event about the thesis's own subject), moderate (0.5 and up) or weak. To tune them:
torus alerts list # open alerts and how each scored
torus alerts stats --days 90 # share judged related, by source, form, hops, materiality
torus alerts threshold 0.3 # global minimum score (default 0.2)
torus alerts threshold 0.5 --thesis ID # per thesis
torus alerts mute ID --entity TSM --form 10-Q # no alerts on this thesis for TSMC 10-Qs
torus alerts mutes # list mutes; torus alerts unmute MUTE_ID/torus:review suggests a mute when a thesis keeps getting the same kind of unrelated alert.
Alerts that reach you
The watchers run every hour, but an alert is no use if you only see it the next time you open a chat. Torus tells you in two ways.
Desktop notifications
When torus watch run raises a strong alert, you get a notification:
Torus: strong alert on NVIDIA data-center growth is supply-bound TSMC 8-K: CoWoS capacity expansion delayed (and 1 more)
One notification per thesis, at most three per pass. If more theses are hit, the third sums up the rest.
Only alerts from the last 24 hours, so upgrading or turning notifications on never replays old ones.
Windows shows a toast, macOS uses Notification Center (
osascript), Linux usesnotify-send. Nothing extra to install. On Linux the cron job finds your desktop session on its own.
torus notify test # check that notifications show up on this machine
torus config set notify moderate # strong (default), moderate or off
torus watch run --no-notify # one pass without notificationstorus doctor checks that the platform's notification tool is there.
The digest
torus digest writes what happened since a date, most urgent first:
New alerts, grouped by thesis, with strength, score, link and whether they were judged
Thesis changes: status changes and confidence moves of 10 points or more
Coming due: open theses past their horizon or due within 30 days
Research health: audit counts and the top high findings
Scorecard: the biggest moves since then, in each thesis's direction
Activity: claims, theses and events recorded
torus digest # the last day, as Markdown and HTML in TORUS_HOME/digests
torus digest --since 2w --open # 12h, 1d, 2w or a date (YYYY-MM-DD); open the HTML
torus digest --json # the same data as JSONIn any app, ask "what happened this week?" and Claude calls the digest tool.
Sending the digest
Nothing is sent until you set a destination. Then pick a schedule; the hourly watcher run sends the digest when it's due, so there's no second scheduled task.
torus config set digest daily # off (default), daily or weekly
torus config set digest_hour 8 # local time (default 8)
torus config set digest_weekday mon # for weekly (default mon)A webhook (Slack, Discord, ntfy or anything that takes JSON):
torus config set digest_webhook https://hooks.slack.com/services/...
torus config set digest_webhook https://ntfy.sh/your-private-topic # push to your phone with the ntfy appThe format comes from the address: Slack gets plain text, Discord and ntfy get Markdown, and
any other URL gets the digest as JSON. For a self-hosted ntfy server, set
digest_webhook_format ntfy. Long digests are cut at a whole section, with a pointer to the full
file. Webhook URLs contain a secret token, so Torus shows them masked
(https://hooks.slack.com/.../AbCd) and leaves them out of torus export.
Email through your own SMTP server, with Gmail as the example:
torus config set digest_email_to you@example.com
torus config set smtp_host smtp.gmail.com
torus config set smtp_user you@gmail.com
torus digest email-password # asks for the password (for Gmail, an app password)The password is never stored in the database. torus digest email-password saves it to
TORUS_HOME/secrets/smtp_password, a file only you can read, or you can set
TORUS_SMTP_PASSWORD instead. Torus only sends over an encrypted connection: STARTTLS on port 587
(the default) or TLS on port 465.
torus digest test-send # a short test message to each destination
torus digest --send # send now: everything since the last digest sentA digest with nothing new isn't sent (digest_send_empty on changes that). torus doctor shows
the schedule, where the digest goes, when it was last sent and the last error.
Keeping the research honest
Audit (
torus audit,/torus:audit): assumptions past their validity date, theses past their horizon or unchanged for 90 days, assumptions resting on one non-filing source or on an unsourced opinion, claims about the same company that may conflict, inferences built on retracted claims, and starter links that alerts depend on but research never confirmed. Claude walks through the findings with you and fixes the ones you agree to. In the terminal, long runs of low findings of one kind (say, every starter link after seeding a pack) are summarised after the first three;torus audit --alllists them all.Horizons are dates. A thesis's horizon ("12m", "18 months", "FY2026", "Q3 2026", "2027-06-30") is read as a due date, so the audit and the scorecard know when it's up.
Challenge (
/torus:challenge): Torus lists a thesis's weak points (thin or expiring assumptions, strong supplier or customer links it never mentions, triggers that can't fire, opposing theses and verdicts) and a devil's-advocate subagent researches the counter-case. You approve any risks or triggers it proposes; it never changes the thesis itself.What if (
torus whatif "TSMC fab outage halts CoWoS" TSM,/torus:whatif): runs the alert logic on a hypothetical event and shows every thesis it would reach, through which links, and whether it would raise an alert. Nothing is recorded.Receipts and undo (
/torus:undo): after each turn Torus says what it recorded. Undo retracts claims (or restores the version a correction replaced), archives theses the session created, retires links (restoring a starter link it replaced) and withdraws ruled-out ideas. History keeps everything, so "what did we believe on date X" still works.
Scorecard and calibration
Track a thesis against its stock and see how the call is doing:
torus scorecard track THESIS_ID # default: the subject's ticker, entry = the close when recorded
torus scorecard --refresh # fetch closes, then show returns and calibration
torus scorecard outcome THESIS_ID right # right, wrong, unclear or clear; your call beats the automatic one
torus scorecard import NVDA prices.csv # load closes yourself (date,close)Each tracked thesis shows its return against a benchmark (SPY unless set) in the direction of its stance, so a bearish thesis gains when the stock lags, and its worst drawdown. Theses get an outcome when you mark them confirmed or broken, or by price when they reach their horizon. Calibration compares your initial confidence with how often you were right: a Brier score (0 is perfect; always saying 50% scores 0.25) and a table by confidence band, e.g. "your 80%+ calls were right 6 times out of 10". It covers every decided thesis, whether or not it's tracked against a price, and says so when fewer than 10 are decided: below that it's an anecdote, not a measure.
Prices come from Yahoo Finance's public chart endpoint, which needs no key but is unofficial and
can change. If it fails, import closes from a CSV, or set price_source to none. The scorecard
is a record of your own calls, not advice.
Memos
torus memo THESIS_ID --open (or /torus:memo) writes a thesis up as Markdown and a standalone
HTML page in TORUS_HOME/memos: what it rests on, each claim with its sources and verbatim
quotes, the claims inferences derive from, triggers, the events since and how they were judged,
ruled-out ideas, the scorecard and the full history. In Claude Code, /torus:memo also writes a
short summary from what the memo says.
Automation
Watchers on a schedule:
torus schedule install(see above).torus doctorwarns when companies are watched but nothing runs the watchers. Each run also sends the notifications and the scheduled digest (Alerts that reach you).Distilling sessions: research sessions are queued when they end, and the Haiku curator adds what Claude didn't record. With
auto_distillatask(the default), Claude offers to run/torus:distillwhen sessions are waiting. Set it toonand a background curator runs (claude -pon Haiku, Torus tools only) when a session ends; this uses your subscription. One curator runs at a time, and its own session is never captured.
Settings
torus config set KEY VALUE (omit the value to reset; torus config get KEY to read):
Key | Default | What it does |
| Email sent to the SEC in the User-Agent (required for filings) | |
|
| Minimum alert score for theses without their own |
|
|
|
|
| Tell you after each turn what Torus recorded |
|
| Summarise risk-factor changes in new 10-K/10-Q/20-F events |
|
| What the scorecard measures theses against |
|
|
|
|
| Desktop notifications for new alerts: |
|
| Send a digest from the watcher runs: |
|
| Hour (0-23, local time) the digest goes out |
|
| Day of a weekly digest ( |
|
| Send a digest even when nothing is new |
| Slack, Discord, ntfy or JSON webhook URL (shown masked, not exported) | |
|
|
|
| Address(es) to email the digest to, comma-separated | |
|
| From address |
| SMTP server | |
|
|
|
| SMTP login; the password goes in with |
What leaves your machine
Torus keeps your research local. It reads from these:
SEC EDGAR (
sec.gov): the ticker list, watched companies' filing lists, and filings Claude reads or the watcher diffs. Yoursec_contactemail is sent as the User-Agent, as the SEC requires.Your RSS/Atom feeds, if you add any.
Yahoo Finance, for daily closes of tracked tickers and their benchmark, if any thesis is on the scorecard and
price_sourceisn'tnone.
And it sends research out only where you tell it to:
Your webhook (
digest_webhook), if you set one: the digest's text, which includes thesis titles, alert and event titles, audit findings and scorecard moves.Your SMTP server (
smtp_host), if you set up email: the same digest, todigest_email_to.
Desktop notifications stay on your machine.
Claude's own web research goes through the app you use, as usual.
Maintenance
torus doctor # health check (schema, integrity, search index, hooks, watchers, schedule, notifications, digest)
torus doctor --fix # fix what it flags (see below)
torus doctor --repair # only rebuild the search index and close duplicate links
torus export # back up everything to TORUS_HOME/exports/*.jsonl
torus import backup.jsonl # restore into a fresh TORUS_HOME
torus status # row counts and queue statetorus doctor --fix rebuilds a broken search index, closes duplicate links, saves the SEC email
(it asks, or pass --contact EMAIL), downloads the SEC ticker list when it's missing or more than
30 days old, installs the watcher schedule when companies are watched but nothing runs the
watchers, and rewrites a broken Claude Desktop or Codex entry (keeping a backup, and leaving a
Codex entry you wrote yourself alone). It says what it did and what it skipped, then checks
again.
Upgrading migrates the database automatically the next time any torus command opens it. Hook
activity is logged to ~/.torus/logs/hooks.log, background curator output to
~/.torus/logs/curator.log. Hooks never block or fail your session.
Development
python -m venv .venv
.venv/Scripts/python -m pip install -e ".[dev]" # .venv/bin/python on macOS/Linux
.venv/Scripts/python -m pytest # unit + integration (no network)
.venv/Scripts/python -m pytest -m perf tests/perf # performance checks on a 100k-claim graphLicense
Apache License 2.0. See LICENSE.
Torus is a research memory, not financial advice.
Available Tools
45 toolsadd_eventA
Record an event and raise alerts on theses it may affect (through the companies involved and their suppliers, customers and competitors).
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | ||
| kind | No | manual | |
| title | Yes | What happened, e.g. 'TSMC 8-K: CoWoS ramp delayed' | |
| summary | No | ||
| entities | Yes | Entities the event is about | |
| materiality | No | How much it matters (default 1.0) | |
| occurred_at | Yes | When it happened (UTC if no zone) |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | |
| alerts | Yes | |
| created | Yes | False if this event was already recorded |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world write, so the bar is lower. The description still adds real behavioral context absent from annotations: the call has an alerting side effect on theses, propagated through suppliers, customers, and competitors of the involved companies. It does not say whether alerts can be suppressed or how materiality gates them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the action front-loaded and the consequential side effect trailing. No filler, and nothing repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter write tool with an output schema and full annotation coverage, the description covers the essential behavior (record + alert propagation). The remaining gap is operational detail — entity identifier format and whether materiality changes alerting — which the agent must guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, and the schema documents title, entities, materiality, and occurred_at with examples. The description adds only indirect meaning, clarifying that the entities parameter is what drives thesis/alert propagation; it says nothing about kind, uri, summary, or how materiality influences alerting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb plus resource ('Record an event') and immediately states the distinguishing side effect: raising alerts on theses via linked companies. That separates it from record_claim, record_evidence, and record_thesis, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent infers this is the tool for capturing a discrete occurrence (filing, news, earnings) that may move theses. There is no statement of when to prefer this over record_evidence or record_claim, and no mention of prerequisites such as the entities needing to exist first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alert_statsARead-only
How useful alerts have been: verdicts, and the share judged related (precision) by source, form, hops and materiality.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only alerts raised since |
Output Schema
| Name | Required | Description |
|---|---|---|
| open | Yes | |
| alerts | Yes | |
| judged | Yes | |
| by_form | Yes | |
| by_hops | Yes | |
| by_source | Yes | |
| precision | Yes | |
| unrelated | Yes | |
| by_verdict | Yes | |
| by_materiality | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true and openWorldHint=false already establish this is a safe, local read, so the description only needs to add aggregation context — which it does by naming the breakdown dimensions. It does not mention the time-window scoping behavior or note that results are aggregate rather than per-alert, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler, and the core concept (alert usefulness) is front-loaded. Slightly dense parenthetical structure, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Low complexity (1 optional param, read-only, output schema present), so the description only needs to convey what is measured and how it is sliced — both of which it does. Only the ignored relationship to the `since` filter keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `since` parameter is fully documented in the schema, so baseline 3 applies. The description's 'by source, form, hops and materiality' refers to grouping dimensions of the output rather than the input parameter, so it adds no meaning to `since` itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (alerts) and precisely what the tool reports: verdicts plus the share judged related (precision), broken down by source, form, hops and materiality. That is far more specific than its siblings list_alerts/resolve_alert, though the verb is implicit ('stats') rather than stated as 'computes/aggregates'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrasing 'How useful alerts have been' implies the usage context (evaluating alert quality), but there is no explicit when-to-use, no exclusions, and no mention of the nearby scorecard/digest siblings that could also answer performance questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auditARead-only
Health check of the research graph: expired or thinly sourced assumptions, theses past their horizon or gone stale, claims that may conflict, unconfirmed starter links, orphans. Each finding suggests a fix.
| Name | Required | Description | Default |
|---|---|---|---|
| stale_days | No | Flag open theses unchanged this long |
Output Schema
| Name | Required | Description |
|---|---|---|
| counts | Yes | |
| findings | Yes | |
| markdown | No | |
| generated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the specific categories of findings and the fact that each finding carries a suggested fix, which tells the agent the output is actionable rather than just a list. It does not discuss cost, scope limits, or how the stale threshold interacts with the scan.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, then a compact enumeration of finding types and the 'each finding suggests a fix' payoff. No filler, no repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description still conveys the actionable nature of results. The one remaining gap is routing guidance among many sibling diagnostic tools, which for a 45-sibling surface is a meaningful omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage and a single optional parameter already described in the schema ('Flag open theses unchanged this long', default 90, range 7–3650), the schema carries the parameter burden. The description adds no further meaning about stale_days or how it affects which findings appear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation ('health check of the research graph') and then enumerates the exact defect classes it surfaces: expired/thinly sourced assumptions, past-horizon or stale theses, conflicting claims, unconfirmed starter links, orphans. That is far more concrete than the bare name 'audit', though it never distinguishes itself from closely related diagnostics like scorecard, thesis_weak_points, or digest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'health check' – an agent can infer this is a diagnostic sweep, but nothing states when to run it versus scorecard, thesis_weak_points, list_alerts, or digest, and there are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
briefARead-only
One-call briefing at the start of a turn: spots known companies in text,
recalls prior theses, claims, open alerts and ruled-out ideas about them,
and returns the graph digest.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The user's question or company names (leave blank for the digest only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| digest | Yes | Graph overview: open alerts, theses at risk, 7-day changes, audit summary |
| recall | No | |
| context | Yes | Prior theses, claims and open alerts on those companies (markdown) |
| detected_entities | Yes | Known companies spotted in `text`, as 'Name (id)' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and locality are covered structurally. The description adds real value by disclosing what the tool aggregates (theses, claims, open alerts, ruled-out ideas) and that it performs entity spotting on free text, but says nothing about cost, latency, or the scope of the graph digest. Adequate rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the core purpose before the enumeration of what gets recalled. Every clause carries information, though the mid-sentence list of four record types makes it denser than ideal for one read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no prose. For a one-optional-parameter aggregator, the description covers trigger, inputs, what is gathered, and the empty-input case — nothing an agent needs in order to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single optional parameter at 100% schema coverage, the schema already carries the meaning ('the user's question or company names (leave blank for the digest only)'). The description restates the same duality ('spots known companies in `text`') without adding syntax, formatting, or matching-behavior detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — a 'one-call briefing' that scans text for known companies, recalls theses/claims/alerts/ruled-out ideas, and returns a graph digest. That is far more informative than the opaque name 'brief'. It stops short of explicitly distinguishing itself from near-neighbors like digest, recall, or search, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'At the start of a turn' gives a clear situational trigger, and the schema-level note that blank text yields digest-only defines the degenerate case. However, it never states when to prefer the sibling tools (recall, digest, search) instead, nor any exclusions — so it's clear context without routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_distillationA
Finish a leased distillation job (or hand it back if it failed).
| Name | Required | Description | Default |
|---|---|---|---|
| failed | No | True if the job couldn't be done; it will be retried | |
| summary | Yes | What was added, in a sentence or two | |
| queue_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| queue_id | Yes | |
| remaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only but non-destructive, closed-world write. The description adds genuinely new behavior: the job is leased and a failed completion returns it to the queue rather than terminating it. Missing are idempotency/retry-after-abandonment details, but the core failure semantics are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the primary action front-loaded and the alternative branch parenthetically appended. Nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the failure semantics are covered. The one gap is that queue_id's provenance (presumably from a prior lease/next_distillation call) is unexplained for a tool that cannot be invoked without it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% with 3 params; 'summary' and 'failed' are both documented in the schema and the description only restates the failed-path behavior. queue_id has no description anywhere and the description does not compensate by explaining where to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (finish) and resource (a leased distillation job), plus the alternate branch for failure. It implicitly pairs with next_distillation but never names that sibling, so the agent must infer the job-acquisition counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a leased distillation job' implies the prerequisite that a job was already leased, and 'or hand it back if it failed' gives a conditional path for the failed flag. However, no sibling is named (next_distillation is the obvious companion) and there is no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_mappingA
Finish a leased mapping job (or hand it back if it failed).
| Name | Required | Description | Default |
|---|---|---|---|
| failed | No | True if it couldn't be done; it will be retried | |
| summary | Yes | Links and claims added, in a sentence | |
| queue_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| queue_id | Yes | |
| remaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, closed-world mutation, so the safety profile is covered. The description adds that a job must be leased and that failure hands it back for retry, which is useful context, but it doesn't say what happens to the summary, whether completion is idempotent, or whether an expired lease blocks the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the action front-loaded and no filler. It is arguably too terse for a mutation tool, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations carry the mutation semantics. The remaining gap is the unexplained queue_id provenance and what a "mapping job" entails, which is a modest omission rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so most parameters are documented structurally; queue_id has no description in either place and the description doesn't clarify where it comes from. The "hand it back if it failed" phrasing loosely maps to the failed flag but adds nothing beyond the schema's own wording about retry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (finish) and resource (a leased mapping job), and the parenthetical distinguishes the success and failure paths. It doesn't explain what a "mapping" is or how it relates to next_mapping/complete_distillation, but the operation itself is identifiable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the word "leased" suggests this is the terminal step after leasing a job (presumably via next_mapping), and "hand it back if it failed" hints at the failure path. No sibling is named and no explicit when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
digestARead-only
What happened in the research over the last days: new alerts by thesis,
thesis status and confidence changes, theses coming due, audit counts,
scorecard moves and activity. markdown is ready to show.
| Name | Required | Description | Default |
|---|---|---|---|
| since_days | No | How far back to look |
Output Schema
| Name | Required | Description |
|---|---|---|
| moves | Yes | |
| since | Yes | |
| until | Yes | |
| activity | Yes | |
| markdown | No | |
| coming_due | Yes | |
| new_alerts | Yes | |
| audit_counts | Yes | |
| top_findings | Yes | |
| thesis_changes | Yes | |
| older_open_alerts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true and openWorldHint=false already cover the safety profile, so the bar is lower. The description adds real value beyond annotations by disclosing the aggregation scope (which data categories are collected) and that the payload includes a display-ready markdown rendering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core intent is front-loaded ('What happened in the research over the last days') and the content list follows as supporting detail. The sentence is long but every clause maps to an actual data category; the trailing markdown note is a small redundancy given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return shape is covered by the output schema and the sole parameter by the schema, so the description need not restate them. What remains thin is disambiguation from sibling recap tools (what_changed, brief, timeline), which is the one thing an agent still has to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is documented in the schema with a default of 7 and a 1–90 range. The description only gestures at it with 'over the last days' and adds no format, range, or default information, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource — a research digest — and enumerates its contents (new alerts by thesis, status/confidence changes, due theses, audit counts, scorecard moves, activity), so an agent knows exactly what it produces. It does not, however, distinguish itself from similarly-scoped siblings such as what_changed, timeline, or brief.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'What happened in the research over the last days' implies a periodic recap use case, including a time window, but there is no explicit when-to-use or when-not-to-use guidance and no named alternative. With what_changed and timeline in the sibling list, the agent must infer which one to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filing_diffARead-only
What changed in a section of a company's latest filing against the previous one of the same form: new, dropped and reworded sentences.
| Name | Required | Description | Default |
|---|---|---|---|
| form | No | 10-K, 10-Q or 20-F | 10-K |
| company | Yes | Ticker, CIK, company name, canonical key or id | |
| section | No | e.g. risk_factors, business, mdna | risk_factors |
| max_items | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| added | Yes | New sentences |
| latest | Yes | |
| changed | Yes | Reworded sentences, most rewritten first |
| company | Yes | |
| removed | Yes | Dropped sentences |
| section | Yes | |
| previous | Yes | |
| unchanged | Yes | |
| total_added | Yes | |
| total_changed | Yes | |
| total_removed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly and openWorld, so the description's real contribution is the comparison baseline: latest filing vs the immediately previous one of the same form, at section granularity. That is genuine behavioral information not in the annotations. It does not discuss what happens when no prior filing exists or how sections are aligned, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the operation and scoped in the same breath, with the output categories appended as a compact clause. Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and annotations cover return shape and safety, so the description does not need to. What is missing is the operational context an agent would want: behaviour when no prior filing of that form exists, how section names are matched, and how this differs from filing_text and what_changed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% (company, form, section documented; max_items has no description), so the schema carries most of the load. The description adds no parameter guidance at all — nothing about accepted company identifier forms, valid section names, the 10-K default, or the max_items cap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and operation: a section-level diff between a company's latest filing and the prior filing of the same form, with output classes (new, dropped, reworded). Clear enough to act on, but it never names the near neighbours (filing_text for raw text, what_changed for other change queries), so the boundary is inferred rather than declared.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — 'latest versus previous of the same form' tells you this is for period-over-period comparison of one section. There is no explicit when-to-use/when-not guidance and no routing against filing_text or the similarly named what_changed, which is the biggest ambiguity risk here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filing_textARead-only
Read a company's SEC filing as text, by section, from EDGAR (cached).
Long sections come in pages: pass next_offset back as offset.
| Name | Required | Description | Default |
|---|---|---|---|
| form | No | 10-K, 10-Q, 20-F, 8-K... | 10-K |
| index | No | 0 = latest, 1 = previous | |
| offset | No | ||
| company | Yes | Ticker, CIK, company name, canonical key or id | |
| section | No | business, risk_factors, mdna, legal, market_risk, financials, or an item id like 1A; omit for the whole document | |
| max_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| cik | Yes | |
| url | Yes | Cite this as the evidence URI (kind: filing) |
| form | Yes | |
| text | Yes | |
| filed | Yes | |
| offset | Yes | |
| company | Yes | |
| section | Yes | |
| sections | Yes | Sections this filing can be read by |
| accession | Yes | |
| next_offset | Yes | Pass as offset to read on; None at the end |
| total_chars | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real behavioral context beyond that — results come from a cache (implying possible staleness) and content is paginated rather than returned whole. It stops short of describing error behavior for missing filings or EDGAR access limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core capability front-loaded and the pagination contract immediately after. Nothing is repeated from the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary; the description covers the two things an agent must know to call it correctly (section selection and paging). Minor gaps: what happens with an invalid/absent section or when the cache lacks the filing, and how `max_chars` interacts with pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so several parameters are self-documenting (form examples, index 0=latest, section enum values, company input forms). The description usefully explains the offset/next_offset contract, which the schema leaves entirely undescribed, but `max_chars` and the paging size interaction remain undocumented, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) plus resource (SEC filing as text) and scope (by section, from EDGAR, cached). An agent can tell it retrieves filing content. It does not name the obvious sibling (filing_diff) to contrast retrieval vs. comparison, so sibling differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete in-tool usage mechanics — long sections are paged, pass `next_offset` back as `offset` — which is genuinely actionable. But it offers no guidance on when to pick this over `filing_diff` or `search`, and no prerequisites (e.g. company resolution failures, whether a form/index must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_pathsARead-only
How two entities are connected, e.g. ASML -SUPPLIES-> TSMC -SUPPLIES-> AMD. Shortest and most confident paths first.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Ticker, CIK, company name, canonical key or id | |
| target | Yes | Ticker, CIK, company name, canonical key or id | |
| max_hops | No | ||
| relations | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| paths | Yes | |
| texts | Yes | |
| source | Yes | |
| target | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context with 'shortest and most confident paths first', telling the agent about result ordering. It does not disclose hop limits, what happens when no path exists, or how the relations filter constrains traversal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, and the example does most of the explanatory work efficiently. The trade-off is that the core verb is never stated outright ('How two entities are connected' rather than 'Find paths between two entities'), so the purpose is more shown than declared.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be explained, and annotations cover the read-only nature. However, with only 50% schema description coverage, the description should compensate for the undocumented max_hops and relations parameters, and it says nothing about either.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Placeholder.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific capability — finding connection paths between two entities — and the ASML -SUPPLIES-> TSMC -SUPPLIES-> AMD example makes the output shape concrete. It does not explicitly contrast with the closest sibling, neighbors, but the path/graph-traversal framing is distinctive enough that an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the example of a two-entity chain suggests this is for multi-hop connection questions rather than direct adjacency. There is no explicit when-to-use, when-not-to-use, or named alternative (e.g. neighbors for one-hop lookups, search for discovery).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entityBRead-only
Resolve an entity and list its current relations.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Ticker, CIK, company name, canonical key or id |
Output Schema
| Name | Required | Description |
|---|---|---|
| entity | Yes | |
| relations | Yes | |
| resolved_by | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that relations are returned alongside the resolved entity, but says nothing about ambiguous-match behavior or how many relations come back, which matters for an entity-resolution tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with zero filler and the action front-loaded. It is efficient but so terse that it omits behavior the agent would plausibly need.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. However, the description never addresses the key open question for a resolve tool: what happens with multiple or zero matches, which is not captured elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'entity' parameter already enumerates accepted forms (ticker, CIK, company name, canonical key, id). The description adds no format or resolution hints 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (resolve, list) and resources (entity, its relations), so an agent knows it returns an entity plus its edges. It does not distinguish itself from graph-adjacent siblings like neighbors, search, or find_paths, leaving overlap ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no when-not, and no named alternative. 'Resolve' weakly implies it fits ambiguous identifiers, but nothing tells the agent whether to prefer this over search, neighbors, or upsert_entity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
impactBRead-only
Dry run: which theses would an event on these entities affect, and why? Records nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| entities | Yes | Entities a hypothetical event touches | |
| occurred_at | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks this as non-destructive, and the description usefully reinforces that with 'Records nothing.' It also indicates the response includes reasoning ('and why'), adding some behavioral context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the dry-run constraint front-loaded. There is no filler, and the key safety property is stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only query with an output schema, the description covers the core behavior and safety. However, it leaves occurred_at unexplained and gives no guidance on choosing this tool over similar siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%. The required entities parameter is described in the schema and echoed in the description, but the optional occurred_at parameter has no description in either the schema or the description. The description does not compensate for this gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation: a dry-run impact query that identifies which theses would be affected by an event on given entities and why. It is more than a restatement of the name, though it does not explicitly differentiate itself from similar siblings such as whatif.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It signals a dry-run use case and says records nothing, but does not explain when to use this versus alternatives like whatif or record_claim. No explicit exclusions, prerequisites, or decision criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_alertsARead-only
Alerts raised by events on theses, highest score first. Each shows how its score was built: graph score x event materiality x (1 + trigger match).
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | open | |
| grouped | No | Also group the alerts by thesis, to judge each once | |
| thesis_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| alerts | Yes | |
| groups | No | The same alerts grouped by thesis (when grouped=true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and closed-world, so safety is covered; the description adds real value beyond that by disclosing the ranking order and the exact score decomposition (graph score x event materiality x (1 + trigger match)). It omits pagination/limit behavior and the fact that only open alerts are returned by default, which matters behaviorally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and ordering, then the score formula. No filler, and the formula is dense but genuinely useful rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be described, and the scoring formula covers interpretation. But for a three-parameter list tool with 0 required params, the description should at minimum disclose the default 'open' status filter — an agent could wrongly assume it returns all alerts, including resolved and dismissed ones.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% — just 'grouped' is documented in the schema. Neither the status enum filter (defaulting to 'open') nor thesis_id is explained anywhere, and the description does not compensate: it never mentions filtering by status or narrowing to a single thesis.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (alerts raised by events on theses) and the ordering contract (highest score first), which is more than a restatement of the name. It stops short of distinguishing itself from close siblings such as alert_stats or resolve_alert, so an agent must infer the boundary from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this is the tool that surfaces alerts for triage, and the scoring breakdown hints at prioritization use. However, it never states when to prefer it over alert_stats, when to use the thesis_id scoping, or that it is the entry point that feeds resolve_alert.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watchesBRead-only
What the watchers follow: the watchlist, open-thesis entities, feeds.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| feeds | Yes | |
| entities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description contributes the useful detail that watches span multiple source kinds (watchlist, thesis entities, feeds), but says nothing about ordering, volume, or what an empty result means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short with no filler, but it is a sentence fragment rather than a front-loaded statement of purpose. The key information (that this lists watches) never appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the zero-parameter schema is trivial. Still, an agent cannot tell whether this returns all watches unfiltered, how they are ordered, or how the three source types are combined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description does not need to compensate for any schema gap here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun fragment ('What the watchers follow: the watchlist, open-thesis entities, feeds') that defines what a watch covers but never states the action — that it enumerates them. The verb 'list' exists only in the tool name; the fragment does add domain meaning beyond a bare restatement, which keeps it above tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus 'watch', 'unwatch', 'list_alerts', or 'search'. The mention of 'open-thesis entities' hints the output spans several sources, but no condition for selecting this tool is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_entitiesB
Fold a duplicate entity into the one to keep; its links move over.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | Yes | Ticker, CIK, company name, canonical key or id | |
| reason | Yes | ||
| duplicate | Yes | Ticker, CIK, company name, canonical key or id |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| name | Yes | |
| attrs | Yes | |
| aliases | Yes | |
| created_at | Yes | |
| updated_at | Yes | |
| canonical_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds one genuinely useful behavioral fact beyond the annotations: the duplicate's links are migrated rather than dropped. It does not say whether the duplicate record is deleted or tombstoned, whether the merge is reversible, or what happens to conflicting attributes — notable gaps given destructiveHint=false on an operation that removes a record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded clause with zero filler; the direction and the side effect are stated before anything else. Nothing is repeated from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation with three required parameters and no exclusions in its annotations, the description is too thin: irreversibility, the fate of the duplicate record, conflict resolution, and undo via undo_records are all unaddressed. The output schema covers return values, so that omission is acceptable, but the operational semantics are not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the schema already describes the accepted identifier forms for keep and duplicate. The description's contribution is clarifying the directional semantics — duplicate is folded into keep — which the parameter names alone only partly convey; reason remains unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Fold a duplicate entity into the one to keep" states a specific verb (fold/merge), the resource (entity), and the direction of the merge, plus the side effect ("its links move over"). It is clearly distinct from upsert_entity or get_entity, though no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this versus upsert_entity (create/update) or undo_records (recovery), and no preconditions such as required permissions or confirmation. The only usage signal is the implicit assumption that a duplicate entity already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
neighborsARead-only
The entity's neighbourhood: companies within hops links (suppliers,
customers, competitors...), the links among them, and theses about them.
| Name | Required | Description | Default |
|---|---|---|---|
| hops | No | ||
| entity | Yes | Ticker, CIK, company name, canonical key or id | |
| valid_at | No | Only links true at this date | |
| relations | No | Only these relation types (default all) |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | |
| focus | Yes | |
| nodes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that the response bundles three kinds of content (neighbours, inter-neighbour links, theses), which is useful shape information, but says nothing about cost, graph size limits, or what happens at max hops.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and the scope are stated immediately. Minor loss for the parenthetical list, which spends words on examples already covered by the relations enum in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover safety, so the description needn't explain return values. The remaining gap is routing: for a 4-parameter graph traversal tool among siblings like find_paths, impact, and get_entity, some signal about when this is the right choice is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%; the description supplies the meaning of the one undescribed parameter by defining `hops` as link distance and giving concrete relation examples (suppliers, customers, competitors). The entity and valid_at semantics are already documented in the schema, so this is adequate without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (the entity's neighbourhood graph) and enumerates what it returns: companies within `hops` links, the links among them, and theses about them. That is far more informative than the bare name 'neighbors'. It stops short of naming a sibling it is not (e.g. find_paths or get_entity), so an agent must infer differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the content — 'within hops links' suggests exploratory graph expansion rather than single-entity lookup. However, there is no explicit when-to-use, no exclusion, and no mention of alternatives such as find_paths, get_entity, or impact, all of which overlap. The agent must infer routing from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_distillationA
Lease the oldest research session waiting to be distilled into the graph.
Returns its transcript digest, what was already recorded (don't duplicate
it), the sources the agent looked at, and existing theses on its entities.
Until `complete_distillation`, new records are attributed to that session.| Name | Required | Description | Default |
|---|---|---|---|
| transcript_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| remaining | Yes | Jobs still waiting after this one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description adds the crucial side effect that new records are attributed to the leased session until complete_distillation, which an agent could not infer from annotations. It also enumerates what comes back (transcript digest, prior records, sources, theses). It stops short of saying whether the lease expires or how to release it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and its scope. The middle sentence enumerating return contents is partly redundant given an output schema exists, which is the only waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Good coverage of the lease lifecycle and the anti-duplication instruction, and return values need not be restated thanks to the output schema. However, for a leasing tool it omits two things an agent needs: what happens when no session is waiting, and whether the lease can expire or be abandoned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, transcript_chars, with 0% schema description coverage, and the description never mentions it. The name, default 60000, and 5000-200000 bounds are somewhat self-explanatory, but the description does nothing to explain what the value controls (truncation of the returned digest).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Lease the oldest research session waiting to be distilled into the graph.' The notion of leasing the oldest pending session is concrete enough to distinguish it from siblings like next_mapping or complete_distillation, though it never names the closest alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear lifecycle context: the lease persists 'until `complete_distillation`', and the returned prior records come with the instruction 'don't duplicate it'. That tells the agent how to use the result and what the follow-up call is, but there is no explicit when-not guidance or comparison to next_mapping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_mappingA
Lease the next onboarded company to map from its annual report. Until
complete_mapping, links you record are marked as curator links.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| remaining | Yes | Jobs still waiting after this one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: calling this leases a company (so state changes despite no destructive intent) and links recorded before complete_mapping are tagged as curator links rather than final. It omits important mechanics — lease duration/expiry, whether the lease is exclusive to one agent, and what is returned or errors when the queue is empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the action front-loaded and the downstream dependency second; nothing is wasted. The awkward leading indentation from the source string is a minor presentational blemish, not a content issue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the lease and the curator-link state. For a work-queue lease tool it still leaves out the empty-queue case, lease lifetime, and whether concurrent agents can collide — gaps an agent needs to handle correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema carries no semantics to compensate for and the baseline is 4. The description correctly conveys that the item is chosen by the server rather than specified by the caller.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (lease) plus resource (next onboarded company to map from its annual report), which an agent can distinguish from next_distillation and complete_mapping. The domain term 'mapping' is left undefined, so the exact work product is only partly clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies this is the entry point for a mapping work cycle and names complete_mapping as the terminator, which is useful sequencing guidance. It never states when this should be preferred over sibling queue-pullers like next_distillation or onboard, nor what to do if no company is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onboardA
Start covering companies: add them, watch their filings, suggest starter packs, and queue a mapping job for each (run by the company-mapper subagent, which reads their annual reports and records suppliers, customers and competitors).
| Name | Required | Description | Default |
|---|---|---|---|
| watch | No | Watch their SEC filings | |
| tickers | Yes | Tickers or company names to cover |
Output Schema
| Name | Required | Description |
|---|---|---|
| companies | Yes | |
| unresolved | Yes | |
| suggested_packs | Yes | |
| mapping_jobs_queued | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give generic flags (not read-only, not destructive), but the description adds genuinely useful behavior: the tool fans out into multiple side effects and queues an asynchronous mapping job executed by a named subagent that reads annual reports and records suppliers/customers/competitors. It omits idempotency behavior and what happens on re-onboarding an existing company, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the high-level action and then unpacks it. Slightly dense due to the parenthetical subagent explanation, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and the description covers the side effects well. However, for a composite mutation that queues a background job feeding `next_mapping`/`complete_mapping`, it should say how the queued work surfaces and whether repeated calls are safe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented in the schema already. The description restates 'watch their filings' (matching the `watch` param) and implies the tickers list, but adds no syntax, batch-size, or failure semantics beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Start covering companies') plus an enumerated decomposition of what that entails: adding entities, watching filings, seeding starter packs, and queuing mapping jobs. This makes clear it is a composite onboarding action rather than a primitive like `watch` or `seed_starter_pack`, though it never names those siblings to explicitly distinguish itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied ('Start covering companies') but there is no explicit when/when-not guidance, no statement about whether this replaces calling `watch` and `seed_starter_pack` separately, and no guidance on what to do if a company is already tracked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_explorerB
Write the interactive graph explorer HTML file (under TORUS_HOME/explorer.html) and open it in the user's browser.
| Name | Required | Description | Default |
|---|---|---|---|
| hops | No | ||
| focus | No | Companies to centre on (default: whole graph) | |
| open_browser | No | Open the HTML file in the default browser |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| links | Yes | |
| events | Yes | |
| opened | Yes | |
| theses | Yes | |
| companies | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false, destructive=false, openWorld=false; the description adds the real side effects — a file is written to disk at a specific path and a browser is launched — which is exactly the context annotations can't convey. It doesn't say whether an existing explorer.html is overwritten or what happens if the browser launch fails, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the primary action front-loaded and no filler. It is short enough that the omission of usage guidance reads as under-specification rather than verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values and annotations cover safety, so the remaining burden is small — but with no explanation of hops or of when to prefer this over read-only graph siblings, the description is only just adequate for a tool with a filesystem side effect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the one undescribed parameter is the semantically important one: hops (1-4) is never explained in either place, so an agent can't tell it controls graph expansion depth. The mention of opening in a browser loosely maps to open_browser, but that parameter already documents itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource: writes an interactive graph explorer HTML file to TORUS_HOME/explorer.html and opens it in the browser. That is unmistakably different from graph-reading siblings like neighbors or find_paths, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to reach for this versus neighbors, find_paths, brief, or timeline, and no prerequisites or preconditions. The agent must infer the use case (visual exploration of the graph) entirely on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallARead-only
Prior theses, claims and rejected hypotheses about entities and/or a question.
Call this before starting research so you build on earlier work.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | Show what was believed at this time | |
| limit | No | ||
| query | No | Free-text question; entities in it are detected | |
| entities | No | Entity refs to focus on |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | Yes | |
| query | Yes | |
| alerts | No | |
| claims | Yes | |
| theses | Yes | |
| entities | Yes | |
| total_claims | Yes | |
| rejected_hypotheses | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a safe read operation (readOnlyHint true, openWorldHint false), lowering the disclosure burden. The description adds that results include rejected hypotheses as well as theses and claims, which is useful behavioral context, but it does not mention point-in-time behavior or pagination limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with what is returned and followed by the key usage instruction. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It covers purpose and usage sufficiently for an agent, though it omits guidance on point-in-time queries and result limits that the schema only partially covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with descriptions for as_of, query, and entities; the description only loosely maps 'entities and/or a question' to those parameters. It adds no syntax or meaning beyond what the schema already provides, and the limit parameter remains undocumented in both.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resources returned (prior theses, claims, rejected hypotheses) and the scope (entities and/or a question), which is more specific than the tool name 'recall'. It does not explicitly contrast with sibling retrieval tools like search or recent_records, so an agent must infer when this is the right choice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this before starting research so you build on earlier work. It gives a clear usage moment but no when-not-to-use guidance or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_recordsARead-only
List what the most recent research sessions recorded (claims, theses,
relations, sources, ruled-out ideas), newest session first, with each
session's id and whether each record can still be undone. Read-only. Use it
when the user asks what Torus saved, then pass the session id and records
to undo_records to revert the unwanted ones.
| Name | Required | Description | Default |
|---|---|---|---|
| sessions | No | How many recent sessions to list (1-10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| sessions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description is consistent ('Read-only'). It adds behavior beyond the annotations: newest-session-first ordering and a per-record flag for whether the record can still be undone, which is meaningful for chaining into undo_records. It stops short of discussing session scope limits or what happens when no sessions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded: purpose first, then ordering, then the usage trigger and chaining advice. The parenthetical record list is slightly long but each item adds disambiguation value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A single-parameter read-only list tool with an output schema, so return values need not be described; the description still covers ordering, session id, and undoability, and points to the chained tool. An agent has everything needed to select and invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `sessions` parameter is documented inline with its 1-10 range and default of 1. The description only implies the window via 'most recent' and adds no format or default detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (records from the most recent research sessions), enumerating the record kinds it covers (claims, theses, relations, sources, ruled-out ideas). The ordering ('newest session first') and the inclusion of session id plus undoability make it clearly distinguishable from siblings like timeline or undo_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the user asks what Torus saved') and an explicit next step: pass the returned session id and records to `undo_records`. Both the when and the follow-on alternative are named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_claimA
Save one finding about one or more entities, tied to its sources.
Record the source first with `record_evidence` and pass its id. A fact or
metric without supporting evidence_ids is rejected, as is an inference with
neither evidence nor derived_from. Returns the new claim with its id, which
theses (`record_thesis`) and relations (`record_relation`) can cite. To fix
an existing claim use `supersede_claim`, not a second record_claim.| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | One atomic, self-contained statement, e.g. 'TSMC supplies over 90% of NVIDIA's data-center GPU wafers' | |
| entities | No | Entities the claim is about (ticker, name or id); they are resolved | |
| valid_to | No | When it stopped being true; omit if it still holds | |
| mentioned | No | Entities only mentioned in passing | |
| claim_type | Yes | fact or metric (must cite evidence_ids), inference (evidence or derived_from), forecast, or opinion | |
| confidence | Yes | 0 = guess, 1 = certain | |
| valid_from | No | When the statement became true (UTC if no zone); omit if unknown | |
| derived_from | No | Claim ids an inference builds on | |
| evidence_ids | No | Supporting source ids from record_evidence | |
| contradicting_evidence_ids | No | Source ids from record_evidence that cut against it |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | Yes | |
| status | Yes | |
| entities | Yes | |
| evidence | Yes | |
| valid_to | Yes | |
| claim_type | Yes | |
| confidence | Yes | |
| lineage_id | Yes | |
| session_id | Yes | |
| valid_from | Yes | |
| recorded_at | Yes | |
| derived_from | Yes | |
| change_reason | Yes | |
| superseded_at | Yes | |
| supersedes_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds real behavioral detail: validation rules that cause rejection, the returned id used for downstream citation, and the non-destructive correction path via supersede_claim. It stops short of describing the response shape or duplicate handling, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct information: purpose, prerequisite, validation rule, return/citation contract, and the alternative for edits. The core purpose is front-loaded in sentence one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 an output schema, the description covers the prerequisite ordering, validation constraints, and the sibling that handles corrections, which are exactly the gaps structured fields cannot fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by adding cross-parameter business rules the schema only hints at, namely that fact/metric require evidence_ids and inference requires evidence_ids or derived_from, mapping directly onto claim_type plus the evidence/derived_from fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Save one finding') with its scoping constraint ('about one or more entities, tied to its sources'), which cleanly separates it from siblings like record_evidence, record_thesis, and record_relation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite flow (call record_evidence first and pass its id), states rejection conditions per claim type, and names the alternative for corrections ('use supersede_claim, not a second record_claim'). Nothing about when to pick this tool 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.
record_evidenceB
Record a source. Re-recording the same URI returns the existing record.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | URL or document path | |
| kind | No | web | |
| quote | No | Short verbatim excerpt supporting claims | |
| title | No | ||
| publisher | No | ||
| published_at | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| uri | Yes | |
| kind | Yes | |
| quote | Yes | |
| title | Yes | |
| publisher | Yes | |
| recorded_at | Yes | |
| source_path | Yes | |
| content_hash | Yes | |
| published_at | Yes | |
| retrieved_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real value by disclosing idempotency (same URI returns the existing record), but it leaves open whether the new payload's kind/quote/title/publisher are merged, ignored, or error, which is the critical ambiguity for a dedup-on-write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the core action front-loaded and the idempotency caveat immediately after. Nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be described, but this is a 6-parameter write tool with four undocumented fields and no explanation of what evidence kinds mean or how dedup interacts with supplied fields. For a mutation tool with low schema coverage, the description is too thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: uri and quote are documented in the schema, while kind (an enum of web/filing/transcript/dataset/user_note), title, publisher, and published_at carry no explanation anywhere. The description adds zero parameter meaning, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Record a source" names a specific verb and resource, and in context (evidence = source material backing claims) it is distinguishable from record_claim and record_thesis. It does not explicitly state the contrast with those siblings, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of the obvious alternatives (record_claim, record_thesis). The only usage-relevant fact given is idempotency on re-recording, which is a behavior rather than a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_rejected_hypothesisB
Record an idea that was checked and ruled out, so it isn't re-explored.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| reason | Yes | Why it was ruled out | |
| entities | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | Yes | |
| reason | Yes | |
| entity_ids | Yes | |
| session_id | Yes | |
| recorded_at | Yes | |
| withdrawn_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world write, so safety is covered. The description adds the useful effect that recorded items are meant to suppress future re-exploration, but says nothing about where the record surfaces (e.g., via recall), duplicate handling, or whether it can be undone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the action and its justification. Nothing wasted, nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, so that burden is lifted, and the core action is understandable. Still, for a knowledge-graph write that affects later recall, the description omits how records are keyed/deduplicated and how they interact with the surrounding record_*/recall tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% — only 'reason' is documented. The description does not clarify what 'text' should contain (the hypothesis statement itself?) or what 'entities' is for, so it fails to compensate for the undocumented parameters that the schema leaves bare.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ("record") and a precise resource ("an idea that was checked and ruled out"), plus the intent behind it ("so it isn't re-explored"). That distinguishes it from siblings like record_claim or record_evidence, which capture accepted knowledge rather than negative results, though the distinction is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The condition for use is implied clearly enough — call this when an idea has already been checked and ruled out. However, there is no explicit guidance on when not to use it, how it relates to record_claim/record_evidence, or whether the same hypothesis can be re-recorded, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_relationA
Link two entities, e.g. TSMC SUPPLIES NVIDIA. Re-recording an existing link updates it (confidence, backing claim, dates) instead of duplicating it.
| Name | Required | Description | Default |
|---|---|---|---|
| rel | Yes | ||
| source | Yes | Ticker, CIK, company name, canonical key or id | |
| target | Yes | Ticker, CIK, company name, canonical key or id | |
| claim_id | No | Claim that backs this link | |
| valid_to | No | ||
| confidence | Yes | 0 = guess, 1 = certain | |
| valid_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| rel | Yes | |
| dst_id | Yes | |
| source | No | |
| src_id | Yes | |
| claim_id | Yes | |
| valid_to | Yes | |
| confidence | Yes | |
| lineage_id | Yes | |
| valid_from | Yes | |
| recorded_at | Yes | |
| superseded_at | Yes | |
| supersedes_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate a non-read-only, non-destructive write operation. The description adds valuable behavioral context: re-recording an existing link updates confidence, backing claim, and dates rather than duplicating it, which is important upsert semantics not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler: the first defines the action with an example, and the second immediately clarifies the important idempotent update behavior. It is appropriately front-loaded and sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and annotations covering safety, the description provides enough to understand purpose and upsert behavior. Minor gaps remain around relation-type semantics and explicit routing versus sibling recording tools, but core invocation guidance is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is moderate at 57%, and the description references confidence, backing claim, and dates as updateable fields. However, it does not explain the relation type enum, source/target resolution formats, or the valid date parameters beyond a broad category mention, leaving some schema gaps unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation—linking two entities—and gives a concrete example (TSMC SUPPLIES NVIDIA), making the tool's purpose immediately clear. It distinguishes this as relation recording rather than claim, thesis, or evidence recording, even without explicitly naming siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool by describing entity-to-entity links and re-recording behavior, but it does not explicitly compare it to alternatives such as record_claim or record_evidence. It also omits prerequisites like whether entities must already exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_thesisA
Save a new investment thesis and the claims it rests on.
Record the claims first with `record_claim` and pass their ids. Torus uses
the assumptions, subject and triggers to decide which new filings and news
threaten the thesis and raise alerts. Returns the thesis with its id and
status (active). To change an existing thesis use `update_thesis`; to log
an idea you rejected use `record_rejected_hypothesis`.| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Short name, e.g. 'NVIDIA stays supply-bound through FY27' | |
| stance | Yes | bullish, bearish, neutral, or n/a for non-directional views | |
| horizon | No | When the view should play out, e.g. 12m, FY27 | |
| subject | No | Main entity (ticker, name or id); it is watched for filings | |
| triggers | No | Conditions that would invalidate it; matching events raise alerts | |
| statement | Yes | The investment view in one or two sentences | |
| confidence | Yes | 0 = guess, 1 = certain | |
| risk_claim_ids | No | Claim ids that argue against it | |
| assumption_claim_ids | No | Claim ids that must stay true for the thesis to hold | |
| supporting_claim_ids | No | Claim ids that strengthen it but aren't essential |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| claims | Yes | |
| stance | Yes | |
| status | Yes | |
| horizon | Yes | |
| entry_at | No | |
| triggers | Yes | |
| benchmark | No | |
| statement | Yes | |
| confidence | Yes | |
| created_at | Yes | |
| instrument | No | |
| session_id | Yes | |
| updated_at | Yes | |
| entry_price | No | |
| horizon_date | No | |
| alert_threshold | No | |
| subject_entity_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (not read-only, not destructive, closed-world), and the description adds real behavioral context the annotations cannot: Torus consumes the assumptions, subject and triggers to decide which filings and news threaten the thesis and raise alerts. That downstream side effect is the key thing an agent needs to know before writing. Minor gaps remain (no mention of duplicate/conflict handling for an existing subject).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the prerequisite, then the routing alternatives — a sensible order with no filler. The 'Returns the thesis with its id and status (active)' sentence is partly redundant given an output schema exists, keeping it just below top marks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation with full schema coverage and an output schema, the description supplies the workflow dependency and the alerting consequence, which is the right level of abstraction. It could say more about what happens if a thesis already exists for the subject, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every field including the three claim-id arrays and TriggerIn is already documented in the schema; baseline 3 applies. The description adds only a light relational hint ('pass their ids', 'assumptions, subject and triggers'), not new syntax or format meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource ('Save a new investment thesis') plus the linked claims, which distinguishes it from update_thesis and record_rejected_hypothesis. An agent can tell exactly what object is being created versus mutated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit ordering prerequisite ('Record the claims first with record_claim and pass their ids') and names two alternatives with their selecting conditions: update_thesis for changes, record_rejected_hypothesis for rejected ideas. Nothing about when to choose this tool 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.
resolve_alertA
Judge an alert after reading the event and the thesis's claims; the thesis is updated accordingly and the change logged with the alert.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Override the default status change | |
| verdict | Yes | supports | weakens (active -> at_risk) | breaks | unrelated | |
| alert_id | Yes | ||
| rationale | Yes | Why, citing the event and evidence | |
| confidence | No | New thesis confidence |
Output Schema
| Name | Required | Description |
|---|---|---|
| alert | Yes | |
| event | Yes | |
| thesis_title | Yes | |
| thesis_status | Yes | |
| thesis_confidence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-read-only, non-destructive, closed-world mutation. The description adds value beyond that by disclosing the concrete side effects: the thesis is updated and the change is logged against the alert. It stops short of saying whether the prior thesis state is recoverable (undo_records exists) or what logging/audit trail results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the action and then delivers the preconditions and consequences. Nothing is redundant, though the semicolon-joined side-effect clause reads slightly compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the core mutation and its side effects are covered. Gaps remain around multi-step usage: what 'unrelated' does to the thesis, how the optional status override interacts with the default verdict-driven transition, and how confidence is applied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents verdict, status, rationale, and confidence. The phrase 'thesis is updated accordingly' reinforces the verdict-to-status mapping that the schema spells out, but the description adds no new parameter semantics of its own. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Judge an alert', and adds the essential precondition ('after reading the event and the thesis's claims') plus the side effect ('thesis is updated accordingly'). It does not name the closest siblings (set_thesis_outcome, update_thesis), so the boundary between judging an alert and directly editing a thesis is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'after reading the event and the thesis's claims' implies a usage sequence, telling the agent to gather context first. However, there is no explicit when-not guidance and no mention of the alternative paths (set_thesis_outcome, update_thesis, record_claim) that appear among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retract_claimB
Withdraw a claim that turned out to be wrong (kept in history).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | ||
| claim_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | Yes | |
| status | Yes | |
| entities | Yes | |
| evidence | Yes | |
| valid_to | Yes | |
| claim_type | Yes | |
| confidence | Yes | |
| lineage_id | Yes | |
| session_id | Yes | |
| valid_from | Yes | |
| recorded_at | Yes | |
| derived_from | Yes | |
| change_reason | Yes | |
| superseded_at | Yes | |
| supersedes_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as non-readonly and non-destructive, and 'kept in history' usefully confirms the claim is retained rather than deleted. However, the description does not say whether the retraction is reversible, where the reason is surfaced, or what downstream effects (theses, alerts) the retraction has.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the key behavioral fact front-loaded and no wasted clauses. Appropriate size for the tool's scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the mutation intent is clear. But for a two-parameter, non-readonly mutation with zero schema documentation, the gaps around parameter meaning and sibling routing leave an agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: claim_id and reason are bare titles with no documented meaning. The description adds nothing about the expected format of claim_id or what a reason should contain, so it fails to compensate for the complete lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: withdrawing a claim that turned out to be wrong. The parenthetical '(kept in history)' hints at how this differs from supersede_claim, but the distinction from that sibling (and from record_rejected_hypothesis) is never made explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the trigger condition ('turned out to be wrong'), but gives no explicit when-not guidance. With supersede_claim, undo_records and record_rejected_hypothesis in the sibling set, an agent has to guess which correction mechanism applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scorecardB
How tracked theses have done against their benchmarks, their outcomes, and calibration: did the user's confidence match how often they were right?
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Fetch the latest prices first (Yahoo Finance) |
Output Schema
| Name | Required | Description |
|---|---|---|
| theses | Yes | |
| markdown | No | |
| calibration | Yes | |
| generated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so the tool is not purely read-only, but the description gives no explanation of what side effect or mutation may occur. It also does not mention refresh behavior, caching, permissions, or external data access, leaving a meaningful gap for a non-destructive but non-read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that front-loads the main content of the scorecard. It is appropriately sized, though the parenthetical question makes it slightly less crisp.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not enumerate return values, and it adequately states what the scorecard covers. However, it omits usage context and does not clarify the non-read-only behavior signaled by annotations, leaving some gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one optional parameter, refresh, and the schema already describes it at 100% coverage as fetching the latest prices from Yahoo Finance. The description adds no parameter-specific information, so the baseline score of 3 is appropriate for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource and content of the scorecard: tracked thesis performance versus benchmarks, outcomes, and confidence calibration. It is specific enough to distinguish this from thesis management tools like track_thesis or update_thesis, though it does not explicitly name a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: an agent would infer this is for reviewing thesis performance and calibration. However, there is no explicit guidance on when to use this versus thesis_memo, digest, audit, or brief, and no stated prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchBRead-only
Keyword search over current claims, evidence and theses.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| types | No | Object types |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only and closed-world behavior. The description adds that results are limited to 'current' claims, evidence, and theses, but it does not explain matching semantics, ranking, or how currentness is defined.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficiently sized for a short tool definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required. However, for a generic search tool surrounded by many retrieval siblings, the description is too sparse on usage boundaries and query/limit semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, and the description partially compensates by mapping 'claims, evidence and theses' to the types parameter. It does not clarify query syntax, matching behavior, or the limit parameter's purpose beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: keyword search over claims, evidence, and theses. It does not differentiate itself from sibling retrieval tools such as recall, brief, or get_entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit when-to-use guidance, no exclusions, and no named alternatives. With many retrieval siblings, an agent must infer when this generic 'search' is preferable to recall, get_entity, timeline, or recent_records.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seed_starter_packA
Add a curated starter pack of companies and supplier/competitor links. Never overrides links research recorded.
| Name | Required | Description | Default |
|---|---|---|---|
| pack | Yes | semis, software, banks, energy or pharma |
Output Schema
| Name | Required | Description |
|---|---|---|
| pack | Yes | |
| links_added | Yes | |
| companies_added | Yes | |
| links_already_present | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive write, and the description adds genuinely new behavior beyond them: it will not override links that research has already recorded, which signals merge/preserve semantics. It omits other useful traits such as idempotency, what happens on partial overlap, and how many entities a pack inserts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action, and the protective-clause follows immediately with no filler. Effectively sized for a one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the parameter is fully documented, so the description only needs to convey intent and the non-destructive guarantee, which it does. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'pack' parameter already enumerates the five valid values in its schema description. The prose adds no meaning 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Add a curated starter pack of companies and supplier/competitor links.' This tells an agent exactly what the tool produces. It does not name or differentiate from siblings (onboard, upsert_entity, complete_mapping), so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the seeding/bootstrap framing; there is no explicit 'use when X, not when Y' and no named alternative such as onboard or upsert_entity for adding entities. The one explicit condition ('Never overrides links research recorded') is behavioral rather than a selection guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_thesis_outcomeA
Record whether a thesis turned out right, wrong or unclear (overrides the automatic outcome; used for calibration).
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Why | |
| outcome | Yes | ||
| thesis_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| method | Yes | |
| outcome | Yes | |
| thesis_id | Yes | |
| decided_at | Yes | |
| stance_return | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world mutation. The description adds genuinely new behavioral context: it overwrites an automatically computed outcome rather than appending, and the value feeds calibration. It does not say whether the write is idempotent, what happens if the thesis_id is unknown, or whether the previous outcome is recoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the core action front-loaded and the override/calibration qualification in an efficient parenthetical. Nothing redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. However, with three parameters, one undocumented field, and a mutation that silently replaces an automatic result, the description omits prerequisites (must the thesis already exist?) and any note about the effect on downstream calibration or scorecard artifacts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: 'note' is documented ('Why') and outcome's enum lives in $defs, but thesis_id has no description anywhere. The description clarifies the meaning of the outcome values in context (a verdict used for calibration, not a status flag), which is more than the enum alone conveys, but it leaves thesis_id unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (record a thesis outcome) and enumerates the domain values (right, wrong, unclear), so an agent can distinguish it from siblings like record_thesis, update_thesis or track_thesis. It lacks an explicit contrast with those sibling tools, but the action itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'overrides the automatic outcome; used for calibration' implies the situation to use it (manual correction of a system-derived verdict), but it never states when not to use it or which alternative to pick for adjusting a thesis's content versus its outcome.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
supersede_claimB
Correct a claim: the old version stays in history, the new one is current.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| reason | Yes | ||
| claim_id | Yes | ||
| confidence | No | ||
| evidence_ids | No | Replaces the evidence list if given |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | Yes | |
| status | Yes | |
| entities | Yes | |
| evidence | Yes | |
| valid_to | Yes | |
| claim_type | Yes | |
| confidence | Yes | |
| lineage_id | Yes | |
| session_id | Yes | |
| valid_from | Yes | |
| recorded_at | Yes | |
| derived_from | Yes | |
| change_reason | Yes | |
| superseded_at | Yes | |
| supersedes_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare that this mutates (readOnlyHint=false) without destroying (destructiveHint=false); the description goes further by stating the non-obvious outcome that the prior version remains in history while the new one becomes current. That is exactly the behavioral trait an agent needs before overwriting knowledge, though nothing is said about required permissions, validation failures, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler, front-loading the verb and immediately stating the retention rule. Nothing in it is redundant with the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The mutation's lifecycle effect is covered and an output schema exists, but with five parameters at 20% coverage the description should explain how optional fields (text, confidence, evidence_ids) compose the replacement version. An agent can call it, but only with trial-and-error on the payload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (just evidence_ids: 'Replaces the evidence list if given'), yet the description adds nothing about the five parameters. Key questions are unanswered: whether text must be supplied to form the new version, what omitting text/confidence does, and why reason is mandatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete operation on a concrete resource ('Correct a claim') and pins down the versioning semantics: the old version is retained, the new one becomes current. It does not explicitly distinguish itself from siblings like retract_claim or record_claim, so an agent must infer that this is 'amend in place' rather than 'withdraw' or 'create'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Correct a claim' implies the triggering situation (the claim is wrong or outdated), but there is no explicit when-to-use guidance and no mention of the obvious alternatives (retract_claim for withdrawal, record_claim for a fresh assertion). The agent is left to guess the boundary between superseding and retracting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thesis_memoB
Write a thesis up as a memo (Markdown and a standalone HTML page): what it rests on with sources and quotes, triggers, events and verdicts, ruled-out ideas and history. Saved under TORUS_HOME/memos.
| Name | Required | Description | Default |
|---|---|---|---|
| thesis_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | |
| html_path | Yes | |
| markdown_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the agent knows this is a local, non-destructive write. The description adds real value beyond that by naming the output artifacts and the destination path (TORUS_HOME/memos). However, it omits whether an existing memo is overwritten, whether a new file is created per call, and any failure behavior for an unknown thesis_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and resource, then the artifacts and the content outline. The parenthetical content list is dense but each item tells the agent what the memo will contain, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, non-destructive export tool with an output schema and annotations present, the description covers what is produced and where it lands. The remaining omission is overwrite/idempotency behavior, which matters for a file-writing tool but is a modest gap given the other structured signals.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter `thesis_id` is undocumented in both schema and description. The name is largely self-explanatory and consistent with sibling tools, so the practical risk is low, but the description adds no meaning such as format, source of the ID, or whether the thesis must already be tracked.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Write a thesis up as a memo') and enumerates the artifacts produced (Markdown plus a standalone HTML page) along with the sections it covers. The one gap is sibling differentiation: it never contrasts itself with nearby tools like `brief`, `digest`, or `thesis_weak_points`, which also summarize a thesis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but never says when to reach for it versus `brief` or `digest`, nor any preconditions (e.g. thesis must exist, must have evidence). Usage is only weakly inferable from the phrase 'write a thesis up as a memo'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thesis_weak_pointsARead-only
Where a thesis is weakest: thin or expiring assumptions, strong supplier or customer dependencies it never mentions, triggers that can't fire on events, and opposing views already in the graph. Input for /torus:challenge.
| Name | Required | Description | Default |
|---|---|---|---|
| thesis_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | |
| stance | Yes | |
| subject | Yes | |
| statement | Yes | |
| thesis_id | Yes | |
| confidence | Yes | |
| assumptions | Yes | |
| opposing_views | Yes | |
| retracted_links | Yes | |
| text_only_triggers | Yes | |
| unwatched_dependencies | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real context by revealing that the analysis draws on "opposing views already in the graph" — i.e. it reads stored relations, not just the thesis record — but says nothing about what happens when the thesis lacks assumptions or how the categories are ranked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence-eque block with the core idea ("where a thesis is weakest") front-loaded, followed by the concrete failure categories. No filler; the telegraphic style is dense but readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the description's four categories effectively preview the kinds of findings produced. For a single-parameter read-only analysis tool with annotations, this is close to complete, with the only real omission being the lack of routing guidance against sibling analysis tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the single thesis_id parameter is undocumented in both places; the description never mentions it or how to obtain one. With only one required, self-evidently named parameter the gap is minor, but it is a genuine gap rather than filled by the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a thesis) and specifies exactly what it surfaces — thin/expiring assumptions, undisclosed supplier or customer dependencies, non-firing triggers, and opposing views already in the graph. That enumeration distinguishes it from generic siblings like whatif or audit, even though the verb is implicit ("Where a thesis is weakest") rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trailing "Input for /torus:challenge" implies a downstream workflow, so an agent can infer this is a pre-challenge diagnostic step. But it never states when to prefer this over thesis_memo, whatif, scorecard, or audit, nor any precondition such as requiring a previously recorded thesis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timelineARead-only
History of one entity, oldest first: claims recorded, corrected or
retracted about it, theses on it created or changed, and events (filings,
news) that name it. Each change has a time, kind, object id and one-line
summary. Use it to see how the view on a company evolved; use what_changed
for the whole graph and get_entity for its current links.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only changes at or after this time (UTC if no zone); omit for all | |
| until | No | Only changes before this time (UTC if no zone); omit for now | |
| entity | Yes | Ticker, CIK, company name, canonical key or id |
Output Schema
| Name | Required | Description |
|---|---|---|
| since | Yes | |
| until | Yes | |
| changes | Yes | |
| entity_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely behavioral detail beyond that: results are ordered oldest first and each change carries time, kind, object id and a one-line summary. It does not discuss volume limits or pagination, which is the only notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior and ordering come first, followed by the record structure, then two sentences of sibling routing. Every sentence carries information; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, yet the description still characterizes the shape of each change. Combined with full param coverage and explicit alternative routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents the entity identifier forms (ticker, CIK, name, key, id) and the since/until semantics. The description adds no parameter-level detail 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (the history of one entity) and scope, then enumerates exactly what appears in it: claims recorded/corrected/retracted, theses created/changed, and events like filings and news. This is clearly distinguishable from data-oriented siblings such as what_changed and get_entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use case ("see how the view on a company evolved") and names two alternatives with their selecting conditions: `what_changed` for the whole graph, `get_entity` for current links. 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.
track_thesisB
Put a thesis on the scorecard: its return against a benchmark from an entry price and date, in the direction of its stance.
| Name | Required | Description | Default |
|---|---|---|---|
| stop | No | Stop tracking this thesis | |
| ticker | No | Instrument to track (default: the subject's ticker) | |
| benchmark | No | Default: SPY | |
| thesis_id | Yes | ||
| entry_date | No | Default: when the thesis was recorded | |
| entry_price | No | Default: the close on the entry date |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| claims | Yes | |
| stance | Yes | |
| status | Yes | |
| horizon | Yes | |
| entry_at | No | |
| triggers | Yes | |
| benchmark | No | |
| statement | Yes | |
| confidence | Yes | |
| created_at | Yes | |
| instrument | No | |
| session_id | Yes | |
| updated_at | Yes | |
| entry_price | No | |
| horizon_date | No | |
| alert_threshold | No | |
| subject_entity_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, closed-world write, and 'put a thesis on the scorecard' is consistent with that. The description adds no state semantics beyond it: no word on idempotency (what happens if the thesis is already tracked), whether prior entry price/date are overwritten, or what errors occur for an unknown thesis_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no padding, leading with the action and then the measurement model. Everything stated is load-bearing for understanding what gets tracked.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the schema is well described, so return-value explanation is rightly omitted. But for a write tool with a hidden 'stop' branch and a required thesis_id that is never characterized (must the thesis pre-exist? must it be unresolved?), the description leaves real gaps an agent would hit in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, with only thesis_id undocumented, so the schema carries most of the load and the baseline is high. The description still contributes by tying entry_price and entry_date together as the measurement origin and benchmark as the comparison leg, which explains why those three matter rather than just what they are.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: putting a thesis on the scorecard, tracked as return vs. a benchmark from an entry price/date. That is concrete enough to distinguish it from record_thesis (creation) and update_thesis (mutation), though those alternatives are never named, and the 'stop' mode of the same tool is not reflected in the purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance at all on when to call this versus record_thesis, update_thesis, set_thesis_outcome or scorecard. The description also omits that passing stop=true reverses the operation, so an agent cannot tell from the prose that this tool both starts and stops tracking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_recordsA
Revert records the user doesn't want: claims are retracted (corrections go back to the earlier version), theses the session created are archived, links retired, ruled-out ideas withdrawn. History keeps everything.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | undone by the user | |
| records | Yes | What to revert | |
| session_id | Yes | The session, from recent_records |
Output Schema
| Name | Required | Description |
|---|---|---|
| outcomes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false and destructive=false; the description adds the actual per-type side effects (corrections revert to the earlier version, theses archived, links retired, ideas withdrawn) and explicitly explains why this is non-destructive — "History keeps everything." That is real behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded in the first clause, followed by a compact type-by-type list; no filler sentences. The phrasing "records the user doesn't want" is a slightly informal framing but costs nothing in tokens.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers scope, provenance, and effects. Missing for a batch mutation: whether the operation is atomic across the `records` array and how an unknown or already-undone record is handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and already documents record type and session provenance, but the description adds meaning the schema cannot: what each record type actually undergoes when undone. The optional `reason` parameter is left uncharacterized in both places, keeping this short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (revert/undo) plus resource (records), and it enumerates the concrete effect per record type: claims retracted, theses archived, links retired, hypotheses withdrawn. It does not distinguish itself from sibling tools such as retract_claim or update_thesis, so an agent cannot tell from the description alone which to pick for a single claim.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Records the user doesn't want" implies the trigger condition, and "theses the session created" hints at a scope limit, but there is no explicit when-to-use/when-not guidance and no mention of the overlapping siblings (retract_claim, supersede_claim). Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unwatchA
Stop watching a company you added with watch. Removes it from the
explicit watchlist only: a company that is the subject or a trigger entity
of an open thesis is still followed. Nothing in the graph is deleted.
Returns the updated watch list, as list_watches does.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Ticker, CIK, company name, canonical key or id |
Output Schema
| Name | Required | Description |
|---|---|---|
| feeds | Yes | |
| entities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show readOnlyHint=false and destructiveHint=false, and the description adds valuable context: 'Nothing in the graph is deleted' and that open thesis entities remain followed. It also describes the return value ('Returns the updated watch list, as `list_watches` does'), going beyond structured data without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences are tightly front-loaded: the core action first, then scope, then non-destructiveness, then return value. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter mutation with an output schema and annotations, the description covers what changes, what does not change, and the return format. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the `entity` parameter is fully documented in the schema ('Ticker, CIK, company name, canonical key or id'). The description adds no additional meaning about the parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Stop watching a company you added with `watch`.' It distinguishes this tool from the `watch` sibling and clarifies the scope ('explicit watchlist only') so an agent can tell exactly what it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly indicates the tool is the inverse of `watch` and explains that a company tied to an open thesis will still be followed, which serves as a when-not condition. However, it does not explicitly name an alternative tool for fully stopping thesis tracking, leaving a small gap in routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_thesisA
Revise a thesis: status, confidence, the claims it rests on, and its triggers, in one atomic step. Everything is kept in its history.
Also tunes its alerts: a threshold of its own, and mutes (e.g. no alerts
for a supplier's routine 10-Qs).| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why; kept in the thesis history | |
| status | No | ||
| horizon | No | New horizon, e.g. 12m or FY2027 (counted from now) | |
| add_mutes | No | Stop alerts from matching events | |
| thesis_id | Yes | ||
| add_claims | No | Claims to link (e.g. newer, better-sourced assumptions) | |
| confidence | No | ||
| add_triggers | No | New conditions that would invalidate it | |
| alert_threshold | No | Minimum alert score for this thesis | |
| remove_mute_ids | No | ||
| remove_claim_ids | No | Claims the thesis no longer rests on | |
| remove_trigger_ids | No | ||
| reset_alert_threshold | No | Go back to the global alert threshold |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| claims | Yes | |
| stance | Yes | |
| status | Yes | |
| horizon | Yes | |
| entry_at | No | |
| triggers | Yes | |
| benchmark | No | |
| statement | Yes | |
| confidence | Yes | |
| created_at | Yes | |
| instrument | No | |
| session_id | Yes | |
| updated_at | Yes | |
| entry_price | No | |
| horizon_date | No | |
| alert_threshold | No | |
| subject_entity_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), it discloses two genuinely useful traits: the change is applied "in one atomic step" and "Everything is kept in its history," which reassures the agent about reversibility. It does not address permissions or partial-failure behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the core revision semantics before the secondary alert-tuning behavior. Every clause carries information; only mild redundancy between "triggers" and "tunes its alerts."
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter atomic mutation with an output schema and safety annotations already present, this covers the main behavioral story (atomicity, history retention, alert tuning). The gap is the destructive/removal parameters and the rationale field, which are left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 62%, and the description adds conceptual meaning for the alert-tuning side (per-thesis threshold, mutes with a concrete supplier-10-Q example). However, the add_/remove_ asymmetry (remove_claim_ids, remove_mute_ids, remove_trigger_ids, reset_alert_threshold) and the required reason/horizon fields are left to the schema, so it does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Revise a thesis") and enumerates the mutable dimensions: status, confidence, claims, triggers, plus alert threshold and mutes. The scope is unambiguous, though it never names a sibling (e.g. record_thesis for creation, track_thesis) to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The reader can infer this is the mutation path versus record_thesis' creation path, but the description never says so explicitly. There is an illustrative mutes example, yet no when-to-use/when-not and no routing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_entityB
Create an entity (or merge into the one with the same canonical_key).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | company | |
| name | Yes | ||
| aliases | No | Other names, abbreviations | |
| tickers | No | ||
| canonical_key | No | Stable id such as cik:0001045810; merges on match |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| name | Yes | |
| attrs | Yes | |
| aliases | Yes | |
| created_at | Yes | |
| updated_at | Yes | |
| canonical_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world write, so the safety profile is covered. The description adds real value by disclosing the merge-on-match behavior, but it never says what happens to existing aliases/tickers on a merge (appended vs. overwritten) — a material ambiguity for an upsert.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the destructive/merge nuance is packed into the parenthetical rather than buried in prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. However, for a 5-parameter mutation with 40% schema coverage and a sibling (merge_entities) that overlaps semantically, the description should clarify merge semantics and sibling selection; it leaves both underdetermined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%: aliases and canonical_key are documented in the schema, while name, kind, and tickers are not. The description only echoes canonical_key matching, which the schema already states, and adds nothing about kind's defaults or ticker handling, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an entity') and adds the non-obvious upsert twist: it merges into an existing entity on canonical_key match. It does not name the closely related siblings get_entity or merge_entities, so the agent must infer which one to reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical implies the merge condition (same canonical_key), which is the key usage signal, but there is no explicit when-to-use guidance, no prerequisites, and no statement about when an agent should call merge_entities or get_entity instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watchA
Watch a company: its new SEC filings become events (on the next
torus watch run). Subjects of open theses are watched automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| entity | Yes | Ticker, CIK, company name, canonical key or id |
Output Schema
| Name | Required | Description |
|---|---|---|
| feeds | Yes | |
| entities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as a non-read-only, non-destructive mutation; the description adds the key behavioral trait that effects are deferred to the next `torus watch run`, which the annotations cannot convey. It omits idempotency (what happens if already watched) and error/duplicate behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, effect stated first, the deferred-run caveat parenthesized in place. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover safety, but the description leaves gaps typical of a state-changing tool: behavior on re-watch, the purpose of `note`, and how to reverse the action with unwatch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only 50% schema coverage: `entity` is documented in the schema, but `note` is undocumented in both schema and description, and the description never mentions either parameter. With low coverage the description should compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Watch a company') and describes the concrete effect: new SEC filings become events. It implies its inverse sibling (unwatch) and companion (list_watches) but never names them, so differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Adds a genuine usage rule not inferable elsewhere: subjects of open theses are watched automatically, implying you don't need to call this for those entities. No explicit guidance on unwatch/list_watches or when-not to use, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
what_changedBRead-only
Everything recorded or revised across the graph since a point in time.
| Name | Required | Description | Default |
|---|---|---|---|
| since | Yes | Start of the window (UTC if no zone) | |
| until | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| since | Yes | |
| until | Yes | |
| changes | Yes | |
| entity_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety profile is covered. The description adds that it includes both 'recorded' (new) and 'revised' (updated) items, which is a useful behavioral nuance, but it doesn't disclose rate limits, auth needs, or whether deletions are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. It efficiently conveys the tool's scope and temporal filter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with an output schema, the description is minimally adequate. However, it lacks usage guidance and sibling differentiation, which are important given the many related tools in the sibling list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (only 'since' documented). The description does not mention any parameters, so it fails to compensate for the undocumented 'until' parameter, leaving its meaning and usage unclear from the description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource (everything recorded or revised across the graph) and the temporal scope (since a point in time). It doesn't explicitly name a sibling tool or say how it differs from recent_records or timeline, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: an agent would call this to see changes since a timestamp. However, there is no explicit guidance on when to prefer this over alternatives like recent_records or timeline, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatifARead-only
What if this happened? Which theses would it reach, through which links, and would it raise alerts. Records nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| entities | Yes | Companies the event would be about | |
| description | Yes | The hypothetical, e.g. 'TSMC fab outage halts CoWoS 3 months' | |
| materiality | No | How much it matters (default: from the wording) | |
| occurred_at | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes | |
| threshold | Yes | |
| description | Yes | |
| materiality | Yes | |
| materiality_reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false; the description reinforces this with 'Records nothing', which is exactly the trait an agent worries about for a simulation tool. It also discloses the shape of the result (theses reached, links traversed, alert likelihood) beyond what annotations say. It does not mention cost, depth limits, or latency, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no repetition, and the key non-persistence fact is placed last as a memorable closer. The lead rhetorical question is slightly softer than a declarative statement but does establish the counterfactual framing efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description's job is mainly to frame the computation, which it does by naming the three outputs (theses, links, alerts). What is missing is scale/scope guidance (how far the traversal goes) and confirmation that missing entities are tolerated. Adequate but not exhaustive for a graph-simulation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so entities and description are already well documented, and the schema explains materiality's default behavior. The description adds no parameter-level meaning, notably nothing about how materiality or occurred_at affect the simulation. Baseline 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the operation precisely: a hypothetical-event simulation that traces which theses and links the event would reach, and whether it raises alerts. It is clearly distinct from siblings like impact or add_event. The opening rhetorical question costs a little sharpness but the follow-up clauses pin the purpose down.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the counterfactual framing; there is no explicit statement of when to prefer this over impact (actual event propagation) or timeline/what_changed. The phrase 'Records nothing' implicitly routes write intents elsewhere, but no alternative is named. An agent can infer the scenario analysis use case, but must read sibling names to confirm.
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.
4 tool updates
v0.1.1- Changed
recent_records1 field changed- changed
Input schema / properties / sessions / descriptionPrevious value: -"Most recent sessions"New value: +"How many recent sessions to list (1-10)"
- Changed
record_claim7 fields changed- added
Input schema / properties / claim_type / descriptionAdded value: +"fact or metric (must cite evidence_ids), inference (evidence or derived_from), forecast, or opinion" - added
Input schema / properties / contradicting_evidence_ids / descriptionAdded value: +"Source ids from record_evidence that cut against it" - changed
Input schema / properties / entities / descriptionPrevious value: -"Entities the claim is about"New value: +"Entities the claim is about (ticker, name or id); they are resolved" - added
Input schema / properties / evidence_ids / descriptionAdded value: +"Supporting source ids from record_evidence" - changed
Input schema / properties / text / descriptionPrevious value: -"One atomic, self-contained statement"New value: +"One atomic, self-contained statement, e.g. 'TSMC supplies over 90% of NVIDIA's data-center GPU wafers'" - added
Input schema / properties / valid_from / descriptionAdded value: +"When the statement became true (UTC if no zone); omit if unknown" - added
Input schema / properties / valid_to / descriptionAdded value: +"When it stopped being true; omit if it still holds"
- Changed
record_thesis9 fields changed- changed
Input schema / properties / assumption_claim_ids / descriptionPrevious value: -"Claims the thesis depends on"New value: +"Claim ids that must stay true for the thesis to hold" - changed
Input schema / properties / horizon / descriptionPrevious value: -"e.g. 12m, FY27"New value: +"When the view should play out, e.g. 12m, FY27" - added
Input schema / properties / risk_claim_ids / descriptionAdded value: +"Claim ids that argue against it" - added
Input schema / properties / stance / descriptionAdded value: +"bullish, bearish, neutral, or n/a for non-directional views" - added
Input schema / properties / statement / descriptionAdded value: +"The investment view in one or two sentences" - changed
Input schema / properties / subject / descriptionPrevious value: -"Main entity of the thesis"New value: +"Main entity (ticker, name or id); it is watched for filings" - added
Input schema / properties / supporting_claim_ids / descriptionAdded value: +"Claim ids that strengthen it but aren't essential" - added
Input schema / properties / title / descriptionAdded value: +"Short name, e.g. 'NVIDIA stays supply-bound through FY27'" - changed
Input schema / properties / triggers / descriptionPrevious value: -"Conditions that would invalidate it"New value: +"Conditions that would invalidate it; matching events raise alerts"
- Changed
timeline2 fields changed- added
Input schema / properties / since / descriptionAdded value: +"Only changes at or after this time (UTC if no zone); omit for all" - added
Input schema / properties / until / descriptionAdded value: +"Only changes before this time (UTC if no zone); omit for now"
45 tool updates
v0.1.0- First observed
add_event - First observed
alert_stats - First observed
audit - First observed
brief - First observed
complete_distillation - First observed
complete_mapping - First observed
digest - First observed
filing_diff - First observed
filing_text - First observed
find_paths - First observed
get_entity - First observed
impact - First observed
list_alerts - First observed
list_watches - First observed
merge_entities - First observed
neighbors - First observed
next_distillation - First observed
next_mapping - First observed
onboard - First observed
open_explorer - First observed
recall - First observed
recent_records - First observed
record_claim - First observed
record_evidence - First observed
record_rejected_hypothesis - First observed
record_relation - First observed
record_thesis - First observed
resolve_alert - First observed
retract_claim - First observed
scorecard - First observed
search - First observed
seed_starter_pack - First observed
set_thesis_outcome - First observed
supersede_claim - First observed
thesis_memo - First observed
thesis_weak_points - First observed
timeline - First observed
track_thesis - First observed
undo_records - First observed
unwatch - First observed
update_thesis - First observed
upsert_entity - First observed
watch - First observed
what_changed - First observed
whatif
TDQS
Scored across 45 tools
Most tools target a clearly distinct resource+action (record_claim vs supersede_claim vs retract_claim, watch/unwatch/list_watches, next/complete pairs for jobs), and descriptions explicitly disambiguate near-neighbours like timeline vs what_changed vs recent_records. A few pairs still blur: whatif vs impact are both dry-run reaches, and brief vs recall vs digest all surface prior context, though the descriptions do differentiate them on close reading.
There is a solid verb_noun family (record_claim, record_thesis, update_thesis, merge_entities, resolve_alert, complete_mapping) and consistent next_/complete_ job pairs, but it sits alongside many bare single-word tools (brief, recall, search, neighbors, timeline, impact, audit, digest) and noun-phrase tools (alert_stats, thesis_weak_points, filing_diff). The mixed style is readable and roughly maps verbs to mutations and nouns to read-only views, but it is not a single predictable convention.
45 tools is far above the ergonomic range and puts heavy pressure on tool selection even with distinct descriptions. The domain is broad (graph research, alerting, job leasing, filings, memos, scorecard), so each tool is plausibly motivated, but the surface would benefit from consolidation or grouping.
Coverage is unusually thorough: full entity/claim/thesis/relation/evidence lifecycle, corrections with history, event-driven alerts, watchlist management, job leasing for distillation and mapping, memos, explorer export, scorecard and audit. Minor gaps exist — there is no direct get_thesis or list_theses retrieval tool, with thesis inspection routed through brief, recall, thesis_memo and update_thesis.
Maintenance
Related MCP Connectors
Your investing research inside Claude: watchlists, financial ratios, reverse-DCF valuations, investment theses, notes, portfolio, earnings calendar and news for the companies you follow. 70 read and write tools; ask what's on your morning desk, rank a watchlist by ROE, log a trade or save a thesis. OAuth sign-in. Free to start.
Research layer for AI agents: stock theses, filing Q&A with page cites, monitoring. Research-only.
Persistent knowledge graph for AI-augmented teams. Store decisions, findings, and standing rules across agent sessions with semantic search and typed connections. Includes cross-session memory, audit trail, workspace isolation, and secret detection. Built for teams running agents that need to remember. Free until launch with team tier as default, anon trial available.
A second brain for Claude: remembers your work, plans your day, encrypted under a key only you hold.
Related MCP Servers
- AlicenseBqualityAmaintenanceProvides a persistent "second brain" for Claude featuring zero-latency hot caching, semantic cold storage, and automatic pattern mining from activity logs. It enables users to store, search, and automatically extract project facts and code patterns for enhanced contextual recall.56128 PyPI14MIT
- AlicenseNot gradedqualityDmaintenanceProvides Claude with a persistent local memory and structured knowledge graph to track project states, tasks, and historical decisions across different chat sessions. It enables users to recall information using keyword relevance, time-travel queries, and dependency analysis for complex project management.MIT
- AlicenseNot gradedqualityBmaintenanceProvides Claude Desktop with persistent, structured memory and semantic search via a local SQLite knowledge graph, plus a web UI for visualization and management.MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to access and manage a persistent, human-readable knowledge graph of neurons, with semantic search, memory consolidation, and local ownership.MIT