# Task 05: Гигиена репозитория — бинарники, зависимости, документы (hermes-android) **Repo:** `ochenstarik-ui/hermes-android` **Assigned to:** Antigravity (режим оркестратора, два кодера) **Priority:** HIGH (распространение неподписанных исполняемых файлов) **Date:** 2026-08-24 **Base SHA:** результат задания 04 — указать фактический SHA при выдаче **Зависимость:** задание 04 принято — публикация артефактов делается из существующего пайплайна. ## Роли и протокол | Роль | Модель | Что делает | |---|---|---| | Оркестратор | Antigravity | Разбивает работу, маршрутизирует, принимает результат | | Кодер 1 | Gemini Flash 3.7 high | Реализация §Scope целиком | | Кодер 2 | Gemini Pro high | Независимая проверка работы кодера 1 и доработка | **Раунд 1 (кодер 1).** Пункты §Scope по порядку. Пункт 1 содержит операцию, требующую решения владельца, — см. §Требует решения владельца. Без ответа этот подпункт не выполняется, задание в остальном продолжается. **Раунд 2 (кодер 2).** Независимо проверяет результат: скачивает опубликованный артефакт, сверяет контрольную сумму, проходит §Anti-checklist с явной отметкой каждого пункта, доводит минимальным дифом, findings по шкале. **Раунд 3 (оркестратор).** Приёмка только при подтверждённой воспроизводимости: артефакт из релиза собирается из указанного SHA и совпадает по сумме. ## Проблема **1. 37 МБ исполняемых файлов в git (`BUILD-01`).** `hermes-pair/dist/windows/HermesPair.exe` — 21,2 МБ, `hermes-pair/dist/linux/hermes-pair` — 15,9 МБ; пак репозитория 13 МБ. README предлагает пользователям запускать именно эти файлы. Контрольных сумм нет, подписи нет, воспроизводимой сборки нет — проверить соответствие `.exe` исходникам невозможно. Каждое обновление добавит в историю ещё десятки мегабайт навсегда. **2. Версии зависимостей разбросаны (`BUILD-06`).** `gradle/libs.versions.toml` отсутствует, версии зашиты строками в `app/build.gradle.kts:71-123` и `build.gradle.kts`. Среди них альфа `androidx.security:security-crypto:1.1.0-alpha06` (см. задание 06, `SEC-07`). AGP 8.8.2, Kotlin 2.1.10, Compose BOM 2025.02.00 отстали. Dependabot/Renovate не подключены. **3. Нет базовых документов (`BUILD-07`).** Отсутствуют LICENSE, SECURITY.md, CONTRIBUTING.md, CHANGELOG. Проект распространяет исполняемые файлы и работает с OAuth-токенами: отсутствие лицензии и канала для сообщений об уязвимостях — не формальность. **4. Gradle не настроен (`BUILD-08`).** `gradle.properties` — четыре строки. Нет `org.gradle.parallel`, `org.gradle.caching`, `org.gradle.configuration-cache`, `android.nonFinalResIds`. Heap 2 ГБ мал для связки KSP + Compose compiler. ## Требует решения владельца Удаление бинарников из **истории** (`git filter-repo` + force-push) переписывает опубликованные коммиты: у всех, кто клонировал репозиторий, ломаются локальные ветки. Это не решение исполнителя. Кодер 1 обязан подготовить оба варианта и запросить выбор, не выполняя переписывание самовольно: - **A.** Удалить файлы текущим коммитом. История остаётся тяжёлой, но ничего не ломается. - **B.** Переписать историю. Репозиторий худеет до ~1 МБ, требуется force-push и уведомление всех клонов. До получения ответа выполняется вариант A, вариант B фиксируется как ожидающий решения. ## Scope **1. Бинарники из git в релизы (`BUILD-01`).** Удалить `hermes-pair/dist/**` из индекса, добавить в `.gitignore`. В пайплайн задания 04 добавить джоб релиза по тегу: сборка `hermes-pair` под Windows и Linux, публикация в GitHub Releases вместе с файлом контрольных сумм SHA-256. README: заменить инструкции «запустите `./hermes-pair/dist/...`» на ссылку на Releases и на сборку из исходников. Добавить строку о том, как сверить контрольную сумму. Подпись Windows-бинарника требует сертификата и в этом задании не делается — зафиксировать как отдельный вопрос владельцу. **2. Каталог версий (`BUILD-06`).** Ввести `gradle/libs.versions.toml`, перенести туда все версии из обоих `build.gradle.kts`. Версии при переносе **не менять** — только вынести; обновление зависимостей отдельным заданием, чтобы диф оставался ревьюируемым. Исключение: `security-crypto` не трогать здесь вовсе — он меняется в задании 06 вместе с обработкой отказа Keystore. Подключить Dependabot (`.github/dependabot.yml`) для gradle и cargo, интервал — еженедельно. **3. Документы (`BUILD-07`).** LICENSE — лицензию выбирает владелец, кодер 1 запрашивает и не выбирает сам. SECURITY.md — канал для сообщений об уязвимостях и срок ответа. CONTRIBUTING.md — как собрать, как прогнать проверки задания 04, требования к PR. CHANGELOG.md — формат Keep a Changelog, первая запись фиксирует состояние после заданий 01–04. **4. Настройки Gradle (`BUILD-08`).** `org.gradle.parallel=true`, `org.gradle.caching=true`, `android.nonFinalResIds=true`, heap 4 ГБ. `org.gradle.configuration-cache=true` включать только если сборка с ним проходит: если падает — не включать, а зафиксировать причину в отчёте. Молча оставить включённым падающий флаг нельзя. ## Do not change - Исходники `hermes-pair/src/**` — задание 07. - Продуктовый код Android — задания 01–03. - Версии зависимостей — только перенос, без обновления. - Конфигурацию release-варианта (подпись, R8) — задание 10. - Содержимое workflow задания 04 сверх добавления релизного джоба. ## Anti-checklist 1. `dist/**` удалён из рабочего дерева, но не добавлен в `.gitignore` — вернётся следующей же сборкой. 2. Файлы удалены и одновременно переписана история без ответа владельца. Это нарушение §Требует решения владельца. 3. Релизный джоб добавлен, но ни разу не проверен на тестовом теге — «должно работать». Требование: приложить ссылку на реальный релиз с артефактами. 4. Контрольные суммы публикуются, но считаются на другой машине/другом коммите, чем сборка. Сумма обязана считаться в том же джобе из того же артефакта. 5. README обновлён частично: раздел про Windows поправлен, про Linux забыт. Проверить оба. 6. При переносе в version catalog какая-то версия «заодно» поднята. Требование: диф версий пустой, сверить построчно. 7. `configuration-cache` включён, локально не проверен, CI падает. 8. LICENSE добавлена по собственному выбору исполнителя. 9. В отчёте `green` для незапущенной команды (`AGENTS.md §3`). ## Definition of Done - `git ls-files | grep dist/` пуст; свежий клон весит без бинарников. - Тег `v0.1.0-test` (или аналог) даёт релиз с двумя артефактами и файлом сумм; сумма скачанного файла совпадает с опубликованной — проверено кодером 2 самостоятельно. - README не содержит инструкций запускать файлы из репозитория. - Все версии живут в `libs.versions.toml`; сборка и тесты зелёные; диф версий пустой. - Dependabot настроен на gradle и cargo. - LICENSE (по указанию владельца), SECURITY.md, CONTRIBUTING.md, CHANGELOG.md на месте. - Сборка с новыми настройками Gradle проходит; включённые флаги реально работают. ## Required tests Продуктовых тестов задание не добавляет. Доказательства: 1. вывод `git ls-files hermes-pair/dist` — пусто; 2. размер свежего `git clone --depth 1` до и после (для варианта B — и полного клона); 3. ссылка на тестовый релиз и вывод сверки SHA-256 скачанного артефакта; 4. полный прогон проверок задания 04 после перехода на version catalog — зелёный; 5. время сборки до и после включения флагов Gradle. ## Required verification ```text ./gradlew --no-daemon testDebugUnitTest ./gradlew --no-daemon lint ./gradlew --no-daemon assembleDebug cd hermes-pair && cargo test --all-targets git ls-files | grep -c "hermes-pair/dist" || true ``` ## Result `agents/antigravity/done/TASK-2026-08-24-05-repo-hygiene.md` — разделы `## Кодер 1`, `## Кодер 2 (review + доработка)`, `## Вердикт оркестратора`. Отдельным разделом — `## Вопросы владельцу`: вариант A/B по истории, выбор лицензии, подпись Windows-бинарника.