Loading…
Nobody is on hand to approve here, so the hold timed out and the call was refused. The receipt signs that refusal.
- Tool call
- Why
- Sent as
- Decided
- Receipt
- This record
- Previous
- Signature
Delegated authority
An agent can only do what a person granted. Each routed call is allowed, redacted, held, or refused before it lands. Silence means no.
Logging tells you afterwards. Agent finders map the fleet. PyxGrant decides first: refuse the hop, hold the path to the sink, and print the call that went around it. A signed receipt comes with the decision — it is not a substitute for stopping the call. A call that never reaches it is named later, not stopped.
Not another agent finder. Not a log you read after the fact. The usual stack scores a hop and writes a dashboard. It does not hold the path to the sink, bind the bytes that run, read back from anyone but the actor, name the miss, or let a skeptic verify the refusal without the vendor. The set below is live control — authority that can only narrow, a decision on the path before the sink, dual-control holds, and a freeze that reaches every plane — shipped together in one binary. The shortlist public pages did not describe that stack together when we last read them. Receipts come with the decision; they are not the product.
tools/list is filtered to the tools that grant allows — the agent never sees a capability it was not granted. Authority is the control plane, not a note in a log.resources or prompts read, or a notification, taints that path the same way a tool result does. Under the hardened profile the path is held or refused until a person breaks it. The operator sees which source tainted the path. An operator can also name an ordered sequence of tools; completing it is held or refused. A hold can preview the next hop when the connector can dry-run. pyxgrant unwind runs verified inverses; what cannot be compensated stays on the desk. pyxgrant demo -consequence-close walks a clean post, a scorer-miss read, then the same sink refused on provenance — synthetic estate, stated in the command. That walk is the Go binary, not the in-browser Try (still 2.900 WASM).pyxgrant payback lists prevented events you can re-derive — a spawn refused, a herd block, a cache hit — as exact counts or labelled estimates, not your invoice. payback prove dumps that ledger as an offline pack. LLM cache hits book avoided tokens as labelled estimates. showback -by grant -rollup folds child spend into the parent. This is not a SIEM or SOAR. Accounting-uncertain stays recorded. FinOps →pyxgrant laptop -apply installs the managed hook and starts hook-daemon -engine -profile hardened. On Linux 6.7+ it launches the agent under Landlock. It does not pass -admin-approval; Command Center hold is a separate daemon flag. Windows discovers that daemon via hookpep.win.json. pyxgrant launch -confine, -confine-fs, and -deny-net bound a Windows child (job object, AppContainer, WFP) — not Landlock, and not a wrap of the whole laptop. A bare subprocess is still a smaller PEP. Pinning and a human hold sit behind the score. How it decides →ok:true is not enough. Declarative HTTP read-back, then N-of-M across independent providers. Too few confirmations is unverifiable and fails closed under hardened. A confirming read-back can mint a signed PhaseVerified receipt that closes the loop.kill:probed or UNVERIFIABLE — not a silent “killed.” IdP revoke is not claimed without a connector.noninclusion signs that a declared action did not occur when coverage is complete. Optional coverage-gap quarantine and egress default-deny fail closed when traffic is supposed to go through us. evidence prove hands a skeptic one file, verifies it on a pinned key, and shows that a flipped byte fails. Verify binds the whole decision — principal, grant, verdict — not a detached stamp. Embedded-key verify is integrity, not authenticity, until you pin that key. That closes the loop after a refuse, not instead of one.Where they are ahead: finding agents across SaaS platforms, and trained-model detection. We say that on Compare. Live authority and refusal is what we built to own. Compare, question by question →
This is the product, not a screenshot of a log. Every answer below comes from PyxGrant's own decision engine under its hardened policy — allow, redact, hold, or refuse before the call lands. Switch to live and the engine itself runs in this tab, compiled to WebAssembly. Edit the request. The signature is how you verify the decision; the product is the decision.
Loading…
Nobody is on hand to approve here, so the hold timed out and the call was refused. The receipt signs that refusal.
In the product, a held call waits up to ten minutes by default for a signed approval. Controls that need the real machine, such as kernel confinement of a wrapped child or Linux egress-cage, aren't part of this demo. The live engine is about 21 MB to download and loads once — it is the 2.900.0 WASM, not the 2.1239.0 shipping kernel. On the binary, pyxgrant demo -consequence-close is the scorer-miss then path-stop walk, with a pack you verify offline. For the skeptic walk in this tab — flip a byte, swap approved args, kill a grant, N-of-M, witness independence — open Prove it →
Each plane is tagged shipped, decision-only, or preview. A pilot starts with coding agents and the MCP tools they load. Pick a plane to watch what PyxGrant does there. Each animation replays a check from the walkthrough and tests, or behaviour read from the code.
Start here
Also in the binary
Not binding on the host
Every tool description is pinned when it's approved. A tool that tries to shadow another, or whose description changes after approval, is quarantined and taken out of what the model can see. High-impact calls wait for a person.
Everything an agent reads is scanned before the model sees it. Secrets and personal data are masked, confidential material is withheld, key and credential files are refused, and data from a sensitive source can't leave through a public tool or hide in a URL.
The agent browses in its own profile, never with your signed-in sessions. A first visit to a new site waits for a person, banking, payroll, health and government sites are refused, and a jump to another site after an injected page is refused. Route traffic through the capture proxy to classify every host. Turn on -scan-downloads to refuse a dangerous file on plaintext HTTP; add -mitm to inspect the same class of download inside HTTPS.
The agent's own hook asks PyxGrant before each built-in shell or file call. Work inside the workspace goes straight through. A step outside it waits for a person, and network reach your policy doesn't allow is refused. After the tool runs, a PostToolUse hook scans a document that came back: a PDF or Office file with a macro or embedded script is blocked before the model acts on it. pyxgrant hook generic runs the same decide path for Codex, Gemini, Copilot, Windsurf, Cline, or Aider; an agent with no native hook still needs a small wrapper.
The model proxy masks secrets in a prompt before it leaves, meters tokens and cost per principal, holds requests to models you've listed for a person, and refuses the call once that principal's budget for the window is spent. Each forwarded completion also spends one step on the same agency counter as a tool call. Under the hardened profile, a model with no price is refused.
An instruction planted in an agent's memory is the attack that comes back later. PyxGrant neutralises instructions on the way in, can refuse and fingerprint a poisoned write, and catches the same poison when it's read back in different words.
Authority passes down as grants that can only narrow. A partner can re-delegate your grant without a shared secret but never widen it, sensitive methods can wait for a person, and revoking the parent ends every child.
On the agent's own machine, PyxGrant can scan live processes, Windows autoruns, scheduled tasks, and listeners, and decide a file write, launch, or outbound connect you send it: credential files and git hooks are protected, startup items wait for a person, programs run from Downloads are refused, and connections stay on your allowlist. Each gate is off until you turn it on.
Text on its way to a person is redacted and checked for instructions aimed at the reader, like "paste this into your terminal". Streamed and non-stream AG-UI bodies are inspected, including tool results and thoughts. It is shaped to the AG-UI contract and tested against a synthetic backend, not a live CopilotKit deployment.
A payment must match the cart a person approved, come from an untainted session, and stay under the cap. The model can't talk its way past the ceiling. A reverse runs the provider void and only closes when the provider confirms the money is gone; the core binary ships that command, not a live Stripe or Adyen connector.
A held tool call, model request, agent call or browser step waits in one shared queue. The approver is alerted, sees exactly what will run and for whom, and signs the decision with a key the agent can't reach. A rule can require N distinct Ed25519 approver keys, each bound to the exact payload and to what they saw; a shared-secret HMAC name is not a quorum. Nobody approves their own call, and silence means no.
When something goes wrong, stop it in one command without stopping everything else. Freeze just the outbound sends while reads keep working, freeze everything if you need to — across the tool plane, the model plane, agent-to-agent, and AG-UI, including responses already in flight — then resume when it's safe, and revoke an agent for good. contain act adds a dual-control stop: pause and isolate can be undone for 15 minutes; panic and kill_fleet need a second operator. Break-glass dual-control is single-use.
One team's coding agents and MCP servers. Nothing is refused. You leave with a signed pack a security owner can hand to their boss. Enforcement is a second step, if you want it.
The four questions every security review asks first, answered before the demo.
One Go binary on each machine that runs agents, with a Windows service option. Agents reach it four ways, and you can mix them.
hook generic covers Codex, Gemini, Copilot, Windsurf, Cline, or Aider if the agent (or a wrapper) can shell out first.Decisions run inside the binary, from your policy file. No vendor cloud sits in the path, and the optional data classifier runs locally.
pyxgrant perf measures decision time on your hardware. We don't quote a number from ours.The call is refused, not waved through.
It sits in front of agent actions and leaves the rest of your stack in place.
We don't have public customer results yet. The numbers below are from a full Windows run on 26 September 2026, on our machines.
checks pass in pyxgrant demo, which starts a hostile MCP server behind the gateway. All 26 sections pass: tool poisoning, rug pulls, poisoned results, confused deputy, blast radius, self-protection, memory poisoning, grant revocation, browsers, payments, and the audit chain among them. No planted secret reached the client or the audit log.
None of the 45 attacks were allowed. None of the 22 benign calls were flagged. An attack that was only flagged, not blocked, is printed as under_enforced and still counts as caught; we are not guessing that count here. It is our own corpus and small; the 95% range on the allow rate is 0 to 8%.
Go packages passed go test cleanly. One more package failed once on a Windows temp-folder cleanup and passed on three reruns — we do not call that a clean first pass.
When a call is routed through PyxGrant — MCP proxy, coding-agent hook, model proxy, or decision service. A call that never reaches it is outside this list.
The default profile is lighter on purpose. Path sequence, blast-radius holds, KMS/HSM sealing including PKCS#11 HSM, and the signed root token are hardened-profile controls. Scope and edges: Trust →
PyxGrant is built by Omantiv. A 30-day Evidence Pilot covers one team, its laptops and CI runners, and the MCP servers they use. Observe only; you leave with a signed pack. Company · Request the pilot