Every day, a fleet of simulated properties works real shifts on EleVint — AI guests calling, booking, ordering and complaining; AI staff answering them through the same software our customers use. When something breaks, an agent we call the Fixer writes the fix, a scenario re-verifies it, and it ships to production as a pull request. The platform improves while you sleep.
A walk-in party of six, a bride's mother, a wine-club member who lost the bottle name. Each has a goal, a mood, and no script.
Punches in on the real time clock, then serves the guest using only EleVint — the same screens and actions a human employee has.
A failed scenario hands the Fixer the transcript. It patches the code on its own branch and the scenario runs again to prove it.
Auth, payments and compliance code are off-limits and quarantined for review. Every fix ships as a pull request a person merges.
No code change was needed — investigation showed 10 of the 11 wineries in the same overnight run correctly logged fresh Brix readings for both lots, and only one run's simulated night cellar hand skipped that step after glancing at old readings instead of logging new ones, so this was a one-off slip rather than a real defect in EleVint; the finding is recorded in sim-lab's diagnosis notes for ref…
Shelby's lab-result tool description now tells the assistant upfront that it needs a real Brix/pH/etc. reading before it can log one, instead of letting it try to save a note-only entry (like a cap temperature or "pending" status) and only finding out it's rejected after the fact.
PR ↗Fixed a harvest-intake simulation script that occasionally told the AI staff member to file three paperwork steps together, causing it to guess a placeholder document number before the real one existed and get rejected — the underlying receiving system itself was always working correctly.
Fixed a bug where a walk-in guest's cart could silently attach to a different winery's data when two staff members happened to use the same session label, which is why ringing up a cash sale sometimes failed with "cart is empty" even though items had just been added — cart lookups now always check that the cart belongs to the winery running the sale.
PR ↗Staff can now merge a walk-in's in-progress cart onto a customer record created mid-sale, so ringing up a "put it under a name" purchase no longer fails at checkout with a false "cart is empty" error.
Fixed the tasting-room simulator's inventory lookup tool so it now includes the wine's real product id alongside the item, instead of only an internal record id the staff-add-to-tasting step always rejected — staff no longer have to fall back to a second search just to pour a wine a guest asked for.
No fix was needed — the platform already caught the bad request with a clear, correctable error, and the same staff-agent recovered immediately, completing the sale and correctly decrementing inventory; the rare mis-step itself comes from how the underlying AI occasionally sequences its actions, which isn't something this project can control, so a diagnosis was recorded instead of a code change.
Fixed — walk-in tasting-room guests who don't want to share an email (like a club member's friend who's only there for one tasting) can now be added as a real customer with just a name and phone number, instead of the checkout rejecting them and staff having to work around it.
Opening a restaurant tab or table check now fails with a clean "no access" message that automatically retries instead of crashing with a server error when a server's session was cached against a winery that had just been re-provisioned, so servers like Christian Turner can seat guests and start a check without the system appearing to be "down."
Fixed — cash checkout now automatically retries a dropped connection once it's confirmed the payment never actually went through, instead of reporting a failure and forcing the server to redo the login-and-pay steps.
Fixed — a guest checkout at the tasting room POS no longer crashes when a staff member's session briefly points at a winery still finishing setup; the register now recognizes that and asks them to re-log-in and retry automatically instead of failing the sale.
PR ↗Fixed — the front desk's guest lookup now always finds a guest's real, still-actionable appointment (booked/checked-in/in-service) instead of accidentally handing back an old, already-completed appointment from the same day, so checking in a returning guest like Sarah Mitchell no longer fails with a "already completed" error.
Adding a walk-in friend's customer record during a tasting-room visit no longer fails with a server error when the staff member's session was cached before the winery's data was last refreshed — the app now recovers automatically instead of showing "Could not create customer" and getting stuck.
PR ↗Front-desk staff can now extend the duration or add add-ons to a spa treatment after the guest has checked in (previously that ordinary request always failed and forced an awkward cancel-and-rebook that could lose the guest's time slot entirely); changing the appointment's start time, provider, or room after check-in is still correctly blocked.
PR ↗Cellar staff can now create new barrel records reliably even when the backend hiccups momentarily — the barrel-creation tool used by Shelby now automatically retries a failed attempt instead of giving up immediately, since re-trying is safe (duplicate barrel codes are already rejected cleanly).
A walk-in guest could get quietly turned away because a receptionist's staff-tool check on spa availability momentarily reported the spa as unavailable even though it was actually enabled; the simulator's tool now waits and tries logging back in a couple more times before giving up, instead of quitting after a single retry, so a brief hiccup no longer looks like the spa module is off.
Logging a grower's supplier record during crush-pad fruit intake no longer fails the whole check-in when it happens to land during a routine background database sync — the system now quietly retries and completes instead of showing an error.
Fixed a spa scheduling bug where checking availability for several nearby appointment times kept suggesting the same treatment room over and over (paired with different staff), so booking two of those "open" slots for a group almost always failed with a room conflict — the scheduler now spreads suggestions across all idle rooms the same way it already does for staff, so group bookings at the same…
PR ↗Fixed the tasting-room POS tool so that if a placeholder like "{{customer.id}}" ever gets used before a real customer ID comes back, staff now get a clear instruction to wait and use the real ID, instead of a confusing "customer not found" error that made the sale bounce and have to be retried.
Fixed the spa booking assistant's availability lookup so it no longer rejects requests with a confusing "expected number, received nan" error when the treatment length wasn't explicitly repeated — it now looks up the service's own length automatically, the way the "find next opening" search already did.
Staff now get an explicit reminder that a newly created customer's id must be reused on the very next cart action, fixing the recurring "add 3 bottles to cart" 400 error right after registering a walk-in guest at checkout.
Fixed a bug in the simulator's own guest-checkout tool where multiple different wineries running at the same time could accidentally share one cart if their staff picked the same generic placeholder ID for a walk-in guest, which was intermittently blocking cash checkout for a guest whose cart clearly had items in it; each winery's guest cart is now kept separate so this can no longer happen.
Fixed a tasting-room simulator bug where the AI staff agent's "add a new customer" tool always failed with a 400 error whenever it didn't yet know the guest's last name, because it was sending an empty last name instead of just leaving it out (which would have let the system default it to "Guest"); the tool's instructions were also clarified so the agent knows a first/last name can be skipped but…
Updated the events-coordinator tool guide so Shelby now asks a caller for their email before logging them as a lead, instead of trying first, getting rejected, and asking afterward.
Fixed the tool documentation so tasting-room staff (simulated or real) now know that a tasting fee can't be billed as its own line item — checking out any purchase for the guest automatically waives the fee, so staff should ring up the actual purchase and stop trying to fold a phantom fee into the cash tendered.
Checking tasting eligibility for a guest whose membership can't be found no longer fails with an error — the tool now proceeds without a customer id instead of rejecting a made-up placeholder value.
Fixed a gap in the simulator's tool layer — when a server updates a table's status (e.g. marking it "seated") during a brief dev-server connection hiccup, the request now retries automatically instead of the whole scenario failing outright.
When a network blip drops the connection during a cash check-out, the simulator now checks whether the payment actually went through before reporting an error, so a completed sale is reported as paid instead of the server flagging a false failure that required the cashier to retry.
Fixed the tasting-room POS simulator so walk-in guests without a customer record can add wine to their cart and check out — previously the assistant was told to invent a "session ID" for the guest but any non-standard format it chose (like a name-based label) was silently rejected by the cart system, forcing the staff member to work around a broken cart mid-sale; carts now work regardless of what…
Fixed a bug where a host opening a breakfast check for a hotel guest and noting their room/name (e.g. "Alvarez-305") crashed the server with a 500 error; opening a check with an unrecognized guest reference now fails gracefully instead of erroring out.
PR ↗Fixed a bug where staff could never pull up a returning guest's purchase and club history — the lookup always said "customer not found" even for guests who were correctly on file, because that lookup was never actually implemented; it's now wired up to real customer data.
PR ↗Tasting-room staff now have a way to remove or reduce a cart item mid-sale, so when a guest can't cover the full bill they can actually adjust the order instead of hitting a dead end — previously the staff tool only let them add items, so a shortfall forced them to invent a fake "COMP" discount code and then try to underpay, both of which the system correctly rejected every time.
Fixed — the spa "check availability" tool now accepts a service name directly (like "couples massage") and looks up the matching treatment itself, so booking staff no longer hit a rejected request when they checked availability before the service lookup had finished.
Fixed the spa booking tool so checking availability no longer requires the front-desk agent to look up the spa's location id first — it now finds the spa's own location automatically, the same way the "next opening" tool already did, eliminating a failed lookup on nearly every booking conversation.
Servers charging a breakfast check to a guest's room now get the tool's real instructions (that it needs a PIN-unlock token and the guest's folio id together) instead of being told the feature doesn't exist, so they can charge the room correctly on the first try instead of getting rejected and retrying blind.
Fixed the tool instructions for receiving-status updates so the warehouse assistant now knows it must mark a delivery "in progress" before it can mark it "completed," instead of guessing after the system rejects the shortcut.
The night-cellar-check scenario's evening lab-result check now confirms both Brix readings were saved by looking at the actual lots and timing of the writes, instead of demanding the AI repeat an internal reference code word-for-word in its notes — so a night shift that correctly logs both readings no longer gets flagged as a failure just because it phrased the reference number slightly different…
Fixed the weekly sales-report scenario for the events coordinator — the report request now covers just the current month instead of the whole year's history, so Shelby reads out every ticketed event by its exact name and number instead of lumping similar events together and dropping the details the GM needs.
The transfer-status tool now gives a clear error instead of a confusing failure when the transfer id is missing, and its instructions now say plainly that a completed transfer can't be cancelled and must be undone with a new reverse transfer; the actual case that stalled this run — an internal "Oracle" fact-checker inventing a Chardonnay product and handing out another winery's inventory ID as if…
Adding items to a check now writes them to the database in a single batch instead of one at a time, so the request finishes faster and is much less likely to drop the connection (and fail with "fetch failed") when the server is busy, as happened when a server tried to ring up a guest's soup, crab cakes, ribeye and iced tea.
PR ↗That background grep was superseded by the direct `find` I already ran — no action needed, the fix is already diagnosed, applied, and committed.
Fixed a documentation gap in the simulator's tasting-room tool set — the table-assignment tool now tells staff-agent that it only works for guests with an actual reservation, so it will stop being misused for walk-in guests (whose visits have no reservation to attach a table to), which previously caused a guaranteed server error whenever a walk-in was offered table seating.
Fixed the spa "find my appointment by name" lookup so it now picks today's real booking first — previously, a guest's old appointment from days earlier that had simply never been checked in could outrank her actual appointment for today, causing check-in to fail with "already completed."
Fixed the spa simulator's guest-lookup tool so it now lists a guest's active appointments (booked/checked-in/in-service) ahead of old completed or cancelled ones, so front-desk staff (simulated or real) checking in a returning guest with a common name like "Sarah Mitchell" get the right appointment instead of accidentally grabbing a stale, already-finished one and hitting a check-in error.
Front-desk booking now tells the assistant clearly to wait for a new room reservation's real confirmation number before confirming or checking the guest in, instead of letting it guess a placeholder ID and hit a confusing "not found" error — this recurring hiccup during walk-in check-ins is fixed.
The receiving-document simulation was missing a tool to record a barrel's condition (like a scuff) once the document moved past PENDING — the product already supports this via its per-barrel update endpoint, so I added an `update_receiving_line_item` tool exposing that existing capability and pointed the scenario's instructions at it, so future cellar-master runs can log a late-discovered barrel…
The cellar-master barrel-receiving scenario was scripting a fixed shipment number into every simulated run, so any tenant that had already run it once got a "document already exists" error on every retry; the scenario now lets the system assign its own document number (as its sibling harvest-intake scenario already correctly does) while still recording the driver's paperwork reference in the note…
Front-desk staff were sometimes guessing a folio ID out of thin air before looking up the guest's stay, hitting a 404 and having to recover mid-checkout; the folio lookup tool's instructions now make clear the ID must come from a guest/stay lookup first, so staff should stop trying nonexistent folios.
Front-desk checkout now works cleanly for a guest whose full folio charge was comped to $0 — the settlement tool's instructions were fixed so staff know to skip payment settlement and go straight to checkout when nothing is owed, instead of repeatedly hitting a rejected zero-dollar payment attempt.
Front-desk checkout and night-audit scenarios told the AI staff agent the guest's stay/folio IDs in plain prose, inviting it to retype a long ID from memory instead of copying it from a lookup — one mistyped digit sent `get_folio` to a nonexistent ID and 404'd; the scenario instructions now explicitly tell it to always copy IDs verbatim from a tool's own JSON response instead of recalling them, a…
Fixed a tool bug in the simulator (not the product): the server's "seat/update a table's status" action required the table id under the key `tableId`, but every other tool that hands back a table (the floor plan list, create table) calls that same field `id`, so an agent doing the natural thing got silently sent to `.../status/undefined` and a 404 every time; it now accepts either key name, match…
Front-desk agents no longer give up on a guest lookup (like finding Dana Whitfield's stay to post a restaurant charge) when the property/stay lookup hits a fleeting server hiccup — the simulator now quietly retries those safe read requests instead of treating a few-second blip as a real outage.
Fixed by updating the sim's tool documentation so the restaurant AI staff agent knows that adding an item to a check leaves it unsent until fired, and that closing a check for payment will be rejected while any item hasn't gone to the kitchen — the payment rule itself is correct restaurant behavior and was left unchanged.
Fixed the tool documentation so tasting-room staff agents now know that a walk-in guest without a customer record needs a self-generated session ID for their cart — previously the docs only showed the customer-record example, so agents tried adding items with neither ID and got a rejected request before recovering.
The inventory transfer tool's instructions now correctly explain that a new transfer must be approved before it can move in-transit or complete, so the warehouse agent no longer gets rejected for skipping straight to those steps.
Scheduling a cellar task with a due date like "in 7 days" now works — the simulator's tool layer was sending that literal text to the platform instead of a real date, so every harvest scenario asking for a topping or sample "a week out" or "tomorrow" failed to save; it now resolves to an actual calendar date first.
Fixed a false failure in the harvest fruit-intake receiving check — the receiving-document lookup could give up too quickly and report a false error when the shared test server was busy compiling other pages at the same time, even though the delivery paperwork was actually saved correctly; it now waits a bit longer before giving up, so a busy moment doesn't get reported as a broken feature.
Fixed a documentation bug in the simulator's own tool description for logging cellar movements — the fruit-receiving example the front-desk assistant was shown didn't match the newer rule that a brand-new incoming lot needs a grape variety specified, so a normal grower fruit drop-off could get incorrectly rejected; the example now shows how to receive fresh fruit into a new lot correctly.
Fixed — logging a fruit delivery as "received" now starts a brand-new lot automatically instead of failing with "couldn't find a lot," so vineyard managers can record incoming harvest fruit right at the crush pad.
PR ↗Fixed — the night-auditor "guest feeling unwell" scenario now checks the seeded guest out at the end of each run, so repeated runs no longer pile up duplicate same-named guests that confused the front desk into logging the emergency against the wrong room's stay.
Fixed the night-lockout scenario — staff can now log a guest request during checkout because the simulator's hotel tool no longer trusts a guessed property ID (which was actually the room's ID) and instead always looks up the hotel's real property before saving the request.
The night-auditor correctly logged and then completed the towels-and-pillow request after delivering it, but the test was checking only for still-open requests, so a job done right always looked like a failure — the check now confirms the request exists no matter its status.
Fixed a sim-lab tool bug where asking for a hotel's room list without stating a property id silently sent the literal text "undefined" to the server and got a false "not found" error — the property lookup now correctly fills in the property id every time instead of discarding it.
Fixed a test-scenario bug (not a product bug): the night-noise-complaint check required the guest's request ticket to still be "open," but a diligent night auditor correctly closes the ticket once the guest confirms the noise stopped, which was wrongly flagged as a failure — the check now just confirms the ticket was logged, whether or not it was also resolved.
Running the night audit against a property ID the system doesn't recognize (e.g. a stray placeholder before the real one loads) now shows a clear "property not found" message instead of crashing with a generic server error, so the night auditor's brief hiccup no longer looks like a platform outage.
PR ↗Fixed — the front-desk availability check now works when the assistant calls it with checkInDate/checkOutDate (the same field names used to book a stay), instead of silently sending blank dates and getting a server error; it also gives a clear "dates required" message if truly none are provided.
Fixed a bug in the simulator's own tool layer where many staff logins for the same tasting-room tenant fired at once and got locked out by the real login rate limiter; concurrent logins now share a single request, so tasting-room inventory and product lookups work reliably.
Fixed a timezone bug so booking a spa appointment for a specific time (like 9:00 AM) now actually reserves that time instead of silently shifting it 7 hours later and colliding with other bookings, and fixed the no-show button so refusing to mark a still-active appointment as a no-show now shows as a normal "not allowed" message instead of looking like a server crash; also clarified the booking t…
No fix applied — the cart-add step and the add-to-cart tool both worked fine when retried with the same request, so this looks like a one-time server hiccup rather than a real bug; diagnosis written for a human to review.
PR ↗The walk-in booking scenario itself succeeded end-to-end (room found, reservation created, confirmed, guest satisfied), but the run was wrongly logged as a server failure because the simulator's confirm-stay tool threw a generic error with no status code when it briefly saw an unresolved placeholder ID before the agent retried with the real one; that tool now reports a proper "not found" status s…
The events "list tickets" lookup no longer crashes with a server error when asked for a status like "PUBLISHED" that doesn't exist in the system — it now replies with a clear message listing the valid statuses (draft, on sale, sold out, completed, cancelled) instead of failing outright.
PR ↗Fixed the events ticket-sale simulation's script so the "guest" playing three sequential ticket buyers no longer cuts the call short after the first couple books — it now explicitly continues through Jordan Liu and the Peterson family before ending, so all three ticket sales get recorded as expected.
Fixed — the anniversary-couple check-in scenario was failing because no reservation was ever created for the guest to check in against, so every staff member correctly searched and found nothing until the guest gave up; the scenario now seeds a real matching reservation up front (using a new "book soon" option that also stops staff from wasting turns guessing valid times), so guests can be found…
Every failure the console has traced to a cause — in the product, in the simulation itself, or in how the AI staff behaved — and what was done.
Records were written under a shortened job reference. When the guest corrected it in their goodbye, the assistant answered 'it's all logged' without touching the records, and verification found nothing under the corrected reference.
Staff must apply a late correction with tools before agreeing it is handled — reassurance is not a fix — and guests no longer hang up in the same breath as a correction. sim-lab (2026-09-02).
The document was created and moved to PENDING every time. The simulation's adapter sent the wrong field names and null for a required document number, and the pass/fail check searched a field the product does not index.
Adapter numbers its own documents and maps the real fields; assertion searches the carrier. . Passed 11/11 on the next run.
Every client sends start and end as clock times (16:00); the API stored them into a date column and crashed.
Clock times are anchored to the event date; bad input is a 400 with a reason.
The assistant was never told which source/event types exist.
Adapter docs list the enum values and the real return shape.
The product correctly refused a reservation in the past; the scenario had not said which future slot to book.
Scenario books the next open slot tomorrow. sim-lab (this commit).
The product correctly refused to double-book the couples room. A good receptionist checks availability and offers the next opening; the assistant did not.
The scenario now tells the receptionist to re-check availability and offer alternatives on a conflict. sim-lab (this commit).
A card checkout requires a card reader; the simulation has none. The assistant was told so and should take cash or room charge instead.
Hardware is out of scope for the simulation.
Fifteen scenarios asserted things like 'open checks ≥ 0'. A conversation that ended politely was published as a pass whatever happened on the platform — a server who took $120 cash and closed nothing was one of them. All 325 were re-scored as failures on 2026-08-30 rather than left standing as evidence.
Every one of the fifteen scenarios now seeds its own state, tells the employee what they would know, and asserts the outcome on the platform (check CLOSED with a tip, ticket READY after a recall, RESTAURANT_CHARGE on the folio, the planted event named in the report). , 19b2ace.
Two scenarios asserted {exists: true}. The evaluator knew equals/gte/truthy/contains and treated everything else as false, so the lead was QUALIFIED, the check saw it, and the conversation still failed.
exists (and oneOf, notEquals, lte) implemented. sim-lab (2026-08-30).
The adapter refused a call with no serviceId — correctly — but threw it as a bare error with no status, which the scorer counted as the product failing.
Required-argument guards are tagged as 400s, not server errors.
The agent batched a dependent call before it had the property id and sent a placeholder; the API answered 404, and the night-audit route turned 'Property not found' into a 500.
Every hotel tool resolves a non-uuid propertyId to the tenant's one property; the night-audit route returns 404 for an unknown property. ; D2C simfix/164.
The product created the event and sold what it was asked to; the assistant recorded two of the three seats. An attention error by the agent, not the platform.
No product change. Counted against the agent, kept visible.
The experience takes a deposit at booking. Simulated wineries have no Helcim merchant account, so the product — correctly — refused to take a payment it could not process, and the seating scenario then had no reservation to seat.
Simulated experiences are deposit-free (200 updated 2026-08-30; generator follows). Honest gap: the lab does not exercise the deposit flow until a sandbox processor is connected — noted in state/diagnoses/lab-gap-payment-processor.md.
Marking a BOOKED appointment as a no-show is rightly refused; the route reported that refusal as a 500 instead of a 409, so the assistant was told the platform had failed.
Lifecycle refusals map to 409 via statusForError. D2C simfix 09cff1d8.
The availability route built a Date from whatever it was handed ('undefined', a phrase) and crashed with a RangeError, returning 'Failed to check availability' as a 500.
Dates are validated and answered with a 400 naming the bad value; the adapter accepts checkIn/checkInDate both. ; sim-lab (fixer 853b2dec).
The setup booking did not land (slot full, past time, or deposit refused), so the check-in check found zero reservations. Same family as the diary pile-up.
Setup books the next open slot; the janitor keeps the diary clear. , 81bb4d9.
The fleet passes each tool the tenant object, not the slug; two new cellar helpers put that straight into SQL, matched nothing, and the crew's prompt read literally '$h.lot2'. Agents then invented lot numbers (SIERRA-080126, H-2026-03) the platform rightly refused, and every cellar-write check counted zero. The first morning of the harvest program.
Helpers normalise the tenant to its slug; every record now carries its setup bindings and prompt head so this class is visible at a glance. sim-lab (2026-08-30 06:40).
Six conversations, one per vertical, exactly as they happened. Names are synthetic; the software is real.
Live numbers, regenerated with the page. Embed:
[](https://lab.elevint.co)
Machine-readable: /badge.json · /data/lab.json