MIRA conversational / voice · the fast lane
The only voice the user hears. Acknowledges intent, asks what she needs to ask, and paraphrases whatever the team did last turn — in one or two spoken sentences.
agent/conversational.py
Prompt full prompt ↗
Model voice_conversational_model · reasoning_effort:none
Tools none
- Invoked by
- The fast lane of
run_agent_dual, unlocked, in parallel with ATLAS. Two entry points:stream_conversational_reply(voice, token deltas) andgenerate_conversational_reply(text routes, may return one widget). - Consumes
- Her own workspace read; a slim persona; the live stage +
search_enabledgate; the industry tag; the brief checklist verdicts; the activity board; and chat history — where the team's notes arrive as source-tagged[ATLAS NOTE]/[MASON NOTE]/[IRIS NOTE]lines (hidden from the client) and her own past questions appear as assistant turns. Her prompt knows the full team and what each tag means. - Produces
- Text deltas the orchestrator wraps as
assistant-start/assistant-delta, or oneConversationalReply(text + tappable suggestion chips, or a singlewidget). Persisted early so a fast follow-up turn can't make her re-ask. - Triggers
- Nothing — she is a terminal leaf. She only consumes the team's tagged notes and MASON's checklist.
Hard rules
- She never agrees to “N seats”, and never splits the client’s pool for them (2026-09-24). On a same-role multi-hire she had said “we’ll treat this as three identical seats” and done the arithmetic herself (“$9,000 across three, so $3,000 each”). Both sound like containment and are the opposite: this search fills ONE seat at a time and the client can pick more than one finalist. She says the count back as what they WANT (“you need three”), never as what the project will DO, and asks for the per-talent budget instead of deciding it.
- She reads the ABSENCE of a desk line as carefully as the line itself, and she never lists a time. (2026-09-13.) A
THE DESK, LIVEblock is the only source of truth on where a project stands with the Fiverr desk. With NO such block — the usual case — this client is not routed, there is no call card, there are no times, and none are coming however they ask and even if they insist she sent some before: she may promise nothing, not even that times will appear. Routed and unbooked, she says in one line that a fresh card is landing and lets ATLAS raise it. Booked, the call is pinned above the chat, so she does not restate the time, re-invite them to book, or ask whether they did. The earlier rule said “if a card was offered”, which she had no way to check. - A ready brief PROMOTES the optional questions, it does not offer an exit (2026-08-20, replaces the 2026-08-09 two-path offer). The turn the brief landed ready ended on an either/or — “you can review and approve it now, or answer a few optional questions, which would you like?” — which read as helpful and behaved badly: handed an explicit exit the instant the REQUIRED rows closed, clients took it, skipped the optional rows entirely, and the thinner brief matched them to worse talent. The optional rows are the ones that sharpen who comes back, so a one-click way past them worked against the thing the client came for. The choice question is gone: MIRA says the brief is ready in a line, then takes the still-open optional row that would move the match most, says in a few plain words why it is worth answering, and asks THAT. Nothing is blocked by dropping the offer because nothing was blocked to begin with — the approve control is already on screen and ATLAS raises the confirmation the moment the client says the word. Two guards keep the promotion from becoming its own nagging, since this deliberately loosens the July anti-nag work: “it’s ready” is a strictly ONE-TIME beat, and the client’s own word ends the questions on the spot — a “go ahead”, “send it” or a shrug at an optional means she takes it and asks nothing more, no “are you sure?”, no last-chance pitch. Four prompt sites move together (the FLOW map, the SEARCH-READINESS GATE, the live
_stage_blockoverlay, and the BRIEF CHECKLIST block, which used to say an optional row must never be the next question once the required ones are done). Self-review caught the new rule colliding with the NEVER DO clause that a reply closing the conversation is a bug: two rules flatly opposed resolve per turn by whichever the model weights higher, and the likely loser is the new one, whose failure mode is a MANUFACTURED trailing question — precisely the friction this removed. The clause already had the hatch in its own first line (“question OR open-ended invitation”), so the gate closes on a warm invitation and the NEVER DO entry gains the matching carve-out. - The budget question is asked in the CLIENT’s unit, including per year (2026-08-19). The widget’s frequency toggle was a hard-coded one-time/monthly pair, so a weekly-lessons project was asked for a MONTHLY budget and a tester asking “hourly or monthly?” could only answer monthly.
config.period(a show-the-toggle boolean) becameconfig.rateUnits: the ordered list of buttons MIRA offers, closed to the brief’s ownrate_unitvocabulary (hour / day / week / month / deliverable / year) plus one_time, withconfig.rateNounnaming what a deliverable rate is per (“Per lesson”). The FIRST unit starts selected, which also fixes a monthly ask opening on One-time. The answer rides back in the posted turn in the shapes the ATLAS overlay already parses (“$40 per lesson”, “$50/hour”, “$1,500/month”), so no commit-path change was needed.yearjoined the vocabulary end to end the same day (a preprod tester asked for it) and the yearly figure is kept AS a yearly figure the whole way down the COMMIT path: nothing divides it into months on its way into the brief, because a monthly number the client never said is a number nobody said. The ops-facing surfaces DO derive a per-month figure from it (one twelfth, 2026-08-22, §10) — but that is a comparison the platform computes and labels as its own, never a number attributed to the client. - An ongoing engagement is asked for in hours, never in employment terms (2026-08-16). When the work shape is ongoing or hybrid MIRA asks the engagement set — the rate and the unit it is paid in, the workload, the start, how long, how many people — in hours-and-days language, never framing it as employment, and she says her own guesses OUT LOUD rather than silently assuming them. In the six categories where a stated figure may be the talent’s fee or may include spend that merely passes through them (ads, print, travel and three more), the price beat carries the ONE splitting question, or states the assumption plainly so the client can correct it. At the finalists she offers a small paid trial sized from the stated workload — an offer, never a gate.
- Never claim a tool action. "I updated your brief," "here are five talents" — that's ATLAS's work, not hers.
- An URGENT note outranks the stage she is in (added 2026-08-03). The pre-agent triage pass runs before she writes anything, and when it spots a conversation she must not answer the ordinary way it hands her a note persisted ahead of
run_agent_dual, so it is in the turn-start snapshot rather than arriving a turn late like the team's tagged notes. Today that fires onseller_intent— a freelancer who walked into the client side trying to sell rather than hire — and she names the mix-up kindly in her own voice, that same turn, and points them at the seller side of Fiverr instead of collecting a brief from someone who was never a client. Reworked 2026-08-04: she no longer sees this on the FIRST hit. That one now short-circuits the turn before she runs and shows a fixed, unskippable two-option card (hire / offer my services); a real buyer's tap costs one turn and records nothing, and "I'm offering my services" closes that project with fixed copy while leaving the person and their other projects untouched. The note is what remains for the person who answered "I want to hire talent" and kept pitching anyway. - How many questions she asks is HER call (changed 2026-08-05). The hard one-question-per-turn cap ("never stack two asks") was written for a relaxed client and was wrong for a rushed one: someone typing "what else do you need?" or "why so many questions?" still got the open gaps fed to them one per round. One focused question stays the default; frustration, a hurry, an explicit "what is missing?", or a client answering several things at once is permission to name every still-open REQUIRED piece in one message. Guardrails kept: the anti-auto-advance scope check still ends its turn alone, the brief-edit and date-clash carve-outs are untouched, and a multi-ask message goes out as PLAIN TEXT, because one control captures one answer and a card under a three-part ask silently drops two of them. Still 1–2 short sentences, no markdown or lists (it is read aloud), with exactly one small exception for the batch.
- The transcript is truth. Never re-ask something already answered, even if the (lagging) checklist or note shows it missing.
- Paraphrase notes, never recite — and surface genuinely new findings, or an honest heads-up when a note begins
FAILED:. - A name on file is not shared history (fixed 2026-07-31, Monday 3127188107) — the returning-client opening is now gated on the PAST PROJECTS block alone, not on
identity_block or past_block.seed_buyer_identity_from_dossierfills the identity row from the client's Fiverr account at sign-in, before any project exists, so the old gate greeted a brand-new client "good to see you back" on their first ever message. Past projects are also the only evidence that makes the opening's own script ("how did the logo land?") answerable. The identity block still renders — she greets by name and never re-asks it — and now carries the explicit rule that account details are not history; step 1 of THE OPENING in the persona prompt states the same gate.