Skip to main content
Glama

Solumbe

Models generate the change. Solumbe proves whether it is safe to merge.

Formerly Òtítọ́ (@bashbop/otito), renamed in 4.0.0; the CHANGELOG maps every old name to its new one.

CI npm license: MIT node Listed on mcpservers.org Solumbe MCP server – quality and maintenance score on Glama

solumbe demo

Solumbe MCP server – quality and maintenance score on Glama

Solumbe is a local-first, deterministic, model-agnostic trust layer for AI-assisted development. It builds task-aware repository context before an agent edits, scores how much a change actually touches, and gates merge readiness against the exact staged tree, with no server, no account, and no code leaving the machine.

It does not replace Claude Code, Codex, Cursor, Gemini, or any native agent harness. It runs beside them and keeps working as the models change underneath.

A passing local gate is never an automatic merge approval: hosted CI, GitHub review, CODEOWNERS, and the human release decision remain separate authorities.

Install

npm install -g @bashbop/solumbe
solumbe doctor
solumbe install --host all

The last command connects Solumbe's MCP server to every agent host it finds: Claude Code, Claude Desktop, Codex CLI, Cursor, VS Code, Gemini CLI and Kimi Code CLI. Add --dry-run to see the plan first, or name hosts with --host claude-code,cursor. Restart each host afterwards.

Or without installing: npx -y @bashbop/solumbe doctor.

Related MCP server: Graft

What it does

Rank what a change actually touches, from the request alone, with no model, no embeddings, and no network:

$ solumbe impact . "add refund handling to checkout" --top 3

  concepts: money flow

   1.  src/payment/checkout.service.ts    score 155
       |- role: required
       |- path matches: checkout
       |- symbol matches: checkout, refund
       |- concept match: money flow (×1.4 + 6.0)
       |- risk: money flow

   2.  src/payment/stripe.webhook.ts    score 6
       |- role: advisory
       |- concept match: money flow (×1.4 + 6.0)

Gate the exact staged tree, and say precisely why:

$ solumbe gate . --staged --base origin/main --request "add refund handling to checkout" --min-convergence 80

  [OK]    Changed files          1 changed file found.
  [OK]    Staged snapshot        Changed-file scope and convergence evidence are captured from the exact staged Git tree.
     |- Tree: 7d0b513dd256877d6bd309a6406468a9b1eaeedc
     |- Base: b776f04fcfbd02c8ce8d63e1a0c2450be58de039
  [OK]    Secret safety          No secret file paths and no credential values found in the changed content.
  [WARN]  Risk review            Risk-sensitive files changed; maintainer review should be explicit.
     |- src/payment/checkout.service.ts
  [OK]    Convergence            Task and diff satisfy the convergence requirement.
     |- Score: 100/100 (aligned)
     |- Receipt handle: rcpt_a8d31efae06e
     |- Subject tree: 7d0b513dd256877d6bd309a6406468a9b1eaeedc

  VERDICT  WARN

The convergence score is the part a model cannot grade for itself: it compares the stated intent against the files the diff actually changed, and produces a receipt bound to the exact base, parent, and staged-tree identity.

Hold the change to what was declared. Record the files a request is expected to touch before the edit, and the gate names any file that was never declared:

$ solumbe declare . "add refund handling to checkout"
$ # ... the agent edits ...
$ solumbe gate . --staged --base HEAD --intent .solumbe/intent.json

  [FAIL]  Scope contract         Touched `src/auth/session.ts`, which was never declared. Amend the intent with the reason it belongs (`solumbe amend <file> --reason "<why>"`), or take it out of the change.
     |- Request: "add refund handling to checkout"
     |- Contract: fe655c2af2b31b7e3edec6aedd248b379235811d1228c829f87ff73796ace487
     |- Changed files: 3 (1 declared, 0 amended, 1 implied, 1 undeclared)
     |- Implied: tests/checkout.service.test.ts (owner-test of src/payment/checkout.service.ts)
     |- Undeclared on a risk-sensitive path: src/auth/session.ts [auth/security]

An amendment adds a file with its reason, hashed onto the contract, so a reviewer reads why the scope grew. Over MCP it is change_impact with declare: true, and review_gate with intent.

The core

Four commands are the product. They call no model, open no socket, and read nothing outside the repository.

Step

Command

What it proves

Before the edit

solumbe context "add refund handling" --path .

Which files, tests and commands the request needs

After the edit

solumbe converge . "add refund handling" --base origin/main --staged

How far the diff is from the request, with a receipt

Before the merge

solumbe gate . --staged --base origin/main --request "add refund handling"

PASS / WARN / FAIL on the exact staged tree

After the merge

solumbe attest . --verdict verdict.json --merge <sha>

A hash-chained record of what shipped, under which verdict

solumbe help shows these and how to set up; solumbe help --all lists every command, including the ones that support them (impact, declare, pr, review, map, calibrate, route, ax, dashboard and the rest). Nothing was removed.

Nothing hosted is required, and nothing hosted can change a verdict. Local Core, Optional Hosted lists exactly what the optional pieces send, and where.

Supporting commands

Goal

Command

Rank change blast radius

solumbe impact . "add refund handling" --top 12

Score intent vs. execution

solumbe converge "add refunds" --path . --base HEAD --staged

Score a committed change exactly

solumbe converge "add refunds" --path . --base HEAD~1 --head HEAD

Gate a product change across repos

solumbe workspace-gate ../web ../api --request "ship change"

Grade risk flags against history

solumbe calibrate . --window 30

Grade route tiers against history

solumbe regret . --window 30 --offline

Regrade a saved run, same answers

solumbe regret --rescore run.json

Score Agent Experience

solumbe ax . "add a new MCP tool"

Recommend a model tier

solumbe route . "add a new MCP tool"

Sharpen context with a model read

solumbe context "add a new MCP tool" --path . --online

Inspect one repo

solumbe repo . --json

Build a code map

solumbe map . --json

Index and search local projects

solumbe index ~/projects --discover then solumbe search "events controller"

Generate an agent harness

solumbe harness . --out .solumbe/harness.md

Run the MCP server

solumbe mcp

Every command takes --json, and solumbe help lists the full set with flags.

MCP

Solumbe ships a stdio MCP server exposing 14 tools: repo_inspect, repo_map, repo_index, repo_search, context_pack, change_impact, agent_experience, model_route, convergence_score, review_context, review_gate, review_verdict, workspace_report, and repo_harness.

{
  "mcpServers": {
    "solumbe": {
      "command": "npx",
      "args": ["-y", "@bashbop/solumbe", "mcp"]
    }
  }
}

solumbe install --host all writes this entry for you, using absolute paths so hosts that do not inherit your shell PATH can still start it. Published in the MCP Registry as io.github.BASHBOP/solumbe. Repo-map lookups use an external per-user cache and never write into the inspected repository. Host-specific setup for Claude Code, Claude Desktop, Codex, Cursor, VS Code, Gemini CLI, and Kimi Code is in MCP and Agent Workflows.

How it compares

Approach

Strengths

Where solumbe differs

Sourcegraph / Cody context

Powerful hosted code search and embedding-based context across an org

Local-first and deterministic: no server, no account, no code leaves the machine, and the same query always yields the same packet

Hand-written CLAUDE.md / rules files

Curated, intent-rich guidance

Hand-written context goes stale; solumbe regenerates context from the actual code (symbols, imports, routes, tests) on every run and complements a short CLAUDE.md

grep / ripgrep

Fast, universal text matching

solumbe ranks whole files by task intent across paths, symbols, exports, and tests, then adds patterns and validation commands, producing a context packet rather than a list of matching lines

Documentation

Full command reference, agent workflows, release process, evaluation method, and the design theses behind the trust layer:

bashbop.github.io/solumbe

Contributing

git clone https://github.com/BASHBOP/solumbe.git
cd solumbe && npm ci && npm run ci

npm run ci is the full gate: format, lint, typecheck, version check, tests, coverage floors (70% lines / 60% branches / 75% functions), three evaluation corpora, dependency audit, and a packaged-tarball smoke test. Run it before requesting review.

Start with CONTRIBUTING.md and the Code of Conduct. All changes need maintainer review; main requires passing gates and resolved conversations. Solumbe follows Semantic Versioning, so say whether a PR is no-impact, patch, minor, or major.


Part of the toolchain

solumbe is one of four tools that form a deterministic trust layer for AI-assisted development. Each uses static analysis to answer a question people keep handing to an LLM.

  • solumbe (this tool), for context: what does this change actually touch?

  • tieline, for contracts: did the front end and back end quietly stop agreeing?

  • bouncer, for compliance: could you defend this to Ofcom?

  • aiglare, for governance: where can the model do something you can't undo?

More at segunolumbe.com. static analysis, never the model.

Available Tools

14 tools
agent_experienceAgent Experience (AX)A
Read-only

Score Agent Experience (AX): a single 0–100 number answering "how cheap and safe is it for an agent to make this change here?", blending Changeability (token cost), Containment (blast radius), Guardrails (tests / validation / CODEOWNERS / CI), and Clarity (task groundedness). Returns sub-scores, drivers, and concrete recommendations for raising AX.

NameRequiredDescriptionDefault
topNoNumber of impact files to consider when scoring blast radius. Defaults to 8.
pathNoRepository path. Defaults to current working directory.
queryYesPlain-English change request to score, e.g. "add a new MCP tool".
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON. Defaults to false.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds real context beyond that: the score blends four named dimensions, blast radius is derived from impact files, and the return includes sub-scores, drivers, and recommendations. It stops short of disclosing analysis cost or which repository data is read, but for a read-only scoring tool this is meaningfully informative.

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

Conciseness4/5

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

One dense paragraph, front-loaded with what the tool does and why the score exists. Each clause earns its place, though the four-dimension parenthetical is jargon-heavy and could be easier to scan as a list.

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

Completeness4/5

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

For a read-only scoring tool with full schema coverage and no output schema, the description covers the score's composition and return shape well enough to call it correctly. Minor gaps remain around analysis cost and repository scope, but nothing essential is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema itself documents all four parameters, including top, path, query, and includeMarkdown. The description only indirectly illuminates 'top' through its mention of blast radius and impact files; otherwise it adds no parameter detail beyond the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb and resource ('Score Agent Experience') and defines the composite metric precisely, including its four sub-dimensions. It does not differentiate this from plausible siblings such as convergence_score, review_gate, or change_impact, 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.

Usage Guidelines3/5

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

Usage is implied by the framing: score a plain-English change request to learn how cheap and safe it is for an agent. There is no explicit when-to-use or when-not guidance, and no sibling tool is named as an alternative, so the agent is left to infer routing.

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

change_impactChange ImpactA
Read-only

Given a plain-English change request, rank the files most likely to own the change, with risk flags, suggested tests, and an implementation plan. Optional diff base surfaces exact changed-file evidence alongside the heuristic. When the repository's .solumberc.json lists companions, companions also carries the top few files each companion repository would own for the same request.

NameRequiredDescriptionDefault
topNoNumber of files to return. Defaults to 10.
pathNoRepository path. Defaults to current working directory.
amendNoAdd files to the declared intent passed as intent, with the reason they belong to the change. Returns the amended record under intent without ranking anything; nothing is written.
queryYesPlain-English change request.
intentNoWith amend: the declared intent to add files to (the record, its JSON, or a path to it). Its request must be the query.
declareNoAlso freeze the predicted owner and supporting files as a declared intent (a scope contract) and return it under intent. Call it before editing, then pass that record to review_gate as intent: a changed file that was never declared fails the gate. Nothing is written.
diffBaseNoOptional git ref to validate predictions against (e.g. origin/main, HEAD).
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON. Defaults to false.
includeUntrackedNoWith diffBase, also count untracked, non-ignored files as changed. Defaults to true; pass false to review only tracked changes.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description reinforces this with 'nothing is written' twice and 'returns the amended record under intent without ranking anything'. It also discloses the extra behavior of diffBase (exact changed-file evidence) and the companions behavior driven by .solumberc.json, which annotations alone would not convey.

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

Conciseness4/5

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

Three sentences, front-loaded with the core ranking purpose before the optional diffBase and companions clauses. It is dense but every clause carries information; the companions sentence is the only one that could arguably be trimmed.

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

Completeness5/5

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

For a 9-parameter tool with a nested amend object and no output schema, the description still explains what results come back (ranked files, risk flags, tests, plan, intent record, companions) and the two-mode behavior (ranking vs. amend/declare). An agent has enough to call it correctly and interpret the response.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds meaning beyond the schema: what diffBase actually does ('surfaces exact changed-file evidence'), what declare freezes, and what companions carries. Minor params like top and path are left to the schema, which is acceptable given full coverage.

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

Purpose5/5

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

The description states a specific verb and resource: 'rank the files most likely to own the change', and enumerates the concrete outputs (risk flags, suggested tests, implementation plan). This is clearly distinguishable from siblings like review_gate or repo_search, which are about gating and locating rather than impact ranking.

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

Usage Guidelines4/5

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

It gives explicit workflow guidance: 'Call it before editing, then pass that record to review_gate as intent', and explains that diffBase validates predictions against a git ref. It does not state outright when NOT to use the tool or contrast it with review_context, but the context it does provide is strong and actionable.

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

context_packContext PackA
Read-only

Generate a task-aware local context packet with primary files, related files, tests, and validation commands. Deterministic by default; online:true also asks a read model for the request's intent and which candidate files it needs, reported under modelRead.

NameRequiredDescriptionDefault
pathNoRepository path. Defaults to current working directory.
limitNoMaximum primary, related, and test files per section. Defaults to 8.
pathsNoRepository paths for a multi-repo context packet. Omitted, `path` plus the `companions` listed in its .solumberc.json.
queryYesTask or question to gather context for.
onlineNoAsk a read model (TypeSafe's Jev or Claude) for the request's intent and each candidate file's relevance, applying confident answers. Needs TYPESAFE_API_KEY or ANTHROPIC_API_KEY; without either the pack is unchanged. Defaults to false.
includeEvidenceNoInclude per-file imports, exports, and symbol slices as source evidence. Defaults to false to keep the packet compact.
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON packet. Defaults to false.

TDQS

A3.9/5.0
Behavior4/5

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

Beyond readOnlyHint/openWorldHint, it discloses that default behavior is deterministic and that online:true reaches an external read model, gracefully degrading ("without either the pack is unchanged") when no key is set. It also explains that includeEvidence defaults off to keep the packet compact. Costs such as runtime or file-count tradeoffs are not mentioned, 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.

Conciseness5/5

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

Two tightly packed sentences: the first defines the artifact, the second defines the only behavioral branch (online). No filler, no repetition of the schema, and the core output is front-loaded.

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

Completeness4/5

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

With no output schema and seven parameters, the description does the necessary work: it names the packet's sections, the deterministic default, and the online augmentation path. What remains thin is the shape of the returned packet and multi-repo behavior, both of which live entirely in the schema descriptions.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds outcome semantics the schema lacks: online results surface under modelRead and only confident answers are applied, and includeMarkdown switches the return shape to a markdown report. That goes beyond merely restating parameter names.

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

Purpose4/5

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

States a specific verb and resource ("Generate a task-aware local context packet") and enumerates the packet's contents: primary files, related files, tests, validation commands. That is far more informative than the title, but it never names a sibling, so an agent must infer on its own that this differs from repo_search, repo_map, or review_context.

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

Usage Guidelines3/5

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

The description signals the main usage fork (deterministic by default vs. online:true consulting a read model) and the API-key prerequisite. It never says when this tool should be chosen over repo_search or review_context, or when a local packet is the wrong choice, so routing context is only implied.

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

convergence_scoreConvergence ScoreA

Score convergence: a deterministic 0–100 measure of the distance between a stated task (intent) and the actual git diff (execution), with sub-scores for Coverage (did the intent happen?), Scope (did only the intent happen?), and Risk alignment (did unrequested drift land on risk-sensitive paths?). No model. A task that predicts no owner file is band inconclusive, with no score. Emits a recomputable receipt (a hash anyone can regenerate). Requires a base git ref to diff against; scores the working tree's tracked changes unless head or staged selects an exact subject.

NameRequiredDescriptionDefault
topNoNumber of predicted owner files to consider. Defaults to 10.
baseYesGit ref to diff against (e.g. origin/main, HEAD~1). Required.
headNoScore exactly base..head instead of the working tree; the receipt binds to the head commit. Cannot be combined with staged.
pathNoRepository path. Defaults to current working directory.
queryYesThe stated task / intent to measure against the diff, e.g. "add Stripe refunds".
intentNoDeclared intent from change_impact declare (record, JSON, or path): score against the declared files instead of a live prediction.
stagedNoScore only the Git index; the receipt binds to its tree.
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON. Defaults to false.
includeUntrackedNoWorking-tree mode only: also score untracked, non-ignored files. Defaults to false; untracked files are otherwise listed under untracked and not scored.

TDQS

A4/5.0
Behavior5/5

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

Even though annotations only state readOnlyHint=false, the description adds substantial behavioral context: no model is used, scoring is deterministic, an inconclusive band exists, a recomputable receipt is emitted, and untracked/staged/head behavior is clarified. This gives an agent real insight beyond the annotation.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and stays compact despite covering the scoring model, sub-scores, inconclusive cases, receipt, and subject selection. Each sentence adds useful information without repetition.

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

Completeness4/5

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

For a complex 9-parameter tool with no output schema, the description covers the essential invocation context and output meaning at a high level: score range, sub-scores, inconclusive band, and receipt. It still does not describe the full JSON return shape or all mode interactions, so it is strong but not fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already well documented. The description adds high-level meaning for base, head/staged subject selection, and intent-vs-diff scoring, but it does not explain most individual parameters such as top, includeMarkdown, includeUntracked, or path beyond what the schema already says.

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

Purpose4/5

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

The description gives a specific verb and resource: score convergence as a deterministic 0–100 distance between stated intent and git diff, with named sub-scores. It is clearly a scoring operation unlike the sibling tools, but it does not explicitly contrast itself with alternatives such as change_impact or review_gate.

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

Usage Guidelines3/5

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

The description explains operational context—base is required, working tree is scored by default, and head/staged select alternate subjects—but it does not state when to choose this tool over sibling tools or when not to use it. Usage is implied rather than explicitly routed.

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

model_routeModel RouteA
Read-only

Recommend a model tier (cheap, mid or premium) for a coding request before any work starts. Combines solumbe's deterministic repository half (AX, containment, top-severity risk paths) with a System One model's calibrated read of the request (specificity, blast radius, novelty). The model is called only when TYPESAFE_API_KEY is set in this server's environment and offline is not true; otherwise the read is a labelled offline estimate, and model.source says which. Advisory: it recommends a tier and never feeds review_gate or review_verdict. Pass host to map the tier to that host's model id.

NameRequiredDescriptionDefault
topNoNumber of impact files to consider. Defaults to 8.
hostNoOptional host whose model map resolves the tier to a model id (built in: claude-code; add others in .solumbe/model-route.json).
pathNoRepository path. Defaults to current working directory.
queryYesPlain-English change request to route, e.g. "fix the typo in the README".
offlineNoNever call the model, even when a key is set. Defaults to false.
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON. Defaults to false.

TDQS

A4.5/5.0
Behavior5/5

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

Discloses behavior well beyond the annotations: the model is only called when TYPESAFE_API_KEY is set and offline is not true, otherwise a labelled offline estimate is returned, and model.source indicates which path ran. It also explains the deterministic+System One blend and the advisory-only contract. This is rich context an agent could not infer from readOnlyHint/openWorldHint alone.

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

Conciseness4/5

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

Front-loaded with the core purpose, then progressively adds the auth/offline condition, the advisory contract, and the host mapping. Dense but every sentence carries information; a touch long, but nothing is filler.

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

Completeness4/5

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

For a 6-parameter advisory tool with no output schema but a markdown-report option, the description covers the return signal (model.source), the fallback path, and the host mapping. An agent has enough to call it and interpret the result, though it never mentions the 'top' impact-file parameter.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds meaning by explaining what host does (maps the tier to that host's model id) and tying offline to the labelled-estimate fallback and model.source. It reinforces, though does not fully replace, the schema's parameter docs.

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

Purpose5/5

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

States a specific verb+resource: 'Recommend a model tier (cheap, mid or premium) for a coding request before any work starts.' It also separates itself from siblings by noting it is advisory and 'never feeds review_gate or review_verdict', so an agent can tell it apart from the review tools without opening any schema.

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

Usage Guidelines4/5

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

Gives clear context (use before any work starts, for routing a change request) and names the review_gate/review_verdict alternative it is not. It stops short of stating explicit when-not-to-use cases beyond the advisory disclaimer, but the routing intent is unambiguous.

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

repo_harnessRepository HarnessA
Read-only

Generate setup, validation, runtime, and context commands for an agent or CI harness.

NameRequiredDescriptionDefault
pathNoRepository path. Defaults to current working directory.
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON. Defaults to false.

TDQS

A3.7/5.0
Behavior4/5

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

The annotations declare readOnlyHint: true, so the description does not need to repeat that. It adds a behavioral detail: it can generate different types of commands (setup, validation, runtime, context) and can optionally return a markdown report (via includeMarkdown) or full JSON. This goes beyond what annotations provide, clarifying the output format options and the scope of generated content.

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

Conciseness4/5

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

The description is one sentence, concise and clear, with the verb first ('Generate') and the main part stated upfront. It efficiently conveys the purpose without unnecessary words. It could be slightly improved by mentioning the markdown option in the description for completeness, but it is already moderately concise and well-structured.

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

Completeness4/5

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

For a read-only tool with no required parameters and a 100% schema description coverage, the description covers the essential purpose and basic behavior. It does not mention return values, but since there's no output schema and the schema covers parameters, the description is sufficient for an agent to understand what the tool does. The lack of detail on how to use the output (e.g., how to interpret the generated commands) is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters adequately. The description does not add semantic detail beyond what the schema provides—e.g., it doesn't explain how 'path' might affect command generation or what 'includeMarkdown' changes in detail. Given the high coverage, a score of 3 is appropriate as a baseline.

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

Purpose4/5

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

The description states a specific verb ('Generate') and a set of resources ('setup, validation, runtime, and context commands'), which clearly identifies the tool's purpose. However, it does not explicitly differentiate it from sibling tools like 'context_pack' or 'workspace_report', which might also generate context-related outputs. The phrase 'for an agent or CI harness' adds useful context but does not distinguish between the tool and its siblings.

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

Usage Guidelines3/5

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

The description implies usage in the context of an agent or CI harness (when you need to generate commands), but it does not explicitly state when to use this tool versus alternatives like 'repo_inspect' or 'context_pack'. There is no mention of conditions or exclusions. The phrasing 'Generate ... commands' gives a hint that it's for command generation, but without explicit guidance, an agent might struggle to select the right tool among siblings.

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

repo_indexIndex RepositoriesA

Index local repositories: generate per-user external indexes and add them to the local catalog. Pass discover:true to find repository roots under the given paths first. Pass dryRun:true to discover and report without writing any indexes or catalog (read-only). Without dryRun this mutates the persistent local catalog, so it is not a pure read.

NameRequiredDescriptionDefault
pathNoSingle repository path.
depthNoMaximum discovery depth.
limitNoMaximum discovered repositories.
pathsNoRepository paths, or roots when discover is true.
dryRunNoDiscover and report repositories without writing indexes or mutating the catalog. Read-only. Defaults to false.
catalogNoOptional catalog JSON path.
discoverNoDiscover repositories under the provided paths before indexing.

TDQS

A4.3/5.0
Behavior5/5

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

The description adds real behavioral context beyond readOnlyHint=false: indexing writes to the persistent local catalog, dryRun is genuinely read-only, and without it the call mutates state. It explicitly warns 'it is not a pure read', so the mutation profile is clear.

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

Conciseness5/5

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

Three sentences, front-loaded with the core action, then the two mode flags, then the mutation warning. No filler; the read-only caveat is worth its space.

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

Completeness4/5

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

For a 7-parameter mutation tool with no output schema, the description covers the action, the two critical flags, and the side effects. It doesn't say what the indexing produces in terms of reported results, a minor gap.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description nevertheless explains the effect of two key flags (discover and dryRun) in terms of behavior, not just type. The remaining parameters (path, paths, depth, limit, catalog) are left to the schema.

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

Purpose4/5

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

The description gives a specific verb+resource ('Index local repositories') plus concrete outputs (per-user external indexes, local catalog), which clearly separates it from inspection/mapping siblings like repo_map and repo_inspect. It never names a sibling directly, 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.

Usage Guidelines4/5

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

It clearly states the conditions selecting each mode: discover:true to find roots first, dryRun:true to report without writing. What is missing is any guidance on when to prefer this over a sibling such as repo_inspect or repo_map.

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

repo_inspectInspect RepositoryA
Read-only

Inspect repository shape, languages, package managers, script names, entrypoints, and git metadata. Returns up to 200 representative file paths; pass includeScripts:true to get full script command bodies instead of just names.

NameRequiredDescriptionDefault
pathNoRepository path. Defaults to current working directory.
includeScriptsNoInclude full package.json script command bodies, not just their names. Defaults to false.

TDQS

A4/5.0
Behavior4/5

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

Annotations provide readOnlyHint:true, and the description adds valuable behavioral details: it returns up to 200 representative file paths and explains that includeScripts:true yields full script bodies instead of names. These specifics go beyond the annotation and help the agent predict output shape and parameter effects.

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

Conciseness5/5

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

The description is two sentences with zero redundancy. It front-loads the core purpose, then adds a key output limit and the conditional includeScripts behavior. Every sentence earns its place.

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

Completeness4/5

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

For a simple tool with two optional parameters and no output schema, the description provides the essential purpose, key output characteristics (up to 200 paths), and a notable behavioral switch. It lacks details on return structure (e.g., exact schema of metadata), but that is minor given the tool's simplicity.

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

Parameters3/5

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

Schema coverage is 100% with clear descriptions for both parameters. The description adds little beyond the schema—it mentions includeScripts behavior, but that is already captured in the schema. No additional parameter context is provided, so baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb 'Inspect' with a clear resource 'repository' and enumerates concrete aspects: shape, languages, package managers, script names, entrypoints, and git metadata. This distinguishes it from sibling tools like repo_map (mapping) and repo_search (searching) by specifying the inspection scope.

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

Usage Guidelines3/5

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

The description implies usage by naming the tool's function, but it does not explicitly state when to use it over alternatives like repo_map or repo_index. There is no mention of exclusions or alternative routing, leaving the agent to infer from the name and sibling context.

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

repo_mapMap RepositoryA
Read-only

Map a repository into a compact JSON code map, optionally narrowed by domain, file kind, or controller route. Pass domain to find files for a feature, kind to find files of a type (route, controller, service, apiClient, component, test), or route to match Nest controller routes by substring/regex.

NameRequiredDescriptionDefault
kindNoOptional file kind filter such as route, controller, service, apiClient, component, test.
pathNoRepository path. Defaults to current working directory.
limitNoMaximum files to include. Defaults to 100.
routeNoOptional route filter. Substring or regex matched against each controller's combined route (controllerBasePath + httpMethods paths) and file path.
domainNoOptional domain filter such as booking, payment, email, events.
includeFilesNoInclude matching files in the response. Defaults to false.

TDQS

A3.6/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes this is a safe read, so the description only needs to add context. It contributes the output being a compact JSON code map and clarifies route matching semantics, but says nothing about cost on a large repo, truncation behavior, or how includeFiles changes the payload.

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

Conciseness4/5

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

Two dense sentences with the core action front-loaded and the filter options following immediately. No filler, though the second sentence partially duplicates parameter text.

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

Completeness5/5

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

With six optional parameters, a 100% covered schema, and no output schema, the description supplies the one thing structured data cannot: what the tool returns ('compact JSON code map'). Filters, defaults, and the read-only nature are all covered.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all six parameters including the kind examples and the route substring/regex semantics. The description largely repeats that content ('route to match Nest controller routes by substring/regex') rather than adding meaning, so this lands at the baseline.

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

Purpose4/5

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

The description names a specific verb and resource ('Map a repository') plus the output shape ('compact JSON code map'), which is more than a restatement of the title. It does not explicitly distinguish itself from close siblings like repo_index or repo_inspect, so an agent must infer that this produces structure rather than raw search results.

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

Usage Guidelines3/5

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

The second sentence gives conditional guidance for each filter ('Pass domain to find files for a feature, kind to find files of a type, route to match Nest controller routes'), which is useful in-tool routing. However, there is no statement of when to choose repo_map over repo_search, repo_index, or repo_inspect, and 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.

review_contextReview ContextA

Produce PR review context from local git diff metadata, optionally enriched with GitHub PR comments. Use review_context when you want the raw diff/comment context for a change, not a verdict. Use review_verdict instead for the full impact + review + gate composite, or review_gate for the gate verdict alone.

NameRequiredDescriptionDefault
baseNoBase ref. Defaults to PR base, upstream, origin/main, or main.
headNoHead ref. Defaults to HEAD.
pathNoRepository path. Defaults to current working directory.
githubNoAsk gh to infer the current branch PR.
numberNoOptional GitHub PR number for gh enrichment.
commentNoCreate or update a sticky GitHub PR comment using gh. This writes to GitHub.
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON. Defaults to false.

TDQS

A4.2/5.0
Behavior3/5

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

Annotation readOnlyHint=false already signals possible mutationais, and the description does not contradict that. However, the description does not disclose that setting comment=true creates or updates a GitHub comment; that critical side effect is only visible in the schema's parameter description. The description adds scope context but misses the write path.

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

Conciseness5/5

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

Three tightly packed sentences with zero filler. The core purpose and scope come first, then explicit routing to alternatives. Every sentence earns its place.

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

Completeness4/5

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

The tool has seven parameters and no output schema, but the high-coverage schema plus this description cover the main invocation needs. It could add a note about GitHub auth/network requirements for the gh enrichment, but nothing essential is missing for basic tool selection and use.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already fully documented. The description adds the high-level concept of 'raw diff/comment context' but does not enrich individual parameter meanings beyond the schema, which matches the baseline for full schema coverage.

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

Purpose5/5

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

The description states 'Produce PR review context from local git diff metadata, optionally enriched with GitHub PR comments,' which names a specific verb, resource, and optional data source. It explicitly differentiates from siblings by saying this is raw diff/comment context, not a verdict, and names review_verdict and review_gate as the alternatives.

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

Usage Guidelines5/5

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

It gives direct when-to-use guidance: 'Use review_context when you want the raw diff/comment context for a change, not a verdict.' It also names the exact sibling tools for alternative scenarios, leaving little room for an agent to select the wrong tool.

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

review_gateReview GateA

Gate a change for merge and return a PASS / WARN / FAIL verdict. Omit pr to run the local, no-GitHub gate against a base ref (changed files, secret safety, risk-sensitive paths, release discipline, validation commands, dependency audit, policy profile). Set pr to gate an open GitHub PR via gh (PR state, review decision, CODEOWNERS approvals, unresolved conversations, branch protection, status checks). A check the mode cannot evaluate is SKIPPED and never changes the verdict. Use review_verdict instead when you want the full impact + review + gate composite, or review_context when you want diff/comment context with no verdict.

NameRequiredDescriptionDefault
prNoPR selector (number, URL, or branch). Set, runs the GitHub gate on that PR; omitted or blank, runs the local gate.
baseNoBase ref for the local gate. Defaults to origin/main, then HEAD. Ignored in PR mode.
headNoGate exactly base..head; uncommitted files play no part. Cannot be combined with staged. Ignored in GitHub PR mode.
pathNoRepository path. Defaults to current working directory.
intentNoDeclared intent from change_impact declare (record, JSON, or path): fails the gate when a changed file was never declared.
policyNoPolicy profile: standard, company, or high-risk. Omitted, the repository's .solumberc.json or user config decides, else standard.
stagedNoGate the Git index instead of the working tree. Ignored in GitHub PR mode.
receiptNoConvergence receipt: inputs hash, JSON object, or path. A head- or staged-bound receipt verifies only in that mode.
requestNoOptional change request for context evidence output.
governanceNoGovernance: team or solo. Omitted, the repository's .solumberc.json or user config decides, else team.
minConvergenceNoOptional minimum convergence score (0–100). Enables a failing gate when the task/diff score is below this floor.

TDQS

A4.1/5.0
Behavior3/5

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

The description adds genuine behavioral context the annotation does not: mode-dependent check sets, the 'SKIPPED never changes the verdict' rule, and the implicit `gh` CLI dependency in PR mode. However, annotations declare readOnlyHint=false while the description never discloses any side effects or writes (e.g. whether a convergence receipt is emitted), which is a real gap for a tool flagged as non-read-only.

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

Conciseness4/5

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

Front-loaded with the verb and verdict, then mode behavior, then alternatives — a logical order with no filler sentences. The long parenthetical enumerations of checks in each mode make it dense, but each item is substantive information an agent cannot get elsewhere.

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

Completeness4/5

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

For an 11-parameter, no-required-parameter tool with no output schema, the description covers verdict values, mode selection, check enumeration, and skip semantics — enough to call it correctly. It falls short only on side effects given readOnlyHint=false, which matters for a non-read-only tool.

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

Parameters3/5

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

Schema coverage is 100% with all 11 parameters documented, so the schema already carries parameter meaning, making 3 the baseline. The description reinforces the pr-versus-local mode switch and the base-ref scoping, but adds no syntax or format detail beyond what the schema states (e.g. no guidance on valid intent or receipt shapes).

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

Purpose5/5

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

The description opens with a concrete verb and outcome ('Gate a change for merge and return a PASS / WARN / FAIL verdict') and then differentiates two modes by name. It explicitly names the siblings review_verdict and review_context and states how they differ, so an agent can distinguish this tool from all 13 siblings without opening a schema.

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

Usage Guidelines5/5

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

It gives explicit when-to-use rules for both modes ('Omit pr' vs 'Set pr') and names two alternatives with the exact condition that selects each ('full impact + review + gate composite', 'diff/comment context with no verdict'). Nothing about routing 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.

review_verdictReview VerdictA
Read-only

Run the full review pipeline in one shot: change_impact plus review_context plus review_gate, returning a unified verdict with a derived confidence score. When the repository's .solumberc.json lists companions and a request is given, impactSummary.companions names the top few files each companion repository would own for that request. Use review_verdict when you want the complete picture of a change in a single call. Use review_context instead for diff metadata only (no verdict), or review_gate for the gate verdict alone.

NameRequiredDescriptionDefault
prNoPR selector (number, URL, or branch). Set, gates that GitHub PR, as review_gate does; omitted or blank, runs the local gate.
baseNoBase ref for local diff. Defaults to origin/main, then HEAD.
headNoReview exactly base..head: impact, gate and review context all read the head commit's changes, so uncommitted and untracked files play no part. Ignored in GitHub PR mode.
pathNoRepository path. Defaults to current working directory.
intentNoDeclared intent from change_impact declare (record, JSON, or path): fails the gate when a changed file was never declared.
policyNoPolicy profile: standard, company, or high-risk. Omitted, the repository's .solumberc.json or user config decides, else standard.
receiptNoConvergence receipt: inputs hash, JSON object, or path.
requestNoPlain-English change request for impact scoring.
impactTopNoNumber of impact files. Defaults to 8.
governanceNoGovernance: team or solo. Omitted, the repository's .solumberc.json or user config decides, else team.
minConvergenceNoOptional minimum convergence score (0–100) enforced by the merge gate.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description goes further by disclosing the composition (three sub-tools run in one shot), the derived confidence score, and the conditional behavior where impactSummary.companions is populated only when .solumberc.json lists companions and a request is supplied. It does not spell out cost/latency of running three pipelines at once or what the gate outcome looks like, so not 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.

Conciseness4/5

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

Front-loads the composition and return value, then conditions, then sibling routing — a sensible order. Slight redundancy between 'Run the full review pipeline in one shot' and 'Use review_verdict when you want the complete picture ... in a single call', which repeats the same point.

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

Completeness4/5

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

An 11-parameter, all-optional tool with no output schema needs coverage of the input space and the return shape; the description covers the unified verdict plus one notable return field, and the schema covers the rest. The procedural meaning of the receipt/intent/minConvergence trio is left to the schema, which is acceptable but leaves some ambiguity about ordering.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all 11 parameters including defaults and enum-ish values like policy and governance. The description adds meaning only for the `request` parameter, tying it to companion file ownership, which is a genuine but small increment. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource — running the full review pipeline as a composition of change_impact, review_context and review_gate — and names the return artifact (unified verdict with derived confidence score). Explicitly contrasts itself with review_context and review_gate, so an agent can pick the right tool without reading schemas.

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

Usage Guidelines5/5

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

Gives a positive selection rule ('when you want the complete picture of a change in a single call') and names two alternatives with their narrower scopes ('diff metadata only (no verdict)', 'gate verdict alone'). No inference required.

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

workspace_reportWorkspace ReportB
Read-only

Generate a product-level report across multiple related repositories.

NameRequiredDescriptionDefault
pathsYesRepository paths to inspect together.
includeMarkdownNoReturn a compact human-readable markdown report instead of the full JSON. Defaults to false.

TDQS

B3.3/5.0
Behavior2/5

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

The annotations already declare readOnlyHint=true, and the description adds no behavioral context beyond saying it 'generates' a report. It does not describe output format, aggregation behavior, scope limitations, or any side effects, so it relies entirely on the annotation for safety transparency.

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

Conciseness5/5

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

The description is a single, well-structured sentence with no filler. The core action, scope, and subject are front-loaded, making it easy to parse quickly.

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

Completeness3/5

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

The tool is simple and read-only, and the schema covers parameters well, but the description does not clarify what a 'product-level report' contains or how the repositories relate. Since there is no output schema, a little more detail about the report's scope or contents would make it fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters (paths, includeMarkdown) are adequately described in the schema. The description itself adds no parameter-level meaning, so the baseline of 3 applies.

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

Purpose4/5

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

The description uses a specific verb ('Generate') and resource ('product-level report') and adds the scoping phrase 'across multiple related repositories,' which distinguishes it from single-repo sibling tools like repo_inspect or repo_map. However, it does not explicitly name a sibling, so differentiation is slightly 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.

Usage Guidelines3/5

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

The phrase 'product-level report across multiple related repositories' clearly implies a multi-repo aggregation context, but the description never states when to prefer this tool over alternatives or when not to use it. With 12 sibling tools, explicit selection guidance would meaningfully improve the definition.

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

Tool Schema Changelog

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

  1. 5 tool updatesv4.10.0
    • Changedcontext_pack1 field changed
      • changedInput schema / properties / online / description
        Previous value: -"Ask a read model (TypeSafe's Jev, or Claude through forced tool use) to read the request (intent, and relevance of each candidate file) in one call, and apply answers that clear their confidence gate. Needs TYPESAFE_API_KEY or ANTHROPIC_API_KEY (SOLUMBE_READ_PROVIDER picks one when both are set); without either the pack is returned unchanged with modelRead.source offline. Defaults to false."New value: +"Ask a read model (TypeSafe's Jev or Claude) for the request's intent and each candidate file's relevance, applying confident answers. Needs TYPESAFE_API_KEY or ANTHROPIC_API_KEY; without either the pack is unchanged. Defaults to false."
    • Changedconvergence_score3 fields changed
      • changedInput schema / properties / head / description
        Previous value: -"Score exactly base..head (a direct tree diff, no merge base) instead of the working tree, and bind the receipt to the head commit and its tree SHA. Uncommitted and untracked files play no part. Cannot be combined with staged."New value: +"Score exactly base..head instead of the working tree; the receipt binds to the head commit. Cannot be combined with staged."
      • changedInput schema / properties / intent / description
        Previous value: -"Optional declared intent (from change_impact with declare: the record, its JSON, or a path to it). The diff is then scored against the files declared before the edit instead of a live prediction, and the receipt names the contract."New value: +"Declared intent from change_impact declare (record, JSON, or path): score against the declared files instead of a live prediction."
      • changedInput schema / properties / staged / description
        Previous value: -"Measure only the exact Git index tree and bind the receipt to its tree SHA. May create Git object or index-cache metadata; source files are unchanged."New value: +"Score only the Git index; the receipt binds to its tree."
    • Changedrepo_search3 fields changed
      • addedInput schema / properties / all
        Added value: +{
        +  "description": "Also search every repository in the local catalog.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / path
        Added value: +{
        +  "description": "Repository to search. Defaults to current working directory.",
        +  "type": "string"
        +}
      • addedInput schema / properties / paths
        Added value: +{
        +  "description": "Repositories to search instead of the catalog.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedreview_gate4 fields changed
      • changedInput schema / properties / head / description
        Previous value: -"Gate exactly base..head: changed-path, risk, secret, and convergence evidence come from the head commit's tree, so uncommitted and untracked files play no part. Release discipline reads version metadata from that same exact tree; validation-command and optional analyzer checks still inspect the working tree. Cannot be combined with staged. Ignored in GitHub PR mode."New value: +"Gate exactly base..head; uncommitted files play no part. Cannot be combined with staged. Ignored in GitHub PR mode."
      • changedInput schema / properties / intent / description
        Previous value: -"Optional declared intent (from change_impact with declare: the record, its JSON, or a path to it). Adds a Scope contract check that fails when a changed file was never declared, implied by a declared file, or named in an amendment."New value: +"Declared intent from change_impact declare (record, JSON, or path): fails the gate when a changed file was never declared."
      • changedInput schema / properties / receipt / description
        Previous value: -"Optional convergence inputs hash, JSON object, or path to a JSON receipt artifact. Exact-subject v2 receipts require the full hash; legacy v1 display IDs remain accepted. A receipt bound to a head commit or the staged index verifies only in the same mode (head / staged); a JSON receipt names the mode it needs when they differ."New value: +"Convergence receipt: inputs hash, JSON object, or path. A head- or staged-bound receipt verifies only in that mode."
      • changedInput schema / properties / staged / description
        Previous value: -"Use the exact Git index for changed-path, risk, secret, and convergence evidence. Release discipline reads version metadata from that same exact tree; validation-command and optional analyzer checks still inspect the working tree. May create Git object or index-cache metadata; source files are unchanged. Ignored in GitHub PR mode."New value: +"Gate the Git index instead of the working tree. Ignored in GitHub PR mode."
    • Changedreview_verdict2 fields changed
      • changedInput schema / properties / intent / description
        Previous value: -"Optional declared intent (from change_impact with declare: the record, its JSON, or a path to it). Adds a Scope contract check that fails when a changed file was never declared, implied by a declared file, or named in an amendment."New value: +"Declared intent from change_impact declare (record, JSON, or path): fails the gate when a changed file was never declared."
      • changedInput schema / properties / receipt / description
        Previous value: -"Optional convergence inputs hash, JSON object, or path to a JSON receipt artifact. Exact-subject v2 receipts require the full hash; legacy v1 display IDs remain accepted."New value: +"Convergence receipt: inputs hash, JSON object, or path."
  2. 5 tool updatesv4.7.2
    • Changedchange_impact3 fields changed
      • addedInput schema / properties / amend
        Added value: +{
        +  "description": "Add files to the declared intent passed as intent, with the reason they belong to the change. Returns the amended record under intent without ranking anything; nothing is written.",
        +  "properties": {
        +    "files": {
        +      "description": "Repository-relative paths to add.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "reason": {
        +      "description": "Why these files belong to the change.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "files",
        +    "reason"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / declare
        Added value: +{
        +  "description": "Also freeze the predicted owner and supporting files as a declared intent (a scope contract) and return it under intent. Call it before editing, then pass that record to review_gate as intent: a changed file that was never declared fails the gate. Nothing is written.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "With amend: the declared intent to add files to (the record, its JSON, or a path to it). Its request must be the query."
        +}
    • Changedcontext_pack1 field changed
      • changedInput schema / properties / online / description
        Previous value: -"Ask TypeSafe's Jev to read the request (intent, and relevance of each candidate file) in one call, and apply answers that clear their confidence gate. Needs TYPESAFE_API_KEY; without one the pack is returned unchanged with modelRead.source offline. Defaults to false."New value: +"Ask a read model (TypeSafe's Jev, or Claude through forced tool use) to read the request (intent, and relevance of each candidate file) in one call, and apply answers that clear their confidence gate. Needs TYPESAFE_API_KEY or ANTHROPIC_API_KEY (SOLUMBE_READ_PROVIDER picks one when both are set); without either the pack is returned unchanged with modelRead.source offline. Defaults to false."
    • Changedconvergence_score1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "Optional declared intent (from change_impact with declare: the record, its JSON, or a path to it). The diff is then scored against the files declared before the edit instead of a live prediction, and the receipt names the contract."
        +}
    • Changedreview_gate3 fields changed
      • changedInput schema / properties / head / description
        Previous value: -"Gate exactly base..head: changed-path, risk, secret, and convergence evidence come from the head commit's tree, so uncommitted and untracked files play no part. Release, validation-command, and optional analyzer checks still inspect the working tree. Cannot be combined with staged. Ignored in GitHub PR mode."New value: +"Gate exactly base..head: changed-path, risk, secret, and convergence evidence come from the head commit's tree, so uncommitted and untracked files play no part. Release discipline reads version metadata from that same exact tree; validation-command and optional analyzer checks still inspect the working tree. Cannot be combined with staged. Ignored in GitHub PR mode."
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "Optional declared intent (from change_impact with declare: the record, its JSON, or a path to it). Adds a Scope contract check that fails when a changed file was never declared, implied by a declared file, or named in an amendment."
        +}
      • changedInput schema / properties / staged / description
        Previous value: -"Use the exact Git index for changed-path, risk, secret, and convergence evidence. Release, validation-command, and optional analyzer checks still inspect the working tree. May create Git object or index-cache metadata; source files are unchanged. Ignored in GitHub PR mode."New value: +"Use the exact Git index for changed-path, risk, secret, and convergence evidence. Release discipline reads version metadata from that same exact tree; validation-command and optional analyzer checks still inspect the working tree. May create Git object or index-cache metadata; source files are unchanged. Ignored in GitHub PR mode."
    • Changedreview_verdict1 field changed
      • addedInput schema / properties / intent
        Added value: +{
        +  "description": "Optional declared intent (from change_impact with declare: the record, its JSON, or a path to it). Adds a Scope contract check that fails when a changed file was never declared, implied by a declared file, or named in an amendment."
        +}
  3. 2 tool updatesv4.2.0
    • Changedchange_impact1 field changed
      • addedInput schema / properties / includeUntracked
        Added value: +{
        +  "description": "With diffBase, also count untracked, non-ignored files as changed. Defaults to true; pass false to review only tracked changes.",
        +  "type": "boolean"
        +}
    • Changedreview_verdict1 field changed
      • addedInput schema / properties / head
        Added value: +{
        +  "description": "Review exactly base..head: impact, gate and review context all read the head commit's changes, so uncommitted and untracked files play no part. Ignored in GitHub PR mode.",
        +  "type": "string"
        +}
  4. 4 tool updatesv3.5.1
    • Changedcontext_pack1 field changed
      • changedInput schema / properties / paths / description
        Previous value: -"Repository paths for a multi-repo context packet. Omitted, `path` plus the `companions` listed in its .otitorc.json."New value: +"Repository paths for a multi-repo context packet. Omitted, `path` plus the `companions` listed in its .solumberc.json."
    • Changedmodel_route1 field changed
      • changedInput schema / properties / host / description
        Previous value: -"Optional host whose model map resolves the tier to a model id (built in: claude-code; add others in .otito/model-route.json)."New value: +"Optional host whose model map resolves the tier to a model id (built in: claude-code; add others in .solumbe/model-route.json)."
    • Changedreview_gate2 fields changed
      • changedInput schema / properties / governance / description
        Previous value: -"Governance: team or solo. Omitted, the repository's .otitorc.json or user config decides, else team."New value: +"Governance: team or solo. Omitted, the repository's .solumberc.json or user config decides, else team."
      • changedInput schema / properties / policy / description
        Previous value: -"Policy profile: standard, company, or high-risk. Omitted, the repository's .otitorc.json or user config decides, else standard."New value: +"Policy profile: standard, company, or high-risk. Omitted, the repository's .solumberc.json or user config decides, else standard."
    • Changedreview_verdict2 fields changed
      • changedInput schema / properties / governance / description
        Previous value: -"Governance: team or solo. Omitted, the repository's .otitorc.json or user config decides, else team."New value: +"Governance: team or solo. Omitted, the repository's .solumberc.json or user config decides, else team."
      • changedInput schema / properties / policy / description
        Previous value: -"Policy profile: standard, company, or high-risk. Omitted, the repository's .otitorc.json or user config decides, else standard."New value: +"Policy profile: standard, company, or high-risk. Omitted, the repository's .solumberc.json or user config decides, else standard."
  5. 1 tool updatev3.5.0
    • Changedcontext_pack1 field changed
      • changedInput schema / properties / paths / description
        Previous value: -"Repository paths for a multi-repo context packet."New value: +"Repository paths for a multi-repo context packet. Omitted, `path` plus the `companions` listed in its .otitorc.json."
  6. 2 tool updatesv3.2.0
    • Changedreview_gate3 fields changed
      • changedInput schema / properties / governance / description
        Previous value: -"Governance: team (default) or solo."New value: +"Governance: team or solo. Omitted, the repository's .otitorc.json or user config decides, else team."
      • changedInput schema / properties / policy / description
        Previous value: -"Policy profile: standard (default), company, or high-risk."New value: +"Policy profile: standard, company, or high-risk. Omitted, the repository's .otitorc.json or user config decides, else standard."
      • changedInput schema / properties / pr / description
        Previous value: -"Optional PR selector (number, URL, or branch). When set, runs the GitHub gate; when absent, runs the local gate."New value: +"PR selector (number, URL, or branch). Set, runs the GitHub gate on that PR; omitted or blank, runs the local gate."
    • Changedreview_verdict3 fields changed
      • changedInput schema / properties / governance / description
        Previous value: -"Governance: team (default) or solo."New value: +"Governance: team or solo. Omitted, the repository's .otitorc.json or user config decides, else team."
      • changedInput schema / properties / policy / description
        Previous value: -"Policy profile: standard (default), company, or high-risk."New value: +"Policy profile: standard, company, or high-risk. Omitted, the repository's .otitorc.json or user config decides, else standard."
      • changedInput schema / properties / pr / description
        Previous value: -"Optional PR selector. When set, pass-pr runs against GitHub instead of local mode."New value: +"PR selector (number, URL, or branch). Set, gates that GitHub PR, as review_gate does; omitted or blank, runs the local gate."
  7. 2 tool updatesv1.15.2
    • Changedconvergence_score2 fields changed
      • addedInput schema / properties / head
        Added value: +{
        +  "description": "Score exactly base..head (a direct tree diff, no merge base) instead of the working tree, and bind the receipt to the head commit and its tree SHA. Uncommitted and untracked files play no part. Cannot be combined with staged.",
        +  "type": "string"
        +}
      • addedInput schema / properties / includeUntracked
        Added value: +{
        +  "description": "Working-tree mode only: also score untracked, non-ignored files. Defaults to false; untracked files are otherwise listed under untracked and not scored.",
        +  "type": "boolean"
        +}
    • Changedreview_gate2 fields changed
      • addedInput schema / properties / head
        Added value: +{
        +  "description": "Gate exactly base..head: changed-path, risk, secret, and convergence evidence come from the head commit's tree, so uncommitted and untracked files play no part. Release, validation-command, and optional analyzer checks still inspect the working tree. Cannot be combined with staged. Ignored in GitHub PR mode.",
        +  "type": "string"
        +}
      • changedInput schema / properties / receipt / description
        Previous value: -"Optional convergence inputs hash, JSON object, or path to a JSON receipt artifact. Exact-subject v2 receipts require the full hash; legacy v1 display IDs remain accepted."New value: +"Optional convergence inputs hash, JSON object, or path to a JSON receipt artifact. Exact-subject v2 receipts require the full hash; legacy v1 display IDs remain accepted. A receipt bound to a head commit or the staged index verifies only in the same mode (head / staged); a JSON receipt names the mode it needs when they differ."
  8. 2 tool updatesv1.14.1
    • Changedcontext_pack1 field changed
      • addedInput schema / properties / online
        Added value: +{
        +  "description": "Ask TypeSafe's Jev to read the request (intent, and relevance of each candidate file) in one call, and apply answers that clear their confidence gate. Needs TYPESAFE_API_KEY; without one the pack is returned unchanged with modelRead.source offline. Defaults to false.",
        +  "type": "boolean"
        +}
    • Addedmodel_route

TDQS

A3.7/5.0

Scored across 14 tools

Disambiguation3/5

The descriptions do heavy lifting with explicit cross-references (review_verdict = change_impact + review_context + review_gate; use review_context for diff only, etc.), but real overlaps remain: change_impact and context_pack both rank files for a task, repo_map and repo_search both narrow by domain/kind/route, and repo_inspect versus repo_map both profile repository shape. An agent can usually sort it out from the text, but several boundaries require reading before choosing.

Naming Consistency4/5

Everything is snake_case and grouped with sensible prefixes (repo_*, review_*), which keeps it predictable. However the internal pattern mixes verb_noun (repo_inspect, review_gate) with noun_noun (convergence_score, agent_experience, workspace_report) and a noun_verb outlier (context_pack), so naming is not a clean single convention.

Tool Count4/5

14 tools sits comfortably in the well-scoped range and each tool maps to a recognizable step in the repo-analysis/review lifecycle. It is arguably one or two tools heavier than needed given the composite tools already bundle sub-capabilities, but nothing feels gratuitous.

Completeness4/5

The surface covers the full arc: index, inspect, map, search, context packing, impact, gating, verdict, convergence scoring, model routing, and multi-repo reporting, plus a harness generator. Missing pieces are minor for an analysis-focused server (no direct file-read or doc/comment-fetch tool), and these are workarounds rather than blockers.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Local-first code intelligence MCP server with hybrid BM25 + ONNX vector search, symbol-level impact analysis, diff-aware PR review with risk scoring, and persistent memory tied to git state.
    36
    337 npm
    82
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Local-first codebase context engine that parses code into a ranked dependency graph and serves it to AI tools via MCP for deep structural understanding.
    5
    6 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Local-first MCP server that indexes all projects on your machine and provides coding agents with briefings about each project's stack, services, and run instructions, so they can start sessions with context across all repos. No cloud, no accounts, no telemetry.
    9 npm
    MIT