117 lines
12 KiB
Markdown
117 lines
12 KiB
Markdown
# 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-бинарника.
|