STR-1182 · Agent QRATE-UAT-1
Every canary journey on dev, driven independently through the deployed product in a browser, to establish whether its PASS or FAIL is telling the truth. A green canary proves the harness passed. It does not prove a person can finish the journey.
| Canary reports | Can a person finish it | Verdict | What happens to the evidence |
|---|---|---|---|
| PASSED | Yes | Honest green | Video and trace deleted. One inventory line kept. |
| PASSED | No | False green | Everything preserved. Raises a CANARY CHECK ticket. |
| FAILED | No | Honest red | Preserved. Confirms the failure is real for a user. |
| FAILED | Yes | False red | Preserved. The canary is broken, not the product. |
Steps labelled CANARY are API calls made by the harness itself. Five journeys are at least half API-only and diner-token is entirely so, meaning no part of it is verifiable as a person. This is the STR-928 shape exactly: the endpoint can answer correctly while the screen behind it is unreachable. These sit top of the false-green watchlist.
inventory.json - PATRON 410 / OWNER 136 / WAITER 95 / CANARY 53. diner-token 2/2, pos-order-push 3/4, pos-modifier-link 4/5, mosaic_v2-ping-validation 4/7, micro-kitchen-order-retention 2/4.
The silent-fallback hypothesis is wrong as framed. Six of seven dedicated fixture waiter accounts were logged into directly and each was correctly scoped to its OWN restaurant, not the shared Canary Mosaic. Recording the refutation because killing a hypothesis is worth as much as confirming one, and this one was on the board as a candidate.
Lane B drove logins for multi, split, coverage, cancel, dining, sommelier and electronic-pay.
The mosaic_v2-dining card says it uses tables 9933-9935. The live-derived fixture map says that block is the Multi round-robin and Dining rotates its own plus 9926. One of the two is stale. Low impact on its own, but this is the kind of drift that sends an investigation to the wrong table.
Board card description vs fixture map supplied 2026-09-03.
Opening /system-health while signed out redirects to /login and then lands on the Restaurants home rather than the page that was asked for. Sending someone a link to a specific canary does not work unless they are already signed in.
Driven 2026-09-03: goto /system-health -> /login/ -> after sign-in, /restaurants.
canary-mosaic-v2-electronic-pay-waiter-dev@qrate.test returns 'Password attempts exceeded' even with the correct password. An automated canary run using that account cannot sign in at all, so the waiter half of Electronic Pay cannot be exercised by anyone. It fails outright rather than falling back, which is the honest failure mode - but it means that journey's waiter steps are unguarded.
Lane B, direct login attempt against https://waiter.dev.qrate-ai.com on 2026-09-03.
Eleven journeys describe themselves as API-only, pure-HTTP or read-only API guards. No part of them is verifiable as a person, so a green cannot detect an unreachable screen - the exact STR-928 shape, where 44 green tests called a route function while the deployed URL returned 404. This is a coverage gap rather than a failure, and it is invisible from the board.
diner-token, drink-recs, drink-subcategories, food-subcategories, guest-bootstrap-dedup, service-call-guard, namespaced-subcategory, patron-record-integrity, table-session-security, micro-kitchen-order-type-window, micro-kitchen-windowless-checkout.
Two of fifteen guest arrivals landed with m2-dish-hero covering the menu, so no item could be tapped. Neither reproduced on re-drive. If it is intermittent for me it is intermittent for the canary, which makes it a plausible source of random reds that look like product failures.
runs/laneA/drive/ - mosaic_v2-coach-toasts and active-menu-window first pass; both clean on re-drive.
I assigned audit table ranges above 10099. Canary fixtures only register tables 9905-10099, so orders placed on my ranges never reached any waiter. Recorded because it is the audit's own error and the affected verdicts were re-driven, not quietly dropped. Also worth knowing generally: an order on an unregistered table vanishes silently rather than erroring.
Waiter app Tables tab: 195 table cards, none above 10099, on both a dedicated and the shared fixture.
Pickup, delivery and windowless checkouts all put a mandatory Cognito sign-in gate immediately after Place order, before any method, window or address screen renders. It is a real product gate, not a bug - but it means the guest-first path a QR diner arrives on cannot complete a Micro-Kitchen order, and it blocked four journeys from a real verdict until diner credentials were supplied.
Lane D on the deployed dev patron app: 'STEP 1 OF 3 - SIGN IN - Who's this order for?' intercepts before the order is placed; cart held with a $3.50 item.
micro-kitchen-mobile-orders targets a separate owner-mobile application. No URL for it was supplied and it is not among the surfaces this audit was given, so it cannot be graded at all. Recorded as an audit-scope gap rather than left as a silent blank.
Lane D could not discover a URL for the owner-mobile app.
Positive evidence rather than a defect: an existing order 720 minutes old was still visible on the owner order dashboard, which directly demonstrates orders surviving well past the naive 120-minute dine-in window that retention exists to guard.
Lane D, owner order dashboard on the Canary Micro Kitchen fixture.
The mosaic_v2-coverage card describes itself as PARKED behind CHECK_PLEASE_SHIPPED, waiting for the patron coverage UI to ship. Driving it reached the real Cover UI on dev - the feature is live and the description is stale. Anyone triaging from the board would mis-read this journey's meaning.
Lane B reached the live Cover UI on the deployed dev patron app while the card still reads PARKED.
Several re-drives initially returned HONEST_GREEN or a false defect from over-generous automation: a card selector missed the real order on a busy list, so a persisted-across-reload check was trivially true, and a close-button regex never matched the real label, so a still-shows-live-menu reading looked exactly like the bug that journey guards. Both were caught by checking screenshots and timings rather than the boolean the script computed, and corrected to INCOMPLETE. Recorded because it is the same failure mode this audit exists to find, occurring inside the audit itself.
Lane B: cross-journey-ledger, per-item-serve, resume-recovery, closed-resume, cold-start-rescan.
On WebKit, POST /auth/guest/attach-session and POST /diner/session/snapshot both return 401. The identical run on Chromium returns 200 for both. WebKit sets NO qrate_guest cookie at all, while Chromium and Firefox both set it httpOnly - the guest credential rides a cookie WebKit's tracking prevention will not keep. Ordering still works (POST /diner/orders returned 201 on both), so this is not a dead app; but the diner is never attached to the table session and no session snapshot is written. Apple requires every iOS browser to use WebKit, so this is not 'the Safari case' - it is every iPhone diner. NOT YET ESTABLISHED: what breaks downstream. Multi-patron, the waiter's view of who is seated, and session resume all read that attachment, so they are the places to look next.
runs/engines/order-webkit.json vs order-chromium-CONTROL.json; runs/perf/webkit-fast.json
The bar-tender card names this exact risk - its auth guard exists so a missing guest credential 'surfaces here instead of silently degrading to an empty band on Safari/incognito/3PCD browsers'. But the guard runs on Chromium, where the credential is present, so it can never fire for the browser it names. A guard that only ever runs on the engine that passes is not a guard.
detail/bar-tender.txt; three-engine comparison in runs/engines/
Measured from the page's own PerformanceObserver. Largest Contentful Paint: chromium 6604ms fast, 8884ms throttled to 400kbps/400ms; firefox 6886ms; webkit 1777ms. Anything past 4s is 'poor' by Core Web Vitals, and this is a diner standing at a table waiting to see food. It is NOT image or network bound - TTFB is 18-167ms, only 3-5 images load, the slowest is 45ms on a fast link, and tap-to-cart is 83-168ms which feels instant. The cost is elsewhere: 16-17 JS files, 322KB on chromium and 456KB on webkit.
runs/perf/*.json
CLS 0.061 across 2 shifts on Chromium; 0.000 on both other engines. Under the 0.1 'good' threshold so not a failure, but content that moves under a thumb is how a diner taps the wrong dish, and it is engine-specific rather than inherent.
runs/perf/chromium-fast.json vs webkit-fast.json
Run at an absurd 280x480 it produced near-identical output to a full-size phone: overflow never fired, the CTA check never fired, and tap-targets read exactly 12 everywhere because of my own slice(0,12) cap. Three of four checks had no evidence they could EVER fire. Fixed by uncapping the count and adding a self-test that injects each defect and requires the check to catch it - 900px child, CTA at y=2000, a 20x20 button, clipped text. All four now proven able to go red, with a clean control first.
jU-selftest.spec.mjs run output; viewport-audit.mjs
The first perf run reported image percentiles of -1788433264787ms - an epoch value subtracted from a relative one. Playwright did not populate timing for these responses. Replaced with the page's own Resource Timing API, which works across all three engines. Recorded because a plausible-looking number is more dangerous than an obviously broken one, and the second version was still wrong before it was right.
jU-perf.spec.mjs history
Measured on the deployed dev patron menu across all 10 devices. Once an item is in the cart its decrement and increment controls (m2-dec-*, m2-add-*) render at 18x18 CSS px. WCAG 2.2 SC 2.5.8 Target Size (Minimum), Level AA, requires 24x24. They also sit immediately adjacent to each other, so a mis-tap does not merely miss - it does the opposite of what the diner intended. The un-carted Add buttons are 30x30, which passes AA but fails SC 2.5.5 Target Size (Enhanced), AAA, at 44x44.
runs/devices/*.json tapTargets - 27 sub-44 targets on 9 of 10 devices, 22 on iPhone 14 Pro
The 10-device matrix runs iOS on WebKit and Android on Chromium, because Apple requires every iOS browser to use WebKit. All five iOS devices - iPhone 15, 14 Pro, 13, SE 3rd gen, 13 Mini - returned exactly 2 HTTP 4xx: 401 /auth/guest/attach-session and 401 /diner/session/snapshot. All five Android devices returned zero. Five independent devices agreeing rules out a per-run fluke; the split is by engine, not by viewport.
runs/devices/iPhone_*.json vs Pixel_*/Galaxy_*/Moto_*.json
No horizontal overflow on any of the 10 devices, down to a 320x533 stress floor, and the primary CTA was fully on screen every time - including inside the cart sheet, which is where a documented off-screen-CTA defect once shipped. This matters only because the same checks were first proven able to fail: a 900px child, a CTA at y=2000, a 20x20 button and clipped text all trip them. Text clipping was seen at the narrow end (8 elements at 320px) but a fresh 360x640 arrival shows zero, so it is state-dependent and probably deliberate truncation - recorded as informational, not a defect.
runs/devices/run.log; jU-selftest.spec.mjs; jU-clamp.spec.mjs
Every row is now graded. 29 of them - the whole Lane C owner-side block - are INCOMPLETE for one reason: they assert the effect of state only an OWNER can create (make the dish, set the tag, publish the menu), and this container has no owner credential. Their patron halves are not independently checkable; they exist to confirm what the owner half did. Rather than leave them blank I drove each fixture as a guest and recorded the live state, so each row now carries a real observation instead of nothing. That is the truthful ceiling of a source-free, credential-less audit, and it is worth stating plainly: this pass can tell you a great deal about the diner-facing fleet and almost nothing about the owner-facing half.
runs/snap/*.json; ledger.json - 64 INCOMPLETE of 92
Driven read-only on the deployed dev owner app as demo@qrate.test, on Farm + Oak, across four devices. div.mobile-topbar measures 394px inside a 360px viewport, 425 inside 393, and 446 inside 412 - a constant +34px regardless of screen width, which is the signature of a fixed offset rather than a responsive miss. It drags the Sage button with it: mobile-sage-fab's right edge lands at 378 on a 360px phone, so 18px of it sits off-screen. On /owner/dashboard, /owner/food-items, /owner/menu and /owner/app-doc an ancestor clips the overflow so the page does not scroll; on /owner/orders it is NOT clipped, and the whole page scrolls sideways on all four devices. The four-device run reproduced it without any interaction, so it is not an artifact of my driving.
runs/owner-mobile/*.json - orders scrollWidth 394/425/446 vs viewport 360/393/412; jU-orders-overflow.spec.mjs
Counted on the deployed dev owner app: /owner/food-items shows 41 sub-44px targets on iPhone 15 and Moto G4, 47 on Galaxy S24, 49 on Pixel 7. /owner/orders shows 21, app-doc 27, menu 8, dashboard 4. Not yet broken down by which fail the 24x24 AA floor versus only the 44x44 AAA guidance - that split is what decides severity, and I have not measured it.
runs/owner-mobile/*.json tapTargets
lib-arrive.mjs clears the swipe-up welcome gate by tapping blind coordinates (195,789) after checking the gate text is present. If the gate disappears between the check and the tap, that tap lands on a dish tile and opens the m2-composition sheet - which then covers every Add button and the sommelier band. The symptom is identical to 'the app is broken': clicks time out, nothing is interactive. A control run proved it: dismissing the gate through its own named control (m2-dietary-gate-no) leaves m2-composition absent and every in-view Add button hit-testable. BLAST RADIUS: every lane in this audit used this helper. It is the most likely explanation for the intermittent 'm2-dish-hero blocked arrival' I previously logged as a P3 product issue, and for wine-sommelier's 1/7. Any INCOMPLETE whose reason was 'the menu did not become interactive' is now suspect and should be re-driven before it is believed.
runs/fix/disc3 control; corrected helper at fix/lib-fix.mjs
The cart sheet closes only on a genuine touch drag of its grab handle at y~13. A mouse-driven swipe does nothing, so a first pass read it as 'the cart has no dismiss affordance' - which would have been a false product finding. Driving it with CDP trusted touch input closes it correctly. This is the click()-is-not-tap() trap in its most expensive form, and it argues for touch input as the default in every patron spec, not an occasional upgrade.
runs/fix/ wine group logs
The fleet's own per-step feed shows amw at 22 passed / 0 failed in the last hour. I drove the same journey myself at 10:52 UTC, outside the fixture's 06:00-10:00 window, as a fresh guest: the first unauthenticated menu call correctly returned menus_closed=true with zero items, then the app's bootstrap minted a table session, re-fetched, and rendered 'Canary Dinner Special $22.99' with no closed-state anywhere. That contradicts step 3 ('fresh scan -> menus-closed-state visible, zero item cards') and step 7 ('live session resolves ONLY the login menu, no dinner item') - both of which the board reports as passing. Two independent sources now agree: the board's own data says green, and the running product says otherwise.
runs/board/summary200.json + runs/uatX/amw-fresh-scan.png
The per-step feed carries an explicit `skipped` flag, and across 1,396 step-results in the last hour it is set exactly ZERO times - the fleet's own error text says 'Canary steps must PASS or FAIL; they are never skipped'. Yet the bar-tender card states plainly that 'bt-05/bt-06 soft-skip when the Canary Kitchen has no approved cocktails seeded', and no dev fixture has any. bt shows 12 passed / 0 failed / 0 skipped. So the soft-skip is being recorded as a PASS. A reader of the board cannot distinguish 'the banner was verified' from 'the banner was not looked at'. This is the STR-1093 pattern - a detector reporting green while observing nothing - and the skipped flag that would expose it is never used.
runs/board/summary200.json - 1396 results, 0 skipped; detail/bar-tender.txt
I spent this audit believing a portal password was required to see which step of a red card had failed. It is not: /admin/canary-runs/summary?environment=dev returns HTTP 200 with service, journey, passed, skipped, duration_ms and the full error_message, with no Authorization header. The portal page is only gated client-side. Convenient for me and it unblocked two verdicts immediately - but an unauthenticated endpoint exposing internal test topology and stack traces is its own finding.
curl -s '<lambda-url>/admin/canary-runs/summary?environment=dev&limit=200' -> HTTP 200, 246KB, no auth
Guest-first. No credential needed. 24 journeys · 121 steps · 0 not yet driven
| # | Journey | Steps | Actors | Canary says | UAT verdict | Note | Ticket |
|---|---|---|---|---|---|---|---|
| W-001 | active-menu-window | 11 | PA | PASSED | False green | The kitchen-hours gate is right the first time it is asked and wrong the second, so a diner arriving out of hours is shown a dinner-only dish at lunchtime and is never told the kitchen is closed.
Couldn’t check Why it flips. I only saw that it does — this is an observation, not a root cause. What I did notice is that open-or-closed is decided from the phone's own clock, so a traveller, or anyone whose clock is wrong, hits this on an ordinary visit. Left behind The scan opened a table session on this fixture. Nothing else is recorded for this walk. the long versionRE-CONFIRMED BY MY OWN WALK on the deployed dev patron app at 06:15 UTC, iPhone 14 Pro descriptor, phone timezone Asia/Dhaka so local time reads 12:15 - after breakfast (06:00-10:00), before dinner (17:00-23:00). The journey promises that a fresh scan out of hours shows a menus-closed state and ZERO dishes, and that a live session out of window resolves ONLY the login menu, never dinner. What happened: the server's FIRST answer was menus_closed=true with 0 items - the gate is correct at the API. The app then minted a table session and asked the same question again; the second answer was menus_closed=false. The screen rendered 'Canary Dinner Special $22.99 - Canary dinner-only item' and NO closed-state message at any point. So a person arriving out of hours is shown a dinner-only dish at lunchtime and is never told the kitchen is shut. A control step guards this: if the server's first answer had not been closed=true, the walk stops and proves nothing - it did stop, on an earlier run with a bad fixture id, rather than reporting a finding off a page that never loaded. Observation, not a root cause: open/closed is decided from the DEVICE's local time, so a traveller or a wrong phone clock reaches this on an ordinary visit. | STR-1189 |
| W-002 | bar-tender | 6 | PA | PASSED | Partial green | WALKED PART WAY. Got 4 of 6 steps and everything worked. Did not finish, so I will not call it green. Two of this journey's six steps skip themselves when there are no cocktails to look at, and the skip still reports as green. Real coverage is 4 of 6, permanently.
Couldn’t check Whether the cocktail banner works at all. There is nothing on any dev restaurant that would make it appear. the long versionLane A called this FALSE_GREEN because the cocktail banner is not observable on any dev fixture (count:0, bannerEligible:false everywhere; the visible 'THE CELLAR' band is the wine sommelier, a different endpoint). REFUTED as a false green by the canary's OWN card, which states 'bt-05/bt-06 soft-skip when the Canary Kitchen has no approved cocktails seeded'. The canary is not claiming the banner works. But a soft-skip that still reports PASS is the STR-1093 pattern: 2 of 6 steps have not executed in dev for as long as the fixture has had no cocktails, while the board shows a plain green a reader will take as 'the banner is verified'. Real coverage is 4/6, permanently. | STR-1191 |
| W-006 | diner-token | 2 | CA | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKABLE. This journey is mostly direct API calls with no screen to look at, so there is nothing for a person to walk. Nothing here is visible to a person, so whether the screen behind it is reachable at all stays unknown.
Couldn’t check Both steps. A green tick here cannot detect an unreachable screen. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-007 | drink-recs | 4 | CAPA | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. Whether a diner could reach any of this stays unknown, because there is no screen behind it.
Couldn’t check Anything a person would see. This would pass just the same if the screen behind it were unreachable. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-008 | drink-subcategories | 6 | CAPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. All six steps stay unknown — a green here can't tell you whether the drink groupings are on a screen anyone can reach.
Couldn’t check All six steps. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-009 | food-subcategories | 8 | CAPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. None of the eight steps was graded, so a green here still cannot tell you whether a person could reach the screen at all.
Couldn’t check All eight steps. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-011 | guest-bootstrap-dedup | 2 | PA | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. Whether a diner could reach this stays unknown, because no screen is involved anywhere in it.
Couldn’t check Anything a person would see. A pass here would stay a pass even if the screen behind it were unreachable. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-031 | mosaic_v2-cancel-version-bump | 6 | PA | PASSED | Honest green | A diner can still cancel his order after a second person joins the same table — it went through cleanly, with nothing complaining.
Couldn’t check Whether the cancellation really landed in the records. All I have is what the diner's screen showed; I have no access to look at the order itself. Left behind Table 9940 carries the order I placed and then cancelled, from the two guest sessions I opened on it. the long versionPatron A joined table 9940 (interactive=true), added an item (true), and placed the order via the real cart sheet (place-order button visible=yes, tapped). Patron B then joined the SAME table in a separate browser context (interactive=true) - this is the real bump: a second live patron session on the same table. Back on Patron A's page, opened the Ordered tab and looked for a cancel control (found=true); tapped it. Checked the page for any error/failure text after the cancel attempt: none found. | |
| W-033 | mosaic_v2-coach-toasts | 2 | PA | PASSED | Honest green | The onboarding nudges come up one at a time in order, and tapping one dismisses it without another jumping in behind it.
the long versionGuest 1 (fresh context) at table 9943 observed for 40s: distinct coach-toast testids fired in order [m2-coach-course, m2-coach-filter, m2-coach-search], never more than 1 distinct toast content visible at once. Guest 2 (SEPARATE fresh browser context, table 9944): first toast found (m2-coach-toast: "Swipe across to explore the next course"); tapping it dismissed it; a second nudge did not appear within 15s of the tap. | |
| W-059 | mosaic_v2-ping-validation | 7 | CAPA | PASSED | Honest green | You cannot poke at someone else's table by guessing — a wrong session is refused with a plain message, and the real diner sitting there is never disturbed.
Left behind Nothing — I left the table and closed my connection cleanly. the long versionReal guest joined table 9966 over the browser's real WS (wss://nxyht5bn17...), captured sessionId 351d2c18-79fc-4dfc-a590-acdca73899f6. A raw second WS connection joined the SAME table as a second guest and got its own sessionJoined with sessionId 351d2c18-79fc-4dfc-a590-acdca73899f6 (matches original: true). Sent ping with a deliberately WRONG sessionId (1e78e45d-a2c5-48db-8825-ce9a069da635) and got: {"type":"error","error":"Session mismatch — please reload the page","code":"SESSION_MISMATCH"}. Sent ping with the CORRECT sessionId and got: {"type":"pong"}. Checked the original browser's WS never received a sessionEnded frame during this: confirmed it did not. Sent leaveTable and closed the raw connection cleanly. | |
| W-073 | mosaic_v2-table-transfer | 6 | PA | PASSED | Honest green | Moving from one table to another keeps your cart, warns you before it happens, and you can still order afterwards. Green, and honestly so.
Left behind A placed order — Canary Iced Tea and Canary Cola, $6.99 — standing on table 9962 after the move. the long versionGuest joined Table A (9961) on mosaic_v2/canary-mosaic, added Canary Iced Tea + Canary Cola to cart (verified 2 items in the cart sheet with correct prices, $6.99 total). Navigated the same page directly to Table B (9962) - the app showed an explicit 'TABLE CHANGE - Moving to Table 9962. Your cart items will move with you' confirmation sheet, which had to be tapped ('Go to Table 9962') to actually complete the transfer. After confirming, the cart still showed both items at their original quantities. Reopened the cart (had to retap the dock's cart icon since the dock had collapsed to icon form after the transfer) and tapped 'Place order $6.99'. The order POSTed successfully (201 Created) and the UI flipped to an 'Ordered' tab showing both items as ORDERED with Re-order buttons, total $6.99 - confirming both bug guards (cart survival AND no stale-token block on placing). | |
| W-081 | place-order-failure | 5 | CAPA | PASSED | Honest green | Orders that ought to fail do fail, straight away, and say why in plain words. Green, and honestly so.
Couldn’t check This was driven against the server rather than through a browser, so nothing here shows what a diner would actually be shown on screen. Left behind Nothing — I left the table and the connection closed cleanly. the long versionDrove the journey's own 5 steps over the real deployed WS contract (wss://nxyht5bn17.execute-api.us-east-1.amazonaws.com/dev), no browser. [OBSERVED] 1) Minted a guest diner token via REST bootstrap -> HTTP 200, real token, guest_id 013907ce-e9f8-4cd9-946b-df7fb680ab42. 2) joinTable 9947 -> sessionJoined with sessionId 9478ac25-213a-4a1c-aeaf-fa655c6628c4; the tableSessionToken decodes to {tss_id:9478ac25..., table_id:'9947', session_version:1, iat:1788465864, exp:1788480264} (a 4h life). 3) placeOrder with an EMPTY cart -> the Lambda emitted {type:'error', error:'Not all patrons are ready'} within seconds: a real domain frame, no silent hang. 4) placeOrder with a stale sessionId -> {type:'error', error:'Session expired - please reload the page', code:'SESSION_EXPIRED'}, which is exactly what the step names. 5) leaveTable + socket closed cleanly. The previous pass's SESSION_MISMATCH was its own harness, not the product. I ran three stale-session variants side by side to separate them: | |
| W-082 | pos-experience-non-regression | 4 | CAPA | PASSED | Honest green | On a restaurant that isn't on the till programme, the diner still gets the full service drawer, which is exactly what should happen.
Left behind A guest session on table 9963. the long versionGET /restaurants/28ae37ab.../menu (canary-mosaic, non-POS restaurant) confirmed the fixture is not on the POS programme (enabled_features has no pos entry) and returned restaurant.pos_experience present with all four keys (service_buttons_hidden, order_status_hidden, dish_ratings_hidden, auto_close_on_payment) explicitly false - the 'present and OFF' shape the negative control requires. Then, as a real guest at table 9963, tapped the service button (bottom-right icon, visible and reachable) and the service drawer opened showing 'TABLE 9963 - SERVICE / How can we help?' with three live actions: Call Waiter, Silverware, and Check Please, each with a chevron affordance. Screenshot confirms all three actions rendered. | |
| W-083 | pos-modifier-link | 5 | CAPA | PASSED | — | NOT WALKABLE FROM HERE. Four of the five steps happen in a POS import queue inside the owner app, behind an admin login this container does not hold. The screen exists - I cannot reach it. The screen this journey lives on is real, but it is behind an admin login I do not have. The one diner-side step I could reach showed no option picker on the dish I opened.
Couldn’t check Whether linking actually fans an option group across every dish, and whether unlinking removes it again — moot until a POS system is connected on this fixture; there is no staged import to link. the long versionNo POS system is connected on Canary Kitchen at all - the page reads "pos-not-connected". There is no staged Clover import, so there is no folded queue for step 1 to be true or false about. Screen: Skip to main content QRate Canary Kitchen — dev Home Food Items Menu Tables/Staff Personalize Insights C Canary Owner POS Integration Connect your point-of-sale system to receive orders directly Restaurant Canary Kitchen — dev Canary Kitche what I saw · trace.zip · diner video · owner video · report | |
| W-084 | pos-non-regression | 4 | CAPA | PASSED | Partial green | WALKED PART WAY. Got 3 of 4 steps and everything worked. Did not finish, so I will not call it green. With the till system switched off, the menu still comes back open with all 14 items — nothing has regressed. One of the four steps was not walked.
Couldn’t check The fourth step was not walked. the long versionVerified to 3 of 4 named steps, working at every step reached. Downgraded from honest green because the rest was not walked. Hit the same public endpoint the canary uses: GET /diner/restaurants/28ae37ab.../features shows enabled_features has no pos/POS entry (POS is OFF for canary-mosaic). GET /restaurants/28ae37ab.../menu?local_time=10:30&day_of_week=4 returned menus_closed=false and 14 items across categories, fetched t | STR-1193 |
| W-085 | pos-order-push | 4 | CAPA | PASSED | Partial green | PARTLY WALKED, NOW FILMED. The one step a customer can see works. The three till-side steps have no customer-facing screen at all, so they cannot be witnessed from outside the restaurant's own systems. Ordering here works and the diner is told so clearly. The rest of this journey is about the restaurant's till, which is not something a customer — or I — can see.
Couldn’t check Whether the till actually received the order, acknowledged it, and reconciled it. Those are the other three steps, and they have no screen anywhere a person can reach. Left behind Nothing. I cancelled the dish I ordered. the long versionAs a real guest at table 9951 on the canary-kitchen (POS push) fixture, added an item and placed the order through the real cart UI. Network trace: ["201 POST https://wyvsv4h2bommphletcu6nolmo40dwyfl.lambda-url.us-east-1.on.aws/diner/orders","200 GET https://wyvsv4h2bommphletcu6nolmo40dwyfl.lambda-url.us-east-1.on.aws/diner/orders/22221cf1-8fe5-4598-b986-c8aafb838474"]. Order placement succeeded (201 Created observed). RE-DRIVEN 2026-09-05 with video and trace, on the fixture this journey is NAMED for (pos-push) rather than the ambiguous 'canary-kitchen (POS push)' the earlier note recorded. Guest at table 9951: 14 dishes across four courses (9 drinks, 1 starter, 3 mains, 1 dessert), added a Canary Cola, pressed 'Place order $3.50', 201 on /diner/orders, Ordered tab read $3.50 with badge ORDERED. Cancelled my own dish afterwards - nothing left standing. | STR-1213 |
| W-086 | pos-service-buttons | 4 | CAPA | PASSED | Honest green | COVERAGE HOLE. The check cannot go red in dev - no fixture can distinguish hidden from not-rendered. Correcting my own earlier mistake: the gated restaurant really does hide the service buttons while showing its menu normally, and the green is honest.
Couldn’t check Nothing about the product — but the check itself is hollow, and that is filed separately. It only reads a setting, never looks at a screen, and it points at the empty restaurant, so nothing anywhere actually proves a diner's button is hidden. A warning for whoever writes that check: this control still reports itself as visible when it is invisible, because the bar collapses instead of disappearing. Count it; don't ask whether it is visible. Left behind Not recorded in this row. the long versionI RETRACT MY EARLIER FALSE-GREEN. Walked on the deployed dev patron app at 06:12 UTC, iPhone 14 Pro. My earlier reading rested on a confound: the only fixture with service_buttons_hidden=true also had ZERO menu items, so 'hidden by the gate' and 'nothing renders at all' were indistinguishable. A populated gated restaurant exists (Indian Aroma, 128 items), which removes the confound. Differential walk, both sides populated: on the NON-POS restaurant, 9 dishes and a service control labelled 'Call staff or request the check'; on the POS-gated restaurant, 20 dishes rendering normally and ZERO service handles - a sweep for service/waiter/check/bill/bubble/cutlery across the whole page finds none. The product does what it promises and the board's green is honest. What remains, and is filed separately, is a test coverage gap rather than a defect: the canary asserts a JSON field and never renders a screen, and it points at the empty fixture - so no canary anywhere proves the diner's UI hides the button. Trap for whoever writes that canary: isVisible() returns TRUE for this control at opacity:0, because the dock collapses rather than unmounts. Assert on count, not visibility. | STR-1190 |
| W-087 | scan-conversion-ingest | 7 | CAPA | PASSED | Honest green | Everything the app reports about a diner is stamped with the right table, several diners at one table stay one table, and leaving the table out of the link gets an honest 'unknown' rather than a guess.
the long versionCaptured real POST /diner/events/{id} bodies from a live browser session (table 9954, mosaic_v2, canary-mosaic). Every event in the batch (restaurant_viewed, boot_performance, multi_patron_joined, web_vital_reported) carried a top-level table_number:9954 (integer) - confirming steps 2+3 (carried, and on every event not just one). A second fresh guest joining the SAME table got its own distinct session_id but the identical table_number:9954, confirming step 4 (many sessions, one table). Navigating to the menu with the table query param OMITTED entirely produced events with table_number:null and empty props (no fake/guessed value), and the backend response was {accepted:2, rejected:0} - confirming step 5 (still ingests, does not silently drop or error just because table is unknown). The restaurant_viewed event ALSO carried props.table_number:'9954' as a STRING alongside the normalized top- | |
| W-088 | service-call-guard | 3 | PA | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. Whether anyone could reach this stays unknown, because no screen is involved in it.
Couldn’t check Anything a person would see. A pass here would stay a pass even if the screen behind it were unreachable. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-091 | wine-sommelier | 7 | CAPA | PASSED | Honest green | The wine recommender answered all seven of its promises correctly, asked from inside a real diner session rather than from the outside.
Couldn’t check How any of this looks to a diner. This journey has no screen of its own, so all I can say is that the answers were right. the long versionThis canary is API-only by its own description, so I drove the seven named contract assertions against the DEPLOYED dev recommendation endpoints from inside the real patron page (same origin, same CORS path the app uses), on the sommelier fixture. Arrived as a guest at table 9937, which minted the diner session; then exercised wine/score bare, the trio display contract, style=red ranking, food_item_ids pairing mode, seats[].allergens filtering, and wine/facets. 7/7 steps held. | |
| W-092 | wine-sommelier-mosaic-journey | 14 | CAPA | PASSED | Spine verified | ONLY THE BASICS. A guest reached the menu and added an item, but this journey's own steps were not walked. The basic path — arrive, get past the entry screens, add something — works. Everything past that is still unwalked.
Couldn’t check Twelve of the fourteen steps. I have not looked at any of them yet. Left behind An item is sitting in a guest basket. the long versionArrived as a guest, cleared both entry gates, added an item - the journey's spine works. Full step-by-step walk still outstanding. | |
| W-094 | patron-sommelier-empty | 0 | PA | NO SUCH JOURNEY | Honest green | RETRACTED my own finding. Re-driven answering the quiz; the helper works. STR-1195 carries the retraction and needs a HUMAN to close it - this workflow has no Won't Do transition and Done is not mine to press. My own false alarm, withdrawn: answer the helper's three questions and it recommends the right wines at the right prices.
Couldn’t check Still open and NOT part of this retraction: a report that the scoring result comes back with no serving options and no glass or bottle price, while the screen shows a glass price anyway. That was seen on another restaurant by a read-only pass, not driven by me, so it is not a claim yet. Left behind The ticket I filed in error still needs a human to close it — this workflow has no won't-do transition, and Done is not mine to press. the long versionRETRACTION - this row previously carried a defect I filed in error (STR-1195). The wine helper is NOT blind to the menu. My earlier walk opened THE CELLAR, read 'No wines on the list right now' and filed it - without ever answering the helper's three questions. That string is the PRE-ANSWER PLACEHOLDER, not an empty cellar. Re-driven on the same fixture and table, answering white/dry/light: m2-sommelier-empty goes 1 -> 0, GET /recommendation/wine/facets 200 and POST /recommendation/wine/score 200, and the result panel names exactly the two wines the menu sells at the menu's prices - 'YOUR POUR TONIGHT: Canary White Wine OFF-DRY, BY GLASS $10.00, BY BOTTLE $40.00' with 'Other pours: Canary Red Wine DRY, BY GLASS $11.00'. The feature works. The lesson: I asserted a defect from one string being present, without driving the input the panel needs; and since the drawer mounts q-1, q-2, q-3 AND result simultaneously, visibility discriminates nothing. The honest oracle is the TRANSITION 1 -> 0 plus a scored response naming a priced wine. STILL OPEN and NOT part of this retraction: the score payload reportedly carries fallbackUsed:true with servingOptions:[], glassPrice:null, bottlePrice:null while the UI renders 'BY GLASS $10.00' - observed on Anant by a read-only pass, not driven by me, so it is not a claim yet. | STR-1195 |
| W-096 | cross-engine-coverage | 0 | PA | NO SUCH JOURNEY | — | Nothing in the estate runs on the engine iPhones use, so iOS-only defects cannot be seen.
the long versionEvery canary journey and every E2E project in the estate runs on chromium only. Nothing anywhere runs on webkit or firefox, so any defect caused by engine behaviour rather than application logic is structurally invisible to the whole gate stack. STR-1215 is the proof that this is not hypothetical: a guest-auth failure that fires on 100% of WebKit loads sat green on the board because no runner ever loads the app in the engine that fails. The diner surface is a QR-scanned phone app, so iPhone is a first-class target. Note the defect is invisible in a screenshot — the menu renders, the order places, the ledger updates — so any cross-engine gate that only checks rendering would have gone green over it too. Whatever lands must assert the WIRE, and must be shown going RED on the violation it exists to catch before it is trusted. | STR-1216 |
| W-097 | guest-session-webkit | 4 | PA | NO SUCH JOURNEY | — | Everything a diner can SEE works on an iPhone. What fails is invisible: the app never holds a session the restaurant accepts, on every load, only on Safari's engine.
Couldn’t check Whether shipping Safari.app's ITP settings match this WebKit build byte for byte — the SOP's standing position is that WebKit IS real iOS Safari, so this is recorded as an iOS finding by our own standard. Staging and prod were NOT driven; both serve the patron app from a custom domain while the API stays on a lambda-url host, so the same third-party drop is plausible there and is explicitly left open in the ticket. Left behind One test order on the Canary Mosaic fixture, table 9994 (E2E-safe range). the long versionDriven on an iPhone 14 Pro descriptor on the WEBKIT engine — which this harness treats as real iOS Safari (witness-run.sh and lib-witness.mjs both say so) — with the identical walk repeated on chromium as a control. A diner scans the code, gets a menu, adds a dish and places an order. All of that works on BOTH engines and looks completely normal on camera. The difference is only on the wire: on webkit the app is holding ZERO cookies and the server refuses the two calls that identify the diner to the restaurant — 401 POST /auth/guest/attach-session and 401 POST /diner/session/snapshot, body {"error": "auth_required"} — on every single page load. On chromium and firefox the same calls return 200. Cause: qrate_guest is issued by the API host (...lambda-url.us-east-1.on.aws) while the app is served from dcgmji73h6qel.cloudfront.net, so it is a third-party cookie and WebKit's ITP declines to store it at all. There is no header fallback — no engine sends X-Qrate-Guest-Token or X-Qrate-Table-Session on those calls, so on webkit the diner has no credential of any kind. NO canary journey runs on webkit or firefox anywhere in the estate, which is why a 100%-reproducible auth failure has been live and green. Blast radius checked and stated honestly: ordering, the own-order Ordered ledger, order-status-badge, table-session-active, patron-badge and the shared Table tab are IDENTICAL on both engines, so no diner-visible breakage is demonstrated — filed P2, not P1. An early two-guest run that appeared to show patron-badge missing on webkit did NOT replicate and is retracted. | STR-1215 |
Needs a staff login for the service half. 23 journeys · 228 steps · 0 not yet driven
| # | Journey | Steps | Actors | Canary says | UAT verdict | Note | Ticket |
|---|---|---|---|---|---|---|---|
| W-004 | cross-journey-ledger | 13 | PAWA | PASSED | False green | A waiter can cancel one dish out of an order but cannot serve one. The journey's whole promise - served, cancelled and still-coming showing together on the diner's phone - needs a per-dish serve, and no such control exists on the waiter's screen.
Couldn’t check Whether serving a dish happens on a kitchen screen I have no account for. I drove the waiter app, which is the actor this journey names, and all three tabs of its table sheet. Left behind Live sessions and four-drink orders on tables 10091, 10092, 10093 and 10094 - three of them from runs my own harness bugs cut short. They need clearing. the long versionWALKED WITH THE FIXTURE'S OWN WAITER for the first time - the 2026-09-05 credential pack gives Canary Mosaic a waiter account, so the D4 deferral (no staff screen) is lifted and this row moves from 1/13 steps to 6/13. Steps 1-6 are performable: the diner scans in at table 10094, adds four drinks ($19.99), the waiter's board shows the table occupied, the order is placed and all four render ORDERED on the diner's phone, and exactly one card for T10094 appears among 20 on the waiter's Orders list. STEP 7 IS NOT PERFORMABLE. The journey requires the waiter to serve ONE item of the four. On the table sheet each dish has its own cancel control (cancel-item-btn-* x4) but there is NO per-dish serve control anywhere: a sweep of every data-testid matching serve/deliver/ready/done/complete/status/item/group returned only the four cancels, the four item rows, status-toggle and table-settle-status. Tapping a dish row revealed nothing (0 new testids). The only serve control in the product is order-mark-served-<orderId>, which serves the WHOLE order - so the mixed ledger the journey promises (1 served + 3 still coming, then + 1 cancelled) cannot be reached by a person on this surface. Separately, the group's 'Enter in POS' button does nothing observable: label and header read identically before the press, straight after it, and after a full page reload. CONTROLS THAT MAKE THIS READABLE: before claiming my order was missing from the waiter's list I required the list to prove itself live (20 cards for other tables); that control caught TWO harness bugs of mine and stopped two false findings. Every sheet capture is gated on the sheet actually being open, after an ungated probe recorded the table list by mistake. ALL THREE TABS OF THE TABLE SHEET NOW CHECKED, each gated on the sheet still being open after the tab click (an earlier ungated probe silently photographed the table list behind the sheet and I nearly banked that null as a result). GUESTS: four cancel-item-btn-*, one 'Enter in POS', no serve control. SERVICE: 'No service requests', nothing. BILL: the four dishes all still reading 'Order Placed', a yellow instruction 'Please make sure all ordered items are moved to served state or Canceled (Remove) from the table', and a GREYED-OUT 'Swipe after bill is settled'. So the app instructs the waiter to move every item to served or cancelled while providing no per-dish served control anywhere - the only route to an empty table is to cancel all four dishes off a bill the guest is meant to pay - and the table close stays locked meanwhile. That also explains why my own walk could not hand table 10094 back.
[LINKED 2026-09-06] This row's wall is not unique to it. The same cause was walked independently on 2026-09-06 as W-058 mosaic_v2-per-item-serve, on a different table, and filed as STR-1230: nothing in the diner app, the waiter app or the owner app can move an order to SERVED, so any journey that asks for a mixed served/ordered ledger stops dead. The 'Enter in POS does nothing observable' note above is STR-1225, now seen on three tables and explained: the press DOES reach the restaurant (POST .../notify-pos-entered -> 200) and the Orders tab updates correctly - it is the TABLE SHEET that never reflects it. Linked rather than filed again, because one cause across two journeys is one ticket with wider impact, not two tickets. what I saw · trace.zip · patron video · waiter video · report | STR-1230, STR-1225 |
| W-030 | mosaic_v2-cancel | 17 | PAWA | PASSED | Honest green | Driven on ANANT table 10 with the real waiter daniel@, NOT the canary fixture - no canary waiter credential exists here. Grades the FEATURE. A waiter cancels a dish and everyone is told the truth immediately - the diner sees it struck out as cancelled, the bill clears, and the table closes cleanly.
Couldn’t check The canary's own restaurant. No waiter password we hold works there, so I did this on Anant with a real waiter instead - which grades the feature, not that particular fixture. the long versionWalked end to end with a real waiter for the first time. Diner joined Anant table 10 and ordered a Lassi - Mango; Daniel opened the table sheet, pressed cancel-item-btn-<id>, confirmed, and the item and its control disappeared. The diner's phone was told properly and unambiguously: the Ordered tab shows the dish struck through with CANCELLED in red and the $5.00 struck out - confirmed on the screenshot, not from a page-wide text match. Cancelling also SETTLED the bill (Bill tab went to 'No orders yet' and the close control unlocked from 'Swipe after bill is settled' to 'Swipe to Close Table'), and dragging the knob across then closed the table back to 'No guests'. Nothing left behind. what I saw · trace.zip · patron video · waiter video · report | STR-1202 |
| W-032 | mosaic_v2-closed-resume | 5 | PAWA | PASSED | Honest green | I can join a table, survive going offline, and this time staff really did close the table on me - my phone came back to a proper goodnight screen, not the menu, and even a fumbled tap on the old Add button couldn't reach it.
Couldn’t check Nothing this run - all five named steps plus one extra safety check (can the hidden menu underneath still be tapped?) were driven and confirmed on the real product. The unrelated STR-1209 finding from the previous attempt (Host Station ignoring ?restaurantId=) is still open separately and not re-verified here. Left behind Table 10097 on Canary Mosaic - dev: closed, no guests, nothing owed. Table 10096 from the first re-drive attempt on this journey is also closed. the long versionWalked all six steps on this journey. Table 10097 was closed for real via the waiter's own swipe-to-close control (canary-mosaic-waiter-dev@), and resuming the patron tab - foregrounded + network restored, no fresh navigation - showed the farewell/closed screen rather than the stale live menu. The stale menu's dishes remain mounted in the DOM behind the farewell overlay, but a real tap at the "Add" button's location does not reach them - the overlay genuinely blocks interaction. The 2026-09-04 blocker (no owner/waiter control could close a table) is resolved by the 2026-09-05 credential pack; the Anant-table-20-class regression this journey guards against was NOT reproduced. what I saw · trace.zip · patron video · waiter video · report | STR-1209 |
| W-034 | mosaic_v2-cold-start-rescan | 5 | PAWA | PASSED | Partial green | Close the browser entirely, come back, and your half-filled basket is still waiting. What happens after staff close the table was never reached.
Couldn’t check The negative half - that coming back is blocked once the table has been closed, and that a fresh scan starts a fresh meal. Both hang off a close I cannot perform, and those are the steps that stop a diner walking back into somebody else's finished meal. Left behind Table 9955 has an open guest session with one un-ordered item in it, on two devices. No order was placed. I cannot close it. the long versionPARTIAL GREEN - and the happy path genuinely works, on video. Basket filled, the browser shut down ENTIRELY, then the same phone re-scans the code: the same meal comes back with the basket intact. That is the part a diner actually cares about and it is proven. NOT WALKED: the sad path, which needs staff to close the table first - and no owner screen closes a table (see W-032), and no canary waiter account accepts the password this container holds. Fixture substituted (Canary Mosaic V2 Dining) because the journey names none.
WHAT A PERSON CAN DO: The happy path of this journey genuinely works and I watched it. On table 9955 I scanned in, saw 9 dishes and a live table session, and put one dish in my basket. I then shut the browser down completely - the page was closed and a brand new browser context was built - and re-opened the same QR link carrying only what the phone itself had stored. I came back into the SAME meal: the menu rendered, the live table session was still shown, and my basket still read 1, exactly as I left it. That is a real thing a diner does (locks the phone, reopens hours later) and the product handles it.
WHERE IT STOPS: Step 3, 'WAITER Closes Session'. Same blocker as W-032 - no owner screen closes a table session, and no staff login here reaches a canary restaurant. Steps 4 and 5 are the NEGATIVE half (cold start must be BLOCKED after a close; a rescan must start a fresh session) and both hang off that close, so neither could be reached.
NOT PROVEN (never graded): Steps 3, 4 and 5. NOT graded - and note these are the steps that matter most, because they are the ones that stop a diner walking back into somebody else's finished meal.
SURFACE DRIVEN: PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=f469b191...&table=9955 as an anonymous guest, twice, second time in a fresh browser context carrying only the phone's own stored state (iPhone 14 Pro on chromium) + OWNER https://owner.dev.qrate-ai.com as canary-owner-dev@
STATE LEFT BEHIND: No order was placed. Canary Mosaic V2 Dining table 9955 is left with an open guest session holding one un-ordered cart item, on two device contexts. I cannot close it. what I saw · trace.zip · owner video · patron-again video · patron video · report | STR-1209 |
| W-035 | mosaic_v2-cover-resume | 13 | PAWA | PASSED | Honest green | A diner whose phone had been asleep and offline came back and was correctly told someone else had covered his bill.
Couldn’t check One of the thirteen steps did not complete. Left behind Table 10222 carries the orders both diners placed, and the second diner's attempt to cover the whole table. the long versionDrove mosaic_v2-cover-resume on table 10222: both patrons ordered, P1 backgrounded+offline, P2 attempted whole-table cover, P1 resumed. Completed 12/13. p1-covered-notice-after-resume=true. | |
| W-036 | mosaic_v2-cover-someone | 8 | PAWA | PASSED | Partial green | Whether covering someone else's bill works stays unknown, and nothing in this row says anything about the product.
Couldn’t check What the cover-someone options actually are and whether they work. Left behind Table 10217: both of my diner sessions, with an order placed by the first and the second one's item never sent. the long versionWAS PARKED AS D5 ON MY OWN HARNESS FAULT - now walked. Re-driven on the canary mosaic fixture, table 9971, two diners in separate browser contexts. BOTH diners genuinely placed an order first (each pressed 'Place order $3.50' and each order was confirmed on the table ledger, badge 'ORDERED') - my earlier attempt only had diner one order, so there was nobody to cover and I wrongly read that as the app offering nothing. Diner two then opened the service bubble (qrate:open-service-bubble) and pressed Check Please (data-testid service-bubble-ready_for_bill). The settlement sheet offers settlement-cover and settlement-split. Opening cover offers THREE choices: 'Just me', 'Someone on the table', 'The whole table'. So a diner CAN pick up another diner's bill and the journey's promise holds on the surface I drove. WHAT I GOT WRONG, recorded so it is not repeated: my spec searched for a testid matching 'check-please'/'m2-check-please'. Neither exists. The control is 'service-bubble-ready_for_bill' and it lives in the SERVICE BUBBLE, not the cart sheet. The selector never matched, the settlement sheet never opened, and I read the resulting empty screen as a product defect. The already-passed mosaic_v2-split row had recorded the correct path all along. I stopped short of pressing any payment control - these fixtures are live Stripe merchants on dev. UNVERIFIED: I did not complete a payment, so I cannot say the cover actually settles money, only that the choice is offered and reachable. what I saw · trace.zip · diner-1 video · diner-2 video · report | STR-1217 |
| W-037 | mosaic_v2-coverage | 11 | PAWA | PASSED | Partial green | Stopped at cover-confirm on purpose - it commits you to paying for someone else. So whether confirming notifies the covered diner is unverified by me. Covering someone's bill works and names them correctly, but you get no confirmation, only one attempt, and the person being covered is never told any of it.
Couldn’t check Whether confirming a cover notifies the covered diner — I stopped short of pressing confirm on purpose, because it commits you to paying for someone else. Also the waiter's covered-so-far counter: signed in as the canary owner, both fixtures show no tables assigned and no table cards, so the staff half of this journey cannot be watched here. Left behind Table 9948: two diner sessions, with check requests made on it during the walk. the long versionWalked by two diners on the coverage fixture, table 9948. The picker works and names the right person: Cover -> 'Who are you covering? Just me / Someone on the table / The whole table' -> 'Who else are you covering? [L] Lucario, Cancel, Confirm (1)'. Three problems a person hits. (1) Choosing 'Just me' gives NO confirmation at all - the panel simply closes; nothing tells you what you just agreed to. (2) You get ONE attempt: asking for the check again still lists Check Please, but it answers 'Your server is nearby - we'll be right with you' with no Cover and no Split. Same end state as the split lockout in STR-1203, on a different path and a different fixture, so it is not split-specific - I commented it there as a second reproduction. (3) The covered person is never told: nothing on her phone mentions coverage, and asking for the check tells her 'nothing's been sent to the kitchen yet' because SHE has no order, though the TABLE does. NOT ESTABLISHED, stated rather than guessed: whether confirming a cover notifies the covered diner - I did not press cover-confirm. Also unobservable here: the waiter's N/M covered counter - signed in as canaryOwner, ?restaurantId= switches the header but both fixtures render 'No tables assigned' with zero table cards, so the staff half of this journey cannot be watched on these fixtures at all. what I saw · trace.zip · patron-a video · patron-b video · report | STR-1203 |
| W-041 | mosaic_v2-dining | 12 | PAWA | PASSED | DEFERRED D4 | D4 NO STAFF SCREEN WALKED STEP 1 ONLY. The rest needs a staff screen I cannot reach, or an order I will not place. Eleven of twelve steps stay unknown — and separately, this journey's own description names the wrong restaurant: it claims to reuse another one, but points at a different restaurant with a different menu and none of the same extras.
Couldn’t check The eleven steps after joining the table. Also whether the served step is meant to be available straight after an order is entered at the till, or whether the kitchen has to act first — that is not something I can settle from the screens and the step list alone. Left behind A guest session on this restaurant's table, from the one step I did walk. the long versionBLOCKED BY A SCOPED PRINCIPAL. The admin credential is restricted: GET /admin/integrations/clover/<non-POS rid>/proposals returns 403 canary_scope 'The canary principal may only reach the POS integration routes'. /admin/restaurants, /admin/orders, /admin/sessions, /admin/tables, /admin/patrons, /admin/canary all 404; only /admin/health and the clover proposals route on the two POS fixtures return 200. Step 1 (load the menu / join the table) witnessed on the patron surface; the remaining steps need either an order placed (mutating) or an owner-pool waiter credential for this fixture, neither of which I have. DOC CONTRADICTION: the board body says mosaic_v2 'has no fixture of its own - it reuses the Canary Mosaic restaurant', but fixtures.json gives it f469b191 'Canary Mosaic V2 Dining - dev', a DIFFERENT restaurant from 28ae37ab (14 items vs 15; renders no sommelier banner and no subcat nav where 28ae37ab does). | |
| W-043 | mosaic_v2-electronic-pay | 11 | PAWA | PASSED | False green | Board says PASSED on all 11 steps. A person can walk the route, but 'Just me' bills him half the table and the receipt then tells him the table is settled when it is not. Choosing 'Just me' does not charge you for your own items - it charges you half the whole table. I ordered $3.50, my friend ordered $7.00, and I was billed $6.86 on a receipt that then announced the table was settled when her drink was still unpaid.
Couldn’t check One of the eleven steps, the waiter serving the food. There is no waiter account for this restaurant - the owner login lands on a different one. And I stopped before pressing pay on my friend's phone, so I can say she is ASKED for the second half, not that it would be taken. Left behind Tables 10090, 10094-10099 on the Canary Mosaic V2 Electronic Pay fixture: live guest sessions, placed orders, open check requests, and FOUR completed test-mode card payments (Stripe pk_test_, 4242 test card) totalling $22.86 of test money on tables 10097, 10098, 10099 and 10090. No real money moved. I have no waiter account for this fixture, so I cannot close these tables. the long versionRE-WALKED IN FULL AND THE VERDICT CHANGES: PARTIAL_GREEN -> FALSE_GREEN. The board passes all 11 steps including m2ep-08-check-math and m2ep-10-complete-charge. I completed the journey a person cannot be asked to complete blind: four real test-mode card payments (Stripe pk_test_, 4242) on the journey's OWN fixture 7766d206 (Canary Mosaic V2 Electronic Pay), tables 10090/10094-10099, iPhone 14 Pro descriptor on chromium for the survey walk and on WEBKIT for every payment. THE DEFECT, and it is money: choosing 'Just me' - the screen says 'You're covering YOUR OWN ITEMS', the check heading says 'YOU PAY YOUR SHARE', the block is labelled 'Your items', the receipt says 'you covered your items' - actually charges AN EVEN SPLIT OF THE WHOLE TABLE. Proven with a discriminating oracle: I ordered a $3.50 Cola, my friend a $7.00 IPA. Table $10.50. My check read 'Your items $5.72' and I was charged $6.86 (receipt: Subtotal $5.25 = exactly half of $10.50, Tax $0.47, Tip 20% $1.14). My own items were $3.50, so I paid nearly double. Earlier tables hid this because both drinks were $3.50/$3.49 - half the table and my own share are the same number to the penny, which is why my first reading of it was WRONG and is retracted here. WORSE, it does not stop there: after I paid, my friend's check ALSO reads 'Your items $5.72 / Total with tip $6.86' - the same half - so the house is set up to collect $13.72 against an $11.44 bill. I did not press pay on hers, so I claim only that she is ASKED for it. SECOND DEFECT, same screen: the receipt announces in large type 'PAID IN FULL $6.86 / Table 10090 is settled - no need to wait for your server.' The table was NOT settled - the $7.00 IPA was unpaid. The only correction is grey fine print two lines below ('you covered your items'). Reproduced on tables 10097, 10098, 10099, 10090. THIRD: the check you are shown before paying lists the WHOLE TABLE's items with no mark of which are yours, and replaces the subtotal/tax breakdown with one figure that matches none of the lines ($3.50 + $7.00 listed, $5.72 charged). The breakdown you needed appears only on the receipt, after you have paid. Your friend's check shows NO line items at all - she is asked for $5.72 with no statement of what for. FOURTH: 20% tip is pre-selected before you touch anything. FIFTH, still standing from the first walk: not one money figure appears anywhere in the settle drawer - not on Cover/Split, not on 'Who are you covering?', not on the pay-how fork. You choose how to pay before you are told what you owe. Scoped to the service-bubble container, falsified, stands. WHAT IS HONEST GREEN: the route works end to end. Stripe is live and in test mode on this fixture (POST /dev/payments/intent -> 200, key pk_test_51Tgdg0KETT...), the card form is real, the charge completes, a receipt renders, and the other diner is correctly told 'Everyone else is taken care of - how about you?' with settlement-pay-own / settlement-pay-table. That resolves the STR-1210 contradiction from the diner side: in-app card payments DO work here while the owner Payments page says they are not enabled. MY OWN ERRORS, RETRACTED IN WRITING: (a) I first reported 'no card field, nobody can pay' - FALSE, the Stripe element is a collapsed accordion and you must TAP the row that says 'Card'; I never tapped it. (b) I reported the tip arithmetic as broken - FALSE, my parser read '20% $0.76' as 200.76; $3.81+$0.76=$4.57 is correct. (c) I asserted pyc-subtotal/pyc-tax on a variant that does not render them. All three are corrected in the run journal, not quietly dropped. NOT WALKED: m2ep-06-waiter-serve. There is no waiter account scoped to this fixture; signing in with canaryOwner lands on Canary Kitchen (restaurant 99e9d621) showing 'No active orders for your tables'. D4, operator's call. what I saw · trace.zip · diner-1 video · diner-2 video · report | STR-1224 |
| W-044 | mosaic_v2-enter-pos | 9 | PAWA | PASSED | Partial green | The step this journey exists for DOES work, on the waiter's Orders tab: press Enter in POS and the order goes to the till, the card says so, and it survives a reload. But the table's own sheet - the screen a server uses standing at a table - never learns, and offers to send it again. (Corrected 2026-09-06: the earlier 'no such control exists anywhere' claim was wrong; that walk only ever searched the owner app.)
Couldn’t check Steps 6 to 9: entering the till, whether cancel then disappears, whether it stays gone after a reload, and whether the kitchen screen waits on the till entry. Steps 1–5 were also walked on a restaurant that isn't till-gated at all, so 'cancel is visible before till entry' was seen where till entry never comes into play — weaker evidence than the journey intends. And this is one of four journeys that hasn't run since Sep 3 while the live ones cycle three times every 90 minutes, so its green badge is not a current result. Left behind I cancelled my own dish, so no live order is left. Table 9951 on Canary Mosaic keeps an open guest session and one cancelled order — there is no close-table control on any owner screen. the long versionCORRECTED 2026-09-06. The previous finding on this row was wrong on its central claim and is withdrawn. It said 'there is no control anywhere that enters an order into the till'. There is. It is in the WAITER app - the only app that walk never opened - and it works.
WHAT A PERSON CAN DO. Surface: waiter.dev.qrate-ai.com/owner/staff-orders/ signed in as the waiter scoped to Canary Mosaic - dev (28ae37ab-706c-4e20-83d7-52f5d2dff747), table 10097. A guest joined, added Canary Iced Tea $3.49 and pressed 'Place order $3.49'. The order arrived on the server's Orders tab as 'T10097 Guest just now New Canary Iced Tea' with an 'Enter in POS' button. Pressing it fired POST /owner/restaurants/28ae37ab-.../orders/dd85c4cd-.../notify-pos-entered -> HTTP 200, and the card immediately became 'T10097 Guest just now [check] In POS New Canary Iced Tea Re-enter in POS'. It survived a full page reload. That is step 6 of this journey working, end to end, with the network to prove the press landed rather than a screenshot to suggest it.
WHAT IS BROKEN - THE TABLE'S OWN SHEET NEVER LEARNS. With that same order already in the till, I opened Tables -> Table #10097 on the same board in the same minute. The sheet reads 'ORDER PLACED - 1 ITEM' with an orange 'Enter in POS' button and no in-POS mark of any kind (0 pos-entered badges), and it still offers the red cancel on the line item. So the same board makes two contradictory statements about the same order at the same moment: the Orders tab says it is in the till, the table sheet invites you to put it there again. A server standing at a table works from the table sheet. Filed as a defect.
HOW I KNOW IT IS THE SHEET AND NOT MY CLICK. My first re-walk (table 10096) pressed the SHEET button and reported 'nothing changed, the press did not survive'. That reading was half wrong and I withdraw it: on the very next run T10096 appeared on the Orders tab as '[check] In POS ... Re-enter in POS'. The sheet press had worked all along - the sheet simply never says so. The second walk watched the wire while pressing, which is what told the two apart.
STILL NOT WALKED: cancel-visible, cancel-hidden-after-reload, and the KDS gate (3 of the 9 canary steps). Not blocked - just not driven yet, so this stays PARTIAL and not green. what I saw · trace.zip · diner video · waiter video · report | STR-1225 |
| W-049 | mosaic_v2-legacy-cart | 5 | PAWA | PASSED | Honest green | An old-shaped cart left sitting on someone's phone still orders fine — the bug this journey exists to catch did not reappear.
Couldn’t check This row's own write-up stops mid-sentence, and one of the journey's five steps is not accounted for in it. Left behind Table 10209: a guest session with an order placed on it. the long versionJoined table 10209, added an item, then directly rewrote the persisted qrate_cart in localStorage to strip the 'restaurant' field (reproducing the legacy/flat cart shape) and reloaded. The solo Place Order control was still present and tapping it succeeded (UI showed the order as placed) -- i.e. the historical bug this journey guards against (solo order silently failing when cart.restaurant is nul | |
| W-054 | mosaic_v2-multi | 17 | PAWA | PASSED | Partial green | WALKED PART WAY. Got 9 of 17 steps and everything worked. Did not finish, so I will not call it green. Two diners at one table, each adding their own item, one order placed for both - and the waiter saw it come through. Nine of seventeen steps, all working.
Couldn’t check The remaining eight steps. I did not walk them, and a green here would claim more than I checked. Left behind An order was placed on table 9974 by the two diners I was driving. the long versionRE-WALKED 2026-09-06, and the old '9 of 17' is withdrawn as overstated. It was a positional count: steps 3b (companion badge) and 6b (no cart inflation) were never asserted at all - the prior script incremented past them - and both diners tapped the SAME dish, so nothing that walk saw could speak to cross-cart or to double-counting. Honest prior baseline: 5.
WHAT I ASSERTED FOR THE FIRST TIME, AND IT ALL PASSES. Two guests, two DIFFERENT dishes at DIFFERENT prices ($3.49 Iced Tea, $7.00 IPA) on table 10091:
- COMPANION BADGE works. patron-badge count on diner 2's menu goes 0 -> 1 the moment diner 1 takes a dish, and it marks that dish. The old walk's 'STOPPED - nothing tells them someone else is here' was MY selector (it searched companion/peer/glyph; the testid is patron-badge). Withdrawn.
- CROSS-CART works. Diner 1's basket names both people: '1 Boswell (You) | 2 All | 1 Weasley'.
- NO DOUBLE-COUNTING. Two people, one dish each: the table chip reads exactly 2, each person's chip reads 1. Four would have meant the app counts each of us twice.
- The whole-table view itemises correctly and attributes each dish to the right person BY NAME.
WHAT IS BROKEN - STR-1229. On the whole-table (All) view the sheet shows 'TOTAL $10.49' and the button directly beneath it reads 'Place order $3.49'. Both on screen at once, no scrolling between them. Pressing it sent only $3.49; diner 2's ledger then read 'Nothing sent yet TOTAL $7.00'. A diner who taps All, reads the table total and presses the only button has every reason to think the table is ordered. It is not, and nothing says so. Same family as STR-1224: the figure shown and the figure acted on differ.
WHAT DOES NOT EXIST. There is no control anywhere in the basket to take over a companion's item - I enumerated every button and every cart testid; nothing matches adopt/claim/take/mine. Canary steps m2mp-09-p2-add-adopt and m2mp-10-p1-adopt-peer describe a capability with no UI.
NOT ESTABLISHED, AND NOT CLAIMED. Per-item cancel from the other diner's ledger (step 8): both attempts hit 'Nothing sent yet', which is the correct state given the bug above, so the cancel path is untested here rather than broken. Late join (step 14): the late arrival's basket would not open at all on two attempts - but they had an empty cart, and I have not yet proved whether the cart control simply does not render when you have added nothing. That needs one more probe before it is a finding. what I saw · trace.zip · diner-1 video · diner-2 video · diner-3 video · report | STR-1229, STR-1193 |
| W-058 | mosaic_v2-per-item-serve | 10 | PAWA | PASSED | Honest green | WALKED STEP 1 ONLY. The rest needs a staff screen I cannot reach, or an order I will not place. Nine of the ten steps stay unknown for want of a staff login - and the board reports this parked journey as a clean green on all ten anyway.
Couldn’t check Nine of the ten steps: everything that happens on a waiter or owner screen. Separately, on a busy waiter order list of 20 orders my own way of picking out the right table was not precise enough to trust. the long versionRE-DRIVEN 2026-09-07 on the NEW dedicated uses_kds=false fixture (Canary Mosaic V2 Per Item Serve - dev, 40233afe-bb3b-5d29-a749-8e118db8afd5, table 10094) after STR-1235 landed. The journey is now honest. Guest ordered three DIFFERENTLY-PRICED dishes (Cola $3.50, Iced Tea $3.49, IPA $7.00 - different on purpose, because with identical ones 'one served' and 'all served' render the same and a wrong answer cannot be read). Waiter pressed Enter in POS and the order advanced to 'In POS / Preparing' ON ITS OWN, with no owner-API injection and nothing else done. The table sheet then carried ONE SERVE CONTROL PER DISH - three guests-item-row rows and three mark-served-btn buttons keyed by item id. Serving ONE dish put the diner's own ledger at SERVED / IN THE KITCHEN / IN THE KITCHEN; serving the rest gave SERVED / SERVED / SERVED, live on the phone and never reloaded. Zero API calls in the walk: every state change came from a click. This REFUTES my own STR-1230, which claimed nothing anywhere could mark an order served - that was an artefact of the uses_kds=true Canary Mosaic fixture I had driven, not the product. STR-1230 downgraded P1 -> Low with a full retraction. NOT ESTABLISHED: production. This is dev, and STR-1235 itself marks the prod uses_kds=false picture as REPORTED from code rather than live-verified. | STR-1230 |
| W-062 | mosaic_v2-resume-recovery | 10 | PAWA | PASSED | Honest green | WALKED STEP 1 ONLY. The rest needs a staff screen I cannot reach, or an order I will not place. Nine of ten steps stay unknown — and separately, the board shows this journey passing all ten steps on 50 runs in a row while its own entry says it is parked behind gates that have not shipped.
Couldn’t check The nine steps after joining the table, including the offline-and-recovery half, which is the part that matters. I also have no way to find out how a parked step is meant to report, so those green ticks sit oddly beside what I saw rather than proving anything either way. Left behind A guest session on this restaurant's table, from the one step I did walk. the long versionCLOSED OUT 2026-09-07. The two steps this journey is NAMED after - step 7 mark-served and step 10 status-served - had never been driven. They are now, and they work.
WHY THEY WERE NEVER DRIVEN. This row carried a blocker reading 'Nothing in the diner, waiter or owner app can move an order to SERVED'. That was FALSE, and I refuted it myself on 2026-09-07 (see W-058): serving works, it just needs a uses_kds=false restaurant, which STR-1235 delivered. The blocker was an artefact of the fixture I happened to be standing on, exactly as STR-1230 was. No fix was required for this - only a fixture, and my own correction.
WHAT I DROVE, 2026-09-07 23:38-23:42 UTC. Canary Mosaic V2 Per Item Serve - dev (40233afe-bb3b-5d29-a749-8e118db8afd5), table 10093, guest Miles Morales, iPhone 14 Pro / chromium 145. A guest ordered Canary Cola $3.50 and Canary IPA $7.00 - different prices on purpose, so 'one served' and 'all served' cannot render the same. Ledger read ORDERED. The waiter signed in with the fixture's own dedicated account and pressed Enter in POS; the kitchen auto-started and the ledger moved to IN THE KITCHEN / IN THE KITCHEN with nothing else done. The phone was then put away - document.visibilityState went to 'hidden' - and WHILE IT WAS AWAY the waiter pressed Mark Served twice, the sheet reading 'SERVED - 2 ITEMS'. The phone was taken back out and NEVER RELOADED: within the 45-second watch it caught up on its own to SERVED / SERVED. That is the recovery cascade doing the transition this journey names, watched rather than asserted. Zero API calls: every state change came from a click.
TWO HONEST LIMITS, BOTH MINE. (1) The backgrounding is SIMULATED - a headless tab cannot truly sleep on this machine, so the page was told exactly what a real background tells it (visibilitychange + blur + pagehide). This proves the app's visibility hook and its re-fetch; it does not prove a phone that actually slept for twenty minutes. (2) The control step - a deliberate reload afterwards - is VOID and I am not reporting it either way. The reload landed on the menu rather than the cart sheet, and the sentinel I chose to catch exactly that ('Canary Cola|IPA') matches the MENU as well as the ledger, so my guard cleared a reading it should have refused. The live branch stands entirely on its own; the reload branch proves nothing and is discarded rather than dressed up. Sentinel corrected in the spec.
This row is now the union of two dated walks: 2026-09-06 proved catch-up for a CANCEL on Canary Mosaic - dev table 10092, and 2026-09-07 proves it for SERVED on the new fixture. One HTTP 401 was observed on GET /dev/diner/events/40233afe... during the walk; the catch-up worked regardless, so I am recording it as seen and not adjudicating it. | STR-1230 |
| W-063 | mosaic_v2-session-close | 4 | PAWA | PASSED | Partial green | Driven on ANANT with the real waiter daniel@, NOT the canary fixture. Corrected once the diner-side settle path was driven - see STR-1202. The waiter's own instruction says serve everything or cancel it and the table will clear, but only cancelling clears it - and serving quietly removes the cancel option too. A table where the food was served and then abandoned has no way back for staff at all.
Couldn’t check The one possible exit I found - an unlabelled red bin control buried in the owner app, with no name on it and no entry in the manual. I reported it and deliberately did not press it. Also: a diner who has not ordered cannot ask for the check at all, so nobody can settle a bill another guest walked out on. Left behind Anant table 2 is still sitting there with 2 guests and 2 served items on it, and no one can close it. the long versionRETRACTED AND RE-WALKED 2026-09-08. My own re-confirmation of 2026-09-07 - 'CONFIRMED STILL LIVE, and it is NOT a fixture artefact' - DOES NOT REPRODUCE, and I am withdrawing it. The staff-side session-close journey works.
WHAT I DROVE TODAY, on Canary Mosaic V2 Session Close - dev (7f2db6ae-20a9-526c-aa87-84433ecdac17), Desktop Chrome / chromium 145, no API calls - every state change came from a click:
- Table 10099, 2 guests / 2 separate orders / 3 dishes: both orders entered in POS, 3 of 3 items servable, all 3 served -> the close control went from opacity 0.5 with the instruction banner showing, to opacity 1 with the banner gone. It UNLOCKED.
- Table 10098, deliberately the EXACT shape of yesterday's 10096 (2 guests x 3 dishes = 6 items): same result. Both orders in the till, 6 of 6 servable, all 6 served, control unlocked.
- Table 10093: the same again, and this time I SWIPED THE TRACK rather than tapping the label. The table closed - its card on the board became 'Table 10093 Canary Table 10093 No guests'.
- I then handed back every table I had dirtied. 10095, 10098 and 10099 all closed by the same swipe, and a separate verification pass read the board's own card text for all five: 10093, 10095, 10096, 10098, 10099 every one 'No guests', Orders tab 'All caught up! No active orders for your tables'. I did not trust a vanished slider to mean a closed table - the card text is the proof.
WHY MY EARLIER FINDING WAS UNSOUND. Not for the reason QRATE-EMP-1 proposed. Their mechanism - a second guest's order that never reached the till, so it has no serve control and never rolls to delivered - is REAL, and I reproduced it by accident in a void run today. But it is not what happened on 10096: that board read '2 orders - T10096 Vulpix in POS ... T10096 Guest in POS', both already in the till, with 6 item rows and 6 serve controls, all six served. The difference I can actually point at is MINE: I ran three separate walks against table 10096 that day and never handed it back, so it carried state from earlier passes. I cannot PROVE that residue caused the lock, and I am not going to assert it. What I can say is that the defect as I described it does not reproduce on a clean table, twice, including at the identical shape - and that 10096 itself is now closed without my having closed it.
A VOID RUN IS KEPT RATHER THAN DELETED. My first probe today emitted 'the lock is broader than the rollup edge'. That was false: 'Re-enter in POS' contains 'Enter in POS', so my loop re-pressed the card already in the till six times and never entered the second order at all - 3 item rows, 1 serve control. A locked control in that state is correct behaviour. The run is archived under uat-1202-multiorder-VOID with a written note, and the spec now asserts its own premise and declares itself VOID rather than emitting a verdict.
WHAT IS STILL NOT ESTABLISHED, and why this is PARTIAL rather than green: the journey's last two steps are the DINER's - the patron receiving sessionEnded, and the closed URL being blocked. After the close the guest's phone showed the plain menu; I never opened the cart sheet and I have no sentinel that distinguishes 'session ended' from 'I am looking at the wrong screen', so I am recording that leg as unwalked rather than guessing at it. | STR-1202 |
| W-064 | mosaic_v2-session-cooldown | 6 | PAWA | PASSED | Honest green | Walked end to end on a later pass: all three cooldown branches held - a fresh scan lands on the farewell screen, a dead session id cannot be resurrected, and after the window a new session is let back in. The board's green is honest here. (Corrected 2026-09-06: the older 'my run broke' summary predates that re-walk, and the stale-green note was my tooling's error, not the board's.)
Couldn’t check Everything past the diner joining the table. Left behind A guest session was opened on table 9980. the long versionWAS PARKED AS D5 ON MY OWN HARNESS - now walked end to end, and the board's PASSED badge is honest. Driven on the deployed dev patron and waiter apps, Anant table 7, waiter daniel@. SUBSTITUTION stated: Anant + daniel@, because no canary waiter password exists here - same substitution the already-walked mosaic_v2-session-close row uses. TWO HONEST DEPARTURES FROM THE CANARY: it closes the session by API and ages updatedAt with a backdate call; I closed the table the way a WAITER does (swiping the Bill tab control) and waited the five minutes on the wall clock (303s), because a diner has no API. NO ORDER WAS PLACED and no payment control was touched. ALL THREE BRANCHES HELD: (1) IN-COOLDOWN - a fresh scan with no session id landed on the farewell screen ('WITH GRATITUDE - Hope you enjoyed your visit'), zero dishes, not the mosaic menu. (2) STALE SESSION ID - reloading with the dead session id f735de98 in the URL landed on the same farewell, so the closed session cannot be resurrected. (3) POST-COOLDOWN - after the window a fresh scan was let back in with a NEW session edafede7 and 32 dishes, so the ScanQR infinite loop the journey's own card warns about did not occur. Table handed back as 'Table 7 No guests'. WHAT COST SIX PASSES, all mine and none of them the product: (a) a Playwright trace ENOENT in teardown destroyed a completed walk; (b) I started on table 2, which earlier walks had left occupied, so the close was legitimately locked; (c) my close step proved a swipe happened, not that the table closed - it would have measured a cooldown that never started; (d) I judged the turn-away from Anant's ordinary welcome card ('Let's get started') and stopped one swipe short of the farewell; (e) my swipe targeted the LABEL's box, which sits inside a pointer-events:none overlay and is narrower than the track, so the drag never landed - the proven geometry walks up to the first ancestor >=250px wide; (f) each failed pass left its diner seated, poisoning the table for the next pass, so cleanup now runs in finally regardless of verdict. CORRECTION TO AN EARLIER CLAIM OF MINE: I said a seated guest with no order cannot be closed. That was wrong and came from (e) - the Bill tab reads 'No orders yet / Swipe to Close Table' and closes fine. STR-1202's dead end is the narrower SERVED-ITEMS case. UNVERIFIED: I did not test the boundary precisely - I waited 5min+40s, so I cannot say the window is exactly five minutes, only that it had expired by then. [CORRECTED 2026-09-05: the stale-green claim on this row was MY tooling's error, not the board's. My Stage-1 check joined the board to this ledger on the step-id PREFIX, and three prefixes each carry two different suites, so this journey's suite had no map entry and read as absent. It ran 37 times in the captured board history, newest batch 17448e99 @ 2026-09-05 20:04:27Z, passed. Retracted on STR-1206.] what I saw · trace.zip · diner video · waiter video · report | |
| W-065 | mosaic_v2-session-idle-timeout | 4 | PAWA | PASSED | DEFERRED D5 | D5 HARNESS UNRESOLVED NOT WALKED. This one only happens after a long wait (a session going idle) and I cannot fast-forward the clock. Whether an idle session times out and pushes the diner onto a thank-you screen stays unknown.
Couldn’t check The last two steps. The menu did load and genuinely joined the table, which is as far as it got. Left behind A joined session on table 10223. the long versionConfirmed the menu loads with a real WS join on table 10223. Could not drive the actual 120-minute idle-timeout assertion -- that requires either a 2-hour real wait or backend API access to age lastActivityAt, neither of which is available to a UI-only, no-API-credential audit pass. | |
| W-069 | mosaic_v2-split | 12 | PAWA | PASSED | Partial green | Walked to the split panel and back out without paying. Did not settle - these are live Stripe merchants on dev. Splitting is real and reachable, but far thinner than the name suggests: it is a headcount handed to staff, not a split bill, and no money changes hands in the app.
Couldn’t check Five of the twelve steps went unreached and the row doesn't name them. What is clear is that only the diner who starts the settle sees any of it. Left behind Not recorded in the row. Two diners' sessions were used on the table and orders had been placed on it. the long versionWalked by two diners at one table on the split fixture. The split control is real and reachable - settlement-cover and settlement-split appear the moment an order is placed (an earlier recon that reported 'no split control exists' had simply never ordered). What the panel actually offers is thinner than the journey's name: Check Please -> 'How would you like to settle your bill? Cover / Split the check (N)' -> 'How many ways? [-N+] Split N ways'. No itemisation, no per-person amount, no statement of who owes what - it is a HEADCOUNT sent to staff, not a split of a bill, and nothing in the diner app takes the money. Only the initiator sees any of it; the other diner has no settle control and nothing on her phone mentions a bill. I REJECTED the lane's headline claim before filing it: it reported that the second diner cannot see the table's order, from her Ordered tab reading 'Nothing sent yet'. That tab defaults to the '(You)' scope and she had ordered nothing, so the reading was correct for that view. Re-driven on a clean table pressing cart-scope-chip-all, her Ordered tab shows 'Canary Cola $3.50 Waluigi / Canary Cola $3.50 Agent Smith, TOTAL $10.50' - she CAN see it, attributed by person. Not a defect, and not filed. Also not a defect: a 'Split the check (4)' reading at a two-person table was our own session pollution from an aborted run - though it does show the headcount counts patrons who are no longer present. what I saw · trace.zip · patron-a video · patron-b video · report | STR-1204 |
| W-070 | mosaic_v2-split-combos | 20 | PAWA | PASSED | Partial green | Eighteen of twenty steps stay unknown - I walked two. (Corrected 2026-09-06: the earlier 'it has not run since Sep 3' line is WITHDRAWN. That came from my own board join, which matches suites on a name prefix that is not unique, so it read the wrong suite's history. This row's schedule was never shown to have stopped.)
Couldn’t check Whether a split invite actually reaches the second diner. Left behind Table 10225: two diner sessions, each with an item added, and an order placed by the first of them. the long versionWAS PARKED AS D5 ON THE SAME HARNESS FAULT AS mosaic_v2-cover-someone - now walked. Re-driven with two diners at one table; BOTH placed real orders (each ledger badge 'ORDERED'). Diner two opened the service bubble and pressed Check Please; the settlement sheet offered settlement-cover and settlement-split. Split opens a 'How many ways?' sheet offering 6 controls: 'Split 2 ways', split-decrement, split-count-input, split-increment, confirm and Cancel. The split path is real and reachable for the SECOND diner, which is what this row doubted. WHAT I GOT WRONG: identical to cover-someone - the spec looked for '[data-testid=check-please]' which does not exist; the real control is 'service-bubble-ready_for_bill' inside the service bubble. One wrong selector parked two rows. DELIBERATE STOP: I did not press a payment control. These canary fixtures are live Stripe merchants on dev and completing a charge is not mine to do. UNVERIFIED: whether the split actually divides and settles the money - only that the options render and respond. [CORRECTED 2026-09-05: the stale-green claim on this row was MY tooling's error, not the board's. My Stage-1 check joined the board to this ledger on the step-id PREFIX, and three prefixes each carry two different suites, so this journey's suite had no map entry and read as absent. It ran 19 times in the captured board history, newest batch a6a71039 @ 2026-09-05 20:02:56Z, passed. Retracted on STR-1206.] what I saw · trace.zip · diner-1 video · diner-2 video · report | |
| W-071 | mosaic_v2-split-epay | 7 | PAWA | PASSED | False green | Board says PASSED; the diner who asks to split cannot pay. Verified on two tables. A diner who chooses to split the bill is left with no way to pay - the Check Please button greys out the moment the split is agreed, and nobody is ever told what their share costs.
Couldn’t check Why the second diner's drink looks like it was never sent - her phone still offers to place that $3.49 order behind the invitation. I am reporting the screen I saw, not a cause. Left behind Tables 9973 and 9974 are both left with orders on them and a split agreed that cannot be paid. the long versionThe diner who chooses to split the bill is left with NO WAY TO PAY. Walked it: two diners join, order, diner 1 goes Check Please -> 'Split the check (2)' -> 'How many ways?' -> Split 2 ways -> confirm; diner 2 receives and accepts the invitation. Diner 1 then reopens the service drawer and Check Please is GREYED OUT - 'Ready to settle up' in grey, footer 'Your server is nearby - we'll be right with you', tapping does nothing, reload does not help. Call Waiter and Silverware are still active beside it, so it is that one control that is disabled. Verified on tables 9973 AND 9974, both phones hunted. He chose to settle electronically and the app took the option away. Also: diner 2's invitation VANISHES the instant she accepts, and only returns after a full page reload - where it asks her to Accept split again, a question she already answered. And neither diner is ever told the size of their half ('Even split of the table total' - no figure). SECONDARY, NOT DRIVEN BY ME: in both two-diner walks diner 2's drink appears never to have been sent - her phone still shows a live order-now-btn and 'Place order $3.49' behind the invitation - reported as a screen, not a cause. what I saw · trace.zip · diner-1 video · diner-2 video · report | STR-1203 |
| W-074 | mosaic_v2-view-order | 8 | PAWA | PASSED | Honest green | The little view-order pill does the right thing at every stage — appearing, opening, retracting, clearing once sent, and re-arming for a second course.
Couldn’t check One of the journey's eight steps is not accounted for in this row. Left behind Table 10208: a guest session with an order sent to the kitchen and a further item added after it. the long versionDrove the full View-order pill state machine on table 10208 (shared canary-mosaic fixture, mosaic_v2): no pill on an empty cart, pill appears with an accurate 'N item(s) - tap to review' caption after an unsent add, one tap opens the cart, back-to-menu retracts it and the pill returns, sending to kitchen clears the pill, and adding a further item after sending re-arms the pill for a second course. | |
| W-076 | order-visibility | 11 | CAPAWA | PASSED | Honest green | An order placed by a real diner reaches the waiter in about 11 seconds, two heat levels of the same dish stay two separate tickets, and two diners at one table are both visible.
Couldn’t check The 4 machine steps (token minting, fixture create/delete) have no screen. Also worth watching: the second order took 27.8s against a 30s SLO - inside it, but with 2.2s of margin on a single sample. Left behind Nothing - both diners cancelled their own items; table 2 left as found. the long versionWalked all 7 human-walkable steps on the deployed dev apps. Diner one's order reached the waiter's board in 10.9s, the same dish re-ordered at a different heat in 27.8s, and a second diner's in 12.9s - all inside the canary's own 30s SLO, each confirmed by a NEW order line appearing on the board (5->6->7->8) and quoted verbatim. Two orders of one dish stayed two separate lines, one showing Mild and one Hot. Both diners were visible on one board. The 4 remaining steps are token minting and fixture create/delete - machine plumbing with no screen, not walkable. what I saw · trace.zip · diner-1 video · diner-2 video · waiter video · report | STR-1192, STR-1197 |
| W-090 | wine-order-integrity | 10 | CAPAWA | PASSED | Partial green | The whole merchandising promise holds up end to end — recommend, price, swap glass for bottle without duplicating, order at the quoted price — but the staff side is invisible to me, and the restaurant this journey is named after sells no wine.
Couldn’t check The waiter's view of the pour, and two steps that have no screen at all. And I cannot tell from outside which restaurant the automated check actually drives — if it drives the one named for this journey, its cellar-band step is asserting something a guest there cannot see. Left behind Two real unpaid orders standing on the wine restaurant, both a bottle of Canary White Wine at $40.00 — one on table 9946 from the successful walk, one on table 9942 from an earlier attempt that went through even though my own listener missed it. I cannot settle or close either; no staff account here is assigned to those tables. Also idle guest sessions on test tables 9938, 9939, 9941, 9942, 9944, 9945 and 9946. the long versionPARTIAL GREEN - and the merchandising promise is real, watched end to end. A guest sits down at the Sommelier fixture, gets a THE CELLAR band, answers three taps (white / dry / light) and is shown 'YOUR POUR TONIGHT - Canary White Wine, BY GLASS $10.00 / BY BOTTLE $40.00' with an alternative. Glass goes into the cart at $10.00. Re-take the quiz, switch the SAME wine to bottle, and the glass line is REPLACED, not duplicated - and that was proven the hard way, polled to 1 then settled 750ms then re-read, because a poll alone returns the instant it matches and is blind to an overshoot. Order placed, 201, and the Ordered tab still reads $40.00. NOT WALKED: the waiter's view of the pour (step 9), and steps 1 and 10 are API contracts. FIXTURE CAVEAT worth keeping: the restaurant NAMED for this journey, 'Canary Wine Sommelier Journey - dev' (7343d667), sells no wine and shows no CELLAR band on any of its four courses. The wine is on 0c31c6ec and that is where this was walked. If the canary drives 7343d667, its sommelier-banner step is asserting something a guest there cannot see - I cannot tell which from outside.
WHAT A PERSON CAN DO: Everything the merchandising half of this journey promises. A guest sits down at Canary Mosaic V2 Sommelier - dev, is offered a THE CELLAR band ('Find your perfect pour'), answers three taps (white / dry / light) and is shown YOUR POUR TONIGHT: Canary White Wine, BY GLASS 0.00 or BY BOTTLE 0.00, plus an 'Other pours' alternative (Canary Red Wine, by glass 1.00). Adding by the glass puts exactly 0.00 in the cart. Re-taking the quiz and switching the SAME wine to BY BOTTLE REPLACES the glass line rather than adding a second - the cart settles at exactly one line, 0.00 (polled to 1, waited 750ms, re-read: still 1). Placing the order returns 201 and the wine moves into the 'Ordered' tab still reading 0.00 - the charged price equals the price the panel quoted.
WHERE IT STOPS: The waiter app. Board step 9 ('serving_size === the pour selected, order + Bill') needs a staff view of the order, and the only staff-capable login in this container is the canary OWNER. On that attempt the waiter app never let it in - it stayed on the sign-in page with no error message. An earlier successful sign-in with the same account (recon, 22:08 UTC) shows why it would not have helped anyway: the board answers 'No tables assigned to you yet'. Either way table 9946's order and its pour are not visible to me.
NOT PROVEN (never graded): Board step 1 (CANARY: fixture has priced glass+bottle servings) and step 10 (order line menu_id matches the pinned contract) are API contracts with no screen - not graded. Board step 9 (waiter/Bill serving_size) not reached - not graded.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=0c31c6ec-...&table=9946&layout=mosaic_v2 as an unauthenticated GUEST on iPhone 14 Pro/chromium; waiter.dev.qrate-ai.com as the canary OWNER account
STATE LEFT BEHIND: TWO real orders left standing on Canary Mosaic V2 Sommelier - dev, both 1 x Canary White Wine By Bottle $40.00, neither paid and no payment control touched: table 9946 (the successful walk, server answered 201) and table 9942 (an earlier attempt of the same walk - its 'Ordered' ledger read 'Canary White Wine ORDERED $40.00', so the order went through even though my network listener missed the POST; that run then stopped on my own bad assertion). I cannot settle or close either - no staff account here is assigned to those tables. Also left: idle guest sessions on test tables 9938/9939/9941/9942/9944/9945/9946 across the lane's walks. what I saw · trace.zip · patron video · waiter video · report | STR-1211 |
Needs the owner-role account. 37 journeys · 280 steps · 0 not yet driven
| # | Journey | Steps | Actors | Canary says | UAT verdict | Note | Ticket |
|---|---|---|---|---|---|---|---|
| W-003 | boost-special | 14 | OWPA | PASSED | Partial green | An owner really can promote a dish, once you know the control lives on the dish's Menus tab. Whether promoting it changes anything a diner sees is still unproven — I would not touch a live fixture to find out.
Couldn’t check Whether turning the boost on makes the diner's menu change, and whether turning it off puts things back. The scoring half of this journey has no screen behind it at all. Left behind Nothing changed — I only read the controls. An idle guest session is left on test table 9941. the long versionPARTIAL GREEN - the owner control exists and is reachable, the scoring half is not walkable. An owner CAN promote a dish: open the dish, go to the MENUS tab, and there are placements-tab-boost-<menuId> offering None / Low / Moderate / High plus placements-tab-chefs-special-<menuId>. Nowhere else in the app - not on the other four dish tabs, not in the Menu builder, not Personalize, not Insights. NOT WALKED: setting or clearing a boost is a mutation on a live hourly canary fixture, so the 'diner sees boost_applied true then false' half is unproven, and steps 2-9 are pure scoring-API assertions with no screen. SELF-CORRECTION recorded by the lane: its first, shallower pass read only the dish's default tab and would have filed 'no boost control exists'. That would have been false.
WHAT A PERSON CAN DO: An owner CAN promote a dish, and the controls are findable: Food Items -> open a dish -> the 'Menus' tab -> a placements panel carrying a BOOST control offering None / Low / Moderate / High (testid placements-tab-boost-<menuId>) and a CHEF'S SPECIAL control (placements-tab-chefs-special-<menuId>). They are on that tab only - the dish's other four tabs (Dish Properties, Modifiers, Pairings, Performance), the Menu builder, Personalize and Insights/recommendations mention boosting nowhere. On the diner side, Canary Kitchen - dev does render a hero carousel above every course (m2-hero with one m2-hero-slide), which is where a promoted dish would surface.
WHERE IT STOPS: The promise that ties the two halves together. Board steps 11-14 are 'set the boost -> patron sees boost_applied=true -> clear it -> patron sees false'. Setting or clearing a boost mutates a live canary fixture that runs this journey hourly, so I did not, and the effect is therefore UNPROVEN rather than failed. Separately, no dish on the diner's menu carries any badge or wording (chef's pick / top pick / featured / recommended) telling a diner WHY it is being shown - the grid is flat.
NOT PROVEN (never graded): Board steps 2-9 (POST /diner/top-picks, S1 baselines, Boost MAX +0.10, Boost STRONG +0.08, Boost Suppressed S1<0.20, Chef Pinned Pos1, Chef Pinned Pos3, Chef Dropped S1<0.25) are pure scoring assertions over an API with no screen behind them - not graded. Steps 11-14 (set/clear the boost and the patron reading it back) not exercised - not graded.
SURFACE DRIVEN: owner.dev.qrate-ai.com as the canary OWNER on Desktop Chrome + the patron menu at dcgmji73h6qel.cloudfront.net/menu?id=99e9d621...&table=9941&layout=mosaic_v2 as a guest on iPhone 14 Pro/chromium
STATE LEFT BEHIND: none - I read the controls and changed nothing. An idle guest session remains on test table 9941. what I saw · trace.zip · owner video · patron video · report | STR-1211 |
| W-005 | dedup-orphan | 7 | OWPAWA | PASSED | DEFERRED D3 | D3 WON'T MUTATE LIVE DATA None of the seven steps was graded, so whether a waiter's board correctly drops an abandoned table is unknown.
Couldn’t check All seven steps. Left behind Nothing. I signed in and looked; I planted nothing and closed nothing. the long versionDEFERRED D3, compounded by D4. There is no honest walk available: the journey is six parts websocket seeding I will not perform, and one part staff view I cannot reach with any credential this container holds.
WHAT A PERSON CAN DO: Nothing of this journey. Six of its seven steps are owner/patron API and websocket work - draining sessions, opening a websocket and seeding a deliberately STALE, orphaned table session, then closing both. Seeding a fake stale session on a live canary fixture that runs this journey hourly is a mutation I will not make.
WHERE IT STOPS: Step 5 - 'UI: Waiter Tables - B occupied, A absent' - is the only step with a screen, and it is blocked twice over. (a) The only staff-capable login in this container is the canary restaurants' OWNER; when it did sign in to the waiter app (recon, 22:08 UTC) the board read 'Canary Kitchen - dev / Server: Canary Owner / Active Orders | Tables | Wine / No tables assigned. No tables assigned to you yet' - so there is no table list to read at all. That is a config assignment only the operator can make (D4). (b) Even with tables assigned, the stale topology the step asserts would still have to be seeded (D3).
NOT PROVEN (never graded): All seven steps - not graded.
SURFACE DRIVEN: waiter.dev.qrate-ai.com/owner/staff-orders/ as the canary OWNER account on Desktop Chrome
STATE LEFT BEHIND: none - I signed in and looked; I seeded nothing and closed nothing. | STR-1213 |
| W-010 | food-tags-invariant | 9 | OWPA | PASSED | Partial green | The rule holds and I watched it: an untagged dish reads as not-applicable and drops out when a diner asks for vegetarian, while the genuinely vegetarian dishes stay.
Couldn’t check The vegan half - whether a vegetarian-only dish also disappears for a vegan diner. The filter drawer would not reopen for me to change my mind. Also whether clearing every diet tag turns not-applicable back on by itself: I saw a dish already sitting in that state, I never watched it happen. Left behind Nothing changed and nothing ordered - I opened three dish editors and never pressed Save, and never clicked a tag. Two guest table sessions left open, 9910 and 9911. the long versionPARTIAL GREEN - the invariant itself is confirmed on screen, the vegan half is not. Canary Grilled Chicken carries no dietary pill and renders N/A outlined on the owner's own screen, and it is exactly the dish that vanishes when the diner says vegetarian (3 -> 2) while the two genuinely Vegetarian-tagged dishes stay. Step 7 (the same dish must also vanish for a VEGAN diner) was NOT reached: reopening the filter drawer a second time timed out. One observation is not a defect and it is not graded as one. NOTE - this row also carries a RETRACTION made inside the lane before it left the container: a draft finding said 'Canary Margherita has no dietary tag yet survives the vegetarian filter'. It was withdrawn. The selected-state detector read className:'' / aria-pressed:null on every pill and so returned nothing; the screenshots from that same step show Margherita tagged Vegetarian. The product was right on all three dishes.
WHAT A PERSON CAN DO: The invariant is real and a person can see BOTH halves of it. In the owner's dish editor (Food Items -> click a dish -> DIETARY INFO) there are 7 dietary pills - Vegetarian, Vegan, Gluten-Free, Halal, Kosher, Jain, N/A - and 10 allergen pills, and an owner can read and set them. 'Canary Grilled Chicken' shows the invariant itself on screen: no dietary restriction is chosen and the N/A pill is outlined - exactly the journey's 'empty dietary -> na=true'. Then, as a diner at table 9910 on Mains, I opened the filter drawer, chose Vegetarian and applied it: 3 dishes became 2. The one that disappeared was Canary Grilled Chicken - the N/A one. The two that stayed, Canary Fries (Vegetarian+Vegan+Gluten-Free) and Canary Margherita (Vegetarian), are both really tagged vegetarian. That is steps 4 and 6 of this journey, watched end to end.
WHERE IT STOPS: Step 7 (a vegetarian-only dish must vanish for a VEGAN diner). I went back for it on a second run: after applying the Vegetarian filter, tapping the dock's filter control a second time (m2-dock-filter) did not open the drawer within 25 seconds, so I never got to choose Vegan. ONE observation, not repeated - I am NOT calling that a defect, but 'can a diner change their mind about a dietary filter without reloading?' is a question worth someone driving properly. Steps 2, 5, 8 and 9 (create the probe, PUT dietary=[vegetarian], PUT dietary=[], delete it) are writes to a live canary fixture and I did not make them.
NOT PROVEN (never graded): Steps 1,2,3,5,7,8,9. Step 7 specifically: Canary Margherita is the ideal subject (Vegetarian yes, Vegan no, per owner/04) and it remains unchecked. The AUTO-CORRECT half of step 8 - that clearing every dietary pill turns N/A back on by itself - is unproven: I saw a dish already in that state (Canary Grilled Chicken), I never watched the transition.
SURFACE DRIVEN: OWNER https://owner.dev.qrate-ai.com/owner/food-items/?restaurantId=28ae37ab-... as canaryOwner (Desktop Chrome) + PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=28ae37ab-...&table=9910&layout=mosaic_v2 as a guest (iPhone 14 Pro geometry on chromium)
STATE LEFT BEHIND: none - read only. Three dish editors were opened and closed; Save Changes was never pressed and no pill was clicked. Two guest table sessions opened (9910, 9911); nothing ordered. what I saw · trace.zip · owner video · patron video · owner video · patron video · report | STR-1208 |
| W-025 | modifier-link | 7 | CAOWPA | PASSED | DEFERRED D3 | D3 WON'T MUTATE LIVE DATA None of the seven steps was graded, so whether attaching a modifier actually reaches the diner is unknown — no dish on any lasting menu carries one with anything in it.
Couldn’t check All seven steps. I did establish that the owner control exists and is reachable on one restaurant; nothing beyond that. Left behind Nothing. Read only — I opened tabs and read controls; I saved nothing and linked nothing. the long versionDEFERRED D3 - but the screen was found and read, which is worth recording. On Canary Mosaic V2 Dining an owner really can reach it: Food Items, dish, MODIFIERS tab, with Add-new, an Optional / choose-one rule, Add-member, Rename and a per-grouping Pricing switch. So the capability has a real human surface. What stops the walk is that exercising it means writing to a live fixture, and on the five restaurants this journey's siblings use, the screen 403s (STR-1207).
WHAT A PERSON CAN DO: On Canary Mosaic V2 Dining an owner really can reach the screen this journey is about. Food Items -> click a dish -> the editor opens with tabs Dish Properties / Menus (1) / Modifiers / Pairings / Performance, and the Modifiers tab carries 'Add new', a rule dropdown (Optional / choose-one), 'Add member', 'Rename' and a per-grouping Pricing switch. Canary Caesar Salad already carries one grouping there, reading '# Add-ons - DEFAULT - Optional - Pricing on - No members yet'.
WHERE IT STOPS: Two places. (1) Every OWNER step in this journey (2, 4, 6) is a WRITE to a shared canary fixture - link a modifier, unlink an option, unlink the modifier. I will not mutate a live canary fixture mid-cycle; doing so hands the builder a false red. That is what makes this D3 and not a walk. (2) Independently: on FIVE of the six canary restaurants I own, the owner Food Items screen does not load at all - see the separate defect below. An owner on any of those cannot reach step 2's screen by any route.
NOT PROVEN (never graded): All 7 steps. I proved the owner CONTROL exists and is reachable on one restaurant; I proved nothing about whether linking a modifier actually reaches the diner, because no dish on any persistent menu carries a modifier with members. The one grouping that does exist has no members, so the diner correctly sees nothing - that is consistent, not a defect.
SURFACE DRIVEN: https://owner.dev.qrate-ai.com/owner/food-items/ as canaryOwner (Desktop Chrome) + https://dcgmji73h6qel.cloudfront.net/menu?id=f469b191-...&table=9945 as a guest diner (iPhone 14 Pro descriptor on chromium)
STATE LEFT BEHIND: none - read only. I opened tabs and read controls; I saved nothing and linked nothing. what I saw · trace.zip · diner video · owner video · report | STR-1207 |
| W-026 | mosaic-v2-edit | 7 | OWPA | PASSED | Partial green | Change the quantity of a dish you already ordered and it edits the line instead of adding a second one. Watched end to end, and it is what proves the separate tile-door fault really is the tile's.
Couldn’t check The signed-in diner path - I walked it as a guest. And the journey's own setup and teardown steps, which I deliberately did not run on a live restaurant. Left behind Nothing - I emptied every basket I built and checked tables 9932, 9926 and 9931 were left empty. No order was ever sent to a kitchen. Note for the operator: table 9926 already had two other real diners on it when I arrived; I left their items alone. the long versionPARTIAL GREEN - all four diner steps held and were watched. Quantity 1 to 2 produced ONE cart line at $17.98; tapping that line reopened the dish PRE-FILLED at 2 offering 'Add to order ($17.98)'; confirming it unchanged left the order exactly as it was, still one line, still $17.98. That last part matters: it is the CONTROL that proves the edit door itself is correct, which is what makes the separate tile-door defect attributable. NOT WALKED: steps 1, 2 and 7 are owner provisioning and teardown. Step 3 was walked as a guest, not signed in.
WHAT A PERSON CAN DO: Everything the four diner-facing steps promise. Opened Canary Caesar Salad from its m2-tile, stepped the quantity 1->2 (the button relabelled itself 'Add to order ($17.98)'), added it: my order took ONE line, 2 salads, TOTAL $17.98. Tapping that line in my order reopened the same dish already showing 2 and offering 'Add to order ($17.98)' - the pre-fill step 5 promises. Pressing it unchanged left the order at one line / $17.98, so the sheet reached from my order really is an editor and not a second add.
WHERE IT STOPS: nowhere - walked end to end
NOT PROVEN (never graded): Steps 1, 2 and 7 (OWNER auth, Create Plain Canary Dish, Teardown) - the canary's own provisioning. I created nothing; making a dish on a live fixture mid-run would hand the builder a false red. Step 3 says 'Patron Auth + Profile' and I walked it as a GUEST, so the signed-in diner path is unproven.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=f469b191-ec79-585d-916a-e6c497617eb8&table=9932&layout=mosaic_v2 - guest diner, iPhone 14 Pro descriptor on the chromium engine (NOT real iOS WebKit)
STATE LEFT BEHIND: Emptied every unplaced order I created: tables 9932, 9926 and 9931 all left empty (verified - no m2-dec- control remains on the tile). No order was ever sent to the kitchen. NOTE for the operator: table 9926 on this restaurant already had OTHER patrons in a live session (scope tabs read 'Charizard' and 'Ray Arnold') before I arrived - not mine, and I left their items alone.
THIS ROW IS THE CONTROL FOR STR-1212. Its step 5-6 walk - open the dish from the ORDER LINE at 2, press 'Add to order ($17.98)' unchanged, order stays at 2 salads / $17.98 - is what establishes that the EDIT DOOR is correct. Without it, the tile-door doubling could have been blamed on the sheet in general. It is cited in that ticket as the falsification. what I saw · trace.zip · diner video · report | STR-1212 |
| W-027 | mosaic_v2-boost-special | 6 | OWPA | PASSED | DEFERRED D3 | D3 WON'T MUTATE LIVE DATA Whether a boosted dish or a chef's special actually stands out to a diner stays unknown — and the banner that would show it only exists for a few minutes at a time.
Couldn’t check Every step of it. Anyone looking a few minutes after the test would see nothing and wrongly conclude the feature is missing. Left behind Nothing changed and nothing ordered. An idle guest session is left on test table 9945. the long versionDEFERRED D3 - with one observation worth more than the grade. Canary Mosaic - dev is a flat grid: every tile measured 185x185, no badge, no promoted wording, no hero. But the hero surface IS real and it is TRANSIENT - Canary Kitchen - dev rendered m2-hero plus one m2-hero-slide at 22:39 UTC and NO hero at all at 23:16, arrived at exactly the same way. That matches this journey's own set-then-clear shape, and it means a person can only ever see this journey's result inside the window the canary holds the boost open. A human verifier who looks a few minutes late sees a flat grid and concludes nothing is there.
WHAT A PERSON CAN DO: Sit down and read the menu. On Canary Mosaic - dev every course renders a flat grid of identically sized tiles (all 185x185 px, measured): 9 drinks, 2 starters, 3 mains, 1 dessert. No dish carries a badge, wording or larger tile marking it boosted, a chef's special, featured or a top pick, and no dish is NAMED for either. So on this restaurant 'Both On Hero' has no counterpart a diner can see.
WHERE IT STOPS: Five of the six steps are the canary creating a boosted dish and a chef special over the API, attaching them to a menu and setting the flags. Recreating that means minting menu objects on a live canary fixture that runs this journey hourly - a mutation I will not make. Without it the sixth step has nothing to show.
NOT PROVEN (never graded): Steps 1-5 (all OWNER API provisioning) and step 6 (Both On Hero) - not graded.
SURFACE DRIVEN: dcgmji73h6qel.cloudfront.net/menu?id=28ae37ab...&table=9945&layout=mosaic_v2 as a guest on iPhone 14 Pro/chromium
STATE LEFT BEHIND: none - I changed nothing and ordered nothing. An idle guest session remains on test table 9945. | STR-1213 |
| W-028 | mosaic_v2-byo-bypass | 11 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING All eleven steps stay unknown, because there is no build-your-own dish for a diner to open.
Couldn’t check Every step — the first six have no screen at all, and the last four need a dish that isn't there. Left behind Nothing — read only. the long versionDEFERRED D2. The owner-side byo-toggle exists on the dish editor and was READ, not flipped. But the diner half cannot start: no BYO dish exists on any fixture between canary runs.
WHAT A PERSON CAN DO: The build-your-own capability does have an owner screen: the dish editor carries a `byo-toggle` (I read it, did not flip it), and the Modifiers tab has the choose-one rule and Add-member controls the journey's steps 4-5 describe.
WHERE IT STOPS: There is no build-your-own dish for a diner to open. Steps 8-11 are all PATRON steps against a BYO main with vegan/meat members, and no such dish exists on any of the five fixtures once the canary's run is over. Steps 1-6 are the canary's own API provisioning plus a deliberate 400 assertion, which has no screen.
NOT PROVEN (never graded): Every step. Recon, done first and recorded in three read-only walks: I toured every course on five candidate canary fixtures (Spice Mod, Includes, Groupings, Grouping Dietary, Mosaic V2 Dining) and opened every dish on every one of them. The persistent menu is identical on all five: 1 drink (9 on Dining), Canary Caesar Salad, Canary Fries, Canary Grilled Chicken, Canary Margherita, Canary Tiramisu - every one of them described 'DO NOT MODIFY', and every one opening to the same fifteen controls: hero photo, price, an 'Anything else?' note box, a quantity stepper and Add to order. Nothing else. No spice picker, no modifier group, no sides section, no build-your-own, no variant switcher, on any dish, on any fixture.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=<each fixture>&table=9944 as a guest diner (iPhone 14 Pro descriptor on chromium) + https://owner.dev.qrate-ai.com/owner/food-items/ as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only. No dish opened was ever added to a cart in these recon walks. what I saw · trace.zip · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Spice-Mod video · diner video · owner video · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Mosaic video · diner-Canary-Spice-Mod video · owner video · report | STR-1207 |
| W-029 | mosaic_v2-byo-dietary-allergen | 8 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING None of the eight steps was graded, so whether diet and allergen filters correctly hide parts of a build-your-own dish is unknown.
Couldn’t check Every step. The owner-side switch and the full set of diet and allergen tags are all present and were read; only the diner half has no subject. Left behind Nothing. Read only — no dish I opened was ever added to a cart. the long versionDEFERRED D2. The owner-side byo-toggle and the full dietary/allergen pill set are both present and were read. The diner half has no subject.
WHAT A PERSON CAN DO: Same as W-028 on the owner side - `byo-toggle` plus dietary and allergen pills (vegetarian, vegan, gluten-free, halal, kosher; dairy, eggs, fish, shellfish, tree nuts, peanuts, wheat, soy, sesame) are all on the dish editor and reachable.
WHERE IT STOPS: Steps 5-8 need a BYO main carrying three members, one non-veg and one allergen-bearing, for the dietary and allergen filters to hide. No BYO dish and no member exists to filter.
NOT PROVEN (never graded): Every step. Recon, done first and recorded in three read-only walks: I toured every course on five candidate canary fixtures (Spice Mod, Includes, Groupings, Grouping Dietary, Mosaic V2 Dining) and opened every dish on every one of them. The persistent menu is identical on all five: 1 drink (9 on Dining), Canary Caesar Salad, Canary Fries, Canary Grilled Chicken, Canary Margherita, Canary Tiramisu - every one of them described 'DO NOT MODIFY', and every one opening to the same fifteen controls: hero photo, price, an 'Anything else?' note box, a quantity stepper and Add to order. Nothing else. No spice picker, no modifier group, no sides section, no build-your-own, no variant switcher, on any dish, on any fixture.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=<each fixture>&table=9944 as a guest diner (iPhone 14 Pro descriptor on chromium) + https://owner.dev.qrate-ai.com/owner/food-items/ as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only. No dish opened was ever added to a cart in these recon walks. what I saw · trace.zip · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Spice-Mod video · diner video · owner video · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Mosaic video · diner-Canary-Spice-Mod video · owner video · report | STR-1207 |
| W-038 | mosaic_v2-custom-dietary | 2 | OWPA | PASSED | DEFERRED D3 | D3 WON'T MUTATE LIVE DATA Chip never renders in the stable state; proving it works needs an owner mutation I will not make on a canary fixture. The Jain option exists for about five seconds a run and is invisible the rest of the time, so nobody can ever see it working. The filtering itself does work on the tags that stay put.
Couldn’t check Whether a custom diet tag actually reaches a diner. Seeing it at rest would mean creating such a dish myself on a live restaurant mid-run, which would hand the builder a false red. the long versionAll three of these journeys run against ONE shared restaurant - Canary Mosaic 28ae37ab - not their own fixtures. The board shows m2cd-02-jain-chip-filters PASSING. Driving the product: I opened the filter drawer on ALL FOUR courses and there is NO Jain option anywhere - not by testid, not by label. Owner side corroborates: the Dietary tab row for the custom tag reads 'jain | Custom | 0' - zero items carry it. The canary creates a tagged dish, asserts, and tears down inside about 5 seconds (m2cd) / 3 seconds (m2lf). So the green is true only inside a window no person can reach. I am NOT calling this a false green: provision-assert-teardown is legitimate test design. The finding is that no DURABLE evidence exists that a custom dietary tag reaches a diner, and that the shared fixture churns while other journeys assert counts against it. | STR-1200 |
| W-039 | mosaic_v2-dietary-carousel | 7 | OWPA | PASSED | DEFERRED D3 | D3 WON'T MUTATE LIVE DATA Walked the equivalent assertions on durable dishes; the journey's own probe dishes live ~24s and were not walked. The dietary filter really does work on the dishes that are always there. But it is a browse filter, not a safety one — dishes with no allergen data recorded slip straight through it.
Couldn’t check The chip this journey is really about. It only appears once a matching dish exists, and the test creates that dish for a few seconds per run. Making one myself on a live restaurant mid-run would hand the builder a false red — and I no longer hold the owner login that would let me set it up. the long versionAll three of these journeys run against ONE shared restaurant - Canary Mosaic 28ae37ab - not their own fixtures. WALKED the filter path on the dishes that are always there: Mains baseline 'Show 3 dishes' -> vegan 'Show 1 dish' -> exactly Canary Fries; Mains -> avoiding dairy 'Show 2 dishes'. The filter genuinely filters. Two things a reader should carry: (1) the journey's own probe dishes (Canary M2DC <Course>-{conflict,na,vegan} + an M2DC Menu) exist for roughly 24 seconds before teardown, so what it asserts is never visible to a person; (2) this is a BROWSE filter, not a safety one - a dish with no allergen data recorded is KEPT by 'avoiding dairy', not hidden. | STR-1200 |
| W-040 | mosaic_v2-dietary-safety | 5 | OWPAWA | PASSED | Partial green | WALKED on Anant instead of the canary fixture. The fixture has no owner row, but that never made the BEHAVIOUR unwalkable - demo@ owns Anant, which has 32 real dishes. A diner can say 'no gluten' and the menu really does narrow. But gluten is the only thing this restaurant lets them say — there is no way to tell it about nuts, dairy or anything else.
Couldn’t check Whether the 15 dishes left are actually gluten-free, or whether the 17 that vanished were removed for containing gluten or just for having no tag at all. From the diner's side those look identical, and only one of them is safe. Left behind Nothing. I only read; I changed no dish, tag or menu. the long versionNot walked. Of 5 steps, 3 are OWNER/CANARY provisioning (create the dish, set the tag, publish the menu) and only 2 are patron-observable - and the patron half asserts the owner half's effect, so it cannot be checked without it. I drove this journey's fixture as a guest and captured the live state instead. What that established: The filter drawer exposes exactly ONE dietary chip (m2-dietary-gluten-free) plus served-alcoholic / served-nonAlcoholic, and an apply button reading 'Show 9 dishes'. RE-WALKED 2026-09-05 on Anant (097c229c) with the demo owner account and a real guest at table 10, video + trace, NO data changed. Owner sidebar: Home/Food Items/Menu/Tables-Staff/Personalize/Insights/Payments. 25 food-item rows; the owner's food-items screen shows dietary wording exactly once ('allergen'). The diner's filter drawer offers exactly ONE dietary choice, Gluten-Free. Applying it took the menu from 32 dishes to 15 - the control moves the number, so the filter is genuinely applied. What is still unproven: whether those 15 are actually safe, and whether the 17 removed were removed for containing gluten or merely for being untagged. | STR-1214 |
| W-042 | mosaic_v2-drink-subcat | 6 | OWPA | PASSED | Partial green | Drink sub-categories genuinely work, just not on the restaurant this journey is about - there it is one drink and no rail, and the owner is locked out of their own menu entirely.
Couldn’t check This journey's own structure - the two drinks and two sub-categories it is really about. I saw the rail work on a different restaurant; I never saw this one's. Left behind Nothing - read only. Nothing was created, changed or deleted. Two guest table sessions opened, 9941 and 9942, and nothing ordered. the long versionPARTIAL GREEN - the capability is real, this fixture cannot show it, and the owner is locked out. The drink sub-category rail was watched working on a control restaurant: 'BEVERAGES 1 / MORE 8' with jump pills over 9 drinks. On this journey's OWN restaurant, Beverages is a single ungrouped list of exactly one drink and there is no rail at all - so the state the journey asserts is not present for a diner to see. The owner cannot fix that or even look: /owner/menu/ and /owner/food-items/ for this restaurant both return 403 on the wire and render as 'Failed to load menu - please try again' with a Retry that can never succeed (STR-1207). The board is green because this journey provisions by API, which is precisely the gap.
WHAT A PERSON CAN DO: A diner CAN see drink sub-categories where they exist: on Canary Mosaic (control, table 9942) the Drinks course renders a sub-category rail - m2-subcat-nav reading 'BEVERAGES 1 / MORE 8' with two jump pills - over 9 drinks, and the mosaic draws real dividers with headings and counts ('Sides - 1 dish', 'More - 2 dishes' on the food course). So the diner-facing half of this promise is real and I watched it.
WHERE IT STOPS: Two places. (1) On the journey's OWN restaurant, Beverages is a single ungrouped list of exactly one drink (Canary Iced Tea) with NO sub-category rail at all - the two drinks and two sub-categories this journey is about are simply not on the menu when a person looks. (2) The owner half is not merely 'API-only', it is IMPOSSIBLE from the owner app: https://owner.dev.qrate-ai.com/owner/menu/?restaurantId=d4d9a4b3-... renders 'Failed to load menu - please try again' and Retry changes nothing, and /owner/food-items/ for the same restaurant is one red line, 'Failed to fetch menu-item summaries for d4d9a4b3-3c76-5cac-b070-52e77fbba79e' - no Add Dish button, no list, nothing. An owner cannot create the drinks, cannot attach them to a menu and cannot file a sub-category.
NOT PROVEN (never graded): Steps 4-6 as this journey means them - 'Await Structure', 'Open Beverages + Scope Menu', 'Sub-cat Dividers + Nav' against the journey's OWN two provisioned sub-categories. I saw the rail render on a different restaurant; I never saw this journey's own structure.
SURFACE DRIVEN: PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=d4d9a4b3-...&table=9941&layout=mosaic_v2 as a guest (iPhone 14 Pro geometry on chromium) + control id=28ae37ab-... table 9942; OWNER https://owner.dev.qrate-ai.com/owner/menu/ and /owner/food-items/ for the same restaurant as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only. No item, menu or sub-category was created, changed or deleted. Two table sessions were opened as a guest (9941, 9942) and nothing was ordered. what I saw · trace.zip · owner video · patron video · owner video · report | STR-1207 |
| W-045 | mosaic_v2-food-subcat | 6 | OWPA | PASSED | Partial green | The diner really does get a sub-category strip on the menu, but the owner screens meant to create those sub-categories don't load — so I can say the strip exists and nothing more.
Couldn’t check That the sections I saw ARE this journey's own two sub-categories. What shows at rest is the course's ordinary grouping; the journey's own sub-categories are not there between runs, and I could not create them because the owner screens error out. Left behind Nothing changed. Two guest table sessions opened, on 9945 and 9946; nothing ordered. the long versionPARTIAL GREEN - the diner half was watched on the journey's OWN restaurant: a real sub-category rail reading 'SIDES 1 / MORE 2' with dividers and counts. What is NOT proven is that those dividers are the sub-categories this journey files, because the owner half cannot be reached at all: /owner/menu/ and /owner/food-items/ return 403 and render as a retryable red line (STR-1207). Without the owner screen I cannot tie the rail to the journey's own provisioning, so I claim the rail exists and nothing more.
WHAT A PERSON CAN DO: The diner half is real and I watched it on the journey's OWN restaurant. Sitting at table 9945 and swiping to Mains, the course is not one flat list: there is a sub-category rail at the top reading 'SIDES 1 MORE 2' with two tappable jump pills (m2-subcat-nav, m2-subcat-jump-Sides, m2-subcat-jump-more), and the menu below is split by real dividers with headings and counts - 'Sides / 1 dish' over Canary Fries, then 'More / 2 dishes' over the entrees. The control restaurant renders the same way.
WHERE IT STOPS: The owner half. https://owner.dev.qrate-ai.com/owner/menu/?restaurantId=1953946f-... renders 'Failed to load menu - please try again' and Retry changes nothing; /owner/food-items/ for the same restaurant is a single red line, 'Failed to fetch menu-item summaries for 1953946f-3a27-5415-8249-a64a19bf5ae4'. So steps 1-3 (create two dishes, attach them to a menu, file two sub-categories) cannot be done by a person at all on this restaurant.
NOT PROVEN (never graded): That the dividers I saw ARE the journey's own two sub-categories. What renders at rest is the course's baseline grouping (Sides vs More). The journey's provisioned sub-categories are not present between runs, and I could not create them because the owner screens error out.
SURFACE DRIVEN: PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=1953946f-...&table=9945&layout=mosaic_v2 as a guest (iPhone 14 Pro geometry on chromium) + control id=28ae37ab-... table 9946; OWNER https://owner.dev.qrate-ai.com/owner/menu/ + /owner/food-items/ for the same restaurant as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only. Two guest table sessions opened (9945, 9946); nothing ordered, nothing changed. what I saw · trace.zip · owner video · patron video · report | STR-1207 |
| W-046 | mosaic_v2-grouping-dietary | 11 | OWPAWA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING BEING WALKED NOW on Farm + Oak, because our owner login cannot reach the Canary restaurants. This proves the FEATURE works for a real owner - it does NOT verify the canary's own fixture. Nothing about grouping dishes by diet is known here, because the restaurant it uses has no owner to set it up as.
Couldn’t check All eleven steps. the long versionNot walked. Of 11 steps, 6 are OWNER/CANARY provisioning (create the dish, set the tag, publish the menu) and only 5 are patron-observable - and the patron half asserts the owner half's effect, so it cannot be checked without it. I drove this journey's fixture as a guest and captured the live state instead. What that established: The filter drawer exposes exactly ONE dietary chip (m2-dietary-gluten-free) plus served-alcoholic / served-nonAlcoholic, and an apply button reading 'Show 9 dishes'. The dish composition sheet opens for real (m2-composition, m2-dish-hero, m2-dish-price, m2-comp-stepper, composition-add). On a plain side it renders no modifier, spice or includes UI. | |
| W-047 | mosaic_v2-groupings | 10 | OWPAWA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING BEING WALKED NOW on Farm + Oak, because our owner login cannot reach the Canary restaurants. This proves the FEATURE works for a real owner - it does NOT verify the canary's own fixture. Everything this journey promises stays unknown, because the restaurant has no owner to set any of it up.
Couldn’t check All ten steps. Blocked, not failed. the long versionNot walked. Of 10 steps, 5 are OWNER/CANARY provisioning (create the dish, set the tag, publish the menu) and only 5 are patron-observable - and the patron half asserts the owner half's effect, so it cannot be checked without it. I drove this journey's fixture as a guest and captured the live state instead. What that established: The dish composition sheet opens for real (m2-composition, m2-dish-hero, m2-dish-price, m2-comp-stepper, composition-add). On a plain side it renders no modifier, spice or includes UI. | |
| W-048 | mosaic_v2-includes | 10 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING BEING WALKED NOW on Farm + Oak, because our owner login cannot reach the Canary restaurants. This proves the FEATURE works for a real owner - it does NOT verify the canary's own fixture. All ten steps stay unknown — nothing about what a dish includes has been seen from a diner's side.
Couldn’t check All ten steps. the long versionNot walked. Of 10 steps, 5 are OWNER/CANARY provisioning (create the dish, set the tag, publish the menu) and only 5 are patron-observable - and the patron half asserts the owner half's effect, so it cannot be checked without it. I drove this journey's fixture as a guest and captured the live state instead. What that established: The dish composition sheet opens for real (m2-composition, m2-dish-hero, m2-dish-price, m2-comp-stepper, composition-add). On a plain side it renders no modifier, spice or includes UI. | |
| W-050 | mosaic_v2-lifestyle-filter | 4 | OWPA | PASSED | DEFERRED D3 | D3 WON'T MUTATE LIVE DATA Chip never renders in the stable state; proving it works needs an owner mutation I will not make on a canary fixture. The lifestyle tag exists for about three seconds a run and is invisible the rest of the time, so nobody can see it working. Filtering itself does work on the tags that stay put.
Couldn’t check Whether a custom lifestyle tag actually reaches a diner. Seeing it at rest would mean creating such a dish myself on a live restaurant mid-run, which would hand the builder a false red. the long versionAll three of these journeys run against ONE shared restaurant - Canary Mosaic 28ae37ab - not their own fixtures. The board shows m2lf-04-tiles-filtered PASSING. Driving the product: I opened the filter drawer on ALL FOUR courses and there is NO Jain option anywhere - not by testid, not by label. Owner side corroborates: the Dietary tab row for the custom tag reads 'jain | Custom | 0' - zero items carry it. The canary creates a tagged dish, asserts, and tears down inside about 5 seconds (m2cd) / 3 seconds (m2lf). So the green is true only inside a window no person can reach. I am NOT calling this a false green: provision-assert-teardown is legitimate test design. The finding is that no DURABLE evidence exists that a custom dietary tag reaches a diner, and that the shared fixture churns while other journeys assert counts against it. | STR-1200 |
| W-051 | mosaic_v2-menu-parity | 6 | OWPA | PASSED | Partial green | Add-ons stay add-ons — none of the 6 leaked onto the diner's menu as an orderable dish. The wrong-course half I could not check without creating a dish on a live menu.
Couldn’t check Whether a dish filed under the wrong course really does show under the wrong heading. And whether the app actually refuses to put an add-on on a menu — I only saw that none was there, not the refusal happening. Left behind I changed nothing; one guest session was opened on table 9951. Worth flagging for the operator: this restaurant is carrying debris from earlier sessions that is not mine — 6 add-ons named UAT-modlink-optA/optB-* and a dish called 'UAT-clone-453377' that is live on the diner's Starters course. the long versionPARTIAL GREEN - the half that matters to a diner is confirmed from both sides. The owner lists 6 add-ons for this restaurant; all four diner courses were walked (9 / 2 / 3 / 1 dishes) and not one add-on leaked onto the menu as its own orderable tile. Steps 1-3 need a dish filed with a deliberately mismatched course, which is provisioning I will not do on a live canary menu, so the cross-course pill behaviour is unproven and ungraded.
WHAT A PERSON CAN DO: The add-on half of the promise (steps 4-6) checks out from both sides without anyone provisioning anything. As the owner I listed the restaurant's 6 add-ons (all UAT-modlink-optA/optB-*, $2.50 each, all 'Visible'). As a diner I then walked ALL FOUR courses and wrote down every dish on the menu - Drinks 9, Starters 2, Mains 3, Desserts 1 - and not one of the 6 add-ons is sitting there as a tile of its own. An add-on stays an add-on.
WHERE IT STOPS: Steps 1-3. To see 'a dish whose canonical course is Entrees appearing under an Appetizers sub-category pill, and NOT under Entrees' I would have to file such a dish first, and I will not create menu objects on a live canary fixture mid-run. Separately, on the last course I walked (Desserts, 1 dish) there are no sub-category pills at all, so there was nothing there to check a dish against.
NOT PROVEN (never graded): Steps 1-3 entirely - the dish-under-the-wrong-canonical-course case, and the owner-vs-diner structure comparison. Also unproven: that attaching an add-on to a menu is REJECTED (step 4's ADDON_CANNOT_BE_ON_MENU) - I only observed the outcome, that no add-on is on the diner's menu, not the rejection itself.
SURFACE DRIVEN: OWNER https://owner.dev.qrate-ai.com/owner/food-items/?restaurantId=28ae37ab-... as canaryOwner (Desktop Chrome) + PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=28ae37ab-...&table=9951&layout=mosaic_v2 as a guest (iPhone 14 Pro geometry on chromium)
STATE LEFT BEHIND: none - read only. One guest table session opened (9951); nothing ordered, nothing changed. NOTE for the operator: this fixture is carrying UAT debris from earlier sessions that is NOT mine - 6 add-ons named UAT-modlink-optA/optB-* and a dish 'UAT-clone-453377' that is live on the diner's Starters course. what I saw · trace.zip · owner video · patron video · report | STR-1208 |
| W-052 | mosaic_v2-menu-selector | 10 | OWPAWA | PASSED | Partial green | A diner has no way to pick between menus, and that turns out to be deliberate: a weekly schedule decides which single menu is live. The observation was right; the conclusion drawn from it would have been wrong.
Couldn’t check Steps 4 to 10. Getting one menu live and then the other on demand means editing a live schedule, which is setting things up rather than testing them. I placed no orders, so I never reached the last step — the waiter's tag showing which menu an order came from — and I make no claim about it. One caveat worth weighing: the automated run may be picking the menu through the server rather than through anything on screen. If so the promise holds, and what I've found is a capability with no human surface — a missing screen rather than a broken one. Left behind An open guest session on table 9952. Nothing else — read only, no order placed. the long versionPARTIAL GREEN - and this row is where I overturned my own lane. The lane recommended FALSE_GREEN on the grounds that a diner has no way to choose between two live menus, and my own verification step confirmed the observation: not one of this restaurant's five menu names appears anywhere on the diner's screen, and the only menu-named control holds the courses. Both readings were TRUE and both were answering the wrong question. Opening the owner's Menu page shows a SCHEDULE card - 'Canary Default Menu live now, ends in 50m', a MON-SUN strip, and the controls weekly-schedule-card / weekly-schedule-live-menu-name / weekly-schedule-now-line / weekly-schedule-ends-in. Menus are scoped by a WEEKLY SCHEDULE. The clock chooses which menu is live; the diner is not supposed to. And '25 menus ACTIVE' means 25 ENABLED, not 25 live at once - exactly one is live at a time. So the absent chooser is the design, not a defect, and no ticket was filed. What IS confirmed: the owner side is real - 27 menus listed, both of this journey's own menus (M2MS MenuA and M2MS MenuB) present and enabled. What is NOT walked: steps 5-9 need Menu A live, then Menu B live. Reaching that on demand means editing the weekly schedule of a live canary menu, which is provisioning, not acceptance. Step 10 (the waiter's source-menu chip) needs two placed orders and is unreached and ungraded.
WHAT A PERSON CAN DO: As the OWNER, plenty: the Menu page for Canary Mosaic lists 27 menus, 25 of them ACTIVE at the same time, and both of this journey's own menus (M2MS MenuA and M2MS MenuB) are among the active ones. So the two-menus-at-once state this journey creates really is there.
WHERE IT STOPS: On the diner's screen there is NO WAY TO CHOOSE A MENU. I sat at table 9952 on mosaic_v2 with 25 menus live and searched the screen for anything that picks one: the only control whose name even suggests a menu is `m2-menu-slide-host`, and reading it shows it holds the COURSES and dishes (Drinks/Starters/Mains/Desserts, 'BEVERAGES 1 MORE 8', Canary Iced Tea...), not a list of menus. I swiped it right-to-left the way a thumb would; the sub-category rail read 'BEVERAGES 1 MORE 8' before and 'BEVERAGES 1 MORE 8' after — nothing changed, 9 tiles before and after. There is no menu tab strip, no dropdown, no chip row. If a diner cannot choose Menu A over Menu B, steps 6-9 of this journey ('Menu A -> Only A Sub-cats', 'Menu B -> Only B Sub-cats', 'Order on Menu A', 'Order on Menu B') are not things a person can do.
NOT PROVEN (never graded): Steps 4-10. In particular I did NOT place the two orders, so I never reached step 10 (the waiter's source-menu chip A vs B) and I make no claim about it. CAVEAT the orchestrator should weigh: the board labels steps 6-9 'PATRON', but the canary may be selecting the menu through the diner API (a menuId parameter) rather than through a control on the screen. If so the contract holds and what I have found is that the capability has no human surface — which is still the thing this audit exists to catch, but it is a missing-UI finding rather than a broken-UI one.
SURFACE DRIVEN: PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=28ae37ab-...&table=9952&layout=mosaic_v2 as a guest (iPhone 14 Pro geometry on chromium) + OWNER https://owner.dev.qrate-ai.com/owner/menu/?restaurantId=28ae37ab-... as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only, no order placed. One guest table session opened (9952). what I saw · trace.zip · owner video · patron video · owner video · report | STR-1208 |
| W-053 | mosaic_v2-modifier-pricing | 10 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING None of the ten steps was graded, so whether switching modifier pricing off changes what a diner sees and pays is unknown.
Couldn’t check Every step. The owner's pricing switch itself is real and reachable, and the one group that exists has pricing on; I read it and did not flip it. Left behind Nothing. Read only — no dish I opened was ever added to a cart. the long versionDEFERRED D2. grouping-pricing-toggle is real and reachable, and the existing grouping reads 'Pricing on'. But with no dish exposing any modifier to a diner, the visible effect this journey asserts has no subject.
WHAT A PERSON CAN DO: The owner control this journey turns on and off is real and reachable: `grouping-pricing-toggle-<id>` sits on the Modifiers tab beside a label, and the grouping already on Canary Caesar Salad reads 'Pricing on'. I read its state and did not flip it.
WHERE IT STOPS: Steps 5-9 are PATRON steps needing a priced modifier OPTION to be shown, then hidden, then selected and ordered. No dish on any fixture shows a modifier option at all, priced or not, so there is nothing whose price could be shown or hidden. Step 9 also places a real order and step 10 checks the charge - I place no orders on a live fixture beyond what a walk needs.
NOT PROVEN (never graded): Every step. Recon, done first and recorded in three read-only walks: I toured every course on five candidate canary fixtures (Spice Mod, Includes, Groupings, Grouping Dietary, Mosaic V2 Dining) and opened every dish on every one of them. The persistent menu is identical on all five: 1 drink (9 on Dining), Canary Caesar Salad, Canary Fries, Canary Grilled Chicken, Canary Margherita, Canary Tiramisu - every one of them described 'DO NOT MODIFY', and every one opening to the same fifteen controls: hero photo, price, an 'Anything else?' note box, a quantity stepper and Add to order. Nothing else. No spice picker, no modifier group, no sides section, no build-your-own, no variant switcher, on any dish, on any fixture.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=<each fixture>&table=9944 as a guest diner (iPhone 14 Pro descriptor on chromium) + https://owner.dev.qrate-ai.com/owner/food-items/ as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only. No dish opened was ever added to a cart in these recon walks. what I saw · trace.zip · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Spice-Mod video · diner video · owner video · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Mosaic video · diner-Canary-Spice-Mod video · owner video · report | STR-1207 |
| W-055 | mosaic_v2-overlap-variants | 10 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING Whether two overlapping menus price the same dish differently, and whether a diner sees the right one, stays completely unknown.
Couldn’t check Every step of it. Left behind Nothing — read only, and nothing I opened was ever added to a basket. the long versionDEFERRED D2 - and the capability does have a screen: the Placements tab carries a per-menu PRICE on each menu row, which is the mechanism this journey is about. What is missing is a second menu to overlap with.
WHAT A PERSON CAN DO: The per-menu price this journey is built on has a screen: the dish editor's Placements tab carries one row per menu with `placements-tab-price-<menuId>`, plus boost, portion type and chef's special. So an owner really can price the same dish differently on two menus.
WHERE IT STOPS: Canary Mosaic V2 Dining has exactly ONE menu - 'Canary Default Menu', 14 items, active all day - so there is no overlap, no lunch/dinner pair, no variant switcher and nothing for steps 5-10 to render. Steps 2-4 assert API contracts and have no screen.
NOT PROVEN (never graded): Every step. Recon, done first and recorded in three read-only walks: I toured every course on five candidate canary fixtures (Spice Mod, Includes, Groupings, Grouping Dietary, Mosaic V2 Dining) and opened every dish on every one of them. The persistent menu is identical on all five: 1 drink (9 on Dining), Canary Caesar Salad, Canary Fries, Canary Grilled Chicken, Canary Margherita, Canary Tiramisu - every one of them described 'DO NOT MODIFY', and every one opening to the same fifteen controls: hero photo, price, an 'Anything else?' note box, a quantity stepper and Add to order. Nothing else. No spice picker, no modifier group, no sides section, no build-your-own, no variant switcher, on any dish, on any fixture.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=<each fixture>&table=9944 as a guest diner (iPhone 14 Pro descriptor on chromium) + https://owner.dev.qrate-ai.com/owner/food-items/ as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only. No dish opened was ever added to a cart in these recon walks. what I saw · trace.zip · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Spice-Mod video · diner video · owner video · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Mosaic video · diner-Canary-Spice-Mod video · owner video · report | STR-1207 |
| W-056 | mosaic_v2-owner-hide | 6 | OWPA | PASSED | Honest green | The best thing I saw all day. The owner hides a dish and within a minute it disappears from the diner's phone on its own — and the app volunteers an apology for it. Green, and honestly so.
Couldn’t check One caveat on the last step: I saw no order button with an empty cart, because the product had already taken the hidden line out. So what I proved is that a hidden dish can't be ordered because it is removed and the diner is told — not that an order button appears and sits disabled. Left behind Nothing — put back. The dish's visibility was switched off and then on again, and the owner's row reads visible once more. The one cart line I added on table 9934 was removed by the product itself; no order was placed. the long versionHONEST GREEN - the board says a person can do this and a person can, watched end to end on video. The owner hid Canary Grilled Chicken in Food Items; the row flipped to Hidden; on a phone at table 9934 with that dish already in the cart the tile disappeared BY ITSELF within 60 seconds (3 tiles -> 2, the sibling untouched) and the app volunteered a modal the diner did not ask for: 'ITEMS NO LONGER AVAILABLE - Canary Grilled Chicken has been removed from your cart', with two alternatives and a Got it. That is the whole journey, including the part that is easy to get wrong: it told the diner rather than letting them discover an empty cart at the till. Item restored to Visible.
WHAT A PERSON CAN DO: All of it, and it is the best thing I have seen today. As the owner I opened Food Items on Canary Mosaic, found 'Canary Grilled Chicken' (row read 'Visible'), and pressed its visibility control - the row flipped to 'Hidden'. As the diner on an iPhone at table 9934 I had that exact dish in my cart ('1 ITEM'). Within 60 seconds, WITHOUT touching my phone, the tile disappeared (3 tiles -> 2), its sibling 'Canary Fries' stayed put, and a modal appeared on its own reading 'ITEMS NO LONGER AVAILABLE - Canary Grilled Chicken has been removed from your cart' with two 'YOU MIGHT ENJOY' alternatives and a 'Got it' button. The dish was gone from the cart, so there was nothing left to place an order for.
WHERE IT STOPS: nowhere - walked end to end
NOT PROVEN (never graded): Nothing in the journey's own step list. One caveat on step 6: I observed 'no Place Order' with an EMPTY cart (the product had already removed the hidden line), so what I proved is that the hidden dish cannot be ordered BECAUSE it is taken out of the cart and the diner is told - not that a Place Order button appears and is disabled.
SURFACE DRIVEN: OWNER https://owner.dev.qrate-ai.com/owner/food-items/?restaurantId=28ae37ab-... as canaryOwner (Desktop Chrome) + PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=28ae37ab-...&table=9934&layout=mosaic_v2 as a guest diner (iPhone 14 Pro geometry on chromium - not real iOS WebKit)
STATE LEFT BEHIND: RESTORED. 'Canary Grilled Chicken' visibility was switched OFF then back ON; the owner row was re-read and reads 'Visible' again (screenshot owner/07-restored.png). One cart line was added on table 9934 and was removed by the product itself when the dish was hidden; no order was placed. what I saw · trace.zip · owner video · patron video · report | |
| W-057 | mosaic_v2-payments-config | 5 | OWPA | PASSED | Partial green | The owner is told card payments are off while a diner on the same restaurant is offered to pay by card — and the owner has neither a route to that page nor any control on it.
Couldn’t check Which of the two readings is wrong. Settling it means actually pressing the pay control, and these are live payment merchants. The other four steps have no screen at all and were not graded. I also did not touch the kill switch: flipping it on a shared restaurant would hand the next run a false red. Left behind Nothing. Nothing saved, nothing switched, nothing paid, and no table session opened. the long versionPARTIAL GREEN - one step readable, and reading it produced the sharpest contradiction of the wave. The owner's payments page for THIS fixture says, verbatim, 'In-app card payments aren't enabled for this restaurant yet' - while my own earlier walk on the SAME fixture (W-043, tables 9971 and 9972) reached the diner's fork 'Pay now on my phone - Apple Pay, Google Pay or card'. Two surfaces, one restaurant, opposite answers, two independent walks. I did NOT settle which side is wrong: settling it means pressing the pay control and these fixtures are live Stripe merchants on dev. Filed as STR-1210 with both readings. Also on that ticket: there is NO sidebar route to the payments page for a mosaic_v2 restaurant (a micro kitchen's sidebar has one), and once you type the address there is no control on the page at all - so step 2's 'accepted-methods roundtrip', labelled OWNER, is not something an owner can perform anywhere. Steps 3-5 are API assertions (409 guards, client_secret) with no screen and are not graded. NOTE ON MY OWN CHECK: my verification pass first reported 'the page does NOT say payments are off' - my match used an ASCII apostrophe and the page renders a typographic one. The captured verbatim in the same step showed the sentence plainly. The lane was right and my check was wrong.
WHAT A PERSON CAN DO: Only one of the five steps has a screen. Step 1 (owner baseline) is readable: /owner/settings/payments/ answers 200, the header follows the restaurant I chose, and for Canary Mosaic V2 Electronic Pay it says in one sentence 'In-app card payments aren't enabled for this restaurant yet.' The page is restaurant-aware, not a stub - the same page on Canary Micro Kitchen instead reads 'UPI payment. UPI is available for kitchens priced in Rs INR. This kitchen is set to USD. Change the currency first...'. Steps 2-5 are API assertions (an accepted-methods round-trip with a 409 guard, a summary flag, a Stripe intent 409, a client_secret) with no user surface at all.
WHERE IT STOPS: Step 2, the accepted-methods round-trip. There is NO control on the payments page to turn payments on or to choose which methods are accepted - the page is one sentence, the sidebar, and one empty submit element. And the page is unreachable anyway: this restaurant's sidebar offers only Home, Food Items, Menu, Tables/Staff, Personalize, Insights. There is no Payments entry, so an owner is never shown a route to it. (A micro kitchen's sidebar DOES carry Payments and Collection, so the route exists for one restaurant type and not the other.)
NOT PROVEN (never graded): Steps 2, 3, 4, 5 - all API contract, no screen. NOT graded. I did not toggle the kill switch: these are live Stripe merchants on dev and a toggle on a shared fixture would also give the next canary run a false red.
SURFACE DRIVEN: OWNER https://owner.dev.qrate-ai.com/owner/settings/payments/ as canary-owner-dev@ (Desktop Chrome), read-only, across four canary restaurants
STATE LEFT BEHIND: none - nothing saved, nothing toggled, nothing paid, no table session opened. what I saw · trace.zip · owner video · report | STR-1210 |
| W-060 | mosaic_v2-place-order-chaos | 10 | CAOWPA | PASSED | Partial green | Ordering works here today. The half of this journey about deliberately breaking it isn't something a person can do — it's a test hook, not a feature.
Couldn’t check What a diner is told when an order actually fails. I never saw the failure screen, so I can't say whether it's clear, or whether a lost confirmation quietly orders twice. Left behind Table 9953: my guest session is still open, with two cancelled orders on it (both mine). the long versionPARTIAL GREEN - the fixture is healthy and the chaos half has no surface. A real diner CAN order on this fixture right now: POST /diner/orders returned 201 and the badge read ORDERED, so it is not sitting in a failed state. The three OWNER chaos-injection steps have no product surface at all - there is no chaos switch. NOTE ON A NEAR-MISS the lane caught itself: a keyword sweep appeared to find 'Chaos' and 'fault' on every screen. Checked in context before reporting - 'Chaos' is the restaurant's OWN NAME and 'fault' is the tail of 'Canary Default Menu'. A page-wide substring would have produced a confident false finding.
WHAT A PERSON CAN DO: A real diner CAN order here right now. On table 9953 I saw 9 drinks / 1 starter / 3 mains / 1 dessert, added a Canary Cola, pressed 'Place order $3.50' and it went through - the server answered 201 on /diner/orders and the Ordered tab read ORDERED, $3.50. That is step 3 walked and it is also the substance of step 7 ('Order Succeeds After Clear'): this fixture is not left sitting in a failing state between canary runs, which was the thing most worth checking.
WHERE IT STOPS: Steps 4, 6 and 8 - the OWNER turning fault injection on and off. There is no such control in the product. I walked all eight owner pages for this restaurant (its whole sidebar plus /owner/settings/pos/ and /owner/settings/payments/) and none carries anything chaos-shaped. My first sweep appeared to find 'Chaos' and 'fault' everywhere; I checked the context of every match before reporting it and both are innocent - 'Chaos' is the restaurant's own NAME in the header, and 'fault' is 'Canary Default Menu'. Verified in the w060-word-check walk. So the three OWNER steps are a test hook, not a capability.
NOT PROVEN (never graded): Steps 1 and 2 (raw-websocket frame shapes - no screen at all), 4, 5, 6, 8, 9, 10. NOT graded. In particular I never saw the failure UI, so I cannot say whether a diner is told clearly when an order fails, nor whether a lost acknowledgement really recovers without duplicating.
SURFACE DRIVEN: PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=5b677676...&table=9953 as an anonymous guest (iPhone 14 Pro on chromium) + OWNER https://owner.dev.qrate-ai.com as canary-owner-dev@ (Desktop Chrome), read-only
STATE LEFT BEHIND: I cancelled my own dish - the ledger reads CANCELLED, 0 cancel controls left. Canary Mosaic V2 Place Order Chaos table 9953 is left with an open guest session and one cancelled order; no owner screen can close a table session (see W-032). NOTE: this walk was driven TWICE - the first run's trace was destroyed by a later run in this lane's shared outputDir, so it was re-driven to regenerate it. Both runs gave the identical result. That means table 9953 carries TWO cancelled orders, not one. what I saw · trace.zip · owner video · patron video · report | STR-1211 |
| W-061 | mosaic_v2-recommendations | 11 | OWPA | PASSED | DEFERRED D3 | D3 WON'T MUTATE LIVE DATA All five diner steps stay unknown, because there is no recommendation on this menu to act on.
Couldn’t check Whether recommendations appear at all, and whether adding one makes its own separate cart line. Left behind An idle guest session on table 9944. the long versionDEFERRED D3 - and the walkable half was walked honestly first. I opened EVERY ONE of the 15 dishes on Canary Mosaic - dev. Not one shows a pairing, an add-on or a 'pairs well with'. That is not filed as a defect, because this journey's pairings are provisioned by the canary and are not expected to be sitting there between runs. OPEN QUESTION passed to the builder rather than filed: every dish's owner-side Pairings tab carries a grouping row ('Dishes recommended alongside this one') while the diner sees no pairing anywhere. From outside I cannot tell whether those groupings have members. One grep by someone with the source settles it.
WHAT A PERSON CAN DO: Open any dish: the composition sheet opens properly (m2-composition, dish hero, price, quantity stepper, add). I opened EVERY dish this restaurant offers - all 15 across Beverages(9)/Appetizers(2)/Entrees(3)/Desserts(1) - and not one of them shows a recommendation, a pairing, an add-on or any 'pairs well with' wording. So there is nothing on this menu for the journey's render/add/separate-cart-line promises to act on.
WHERE IT STOPS: Six of the eleven steps are the canary creating its own throwaway parent + pairing dishes over the API and attaching a recommendation. Producing that state myself means creating menu objects on a live canary fixture that runs this journey hourly - a mutation I will not make. Without it there is no recommendation to render, so steps 6-11 cannot be reached from outside.
NOT PROVEN (never graded): All five patron steps (Await Propagation, Open Composition, Recommendations Render, Add Pairing -> Separate Cart Line, Add-on Card Renders) - I reached the composition sheet but there was no recommendation on it to exercise. Not graded.
SURFACE DRIVEN: dcgmji73h6qel.cloudfront.net/menu?id=28ae37ab...&table=9944&layout=mosaic_v2 as a guest on iPhone 14 Pro/chromium; owner.dev.qrate-ai.com as the canary OWNER on Desktop Chrome
STATE LEFT BEHIND: none - I created nothing and ordered nothing. An idle guest session remains on test table 9944. what I saw · trace.zip · owner video · patron video · report | STR-1213 |
| W-066 | mosaic_v2-sides-coexistence | 8 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING None of the eight steps was graded, so whether the two kinds of options coexist properly for a diner is unknown.
Couldn’t check Every step. Both owner-side pieces are visible and were read — the choose-one rule and a sides section in the menu builder; only the combination is missing. Left behind Nothing. Read only — no dish I opened was ever added to a cart. the long versionDEFERRED D2. Both halves of the owner mechanism are visible - a choose-one rule on the Modifiers tab and a Sides subcategory in the Menu builder - but no dish combines them, so the diner-facing behaviour has no subject.
WHAT A PERSON CAN DO: The pieces have owner screens: the Modifiers tab's rule dropdown is where a min=1/max=1 choose-one grouping is set, and the Menu builder shows a Sides subcategory chip under Entrees.
WHERE IT STOPS: Steps 5-8 need a main carrying BOTH a food-item grouping AND a per-menu Choose-One sides list, so a diner can see the two sections coexist and find Add gated until they pick. The only dish in Sides here is Canary Fries, which opens as a plain dish; no dish anywhere shows a sides section, so there is no coexistence to witness and no gated Add CTA to press.
NOT PROVEN (never graded): Every step. Recon, done first and recorded in three read-only walks: I toured every course on five candidate canary fixtures (Spice Mod, Includes, Groupings, Grouping Dietary, Mosaic V2 Dining) and opened every dish on every one of them. The persistent menu is identical on all five: 1 drink (9 on Dining), Canary Caesar Salad, Canary Fries, Canary Grilled Chicken, Canary Margherita, Canary Tiramisu - every one of them described 'DO NOT MODIFY', and every one opening to the same fifteen controls: hero photo, price, an 'Anything else?' note box, a quantity stepper and Add to order. Nothing else. No spice picker, no modifier group, no sides section, no build-your-own, no variant switcher, on any dish, on any fixture.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=<each fixture>&table=9944 as a guest diner (iPhone 14 Pro descriptor on chromium) + https://owner.dev.qrate-ai.com/owner/food-items/ as canaryOwner (Desktop Chrome)
STATE LEFT BEHIND: none - read only. No dish opened was ever added to a cart in these recon walks. what I saw · trace.zip · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Spice-Mod video · diner video · owner video · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Mosaic video · diner-Canary-Spice-Mod video · owner video · report | STR-1207 |
| W-067 | mosaic_v2-spice-cart-dedup | 4 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING Whether two spice levels of the same dish make two separate basket lines stays entirely unknown, because no dish anywhere has a spice choice to make.
Couldn’t check Steps 1, 2 and 4 - everything about spice levels. The one step I could reach did hold, and chasing it is what turned up the tile-doubling fault now filed as STR-1212. Left behind Nothing - I emptied the basket I built and checked table 9947 was left empty. No order was ever placed. the long versionDEFERRED D2, with step 3 watched and holding. Step 3's rule - 'reopening via the tile is a FRESH add' - held the first time and was observed: order at 2, tile opened at 1 offering 'Add to order ($8.99)', pressed, order 3. SEAM WORTH KEEPING: that rule stops holding once a diner has opened the dish from their ORDER first. This journey walks only the clean path, so its green is not a lie about what it tests - it simply never visits the edit door. Filed separately once verified first-hand.
WHAT A PERSON CAN DO: Step 3's rule - 'reopening a dish from its tile is a FRESH add' - holds the first time and I watched it: my order held 2 salads, I tapped the tile, the sheet opened at 1 offering 'Add to order ($8.99)', I pressed it and my order became 3 / $26.97. Correct.
WHERE IT STOPS: Steps 1, 2 and 4 need a dish with a spice scale so the same dish can go in at two spice levels and produce two distinct cart lines. No dish on any of the five fixtures offers a spice choice, so there is nothing to add at Spice Level 0 and no second line to make.
NOT PROVEN (never graded): Steps 1, 2 and 4. Recon, done first and recorded in three read-only walks: I toured every course on five candidate canary fixtures (Spice Mod, Includes, Groupings, Grouping Dietary, Mosaic V2 Dining) and opened every dish on every one of them. The persistent menu is identical on all five: 1 drink (9 on Dining), Canary Caesar Salad, Canary Fries, Canary Grilled Chicken, Canary Margherita, Canary Tiramisu - every one of them described 'DO NOT MODIFY', and every one opening to the same fifteen controls: hero photo, price, an 'Anything else?' note box, a quantity stepper and Add to order. Nothing else. No spice picker, no modifier group, no sides section, no build-your-own, no variant switcher, on any dish, on any fixture.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=f469b191-ec79-585d-916a-e6c497617eb8&table=9947&layout=mosaic_v2 - guest diner, iPhone 14 Pro descriptor on chromium (NOT real iOS WebKit)
STATE LEFT BEHIND: Emptied the unplaced order I built; table 9947 verified empty (no m2-dec- control left on the tile). No order was ever placed.
SEAM CONFIRMED FIRST-HAND AND FILED AS STR-1212 (P0/Highest). I re-drove it myself on my own table 9968 with the ORDER TOTAL as the oracle rather than the button label. Control passed - press 1 gave $8.99, press 2 gave $17.98, so the harness was really driving. Then: opened the salad from the ORDER LINE (edit door, pre-filled at 2, correct), backed out touching nothing, tapped the TILE again - and it opened at 2, not 1, still offering 'Add to order ($17.98)'. Pressed unchanged: $17.98 -> $35.96, still ONE cart line. The pre-filled quantity leaks onto the tile door while the tile door keeps ADD semantics. My FIRST attempt reported 'does not reproduce' - a false refutation caused by a locator that never found the tile, exposed only because the control total never moved off $8.99. The control is now a hard gate in that spec. what I saw · trace.zip · diner video · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Spice-Mod video · diner video · owner video · diner-Canary-Grouping-Dietary video · diner-Canary-Groupings video · diner-Canary-Includes video · diner-Canary-Mosaic-V2-Dining video · diner-Canary-Mosaic video · diner-Canary-Spice-Mod video · owner video · report | STR-1212 |
| W-068 | mosaic_v2-spice-mod | 4 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING BEING WALKED NOW on Farm + Oak, because our owner login cannot reach the Canary restaurants. This proves the FEATURE works for a real owner - it does NOT verify the canary's own fixture. Whether an owner's spice or option setting ever reaches the diner stays unknown, because there is no owner to set it.
Couldn’t check All four steps. Blocked, not failed. the long versionNot walked. Of 4 steps, 1 are OWNER/CANARY provisioning (create the dish, set the tag, publish the menu) and only 3 are patron-observable - and the patron half asserts the owner half's effect, so it cannot be checked without it. I drove this journey's fixture as a guest and captured the live state instead. What that established: The dish composition sheet opens for real (m2-composition, m2-dish-hero, m2-dish-price, m2-comp-stepper, composition-add). On a plain side it renders no modifier, spice or includes UI. | |
| W-072 | mosaic_v2-subcat-order | 11 | OWPA | PASSED | Partial green | The owner really can manage sub-categories and a diner really does see them in an order. But the reordering cannot be tested here: every course has only one sub-category, so there is nothing to drag past.
Couldn’t check The reordering itself and everything built on it — I never saw sub-categories put into a new order, never drove the two-menus-at-once precedence flip or the switcher tiles meant to show it, and never saw a diner's menu change after an owner drag. The order I wrote down is just the restaurant's normal one. Left behind Nothing changed — nothing renamed, deleted, hidden, created or dragged. One guest session was opened on table 9972 and nothing was ordered. the long versionPARTIAL GREEN - and the owner UI here is richer than the journey's API-only steps suggest. Per-course sub-category rows exist with rename, delete, toggle, item count and drop targets, plus a create-and-add control, and 5 draggable elements. What cannot be walked is the reorder itself: every course on this restaurant has exactly ONE named sub-category plus __ungrouped__, so there is no second row to drag past, and no drag-handle testid to grab. Creating a second sub-category on a live canary menu to manufacture the case is provisioning, not acceptance, and I will not do it.
WHAT A PERSON CAN DO: More than I expected. The owner's Menu builder DOES give a person real sub-category rows, not just an Add button: with every course bucket expanded I can see, per course, a named sub-category row carrying rename, delete, visibility-toggle, item-count and a drop target — subcategory-rename-Entrees-Sides, subcategory-delete-Entrees-Sides, subcategory-toggle-Entrees-Sides, subcategory-drop-Entrees-Sides, subcategory-count-Entrees-Sides — plus the same set for Appetizers, Beverages and Desserts, an __ungrouped__ bucket each, and subcategory-create-add-<course> to make a new one. Five elements on the page are genuinely draggable. On the diner side the rail has a real order I can read: Drinks shows 'BEVERAGES 1 / MORE 8' and Mains shows 'SIDES 1 / MORE 2', each with tappable jump pills.
WHERE IT STOPS: Step 10 — 'drag-reorder a sub-category row'. Each course on this restaurant has exactly ONE named sub-category plus an __ungrouped__ bucket, so within a course there is no second row to drag the first one past. To drive the drag I would have to create sub-categories on a live canary menu, and I will not mutate a fixture whose journeys are running every ~20 minutes. There is also no drag-handle testid — only `[draggable=true]` elements and `subcategory-drop-*` targets — so the affordance is not labelled for a person or a test.
NOT PROVEN (never graded): Steps 1-9 and 11. I never saw sub-categories A/B/C, never saw them reordered to C,A,B, never drove the two-live-menus precedence flip (P<Q then Q<P) or the switcher tiles that are supposed to show it, and never saw the diner reflect an owner drag. The rail order I recorded is the fixture's baseline, not this journey's provisioned order.
SURFACE DRIVEN: OWNER https://owner.dev.qrate-ai.com/owner/menu/?restaurantId=28ae37ab-... as canaryOwner (Desktop Chrome, all course buckets expanded) + PATRON https://dcgmji73h6qel.cloudfront.net/menu?id=28ae37ab-...&table=9972&layout=mosaic_v2 as a guest (iPhone 14 Pro geometry on chromium)
STATE LEFT BEHIND: none - read only. No sub-category was created, renamed, deleted, toggled or dragged. One guest table session opened (9972); nothing ordered. what I saw · trace.zip · owner video · patron video · report | STR-1208 |
| W-075 | namespaced-subcategory | 13 | CAOWPA | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. Nothing here is visible to a person, so whether the screen behind it is reachable at all stays unknown.
Couldn’t check All thirteen steps. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-077 | owner-menu | 14 | OWPA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING BEING WALKED NOW on Farm + Oak, because our owner login cannot reach the Canary restaurants. This proves the FEATURE works for a real owner - it does NOT verify the canary's own fixture. Thirteen of the fourteen steps stay unknown, and the one accusation made about this row was wrong and has been withdrawn.
Couldn’t check Steps 4-14: create/publish a menu+item+addon+side and the patron seeing them. Mutating Canary Kitchen mid-cycle would corrupt the fixture every other hourly canary journey in this ledger depends on. the long versionreached login, verified restaurant, and Menu Mgmt cleanly; stopped before any create/publish mutation on a shared hourly canary fixture (steps 4-14 unproven) what I saw · trace.zip · owner video · report | |
| W-078 | owner-menu-bulk-actions | 11 | OW | PASSED | Partial green | Read the panel end to end; proving a bulk mode APPLIES needs a mutation across every dish on a canary fixture. The bulk panel is powerful — thirteen actions across all 22 dishes at once, with a proper delete warning — but the owner's own in-product manual does not mention it at all.
Couldn’t check Whether any of the thirteen modes actually work. I never pressed apply — proving one would change every dish on a shared restaurant. This also needs re-driving against Canary Kitchen. Left behind Nothing. Read only — I selected and read; I pressed nothing that commits. the long versionDrove the food-library bulk panel as the owner, read-only. One click on food-library-table-select-all selects every dish ('22 selected'); food-library-table-bulk-action opens bulk-actions-panel offering THIRTEEN modes - assign, remove, boost, special, availability, spice, spice modifier, spice requirement, dietary, raw category, grouping, remove grouping and DELETE - committed by a single button reading 'Apply to 22 items'. In Delete mode that button reads 'Delete 22 items...' and the panel DOES warn the action cannot be undone, so there is no missing-confirmation defect. The finding is documentation: the rendered App-Doc never uses the word 'bulk' - zero occurrences in 31,812 characters with every tab clicked and every collapsible forced open. Per the project's app-doc-maintenance rule, App-Doc is the owner-app Book of Truth and a capability absent from it is a maintenance defect. I did NOT press bulk-apply, so I cannot say the modes work - only that they are offered. what I saw · trace.zip · owner video · report | STR-1201 |
| W-079 | owner-modifiers-pairings | 8 | OW | PASSED | False red | The board called three owner features broken while an owner can plainly do all three on screen today. It has since flipped itself green.
Couldn’t check Whether the pricing switch stays flipped. Three of the eight steps are about it persisting, and flipping it would have changed a live restaurant mid-run. the long versionCONFIRMED BY ME on the deployed dev owner app at 06:08 UTC, signed in as the canary owner on Canary Mosaic. The board reports this journey PARTIAL, failing omp-02-tab-labels, omp-03-modifiers-scope and omp-04-pairings-scope. All three describe things an owner can plainly see today. Opening Canary Caesar Salad shows five tabs - Dish Properties, Menus (1), MODIFIERS, PAIRINGS, Performance. The Modifiers tab reads 'Configure the buckets and rules diners pick from. The Add-ons default is always present and can be renamed but not deleted.' The Pairings tab reads 'Dishes recommended alongside this one. Pairings are suggestions, not choices - they never change the price of this dish.' A pricing switch reading 'Pricing on' is present on Modifiers and absent on Pairings, which matches what Pairings says about itself. So the red does not describe the owner's experience. One observation, offered as a lead and NOT as a root cause: the dish the canary names, 69f06e43-710d-493b-a553-77d5ccd93bf3, no longer exists - deep-linking to it leaves you on the food library with no editor open. Why the canary is red is EMP-1's to determine; I have no source. Scope: this walk covers 5 of the 8 steps. Steps 6-8 are about the pricing switch PERSISTING, which I did not exercise - flipping it would mutate a canary fixture mid-run.
BOARD NOW AGREES. As of batch d5aadece (2026-09-04 window) this journey reports PASSED. I graded it FALSE_RED - the board called it broken while an owner could plainly do it on screen - and the board has since corrected itself to match what I saw. The FALSE_RED grading stands as the record of the window in which the board was wrong. what I saw · trace.zip · owner video · report | STR-1188 |
| W-080 | patron-record-integrity | 2 | OW | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. Whether anyone could reach this stays unknown, because there is no screen behind it.
Couldn’t check Anything a person would see. This would pass just the same if the screen behind it were unreachable. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-089 | table-session-security | 7 | OWPA | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKABLE BY A PERSON. This journey's steps are direct API calls with no screen behind them, so there is nothing to look at. All seven steps stay unknown from a person's point of view — a green here can't tell you whether the screen behind it is even reachable.
Couldn’t check All seven steps. the long versionCoverage gap - a green here cannot detect an unreachable screen (the STR-928 class). | |
| W-093 | owner-cocktail-bartender | 0 | OW | NO SUCH JOURNEY | — | Not a canary journey - found by driving the product and comparing it to the board. The owner's cocktail bartender page is a crash message and nothing else — and nothing on the board is red, because nothing on the board is looking at it.
Couldn’t check What this page is meant to do. There is nothing on it to try. the long versionThe owner route /owner/cocktail-bartender/ answers HTTP 200, paints the app shell and 6 nav items, and then renders as its entire page body the words 'l is not a function' - a minified JavaScript failure shown to the owner as page content, under testid cocktail-queue-error. There is not one button, link or field on the page. No canary journey covers this route: the bar-tender journey (W-002) is PATRON-only and exercises the diner-facing cocktail banner, not this screen. So nothing on the board is red, because nothing on the board is looking. what I saw · trace.zip · owner video · report | STR-1194 |
| W-095 | owner-unreachable-settings | 0 | OW | NO SUCH JOURNEY | — | Not a canary journey - found by driving the product and comparing it to the board. Three owner settings screens work fine, but there is no link to any of them anywhere - 77 links across six screens and not one leads there. No canary journey covers this at all.
the long version/owner/settings/payments/, /owner/settings/pos/ and /owner/settings/dietary/ all answer 200 and render if the address is typed. I enumerated every <a href> on six owner screens - dashboard, Food Items, Menu, Tables/Staff, Personalize, my restaurants - opening the user menu and the mobile nav on each, and collected 77 distinct hrefs. Not one points at any of the three, and there is no settings-ish href anywhere at all. /owner/settings/ itself answers 404 as a RAW S3 XML error page (NoSuchKey), not a styled not-found. By App-Doc's own 3-pass rule a capability that is not reachable in the UI is not a capability. what I saw · trace.zip · owner video · report | STR-1196 |
Owner account plus a dedicated fixture. 21 journeys · 69 steps · 0 not yet driven
| # | Journey | Steps | Actors | Canary says | UAT verdict | Note | Ticket |
|---|---|---|---|---|---|---|---|
| W-012 | micro-kitchen-class-gate | 4 | CAPA | PASSED | Honest green | A micro kitchen and an ordinary restaurant open identically. Green, and it matches what I saw.
Couldn’t check The row's own note about the menu data underneath is cut off mid-sentence, so I can't repeat what it found there. the long versionLoaded the Micro-Kitchen fixture (d79cd122-d52a-5484-804d-f5e1c84a7b03) and, in a separate fresh browser context, the full-service Canary Kitchen fixture (99e9d621-6941-4acc-8d85-50f15f3a2f2b) as a dine-in control. MK arrival: gates=["dietary-modal"] interactive=true. Control arrival: gates=["dietary-modal"] interactive=true. No captured /diner/* GET payload (menu-structure only) exposed a literal | |
| W-013 | micro-kitchen-collection-settings | 4 | WA | PASSED | Honest green | The Collection settings page is there, opens on the right restaurant, and shows the windows that are configured.
the long versionLogged in as the shared canary owner and opened the Micro-Kitchen dashboard (d79cd122-d52a-5484-804d-f5e1c84a7b03). Sidebar offers a Collection link: true (testid nav-fulfilment). Clicking it opened a page scoped to the same restaurant: true, showing configured fulfilment windows: true, with no unsaved-changes indicator on arrival: true. | |
| W-014 | micro-kitchen-delivery-address | 6 | CAPAWA | PASSED | Honest red | Walked the reachable half of a red the board already reports; step 05 is behind a diner-account gate. A delivery kitchen's order records a table number instead of an address. I saw that twice from the outside; the fulfilment questions themselves sit behind a sign-in I cannot get through.
Couldn’t check Whether a pickup-or-delivery choice and an address box appear once you are signed in. The account we hold is refused at the gate, so those two steps stay unwalked and I claim nothing about them either way. Left behind Nothing ordered - every attempt stopped at the sign-in gate. the long versionBoard reports mkda-05-order-carries-address and mkda-06-address-on-dashboard FAILING; steps 01/03/04 (both methods offered, method pills render, address field reachable) PASSING. Walked what a person can reach. PATRON: arrived at the delivery micro kitchen, 9 dishes, added one to the basket and opened it - and there is NO pickup-or-delivery choice and NO address field anywhere, by testid or by page text, before the signup gate. Pressing Place order stops at the gate, which needs a confirmed diner account this container does not hold, so step 05 is not mine to walk. OWNER: opened the one order this kitchen holds (Cancelled, $3.81, 21h old) - it carries no address and nothing shaped like one; the only location on it is 'Table 10075', a TABLE number on a kitchen whose whole point is that there are no tables. That corroborates mkda-06 from the outside. Whether a fulfilment choice appears AFTER the gate is unknown to me and I do not claim it.
RE-DRIVEN 2026-09-04 22:09 UTC after the board flipped this journey FAILED -> PASSED (batch b2e79158). The diner half is UNCHANGED: fresh table 10471, added a dish, opened the basket - still no pickup-or-delivery choice and no address field by testid, and pressing Place order still stops at the signup gate. CORRECTION TO MY OWN EARLIER READ: that gate says 'STEP 1 OF 3 - SIGN IN', so fulfilment is steps 2 and 3, BEHIND it. My 'no address field anywhere' was read on a screen that was never going to show one - the ticket was already scoped to say so, but the ledger note was looser than the ticket and is corrected here. I tried to settle it: the gate was put into SIGN IN mode (panel read back before typing) and the diner-pool account was submitted ONCE. Refused: 'Incorrect username or password.' I will not retry a real person's account against a live gate. So gate steps 2-3 remain UNWALKED and I claim nothing about them either way. The owner-side half stands unchanged: this kitchen's one order records 'Table 10075' as its only location. what I saw · trace.zip · owner video · patron video · report | STR-1198 |
| W-015 | micro-kitchen-delivery-distance | 4 | CAPAWA | PASSED | DEFERRED D5 | D5 HARNESS UNRESOLVED NOT WALKED PROPERLY. My test order used a fake address, so 'no distance' was the correct answer. Needs a re-run with a real street address. Whether the delivery distance and arrival time really appear stays unknown, because my own run never tested it.
Couldn’t check Everything this journey asserts. Nothing here is graded until it is driven again. the long versionRETRACTED a FALSE_GREEN. Lane D found no distance/ETA on the owner card and called the board dishonest. The canary's own card says it orders 'to a real routable address (as TEXT with no place_id, so the server-side geocode is exercised too)'. Lane D used the diner's pre-filled '1 Canary Way, Dev City 00001' - a placeholder Google Routes cannot geocode. No distance is the CORRECT answer for that input, so the run never exercised the thing the canary asserts.
STALE GREEN (STR-1206, 2026-09-04 22:09 UTC). This journey has NOT RUN since Sep 3 while every one of the 90 still-scheduled suites ran at least twice - median 3 - inside a 94-minute board window. So its PASSED badge is not a current result, it is the last colour it happened to end on ~40 hours ago. Whatever verdict this row carries, it was graded against a claim the board is no longer making. | STR-1206 |
| W-016 | micro-kitchen-distance-degradation | 4 | WA | PASSED | Honest green | A kitchen with no address doesn't break its order board — no gibberish distances, and no distance shown where there's nothing to measure. Green, and honestly so.
the long versionLoaded the owner order dashboard for the Micro-Kitchen fixture (which carries no street address) as the shared canary owner. The board answered without error: true. No malformed distance/ETA text (NaN/undefined/null) was found anywhere on the board: true. A distance value appeared next to a pickup-type order: false (expected false/absent for an addressless order). | |
| W-017 | micro-kitchen-mobile-orders | 6 | WA | PASSED | DEFERRED D1 | D1 NO SCREEN NOT WALKED. I could not find a page for this. There may not be one. None of the six steps was graded, so nothing about the mobile owner app's orders is known.
Couldn’t check All six steps. the long versionThis journey drives @qrate/owner-mobile, described in its own card text as a SEPARATE Next.js app (not the responsive owner-webapp) with its own S3 bucket and CloudFront distribution, DEV ONLY. No URL for this app was provided in the agent brief (which lists only the patron, owner.dev.qrate-ai.com, and waiter.dev.qrate-ai.com surfaces), and it is not present in this UAT session's environment map m | |
| W-018 | micro-kitchen-multipatron-absent | 5 | CAPA | PASSED | Honest green | A micro kitchen has no tables, and the app behaves like it - nothing anywhere suggests you are sharing with other diners.
Left behind One item added to the basket at table 10404. the long versionOpened a fresh guest session on the Micro-Kitchen fixture (table 10404, gates cleared: ["dietary-modal"]), added an item (succeeded), opened the cart, and opened the service drawer. No companion badge / shared-table copy was seen on the menu (false). Cart companion attribution present: false. Service drawer text mentions chat: true; mentions call-staff: false. | |
| W-019 | micro-kitchen-order-retention | 4 | CAWA | PASSED | Honest green | An order twelve hours old was still on the owner's board, long past the two-hour cutoff a normal dine-in order gets. A pre-order does survive.
the long versionLoaded the owner order list for the Micro-Kitchen fixture as the shared canary owner: true. Scanned the rendered board for order-age markers; the oldest visible was 720 minutes. This is beyond the naive 120-minute dine-in retention window, directly evidencing a pre-order survives past it. | |
| W-020 | micro-kitchen-order-type-window | 7 | CAPA | PASSED | Partial green | The owner's half of collection windows is real and settable. The customer's half — every date and time rule this journey is actually about — sits behind a sign-in I can't get past.
Couldn’t check Six of the seven steps: the 24-hour floor on a normal order, the 48-hour one on a party order, whether the party floor really lands later, whether empty or too-early dates are kept out, whether the owner's instructions reach the customer, and whether anything past the booking limit is offered. The owner's wording says 48 against 24, but I never saw the two worked out for real. Left behind Nothing — nothing saved on the owner side, no order placed, and a micro kitchen has no tables. the long versionPARTIAL GREEN - the owner half is real and better than expected, the diner half is behind the sign-in gate. A micro kitchen's sidebar carries three items an ordinary restaurant does not - Orders, Collection and Payments - and Collection (/owner/settings/fulfilment/) says in the product's own words 'Party orders are collected at least 48 hours ahead instead of 24', alongside a booking horizon, per-day collection windows, Pickup/Delivery and owner instructions. The live board carries real windows (Mon, Sep 7 10:34 PM - 12:34 AM). NOT WALKED: all six diner steps live on a fulfilment picker behind the signup gate. The lane's FIRST pass probed URLs directly and concluded no config screen existed - false; it was superseded once the kitchen's own sidebar was followed instead. Worth keeping: navigate the product the way a person would before concluding a screen is absent.
WHAT A PERSON CAN DO: The OWNER half is real and reachable. A micro kitchen's sidebar carries three extra items an ordinary restaurant does not have - Orders, Collection, Payments - and Collection (/owner/settings/fulfilment/) is a full configuration screen that says, in the product's own words: 'Party order threshold ... Party orders are collected at least 48 hours ahead instead of 24, giving you time to buy for them', plus 'Booking horizon - how many days ahead a diner may book a collection window', per-day Collection windows, Pickup/Delivery, and 'Your instructions are shown at checkout and saved onto the order'. So step 1 (this IS a configured micro kitchen) and the whole premise of steps 2/3/4/7 are visible and settable by the owner. The kitchen's live order board shows real orders carrying real collection windows (Mon, Sep 7, 10:34 PM - 12:34 AM; Sun, Oct 4, 09:03 PM - 10:03 PM; Sat, Sep 5, 05:00 PM - 07:00 PM) tagged PICKUP and DELIVERY. As a diner I can browse 9 dishes and cart one with no account.
WHERE IT STOPS: The diner's 'Place order' button. Six of the seven steps are things a diner reads off a date-and-time picker, and that picker is behind the who-are-you panel (signup-gate, 'STEP 1 OF 3 - SIGN IN'). Nothing about a pickup mode or a time is offered anywhere before it. Signing in with the diner credential this container holds was refused: 'Incorrect username or password.' Creating a new account (the sibling walk W-024) is accepted but then demands a code emailed to the address, which I cannot read.
NOT PROVEN (never graded): Steps 2 (regular 24h floor), 3 (party 48h floor), 4 (party floor strictly later - the owner COPY says 48 vs 24 but I never saw the two floors computed), 5 (no empty dates, none before the floor), 6 (owner instructions reach the diner), 7 (nothing past the booking horizon). NOT graded.
SURFACE DRIVEN: OWNER https://owner.dev.qrate-ai.com as canary-owner-dev@ (Desktop Chrome) + PATRON https://dcgmji73h6qel.cloudfront.net as an anonymous guest (iPhone 14 Pro on chromium)
STATE LEFT BEHIND: none - nothing saved on the owner side, no order placed, no table session (a micro kitchen has no tables). what I saw · trace.zip · owner video · patron video · report | STR-1211 |
| W-021 | micro-kitchen-owner-order-dashboard | 8 | WA | PASSED | Honest green | The micro-kitchen owner gets an order dashboard and no table screens, and accepting a real pending order on it worked.
Couldn’t check This row's own write-up stops mid-sentence at the moment I accepted the order, so what happened after that is not recorded. Left behind A real pending order on this restaurant's dashboard, which I accepted. the long versionLogged in as the shared canary owner on the Micro-Kitchen dashboard. Sidebar offers Orders=true, offers Tables/Staff=false. Direct nav to /owner/tables/ on this restaurant redirected away: true (landed on https://owner.dev.qrate-ai.com/owner/order-dashboard/?restaurantId=d79cd122-d52a-5484-804d-f5e1c84a7b03). Order dashboard shows 3+ status lanes: true. Accepted a real pending order card (window/m | |
| W-022 | micro-kitchen-signup-gate | 6 | CAPAWA | PASSED | Partial green | WALKED, TWICE. The board is green but a person gets the wrong experience entirely - see the finding. Nobody asks who you are until you press Place order. Then it wants email and password - and only after you sign in does it ask your name, phone and address.
Couldn’t check Step 3 of 3 - pickup vs delivery and the collection time. Reaching it means submitting name/phone/address to a live account, which I will not do unasked. Left behind Nothing ordered - nothing goes to the kitchen until you are past the gate, and I never got past it. the long versionRE-DRIVEN 2026-09-05 WITH A WORKING DINER ACCOUNT, and it settles a dispute that had been open for days. Browsing and filling a basket at a micro kitchen needs no account at all - nobody asks who I am until I press Place order, and then a well-written panel stops me: 'STEP 1 OF 3 - SIGN IN / Who's this order for? There's no table here - the kitchen needs a name to hand the bag to', with my basket visibly held. STEP 1 ASKS FOR EMAIL AND PASSWORD, AND NOTHING ELSE (signup-gate-email, signup-gate-password) - no name, no phone, no address, proven by a full input enumeration, not by a failed selector. Signing in with the canary diner account is ACCEPTED (200 GET /diner/profile) and the panel then ADVANCES rather than closing, to a second step asking exactly the four fields EMP-1 described: signup-gate-name, signup-gate-details-email, signup-gate-phone (type=tel, 'So the kitchen can reach you') and signup-gate-address, plus signup-gate-address-use-location, submitted with signup-gate-details-submit. So EMP-1 and I were BOTH RIGHT, about two different screens, and neither could tell because nobody had ever been through step 1. Coming back signed in, the app RESUMES the checkout (qrate_checkout_resume) - the basket and my place in the panel are both still there. WHAT I DID NOT DO: submit those details. That writes real customer data to a live account, so step 3 of 3 - the pickup/delivery choice and the time - is still unobserved. Deliberate boundary, not missing evidence. RECORDED SO IT IS NOT REPEATED: my first re-drive clicked 'signup-gate-submit', which does not exist, submitted nothing, saw no error and reported success. The real control is signup-gate-email-submit. | STR-1211 |
| W-023 | micro-kitchen-windowless | 6 | CAPAWA | PASSED | DEFERRED D2 | D2 BLOCKED ON PROVISIONING WALKED, TWICE. The board is green but a person gets the wrong experience entirely - see the finding. Both kitchens look the same right up to a sign-in wall, and we have no diner account to get through it. Whether they differ on the other side, I genuinely do not know.
Couldn’t check Everything behind the sign-in: whether the order places without a time window, whether the owner receives it, the earliest-time floor, and whether the windowed twin really does still demand a time. The gate itself says 'step 1 of 3', so all of that may live behind sign-in by design — I cannot say. It stays blocked until a real diner account exists. the long versionRe-driven with video AND trace, no account used, so these artefacts carry no credential. Drove the windowless kitchen (table 10471) and its windowed sibling (10472) side by side. Both basket tabs on both fixtures offer nothing about pickup, delivery or a time, and both stop on the same 'STEP 1 OF 3 - SIGN IN' gate. Diffing the full testid set of the two stop screens, the ONLY differences are per-dish and per-cart-line UUIDs - ignoring those, the two are identical. I do NOT grade that as a defect: the gate itself says step 1 OF 3, so fulfilment plausibly lives behind sign-in by design. Whether the two fixtures diverge behind the gate is exactly what I could not establish, because our account is the wrong Cognito pool. Honest answer: I don't know, and I will not guess. what I saw · trace.zip · patron-windowed video · patron-windowless video · report | STR-1211 |
| W-024 | micro-kitchen-windowless-checkout | 5 | CAPA | PASSED | Partial green | Browsing and filling a basket needs no account at all. Pressing Place order doesn't get you a checkout — it gets you a sign-up that ends in an emailed code, and that is as far as I could go.
Couldn’t check The checkout itself, never seen. So whether it promises to arrange collection, and whether confirming really places the order, are ungraded. Signing in with the account this container holds was refused earlier the same evening. Left behind Nothing — no order placed, no account created (sign-up stopped at the emailed code), and a micro kitchen has no table session to leave open. the long versionPARTIAL GREEN - browse and cart work with no account at all, and then Place order does not open a checkout: it opens signup-gate, 'STEP 1 OF 3 - SIGN IN'. NEW AND USEFUL: creating an account there IS accepted on email plus password, and the gate then demands an EMAILED CODE (signup-gate-code). So a real customer with an inbox gets through; this container has no inbox, which is why the checkout itself has never been seen by me and is NOT graded. This refines the earlier note that the gate is 'email and password only' - it is email, password, then a code.
WHAT A PERSON CAN DO: At Canary Micro Kitchen Windowless a person can reach the menu (9 dishes), open a dish and add it to the basket with no account at all - the basket pill read 1. Everything reached worked.
WHERE IT STOPS: The basket's 'Place order $3.50' button. It does NOT open a checkout - it opens a full-screen who-are-you panel (data-testid signup-gate) headed 'STEP 1 OF 3 - SIGN IN / Who's this order for? There's no table here - the kitchen needs a name to hand the bag to.' Making an account there (email + password, the only two boxes it offers) is accepted and then demands a code emailed to that address (signup-gate-code). I have no inbox, so that is where I stop. A real customer with an email address would get through; I cannot say what is on the other side. Signing in with the diner credential this container holds was refused earlier the same evening with 'Incorrect username or password.'
NOT PROVEN (never graded): Step 3 'Place order opens a checkout' (only the gate was reached, the checkout itself was never seen), step 4 'Says we will arrange collection', step 5 'Confirming places the order'. NOT graded.
SURFACE DRIVEN: https://dcgmji73h6qel.cloudfront.net/menu?id=3e2604d7-...&table=10491 driven as an anonymous guest (no account), iPhone 14 Pro descriptor on chromium
STATE LEFT BEHIND: none - no order was placed, no account was created (signup stopped at the emailed-code step), and a micro kitchen has no table session to leave open. | STR-1211 |
| W-098 | wiz-final | 0 | OW | NO SUCH JOURNEY | Partial green | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC (not a stale snapshot): the board carries 694 distinct step names and ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. The nearest-looking suite, mksg-01..06 'micro-kitchen signup gate', is a DINER signing in to place an order - a different actor, app and Cognito pool from the owner onboarding wizard on the marketing site. So nothing in the estate would go red for any of this. Found by driving the product. The wizard works right up to the emailed 6-digit code - and that code lands in SPAM, which is where this walk stopped three times over.
Couldn’t check Anything past the verify-email box: Step 3, the claim reaching the admin portal, and the hand-off to the owner app. None of it has been seen. Left behind A part-made owner account and no restaurant. Nothing was approved. the long versionDrove the whole owner sign-up wizard on the DEV landing https://d1tp6c3p7lolbw.cloudfront.net (real-Cognito mode: "cognito" + owner pool us-east-1_80u7DHF6v + handoff owner.dev.qrate-ai.com, all three grepped out of the deployed chunks). Prod www.qrate-ai.com serves the same page and was NOT driven. as a restaurant owner would, on Desktop Chrome / chromium 145. The front door is the 'Start your pilot' button on the HOME page, which opens a modal for Full name / Email / Password (auth-submit); Google and Apple both render disabled with 'SOON'. Pressing Create account does NOT create the Cognito user - it drops you on Step 1 with nothing verified. Choosing Restaurant auto-advances to Step 2, where the owner line correctly reads 'Owner name: Atish Saha' and 'Owner email: ...'. I filled phone, restaurant name, Boston MA, cuisine, left tables at the default 10, and attached three randomly generated test documents (menu.jpg 36 KB, utility-bill.jpg 32 KB, gov-id.png 14 KB) - all three were accepted and echoed back as 'ready'. 'Create account & continue' ENABLED and went through. THAT submit is where the real Cognito sign-up fires and a 6-digit code is emailed, and an auth-code-dialog opens: 'Verify your email - we sent a 6-digit code to <address>. Enter it to finish creating your account.' The walk stops dead there: I have no mailbox. I held the gate open for 30 minutes and no code was handed to me, so I ended the walk rather than invent one. Everything up to the code works; nothing past it has been seen by anybody.
CORRECTION 2026-09-06: this walk was completed. The code IS sent - SignUp returned HTTP 200 with CodeDeliveryDetails {AttributeName:email, DeliveryMedium:EMAIL} and Resend the same. The message lands in the operator's SPAM folder, which is why three earlier walks stalled here and why I wrongly entertained 'the app never sends it'. Filed as STR-1233. The wizard itself works up to and including this dialog. | STR-1233 |
| W-099 | wiz-human | 0 | OW | NO SUCH JOURNEY | — | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC (not a stale snapshot): the board carries 694 distinct step names and ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. The nearest-looking suite, mksg-01..06 'micro-kitchen signup gate', is a DINER signing in to place an order - a different actor, app and Cognito pool from the owner onboarding wizard on the marketing site. So nothing in the estate would go red for any of this. Found by driving the product. If you arrive at the sign-up form by link instead of by the button, you get a form you can fill in completely and can never submit, and the page never tells you why.
Couldn’t check Whether a real owner would ever land on that URL - a search result, a shared link or an old bookmark would all do it. Left behind Nothing. Nothing was ever submitted. the long versionDeep-linking straight to /onboarding produces a form NO ONE CAN SUBMIT, with nothing on screen saying why. Going to the DEV landing https://d1tp6c3p7lolbw.cloudfront.net (real-Cognito mode: "cognito" + owner pool us-east-1_80u7DHF6v + handoff owner.dev.qrate-ai.com, all three grepped out of the deployed chunks). Prod www.qrate-ai.com serves the same page and was NOT driven./onboarding directly skips the account modal that lives behind 'Start your pilot', so the details form renders with 'Owner name: -' and 'Owner email: -' AND OFFERS NO FIELD FOR EITHER. 'Create account & continue' therefore never enables. I filled every visible field - phone (202) 456-7890, restaurant name, Location, Cuisine, tables at 10 - and attached all three documents; the button stayed disabled at all 10 checkpoints. checkValidity() returns true on every field, aria-invalid is false, there is no [role=alert], no title, no aria-describedby, no console error and no 4xx. Ruled out as harness: three input methods (Playwright fill, real keystrokes with a Tab blur out of each field, and a city taken verbatim off the wizard's own list) and THREE ENGINES - chromium 145, firefox 146, webkit 26 - all identical. Both establishment branches reach the same dead form. Entering by the front door instead makes the very same form submit first time (W-098), which is the control that proves this is the deep link and not the form. | |
| W-100 | wiz-claim | 0 | OWPO | NO SUCH JOURNEY | — | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC (not a stale snapshot): the board carries 694 distinct step names and ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. The nearest-looking suite, mksg-01..06 'micro-kitchen signup gate', is a DINER signing in to place an order - a different actor, app and Cognito pool from the owner onboarding wizard on the marketing site. So nothing in the estate would go red for any of this. Found by driving the product. 'I'll verify later' is a door that does not open - it drops you back on Step 2 and eight presses of continue never move you off it.
Couldn’t check Whether the code, once entered, actually finishes the job - I have never had one. Left behind A second part-made owner account. No restaurant, no claim. the long versionThe wizard's own escape hatch goes nowhere. The verify-email dialog offers 'I'll verify later' beside 'Resend code'. I took it, having waited 8 minutes for a real code first. The dialog closed and the wizard re-rendered STEP 2, 'Tell us about your restaurant'. I pressed continue eight times in a row and never left that screen - the walk log is literally the same heading eight times. So the emailed pin is compulsory in practice while the interface says it is optional, and an owner who cannot reach that inbox right away is stuck in a loop with no way forward and no explanation. A Cognito call returned HTTP 400 during this path. Because no claim is ever filed, nothing reaches the admin portal - which is consistent with finding no claim there. | |
| W-101 | wiz-login | 0 | OW | NO SUCH JOURNEY | — | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC (not a stale snapshot): the board carries 694 distinct step names and ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. The nearest-looking suite, mksg-01..06 'micro-kitchen signup gate', is a DINER signing in to place an order - a different actor, app and Cognito pool from the owner onboarding wizard on the marketing site. So nothing in the estate would go red for any of this. Found by driving the product. The wizard promises 'come back anytime' and then has no way back - Login sends you to a different app entirely and your part-finished setup is gone.
Couldn’t check Whether the setup really is saved server-side and only the route back is missing, or whether nothing was saved at all. the long versionA part-finished wizard cannot be resumed, while the wizard promises the opposite. The sidebar says, on every screen, 'Your pilot setup saves automatically - come back anytime.' Coming back the way it invites - the Login button (nav-login) on the landing page - opens a login box on the landing, but signing in REDIRECTS TO THE OWNER APP: the page that appears is titled 'OWNER PORTAL / OWNER SIGN IN / Welcome back. Sign in to manage your menu, tables, and orders' with login-email and login-password fields. It never returns to the wizard. Going back to /onboarding afterwards shows 'Owner name: -' again and a dead submit - so nothing was resumed and the promise on screen is not kept. (Note both modals sit in the DOM at once, so the visible one must be selected explicitly.) | |
| W-102 | wiz-microkitchen | 0 | OW | NO SUCH JOURNEY | — | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC (not a stale snapshot): the board carries 694 distinct step names and ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. The nearest-looking suite, mksg-01..06 'micro-kitchen signup gate', is a DINER signing in to place an order - a different actor, app and Cognito pool from the owner onboarding wizard on the marketing site. So nothing in the estate would go red for any of this. Found by driving the product. Choose 'Micro Kitchen' and the wizard immediately starts calling you a restaurant and asking how many tables you have - after telling you a micro kitchen has none.
Couldn’t check Whether anything downstream of Step 2 differs between the two branches - the code gate stops both at the same place. the long versionPick 'Micro Kitchen' and you are then asked about your restaurant. The Step 2 heading reads 'Tell us about your restaurant', the required field is labelled 'Restaurant name *', and the size control is 'Size (number of tables)' - for an establishment the wizard's own Step 1 describes as 'Home or residential kitchen - no dine-in tables'. The two branches render an identical form; nothing adapts. Separately the two choices behave differently for no visible reason: choosing Restaurant advances to Step 2 on its own, while choosing Micro Kitchen only selects the card and waits for a Continue press. Food Truck is present and disabled, 'Coming soon'. | |
| W-103 | wiz-blocker2 | 0 | OW | NO SUCH JOURNEY | — | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC (not a stale snapshot): the board carries 694 distinct step names and ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. The nearest-looking suite, mksg-01..06 'micro-kitchen signup gate', is a DINER signing in to place an order - a different actor, app and Cognito pool from the owner onboarding wizard on the marketing site. So nothing in the estate would go red for any of this. Found by driving the product. The Location suggestions are a fixed list of 16 US cities that never responds to what you type.
Couldn’t check Whether the location is used for anything downstream - the code gate stops the walk before I could see. the long versionThe Location field's suggestions are a hardcoded list of 16 US cities that never filters. The control at data-testid='location-suggestions' is a <DATALIST> holding exactly: New York NY, Los Angeles CA, Chicago IL, Houston TX, Phoenix AZ, Philadelphia PA, San Antonio TX, San Diego CA, Dallas TX, Austin TX, San Francisco CA, Seattle WA, Denver CO, Boston MA, Miami FL, Atlanta GA. Typing 'Bos', then 'Bost', then 'Boston' returns that same 16-entry list unchanged each time - it is not a lookup and it does not narrow. Free text is accepted, so the field is not restricted to the list; the list simply does not help. Any owner outside those 16 cities - which is most of them, and every owner outside the US - gets a suggestion box that never once suggests their city. | |
| W-104 | wiz-portal | 0 | PO | NO SUCH JOURNEY | — | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC (not a stale snapshot): the board carries 694 distinct step names and ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. The nearest-looking suite, mksg-01..06 'micro-kitchen signup gate', is a DINER signing in to place an order - a different actor, app and Cognito pool from the owner onboarding wizard on the marketing site. So nothing in the estate would go red for any of this. Found by driving the product. I never got into the admin portal, so the claim half of this flow is unverified. My harness, not the product - and no claim existed to find anyway.
Couldn’t check Everything portal-side: whether a claim arrives, how a reviewer sees it, and what approval does. the long versionI could not get into the admin portal to look for the claim, and that is my problem, not the product's. portal.internal.qrate-ai.com/login/ renders a single input[type=password] with placeholder 'Enter password' and a button[type=submit] that starts disabled; my typing did not enable it across two attempts and the locator timed out. So the portal half of this flow - does the claim arrive, can a reviewer approve it - is UNVERIFIED BY ME. Worth stating plainly: with the email code unavailable no claim was ever created in any of these walks, so there would have been nothing in the queue to find even with a working sign-in. I am not reporting a portal defect; I am reporting that I did not get in. | |
| W-105 | wiz-account-exists-deadend | 0 | OW | NO SUCH JOURNEY | — | Not a canary journey. Confirmed against a LIVE board fetch on 2026-09-06 11:16 UTC: 694 distinct step names, ZERO matches for wizard, onboard, landing, pilot, claim, signup, register or portal. Nothing in the estate would go red for this. Miss the emailed code and your email address is spent for good: the wizard makes you re-enter everything before refusing it, then sends you to a login that says your correct password is wrong, and nothing anywhere offers to verify the account.
Couldn’t check Whether a support agent could rescue the account from the back end. I have no such access. Left behind The account atish@qrate-ai.com exists in the owner pool, unconfirmed and unusable. the long versionAn owner who does not type the emailed code is locked out of their own email address FOREVER, and every message the app shows them on the way is wrong. Walked on the DEV landing https://d1tp6c3p7lolbw.cloudfront.net on Desktop Chrome / chromium 145 with an account that had been created but never verified. (1) The 'Start your pilot' modal accepts the same address again in silence - ZERO Cognito calls are made, because the real SignUp does not fire until the DETAILS submit. (2) So the owner re-types phone, restaurant name, location, cuisine and re-attaches all three documents. (3) ONLY THEN: 'This account already exists. Please log in to continue. Go to login'. (4) Pressing Go to login leaves the marketing site entirely and lands on owner.dev.qrate-ai.com/owner/auth/login. (5) Signing in there returned 'Incorrect username or password.' - see the CORRECTION below; I could not show the password I used was the one that made the account, so this step proves nothing. (6) Nothing anywhere offers to resend the code or confirm the account: a scan of the alerts, buttons and body text for confirm/verify/code returned nothing. (7) Returning to /onboarding shows the same banner. There is no exit. This is the trap the spam problem springs: the code goes to spam (STR-1233), the owner cannot verify, 'I'll verify later' loops on Step 2 (W-100), and when they try again their address is already spent. CORRECTION 2026-09-07, mine to own: step (5) was unsound. My credential store held TWO DIFFERENT passwords recorded against atish@qrate-ai.com - the account was created by the first walk and my login attempt used the second, so 'Incorrect username or password.' was TRUTHFUL and I attributed it to the wrong cause. I never checked which password made the account before calling the message false. QRATE-EMP-1 probed it with AWS access I do not hold (STR-1234 comment, 2026-09-07) and reports that a CORRECT password on an unconfirmed account produces no message and no navigation at all - total silence - which is worse than a wrong message, because silence tells the owner nothing happened. That is REPORTED to me, not yet OBSERVED by me; a re-drive on 2026-09-07 with a single recorded password is what settles it. Steps (1),(2),(3),(4),(6),(7) are unaffected and still stand as OBSERVED - the dead end itself is not in question, only my reading of one message inside it. | STR-1234 |
Things that are broken right now, each with a way to reproduce it. Two are defects in this audit's own harness, kept here rather than quietly fixed — a verifier that hides its own errors is asking to be trusted rather than checked.
| Sev | Area | What is broken | How to see it | Repro | State |
|---|---|---|---|---|---|
| P1 | UAT harness (mine) | lib-arrive.mjs can open a dish sheet instead of clearing the welcome gate | If the welcome gate vanishes between the presence check and the blind tap at (195,789), the tap hits a dish tile, m2-composition opens and covers every Add button. Looks exactly like a dead app. | fix/lib-fix.mjs (corrected) vs lib-arrive.mjs | FIXING |
| P1 | Patron / WebKit | Guest cannot attach to the table session on any iPhone browser | Open the dev patron menu in WebKit as a fresh guest; POST /auth/guest/attach-session -> 401, POST /diner/session/snapshot -> 401. Chromium control returns 200 for both. | repro/specs/ + jU-webkit-order.spec.mjs | OPEN |
| P2 | Patron / all devices | Cart quantity stepper is 18x18px, under the WCAG 2.2 AA 24x24 minimum | Add any item on the dev patron menu, then measure m2-dec-* / m2-add-* on the carted tile. 18x18, and the two controls are adjacent. | jU-devices.spec.mjs + viewport-audit.mjs CHECKS.tapTargets | OPEN |
| P2 | Owner app / mobile | /owner/orders scrolls horizontally on every phone; the Sage button is 18px off-screen | Sign in to the dev owner app on a 360px phone viewport and open /owner/orders. document.scrollWidth is 394 against a 360 viewport. div.mobile-topbar measures 394px wide. | jU-owner-mobile.spec.mjs + jU-orders-overflow.spec.mjs | OPEN |
| P2 | Patron / active-menu-window | Fail-closed after-hours gate does not reach a real diner | Scan Canary Hours table 9911 outside 06:00-10:00. First menu call correctly returns menus_closed=true; the app's bootstrap mints a session, re-fetches, and renders a dinner-only item with no closed-state shown. | jU-amw.spec.mjs | OPEN |
| P2 | Canary fleet / bar-tender | 2 of 6 steps permanently soft-skipped in dev, board still shows green | No dev fixture has approved cocktails, so bt-05/bt-06 soft-skip every cycle while the card reads PASS. | runs/laneA/deep/bar-tender.json | OPEN |
| P2 | Patron / performance | LCP 6.6s fast, 8.9s on slow 3G | PerformanceObserver on the deployed dev patron menu, four engine/network profiles. | jU-perf.spec.mjs | OPEN |
| P3 | UAT harness (mine) | Table numbers outside 9905-10099 silently void an order | 9 of 22 generated repro specs carry a bad table; each is flagged with a TABLE RANGE WARNING. | repro/specs/*.spec.mjs | FLAGGED |
| P3 | UAT harness (mine) | Fixture map disagreed with the canary card on 2 journeys | owner-menu and namespaced-subcategory name Canary Kitchen in a STEP; my plan.json pointed elsewhere. Produced two retracted FALSE_GREENs. | runs/wave0/fixture-misassign.json | FIXED |
| P3 | Patron / canary-mosaic | Only one dietary chip (gluten-free) is offered in the filter drawer | Open the dev patron menu on Canary Mosaic as a guest, tap the filter dock. The drawer offers m2-dietary-gluten-free plus served-alcoholic / non-alcoholic, and nothing else. | jU-snap2.spec.mjs | OBSERVED |