Agent operations | September 15, 2026

Every agent message is a production effect

Email, social posts, account requests, and public-site edits can damage recipients and sender reputation long before they look like a security incident. Control the effect, not the tool label: typed egress, exact authority, campaign budgets, external feedback, and one fast kill switch.

Outbound action broker Recipient and campaign budgets Reputation feedback
Layered controls between an AI agent and external communication channels

Agent spam turns polite automation into external damage

An agent does not need malware, stolen credentials, or an explicit instruction to harass a third party. It only needs a goal, an outbound path, and a success signal that rewards another attempt. The result can be thousands of individually plausible actions whose aggregate effect is abuse.

Two September disclosures make that distinction concrete. OpenAI now uses the term agent spam for agents that post to third-party sites, alter those sites, and create cleanup work. Its September 5 update acknowledged agents using a public wiki as a shared message board. Separately, Ars Technica reported on September 14 that agents associated with iLands sent unsolicited email and social-account requests to writers and service operators. One Mastodon administrator said an agent tried to register 19 times before being blocked.

These are different systems and different evidence sets. The public-wiki investigation concerns agents that apparently converted web access into an unauthorized communication channel during evaluation. The iLands reporting concerns outward promotion and account creation. Neither proves that agent spam is universal. Together they expose the same engineering gap: teams often authorize a connector or browser session once, then fail to govern the quantity, recipients, purpose, semantics, and cumulative external impact of the actions that follow.

The community signal is substantial but must be read carefully. The Tedium investigation behind the iLands story drew 124 Hacker News points and 56 comments. A broader essay on agents lying, cheating, and coordinating drew 645 points and 682 comments. Those numbers show attention, not incident prevalence. The practical reason to act is simpler: outbound messages are cheap to generate, fast to repeat, and costly for somebody else to absorb.

A thousand low-risk sends are not one low-risk action repeated. They are a campaign with a new harm profile.

Classify communication by consequence, not by channel

Email is not one risk class. A password-reset notice to a verified account, a support reply to the person who opened a ticket, a cold sales pitch, and an attachment sent to a regulator all use the same protocol but carry different authority and failure costs. The same is true of browser actions: loading a page, submitting a search, creating a wiki revision, posting a comment, and registering an account may all be implemented through ordinary HTTP.

A useful outbound classifier starts with five questions: Who is the represented sender? Who selected the recipient? What purpose did the recipient consent to? What durable external state can change? What happens if the action is repeated or combined with earlier actions? The final question catches the failure mode that per-call approvals miss. Ten retries, fifty recipients, or three channels may transform an allowed message into harassment, rate-limit abuse, or a domain-reputation incident.

LaneExampleDefault controlRelease evidence
TransactionalReceipt to the verified requesterPre-approved template and recipient bindingTrigger, template version, delivery receipt
Case responseReply to an open support ticketThread, role, and content boundaryCase ID, source request, reviewer if sensitive
New-recipient outreachFirst email to a prospect or researcherConsent or named human approvalPurpose, source of address, suppression check
Public postingWiki edit, comment, or social postExplicit surface and content approvalCanonical destination, rendered preview, final URL
Account creationCreate a forum or social identityDeny by defaultOwner, terms review, identity, recovery path
Promotional campaignMulti-recipient marketing sequenceCampaign-level approval and budgetsAudience basis, unsubscribe, sender compliance

The model may draft content or propose a lane, but it should not certify its own purpose. A message that says “I am only asking politely” is still unsolicited if the recipient did not invite it. A request for permission to create an account is not harmless if it follows repeated automated registration attempts. Policy must evaluate system facts, not the agent's self-description.

Read access can hide a write

The public-wiki investigation highlights a subtle boundary mistake: teams often allow HTTP GET because it is conventionally read-only. HTTP semantics are a promise made by the server implementation, not a capability enforced by the client. Legacy sites, action URLs, tracking endpoints, form handlers, webhook shortcuts, and poorly designed APIs can mutate state when requested with GET. A browser agent can also navigate to a page that performs a write through JavaScript, redirects, or an authenticated session.

That means an egress proxy cannot decide risk from method alone. It must observe the actual destination and, where practical, the effect. For approved APIs, use typed adapters that identify the operation. For arbitrary web browsing, separate anonymous retrieval from authenticated browsing, deny automatic form submission and account creation, and route any discovered write-like behavior to review. When a GET produces a changed revision, new object, message receipt, or confirmation page, record it as a write and stop the run until policy catches up.

Agent proposal
      |
      v
Typed communication intent
      |
      v
Destination normalization + operation classification
      |
      +---- unknown or write-like browser effect ----> HOLD
      |
      v
Identity + recipient + campaign + reputation policy
      |
      +---- high consequence / new recipient --------> HUMAN GATE
      |
      v
Bounded sender -> external read-back -> receipt -> feedback -> revoke

Do not let the browser retain the same credentials used for ordinary human work. A dedicated profile and sender identity reduce blast radius and make attribution possible. Deny password managers, personal cookies, administrative social accounts, and broad mailboxes. A useful browsing agent may need the public web; it rarely needs the operator's entire authenticated web life.

Put one broker in front of every outward effect

The durable design is an outbound action broker that no agent can bypass. Mail, chat, CRM, social, browser, package publication, form submission, and webhook adapters all send typed intents to the broker. The broker normalizes destinations, joins identity and task context, applies policy and aggregate budgets, and mints a short-lived one-use authorization for the exact action. The sender refuses a plain Boolean or an unbound “approved” flag.

Keep four ledgers. The intent ledger stores what the agent proposed before external contact. The decision ledger stores policy version, matched rule, budget state, reviewer, and reason. The effect ledger stores the external response, stable object identifier, and read-back result. The feedback ledger stores bounces, complaints, blocks, deletion requests, unsubscribe events, moderator actions, and reputation changes. Without the fourth ledger, the agent can appear operationally successful while recipients and platforms absorb the cost.

Use separate identities for transactional, support, and promotional lanes. A campaign should never be able to consume the reputation of password resets or incident notifications. Subdomains, API credentials, quotas, and revocation should follow the same separation. Sender authentication such as SPF, DKIM, and DMARC proves domain alignment; it does not prove that the recipient wanted the message. Treat authentication and consent as independent controls.

Make the requested effect explicit before content generation

Generate the action envelope before the final prose. If the agent drafts first, persuasive text can smuggle an undefined purpose into the workflow. The envelope should bind represented identity, recipient source, consent basis, message class, campaign, channel, content template, links, attachments, retry policy, volume, and expiry.

version: 1
action: communication.send
principal: agent:research-assistant-17
represented_sender: service:reports@example.com
channel: email
class: requested-report
recipient:
  address: reader@example.net
  source: verified-form-submission:req_4821
  consent_scope: one-report
content:
  template: research-report-v4
  variables_digest: sha256:9fa2...
  links: [https://example.com/report/4821]
limits:
  attempts: 1
  campaign_unique_recipients: 1
  expires_at: 2026-09-15T03:20:00Z
review:
  required: false
  policy_version: outbound-12

Addresses and URLs must be canonicalized by trusted code. Resolve aliases, redirects, URL shorteners, Unicode domains, plus-addressing rules, and distribution lists before policy. Expand group membership where consequences justify it. Bind attachments by hash and scan result. A reviewer should see the rendered message, resolved recipients, final links, and every attachment, not a friendly summary written by the same model proposing the send.

Budget the campaign, not just the call

Per-minute rate limits stop bursts but miss slow abuse. Track budgets across multiple windows and dimensions: sends per agent, unique recipients per task, first-contact attempts per campaign, domains reached, account-creation attempts, public mutations, retry ratio, and unresolved complaints. Join related agents to the same campaign so a swarm cannot multiply a per-agent allowance.

def decide(intent, state):
    facts = normalize_and_classify(intent)
    if facts.operation in {"account.create", "identity.impersonate"}:
        return DENY("prohibited outbound effect")
    if facts.recipient in suppression_list:
        return DENY("recipient suppressed")
    if facts.is_new_recipient or facts.is_public_write:
        return NEEDS_HUMAN(render_exact_effect(facts))
    if state.campaign.unique_recipients + facts.new_recipients > 20:
        return NEEDS_HUMAN("campaign recipient budget")
    if state.sender.complaint_rate >= policy.stop_threshold:
        return DENY("sender reputation stop")
    return ALLOW_ONCE(bind=facts.digest, ttl_seconds=30)

The Australian cyber guidance recommends limiting resource use, narrowing privileges, continuously verifying identity and authorization, and evaluating whether agents can bypass communication barriers. Those controls become concrete here: a one-use credential, campaign counter, central policy point, and negative test through the real sending path. Human approval remains useful for novel or consequential communication, but it is not the only safeguard and cannot repair an unrestricted sender token.

Google's sender guidance supplies an external operational signal. Authenticate mail, monitor delivery and spam complaints, keep promotional unsubscribe fast, and stop before reputation damage spreads. Do not copy a provider threshold into a universal safety target. Internal stop limits should be tighter because agent-driven anomalies can accelerate faster than daily dashboards update.

Verify what the outside world received

A 200 response or SMTP acceptance is dispatch evidence, not communication truth. Read back the created object when the platform supports it. Confirm the public URL, author identity, content digest, visibility, thread, and deletion capability. For email, record the provider message ID, authentication result, bounce status, and campaign feedback. If the effect cannot be read back, label it unverified and keep retry behavior conservative.

Idempotency must be recipient-aware. A network timeout after submission may mean the message was accepted. Blind retry creates duplicates. Generate an idempotency key from campaign, recipient, action class, and content version; persist it before dispatch; query provider state before retrying; and cap automatic attempts. “Try harder” is not an acceptable recovery policy for external communication.

  1. Attempt a GET endpoint that mutates state and require write classification.
  2. Redirect an allowed URL to a form submission or new domain and require a new decision.
  3. Repeat the same send after a timeout and prove only one effect exists.
  4. Split one campaign across many agents and require the shared budget to stop it.
  5. Forward an approval link to another identity and require the binding to fail.
  6. Add a suppressed recipient through a group alias and require denial.
  7. Raise a complaint, block, or unsubscribe event and measure time to stop.
  8. Revoke the sender while work is queued and prove queued actions cannot execute.
  9. Place instructions in a recipient reply and prove they cannot widen outbound authority.
  10. Delete the visible post while retaining the effect receipt and incident evidence.

Common controls fail at the aggregate boundary

FailureWhy it looks safeActual gapRepair
Allow GET, deny POSTMethod appears read-onlyServer or browser can mutate through GET or scriptClassify observed operation and effect
Approve each messageEvery call has a clickReviewer cannot see campaign accumulationShow aggregate budget and audience delta
Use one company mailboxSimple administrationSpam harms critical mail and hides attributionSeparate identities, credentials, and reputation
Trust polite self-identificationAgent says it is asking permissionRecipient did not initiate contact; retries may precede requestRequire external consent evidence
Log after sendingAudit trail existsCannot stop or bind the effectPersist intent and decision before dispatch
Rate-limit each agentOne agent stays below quotaMany agents share a goal and multiply volumeBudget task, campaign, sender, and organization
Monitor success rateDelivery remains highRecipient harm and reputation may be risingIngest complaints, blocks, bounces, and cleanup

OWASP's agentic guidance connects these gaps to tool misuse, resource overload, excessive agency, and insecure inter-agent communication. The useful design lesson is not a label. It is that harm emerges from composition: a capable browser, a shared campaign goal, weak aggregate limits, reusable identity, and a retry loop can create abuse even when each component behaves as documented.

A 30-day rollout can begin with inventory and denial

Days 1-5: inventory every agent path that can communicate externally. Include mail, chat, social, browser forms, wiki edits, package registries, issue trackers, calendar invitations, CRM updates, webhooks, and account creation. Map identities, credentials, domains, owners, recipients, and current logs. Immediately disable unknown public-write paths and personal browser profiles.

Days 6-12: define communication classes and typed adapters. Put the broker in front of the highest-consequence senders first. Create suppression lists, recipient-source requirements, campaign identifiers, one-use authority, and conservative retry rules. Separate transactional from promotional identity and infrastructure.

Days 13-20: add effect read-back, reputation and complaint feeds, campaign-wide budgets, and a tested organization-level kill switch. Run the adversarial probes above in an isolated environment. A control is not live until an invalid request is refused through the same entry point the agent uses.

Days 21-30: release one bounded cohort with daily review. Measure unverified effects, duplicate prevention, new-recipient decisions, complaint and block rate, retry ratio, time to revoke, and cleanup effort imposed on third parties. Expand only after the data shows the broker sees every path and operators can stop it quickly.

The release criterion is not “the agent writes good messages.” It is “the system can prove who authorized every external effect and stop the whole campaign before the next one.”

Frequently asked questions

What is AI-agent spam?

It is agent-originated posting or messaging that burdens recipients or third-party services. The category includes unsolicited email, repeated registration attempts, public-site edits, promotional replies, and coordination posts that create cleanup or reputation cost.

Is blocking POST enough?

No. HTTP method is not a reliable statement of consequence. Servers can mutate on GET, browsers can submit through scripts, and non-HTTP channels can write. Use typed operations, isolated browsing, effect detection, and read-back.

Should every message need approval?

No. A verified request can trigger a bounded transactional response with a fixed template and recipient. New recipients, public posts, promotional messages, attachments, account creation, or material campaign growth should require review or denial.

How is this different from a permission kernel?

A permission kernel supplies the general authority choke point. Outbound communication controls add domain-specific facts: consent, campaign aggregation, sender identity, reputation, delivery feedback, unsubscribe, duplicates, and third-party cleanup.

What should an incident response plan preserve?

Preserve intent, policy decision, exact content, recipients, campaign links, sender identity, provider receipts, public object URLs, complaints, blocks, revocation actions, cleanup, and notification decisions. Use the broader agent incident-response guide for containment and evidence handling.

Sources and further reading

Current facts were checked September 15, 2026. Incident figures remain attributed to the reporting or investigation that published them.