Warp, the Rust-based AI-enhanced terminal, just disclosed a security incident where agent traces sent to their backend contained user secret keys. The company told affected users they have “no knowledge of what these keys are or if they are truly sensitive,” but recommended rotating them out of caution. No evidence of misuse exists, but the incident exposes a fundamental architectural problem: when you add AI features to developer tools, you create new telemetry surfaces that traditional security models don’t account for.
This is not a breach in the traditional sense. It’s a design failure where observability infrastructure built to debug agent behavior accidentally became a secret exfiltration vector.
What Is an Agent Trace?
Agent traces are execution telemetry. When Warp’s AI features run (command suggestions, natural language to shell translation, workflow automation), the system captures:
- User prompts and agent responses
- Command arguments and environment context
- Execution state and decision paths
- Tool calls and their parameters
This data flows to Warp’s backend for debugging, model improvement, and abuse prevention. The problem: secrets live in the same namespace as “helpful context.”
Common secret locations in terminal sessions:
- Environment variables (
AWS_SECRET_ACCESS_KEY,GITHUB_TOKEN) - Command arguments (
curl -H "Authorization: Bearer sk-...") - File paths containing credentials (
~/.aws/credentials) - Output from secret management tools (
vault read secret/prod)
If your telemetry system captures command context without sanitization, it will capture secrets. The terminal is a high-entropy environment where credentials appear in dozens of unexpected places.
The Telemetry Boundary Problem
Traditional observability systems assume a trust boundary: application code runs in a controlled environment, and telemetry captures structured events. Terminals break this model.
Why terminals are different:
- User input is untrusted: Every command might contain a secret
- Environment is credential-rich: Developers export tokens, paste API keys, run auth commands
- Context is necessary: AI features need to see command history and environment to be useful
- Real-time decisions: Agents can’t wait for human review of what data to send
The architectural question becomes: how do you build a telemetry system that captures enough context for AI features to work, but never exfiltrates credentials?
Sanitization Strategies and Their Failure Modes
Here’s what you can try, and where each approach breaks:
| Strategy | Implementation | Failure Mode |
|---|---|---|
| Regex blocklists | Pattern match AWS_SECRET_ACCESS_KEY, Bearer, sk- | Misses custom secret formats, base64-encoded values, obfuscated tokens |
| Entropy detection | Flag high-entropy strings (random-looking tokens) | False positives on hashes, UUIDs, legitimate random data |
| Environment variable filtering | Redact known secret env vars | Misses secrets in command args, piped input, file contents |
| Client-side redaction | Sanitize before sending to backend | Requires perfect implementation in untrusted client code |
| Server-side scanning | Detect secrets after receipt | Too late, data already exfiltrated |
| Zero data retention | Don’t store telemetry at all | Breaks debugging, abuse prevention, model improvement |
The core tension: AI features need rich context, but rich context contains secrets.
Warp’s Architecture and Where It Went Wrong
Warp is a terminal emulator with cloud-connected AI features. The basic flow:
- User types a command or natural language prompt
- Client captures session context (history, environment, working directory)
- Client sends context + prompt to Warp’s backend
- Backend calls LLM with context
- Agent generates command or suggestion
- Client executes, captures result
- Agent trace (prompt, context, response, execution state) sent to backend
Step 7 is where secrets leak. The trace contains everything needed to debug why the agent made a particular decision, which means it contains everything the agent saw, including secrets in environment variables or command arguments.
Why this happened:
- Agent traces were designed for debugging, not production telemetry
- No clear policy on what constitutes “safe” observability data
- Client-side redaction was incomplete or missing
- Backend storage didn’t assume traces would contain secrets
The incident reveals a category error: treating agent execution telemetry like traditional application logs.
Zero Data Retention and the Trust Problem
Warp previously claimed “Zero Data Retention” (ZDR), which users interpreted as “we don’t store your data.” The reality is more nuanced.
What ZDR typically means:
- Data is not used for model training
- Prompts and responses are not stored long-term
- Providers (OpenAI, Anthropic) don’t retain data
What ZDR does not mean:
- No telemetry collection
- No abuse prevention logs
- No debugging traces
- No analytics data
The gap between user expectations and actual data flows is where trust breaks. If your terminal sends telemetry to the cloud, users need to know exactly what data leaves their machine and how long it persists.
Building Telemetry Boundaries for Agent Systems
If you’re building AI-enhanced developer tools, here’s how to avoid this failure mode:
1. Classify Data Before Collection
Define three tiers:
- Safe: Command names, tool invocations, execution time, error codes
- Risky: Command arguments, environment variable names, file paths
- Never collect: Environment variable values, command output, file contents
Only collect “Safe” by default. Require explicit opt-in for “Risky” with clear warnings.
2. Client-Side Redaction with Server-Side Validation
Redact on the client, but assume the client is compromised. Server-side:
import re
from typing import Dict, List
SECRET_PATTERNS = [
r'sk-[a-zA-Z0-9]{32,}', # OpenAI keys
r'ghp_[a-zA-Z0-9]{36}', # GitHub tokens
r'AKIA[0-9A-Z]{16}', # AWS access keys
r'Bearer\s+[a-zA-Z0-9\-._~+/]+=*', # Bearer tokens
]
def validate_trace(trace: Dict) -> List[str]:
"""Returns list of potential secrets found in trace."""
violations = []
for field in ['prompt', 'context', 'args']:
if field not in trace:
continue
content = str(trace[field])
for pattern in SECRET_PATTERNS:
if re.search(pattern, content):
violations.append(f"Potential secret in {field}: {pattern}")
return violations
If the server detects potential secrets, reject the trace and alert the client to fix its redaction logic.
3. Separate Debugging from Production Telemetry
Agent traces for debugging should never mix with production telemetry:
- Debug mode: Full context, stored locally, never sent to cloud
- Production telemetry: Minimal safe data, sent to backend, auto-expires
Let users opt into cloud-based debugging with explicit consent and temporary tokens.
4. Assume Environment Variables Are Toxic
Never send environment variable values. If you need environment context for AI features, send only:
- Variable names (not values)
- Presence/absence of known variables
- Variable count and types
If the agent needs actual values to make decisions, run the decision logic client-side.
5. Implement Trace Expiry and Purging
Even “safe” telemetry should not persist indefinitely:
- Agent traces expire after 7 days
- User can delete all traces on demand
- Automated purge of traces containing flagged patterns
- No long-term storage of execution context
The Observability vs. Privacy Trade-off
AI-enhanced tools face a fundamental tension:
Better observability enables:
- Faster debugging of agent failures
- Model improvement through real usage data
- Abuse detection and prevention
- Performance optimization
But creates risks:
- Credential exfiltration
- Exposure of proprietary code or data
- Compliance violations (GDPR, SOC2)
- User trust erosion
The only sustainable solution is to build privacy into the architecture from day one. You cannot bolt on secret redaction after you’ve already designed a system that requires full context.
What Warp Should Do Next
Based on the disclosure, here’s the remediation path:
- Immediate: Purge all existing agent traces containing flagged patterns
- Short-term: Implement server-side secret detection and rejection
- Medium-term: Redesign telemetry to collect only safe data by default
- Long-term: Move agent execution fully client-side, eliminate cloud dependency
The hardest part is the last step. If your AI features require cloud connectivity, you will always have a telemetry surface. The only way to eliminate the risk is to run agents locally.
Technical Verdict
Use Warp (or similar AI terminals) if:
- You understand exactly what telemetry is collected
- You can verify client-side redaction logic (open source)
- You run in environments where credential leakage is acceptable risk
- You trust the vendor’s security practices
Avoid if:
- You work with production secrets in the terminal
- You cannot audit what data leaves your machine
- You need compliance with strict data residency rules
- You prefer local-only AI features
The broader lesson: any developer tool that adds AI features and cloud connectivity creates a new exfiltration surface. Treat terminal telemetry like you would treat logging in a production application. Assume everything you send to the cloud will eventually leak, and design accordingly.
Agent traces are useful for debugging, but they should never leave the local machine unless you have explicit, granular control over what data they contain. The default should be zero telemetry, not zero data retention.