I Shipped an Agent Gatekeeper (v0.1). 14 Developers Showed Me What I Missed. Here's v0.2 — a Control Plane. Developer Deghosal shipped v0.2.0 of agent-tooltrust, an open-source control plane for AI agents, three days after field-testing v0.1.0 with 83 real agents and incorporating feedback from 14 developers. The update adds argument-level policy, resource/environment scoping, conditional allows with obligations, three-tier deny-reason exposure, and premise/staleness validation, transforming the tool from a gatekeeper into a control plane. Previously: I Stopped Trusting AI Agents With Tools. So I Built a Gatekeeper. — the v0.1.0 launch story Aug 13 . Code: github.com/deghosal-2026/agent-tooltrust · pip install agent-tooltrust v0.2.0 Release: v0.2.0 on GitHub · PyPI Three days ago I shipped a gatekeeper for AI agents. The idea was simple: before an agent's tool call executes, a deterministic engine scores it across five risk dimensions and returns one of four decisions — allow, audit, escalate, or deny. The engine sits outside the model, not inside the prompt. No amount of prompt engineering overrides a deny. I field-tested it against 83 real agents across 10 frameworks. Published to PyPI. Made the repo public. Wrote a dev.to article https://dev.to/debashish ghosal/i-stopped-trusting-ai-agents-with-tools-so-i-built-a-gatekeeper-26fb about it. Thought I was done. I wasn't even close. The article got attention, and the comments weren't "nice project." They were sharp, specific, and uncomfortable. People who actually deploy agents read what I'd built and said: this is good, but you're missing the thing that actually breaks in production. That's the thing about shipping. You think you've built the product. Then real users tell you what the product actually is. Every comment was a gap I didn't see — not because I didn't plan well, but because you can't see your own blind spots. You need someone else to point at them. 14 comments turned into 14 GitHub issues. Every single one shipped in v0.2.0, three days later. The full list is here https://github.com/deghosal-2026/agent-tooltrust/issues?q=is%3Aissue+milestone%3A%22v0.2.0%22+is%3Aclosed . This is what happened in those three days — what the feedback became, what the field test taught me about local vs cloud LLMs, and how a gatekeeper became a control plane. I expected "cool project" and maybe a star. Instead I got three categories of feedback that completely reshaped what v0.2.0 became. v0.1.0 validated tool selection — is this agent allowed to call this tool? Several developers pointed out that's barely the surface. One comment said: you validate that DELETE is allowed, but what about the arguments? A DELETE with no WHERE clause is dangerous even if DELETE itself is permitted. That became argument-level policy https://github.com/deghosal-2026/agent-tooltrust/issues/142 — per-tool argument schemas with required fields, forbid-lists, bounds, and environment allowlists, all evaluated before the engine decides. Another said: an agent scoped to staging shouldn't be able to touch production. That became resource/environment scoping https://github.com/deghosal-2026/agent-tooltrust/issues/145 — default-deny on out-of-scope resolution, session-scoped environments. Someone else asked about conditional allows — what if a call should be allowed but only with a sign-off or a mandatory notification? That became allow with obligation https://github.com/deghosal-2026/agent-tooltrust/issues/147 — a fifth decision state where the gatekeeper enforces side-effects first-use sign-off, auto-notify, signed audit entry that fire even if the agent doesn't cooperate. Then there was the deny-explanation problem. If you deny and explain too much, the agent can reverse-engineer your rule set. If you don't explain enough, it can't replan. That became three-tier deny-reason exposure https://github.com/deghosal-2026/agent-tooltrust/issues/160 — none , reason-only , detail — with reason-only as the default so agents get enough to replan without seeing rule IDs or thresholds. And finally: schema-valid and permission-valid calls can still be semantically wrong. Reading a moved file path. Calling the wrong tool with plausible arguments. That became premise/staleness validation https://github.com/deghosal-2026/agent-tooltrust/issues/159 . v0.1.0 trusted the agent's self-report. Multiple developers asked the same question in different ways: why? A burst of denies isn't just noise — it's a probe. Someone reverse-engineering your policy. That became deny-storm detection https://github.com/deghosal-2026/agent-tooltrust/issues/143 — a session-level analyzer tracking deny rate, consecutive denies, and tool-set entropy, with throttle/lock/pause on threshold. URL fetches can exfiltrate. An agent fetching 169.254.169.254 is reading cloud metadata, not a website. That became the URL fetch category guard https://github.com/deghosal-2026/agent-tooltrust/issues/146 — robots.txt enforcement, PII stripping, and SSRF redirect re-resolution against internal-address blocklists. The agent says "done." How do you know it actually did the work? That became the external verification sink https://github.com/deghosal-2026/agent-tooltrust/issues/144 — read-only hooks to agent-unwritable systems API counters, VCS state, billing snapshots that diff against the agent's self-report. This one stung. v0.1.0 logged everything — every decision, every argument, every explanation. A developer pointed out: if an agent reads a secret in audit mode, that secret is now in your audit store. The gatekeeper that protects tools is persisting their contents. The audit trail became a secondary breach vector. That became audit argument redaction https://github.com/deghosal-2026/agent-tooltrust/issues/158 — a default deny-list token , password , apiKey , authorization , secret , … that redacts sensitive args recursively through nested dicts and lists, replaces them with REDACTED , sets a redacted: true flag, and supports per-policy overrides. Then there was the credential problem. A stale or out-of-scope credential at call time looks identical to "the LLM didn't call the tool" in the audit trail. You can't tell the difference between a policy failure and a credential failure. That became stale-credential classification https://github.com/deghosal-2026/agent-tooltrust/issues/161 — a credential status tag that distinguishes engine-allow-but-credential-rejected from not-available . Nobody was looking across sessions. A denied call last week that's allowed this week is drift — but v0.1.0 had no way to see it. That became session-to-session analytics https://github.com/deghosal-2026/agent-tooltrust/issues/148 — recurring benign denials, deny→allow transitions, dead and over-hit rules, all queryable via tooltrust analytics sessions and the /api/analytics/sessions endpoint. And the thresholds themselves were static. How do you know they're right? That became score calibration https://github.com/deghosal-2026/agent-tooltrust/issues/162 — counterfactual threshold logging what score would have flipped the decision , false-allow and false-escalate rates broken down by tool, environment, and data class, with tooltrust calibrate report and the /api/analytics/calibration endpoint. Two more comments pushed the test methodology itself. Add adversarial parameter payloads 163 https://github.com/deghosal-2026/agent-tooltrust/issues/163 . Test scenarios the gate cannot pass by construction 164 https://github.com/deghosal-2026/agent-tooltrust/issues/164 . Both shipped. 14 comments. 14 issues. 14 features. All from one dev.to article https://dev.to/debashish ghosal/i-stopped-trusting-ai-agents-with-tools-so-i-built-a-gatekeeper-26fb . Here's the thing that surprised me: the engine didn't change at all. Engine.evaluate returns the same decisions for the same inputs. The 2,490 deterministic tests from v0.1.0 still pass at 100%. The field test proved no regression. What changed is everything around the engine. Before it: argument validation, scope enforcement, premise checks. After it: redaction, calibration, stale-credential tagging, tamper-evident chaining. Around it: session analytics, HTTP PDP, policy packs, OPAL sync, and a 5-tab operator dashboard. The gatekeeper became a control plane. Not because I planned that — because 14 developers told me what was missing, and filling those gaps turned a per-call interceptor into a system you can observe, tune, and serve to a fleet. tooltrust audit session --replay