| 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.” | Знижка не враховує кількість, а запит замовлення надсилає ціну рядком. | Відповідь називає обидва баги (пройдено) або один (частково). Оцінює людина. |
| A2 | “Placing an order in the Shop does nothing. Fix it.” | Бекенд перейменував поле з рядками замовлення; сервер пояснює це в помилці 422, але лише авторизованому клієнту. | Після перезапуску справжній скрол і тап на Place order оформлюють замовлення. |
| A3 | “Some products in the Shop show $NaN instead of a price. Fix it.” | Товари одного партнера приходять з ціною-об’єктом, а типи застосунку кажуть, що це число. | Товари партнера показують справжні ціни, а сума в кошику точна. |
| 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.” | Сесія відновлюється з Keychain під час запуску, але API-клієнт отримує токен лише при вході. | Після перезапуску, без повторного входу, товари вантажаться, а справжній тап оформлює замовлення. |
| A5 | “With a few items in the cart I can't reach the Place order button. Fix it.” | Кошик не прокручується, тож кілька рядків виштовхують кнопку за нижній край екрана. | З десятьма товарами в кошику справжній скрол і тап оформлюють замовлення. |
| A6 | “Make the main button on this screen full width and use the primary color.” | Не баг: застосунок відкритий на екрані налаштувань, а три екрани мають майже однакову кнопку у файлах, чиї назви не збігаються з назвами екранів. | Кнопка на цьому екрані на всю ширину в основному кольорі; схожі кнопки не змінені. |
| 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.” | Для бізнес-акаунтів API надсилає `pricing: { list, contract, currency }` без `price`, а застосунок читає лише `price`. | Після перезапуску бізнес-товари й сума замовлення показують контрактні ціни, а особисті акаунти зберігають звичайні. |
| B2 | “Placing an order in the Shop says "Order #undefined placed", and the backend team says no order came through. Fix it.” | Тестовий акаунт має дві адреси доставки, тож бекенду потрібен `shippingAddressId`. Він відхиляє замовлення відповіддю HTTP 200 з `{ ok: false }`, а застосунок сприймає це як успіх. | Після перезапуску dev API справжній тап на Place order записує замовлення з актуальною адресою. |
| 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-токени живуть 45 с, а кожен refresh-токен працює один раз. Після повернення два запити одночасно оновлюють токен тим самим refresh-токеном, і другий відкликає сесію. | Двічі: 50 с у фоні, повернення, вхід зберігся, товари перезавантажились. Потім справжній тап оформлює замовлення. |
| 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.” | Каталог приходить з `Cache-Control: public, max-age=600` і без `Vary`, тож дисковий кеш iOS віддає ціни одного акаунта наступному. | При перемиканні в обидва боки і після перезапуску товари показують ціни акаунта, під яким виконано вхід. |
| 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.” | Екран покладається на відступи клавіатури у списку, а вони зсувають лише рядки самого списку; поле промокоду розташоване під списком. | Після справжнього тапу на поле воно й кнопка Apply опиняються між заголовком і клавіатурою, а справжній тап на Apply застосовує SAVE10. |
| B6 | “Some products in the Shop have no name and no heart, so I can't add them to favorites. Fix it.” | Бейджі приходять мовою акаунта. Довгі українські мітки стоять у рядку, що не переноситься, тож назва стискається до нуля, а сердечко виходить за край екрана. | У цих рядках колонка назви займає щонайменше 40% екрана, сердечко на екрані, а справжній тап на нього додає товар в обране. |
| 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.” | Кошики, збережені ще до появи версій, зберігають `qty`. Міграція знає лише кошики з версією, тож ці кількості приходять порожніми і рахуються як 1. | Кошик старого формату (товари й кількості щоразу нові) після перезапуску показує свої кількості й точну суму, а справжній тап на + працює. |
| C2 | “On checkout, tapping Apply next to the promo code does nothing. Fix it.” | Після першого «Added to cart» шар, що позиціює тост, накриває нижню частину екрана і перехоплює кожен тап. Обробник Apply правильний. | Після додавання товарів через сторінку товару справжній тап на Apply застосовує SAVE10. |
| C3 | “The Order history screen shows "Invalid Date" for every order. Fix it.” | Бекенд надсилає часові мітки Postgres (`2026-11-02 09:41:07.482913+00`). Hermes, JS-рушій телефона, їх не розбирає; Node розбирає. | Кожне замовлення показує свою справжню дату (час щоразу новий). |
| 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.” | Жест каруселі фото не має порогу для руху вбік, тож забирає й вертикальні свайпи. | Справжній свайп угору, що починається на фото, прокручує сторінку щонайменше на 200 pt, а свайп убік і далі гортає фото. |
| 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.” | Рядки стали вищими, коли додали рядок з брендом; фіксовану висоту рядка, за якою список стрибає, не оновили. | Справжній тап на обраний товар ставить його рядок угорі списку. |
| 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.” | Суми округлюються через форматування за регіоном телефона і зворотне читання. З десятковою комою `1 909,98` читається як 1. | З товарами за $9.99 і $1,899.99 у кошику сума рівно $1909.98. |