hermes-android/agy-work/TASK-2026-08-24-05-repo-hygiene.md

12 KiB
Raw Blame History

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, первая запись фиксирует состояние после заданий 0104.

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 — задания 0103.
  • Версии зависимостей — только перенос, без обновления.
  • Конфигурацию 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

./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-бинарника.