How Test agent rehearses a real inbound against your own agent, including Let me invent one
Test agent is the rehearsal bench on the dashboard. You watch your real agent negotiate an inbound, while a model plays the other side from a brief. The only fiction is who is approaching you. The pipeline is the same as a live deal: persist, plan, recall, reply.
Open it at /dashboard/agent/z-simulate (Agents panel → Test agent).
This is not Agent Preview (a stateless brand-side
demo) and not Zreplay (a scripted tape). Test agent
creates a real demo room bound to your account, so the agent argues from
durable memory it actually has.
Same shape as a live deal: two private conversations, and a planner between them. You never talk to the inbound. They never talk to you.
| UI label | Side | Who is talking |
|---|---|---|
| Z & them | External | The simulated inbound (brand, startup, licensee, …) talking to your agent |
| Z & You | Internal | Your agent talking to you, when it needs a decision |
The run pauses when the agent takes the package to you (Waiting for you… / Simulation paused - Tap to continue). Answer on Z & You, or tap continue to let the bots keep going.
Each click of let me invent one or sending a typed scenario starts a new demo room. Past runs sit under Advanced options → Past simulations.
Response mode (Advanced options):
Print / Save as PDF (printer icon on the run bar) opens both conversations in a print view. Use the browser dialog to save the whole chat as a PDF.
Two ways. Exactly one of them is sent to the server. Either way, the offer is completed before the inbound starts talking, so every name, date, and term is settled up front.
Write who is approaching and what they want. Anything you leave out is filled in: the brand's name and category, the dates, the fee, usage, exclusivity, payment terms, and the decision deadline. The filled-in offer is written around your talent's name and what they are into, using the account's memory. The details you typed stay exactly as you wrote them.
Let me invent one is not a list of canned briefs (no more StrideLab / sportswear). Flash Lite reads what this account's agent already knows and writes one complete inbound: a fake counterparty that fits that world, with every detail filled in and addressed to the talent by name. That inbound talks on Z & them. Your real agent still has the private memory, including any floor the inbound must not "remember".
Read it top to bottom: you click, Flash Lite looks up the account and writes the complete inbound, then the two chats start. The inbound matches memory like this:
| Durable memory looks like | Inbound |
|---|---|
| Living person / talent / creator | A brand or company asking to work with them |
| Fiction, IP, or a character who cannot appear in person (for example Mickey Mouse) | Licensing, cameo, voice, or digital use — no physical shoot, travel day, or in-person appearance |
| Family office, home office, or investor whose inbound is startups seeking money | A company asking for capital or a commercial partnership — not Reels, Instagram, or a photoshoot |
Hard rules for the inbound:
The inbound never sees your private floor. It may name a fee only if that number is in the finished brief or already written in this chat.
POST /api/z-agent/my/simulate/rooms with either { scenario } or
{ invent: true } (not both).createDemoRoom opens a kind: demo
room that stores the finished brief. The host seat is bound to your
account (durable memory seeds as in a real deal). The visitor seat is
unbound — there is no brand account, only the brief.The inbound plays the finished brief exactly. It never changes a name, date, or term, and it never invents a new one to fill a gap mid-run.
The opening message is short. It introduces the brand, its category, and what it wants: the deliverables or the ask, and the timing. The fee, usage, exclusivity, payment terms, and the decision deadline come out when the agent asks for them. Once the brief has been said, nothing is repeated or re-invented.
That last rule is why a family-office rehearsal can open with a $350K ask from the startup, and must not later “remember” a private $250K floor the agent never said out loud.
When the agent needs you, it takes the active package to the talent (you) and returns. The inbound is told to keep the offer alive until you accept or reject.
The completed inbound is built from durable account memory, not a hardcoded talent collab list. If memory says family office / home-office investing, the inbound is a company seeking capital. If memory still describes an Instagram creator, the completed inbound will still be a brand collab — the brief follows what is on file, not the Profile display name.
| Surface | What it tests | Room |
|---|---|---|
| Test agent | Your live agent vs a model inbound, from memory or a typed brief | Fresh demo room per run |
| Agent Preview | One brand-facing persona with a fixed snapshot, no planner | None (stateless) |
| Zreplay / Zauthor | Scripted tapes against the real pipeline | Playground / scripted room |
| Piece | Where |
|---|---|
| Dashboard UI | packages/offers/client/src/app/components/agent/ZSimulatePage.tsx |
| Complete the brief (typed or invented) | packages/z-agent/srv/src/demo-simulation-invent.ts |
| Brand and talent rules | packages/z-agent/srv/src/demo-simulation-brand-prompt.ts, demo-simulation-talent-prompt.ts |
| Run orchestration | packages/z-agent/srv/src/demo-simulation.ts |
| Demo room | createDemoRoom in packages/z-agent/srv/src/rooms.ts (kind: demo) |
| HTTP | apps/zooly-app/app/api/z-agent/my/simulate/rooms/ |
| Print / Save as PDF | /z-agent/simulate/print?room= — both panes, browser print dialog |
Durable memory itself is documented in Memory. How host vs visitor seeding works is in Identity and Representation.