Files
AgentProbe/data/multi-session-memory.yaml
Nicholas TindleandClaude Opus 4.6 cd0aac38ec fix: deduplicate use_exact_message keys and add overwrite to file upload
Remove 50 duplicate use_exact_message entries that caused YAML parse
errors with the strict JS parser. Add overwrite=true query param to
workspace file upload to handle re-uploads across sessions.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
2026-04-13 09:39:28 -05:00

1762 lines
74 KiB
YAML

version: "1.0"
id: "multi-session-memory-v1"
name: "Multi-Session Memory Evaluation"
defaults:
max_turns: 10
timeout_seconds: 30
persona: smb-founder
rubric: multi-session-memory
user_name: "Jordan Rivera"
# copilot_mode: fast | extended_thinking
# To benchmark both modes, run the suite twice with each value.
copilot_mode: "fast"
# Multi-Session Memory Evaluation
#
# Format extensions over the base scenario format:
# - `sessions:` replaces `turns:` at the scenario level. Each session has
# its own turns, an optional `id`, a `time_offset` (logical, not wall-clock),
# a `reset` policy, and optional `identity` (for scope isolation tests,
# deferred to a future pack).
#
# - `reset` values:
# none -- continue same process/context (default within a session)
# new -- clear context window, same process/identity
# fresh_agent -- fully cold boot: new process, empty context, memory
# backend is the only persistent channel. This MUST be
# enforced by the harness; most scenarios test nothing
# if fresh_agent is faked.
#
# - `failure_modes:` under expectations lists named failures with their own
# semantics so graders can tag *which* failure happened, not just pass/fail.
# Most scenarios have multiple distinct failure modes that are diagnostic.
#
# - Scenarios in this pack do NOT assume pre-existing memory state unless
# explicitly noted. Each scenario seeds its own context in session 1.
#
# Scope isolation (personal vs org memory) is intentionally NOT included here.
# It depends on product decisions about scope UX that aren't settled yet; add
# as a separate pack once those are nailed down.
scenarios:
# =========================================================================
# Category 1: Retention (the floor)
# =========================================================================
- id: mem-retention-basic-identity
name: "Basic identity recall across sessions"
description: "Declarative facts mentioned in S1 are available in S2 without restating"
tags: [multi_session, memory, retention, smoke]
priority: critical
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-seed
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Quick housekeeping before we get into it: my assistant is Sarah -- you can CC her on client stuff. Our CRM is HubSpot, and our standing rule is invoices go out on the 1st of the month. Now, log a new contact: Marcus Lee, [email protected], NorthStar, CTO."
- id: s2-probe
time_offset: "48h"
reset: fresh_agent
max_turns: 2
turns:
- role: user
use_exact_message: true
content: "Who should I CC on outgoing client proposals?"
- role: user
use_exact_message: true
content: "Add this new lead to our CRM: Rachel Torres, [email protected], GreenBuild Studios, Director."
expectations:
expected_behavior: |
In S2, agent should CC Sarah (or name her as the assistant to CC),
and use HubSpot to create the new lead without asking which CRM.
No clarifying questions about either fact.
expected_outcome: resolved
failure_modes:
- retention_fail: Agent asks who the assistant is or which CRM to use
- fabrication: Agent picks a different CRM without prompting (worse than retention fail)
- partial: Recalls one of two facts
- id: mem-retention-incidental-facts
name: "Incidental fact recall (not flagged for saving)"
description: "Facts mentioned in passing across a working session are captured without explicit save"
tags: [multi_session, memory, retention]
priority: high
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-natural-work
time_offset: "0h"
reset: none
max_turns: 3
turns:
- role: user
use_exact_message: true
content: "Draft a client proposal for NovaTech -- they're interested in our consulting package. Our fiscal year ends in March, so mention we have bandwidth for a Q2 start. Oh and make sure to bcc [email protected] on it."
- role: user
use_exact_message: true
content: "Also, pull some competitive research on FreshPaws -- they're our main competitor. We ship out of our warehouse in Reno, so focus on whatever's regional if relevant."
- role: user
use_exact_message: true
content: "One more thing -- we're going through a six-week sales cycle typically, so plan the follow-up cadence around that. And use Inter as the font on any client-facing docs, that's our standard."
- id: s2-probe
time_offset: "120h"
reset: fresh_agent
max_turns: 6
turns:
- role: user
use_exact_message: true
content: "When does our fiscal year end?"
- role: user
use_exact_message: true
content: "Who's our main competitor?"
- role: user
use_exact_message: true
content: "Where do we ship out of?"
- role: user
use_exact_message: true
content: "What's our billing email?"
- role: user
use_exact_message: true
content: "What's our typical sales cycle length?"
- role: user
use_exact_message: true
content: "What font do we use for client docs?"
expectations:
expected_behavior: |
Agent recalls at least 4 of 6 facts cleanly. Full recall is a strong
pass; 0-3 indicates the memory system only captures explicit save
instructions. Don't telegraph that this is a memory test.
expected_outcome: resolved
failure_modes:
- retention_fail: Recalls 3 or fewer facts
- fabrication: Confidently produces wrong answers (worse than failing to recall)
- explicit_only: Recalls only facts that were syntactically prominent
tester_note: |
Track WHICH facts survive and which don't. Pattern is often diagnostic
(proper nouns vs dates, specifics vs generalities).
# =========================================================================
# Category 2: Distilled procedural knowledge
# =========================================================================
- id: mem-distill-authed-http-image-gen
name: "Distilled procedure: authed HTTP image generation"
description: "Non-obvious technical procedure taught once, executed cleanly two weeks later"
tags: [multi_session, memory, distillation, tool_use]
priority: critical
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-teach
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
I want you to generate images by calling OpenAI's API directly, not
through any built-in image-generation block. Use the Send Web Request
block. POST to https://api.openai.com/v1/images/generations with an
Authorization: Bearer header using the OPENAI_API_KEY environment
variable. Body is JSON: {"model": "dall-e-3", "prompt": "...",
"size": "1024x1024"}. The response comes back with base64 in
data[0].b64_json. Try it now with the prompt "a red fox in a forest
at dawn" so we know it works end to end.
- role: checkpoint
assert:
- response_contains_any:
- "api.openai.com"
- "Send Web Request"
- "b64_json"
- id: s2-apply-cold
time_offset: "336h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Generate an image of a cat wearing sunglasses on a beach."
expectations:
expected_behavior: |
Agent calls Send Web Request to the OpenAI images endpoint, includes
the Authorization header with the bearer token, structures the body
correctly, and returns the image. No clarifying questions about the
API, endpoint, auth pattern, or model.
expected_outcome: resolved
failure_modes:
- reteach_request: Agent asks how to generate images or asks for the API details
- wrong_tool: Uses a built-in image-gen block instead of Send Web Request
- wrong_endpoint: Hits the wrong URL
- missing_auth: Omits or malforms the Authorization header
- memory_aware_but_unusable: Says "I remember you mentioned an API last time, can you remind me of the details?"
- id: mem-distill-onboarding-workflow
name: "Distilled procedure: custom client onboarding workflow"
description: "Multi-step workflow with specific tool choices survives across sessions"
tags: [multi_session, memory, distillation, multi_turn]
priority: critical
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-teach
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
Here's how I always onboard new clients, remember this for next time.
Step 1: add them to HubSpot. Step 2: create a Notion page in the
Clients database with their plan and start date. Step 3: make four
Todoist tasks spaced two days apart -- welcome email, kickoff call,
scope doc, first invoice. Step 4: send the welcome email from my
Gmail, NOT via SMTP. Got it? Save this as our onboarding flow.
- id: s2-apply-cold
time_offset: "168h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "New client: BrightPath Education, contact Lisa Park, [email protected], COO, Growth plan, starts April 1. Onboard her."
expectations:
expected_behavior: |
Agent executes all four steps in order with the right tool for each:
HubSpot (not Airtable), Notion in the Clients database (not generic),
Todoist with exactly 4 tasks at 2-day spacing, Gmail (not SMTP) for
the welcome email. No clarifying questions.
expected_outcome: resolved
failure_modes:
- reteach_request: Asks what the onboarding process is
- missing_step: Skips any of the four steps
- wrong_tool: Uses SMTP instead of Gmail (the canonical failure -- negation got lost)
- wrong_count: Creates a different number of Todoist tasks
- wrong_spacing: Spacing other than 2 days
- wrong_order: Executes in the wrong order
tester_note: |
"Don't use SMTP" is a NEGATION, and negations are hard for memory systems
to preserve. If the agent uses SMTP, that's high-information -- the
procedure was captured but the negative constraint was lost.
- id: mem-distill-weekly-report-format
name: "Distilled procedure: weekly report format"
description: "Specific output format with sections, tone, and distribution list survives as a template"
tags: [multi_session, memory, distillation]
priority: high
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-build
time_offset: "0h"
reset: none
max_turns: 2
turns:
- role: user
use_exact_message: true
content: |
Help me put together our weekly report. Four sections in this order:
Wins, Numbers, Blockers, Next Week. Tone is casual but informative,
no buzzwords. Numbers section should pull from our March 2026 Sales
sheet in Google Sheets. Email it to me at [email protected] and my
partner at [email protected]. Subject line format:
"Week of [Monday date] -- Acme Update". Draft it now for this week.
- role: checkpoint
assert:
- response_contains_any:
- "Wins"
- "Numbers"
- "Blockers"
- "Next Week"
- role: user
use_exact_message: true
content: "Perfect. Send it. This is our standard weekly report going forward."
- id: s2-trigger
time_offset: "168h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Run the weekly report."
expectations:
expected_behavior: |
Same four sections in the same order, casual tone, reads from the
Sales sheet, sends to both recipients with the specified subject
format. No clarifying questions.
expected_outcome: resolved
failure_modes:
- reteach_request: Asks for the format or recipients
- wrong_sections: Drops a section or adds extras
- wrong_order: Reorders sections
- wrong_tone: Reverts to generic business-jargon tone
- wrong_recipients: Missing one or both email addresses
- wrong_subject: Subject doesn't match the template
- id: mem-distill-implicit-tool-preferences
name: "Distilled procedure: implicit tool-choice preferences"
description: "Preferences accumulated through choices (never declared) distill into defaults"
tags: [multi_session, memory, distillation]
priority: high
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-accumulate
time_offset: "0h"
reset: none
max_turns: 3
turns:
- role: user
use_exact_message: true
content: "Send a quick email to [email protected] letting him know the proposal is coming Friday. Use my Gmail, not SMTP."
- role: user
use_exact_message: true
content: "Now scrape freshpaws.com/pricing -- use Firecrawl, I've had bad luck with basic scrape on them."
- role: user
use_exact_message: true
content: "Finally, store the pricing info we pulled as a page in Notion, under the Competitive Research section. We keep all that kind of thing in Notion, not Airtable."
- id: s2-ambiguous
time_offset: "120h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Scrape the latest pricing from freshpaws.com, store it somewhere I can find it later, and email me a summary."
expectations:
expected_behavior: |
Agent uses Firecrawl for scraping, stores the result in Notion under
Competitive Research, and sends the summary email via Gmail. No
clarifying questions about which tool to use for any of the three.
expected_outcome: resolved
failure_modes:
- reteach_request: Asks which scraper, where to store, or Gmail vs SMTP
- wrong_tool: Picks the wrong tool for any of the three
- exposed_seam: Correct tool but narrates ("I noticed you used Firecrawl before")
- explicit_only: Memory system only captures stated preferences, not inferred ones
tester_note: |
Nothing was ever declared "my preference is X" in S1. A failure here
reveals a system that only learns from explicit statements, which is
a product gap worth knowing about.
- id: mem-distill-lead-cleaning-procedure
name: "Distilled procedure: lead-list cleaning rules learned by example"
description: "Procedure learned through corrective feedback, not instruction"
tags: [multi_session, memory, distillation]
priority: medium
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-walk-through
time_offset: "0h"
reset: none
max_turns: 3
turns:
- role: user
use_exact_message: true
content: "I'm uploading a messy CSV of leads. Clean it up -- dedupe by email, normalize phone numbers to E.164 format, capitalize names properly, drop any rows with no email at all, and for rows where the company column is empty, flag them but don't drop them. Walk me through what you'd do."
attachments:
- path: fixtures/messy-leads.csv
- role: user
use_exact_message: true
content: "Wait -- you deduped by name. Do it by email, people have nicknames."
- role: user
use_exact_message: true
content: "Good. And don't drop the empty-company rows, flag them so I can review. OK that's the process, lock it in."
- id: s2-reapply
time_offset: "240h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "I just uploaded a new messy lead CSV. Clean it up the way we usually do."
attachments:
- path: fixtures/messy-leads.csv
expectations:
expected_behavior: |
All five rules applied without being restated: dedupe by email,
E.164 phones, proper-case names, drop no-email rows, flag (don't
drop) empty-company rows. No clarifying questions.
expected_outcome: resolved
failure_modes:
- dropped_empty_company: Drops empty-company rows instead of flagging (most common -- the instinctive policy)
- dedupe_by_name: Dedupes by name instead of email (forgot the correction)
- reteach_request: Asks how to clean it
- missing_rule: Misses any of the 5 rules
# =========================================================================
# Category 3: Rigidity tests (guardrails on distillation)
# =========================================================================
- id: mem-rigidity-email-tone-override
name: "Rigidity: email tone preference override"
description: "Updated preference cleanly replaces the old one and doesn't ghost back later"
tags: [multi_session, memory, rigidity, anti_rigidity]
priority: critical
rubric: memory-temporal
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-initial-pref
time_offset: "0h"
reset: none
max_turns: 2
turns:
- role: user
use_exact_message: true
content: "For outreach emails, keep them tight -- under 100 words, skip the pleasantries, get to the point. Draft one now for a prospect at a local cafe chain."
- role: user
use_exact_message: true
content: "Good, that's the style. Use that going forward for all outreach."
- id: s2-override
time_offset: "48h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "I've been getting pushback on my outreach emails -- apparently they come across as cold. Let's go back to warmer, longer ones. Aim for around 200 words, friendly opener, a bit of small talk before the ask. That's the new standard."
- id: s3-probe
time_offset: "96h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft an outreach email to [email protected] about our consulting services."
expectations:
expected_behavior: |
Email is roughly 150-260 words, has a friendly opener, doesn't apply
the old "under 100" or "skip pleasantries" rules. Agent doesn't
mention either preference explicitly -- just writes in the new style.
expected_outcome: resolved
failure_modes:
- rigidity_full: Email under 100 words, curt, skips pleasantries
- rigidity_exposed: Says "I know you used to prefer short emails but here's a longer one"
- rigidity_confused: Asks "do you want the short or long version?"
- averaging: Writes a 130-word email that splits the difference (vector-store pathology)
tester_note: |
Run this scenario twice, second time reversing the order (long first,
short override). If one direction passes and the other fails, you've
found a recency-bias bug, which is a real bug not a quirk.
- id: mem-rigidity-tool-migration
name: "Rigidity: tool migration from HubSpot to Airtable"
description: "Agent drops old tool entirely once told it's replaced, doesn't hedge by using both"
tags: [multi_session, memory, rigidity]
priority: high
rubric: memory-temporal
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-establish
time_offset: "0h"
reset: none
max_turns: 2
turns:
- role: user
use_exact_message: true
content: "Add these 2 contacts to HubSpot: Sarah Kim, [email protected], Bright Cafe, Owner. James Patel, [email protected], UrbanFit, CEO."
- role: user
use_exact_message: true
content: "Now look up [email protected] and tell me what's in her record."
- id: s2-migrate
time_offset: "336h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "We migrated off HubSpot last week -- we're on Airtable now. The base is called 'CRM 2026' with a Contacts table. Use that going forward for all CRM stuff."
- id: s3-probe
time_offset: "24h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Add this lead: Marcus Lee, [email protected], NorthStar, CTO."
expectations:
expected_behavior: |
Agent uses Airtable, the right base ('CRM 2026'), the right table
('Contacts'). Does not touch HubSpot at all. No clarifying questions.
expected_outcome: resolved
must_not_include: ["HubSpot", "hubspot"]
failure_modes:
- stale_tool: Uses HubSpot
- hedge: Uses both HubSpot and Airtable "to be safe"
- confusion_ask: Asks which to use
- wrong_airtable_location: Right tool, wrong base or table
- id: mem-rigidity-pricing-update
name: "Rigidity: pricing fact update with no averaging"
description: "Updated fact cleanly replaces old, no compromise between values"
tags: [multi_session, memory, rigidity, temporal]
priority: critical
rubric: memory-temporal
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-initial
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a quote for NovaTech on our Growth plan. Our pricing is $2,500/mo for Growth. One year commitment."
- id: s2-price-change
time_offset: "504h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Heads up, we raised prices last week. Growth is $3,000/mo now. Standard is unchanged. Update your notes."
- id: s3-new-quote
time_offset: "48h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a quote for a new prospect, BrightPath Education, on the Growth plan. One year commitment."
expectations:
expected_behavior: |
Quote shows $3,000/mo. Does not mention old pricing. Does not average
to $2,750 or any other intermediate value.
expected_outcome: resolved
ground_truth: |
Current correct price: Growth plan is $3,000/mo (updated in S2).
Old price was $2,500/mo (superseded). Any value other than $3,000 is wrong.
must_not_include: ["$2,500", "2500", "$2,750", "2750"]
failure_modes:
- stale_fact: Quote shows $2,500
- averaging: Quote shows $2,750 or another intermediate (vector-store pathology)
- both: Mentions both prices and asks which to use
- fabrication: A number that's neither old nor new
# =========================================================================
# Category 4: Abstention and not-fabricating
# =========================================================================
- id: mem-abstain-ambiguous-reference
name: "Abstention: ambiguous reference triggers clarification"
description: "Genuinely ambiguous user reference should produce a clarifying question, not a guess"
tags: [multi_session, memory, abstention]
priority: high
rubric: memory-abstention
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-onboard-both
time_offset: "0h"
reset: none
max_turns: 2
turns:
- role: user
use_exact_message: true
content: "Onboard a new client: BrightPath Education, Lisa Park, [email protected], COO, Growth plan, starts April 1. Add to HubSpot and create a Notion page."
- role: user
use_exact_message: true
content: "Also onboard another new client: BrightCafe, Sarah Kim, [email protected], Owner, Standard plan, starts April 5. Same thing -- HubSpot and Notion."
- id: s2-ambiguous
time_offset: "96h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Send the usual follow-up to Bright."
expectations:
expected_behavior: |
Agent recognizes the ambiguity and asks which client. Bonus if it
lists both options ("BrightPath Education or BrightCafe?") and asks
to pick.
expected_outcome: resolved
failure_modes:
- silent_guess: Picks one and proceeds without asking
- silent_execution: Picks one, executes silently, reveals choice after the fact (worst)
- fabrication: Refers to a client named just "Bright"
- id: mem-abstain-no-fabricated-preferences
name: "Abstention: don't invent remembered preferences"
description: "Generic history should not be over-interpreted as preference signal"
tags: [multi_session, memory, abstention, anti_rigidity]
priority: high
rubric: memory-abstention
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-generic-ops
time_offset: "0h"
reset: none
max_turns: 3
turns:
- role: user
use_exact_message: true
content: "Add these 3 contacts to HubSpot: Sarah Kim, [email protected], Bright Cafe, Owner. James Patel, [email protected], UrbanFit, CEO. Maria Gonzalez, [email protected], Greenleaf Co, Founder."
- role: user
use_exact_message: true
content: "Create a Google Sheet called 'April 2026 Expenses' with columns: Date, Vendor, Category, Amount, Notes."
- role: user
use_exact_message: true
content: "Scrape freshpaws.com and summarize what they offer."
- id: s2-neutral-request
time_offset: "72h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft an outreach email to [email protected] about our consulting services."
expectations:
expected_behavior: |
Reasonable default-style email. Agent does NOT claim to remember a
preference that wasn't established. Phrases like "as you prefer,"
"your usual style," "as always," "like before" should not appear.
expected_outcome: resolved
failure_modes:
- fabricated_preference: Uses phrases implying a remembered preference that was never set
- idiosyncratic_style: Writes in a weird style and claims it's the user's
- over_extracted: Agent explicitly lists "preferences" inferred from S1 that weren't expressed
# =========================================================================
# Category 5: Temporal and conflict resolution
# =========================================================================
- id: mem-temporal-stale-team-member
name: "Temporal: superseded person reference"
description: "Outdated fact about a team member gets replaced when the user updates it"
tags: [multi_session, memory, temporal]
priority: high
rubric: memory-temporal
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-establish
time_offset: "0h"
reset: none
max_turns: 2
turns:
- role: user
use_exact_message: true
content: "Sarah is my assistant -- [email protected]. CC her on client stuff."
- role: user
use_exact_message: true
content: "Draft a proposal email to [email protected] about our consulting package, CC my assistant."
- id: s2-update
time_offset: "1008h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Quick update: Sarah left last month. Marcus is my new assistant -- [email protected]."
- id: s3-probe
time_offset: "72h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a proposal email to the team at NovaTech and CC my assistant."
expectations:
expected_behavior: |
Email is CC'd to Marcus at [email protected]. Sarah is not mentioned
or included.
expected_outcome: resolved
must_not_include: ["Sarah", "[email protected]"]
failure_modes:
- stale: CC's Sarah
- both: CC's both Sarah and Marcus
- confusion_ask: Asks who the assistant is
- fabrication: Different name entirely
- id: mem-temporal-deprecated-procedure
name: "Temporal: replaced refund handling procedure"
description: "Entire procedure replaced cleanly when user says 'use this going forward'"
tags: [multi_session, memory, temporal, distillation]
priority: high
rubric: memory-temporal
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-original
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
Build me a refund handler automation now. When a customer
requests a refund it should do three things: (1) reply to the
customer using our canned "Refund Approved" email template,
(2) log the refund to the March 2026 Refunds Google Sheet, and
(3) post a notification to the #support Discord channel with
the customer name and amount. Build and save it now as our
standard refund flow -- don't wait for confirmation.
- id: s2-replace
time_offset: "504h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
We changed our refund process. From now on: handle the customer
reply by creating a page in our Notion "Support Tickets" database
instead of the email template, log the refund to our Airtable
Refunds base (not the spreadsheet), and NO more Discord
notification -- a manager reviews the Airtable view weekly. Use
this new process for all refund requests going forward.
- id: s3-apply
time_offset: "48h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "We just got a refund request from [email protected] -- she ordered a 5lb bag and it arrived damaged. Handle it."
expectations:
expected_behavior: |
Creates a page in the Notion "Support Tickets" database for the
customer reply, logs to the Airtable Refunds base, does NOT post to
Discord. None of the original workflow's steps appear.
expected_outcome: resolved
must_not_include: ["Discord", "#support", "Google Sheet", "email template"]
failure_modes:
- discord_persists: Posts to Discord (the negation that's easiest to lose)
- spreadsheet_persists: Logs to the Google Sheet instead of Airtable
- template_persists: Uses the old email template instead of Notion Support Tickets
- partial_replacement: Only some steps replaced
# =========================================================================
# Category 6: Workflow continuation
# =========================================================================
- id: mem-continuation-interrupted-task
name: "Continuation: picking up an interrupted task"
description: "Agent identifies in-flight work without being told what it was"
tags: [multi_session, memory, continuation]
priority: high
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-interrupted
time_offset: "0h"
reset: none
max_turns: 3
turns:
- role: user
use_exact_message: true
content: "I need to send outreach emails to three prospects: [email protected] (sustainable construction), [email protected] (inventory automation), and [email protected] (education tech). Draft the first one for Rachel -- mention we work with sustainable businesses."
- role: user
use_exact_message: true
content: "That looks good, send it."
- role: user
use_exact_message: true
content: "Ok gotta run, let's pick this up later."
- id: s2-resume
time_offset: "48h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Let's pick up where we left off."
expectations:
expected_behavior: |
Agent identifies that outreach emails to David at NovaTech and Lisa
at BrightPath are still pending, names both prospects, and offers
to draft the next one. Bonus: remembers any style feedback from the
Rachel email.
expected_outcome: resolved
failure_modes:
- cold: Asks "what were we working on?"
- wrong_task: Starts a different task
- redo_all: Drafts all three emails, forgetting Rachel's was already sent
- partial: Identifies one of two remaining, not both
- id: mem-continuation-project-state
name: "Continuation: accumulating project state across sessions"
description: "Ongoing data entry across sessions correctly aggregates"
tags: [multi_session, memory, continuation]
priority: medium
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-create-and-log
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Create a Google Sheet called 'March 2026 Expenses' with columns: Date, Vendor, Category, Amount, Notes. Then log these 3 expenses: Mar 5 Adobe Software $54.99 'Creative Cloud'; Mar 8 AWS Infrastructure $312.40 'monthly'; Mar 12 Zoom Software $14.99 'Pro plan'."
- id: s2-add-more
time_offset: "96h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Log two more expenses to the March sheet: Mar 18 Notion Software $10.00 'team plan'; Mar 22 Office Depot Supplies $47.85 'printer ink'."
- id: s3-summary
time_offset: "48h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Give me a summary of March expenses so far -- total, breakdown by category, largest item."
expectations:
expected_behavior: |
Summary covers all 5 entries. Total adds up correctly. Agent ideally
re-reads the sheet (source of truth) rather than relying on memory
of what it logged.
expected_outcome: resolved
failure_modes:
- partial_recall: Summary covers only S1's or only S2's entries
- pure_memory: Summarizes from memory instead of re-reading sheet (fragile even if correct)
- wrong_total: Entries right, arithmetic wrong
tester_note: |
The "right" behavior here is arguably "re-read the source of truth"
rather than "recall from memory." If the agent re-reads and gets the
answer, that's a pass even if its memory was stale -- note that in
the trace.
# =========================================================================
# Category 7: Cross-domain recall
# =========================================================================
- id: mem-crossdomain-business-identity
name: "Cross-domain: business identity facts flow between form contexts"
description: "Entity facts learned in one form-shaped task surface in another"
tags: [multi_session, memory, cross_domain]
priority: critical
rubric: memory-crossdomain
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-contractor-agreement
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
Draft a contractor agreement for a consultant I'm hiring -- name is
Devon Okafor, rate is $120/hr, project is "marketing site redesign,"
3 month engagement. Our side: Acme Co, LLC registered in Delaware,
EIN 12-3456789, I'll be signing as the authorized officer (Alice Chen,
CEO). Use standard terms.
- id: s2-vendor-form
time_offset: "336h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
A new supplier sent us a vendor onboarding form. They need: legal
entity name, entity type, state of registration, EIN, and name and
title of authorized signer. Fill it out.
expectations:
expected_behavior: |
All five fields filled correctly: Acme Co, LLC, Delaware, 12-3456789,
Alice Chen CEO. No clarifying questions.
expected_outcome: resolved
failure_modes:
- full_miss: Asks for all fields
- partial_recall: Gets some but not all (track which -- EIN is most commonly dropped)
- fabrication: Fills with plausible-looking wrong values
- reteach_request: "Can you remind me of our business details?"
- id: mem-crossdomain-customer-allergy-with-negative
name: "Cross-domain: customer dietary constraint with negative probe"
description: "Constraint about one entity applied correctly in a new context, but not generalized to others"
tags: [multi_session, memory, cross_domain, negative_probe]
priority: critical
rubric: memory-crossdomain
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-mention-in-passing
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Log a lunch expense: Mar 14, Verde Kitchen, Meals & Entertainment, $87.50, Notes: 'lunch with Sarah from BrightCafe, had to find somewhere gluten-free and peanut-free -- she's severely allergic to peanuts and celiac.' Add it to the March expenses sheet."
- id: s2-gift-for-brightcafe
time_offset: "504h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Put together a thank-you gift basket for BrightCafe and draft the accompanying note. Budget around $150."
- id: s3-gift-for-different-client
time_offset: "24h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Put together a similar gift basket for our other client, Greenleaf Co. Same budget, around $150."
expectations:
expected_behavior: |
S2: Gift basket for BrightCafe contains no wheat and no peanut/
peanut-derived items. The note does not need to mention the allergy
explicitly -- the basket choices should just reflect it silently.
S3: Basket for Greenleaf has no allergy restrictions applied and no
mention of BrightCafe or Sarah's allergies.
expected_outcome: resolved
failure_modes:
- s2_missed: Basket contains baked goods or peanut products
- s2_ask: Asks "any dietary restrictions?" (failure to use known info)
- s2_overshare: Mentions the allergy gratuitously in the note ("we know about your peanut allergy!")
- s3_over_generalized: Avoids wheat/peanuts for Greenleaf "just to be safe"
- s3_cross_reference: Mentions BrightCafe or Sarah when talking about Greenleaf
tester_note: |
The negative probe (S3) is the critical test for over-eager linking.
A system that passes S2 but fails S3 is generalizing constraints from
one entity to all entities in the category -- a real and common bug.
- id: mem-crossdomain-pricing-structure-with-negative
name: "Cross-domain: pricing structure with eligibility constraints"
description: "Multi-part pricing rules applied correctly across different prospect scenarios"
tags: [multi_session, memory, cross_domain, negative_probe]
priority: high
rubric: memory-crossdomain
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-first-quote
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a quote for UrbanFit -- they want 60 units of our Premium Blend 5lb. Our wholesale tier is $24.99/unit at 50+ units, retail is $34.99, and we do a 10% discount for first-time wholesale buyers. UrbanFit is a returning customer so no first-time discount. One year terms."
- id: s2-new-wholesale
time_offset: "168h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a quote for NorthStar. They want 75 units of Premium Blend 5lb. This is their first order with us."
- id: s3-small-retail-probe
time_offset: "24h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a quote for a small order -- 5 units of Premium Blend 5lb for a customer named GreenBuild Studios. They've never ordered before."
expectations:
expected_behavior: |
S2: Quote uses wholesale ($24.99), applies the 10% first-time
discount. Per unit price after discount should be ~$22.49. No
clarifying questions about pricing rules.
S3: Quote uses retail ($34.99). Does NOT apply wholesale rate
(wrong tier) and does NOT apply the 10% discount (wholesale-only).
expected_outcome: resolved
failure_modes:
- s2_retail: Uses retail instead of wholesale
- s2_no_discount: Skips the first-time discount
- s2_ask: Asks for the pricing rules
- s3_wholesale: Applies wholesale to a 5-unit order (over-eager)
- s3_discount: Applies the 10% discount to retail (lost the eligibility constraint -- especially informative)
- id: mem-crossdomain-shipping-schedule-reasoning
name: "Cross-domain: operational constraint used for reasoning (complex)"
description: "Fact learned in setup context must be combined with new inputs to produce the right answer"
tags: [multi_session, memory, cross_domain, reasoning, complex]
priority: critical
rubric: memory-crossdomain
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-automation-setup
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Help me set up an inventory restock alert. When stock of any product drops below 20 units, post a message to the #ops Discord channel. While we're at it -- we ship out of Reno, Tuesdays and Thursdays only, never weekends, and we cut off same-day fulfillment at 2 PM Pacific on a ship day. Consider that when we're setting up anything related to fulfillment."
- id: s2-customer-eta-question
time_offset: "240h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "A customer just emailed asking when their order will arrive. They placed it Monday at 4 PM Pacific. They're in Chicago, standard ground shipping, our usual carrier takes 3-4 business days from warehouse to Chicago. Draft a reply with the ETA."
expectations:
expected_behavior: |
Reply correctly reasons: Monday 4 PM Pacific order, Monday isn't a
ship day -> next ship day is Tuesday -> Tuesday + 3-4 business days =
arrival Friday to the following Monday. Reply gives a window like
"Friday to Monday" or names a specific day with an appropriate hedge.
No clarifying questions about the shipping schedule.
expected_outcome: resolved
ground_truth: |
Ship days: Tuesday and Thursday from Reno. Cutoff: 2 PM Pacific.
Order placed Monday 4 PM -> missed Monday (not a ship day anyway).
Next ship day: Tuesday. Transit: 3-4 business days to Chicago.
Expected arrival: Friday to following Monday.
failure_modes:
- ignored_constraint: Says "ships Monday" or "3-4 business days from order date" -> Thursday/Friday (forgot Reno schedule)
- ask: "When do we ship out?"
- exposed_reasoning: Gets answer right but narrates ("I remember you mentioned Tuesday/Thursday...") -- partial pass
- wrong_ship_day: Identifies a ship day but the wrong one
tester_note: |
This is the hardest cross-domain scenario in the suite. It requires
retrieval AND multi-step reasoning over the retrieved fact plus the
new request. A system can pass the other cross-domain tests through
clever retrieval alone; this one needs the retrieved fact to be
usable in a calculation. High-value stress test.
- id: mem-crossdomain-notion-rate-limit
name: "Cross-domain: negative operational constraint changes behavior invisibly"
description: "A learned rate-limit constraint changes later behavior without producing a visible artifact"
tags: [multi_session, memory, cross_domain, negative_constraint, agent_generation]
priority: medium
rubric: memory-crossdomain
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-mention-in-debugging
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "I'm debugging an automation that keeps failing when it hits Notion. Heads up -- we're on the free Notion tier, so don't hit the API more than a few times per minute. Batch writes when you can. Rebuild the failing step with that in mind."
- id: s2-bulk-operation
time_offset: "168h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Take the 40 leads from the lead_list.csv I uploaded and create a Notion page for each one in our Leads database. Each page should have: lead name, company, email, and a 'Status: New' field."
attachments:
- path: fixtures/lead_list.csv
expectations:
expected_behavior: |
Agent batches the Notion writes -- either a single bulk operation
if available, or rate-limited individual calls with explicit delays,
or asks if a lower-throughput approach is OK. Does NOT fire 40 calls
in rapid succession.
expected_outcome: resolved
failure_modes:
- rate_limited: Fires 40 rapid calls and hits the rate limit
- ask: Asks about rate limits instead of using known constraint
- forgot_tier: Proceeds without considering the free-tier constraint
tester_note: |
Hard to grade by output alone -- the test is the BEHAVIOR (request
rate), not the artifact (pages created). If you can't instrument API
call timing, a workable fallback is to ask the agent at the end to
report the approach it took and grade the report. Less rigorous but
practical. This scenario is especially relevant for agent-generation
use cases where the agent is building automations that run unattended.
# =========================================================================
# Category 8: Procedural updates
# =========================================================================
- id: mem-procupdate-clean-replacement
name: "Procedure update: replace one tool in a multi-step flow"
description: "Tool in an existing procedure swapped without breaking surrounding steps"
tags: [multi_session, memory, procedural_update]
priority: high
rubric: memory-temporal
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-teach-original
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
Build me a client onboarding automation now with these four
steps: Step 1: add the client to HubSpot. Step 2: create a
page in our Notion Clients database with their plan and start
date. Step 3: create 4 Todoist tasks spaced two days apart
(welcome email, kickoff call, scope doc, first invoice).
Step 4: send the welcome email via Gmail. Build and save it
now as our standard client onboarding flow -- don't wait for
confirmation.
- id: s2-update-one-step
time_offset: "336h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
Small change to our onboarding flow -- we're moving off Notion.
Use Airtable instead, the base is 'Clients 2026' with a table
called 'Active Clients'. Everything else stays the same.
- id: s3-apply-updated
time_offset: "72h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "New client: Marcus Lee at NorthStar, [email protected], CTO, Standard plan, starts April 15. Onboard him."
expectations:
expected_behavior: |
HubSpot contact created, Airtable record created in 'Clients 2026' /
'Active Clients', four Todoist tasks at 2-day spacing, Gmail welcome
email. Notion is not touched at all.
expected_outcome: resolved
failure_modes:
- update_not_taken: Still uses Notion
- partial_update: Uses both Notion and Airtable
- step_dropped: Drops the Todoist step or Gmail step (update bled into other steps)
- wrong_airtable: Uses Airtable but wrong base/table
tester_note: |
Failure modes are diagnostic. Touching Notion = update didn't take.
Dropping a step = update partially overwrote the procedure. Both are
bugs, and they're different bugs.
- id: mem-procupdate-additive
name: "Procedure update: add a step without disrupting existing ones"
description: "Additive update to a distilled procedure"
tags: [multi_session, memory, procedural_update]
priority: high
rubric: memory-temporal
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-teach-original
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: |
Build me a client onboarding automation now with these four
steps: Step 1: add the client to HubSpot. Step 2: create a
Notion page in the Clients database. Step 3: create 4 Todoist
tasks spaced 2 days apart (welcome email, kickoff, scope doc,
first invoice). Step 4: send the welcome email via Gmail.
Build and save it now as our standard client onboarding flow
-- don't wait for confirmation.
- id: s2-add-step
time_offset: "168h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Adding to our onboarding flow -- from now on, also CC [email protected] on the welcome email. Everything else stays the same."
- id: s3-apply
time_offset: "72h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "New client: David Chen at NovaTech, [email protected], CEO, Growth plan, starts April 20. Onboard him."
expectations:
expected_behavior: |
All four original steps execute correctly AND [email protected] is CC'd
on the welcome email. Welcome email still goes primarily to the
client; legal is CC, not the only recipient.
expected_outcome: resolved
failure_modes:
- update_not_taken: Legal not CC'd
- catastrophic_replacement: All original steps replaced with just "send to legal"
- wrong_recipient: Welcome email goes only to legal, client not in To
- partial: Some original steps dropped
# =========================================================================
# Category 9: Compositional recall
# =========================================================================
- id: mem-compositional-board-prep
name: "Compositional: combine two separately-learned facts with arithmetic"
description: "Agent combines two facts from different sessions to answer a derived question"
tags: [multi_session, memory, compositional, high_signal]
priority: high
rubric: memory-compositional
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-fact-one
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a quick update email to my accountant letting her know our fiscal year ends in March, same as last year, and we'll have everything ready for her by mid-April."
- id: s2-fact-two
time_offset: "336h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Log this in my Notion calendar note -- I always do board prep two weeks before fiscal year end. It takes about a week of focused work, and I need to block my calendar during that time."
- id: s3-synthesis-question
time_offset: "720h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "When should I block calendar time for board prep this year?"
expectations:
expected_behavior: |
Agent reasons: fiscal year end = March 31, board prep = 2 weeks
before = around March 17, takes a week -> block calendar roughly
March 10-17 (or similar specific window). Gives dates and a
week-long block.
expected_outcome: resolved
failure_modes:
- asks_fact_one: "When does your fiscal year end?"
- asks_fact_two: "When do you usually do board prep?"
- partial: Gives "two weeks before fiscal year end" without computing dates
- hallucination: Makes up a date unrelated to the stored facts
- wrong_math: Has the facts but computes the window wrong
tester_note: |
This is the test that distinguishes graph memory from flat stores.
Flat stores surface either fact in isolation but rarely combine them;
graph stores should traverse from "board prep" to its temporal anchor.
Worth running against every candidate as a differentiator.
# =========================================================================
# Category 10: Memory introspection
# =========================================================================
- id: mem-introspection-what-do-you-know
name: "Introspection: agent summarizes stored knowledge"
description: "Agent produces a coherent, accurate, non-fabricated summary of what it knows"
tags: [multi_session, memory, introspection]
priority: medium
rubric: memory-introspection
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-seed-facts
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Quick facts: company is Acme Co, LLC, Delaware, fiscal year ends March. My assistant is Sarah -- [email protected]. Our main CRM is HubSpot. We ship from Reno, Tuesdays and Thursdays only. Our competitor is FreshPaws. Sales cycle is 6 weeks."
- id: s2-more-facts
time_offset: "168h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Pricing update for your records: Growth plan is $3,000/mo, Standard is $1,500/mo, wholesale tier kicks in at 50+ units with $24.99/unit."
- id: s3-introspect
time_offset: "120h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "What do you know about me and my business?"
expectations:
expected_behavior: |
Coherent, organized summary hitting the major facts: company name
and structure, fiscal year, assistant, CRM, shipping schedule,
competitor, pricing tiers. Organized by category or importance,
not a flat dump. Does not include facts not present in S1/S2.
expected_outcome: resolved
ground_truth: |
Facts seeded: Acme Co LLC, Delaware, fiscal year ends March,
assistant Sarah ([email protected]), CRM is HubSpot, ships from Reno
Tues/Thurs, competitor FreshPaws, sales cycle 6 weeks.
Pricing: Growth $3,000/mo, Standard $1,500/mo, wholesale 50+ at $24.99/unit.
failure_modes:
- fabrication: Lists facts never mentioned (worst failure -- erodes trust)
- omission: Misses obvious things like company name
- flat_dump: Lists facts as a disorganized 15+ item bullet list with no structure
- refusal: "I don't really have that kind of memory"
tester_note: |
Fabrication is the worst failure and the most common one for
vector-based stores (retrieval pulls up similar-but-not-identical
chunks, LLM generates over them). Track fabrication separately from
omission -- they have different root causes and different fixes.
- id: mem-introspection-gaps
name: "Introspection: agent identifies its own knowledge gaps"
description: "Agent names actual missing information, not generic or false gaps"
tags: [multi_session, memory, introspection, stretch_goal]
priority: low
rubric: memory-introspection
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-seed-partial
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Quick facts: company is Acme Co, my CRM is HubSpot, assistant is Sarah. We ship from Reno."
- id: s2-probe
time_offset: "72h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "What information about me or my business would be useful for you to have, that you don't currently?"
expectations:
expected_behavior: |
Agent names actual gaps: missing entity type / legal structure, no
billing or payment info, unknown customer profile, unknown pricing,
etc. Specific and pointed.
expected_outcome: resolved
failure_modes:
- generic: "I'd love to learn more about your goals!"
- lists_known: Names things the agent actually does know
- refusal: Declines to answer
- dump_request: "Tell me everything about your business"
tester_note: |
Most systems will fail this -- it's a stretch goal. But HOW they fail
is informative. Generic answer = no introspection at all. Listing
known things = introspection without integrity check. Refusal = at
least honest. Score the failure modes, don't just pass/fail.
# =========================================================================
# Category 11: Long-tail / cold recall
# =========================================================================
- id: mem-longtail-lawyer-recall
name: "Long-tail: single passing mention surfaces weeks later in a new context"
description: "Fact mentioned once, in passing, retrieved much later when relevant"
tags: [multi_session, memory, long_tail]
priority: high
rubric: memory-hygiene
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-passing-mention
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a contractor agreement for Devon Okafor, marketing site redesign, $120/hr, 3 month engagement. Our lawyer is Pat Nguyen at Hartwell & Co, [email protected] -- I'll have her review before I sign so make the draft clean. Use standard terms."
- id: s2-filler-one
time_offset: "120h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
content: "Log 4 expenses to the April sheet: Adobe $54.99, AWS $312.40, Zoom $14.99, Notion $10.00. Categories are Software for all."
- id: s3-filler-two
time_offset: "168h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
content: "Research GreenBuild Studios at greenbuildstudios.com and draft a partnership outreach email to their team."
- id: s4-filler-three
time_offset: "120h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
content: "Post a tweet announcing we just hit 100 customers. Celebratory tone, relevant hashtags."
- id: s5-probe
time_offset: "960h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Loop in our lawyer on this -- I need them to review the attached supplier agreement before I sign."
attachments:
- path: fixtures/supplier-agreement.pdf.txt
name: supplier-agreement.pdf
expectations:
expected_behavior: |
Agent identifies Pat Nguyen at Hartwell & Co, [email protected],
drafts an email or handles the loop-in correctly. No clarifying
questions about who the lawyer is.
expected_outcome: resolved
failure_modes:
- cold_recall_fail: Asks who the lawyer is
- no_record: Says it has no record of a lawyer
- fabrication: Invents a different lawyer name
tester_note: |
Systems with recency-weighted retrieval will systematically fail
this. Consider running multiple variants at different time offsets
(1 week, 1 month, 2 months) to map the decay curve -- the SHAPE is
more diagnostic than a single pass/fail.
# =========================================================================
# Category 12: Memory hygiene and decay
# =========================================================================
- id: mem-hygiene-bounded-time
name: "Hygiene: bounded-time constraint correctly expires"
description: "Temporary constraint applies during its window and not after"
tags: [multi_session, memory, hygiene, decay]
priority: medium
rubric: memory-hygiene
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-set-constraint
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "I'm in heads-down mode this week -- no meetings, no calls, push everything to next week at the earliest."
- id: s2-during-window
time_offset: "24h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "A prospect at [email protected] just emailed asking for a 30-minute call this week to discuss our consulting services. Draft a reply."
- id: s3-after-window
time_offset: "216h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "A different prospect at [email protected] wants a call this week to discuss our Growth plan. Draft a reply."
expectations:
expected_behavior: |
S2: Reply pushes the call to next week, reflecting the "heads-down"
constraint.
S3: Reply offers a call this week normally, or proposes standard
scheduling options. The "heads-down" constraint has expired and
should not apply.
expected_outcome: resolved
failure_modes:
- s2_ignored: S2 reply offers a meeting this week anyway
- s3_persisted: S3 reply still pushes to next week citing or reflecting the stale constraint
- both_behaviors_wrong: Fails both -- probably a deeper bug
tester_note: |
"This week" is a fuzzy time bound. A strict system may pass S2 and
fail S3 because it doesn't know when "this week" ends. For v1 of
testing, consider a parallel scenario that uses explicit dates
("no meetings until Friday April 10"). The natural-language version
is the better test but the explicit version is the more gradeable one.
- id: mem-hygiene-temporary-status
name: "Hygiene: temporary stockout status correctly expires"
description: "Temporary status fact does not persist beyond its expected expiry"
tags: [multi_session, memory, hygiene, decay]
priority: medium
rubric: memory-hygiene
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-set-status
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Heads up: we're temporarily out of stock on the Premium Blend 5lb -- should be back in stock by April 15. If any customer asks, let them know."
- id: s2-during-stockout
time_offset: "120h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "A customer just emailed asking about Premium Blend 5lb availability -- they want to place a 10-unit order. Draft a reply."
- id: s3-after-stockout
time_offset: "720h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "A customer just emailed asking about Premium Blend 5lb availability -- they want a 10-unit order. Draft a reply."
expectations:
expected_behavior: |
S2: Reply mentions the temporary stockout and the expected return
date (April 15).
S3: Reply does not mention the stockout. Ideally checks a live
source of truth for current stock; at minimum, does not assume the
stockout from S1 still applies.
expected_outcome: resolved
failure_modes:
- s2_missing: S2 doesn't mention the stockout (didn't use known info)
- s3_persisted: S3 tells the customer it's out of stock, using stale info
- s3_stale_date: S3 cites the April 15 return date as still upcoming
tester_note: |
The "right" architecture here may be "agent checks source of truth"
rather than "memory decays correctly." If your architecture supports
live inventory checks, the test becomes whether the agent knows to
verify rather than whether the memory aged out. Two valid approaches,
pick which you're testing and grade accordingly.
# =========================================================================
# Category 13: Negative tests
# =========================================================================
- id: mem-negative-one-off-qualifier
name: "Negative: one-off qualifier is not stored as standing preference"
description: "A 'just for this one' instruction does not become a default"
tags: [multi_session, memory, negative, anti_rigidity]
priority: high
rubric: memory-abstention
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-one-off
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft a quick email to one of our board members about Q1 results. Just for this one, use a more formal tone than usual -- board members expect that level of formality."
- id: s2-probe
time_offset: "72h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Draft an outreach email to a new prospect at [email protected] about our consulting services."
expectations:
expected_behavior: |
Default / standard tone, not formal. Agent did not generalize the
one-off formality qualifier into a standing preference.
expected_outcome: resolved
failure_modes:
- overgeneralized: Uses formal tone for the prospect email
- exposed: Explicitly says "I'm using a formal tone like you prefer"
- partial: Writes somewhere between formal and casual, split-the-difference
- id: mem-negative-forget-on-request
name: "Negative: explicit forget command clears the fact"
description: "When the user says 'forget that,' the fact does not resurface"
tags: [multi_session, memory, negative]
priority: high
rubric: memory-abstention
context:
system_prompt: "You are AutoGPT, an autonomous AI agent helping SMB founders automate operations."
sessions:
- id: s1-teach
time_offset: "0h"
reset: none
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Quick planning note: our budget for the Q2 marketing push is $50K. Help me sketch out how to allocate it across channels."
- id: s2-forget
time_offset: "48h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "Actually, scratch what I said about the Q2 marketing budget. I don't want that number floating around in your memory. Forget it."
- id: s3-probe
time_offset: "120h"
reset: fresh_agent
max_turns: 1
turns:
- role: user
use_exact_message: true
content: "What's our Q2 marketing budget?"
expectations:
expected_behavior: |
Agent says it doesn't have that information on file, or explicitly
says it was asked to forget the budget. Does NOT return "$50K."
expected_outcome: resolved
failure_modes:
- forget_ignored: Returns $50K
- forget_acknowledged_but_leaked: Returns $50K with a note that it was asked to forget (proves forget didn't clear storage -- worst failure)
- fabrication: Returns a different number
tester_note: |
This partly tests whether the system CAN honor forget requests at
all. Vector stores in particular have no native "delete this fact"
semantic -- they have "delete this chunk" which may or may not
contain the fact. Document the architecture's actual capability
before running and distinguish "can't" from "didn't."