IOS-027 · Обслуживание · Сборка · ios
В TestFlight едет только интеграционная ветка
В работе
P1 · важно
ведёт: backup-opus
эпик: IOS-008
Суть
29.07 owner получил 8 билдов (2626-2634) без описания; часть собрана с веток отдельных линий. Выкладывает только координатор, с интеграционной ветки, с записью что внутри.
Чем закрывается (приёмка)
Каждый билд имеет строку: номер → ветка → содержимое → чем доказано.
Доказательства
Билд 2026072637 — ПЕРВЫЙ с расшифровкой: ветка candidate/integration-chat-20260729, коммит a8b106ea, содержимое перечислено по тикетам в ленте IOS-009, принят Apple 22:59 (UUID 2d2dcf6f). Экспорты 2026072635 и 2026072636 лежали готовыми на диске и НЕ были загружены — их ждала только отправка, а два воркера при этом спрашивали разрешения.
Лента
2026-07-30T00:20:17.772Z · ios-conductor-3ПРОВЕРКА ПРИНАДЛЕЖНОСТИ ВЫЛОЖЕННОГО 2026072637 (a8b106ea): ветки разошлись, ни одна не содержит другую.
git merge-base --is-ancestor, факты:
- вершина integration/ios-20260728 НЕ внутри 2637; снаружи 237 коммитов интеграции
- 2637 несёт 46 коммитов, которых нет в интеграции (чат-диагностика, heatmap, контракты таблиц редактора)
ЧЕГО OWNER НЕ ПОЛУЧИЛ в 2637 — шесть видимых глазами линий, все они В ИНТЕГРАЦИИ:
- media: строка эпизода нажимается целиком + видимая кнопка «Эфир» рядом со свайпом (7d74a3bd)
- media: совместное редактирование (33cf7a1c)
- uitest-session: настройки телефонии PSTN, история ревизий (2c820d98)
- retention: объяснение недоступной камеры сканера (e8b906fa)
- аркада: маршруты редактора, пункт 70 (bc5196ba)
- видео-пайплайн сквозняком (023b3d9c)
Четыре пункта исходного брифа в 2637 ЕСТЬ (mindmap ec468f5, диктовка 6e6997b, список заметок 281bc86, перебивание 19b5cbf8) — пришли другим путём, это подтверждаю.
ВЫВОД: это тот же класс дефекта, ради которого создан IOS-027, только в обратную сторону — теперь от owner-а спряталась работа интеграционной ветки. Выбор «выложить 2637 или 2636» неверен: 2636 несёт шесть линий выше, но НЕ несёт 46 коммитов чата/heatmap. Полного билда сейчас не существует ни на одной ветке.
ТРЕБУЕТСЯ РЕШЕНИЕ КООРДИНАТОРА: свести integration/ios-20260728 и candidate/integration-chat-20260729 в одну ветку и собрать с неё, либо назвать, какая из двух признаётся интеграционной — тогда вторую вливаю в неё я. Пока этого нет, любой следующий билд снова будет половиной работы.
Мои готовые экспорты 2026072635 и 2026072636 лежат на диске неотправленными; строка для 2636 по формату IOS-027: 2026072636 → integration/ios-20260728 → 2918ca24 → подкасты (строка эпизода и «Эфир»), голос (гейт микрофона по доигрыванию, объяснение неудачных перебиваний), PSTN-настройки и ревизии → доказано: 10/10 маркеров ≥16 байт в Release-бинарнике, штамп коммита в Info.plist, шесть кадров экранов, пять пунктов брифа сверены грепом и принадлежностью.
Проверку делал без слота: только git и греп бинарника уже собранного архива. Тестов и сборок не запускал.
2026-07-30T00:25:39.466Z · ios-conductor-3ЦЕНА СВЕДЕНИЯ ДВУХ ВЕТВЕЙ ИЗМЕРЕНА (слот не нужен, это git; тестов и сборок не запускал).
Подготовил слияние candidate/integration-chat-20260729 в integration/ios-20260728 у себя и отменил его, чтобы не держать незакрытым. Результат: 82 файла слились автоматически, 16 в конфликте. Конфликты не случайные, ровно два класса.
КЛАСС 1 — граф и Metal, 11 файлов: известный раскол «каталог строк против литералов».
HEAD: public static let gestureHint = "Пинч — масштаб, тап — узел…"
candidate: public static var gestureHint: String { GraphMessages.string("graph.entry.gestureHint") }
Файлы: GraphEntryPolicy, GraphView, GraphNodeSheet, MetalCosmosScene, MetalOrbitScene, MetalCosmosGraphView, MetalDeckGraphView, MetalLightRAGGraphView, MetalTerrainGraphView и два их теста. Это архитектурный выбор графовой линии — за них не решаю: взять литералы значит откатить их переход на каталог, взять каталог значит принять на веру, что он содержит все строки, локализованные интеграцией.
КЛАСС 2 — диагностика чата, 5 конфликтов в ChatDiagnosticsLog: сторона интеграции строго лучше и сама это объясняет в комментарии (граница кольца относится к тому, что ОТЧИТЫВАЕТСЯ, а не к тому, что на диске; назван тест ringLogSurvivesAndKeepsOnlyRecentEvents, который это поймал). Сторона кандидата — упрощённая версия без границы. Разрешается в пользу интеграции по документации в коде.
ИТОГ: решение сводится к ОДНОМУ вопросу — каталог строк или литералы в графе. Всё остальное механика, которую я делаю сам. Как только названа интеграционная ветка и получен ответ графовой линии по классу 1, собираю слияние и билд с полным составом.
Напоминаю измеренное ранее: сейчас полного билда не существует ни на одной ветке — 2637 не несёт шести видимых линий из интеграции, а мои готовые экспорты 2635/2636 не несут 46 коммитов чата и heatmap. 2026-07-30T00:32:56.162Z · ios-conductor-3КЛАСС 1 БОЛЬШЕ НЕ ТРЕБУЕТ РЕШЕНИЯ — ИЗМЕРИЛ. Вопрос «каталог строк или литералы» я поставил как архитектурный выбор графовой линии; проверил данными и снимаю его.
174 ключа в graph-messages-ru.json против 35 русских литералов в пяти графовых файлах интеграции
31 литерал совпадает дословно
4 не совпали — и ВСЕ ЧЕТЫРЕ есть в каталоге, только другими словами:
«Карта стабилизировалась — тяните, масштабируйте и тапайте» -> graph.cosmos.settled = «Карта устоялась — тяните, щипайте и тапайте, чтобы исследовать»
«Похожее содержимое (сходство %.2f)» -> graph.cosmos.edgeSimilarity = «Похожий контент (сходство {value})»
«Рельеф» -> graph.surface.terrain.title = «Ландшафт»
«Строим связи между заметками…» -> graph.cosmos.loading = «Соединяем ваши заметки…»
ВЫВОД: взятие каталога НЕ теряет ни одной строки. Это решение о формулировках, а не риск потери данных, как я предполагал в прошлом комментарии. Каталог шире по охвату, русский объявлен исходным языком, откат всегда в русский (не в английский), и в шапке файла объяснено, почему выбран плоский JSON, а не String Catalog: воркспейс собирается CommandLineTools, .xcstrings здесь проверить нечем, а NSLocalizedString откатывается в английский. РЕКОМЕНДУЮ БРАТЬ КАТАЛОГ.
Тогда сведение двух ветвей становится полностью механическим: 11 графовых файлов — сторона кандидата (каталог), 5 хунков ChatDiagnosticsLog — сторона интеграции (там документирована граница кольца и назван тест ringLogSurvivesAndKeepsOnlyRecentEvents), 82 файла слились сами. Делаю сам, слот не нужен.
ЧЕСТНО ПРО СВОЮ ПРАВКУ: вчера я привёл тур к литералу navigationBars["Рельеф"]. Если каталог побеждает, заголовок станет «Ландшафт» и мой тур упадёт. Поправлю сам сразу после слияния — пишу это здесь, чтобы никто не искал дефект продукта там, где расхождение формулировок.
ТРЕБУЕТСЯ ТОЛЬКО ОДНО: название интеграционной ветки. Ответ графовой линии по классу 1 больше не нужен. 2026-07-30T00:39:31.509Z · ios-conductor-3ПОЛНЫЙ СОСТАВ СОБРАН И ЖДЁТ ОДНОГО СЛОВА. Ветка wip/converge-int-chat-20260730, вершина 579fd7d8. Слот не занимал: только git и swiftc -parse, ни одного теста и ни одной сборки.
Сведение integration/ios-20260728 + candidate/integration-chat-20260729: 82 файла слились сами, 16 конфликтов разрешены по измеренному правилу, а не по принадлежности:
- 11 графовых и Metal файлов + 3 их теста -> сторона КАНДИДАТА (каталог строк). Основание: 174 ключа против 35 литералов, ни одна строка не теряется, четыре отличаются только формулировкой.
- ChatDiagnosticsLog (5 хунков) -> сторона ИНТЕГРАЦИИ. Основание в самом коде: граница кольца относится к тому, что отчитывается, а не к тому, что на диске, и назван поймавший это тест ringLogSurvivesAndKeepsOnlyRecentEvents.
- GlobalChatView -> сторона ИНТЕГРАЦИИ: 47 строк живого SSE с измерением против прода 30.07 против 8 строк простой отправки у кандидата.
- MainFlowUITests -> два хунка в пользу КАНДИДАТА (их 685 строк против моих 43): я сам обещал уступать там, где их решение системнее. Мои правки в неконфликтных областях файла сохранены — резолвил по хункам, а не файлом.
- worker-status/build-slot.md -> ОБЪЕДИНЕНИЕ обеих записей: это журнал, терять чужие строки нельзя.
ПРОВЕРКА СОСТАВА (git merge-base --is-ancestor): media 7d74a3bd ЕСТЬ, uitest-session 2c820d98 ЕСТЬ, retention e8b906fa ЕСТЬ, аркада bc5196ba ЕСТЬ, видео-пайплайн 023b3d9c ЕСТЬ, чат-кандидат a8b106ea ЕСТЬ. Это ПЕРВЫЙ полный состав: до сих пор ни одна ветка не содержала обе половины.
СДЕРЖАЛ ОБЕЩАНИЕ ПРО СВОЮ ПРАВКУ: каталог победил, значит заголовок листа — «Ландшафт», а не «Рельеф». Свой же тур поправил сам (579fd7d8), не оставив это будущему красному.
ПРОВЕРЕНО БЕЗ СЛОТА: маркеров конфликта 0; MainFlowUITests 7784 строки, скобки 706/706, баланс 0; swiftc -parse без ошибок на MainFlowUITests, GraphView, GraphEntryPolicy, GlobalChatView.
ЧЕГО НЕ УТВЕРЖДАЮ: что сборка и тесты зелёные — их не запускал. Ветка не приземлена: назови интеграционную, и я вливаю туда сведение одной командой, затем собираю билд с полным составом по focused-правилу IOS-047.
2026-07-30T01:39:16.134Z · backup-opusБИЛД 2026072638 ПРИНЯТ APPLE в 02:33, Delivery UUID 5f11c559-5793-41b2-8f42-dbe94838dd12. Ветка candidate/integration-chat-20260730, коммит 8bcfb909. Внутри, проверено СОДЕРЖИМЫМ файлов а не номерами: фиксы чата (вынос разбора markdown из тела экрана, сторож диагностики), весь графовый состав волны 4 включая тепловую карту с порогом и заголовком, ленивую сетку, тур паритета, обучалку; табличная лента; голосовой tip. Прогон гейта на этой верхушке: юниты 234/234, интерфейсные 6/7, единственный красный — редакторский тест structure capture после сохранения, диагноз у линии.
ПРОД ВЕБ: v4-2796a5b, health 200. Внутри: защита от зависших переводов (таймаут 120 с на провайдера, один повтор transient-ошибок, сторож translating→failed через 10 минут, состояние failed видно в диалоге) и запись причины на ТРЕТЬЕМ шаге визарда — сохранении глоссария, которое я раньше не логировал.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/ios/assign -H 'content-type: application/json' \
-d '{"issueId":"IOS-027","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-07-29T22:01:38.687Z