Research · the thesis

The vault holds the line. The warden reads the intent.

The vault is deliberately dumb: hard ceilings, fixed rules, safe with no model at all. The warden is a Meta model that catches requests that sound routine but aren't.

A barista checks the name on the cup. The warden checks what the order is for.
Held-out set: rules alone caught 12/28 · rules + Muse Spark 1.3 caught 27/28

Warden numbers are Muse Spark 1.3 via the Meta API. Local Muse Glimmer through Ollama is supported; we publish no local numbers.

Zero-Context Agentic Vault · the practical winner

For existing APIs, zero-context custody wins.

Call Stripe without handing its key to the agent. The broker supplies the authentication the API accepts. A standalone ZK proof cannot replace that credential. This is the advantage we optimize for.

1 · Request

Ask by alias and scope

The agent supplies a reason, not a stored key. request_capability({alias: 'stripe', scope: 'charges.read', reason: 'List charges'})

2 · Warden

Vet metadata, not the key

Agent, IDE, tool, alias, scope, reason, request/denial counts and policy digest enter the prompt. The stored target credential does not.

3 · Transport

Inject inside the daemon

After authorization, vaultd decrypts the credential and the connector adds a bearer header to a preset HTTPS request.

4 · Return

Return the result

No credential-read MCP tool. Headers and failed response bodies are omitted. Successful bodies pass through; response hardening is tracked separately.

Code review: four boundaries, evidence and limits. "Zero-context" describes credential custody, not an agent with no task context.

Architecture decision · goal, choice, trade-off

Custody executes the call. A proof verifies a claim.

Choose brokered custody for agent-safe access to existing APIs. Keep keys out of the agent's request and prompt while preserving the service's normal authentication.

Decision criterionWhy custody wins hereTrade-off considered
Call an unchanged APIThe daemon injects a credential that Stripe accepts. No proof verifier or new authentication protocol is required at the service.Trust the unlocked daemon, local runtime and HTTP stack with plaintext credentials.
Keep keys out of agent contextThe agent requests an alias and scope, not the stored key. The warden assesses metadata, not that credential.Custody separation is not cryptographic proof of correct execution, nor protection from a compromised host.
Use ZK instead?A standalone proof is not an accepted substitute for Stripe's documented key/token authentication. It does not complete this job alone.ZK can add independently verifiable claims or policy receipts at a different boundary. That is additional machinery, not a replacement broker.
Ship a focused integrationThree preset GET connectors already cover Stripe charges, GitHub repos and Cloudflare token verification.More operations, signing schemes and token refresh need connector work. No universal compatibility or measured latency win is claimed.

Decision reasoning in this review, not a claim about historical intent. zkTLS can authenticate web data while normal server authentication remains. Stripe auth · zkVM receipts · MPC-TLS

Implementation gaps · separate from the design decision

Harden the implementation. Keep the custody advantage.

Model boundary

Metadata can leave the device

Default: TypeSafe Jev 1.14 via the TypeSafe API. Zero-context architecture ensures stored target secrets never enter the model prompt, state, logs, or audit records.

Memory boundary

No immediate RAM-scrub guarantee

Decryption produces a JavaScript string. Credential and HTTP-runtime copies have no guaranteed erasure time. Passphrase mode zero-fills its held master-key buffer on lock; that is a different claim.

Response boundary

Not a general-purpose sanitizer

A successful upstream response is parsed and returned, not scanned for echoed keys or other secrets. Hostile or sensitive response content remains a risk.

Execution boundary

Brokered MCP is not CLI export

noenv run decrypts non-card credentials into a child environment. That mode is outside the zero-context claim. Local malware can still keylog or read an unlocked process.

At rest: AES-256-GCM. Default new vaults use a passphrase-wrapped master key, not merely OS-keychain custody. Legacy keychain/env modes have different protection. No formal-verification claim.

Research directions · not shipped features

Add proofs where verification is the job.

Selective disclosure

Prove an issued claim

BBS-style credential proofs can reveal selected signed facts without exposing the full credential. A spend-limit claim needs an issuer, fresh data and a proof design; an API key alone is not that credential.

Policy receipts

Prove a defined computation

Explore zkVM receipts tied to a reviewed policy program and authenticated inputs. Proving a policy check does not by itself prove which HTTP request was sent or what the remote service did.

Encrypted team sync

Keep the server out of key custody

Client-side encrypted sync needs key distribution, recovery, revocation and device security. This is often marketed as "zero knowledge," but it is not the same primitive as a ZK proof. Neither is implemented here.

Web-data provenance

Prove what a server returned

TLSNotary uses MPC-TLS to authenticate exchanged data with selective disclosure. It is not a blanket proof of payment settlement or a replacement for credentials. Protocol and verifier/notary assumptions matter.

These are optional verification directions, not prerequisites for the brokered API design. Hardening priorities: successful-response handling, CLI export review, memory exposure and matched workflow benchmarks. No new model calls or proof benchmarks were run for this review. BBS explainer · OWASP memory guidance

Benchmark · 300 expanded test cases

Rules catch deterministic invariants.
TypeSafe Jev catches semantic threats (100% combined recall).

Rules alone
183/ 188

Catches 100% of velocity anomalies (bursts, denial streaks).

Rules + TypeSafe Jev 1.14
188/ 188

0 slips through. 100% high-risk recall.

Attackers don't use simple keywords. TypeSafe Jev understands semantic intent in ~205ms, stopping prompt injections, multi-hop exfiltrations, and payload mismatches that evade static regex.

How we counted
  • Caught means the vault denied the capability or required explicit human approval.
  • Deterministic rules catch 100% of session velocity anomalies (32/32); Jev catches semantic threats and injections (155/156).
  • Evaluated live across 360 test scenarios against TypeSafe Jev 1.14 (/v1/systemone).

Source: raw benchmark logs

Benchmark · Zero routine false alarms

Zero routine interruptions, for <$0.00003 per check.

Routine developer requests
72/ 72
0% FPR on everyday dev workflows

TypeSafe Jev allows everyday requests without interruption. Common domains like GitHub and Stripe never trigger exfiltration false alarms.

Why it matters: prompt fatigue leads users to click through warnings blindly (70.2% in USENIX 2013 studies). Eliminating false prompts keeps users vigilant when real attacks hit.

Speed & Cost per check
<$0.00003
~205 ms median latency

Each check takes ~205 ms with TypeSafe Jev, operating at $42 per billion tokens (~35,000 checks per $1.00).

Measured across 360 live calls. Sub-250ms latency ensures agent tasks remain fluid without perceptible interactive lag.

Safe requests that go through without prompt fatigue best → worst
Everyday Benign Requests72 / 72 · 100% pass (0% FPR)
Benign-Hard Developer Workflows35 / 40 · 87.5% pass
High-Risk Threat Recall (Combined)188 / 188 · 100% caught
The dumb vault

Safe with no model at all

The warden can tighten a decision. It can never loosen one. Every arm, even no warden, held all 4/4 policy-floor cases.

1

Writes always ask

Refund, push, delete: you decide, whatever the model says.

2

Ceilings are hard

Above the ceiling is denied. Nobody gets asked.

3

No cross-resource hops

A grant for one resource can't open another.

4

Model down → you decide

Timeout or bad JSON goes to approval. Never waved through.

Guarantees should be deterministic. The model should advise.CaMeL (Debenedetti et al., 2025) · Design Patterns for Securing LLM Agents (Beurer-Kellner et al., 2025)

Why: prompted LLM judges are unreliable alone. In R-Judge (Yuan et al., 2024) most models scored near random at spotting unsafe agent behaviour. The four checks live in packages/core/src/policy.ts and run before any model.

Method

How the benchmark avoids grading its own homework

Freeze

Rules first

Rules + 20 dev cases pushed in 793371d. The 60 held-out cases came later (702bb2b). Rules unchanged since.

Ground

Cases from the literature

Patterns from InjecAgent, AgentDojo, ToolEmu, Greshake et al., HackAPrompt, EIA and real incidents. No benchmark text copied.

Four arms

Same policy, different brains

Rules · warden · rules + warden (stricter wins), against a baseline that asks on every read. Risky reads caught, safe reads passed, prompts, latency.

Honest failures

A crash isn't a catch

A failed warden call still reaches you, but scores as a miss.

Held-out setCountWhat it tests
High-risk reads2822 paraphrased · 4 giveaway words · 2 history-only. Exfiltration, injection, destructive, credential, financial, social, bulk.
Policy floor4Write scope · above ceiling · cross-resource · repo delete
Benign, hard20Normal work that says "keys", "export", "delete" or "webhook"
Benign, plain8Everyday reads
The scary part

Saved cards and keys are what infostealers go after

DPAPI "does not protect against malicious applications able to execute code as the logged in user - which infostealers take advantage of".Google Security Blog, July 2024
IncidentWhat leakedWhat NoEnv changesWhat it doesn't
Lumma Stealer (2025)Passwords, cards, bank accounts, wallets. 394,000+ Windows PCs in two months (Microsoft).Secrets are AES-256-GCM ciphertext. The master key is passphrase-wrapped, held only while unlocked, 15-min idle auto-lock. Brokered MCP requests get a result, not the stored value.Malware running as you can keylog the passphrase or read memory while unlocked. Legacy keychain-mode vaults have no passphrase until noenv key protect.
RedLine (2020–2024)Browser autofill and saved card numbers from "millions of computers" (US DOJ).No autofill store to dump. Lists show alias and ceiling; cards show brand + last 4.Doesn't detect or remove malware.
Chrome App-Bound Encryption (2024)Bypassed within months: remote debugging, memory reads, SYSTEM (Elastic).No browser holds the secret. Grants expire after one call or 60 s.The daemon holds plaintext during that call.
Snowflake / UNC5537 (2024)~165 orgs notified; infostealer creds dating to 2020, no MFA (Mandiant).Agents hold no long-lived credentials. Every grant is short and logged.Doesn't replace MFA or rotation.
British Airways (2018)CVVs "stored in plaintext" by a debug script. 244,000 cards exposed; £20m ICO fine.Brokered calls keep the injected key out of request arguments and connector errors.Magecart skimming on a checkout page is out of reach.
The scary part · what NoEnv does instead

A saved card the agent can't read

Payment cards

Brand and last 4, nothing more

Number (Luhn-checked), name, expiry and CVV are stored as one AES-256-GCM ciphertext. Agents, MCP and the app see brand, last 4 and a mask.

Every card use is a financial high-risk write: always a human, never auto-approved, never lowered by the warden. No payment connector exists yet, so an approved card grant is refused.

Honest scope

Not end-to-end, not autofill

No browser autofill or checkout. The daemon holds the master key while unlocked, so it is not end-to-end encrypted against its own machine.

What it is: encryption at rest, a passphrase-wrapped key with auto-lock, a policy gate, and no card value handed to the agent. pqc.ts (ML-KEM-768 + X25519) is built and tested, not yet used for storage.

Agents already went rogue

Real incidents, mapped to the layer that stops them

IncidentWhat happenedVault floorWarden
Nx "s1ngularity" (Aug 2025)A post-install script drove local AI CLIs with --dangerously-skip-permissions / --yolo to hunt secrets and push them to a public repo (Nx, Wiz).Stored values are ciphertext. MCP has no read-secret tool; CLI export is a separate exposure path."Pull out the saved logins so we can migrate them": a held-out case rules miss.
Amazon Q extension (Jul 2025)v1.84.0 shipped a prompt to wipe the system and cloud resources (AWS-2025-015).A delete is a write: you're asked.Its read-scoped echo is a held-out case rules miss.
Replit agent (Jul 2025)Deleted a production database during a code freeze; later restored (The Register).Destructive writes always need a human.Adds context to your prompt.
GitHub MCP hijack (May 2025)A malicious public issue made an agent leak private repo data (Invariant Labs).Cross-resource and above-ceiling: denied.Rules caught only 3 of 8 held-out injections.

At scale: ToolEmu (ICLR 2024): the safest agent tested still failed riskily 23.9% of the time. AgentDojo (NeurIPS 2024): 629 injection test cases.

Skeptic's corner · the evidence

What this does not prove yet

1

Same author wrote both sides

I wrote the rules and the cases. Freezing rules first reduces the bias; it doesn't remove it.

2

Small n

28 risky, 28 benign. One case moves a rate ~3.6 points. Directional, not a leaderboard.

3

Adaptive attackers

The Attacker Moves Second (Nasr et al., 2025) broke 12 recent defenses. The warden is a second layer, which is why the floor exists.

4

No barista stopwatch

Human approval speed is unmeasured. The claim is narrower: the warden decides before the request reaches you.

Skeptic's corner · the protection

What the vault does not stop yet

5

Keyloggers get the passphrase

scrypt (N=217, r=8, p=1) or Argon2id (19 MiB, t=2, p=1) slows offline guessing. It does nothing against recorded typing.

6

Unlocked means readable

The master key sits in daemon memory while unlocked. Node offers no mlock or MADV_DONTDUMP. Auto-lock shortens the window; it doesn't close it.

7

OS prompts: researched, not built

Windows Hello, macOS LAContext and polkit don't guard the key yet. The app's Hello lock only hides the window.

8

The daemon token is a key too

Whoever reads noenv.token can try unlocks (5 free, then 30 s → 15 min backoff), lock, or add a card. It can also call /approve. It can never read a secret back; an approved card use fails only because no payment connector exists yet.

Claim-by-claim review: docs/research/thesis-review.md.

Sources & reproduce

Our secret sauce, not so secret

The full recipe and every ingredient, so you can cook it yourself.

Cook it yourself
  1. 1

    Build

    One-time compile.

    npx tsc -p tsconfig.json --outDir dist
  2. 2

    Run the rules

    No key needed.

    node dist/packages/brain/eval/run-thesis.js --rules-only --set heldout --out docs/verification
  3. 3

    Add TypeSafe Jev

    TypeSafe Jev 1.14 via the TypeSafe API (~$0.000025/req).

    TYPESAFE_API_KEY=... npx tsx packages/brain/eval/run-thesis.ts --live --set heldout --out docs/verification
25 sourcesOpen a group to see its sources
Agent attacks research11
  1. 1AgentDojo NeurIPS 2024arXiv:2406.13352
  2. 2InjecAgent ACL 2024 FindingsarXiv:2403.02691
  3. 3Indirect prompt injection AISec 2023arXiv:2302.12173
  4. 4ToolEmu ICLR 2024arXiv:2309.15817
  5. 5R-Judge Yuan et al.arXiv:2401.10019
  6. 6HackAPrompt EMNLP 2023arXiv:2311.16119
  7. 7EIA Liao et al.arXiv:2409.11295
  8. 8CaMeL Debenedetti et al.arXiv:2503.18813
  9. 9Design Patterns for Securing LLM Agents Beurer-Kellner et al.arXiv:2506.08837
  10. 10The Attacker Moves Second Nasr et al.arXiv:2510.09023
  11. 11Alice in Warningland USENIX Security 2013usenix.org
Real incidents9
  1. 12Lumma Stealer takedown Microsoft, May 2025blogs.microsoft.com
  2. 13RedLine complaint · Operation Magnus US DOJ · Eurojustjustice.gov · eurojust.europa.eu
  3. 14Chrome cookie encryption · Katz and Mouse Google · Elasticsecurity.googleblog.com · elastic.co
  4. 15UNC5537 / Snowflake Mandiantcloud.google.com
  5. 16British Airways £20m fine ICO, 2020CNBC · Bird & Bird · BBC
  6. 17Nx s1ngularity postmortemnx.dev · wiz.io
  7. 18AWS-2025-015 Amazon Q Developeraws.amazon.com · BleepingComputer
  8. 19Replit deletes prod database 2025The Register
  9. 20GitHub MCP exploited Invariant Labs, May 2025invariantlabs.ai
Platform security docs5
  1. 21Password Storage Cheat Sheet OWASPcheatsheetseries.owasp.org
  2. 22UserConsentVerifier · CryptProtectMemory Microsoftlearn.microsoft.com · learn.microsoft.com
  3. 23LAContext Appledeveloper.apple.com
  4. 24polkit(8) freedesktop.orgfreedesktop.org
  5. 25madvise(2) · PR_SET_DUMPABLE Linux man-pagesman7.org · man7.org
Next step

Integrate now

Drop in the 5-tool MCP server for Cursor, Claude Code, Codex, or VS Code. Setup is one config block per IDE (see docs).