Solumbe¶
Independent trust infrastructure for agents and reviewers¶
For teams that want any coding agent to produce evidence a human can trust before merge.
v4.11.0 is published to npm, GitHub Releases, and the official MCP Registry. Solumbe is a Bashbop Ltd product, MIT licensed.
Formerly Òtítọ́ (@bashbop/otito), renamed in 4.0.0.
About Solumbe
Solumbe is a local-first trust harness for coding agents. It maps repository context before a change, then produces deterministic impact, validation, ownership, and review evidence before merge. It complements model-native agent loops instead of replacing them.
Its command-line and package identity is solumbe.
See the How It Works visual walkthrough: the loop from context before the edit, to a verdict before the merge, to an attestation after it, with every shipped MCP tool in its place.
What's New¶
v4.11.0 published (2026-11-09)
The Claude request read writes its reasoning before its answers. No command or field was removed.
- The read's tool schema opens with a
reasoningstring, written beforeintentand never applied. On the 29-casereadssuite withclaude-haiku-5-5, capability accuracy rose from 23–24 to 27 of 29 and more irrelevant candidates were demoted, with no expected file demoted, for about a third more cost per read. Intent accuracy did not move. solumbe eval --reads --provider claude --no-reasoningruns the answers-only read for comparison;SOLUMBE_CLAUDE_READ_REASONING=0turns reasoning off forcontext --online. Jev reads are unchanged.- Dev-dependency bumps:
@types/node26.6.6,eslint10.14.0.
v4.10.0 published (2026-10-31)
Search and ranking fixes, and shorter tool definitions. No command or field was removed.
repo_searchsearches the repository atpath(the working directory by default) instead of only the catalog, so a repository that was never indexed is no longer invisible to it.all: trueadds every catalogued repository; each result names itsscope.- A symbol matches strongly only when two request words are in its own name, so look-alike helpers no longer outrank the file a request is about. Context engine version 7.
- The MCP
tools/listresponse is about 700 tokens (13%) shorter. A declared intent is never written through a symlink or outside the repository.
v4.9.0 published (2026-10-28)
A change shows what depends on it. Ranking is unchanged, and no command or field was removed.
- With a diff (
solumbe impact --diff-base, ordiffBaseover MCP),change_impactcarries adependentsblock: the files that import a changed file, directly or through other files, up to three hops and 20 files, each with its depth and the file it reaches the change through. - Each dependent is
EXTRACTEDwhen every import on its path is stated in the source (a relative or root-alias specifier, or a Go package import) andINFERREDwhen one rests on a bare specifier matching exactly one file and no declared package. Docs and vendored files are left out.
v4.8.0 published (2026-10-23)
Dependency work is read as dependency work. No command or field was removed.
- An upgrade, audit or advisory request (
upgrade vulnerable yarn dependencies (shell-quote, handlebars …)) owns the lockfile and the manifest that declares a named package, inchange_impact,context_packandconvergence_score. A lockfile-only fix now converges instead of reading inconclusive. - Package names are read whole:
shell-quoteno longer matchesquote-templates.controller.ts, and "package" or "upgrade" no longer rank pricing components. .nvmrc,.node-versionand.tool-versionsare configuration and gate a merge. An eval case can be markedknownGapto record a miss before its fix.solumbe eval --history [repo]replays a repository's recent commits as retrieval cases (the subject is the request, the changed files the answer) and reports hit@k, recall@k and MRR on real work. On bashbop-api, dependency-request ranking moves hit@5 from 0.37 to 0.41.
v4.7.2 published (2026-10-19)
Two gate fixes found by dogfooding solumbe on another repository. No command or field was removed.
- Working-tree mode (
converge,convergence_score,change_impact --diff-base, the local gate) diffs from the merge base, so commits that land on the base after the branch point no longer count as part of the change. - The secret check scans only the lines a change adds, so a credential already on the base no longer fails a change that never touched it.
v4.7.1 published (2026-10-18)
Two fixes found by dogfooding solumbe in Claude Code. No command or field was removed.
- A tool that takes a repository path, called without one, no longer hangs a server that runs from
/or the home directory (Claude Desktop starts its MCP servers from/). It answers at once with-32602and says to passpath. - A question about the code (where is, how does, why does, which file, is A consistent with B?) reads as
explaininstead ofunknown; the heuristic's intent accuracy on thereadssuite goes from 0.517 to 0.793.
v4.7.0 published (2026-10-18)
The request read can be answered by Claude, and the repository shows solumbe guarding a Claude agent. No command or field was removed.
context --onlinecan read a request through Claude: one forced tool call whose schema is the answer, one retry on a validation failure, and the sameinterpretReadbackstop as Jev.SOLUMBE_READ_PROVIDERpicks the provider, andsolumbe eval --readsgrades either on a new 24-case suite..claude/settings.jsongains project permission rules, and pull requests get a headlessclaude -pgate summary that skips withoutANTHROPIC_API_KEY.integrations/agent-sdk/is a Claude Agent SDK example that plans withcontext_pack, delegates to subagents and must passreview_gatebefore it proposes a merge.
v4.6.0 published (2026-10-18)
A subagent can be held to the tier the router chose, and hook scripts are found like any other file. No command or field was removed.
scripts/hooks/enforce-agent-model.mjsis a Claude CodePreToolUsehook on the Agent tool. In the delegate arm of the routing trial it rewrites a call whosemodelis missing or names another tier to the routed one; the control arm is only observed, androute-outcomescounts both. The prompt hook's header and the model-routing docs no longer claim the injected text binds the subagent on its own.- The repository commits
.claude/settings.json, registering both hooks by$CLAUDE_PROJECT_DIRpath and nothing else. A hook registered there and in~/.claude/settings.jsonstill routes and logs a prompt once. impactandcontextindex git hook scripts under.githooks/and.husky/and rank them for hook requests; the index cache rebuilds once.solumbe install --hostkeeps the env of an entry it re-registers, and connects a Codex CLI that has nocodex mcp addby writing its config table directly.
v4.5.0 published (2026-10-11)
A request can declare what it will touch before the edit, and the gate can delegate to the scanners you already run. No command or field was removed.
solumbe declare <repo> "<request>"records the files Solumbe predicts for a request, andsolumbe amend <file...> --reason "<why>"adds to them. With--intent, the gate adds aScope contractcheck that fails a changed file that was never declared. It is opt-in, and over MCP it uses the existing tools.- The gate delegates to gitleaks, Semgrep and osv-scanner when they are installed, each as its own check. Nothing is installed or fetched,
SOLUMBE_SCANNERSselects them, and a repository with none set up sees no change. - A request that predicts no owner file is
inconclusive, with no convergence score, and the gate's convergence floor warns on it instead of failing. A request its words do not ground is grounded in the import graph. The convergence engine moves to0.6.0. - The attestation record is version 2: it binds the verdict to the stated request, the scope contract, the exact subject and the convergence receipt, and has a published schema.
solumbe attest --sign-keysigns it with an Ed25519 key and--statusposts it as a commit status. Older and unsigned ledgers verify as before. - A Go import reaches the files of the package it names, so Go repositories get import edges in a context pack; the index cache rebuilds once.
Secret safetystops flagging a placeholder in a source-file comment.solumbe helpnow lists the core commands, andsolumbe help --alllists every command.
v4.4.0 published (2026-10-10)
A check the gate cannot run reports SKIPPED instead of WARN, so a clean change can return PASS, and solumbe calibrate grades the gate's verdict against what happened next. No command or field was removed.
- Local
Review state, CI-onlyCompliance controls, and a review decision, CODEOWNERS file or branch protection that GitHub did not return reportSKIPPEDand never move the verdict. Thecompanyandhigh-riskprofiles still require them. The verdictschemaVersionis now 3 for the new check status. Release disciplinefires only when aversionfield changes, read from the exact commit, staged tree or PR head, andSecret safetystops flagging templates and test placeholders. Known secret formats still fail everywhere.solumbe calibrate <repo> --gatereplays the real gate and convergence score over history and reports the repair rate for PASS, WARN and FAIL, per check and per convergence band. On this repository PASS changes were repaired 16.0% of the time and WARN 36.7%, with overlapping intervals.solumbe calibrate <repo> --follow-throughreads the local usage log for how often a warning had cleared on the next run, andSOLUMBE_CHECK_MODE=trialwithholds the MCPconvergence_scoreand localreview_gateresults from a control arm socalibrate --trialcan grade whether showing them reduces repairs. A blocking FAIL is always shown.
v4.3.0 published (2026-10-10)
The MCP server tells every host which tool to call at each stage of a task, and convergence stops calling a change's own tests, changelog, fixtures and docs drift. No command, field or schema was removed.
initializereturnsinstructionswith the agent workflow:context_packfirst, arepo_searchretry when the pack is weak,change_impactbefore editing,convergence_scorebefore each commit andreview_gatebefore a pull request.convergence_scoreplaces a file by the lines the change adds to it: a test or source file that imports a confirmed file, a doc that names one, and the change's changelog entry and fixture data are in scope. The engine moves to0.4.0.- A request that names a tool reaches the module that implements it, through the registry's
{ name: "…" }entries andcase "…":dispatch. The index cache moves to version 12 and rebuilds once. - Fixture directories no longer trip the gate's risk paths, a repository deleted from disk is reported as
staleinstead of failing every search, and a failing accuracy eval says FAIL instead of crashing.
v4.2.1 published (2026-10-06)
Context packs rank by distinct request words, and a failing gate says what failed. No command or schema was removed.
- A word the request repeats counts once, a plural and its singular are one word, and the parts of a camelCase name count only together, so one repeated or generic word no longer pushes the right file out of the pack.
gate --run-validationnames the failing tests and shows up to 12 lines from the first failure beside the output digests. The excerpt is cleaned, credential-shaped lines are withheld, and the evidence and receipt still carry digests only.gate --outand the pre-commit hook fromsolumbe initprint the verdict and the blocking check, instead of only the report path.
v4.2.0 published (2026-10-04)
Reviews look into a repository's companions and read what a migration does to existing data. No command, field or schema was removed.
review_verdictandchange_impactname the top files in each companion repository listed in.solumberc.json, so a web change whose rule the API also decides points at the API file. The verdictschemaVersionis now 2 for that one added field.- A new
Migration safetygate check warns when a changed SQL migration rewrites, deletes, truncates or drops existing data. Prisma schemas and SQL migrations are now mapped. review_verdict --headreviews exactly base..head, changed files rank by score, and.env.exampleno longer fails the secret check on its name.- Go modules get validation commands, entrypoints and test guardrails, a multi-repo context pack keeps the small repo, and a checkout behind its upstream says so.
v4.1.0 published (2026-10-01)
One command connects Solumbe to your agents. No command, field or schema was removed.
solumbe install --host alladds thesolumbeMCP server to Claude Code, Claude Desktop, Codex CLI, Cursor, VS Code, Gemini CLI and Kimi Code CLI, wherever it finds them;--host claude-code,cursornames hosts instead, and--dry-runshows the plan. It checks that the server answers before writing anything, keeps a.solumbe.bakof each config it changes, and lists leftover entries from the 4.0.0 rename for you to remove. docs/02 has the detail.- Host configs pin the absolute
nodeand CLI path, so Claude Desktop, Cursor and VS Code start the server under nvm, Volta or Homebrew, where a baresolumbecommand could not be found. - The MCP setup guide has its Claude Code section, and post-merge attestation stays on
main's first-parent line.
v4.0.0 published (2026-09-30)
Òtítọ́ is now Solumbe. Behaviour is unchanged from 3.5.0; every name moves, with no fallback to the old ones.
- Install
@bashbop/solumbeand runsolumbe; the MCP server isio.github.BASHBOP/solumbe, so point host configs at the new package and name the serversolumbe(tools becomemcp__solumbe__*). - Rename
.otitorc.jsonto.solumberc.jsonandotito.gate.jsontosolumbe.gate.json, move.otito/and~/.otito/to.solumbe/and~/.solumbe/, and renameOTITO_*variables toSOLUMBE_*. - The CHANGELOG has the full rename map. Releases before 4.0.0 stay on npm as
@bashbop/otito.
v3.5.0 published (2026-09-30)
Model routing can make a share of requests follow the tier it picks, not only recommend it. No command, field or schema was removed.
SOLUMBE_ROUTE_MODE=delegateturns on enforce mode: a share of requests (SOLUMBE_ROUTE_DELEGATE_SHARE, default 0.5) is told to do its tool work in a subagent on the routed tier, and the rest are a control.solumbe routeshows the arm and the subagent model, androute-outcomes.mjs --armgrades each arm separately.- On Claude Code, the premium tier names
claude-opus-5-5, the model that actually runs.
v3.4.0 published (2026-09-29)
One context pack can span a web app and its API, and the router says when it has nothing to go on. No command, field or schema was removed.
context_packandsolumbe contextreadcompanionsfrom a repository's.solumberc.json("companions": ["../api"]), so a web bug whose cause is in the API gets one pack covering both. Explicitpathsstill win; a companion that is not checked out is skipped.change_impactraises risk only from required and supporting files, plus any changed file, not from a domain that only an advisory lead touches.solumbe routeshows each Score question's own confidence next to its score, display only, and says no recommendation when solumbe matched no files, while still naming the fail-safe tier. docs/18 has the detail.context_packreads "bug", "broken" or "crash" as debugging, and ranks the repository a multi-repo request names first;change_impactkeeps a UI page as a required owner without API wording.version:checkfails when the site banner or What's New lags the released version.
v3.3.0 published (2026-09-27)
The terminal output gets colour and shape it didn't have before. No command, field or schema was removed.
- The default terminal look is plain Unicode (
✓ ! ✗, box drawing, arrows) with no emoji; CI,NO_EMOJI,--no-emojiandTERM=dumbkeep ASCII, and--emojiopts back in. Tables, trees and lists come from shared primitives, and every command that prints for a person ends with one closing line such asVerified.orRuns without errors. solumbe installasks a person at a terminal how to install, while--yes,--json, CI and agents get the same output as before.context_packandchange_impactstop ranking translation catalogs, file extensions and test notes ahead of the code a request names; a path or symbol named in the request is pinned as a required owner.- A version bump that reaches
mainis tagged and released by the newTag releaseworkflow, without a hand-pushed tag.
v3.2.0 published (2026-09-26)
The gates gate what they are given. No command, field or schema was removed.
solumbe gateandsolumbe reviewtake the repository from the positional or--path, in local and PR mode alike, and every gate, CLI or MCP, reads policy and governance from the.solumberc.jsonof the repository it gates, not the directory it runs in.- The GitHub PR gate reads whether a PR is open, merged or closed and reports it as
pr.stateandpr.mergedAt, so a merged PR is no longer gated as if it were still open. - A
--pror selector that names no PR is refused rather than gating the wrong thing. Over MCP a blankprreads as no PR, andpr_merge_readinesswith no selector gates the checked-out branch's PR again. - Repair hints name the
@nugehspackages that exist, andsolumbe helpno longer says the legacy MCP tool names stop working at 3.0; docs/02 maps each one to its canonical tool.
v3.1.0 published (2026-09-26)
The router gets graded, and the answer so far is that nothing can grade it yet. Nothing was removed or renamed.
solumbe regretreplays a repository's history and grades the tier each half of the router would have given against the samerepairedoutcomesolumbe calibrateuses;--rescoregrades a new arithmetic on frozen model answers, with no checkout and no model call.- On three repositories no variant orders outcomes, and offline audits of the join and of a same-session outcome say why, so
solumbe routestays advisory. docs/18 has the tables. - The route-prompt hook now keeps every decision it makes (
~/.solumbe/route-decisions.jsonl, never the prompt text), so the router can be graded once enough real requests exist. solumbe attestandsolumbe attest --verifymove post-merge attestation into the CLI, with versioned records and a reusable workflow.
v3.0.0 published (2026-09-25)
The first major since the Solumbe cutover. It follows 1.15.0 directly; the v2.x tags belong to earlier solumbe releases, from before the cutover.
- Breaking: solumbe stops interpreting the request and leaves that to the model.
intent.hints,patternsandagentPromptleave the context pack,implementationPlanleaves impact, andreviewPromptsandnextStepsleave PR review. The ranked files, hotspots, risk flags and review targets they were derived from are unchanged. See Migrating from 1.x. solumbe converge --head <ref>andsolumbe gate --head <ref>score exactlybase..head, so a dirty checkout no longer counts as scope drift. A confirmed owner's own siblings and tests are in scope, not drift; on a 25-file commit that moved convergence from 55 to 84.- Working-tree convergence no longer scores untracked files by default (
--include-untrackedrestores it). - Fixed: post-merge attestation attested the wrong commit, the context pack reported a working tree that no longer existed, and a manual run can now reset an orphaned audit ledger.
v1.15.0 published (2026-09-23)
model_routeis now an MCP tool, so every MCP host (Cursor, VS Code, Claude Desktop, Codex, Gemini) can ask for a tier, not only the CLI.- A request read rides the same System One call: what kind of work it is, which solumbe tool answers it, and which ranked files it needs. It is reported, never scored; the tier is identical with and without it.
solumbe context --online/context_pack { online: true }applies that read to a context pack: it relabels a confident intent and demotes files the model judges irrelevant. Off unless asked.- Any MCP host can appear on a local Realtime Canvas via
SOLUMBE_CANVAS_URLandSOLUMBE_HOST, sending the request text only.
v1.14.0 published (2026-09-20)
- A
UserPromptSubmithook routes every request before any work starts, not only the ones a skill remembers to route. It advises the session and binds the model on delegated subagents; it cannot switch the session's own model, and says so. - Markdown is now indexed, so skills and docs pages can be found. A request naming a skill used to rank unrelated library files; it now ranks the skill first.
- Fixed: a stale stored index kept serving after the indexer changed, including on offline workspace search. Indexes now carry a capability signature and are rebuilt when it moves.
- Fixed: a doc about an auth-like area escalated a typo fix to premium; the router escalated two thirds of requests because it bumped on a model's self-reported confidence (now 0% escalation over nine requests); post-merge attestation died on
exit 128and reported green when it had done nothing.
v1.13.1 published (2026-09-20)
- The documentation pack is rewritten for a reader rather than its author: seven overlapping pages become one deterministic verification page, and navigation is grouped by what you are trying to do.
- The model router skill can offer a realtime canvas, at most once per session.
v1.13.0 published (2026-09-20)
solumbe route <repo> "<request>"scores a coding task before tokens are spent on it and recommends a cheap, mid, or premium tier. solumbe answers the repository half deterministically; a System One model answers the request half with calibrated probabilities. It ships advisory, because the weights have never been graded against an outcome.- The router is not the gate and cannot become one. It runs before work starts; the gate runs after the diff exists. An unreachable or unkeyed model costs a tier, never a verdict.
- Fixed: zero matched files read as a contained change, so the request a repository understood least was routed to the cheapest model. Absence now fails safe to the ceiling.
- Nineteen report commands moved onto the shared document renderer, so every command reads like
reviewandimpact.
v1.12.0 published (2026-09-19)
- Model routing arrived as a prototype alongside the routing doc, dogfooded on a production application where the first pass routed every request to premium and surfaced two defects worth recording.
- A question whose answer never moves carries no information however well calibrated it is: asked as a yes/no, "is this request ambiguous?" returned 0.57 to 0.81 for every request including a typo fix.
v1.11.0 published (2026-09-19)
solumbe calibrate <repo>grades the risk flags against the repository's own history, joining fix commits to the commits they repair by line overlap rather than by filename. Pointed at a small corpus it declines to answer most rows, which is the honest result.configurationwas two signals under one name: manifest-only commits were repaired at 0.42x the base rate, real config files at 2.03x. Merged, they cancelled out and inverted the risk bands, leavingmediumchanges less likely to be repaired thanlowat every window.- A zero-weight flag could gate a merge on its own; gating now requires a flag that scores.
See CHANGELOG.md for the full history.
Documentation¶
Getting started¶
| Document | What it covers |
|---|---|
| Local Core, Optional Hosted | The three core commands, what the optional hosted pieces send and where, and the rules that do not change with a paid plan |
| Context Foundation | Repository inspection, maps, search, context packs, and harnesses |
| MCP and Agents | MCP tools and agent-facing workflows |
| Publishing to npm and the MCP Registry | How Solumbe itself is released |
| Codespaces and Tutorials | Setup and MCP onboarding alongside a tutorials repository |
| Herdr Integration | Context and merge evidence inside persistent agent workspaces |
Using it¶
| Document | What it covers |
|---|---|
| Trust-Layer Demo | Solumbe as a repeatable review workflow |
| Contributor Governance | Protected review, CODEOWNERS, required checks, and merge authority |
| Release Readiness | SemVer, changelog discipline, CI, and release gates |
| Usage Dashboard | Local usage logging and performance trends |
| Builder-Founder Loop | Session rhythm, evidence ledger, and governance ladder |
How it works¶
| Document | What it covers |
|---|---|
| Deterministic Verification | Why merge evidence is computed from the repository, never from the model that wrote the change |
| AX Score Spec | How agent experience is scored |
| Convergence Score Spec | How intent is measured against the diff that appeared |
Measurement¶
| Document | What it covers |
|---|---|
| Calibration | Grading risk flags against a repository's own history |
| Model Routing | Spending a calibrated model on the request side without touching the gate |
Reference¶
| Document | What it covers |
|---|---|
| Evaluation Guide | The accuracy, harness, and gate-effectiveness evals |
| Glossary | Terms used across these pages |
Context Flow¶
Quick Start¶
Prove the deterministic merge gate against the committed valid and adversarial corpus: