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

117 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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