12 KiB
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
dist/**удалён из рабочего дерева, но не добавлен в.gitignore— вернётся следующей же сборкой.- Файлы удалены и одновременно переписана история без ответа владельца. Это нарушение §Требует решения владельца.
- Релизный джоб добавлен, но ни разу не проверен на тестовом теге — «должно работать». Требование: приложить ссылку на реальный релиз с артефактами.
- Контрольные суммы публикуются, но считаются на другой машине/другом коммите, чем сборка. Сумма обязана считаться в том же джобе из того же артефакта.
- README обновлён частично: раздел про Windows поправлен, про Linux забыт. Проверить оба.
- При переносе в version catalog какая-то версия «заодно» поднята. Требование: диф версий пустой, сверить построчно.
configuration-cacheвключён, локально не проверен, CI падает.- LICENSE добавлена по собственному выбору исполнителя.
- В отчёте
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
Продуктовых тестов задание не добавляет. Доказательства:
- вывод
git ls-files hermes-pair/dist— пусто; - размер свежего
git clone --depth 1до и после (для варианта B — и полного клона); - ссылка на тестовый релиз и вывод сверки SHA-256 скачанного артефакта;
- полный прогон проверок задания 04 после перехода на version catalog — зелёный;
- время сборки до и после включения флагов Gradle.
Required verification
./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-бинарника.