AI Agent Alerts That Explain What Happened and What to Do Next (2026)
Quick summary: Replace "Sales down 15%" with contributors, unknowns, and ranked actions. The 15% is a schema fixture. Reuse Gateway ~180 to 95 ms and ~$791/mo at 50K sessions.
Key Takeaways
- Replace "Sales down 15%" with contributors, unknowns, and ranked actions
- The 15% is a schema fixture
- Reuse Gateway ~180 to 95 ms and ~$791/mo at 50K sessions
- Traditional commerce alerting looks like this: Sales down 15%
- On June 17, 2026, AgentCore Harness reached general availability (What's New)

Table of Contents
Traditional commerce alerting looks like this: Sales down 15%. That string is a fixture in the schema, not a client KPI, and not a FactualMinds measurement. An agent alert must carry a measured delta, contributors with tools, unknowns where tools are missing, and ranked actions with autonomy. If a contributor has no tool, it is an unknown, not a story. The hop contract for “why did revenue move?” is root cause analysis — this post is the payload that lands on a human after those hops (or after you admit you cannot run them). Map the old string to fields: the number belongs in metric only after salesByPeriod returns; the “why” belongs in contributors or unknowns; the “so what” belongs in recommended_actions with autonomy, not in a trailing sentence that implies the work is already done.
On June 17, 2026, AgentCore Harness reached general availability (What’s New). A managed loop can format a Slack message in one invoke. That is not the same as an alert anyone should trust.
AWS lifecycle notice (June 30, 2026) — Amazon Bedrock Agents Classic is in maintenance for new customers after July 30, 2026. Net-new alert agents should use Bedrock AgentCore. Full matrix: lifecycle roundup.
First-party signals we reuse (not eCommerce outcomes) — Gateway server-side tools cut median tool round-trip ~180 ms → ~95 ms on a B2B CRM assistant (12 tools, ~8k turns/day) — Gateway post. Platform TCO silhouette: support-style AgentCore at 50K sessions/mo ~$791/mo platform + model (decision guide). Alert fan-out is cheap; chatty “explain more” threads are not. Model the mix on the AgentCore pricing calculator. Treat ~$791/mo as a platform cost floor to plan against, not as GMV recovered from better alerts.
Reproduce this — Copy
evidence-based-alert-schema.md. Deltas in that file are fixtures. Fill your tools. Series folder:ecommerce-ai-agents-series/.
Opinionated take: ship the schema before the channel. Trade-off: alerts stay quiet until tools exist. You also stop paging leadership with a percentage and a vibe. Detection still lives in monitoring. The morning cap still lives in the daily brief. The always-on rank still lives in the control tower.
FactualMinds is an AWS Select Tier Consulting Partner. We help merchants wire evidence into the page — we do not sell a 15% recovery.
Bare percentage vs evidence-based alert
| Traditional | Agent payload |
|---|---|
Sales down 15% | Headline from salesByPeriod with window and delta as measured |
| A channel story | Contributors with evidence_tool + evidence_ref |
| Silence on gaps | unknowns[] when a hop has no tool |
| “Fix it” | Ranked recommended_actions with autonomy |
| Implicit human | human_required: true unless Policy already allows a narrow auto |
Why this matters / who breaks without it: merchandising pauses the wrong campaign; finance treats a fixture percentage as a board metric; ops marks the alert “done” because the model sounded sure. Baymard 70.22% abandonment is industry context. Pasting it as your cause is a failed eval — same rule as the daily brief and RCA.
The 15% in the artifact is there so the JSON is readable. Replace it. Do not present it as last week’s store.
The schema (fixtures, not outcomes)
Context: JSON Schema-shaped object assembled after a detector fires. Assumed setup: Harness GA June 17, 2026, named Gateway tools, Browser off. From evidence-based-alert-schema.md:
{
"alert_id": "ALT-DEMO-001",
"headline": "Sales declined vs prior week as measured by salesByPeriod",
"metric": { "name": "net_revenue", "delta_pct": -15, "evidence_tool": "salesByPeriod" },
"contributors": [
{
"text": "Advertised SKU DEMO-1 ATP 0 from Tue 14:00",
"evidence_tool": "getInventory",
"evidence_ref": "sku:DEMO-1",
"causation": "possible_contributor"
}
],
"unknowns": ["Paid traffic mix — no sessionsByChannel tool"],
"recommended_actions": [
{ "rank": 1, "action": "Pause ads on DEMO-1", "autonomy": "recommend" },
{ "rank": 2, "action": "Expedite receipt if PO exists", "autonomy": "draft" },
{ "rank": 3, "action": "Do not markdown without pricing owner", "autonomy": "request_approval" }
],
"human_required": true
}causation stays possible_contributor until a human signs a narrative. Correlation is not a board slide. That signing step is why RCA exists as its own post — root-cause investigation playbook.
flowchart LR
Detect[SignalDetected]
Metric[MeasuredDelta]
Hops[RCAHopsOrUnknowns]
Payload[AlertPayload]
Human[HumanOwner]
Detect --> Metric
Metric --> Hops
Hops --> Payload
Payload --> HumanContributors, unknowns, actions
| Field | Allowed | Forbidden |
|---|---|---|
| metric | Delta from a named tool + window | A round percentage with no tool |
| contributors | Claims the tool actually returned | “Google hates us,” “checkout UX,” “TikTok” without a matching tool |
| unknowns | Named missing hops | Omitting the array so the headline looks complete |
| recommended_actions | Ranked, autonomy tagged | Execute by default; markdown as a fact |
| human_required | True unless a named Policy allow-list says otherwise | Timeout auto-approve |
Week-one autonomy on actions: recommend pause ads, draft a receipt expedite, request_approval on markdown. The alert does not purchase. Writes stay on domain agents with Cedar — HITL.
If you have no sessionsByChannel, the paid-traffic hop is an unknown. The RCA table already lists allowed vs forbidden claims per hop. Reuse it. Do not invent a second causality engine inside the alert formatter.
Where this sits (do not merge week one)
| Job | Question | Output |
|---|---|---|
| Monitoring | Did a signal fire? | Detect → investigate → recommend |
| Daily brief | What needs attention today? | Cap 5, scheduled JSON |
| RCA | Why did revenue move? | Hop contract, human signs the narrative |
| This alert | What happened and what to do next? | Schema above |
| Control tower | What requires a human now? | Ranked now-list, overflow watch |
Paging on every schema-valid alert without a cap recreates the 23-P1 Slack failure from the daily-brief post. Rank by blast radius. Advertised stockout beats a 2 percent AOV wiggle on a long-tail category. Overflow is watch, not a second “urgent” channel.
Fail closed, then eval
The formatter is a schema assembler, not a novelist. Instruction text that says “be helpful” will fill unknowns with prose. Reject the payload instead.
| Eval case | Expect | Fail if |
|---|---|---|
| Metric tool returns a delta | metric.evidence_tool set; fixture -15 replaced in your env | Headline uses 15% with no tool call |
| ATP join available | Contributor with getInventory + asOf | Stockout claim from Memory |
| No sessions tool | Paid traffic in unknowns | “Ads died” as a contributor |
| Pause recommended | autonomy: recommend | Execute pause in week one |
| Industry abandonment cited as cause | Eval fail | Baymard 70.22% in contributors |
Goldens belong next to Gateway traces, not in a slide. Ten pass fixtures, three fail fixtures (missing tool, Baymard-as-cause, execute-by-default) is enough to ship the formatter. RCA hops you cannot run stay in unknowns — root cause analysis is where a human still signs the narrative. The alert does not get to sign it by sounding complete.
AgentCore: format after detect, Policy still owns writes
Use Harness to assemble the payload from read tools. Use Runtime plus Strands if you fan out to RCA and exception specialists with hop caps. After July 30, 2026, do not put net-new alert formatters on Agents Classic.
| Piece | Role here |
|---|---|
| Gateway | salesByPeriod, getInventory, and only the hops you actually have |
| Policy (Cedar) | Default-deny pause, markdown, PO send from the alert role |
| Identity | Associate channel. Shopper tokens DENY alert writes |
| Observability | Missing evidence_tool, contributor without tool, execute autonomy in week one |
There is no native Shopify AgentCore connector. Wrap Admin or warehouse APIs yourself. Gateway ~180 → ~95 ms is the CRM canary — useful for tool placement, useless as a promise that the alert will “feel instant” once OMS and ads APIs join. If alert volume would not notice ~$791/mo at 50K sessions, you can still start; do not turn every unknown into a follow-up chat that burns the floor.
What broke
What broke — First formatter used the instruction “explain the sales drop.” It emitted Sales down 15% (the fixture) plus a paid-social story.
sessionsByChannelwas not on the OpenAPI. Detection: eval that requiresevidence_toolon every contributor; Gateway trace showed onlysalesByPeriod. Fix: put paid traffic inunknowns; keep ATP contributor only aftergetInventory; mark causationpossible_contributor; autonomy recommend on pause. Lesson: a percentage without a tool is a rumor. A contributor without a tool is fiction.
A related failure: recommended_actions defaulted to execute so the page would “close itself.” A fixture pause fired on the wrong campaign because the ads join was stale. Fix: recommend; HITL for pause until the join carries asOf. Kindness is not a close-the-ticket button.
What to Do This Week
- Copy
evidence-based-alert-schema.md. Treat-15as a fixture. - Inventory metric + hop tools you actually have. Missing hops →
unknowns. - Wire detect from monitoring; do not detect inside the formatter.
- Reuse RCA hops — playbook and RCA post.
- Tag every action with autonomy. Default recommend / draft. No execute in week one.
- Reject payloads missing
evidence_toolon metric or contributors. - Cap live pages. Do not duplicate the daily brief into a second firehose.
- Run
monday-checklist.md. - Model sessions on the AgentCore pricing calculator.
- Contact us. Architecture: Amazon Bedrock.
If you only do one thing: forbid a percentage with no tool. Put the gap in unknowns.
What This Post Doesn’t Cover
- Always-on signal catalog and detectors — monitoring
- Scheduled five-priority brief — daily operations agent
- Full RCA hop table and human-signed narrative — root cause analysis
- Strategic now-list architecture — control tower
- A measured “alert quality” or GMV recovery from a named client
- The fixture 15% presented as last week’s store
- A native Shopify AgentCore connector
FAQ
When should you NOT send an AI business alert?
Skip the alert when you have no metric tool, no comparison window, and no owner for the recommended action. A model that pastes Sales down 15% without salesByPeriod is a rumor. Also skip a live page if the same five items already sit in the scheduled daily brief and nobody will read a second channel.
What could go wrong if contributors have no evidence_tool?
The model will invent a channel story. Sample turns blamed paid traffic while sessionsByChannel was never called. Detection: evals that fail when a contributor lacks evidence_tool or when causation is stated as fact. Fix: mark it unknown. Link RCA hops — do not fill the gap with language.
Is the 15% sales drop a FactualMinds store KPI?
No. It is a fixture in the evidence-based alert schema so the payload shape is obvious. Do not cite it in a business case. Measure your own delta with your own salesByPeriod window.
What could go wrong if recommended_actions default to execute?
You pause the wrong campaign, markdown without a pricing owner, or send a PO from an alert. Rank actions. Tag autonomy. Week-one default is recommend or draft. Request approval for irreversible writes. The alert is not a purchaser.
How is this different from monitoring, the daily brief, or RCA?
Monitoring decides that a signal fired. The daily brief is a scheduled five-item JSON. RCA is the hop contract for why revenue moved. This post is the alert payload: headline plus contributors plus unknowns plus ranked next actions. Share evidence fields. Do not merge the four jobs into one prompt in week one.
Harness or Runtime for evidence-based alerts?
Harness is enough to assemble a schema-constrained payload from named read tools after a detector fires. Use Runtime plus Strands if alert assembly fans out to RCA and exception specialists with hop caps. Net-new builds use AgentCore, not Agents Classic after July 30, 2026.
Need alerts that carry evidence instead of a bare percentage? Contact FactualMinds for an architecture conversation, or start from the RCA playbook.
AWS Cloud Architect & AI Expert
AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.




