DEV Community

Cover image for Claude Code email-sharing reports: 6 checks for what your coding agent sends out in 2026
Anna
Anna

Posted on Edited on

Claude Code email-sharing reports: 6 checks for what your coding agent sends out in 2026

A coding agent can leave a clean diff and an uncomfortable privacy question behind it. Getting agent-generated code merged sooner with fewer rollbacks matters, but a request carrying personal information to a website needs a different control from PR review.

I would separate those questions before trusting any coding agent with network access. For a high-velocity team, the practical starting point is small: know which identity the agent can reach, what it can send, and which boundary stops an unwanted request before execution.

The Claude Code privacy reports make that distinction unusually concrete. Reading them as proof that every request contains an email would overstate the evidence. Reading them as a problem that ordinary PR review automatically catches would miss the boundary entirely.

A reported privacy failure is not the same as a universal header

On November 5, a user opened Claude Code issue #107757, alleging that the tool disclosed their email in web-request User-Agent headers without permission. The reporter also attributed an increase in scam emails to that disclosure.

The report lists macOS and Claude Code 2.1.318. Other commenters describe similar concerns or tests of the safeguard. The reporter's exposure, the commenters' logs and any causal link between email-bearing requests and spam remain independently unverified here.

A later Hacker News comment from lydia_hallie, who says they work on Claude Code, acknowledges a mechanism: the account email was provided in model context, and the model sometimes inserted it into custom curl User-Agent headers as contact information.

The commenter says the email will be removed from that context in an upcoming release. An announced change is not a verified shipped fix. The same comment acknowledges that a built-in safeguard does not cover every case, including a script the agent writes and runs.

Custom requests versus the ordinary client header

In the surrounding HN discussion, eightysixfour posts a standard Claude Code header with no email. A normal client label and a custom header written for a particular task are different evidence.

A clean standard header does not disprove the reported custom-request behavior. Conversely, a custom request containing an address does not establish that the networking layer automatically attaches that address to every request.

The useful question is narrower: which information can a model place into a request it composes, and what requires approval before that request leaves?

  1. Check which identity the agent can reach
  2. Check every outbound route, including User-Agent
  3. Check scripts as well as visible shell commands
  4. Check the actual permission and network boundary
  5. Check the version and the safeguard's documented limits
  6. Check what the receiver and your evidence actually show

1. Check which identity the agent can reach

An account email in context is one source of identity. Repository history, author configuration, documentation and project files can supply others. Removing an account field may limit exposure without making the rest of the working environment anonymous.

I would inventory identity sources by category, not copy actual personal values into an audit ticket. A record can say "personal account identity available" or "repository author identity available" without creating another address list.

The distinction matters when a team uses separate work and personal identities. A request that legitimately needs an operator contact does not automatically need whichever address happens to be easiest for the model to find.

An approved public contact address is a policy choice. The agent should not substitute a personal address when that contact is unavailable. A destination's request for contact details is information about its access requirements, not permission from the user to disclose identity.

2. Check every outbound route, including User-Agent

User-Agent is a visible part of this report, but the privacy question is about the whole request. An address, project name or internal identifier can appear in a URL, another header, a request body or an uploaded file.

A synthetic request can illustrate the review without using anyone's identity:

Destination: approved.example
User-Agent: research-client/1.0
Query: public search terms only
Body: none
Attached files: none
Contact identity: absent unless explicitly approved
Enter fullscreen mode Exit fullscreen mode

HTTPS protects a request in transit. The receiving service still receives the headers and other request data addressed to it. A sensitive value is not private from the destination because the connection is encrypted.

Project names deserve attention alongside email addresses. A generic client label and a label assembled from a confidential project title reveal different things, even when neither contains a personal address.

A synthetic outbound request showing the places where identifying data can appear. HTTPS protects data in transit; the receiving site sees the request.

3. Check scripts as well as visible shell commands

A shell invocation can look harmless because the request lives elsewhere. Reviewing only python fetch.py says little about the headers, payload and file reads inside fetch.py.

The official privacy-mod README explicitly lists scripts, files and runtime-computed values among its limitations. A command-text check is not equivalent to following every value through the program that command launches.

For a proposed request, the relevant evidence includes the current script contents and the inputs the script will read. A previously approved script may behave differently after an edit or with a different environment.

Approval should describe the action actually under consideration. Permission to retrieve public documentation is not blanket permission to run any newly generated helper that happens to retrieve documentation too.

A trusted execution boundary should remain intact when a request is indirect. Moving the same data into a file or helper does not make the disclosure acceptable. An unexpected route is a reason to stop and inspect the request, not to search for a form the check misses.

4. Check the actual permission and network boundary

A rule written in prose expresses intent. A permission decision controls an action. Network isolation constrains which connections can occur. Each layer answers a different question, and calling all three "guardrails" can hide important gaps.

Anthropic's security documentation distinguishes command-text deny rules from sandbox network isolation. The documentation also separates permission modes: a classifier reviewing an action is not the same mechanism as a person approving that action.

A team should therefore know which mode is active and what an existing allow rule permits. An approval made earlier can affect later behavior; the presence of a permission system alone does not describe the effective policy.

For sensitive work, I would pair limited accessible data with enforced destination restrictions and narrowly scoped credentials. The exact implementation depends on the host and execution environment, so a generic checklist should not promise that one setting covers every tool.

5. Check the version and the safeguard's documented limits

In the issue, poteat describes cc-plugin-privacy as enabled by default in 2.1.317 and later. Some commenters report the safeguard missing or not refusing their tests. The comments are reports, not independently verified tests.

The official README describes a narrower check than a general personal-data filter. Certain shell tool inputs are refused when they contain the signed-in account address and name a User-Agent. The document describes text matching rather than parsing all possible request behavior.

The HN acknowledgement describes a check that asks before certain calls. The README says matching calls are refused without a prompt. I would preserve that difference rather than combine the descriptions into a broader protection claim.

The README also excludes web tools, addresses in other request locations, and several indirect forms. The document's own description is deliberately limited. A version containing the safeguard is not evidence that all outbound personal data is blocked.

Version, enabled configuration and documented coverage belong in the same record. A future release announcement should remain an announcement until the actual release and behavior have been checked.

6. Check what the receiver and your evidence actually show

A transcript can show a proposed command. A tool result can show that a command ran. Authorized destination logs may show a received request. None of those observations should silently stand in for the others.

A failed request can still be worth investigating, but an intended header does not prove a particular server stored it. Equally, a successful command does not establish which information a downstream service retained or later used.

For an authorized investigation, redacted local records and controlled destination logs are stronger than an agent's retrospective assurance. Real personal addresses and credentials do not belong in screenshots, public comments or a shared troubleshooting example.

The spam allegation needs a separate causal chain. An inbox change can motivate investigation without proving the source. The evidence reviewed here does not establish that the reporter's scam emails came from the reported headers.

Choose Qodo when outbound policy also needs enforceable code-review rules

Qodo, the AI code review platform, belongs on the committed-change side of this problem. Qodo's PR review can flag request-building code and configuration against team rules. An ad hoc research request may leave no PR diff at all.

Review before the PR helps bring feedback earlier. Cross-repo context, learning from the team and high-signal findings support the review of changes that span code and policy. None of those capabilities is a claim that Qodo observes every runtime request.

High-velocity teams get the rule files they already have, checked on every PR, with setup in minutes and no new process. Enterprise engineering teams get one rule set across many repos and agents. Both need separate runtime controls for data that can leave before a PR exists.

Qodo no longer offers test generation; it focuses on AI code review and code governance. In my experience, Qodo is best at reviewing committed request-building code against a team's privacy rules.

Keep privacy-sensitive decisions with a person

Review rules can make privacy expectations explicit: approved contact identities, allowed destinations and restrictions on uploading project files. Qodo's PR review checks committed changes against those rules on every PR; runtime enforcement remains separate.

A reviewer still needs to assess exceptions and evidence outside the diff. Cross-repo context can help connect a shared request helper with its callers, but an ad hoc request may never appear in committed code.

Qodo flags; your team decides. High-signal findings support a human review decision; outbound controls must act before sensitive data leaves the machine.

Runtime privacy controls govern outgoing requests while code review assesses committed changes.

FAQ

Does Claude Code send my email to every website?

The sources reviewed do not establish universal behavior. The HN acknowledgement describes the model sometimes inserting context email into custom requests. The original user's exposure and spam allegations remain independently unverified here.

What does cc-plugin-privacy actually block?

The README describes certain shell inputs containing the account email and a User-Agent reference. The documented limits include indirect values and other request locations. A narrow check should not be described as a complete outbound privacy boundary.

Can a PR review detect data sent during an agent session?

A PR review can review committed code or attached evidence, not automatically reconstruct unrelated runtime traffic. Qodo's AI code review guide covers the review layer; outbound enforcement remains a separate responsibility.

Does an email-free User-Agent prove nothing sensitive left?

No. Another header, query, body or attachment may carry information. A clean header establishes only what was absent from that header in the request observed.

Has the reported behavior been linked to spam?

The original reporter makes that connection, but the reviewed evidence does not independently establish causation. Keeping the allegation separate from the acknowledged mechanism makes the privacy analysis more useful, not less serious.

Top comments (0)