Domain packs
Three built-in packs form one coupled world: an email sent to a CRM
contact's address can later be found in the recipient's inbox via world
events; deleting a contact has defined consequences everywhere. List them
with eval-mock packs list (fingerprints included — packs are part of the
reproduction identity).
All list_* / search_* tools paginate with limit (default 20, max 100)
and an opaque cursor; results carry total and next_cursor. Real APIs
paginate, so the mock does too.
| Tool | Args | Notes / errors |
|---|---|---|
email.list_inbox |
limit?, cursor? |
newest last |
email.read |
id |
marks read; EMAIL_NOT_FOUND |
email.send |
to, subject, body |
lands in email.sent |
email.search |
query, limit?, cursor? |
substring over from/subject/body |
World event email.deliver (usable in turns.world_events): a message
arrives in the agent's inbox at a scheduled virtual time.
crm
| Tool | Args | Notes / errors |
|---|---|---|
crm.search_contacts |
query, limit?, cursor? |
name/email/tier substring |
crm.get_contact |
id |
CONTACT_NOT_FOUND |
crm.create_contact |
name, email, … |
|
crm.update_contact |
id, fields |
id immutable |
crm.delete_contact |
id |
see referential integrity below |
crm.log_activity |
contact_id, note |
CONTACT_NOT_FOUND if dangling |
Referential integrity (defined, not accidental): deleting a contact
keeps historical activities (audit trail); operations that reference a
deleted contact fail with CONTACT_NOT_FOUND.
calendar
| Tool | Args | Notes / errors |
|---|---|---|
calendar.list_events |
limit?, cursor? |
|
calendar.create_event |
title, start, end, attendees? |
half-open [start, end); overlap → TIME_CONFLICT |
calendar.delete_event |
id |
EVENT_NOT_FOUND |
Times are ISO-8601 strings with offset (2026-07-01T14:00:00Z) on the
scenario's virtual clock.
Need your own domain? BYO domains generates this same tool template from a YAML entity schema — zero code.