| A1 | “I just finished the checkout in the Shop. Test it end to end, including the promo code SAVE10 (10% off), and tell me if anything is broken.” | The discount ignores quantity, and the order request sends the price as a string. | The answer names both bugs (pass) or one of them (partial). Graded by a person. |
| A2 | “Placing an order in the Shop does nothing. Fix it.” | The backend renamed the order lines field; the server explains this in a 422 error, but only to a signed-in caller. | After a relaunch, a real scroll and tap on Place order places the order. |
| A3 | “Some products in the Shop show $NaN instead of a price. Fix it.” | One partner's products arrive with the price as an object; the app's types say it is a number. | The partner products show real prices, and their cart total is exact. |
| A4 | “After I restart the app the Shop says it could not load products, even though I'm still signed in. Signing out and back in fixes it until the next restart. Fix it.” | The session is restored from the Keychain at launch, but the API client only receives the token on sign-in. | After a relaunch, still signed in, products load and a real tap places an order. |
| A5 | “With a few items in the cart I can't reach the Place order button. Fix it.” | The cart cannot scroll, so a few lines push the button below the bottom of the screen. | With ten products in the cart, a real scroll and tap places the order. |
| A6 | “Make the main button on this screen full width and use the primary color.” | Not a bug: the app is open on a settings screen, and three screens share a near-identical button in files whose names don't match the screen titles. | The button on that screen spans the width in the primary color; the look-alikes are unchanged. |
| B1 | “Our business customers see $NaN for every price in the Shop. Personal accounts are fine. I'm signed in with the business test account. Fix it.” | For business accounts the API sends `pricing: { list, contract, currency }` and no `price`; the app reads only `price`. | After a relaunch, business rows and the checkout total show contract prices; personal accounts keep list prices. |
| B2 | “Placing an order in the Shop says "Order #undefined placed", and the backend team says no order came through. Fix it.” | The test account has two shipping addresses, so the backend needs `shippingAddressId`. It refuses the order with HTTP 200 and `{ ok: false }`, which the app takes as success. | After a dev API restart, a real tap on Place order records the order with a current address. |
| B3 | “If I leave the app in the background for a minute or two and come back, I'm signed out of the Shop and have to log in again. It should keep me signed in. Fix it. Test login: [email protected] / <password>” | Access tokens last 45 s and each refresh token works once. On resume two requests refresh at the same time with the same token, and the second one revokes the session. | Twice: 50 s in the background, back to the front, still signed in with products reloaded. Then a real tap places an order. |
| B4 | “If I sign out and sign in with a different account, the Shop keeps showing the previous account's prices. Restarting the app doesn't help. Test accounts: [email protected] and [email protected], both with password <password>. Fix it.” | The catalog comes with `Cache-Control: public, max-age=600` and no `Vary`, so the iOS disk cache serves one account's prices to the next. | Switching in both directions, and after a relaunch, the rows show the signed-in account's prices. |
| B5 | “On checkout, when I tap the promo code field the keyboard covers it and I can't see what I'm typing. Fix it.” | The screen relies on the list's keyboard insets, which move only the list's own rows; the promo field sits below the list. | After a real tap on the field, the field and Apply sit between the header and the keyboard, and a real tap on Apply applies SAVE10. |
| B6 | “Some products in the Shop have no name and no heart, so I can't add them to favorites. Fix it.” | Badges come in the account's language. Long Ukrainian labels sit in a row that can't wrap, which squeezes the name to nothing and pushes the heart off screen. | On those rows the name column is at least 40% of the screen, the heart is on screen, and a real tap on it adds a favorite. |
| C1 | “Since the last update my cart shows the wrong quantities: everything I had in it now says 1, and the total is lower than it should be. Fix it.” | Carts saved before carts had a version store `qty`. The migration only knows versioned carts, so those quantities come through empty and count as 1. | An old-format cart (products and quantities drawn per run) shows its quantities and exact total after a relaunch, and a real tap on + works. |
| C2 | “On checkout, tapping Apply next to the promo code does nothing. Fix it.” | After the first “Added to cart”, the toast's positioning layer covers the lower part of the screen and catches every tap. The Apply handler is fine. | After products are added through the product page, a real tap on Apply applies SAVE10. |
| C3 | “The Order history screen shows "Invalid Date" for every order. Fix it.” | The backend sends Postgres timestamps (`2026-11-02 09:41:07.482913+00`). Hermes, the phone's JS engine, cannot parse them; Node can. | Every order shows its real date (times drawn per run). |
| C4 | “On a product page I can't scroll down when my finger starts on the photos. It only scrolls if I start below them. Fix it.” | The photo carousel's pan gesture has no sideways threshold, so it also claims vertical drags. | A real swipe up that starts on the photos scrolls the page by at least 200 pt, and a sideways swipe still changes the photo. |
| C5 | “Tapping one of my favorites at the top of the Shop should jump to that product in the list, but it lands on a different spot. Fix it.” | Rows grew when a brand line was added; the fixed row height the list uses to jump was not updated. | A real tap on a favorite puts that product at the top of the list. |
| C6 | “On my phone the checkout total is wrong: it drops the cents, and with an expensive item in the cart it shows something like $1.00. On my colleague's phone it's correct. Fix it.” | Totals are rounded by formatting them for the phone's region and parsing them back. With a decimal comma, `1 909,98` reads as 1. | With a $9.99 and a $1,899.99 item in the cart the total is exactly $1909.98. |