Repository navigation
v4.6.0
A PreToolUse hook now holds a subagent to the tier the router chose, in the delegate arm of the routing trial, and the repository commits the Claude Code settings that register it. impact and context find git hook scripts, and solumbe install --host keeps a host entry's env and connects a Codex CLI without codex mcp add. No command or field was removed. The decision log gains promptId and evidenceSufficient, and the index cache moves to version 14, so existing indexes rebuild once.
Added
- A
PreToolUsehook holds a subagent to the routed tier.scripts/hooks/enforce-agent-model.mjsruns on the Agent tool (matcherAgent|Task). It reads the decisionroute-prompt.mjslogged for the session and prompt and, in the delegate arm ofSOLUMBE_ROUTE_MODE=delegate, rewrites a call whosemodelis missing or names another tier to the routed alias throughupdatedInput, keeping every other field. It rewrites rather than denies, so the call lands on the first try, and tells the parent throughadditionalContext.- The control arm and advisory mode are observed, never changed. Every Agent call that joins a decision leaves one line in
~/.solumbe/agent-model-decisions.jsonl(SOLUMBE_AGENT_MODEL_LOG), androute-outcomescounts them per arm beside its grade (--agent-log). - Nothing is enforced for a route with no evidence, inside a subagent, or without a decision. Every failure exits 0 and leaves the call as made.
- The decision log gains
promptIdandevidenceSufficient, which the Agent hook joins on and checks.
- The repository commits
.claude/settings.json, registering both hooks by$CLAUDE_PROJECT_DIR-relative path and nothing else. The rest of.claude/stays ignored. A hook registered both there and in~/.claude/settings.jsonclaims each prompt or tool call once, so a prompt is still routed and logged once.
Fixed
route-prompt.mjsno longer claims to bind the subagent. Its header and docs/18 said naming the subagent model was "real actuation". The hook only adds context; the parent session decides whether to passmodelto the Agent tool, and only the newPreToolUsehook enforces it. The advisory line now also names the Agent tool's alias (model: "sonnet") beside the host model id.- Three tests no longer fail on a loaded machine.
tests/canvas-tap.test.jslet the tap's 8 s send timeout abort the held send when the dispatch ran long (13.6 s), and two route-prompt hook tests ran past the hook's 6 s routing deadline. The canvas test now records the timeout signal and sends without it, and its server no longer answers a long-held request with Node's 300 s408, and the hook's deadline can be set withSOLUMBE_ROUTE_TIMEOUT_MS, which the hook tests raise. impactandcontextfind git hook scripts.- Hook scripts such as
.githooks/pre-commithave no file extension, so the indexer never admitted them, and.husky/was skipped as a whole. A request to "add a gate step to the pre-commit hook" rankedcomponents/ui/stepper/*andSubscriptionGate.tsxand left the hook out entirely. - Files named after a git hook (
pre-commit,commit-msg,pre-pushand the rest, with or without.sh) under.githooks/or.husky/are now indexed with the new kindgitHook. Husky's generated.husky/_/shims are still skipped, and their content is not parsed as JavaScript. impactboosts agitHookfile (×1.4) when the request names a hook (hook,husky,commit,push, …). When a hook is the strongest match,contextkeeps other files as primary only when they score within 80% of it.- The index cache moves to version 14, so existing indexes rebuild once.
- New eval fixture
git-hooksand casegit-hook-pre-commit-gate-step. Retrieval baseline is now p@5=0.838, r@5=1.0, mrr=0.986 (36/36).
- Hook scripts such as
solumbe install --host codexconnects a Codex CLI that has nocodex mcp add.- On codex-cli 0.31.0,
codex mcpruns Codex as an MCP server and takes no subcommand. The install ended "codex mcp add failed: error: unexpected argument 'add' found" and left the host unconnected. - The install now asks first, with
codex mcp add --help. Where that fails, it writes the[mcp_servers.solumbe]table in~/.codex/config.tomlitself. - An existing table is replaced where it stands, together with any
[mcp_servers.solumbe.*]sub-table, and a missing one is added at the end. Every other line of the file is left as it was, and the previous file is kept asconfig.toml.solumbe.bak. - A config that sets the server another way (
solumbe = { … }under[mcp_servers], dotted keys, or an inlinemcp_servers) is left unchanged and reported, because a second definition would stop Codex reading the file. --dry-runnames the path:would run: codex mcp add solumbe …, orwould add the [mcp_servers.solumbe] table directly: this Codex CLI has no codex mcp add.- A Codex CLI that has
codex mcp addis connected through it as before, after the one--helpcall. - The fallback writes to
~/.codex/config.tomland does not readCODEX_HOME.
- On codex-cli 0.31.0,
solumbe install --hostkeeps the env of an entry it re-registers.- Re-running the install replaced a host's
solumbeentry with a new command and args and no env. On Claude Code that droppedSOLUMBE_CHECK_MODE, so the check trial stopped applying to new sessions, andSOLUMBE_CANVAS_URL, so tool calls stopped reaching the Canvas. Nothing reported it. - The existing entry's env is now read first and carried onto the new entry unchanged. It is read from the config file for Claude Desktop, Cursor, VS Code, Gemini CLI and Kimi Code CLI, from
~/.claude.jsonfor Claude Code (orclaude mcp get solumbewhen that file is missing or cannot be parsed), and fromcodex mcp list --jsonfor Codex CLI, or from the[mcp_servers.solumbe]table (an inlineenv,env.KEYkeys or anenvsub-table) where the install writes~/.codex/config.tomldirectly. A variable the run sets itself, such as the two--canvasadds, wins. A fresh install still writes no env. - The summary and
--dry-runname the variables kept (keeps env SOLUMBE_CANVAS_URL, SOLUMBE_HOST) and never print a value, because an env block can hold a key.--jsoncarries the names askeptEnvon each host result. A command a dry run shows has<hidden>in place of each value, and the message for a host CLI that is not on thePATHsays to run the install again instead of printing a command to run by hand. - When an env cannot be read (a Codex listing that does not parse, a
config.tomlenv that is not one-line strings, a Claude Code entry thatclaude mcp getshows at another scope, anenvthat is not an object), that host gets a line under Check saying it was not carried over. When the add fails after the old entry was removed, the line names the variables that entry carried.
- Re-running the install replaced a host's