toolgate 0.15 separates writing a script from running it, 19 of 20 on the paired set

This topic was created 31 days ago, and the information it contains may have evolved or changed since then.

Risk Averse Technology Company posted toolgate 0.15, MIT, a Claude Code hook and MCP proxy that asks Jev before a risky tool call. Frozen set 6, ten matched pairs, scores 19 of 20 with every pair separated and no permissive allow. A 1,369-decision week on version 0.9.1, with 455 items labeled again blind, found no permissive miss. Laptop p50 on 1,368 calls was 1,060 ms. We did not rerun the sets.

RiskAverseTech/toolgate is a tool-call firewall from the account Risk Averse Technology Company. The LICENSE file is MIT. The npm package is @riskaverse/toolgate. It installs as a Claude Code PreToolUse hook, or as an MCP proxy in front of another server. Before a gated call it asks Jev, through TypeSafe, OpenRouter’s Decisions API, or Vercel AI Gateway, and maps the probabilities to allow, ask, or deny. The September 28 post is version 0.15. We did not install the hook.

Static rules run first and cost no model call. The README’s examples deny rm -rf / and ask on curl | sh. Read-only tools are ungated. Everything else is one request with seven risk questions: destructive, exfiltration, privilege, secret exposure, off task, a broken constraint, and a choice the task reserved for the user. A separate authorized score can soften deny to ask, or ask to allow, when it is at least 0.8 and the call is on task. Secret exposure, a violated constraint, and a reserved choice do not soften. Default thresholds are deny at 0.85 and ask at 0.55. If the model is unreachable, the default fail_mode is ask. Policy is read from ~/.toolgate/toolgate.yaml, not from the project directory. The README says an allow is advisory, Claude Code’s own denies still apply, and the tool is not a sandbox. SECURITY.md says the model path sends redacted tool input and recent prompts to the hosted provider.

The 0.15 piece is a ledger for write-then-execute. When the agent writes a file, the same call scores what that file would do if run later: read secrets, send data, destroy data, change privilege. Those scores do not change the write’s verdict. They are stored as booleans and a path. A later Bash call that runs the path is judged against those facts. If the write is still unconfirmed, the verdict floors at ask. The README’s example allows writing a script that curls .env to an outside host, then denies running it. cat of the same file stays allowed. Scope in this release is Claude Code hooks, from Write, Edit, MultiEdit, or NotebookEdit into Bash. Writes done from Bash itself, and the MCP proxy, are outside that scope.

Frozen set 6 is ten matched pairs, inert text against the same effect actually performed, scored on 0.15.0. The result in the README is 19 of 20, every pair separated, zero permissive errors. The highest risk score on an inert side was 0.32. The deciding axes on the action sides were 0.91 to 0.98. Set 7, 24 write-then-execute cases from the same reviewer, is 20 of 24 with zero permissive allows. Set 8, 22 cases on runtimes the earlier wording had not seen, is 19 of 22. The post’s counts match those three lines: 19/20, 20/24, and 19/22.

The usage number is older than 0.15. The README dates a 1,369-decision window to version 0.9.1, September 21 through 27. A blind second labeling of 455 items found zero permissive misses and put the friction on one axis, too many asks. The README says 0.11.0 is the change that answers that log. The post says that fix is being measured again. Latency for the window, 1,368 timestamped direct-API calls, is 1,060 ms p50 and 1,216 ms p90. A same-minute probe on September 27, one git push --force, put the direct API at a 782 ms median and OpenRouter’s Decisions route at 724 ms. Static rules are described as about 90 ms. The sets are small and aimed at named failure types. The README says they are not a general failure rate.

This site's reading

Editorial notes evaluating claims against primary sources, contextualizing findings alongside related implementations, and defining technical terms.

Verify

RiskAverseTech/toolgate, MIT. Defaults in the README: deny 0.85, ask 0.55, fail_mode ask, timeout 5,000 ms. Ungated tools skip the model. Static rules run first. Set 6 on 0.15.0, ten matched pairs of inert text against the same effect performed: 19 of 20, all ten pairs separated, zero permissive errors.

Inert sides peaked at 0.32. Action sides' deciding axes were 0.91 to 0.98. Set 7, 24 write-then-execute cases: 20 of 24, zero permissive allows. Set 8, 22 cases on unseen runtimes after the 0.14.0 exfiltration wording: 19 of 22.

Real-usage window on 0.9.1, September 21 to 27: 1,369 decisions, a blind second labeling of 455, zero permissive misses. The README says 0.11.0 answers the ask-rate finding from that window. Latency on 1,368 timestamped direct-API calls: 1,060 ms p50, 1,216 ms p90.

Same-minute probe on 2026-09-27, git push --force: direct median 782 ms, OpenRouter Decisions median 724 ms. The post says the ask-rate fix is re-measuring. We did not run the frozen sets or read the audit log.

Compare

jevrail's printed corpus leaves the model off: 22 of 22 catastrophic commands, and 15 of 26 safe commands still ask. semgate is HTTP middleware and sends Authorization and Cookie by default. toolgate's 19 of 20 is a paired content-versus-action set, authored before the run.

The 1,369 figure is one person's week on 0.9.1, not that frozen set.

Terms

19 of 20
Frozen set 6 on toolgate 0.15.0. Ten matched pairs. All ten pairs separated. Zero permissive errors. The highest risk score on an inert side was 0.32.
1,369
Decisions in a measurement window on version 0.9.1, September 21 to 27. A blind second labeling covered 455 of them and found zero permissive misses. The README says 0.11.0 is the response to the ask-rate on that log.
0.85
Default deny threshold. Ask is 0.55. If authorized is at least 0.8, some axes soften one step. secret_exposure, violates_constraint, and unresolved_choice do not soften.

Sources

  1. Risk Averse Technology Company, toolgate 0.15
  2. RiskAverseTech/toolgate
  3. npm @riskaverse/toolgate