Repository navigation
Conversation
The cdp-api send route now runs the sandbox sender's gates for a send that resolves to the sandbox integration: sender switch and tenant pause, organization membership over to, cc and bcc, organization block, and a read-only peek at the daily allowances. A refusal answers before the send is queued, and the worker keeps its own checks. The worker's SES envelope now lists each address once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The send route now says whether an accepted send goes out through the project's own sender or the sandbox sender. The idempotency record keeps that answer, so a replay reports the mode of the first send even when the project's sender changed since. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stored sender is read on its own, so a stored cc or bcc that isn't text no longer hides a sandbox sender from the admission check. Worker sandbox events name an API send by its transactional email event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A sandbox code send provisions its integration and queues the send in one request, so the first lookup can reach the read replica before the row does. The loader cached that miss, the admission gate took the send for an own sender, and the worker could fail it as a missing integration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The blocked event's first-in-window check uses a Redis client with no command deadline, so a store that stops answering held the refusal until the caller timed out. The gate now waits at most a second for it. The checks stage's metric help now names the sandbox checks it runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e primary Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of map #461 (sandbox sender for API sends, slice SA1). Sits on
sbx-api/integration-node, a merge of #584 and #587.Problem
Merge Danger
Warning
🔴 Merge risk: high · two-way door: a revert brings back the 202 for every sandbox code send
workflows-sandbox-sender.Changes
400 sandbox_recipient_not_allowed400 sandbox_limit_reached422 sending_suspended503 sandbox_check_faileddelivery_mode(ownorsandbox), and a replay answers with the first send's mode.workflows sandbox email blockedwithsource: api, and waits at most a second for it.How did you test this code?
Test seams: the cdp-api code-send route over HTTP (
cdp-api.serial.test.ts), the worker'sexecuteSendEmail, andIntegrationManagerService.get.Proofs:
fromand areply_toare refused with nothing sent. A replay claims nothing.CI: this PR sits on an integration base until the sandbox stack (through #587) and the send stacks (through #584 and #585) reach master.
Release status
Docs update
docs/internal/workflows-email-sending-tiers.mdis updated in feat(messaging): send code emails through the sandbox sender without a domain #633.🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Agent: Claude Code, Claude Opus 5.5 (claude-opus-5-5)
Skills:
/tdd,/writing-tests,/qa-swarm,/pr-description,/writing-pr-descriptions400 sandbox_recipient_not_allowedand400 sandbox_limit_reached422 sending_suspended, the master code for a suspensionInvolvement: one design pass, a 7-lens security swarm, a 4-lens fix round and one clean final read (GPT-6.1 Sol and Claude Opus 5.5); live-run, cross-version and shadow-diff proof captured.
More context for AI agents
sbx-apiof map Map: send code-managed email templates with one PostHog call #461, Claude Code.reply_to; a suppressed copy can make the allowance check refuse a send the worker would deliver; the worker's owncaptureBlockedcalls, from the sandbox stack, still wait with no deadline.sandbox-send-gate.ts, the envelope change inemail.service.ts, andintegration-manager.service.ts.🤖 Generated with Claude Code