DevelopmentNew Release14 min readPublished August 21, 2026

Fail-closed by default · public / private / unknown · a narrowing, not a leak

eve 0.44.0 Made Agent Traces Public-Only by Default

eve 0.44.0 shipped on August 21, 2026 with a new default: a content-bearing trace is created only for conversations the framework classifies as public, while private and unknown conversations fail closed. That is a narrowing of what gets captured, not a widening of who can see it. The EVE_TRACES_CONTENT variable is gone outright, and two sibling releases in the same week each removed a framework tool.

DA
Digital Applied Team
Senior strategists · Published Aug 21, 2026
PublishedAug 21, 2026
Read time14 min
Sourcesvercel/eve releases, PRs, issue
Audiences traced, hosted default
1/3
public only · private + unknown fail closed
Minor releases, Aug 17 to 21
6
0.39.0 through 0.44.0
Framework tools removed
2
task_peek (0.40.0) · task_sleep (0.42.0)
Local capture cap per value
32KB
public + unknown local sessions

eve 0.44.0, published on August 21, 2026 at 16:07 UTC, changed the default for agent trace visibility: a content-bearing trace is now created only for conversations the framework classifies as public, while private and unknown conversations fail closed. The release note phrase, “public-only by default,” reads two ways in English, and one of those readings is a leak. It is not a leak. This is a narrowing, and the merged pull request says so in its own words.

The stakes are concrete for anyone running an agent on a messaging surface. A trace can carry system prompts, prompt messages, model responses, and tool arguments and results. Before this release, whether that content was captured was a single static switch with no idea who the conversation was with. After it, the framework refuses by default to create a content-bearing trace for anything it cannot positively classify as public. The same release removed the EVE_TRACES_CONTENT environment variable outright, which means an upgrade silently changes local behaviour for anyone who still has it set.

This post is the delta on top of our eve launch coverage, not a re-introduction. It resolves the direction of the change with verbatim evidence from PR #2335 and the documentation diff in PR #2343, walks through the before-and-after by surface, gives you an upgrade checklist, and reads the five sibling releases from the same week for behaviour changes rather than as a feature tour.

Key takeaways
  1. 01
    The direction is fail-closed. Read it that way.The default process-wide tracePolicy retains only conversations classified as public; private and unknown are rejected. The gate also applies to adopted sampled contexts, so an incoming traceparent cannot bypass it. Nothing became visible to anyone new.
  2. 02
    Before 0.44.0 there was no audience concept at all.Trace content capture was a blanket on/off toggle. Custom exporters recorded metadata without inputs or outputs by default, and local eve dev traces omitted content unless you set EVE_TRACES_CONTENT=on in .env.local.
  3. 03
    The one place it widens: local eve dev.Public and unclassified local HTTP/TUI sessions now capture prompts, responses, and tool arguments and results by default, capped at 32 KB per value. Private local sessions still fail closed. The env var that used to gate this was removed, not redefaulted.
  4. 04
    Two independent gates: create, then export.tracePolicy decides whether a trace exists; exportPolicy redacts or drops what an accepted trace carries. Widening one does not weaken the other. The default gate applies unconditionally; the policy-authoring API sits behind experimental.instrumentationProviders.
  5. 05
    Six releases in five days, two tools removed.0.39.0 through 0.44.0 landed between Monday and Friday. task_peek (0.40.0) and task_sleep (0.42.0) were removed, task.send reports delegated results in-process (0.43.0), and chatgpt() graduated to a stable API (0.39.0).

01What ShippedOne changeset, two gates, and a carve-out for local dev.

The eve 0.44.0 release was created on GitHub at 16:05 UTC on August 21, 2026 and published at 16:07 the same afternoon. Its changeset is a single sentence: “Make traces public-only by default while retaining unclassified HTTP/TUI sessions in zero-config local tracing, and add composable input/output redaction, span filtering, and attribute filtering to the export pipeline.” The commit behind it, 47e8b64, is titled “feat(eve): configure audience-aware tracing (#2335)” and its body describes “ordered managed export policies for the narrowed audience contract.” The word the author chose is “narrowed.”

Read together, the changeset and the commit describe three distinct pieces of behaviour. The first is a gate on whether a trace is created at all. The second is a carve-out so that zero-config local tracing keeps working for ordinary local testing. The third is a composable export pipeline that redacts or drops content from traces that did get created. Each has its own rule, and the upgrade checklist later in this post treats them separately.

Gate 1 · creation
tracePolicy
({ audience }) => audience === "public"

Decides whether a content-bearing trace exists. The default retains only conversations classified as public; private and unknown remain fail-closed. The gate also applies to adopted sampled contexts, so an incoming traceparent header cannot bypass the local audience policy.

Default applies unconditionally · not flag-gated
Local carve-out
eve dev
public + unknown admitted · private rejected

Zero-config local tracing additionally admits unknown for local HTTP and TUI debugging while continuing to reject private. Local traces now retain model and tool content for those sessions by default, with each captured value capped at 32 KB.

Replaces the removed EVE_TRACES_CONTENT=on opt-in
Gate 2 · export
exportPolicy
redactSpanInputs · redactSpanOutputs · composeSpanExportPolicies

Accepted traces capture complete spans and continue through the export pipeline, where helpers compose in declaration order with span drops and attribute drop or replacement. A trace policy that admits another audience does not bypass this pipeline.

Authoring API behind experimental.instrumentationProviders
Scope note
The documentation PR is explicit that the configurable policy-authoring API (otel(), otelIntegration(), and provider-directory instrumentation) remains behind experimental.instrumentationProviders. The default gate itself, public-only trace creation plus local dev capturing content for public and unknown sessions, is not flag-gated and applies to every project that upgrades.

02Direction“Public-only by default” is a narrowing, not a leak.

The phrase is genuinely ambiguous English, and it is worth saying so before resolving it. “Traces are public-only by default” can mean that traces are only created for public conversations, or it can mean that traces are, by default, public. The first reading is a privacy narrowing. The second would be a serious visibility widening in a framework that ships iMessage and SMS channels. Secondary coverage that summarises the release-note surface text alone is likely to leave the question open or pick the wrong side.

Three primary layers inside the vercel/eve repository settle it, all dated August 21, 2026 or created earlier that day. The release note uses “retaining” for unclassified local sessions, which only makes sense if everything else is being dropped. The commit message says “narrowed.” And the body of PR #2335, written by the same author, states the mechanism in one sentence.

"The default process-wide tracePolicy retains only conversations classified as public; private and unknown remain fail-closed."— Chad Hietala, PR #2335 description, vercel/eve, August 21, 2026

“Fail-closed” is the operative term. For a private or unknown conversation, no content-bearing trace is created at all unless a developer writes a custom policy that admits it. The same PR adds that the gate applies to adopted sampled contexts, so an incoming traceparent header from an upstream service cannot be used to bypass the local audience policy. Audience is exported only on the agent.session span and is carried to child spans through durable state and internal OpenTelemetry context.

The originating issue confirms the intent from the other side. Issue #2331 describes the problem being solved as trace destinations choosing input and output capture statically, while messaging agents need to retain content for positively public conversations and redact the rest. The motive stated there is a design gap, not an incident. No CVE, breach, or customer complaint appears in the release notes, the PR, or the issue, and this post does not invent one.

How to state it precisely
“Public-only by default” means eve will only create a content-bearing trace, and only forward it to a configured export destination, for conversations it classifies as public. Everything else is dropped unless a developer explicitly widens the policy. It is the framework refusing, by default, to capture or export content for anything it cannot positively confirm is public-facing. Do not write, or repeat, that trace data became visible to the public internet. That is backwards.

03Before and AfterWhat each surface did before 0.44.0, and what it does now.

The cleanest evidence for the direction of the change is the documentation diff itself. PR #2343 is docs-only and rewrites docs/guides/instrumentation.md and the CLI reference. The lines it removes describe the old default; the lines it adds describe the new one. Placing them side by side shows that “previously everything was traced and now it is locked down” is the wrong mental model. The old default was blanket opt-in silence. The new default is conditional, audience-gated visibility that is open for public traffic and closed for everything else.

eve trace behaviour before and after version 0.44.0, broken down by surface: hosted and exported traces, local eve dev tracing, and configuration variables, with the primary source for each row.
SurfaceBefore 0.44.0After 0.44.0Evidence
Hosted and exported traces
Trace creationNo audience concept. Whether content was recorded was a static, destination-level choice.Gated by tracePolicy. Default retains public only; private and unknown are fail-closed.PR #2335 body · issue #2331
Custom OTel exporter content“eve records metadata without model or tool inputs and outputs by default.” Content categories were opt-in after reviewing the exporter’s retention path.Accepted traces capture complete spans; the export pipeline redacts or drops via exportPolicy. Rejected audiences never reach the exporter.instrumentation.md diff (removed vs added lines)
Incoming traceparentNot audience-checked, because no audience policy existed to check it against.Adopted sampled contexts go through the same gate; an upstream header cannot bypass local audience policy.PR #2335 body
Local eve dev tracing
Public or unknown local session“Local traces omit model and tool inputs and outputs by default.” Content required EVE_TRACES_CONTENT=on in .env.local.Content retained by default: system prompts, prompt messages, model responses, tool arguments and results, each value capped at 32 KB.instrumentation.md + cli.md diff
Private local sessionNot distinguished from any other local session; traced with content omitted by default.Not traced by default. A custom tracePolicy can admit it, paired with a local export policy for redaction.instrumentation.md diff
Configuration
EVE_TRACES_CONTENTDocumented in the CLI reference; off by default; set to on to capture local content.Row removed from the CLI reference. The variable is gone, not redefaulted.cli.md diff
EVE_TRACES, _MAX_AGE_MS, _MAX_TOTAL_BYTES, _RETAIN_COUNTPresent.Unchanged.cli.md diff (unchanged rows)

One row deserves honesty: the local dev row is the one place this release is arguably a widening. For a local eve dev session classified public or unknown, which covers ordinary local HTTP and TUI testing, full content is now captured by default where it previously required a manual opt-in. That content stays in the local trace store on the developer’s machine, and the store’s budget is unchanged, but a team that treated local traces as metadata-only should know the default moved. Private local sessions still fail closed.

04Audience VocabularyThree values shipped. The design issue proposed four.

The shipped vocabulary is public, private, and unknown. Every sentence in PR #2335 and every example in the PR #2343 documentation diff uses those three values and no others. eve’s own documented default, expressed as code, is a one-line policy:

import { otel } from "eve/instrumentation/otel";

export default otel({
  tracePolicy: ({ audience }) => audience === "public",
});

There is a terminology discrepancy worth naming so that nobody writes a policy against values that do not exist. Issue #2331, which motivated the work, proposed a four-value vocabulary: public, restricted, direct, and unknown. Its problem statement talks about “redacting direct, restricted, and unclassified conversations.” The merged code and documentation collapse that into three values. Treat restricted and direct as design-history terms, not as live API values, until the repository’s own docs say otherwise.

public
Positively public conversation

The only audience the default tracePolicy retains. A content-bearing trace is created, complete spans are captured, and the trace continues through the export pipeline where an exportPolicy can still redact or drop.

Traced by default
private
Positively private conversation

Fail-closed everywhere by default: rejected by the process-wide gate and also rejected by zero-config local tracing. A custom tracePolicy can admit it, and the docs tell you to pair that with a local export policy that redacts content.

Fails closed
unknown
Unclassified conversation

Fail-closed for the process-wide default. Admitted only by the zero-config local carve-out, so that an ordinary local HTTP or TUI session still produces a useful trace during development.

Closed hosted · open locally
restricted · direct
Proposed in issue #2331, not shipped

Appear only in the originating design issue's four-value proposal. Neither is referenced in the PR #2335 body or the documented tracePolicy and exportPolicy examples. Do not write policies that test for them.

Not an API value

The reason the vocabulary matters is that a policy is just a predicate over the audience. A messaging agent that wants to trace its public support channel but nothing else already has what it needs with the default. A team that wants traces for private channels must say so in code, and the framework makes that a visible, reviewable decision rather than an environment flag somebody set months ago. That is the right shape for a default in a framework that added a first-class iMessage and SMS channel the day before.

05Export PipelineAdmitting an audience does not bypass redaction.

The second half of the changeset is the export pipeline. Once a trace is accepted, it captures complete spans and then runs through an ordered set of export policies. The PR #2343 diff documents four named helpers, agentRuns, composeSpanExportPolicies, redactSpanInputs, and redactSpanOutputs, plus inline span and attribute policy objects that drop a span by name or keep or replace an attribute by key. The documented example composes all of them:

import {
  agentRuns,
  composeSpanExportPolicies,
  redactSpanInputs,
  redactSpanOutputs,
} from "eve/instrumentation/otel";

export default agentRuns({
  exportPolicy: composeSpanExportPolicies(
    redactSpanInputs(({ audience }) => audience !== "public"),
    redactSpanOutputs(({ audience }) => audience !== "public"),
    {
      span: ({ name }) => name !== "internal.cache.refresh",
      attribute: ({ key }) =>
        key === "user.email" ? { action: "replace", value: "[redacted]" } : { action: "keep" },
    },
  ),
});

Two properties of this design are worth more than the API names. First, composition is ordered: the documentation states that composed policies run in declaration order, so the span and attribute policy in the example receives the facade already produced by the input and output redactors. Second, the two gates are independent. The docs say it directly.

From the merged instrumentation guide
“A trace policy that admits another audience does not bypass this export pipeline; the export pipeline can still redact it.” In practice: tracePolicy answers does this trace exist, and exportPolicy answers what does it carry when it leaves. Widening the first does not weaken the second.

For teams that already maintain a redaction layer in front of their observability backend, the natural move is to express it here rather than downstream, because the export pipeline sees the span before any exporter does. The patterns in our AI output PII redaction guide map directly onto redactSpanInputs and redactSpanOutputs, and the attribute-level replace action is the right home for identifiers like an email address that you want present as a marker but never as a value. The anti-patterns we catalogued in our trace-quality post mostly come from capturing everything and filtering later; this pipeline inverts that order.

06Upgrade ChecklistSix things to check before you bump to 0.44.0.

None of this is a large migration. It is a short list of defaults that moved, and one variable that stopped doing anything. Work through it in order.

  1. Delete EVE_TRACES_CONTENT from .env.local and from any shared env template. The CLI reference drops the row outright in PR #2343. If it is still set, it silently does nothing, and the comment next to it will mislead the next engineer. This is the one item the release notes do not call out and the one most likely to be missed.
  2. Decide, in code, which audiences you trace. The default is public only. If your agent serves a private channel and you need traces for it, write a tracePolicy that admits it and put it through review. That requires the policy-authoring API, which sits behind experimental.instrumentationProviders.
  3. Pair any widened tracePolicy with an exportPolicy. The docs instruct exactly this for private local sessions. The export gate is independent, so the redaction you write there holds even if somebody later widens the creation gate again.
  4. Check whether local eve dev traces now hold content you did not expect. Public and unknown local sessions capture system prompts, prompt messages, model responses, and tool arguments and results, each value capped at 32 KB. If developers test against real customer data locally, that content now lands in the local trace store by default.
  5. Confirm your upstream services are not relying on traceparent to force tracing. Adopted sampled contexts now pass through the same audience gate, so a sampled upstream request to a private conversation no longer produces a content-bearing child trace.
  6. Re-read your exporter’s retention path. The old docs told you to enable content categories only after reviewing it. That advice did not go away; it moved from a blanket switch to a per-audience policy, and the review is now per audience.
Per captured value
Local content cap
32KB

Each captured value in a public or unclassified local HTTP or TUI span is capped at 32 KB: system prompts, prompt messages, model responses, and tool arguments and results.

New wording in the CLI reference
Local trace store
Total size budget
512MB

The local store's total-bytes budget is one of the CLI reference rows PR #2343 leaves untouched. Content capture moved; the storage ceiling it lands in did not.

EVE_TRACES_MAX_TOTAL_BYTES · unchanged
Local trace store
Maximum age, newest 20 kept
7days

Traces older than seven days are pruned, with the newest 20 always retained. Also unchanged in this release, which matters because local content capture now fills the store faster.

EVE_TRACES_MAX_AGE_MS · EVE_TRACES_RETAIN_COUNT

If you want a broader pass than this release-specific list, our 60-point agent observability audit covers the retention, access, and redaction questions that sit around any tracing default, and the build-log secret redaction Vercel shipped in July is the same redact-by-default instinct applied one layer up the stack.

07Release WeekSix releases in five days, read for behaviour changes.

0.44.0 was the sixth minor eve release tagged between Monday, August 17 and Friday, August 21, and the second that Friday; 0.43.0 had published at 12:03 UTC, about four hours earlier. Three of the six landed on August 20 alone. The table reads each release for what changed in behaviour, one line each, with the GitHub release as the only source. These are framework-internal API changes that only the vendor can authoritatively state, so treat every row as vendor-stated release-note content rather than independently audited fact.

The six eve minor releases tagged between August 17 and August 21, 2026, with each release’s UTC publish timestamp, the behaviour change it introduced, and the type of change, sourced to the GitHub release notes.
VersionPublished (UTC)What changedType
0.39.02026-08-17 21:49ChatGPT-subscription models promoted to the stable chatgpt() API with Codex-owned authentication, automatic token refresh, and local-only deployment safeguards. The experimental_chatgpt() alias remains available.Feature graduation
0.40.02026-08-20 04:55task_peek removed from experimental background tasks; completed results and failures now arrive directly in task notifications. Bundled Workflow SDK bumped to the 5.0.0 beta line for a replay-determinism fix on branch wake order.Tool removal + dependency bump
0.41.02026-08-20 20:33First-class Linq iMessage and SMS channel with managed Vercel Connect and portable credential setup paths. Setup can provision a new Linq account and line or connect an existing account with its partner API token.New channel
0.42.02026-08-20 21:06task_sleep framework tool removed. Task-mode parents now rely on lifecycle notifications instead of model-paced waits, which changes how a parent agent behaves while a delegated task runs.Tool removal · behaviour change
0.43.02026-08-21 12:03Background tools can report a delegated task’s terminal result in-process via task.send({ kind: "complete" | "fail" | "cancel", ... }) without minting a callback URL. Native Agentcard MCP connection added to the registry through Vercel Connect.New API + new connection
0.44.02026-08-21 16:07Traces gated public-only by default with private and unknown fail-closed; composable input and output redaction, span filtering, and attribute filtering in the export pipeline; EVE_TRACES_CONTENT removed.Default security-posture change

Two of those rows are behaviour changes in the strict sense. A parent agent written against 0.41.0 that called task_sleep to wait on a delegated task no longer has that tool after 0.42.0 and must rely on lifecycle notifications instead. Likewise task_peek is gone after 0.40.0, with results and failures delivered in the notification itself. The 0.43.0 task.send addition is the constructive half of the same redesign: a background tool reports its terminal result in-process rather than by minting a callback URL. Read in order, 0.40.0, 0.42.0, and 0.43.0 are one story about task lifecycle, and 0.44.0 is a separate story about what a trace is allowed to contain.

Nothing in the week changed eve’s licence or status. The repository remains Apache-2.0 and the framework remains in beta, as it was at launch in June. The separate Agent Runs dashboard, with its Developer and Business modes and retention tiers, was announced on June 26, 2026 and is background context here, not part of this week’s releases.

08ImplicationsWho needs to act, and who can just upgrade.

The interesting trend is not the release itself but what it says about where agent-framework defaults are heading. Most of the observability tooling we work with trains teams to capture everything and filter at the backend. This release moves the decision to the framework boundary and makes the conservative choice the one that requires no code. Combined with the export pipeline’s ordered, reviewable policies, the effect is that an agent’s privacy posture becomes something you can read in a single file rather than infer from an environment and a dashboard setting.

Messaging agents
Private or mixed-audience channels

iMessage and SMS surfaces are exactly what the audience gate was designed around. If you need traces for private conversations, you must now write a tracePolicy to admit them and an exportPolicy to redact them. The default gives you public channels only.

Act: write both policies
Custom OTel exporters
Teams with their own backend

Content capture was already off by default for you before 0.44.0, so the hosted-side change is smaller than the headline. The real work is moving any downstream redaction into redactSpanInputs and redactSpanOutputs so it runs before the exporter.

Act: relocate redaction
Local dev only
No hosted tracing yet

Your default moved the other way: public and unknown local sessions now capture content without EVE_TRACES_CONTENT=on. Delete the variable, check what test data developers run locally, and note the 32 KB cap and unchanged store budget.

Act: delete the env var
Evaluating eve
Not yet in production

A fail-closed trace default and a composable export pipeline are the right things to find in a framework you are about to trust with customer conversations. Weigh them alongside the beta status and the two tool removals this week, which argue for pinned versions and a real upgrade cadence.

Upgrade: nothing to unwind

Looking forward, the shape of this change suggests the audience concept will spread beyond tracing. Once the framework knows whether a conversation is public, private, or unknown, that signal can gate more than spans. It is the same signal a memory layer, a logging sink, or an evaluation dataset would want, and it is already carried through durable state to child spans. Whether Vercel takes it there is not something the release notes say, so treat that as our projection rather than a roadmap. What the notes do establish is that private and unknown audiences are now rejected by default at the trace boundary, and that any wider policy is a deliberate, reviewable choice.

If you are building a customer-facing agent on eve or deciding between frameworks for one, this is the kind of default we check first in our AI transformation engagements, and the instrumentation and redaction policies are the sort of code our web development team writes alongside the agent itself rather than after the first incident.

09ConclusionThe default moved toward silence, and that is the point.

The shape of the change, August 2026

Public-only by default means fail-closed by default.

eve 0.44.0 gates trace creation by conversation audience. Only conversations classified as public produce a content-bearing trace by default; private and unknown are fail-closed, an incoming traceparent cannot bypass the gate, and the export pipeline can still redact whatever a custom policy admits. The phrase in the release note is ambiguous; the PR body, the commit message, and the documentation diff are not.

The upgrade work is small and specific. Remove EVE_TRACES_CONTENT, which no longer exists. Decide in code which audiences you trace. Pair any widened trace policy with an export policy. Check what local eve dev sessions now capture, because that is the one place the default moved toward more content rather than less.

The broader signal is that agent-framework defaults are starting to assume the conversation is private until proven otherwise. That is the correct assumption for software that talks to customers over their own messaging apps, and it is a better default than the capture-everything posture most observability advice still carries. Six releases in five days is a fast cadence for a beta framework; this one was worth reading closely.

Ship agents with a defensible privacy posture

A fail-closed trace default is worth building on.

Our team designs, builds, and operates customer-facing agents with tracing, redaction, and audience policies written alongside the agent itself, delivered in days not quarters.

Free consultationExpert guidanceTailored solutions
What we work on

Agent engineering engagements

  • Framework selection and default-posture review
  • Trace and export policy design for messaging agents
  • Redaction layers that run before the exporter
  • Upgrade cadence and version pinning for beta frameworks
  • Observability audits against our 60-point checklist
FAQ · eve 0.44.0 trace defaults

The questions we get every week.

No, and this is the one thing to get right. It means eve creates a content-bearing trace only for conversations it classifies as public. Private and unknown conversations are fail-closed by default: no content-bearing trace is created for them unless a developer writes a custom tracePolicy that admits them. The PR #2335 description states it directly: the default process-wide tracePolicy retains only conversations classified as public, and private and unknown remain fail-closed. The commit message describes a narrowed audience contract. Nothing in the release makes trace data visible to anyone who could not see it before; the change is about what gets captured, not who can view it.
Related dispatches

Continue exploring agent infrastructure.