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