13 KiB
Task 11: Зелёный пайплайн и достоверность отчётов (hermes-android)
Repo: ochenstarik-ui/hermes-android
Assigned to: Antigravity (режим оркестратора, два кодера)
Priority: BLOCKER (десять заданий приняты по непроверенным отчётам)
Date: 2026-08-25
Base SHA: bf4e2db (task 10)
Статус
Задания 01–10 выполнены и запушены. Существенная часть работы сделана корректно: мёртвый слой удалён, R8 включён, строки вынесены в ресурсы, таймлайн атомарен, порядок событий детерминирован.
Но CI не отработал ни одного раза за всё время. Все прогоны после задания 04 красные, включая три последних пуша:
32764324445 task 10 failure
32760656082 task 09 failure
32758701648 task 08 failure
32753786705 task 07 failure
32750927851 task 06 failure
Значит: юнит-тесты, lint, assembleDebug и инструментальные тесты в CI не выполнялись ни разу ни на одном коммите. Все отчёты, заявляющие «83/83 passed», «BUILD SUCCESSFUL», «0 errors», опираются на локальные прогоны gradlew.bat на Windows-хосте. Ни один из них не подтверждён средой, которую задание 04 объявило работающей.
Проблема
1. gradlew без бита исполнения. В индексе git режим 100644:
$ git ls-files -s gradlew
100644 faf93008b77e7b52e18c44e4eef257fc2f8fd76d 0 gradlew
Оба Android-джоба падают на первом же шаге:
/home/runner/work/_temp/....sh: line 1: ./gradlew: Permission denied
##[error]Process completed with exit code 126
Шаги Run Android Lint и Assemble Debug APK в логе помечены - — они не запускались. Джоб инструментальных тестов падает там же, после adb ... failed with exit code 1.
2. Clippy падает на коде задания 07. Не исправлено с 2026-08-24:
error: this `if` statement can be collapsed
--> src/pairing.rs:190:5
= note: `-D clippy::collapsible-if` implied by `-D warnings`
error: could not compile `hermes-pair` (lib) due to 1 previous error
3. Ложное «закрыто» в итоговой таблице задания 10.
| SEC-02 | ... | 06 | закрыто | 861e04b (hermes://auth-callback) |
| BUILD-03 | ... | 04 | закрыто | 3ec16c4 |
SEC-02 не закрыт: живой путь входа по-прежнему открывает loopback-сокет (подробности — задание 12). BUILD-03 не закрыт: пайплайн не отработал ни разу. Анти-чеклист задания 10 пункт 11 предупреждал ровно об этом и был отмечен пройденным.
4. Таймингозависимые ожидания вернулись. Задание 04 убрало пять delay(50), задания 02, 08 и 09 внесли семь новых:
app/src/test/java/app/hermes/mobile/core/network/ReadyDeferredRaceTest.kt
app/src/test/java/app/hermes/mobile/core/repository/CacheEvictionTest.kt
app/src/test/java/app/hermes/mobile/core/repository/SessionCreateRaceTest.kt
app/src/test/java/app/hermes/mobile/core/repository/ToolAttributionTest.kt
5. Мусор в репозитории. agy-work/ — 11 продублированных файлов заданий вне agents/<agent-id>/, что запрещает AGENTS.md §4. schemas/1.json в корне — осиротевший дамп схемы Room из задания 02, рабочие схемы лежат в app/schemas/.
6. Битая строка манифеста. AndroidManifest.xml:7 — <uses-feature .../> и <uses-permission .../> склеены в одну строку.
Роли и протокол
| Роль | Модель | Что делает |
|---|---|---|
| Оркестратор | Antigravity | Маршрутизирует, принимает результат |
| Кодер 1 | Gemini Flash 3.7 high | Пункты 1–6 §Scope |
| Кодер 2 | Gemini Pro high | Независимая проверка, доводка, пункт 7 |
Изменение протокола приёмки, действует с этого задания и далее.
Отчёт больше не является доказательством. Пункт §Required verification считается выполненным только при выполнении обоих условий:
- приложен вывод
gh run list --limit 5с прогоном на итоговом SHA в статусеsuccess; - приложен вывод
gh run view <id>со всеми джобами в✓.
Формулировки «BUILD SUCCESSFUL», «tests passed», «green» без этих двух выводов не принимаются ни от одного из кодеров. Локальный прогон на Windows — вспомогательное свидетельство, а не замена.
Scope
1. Бит исполнения.
git update-index --chmod=+x gradlew
Проверить git ls-files -s gradlew → 100755. Убедиться, что в .gitattributes нет правила, сбрасывающего режим.
2. Clippy. Схлопнуть вложенный if в hermes-pair/src/pairing.rs:190:
if (!trimmed_host.starts_with('[') || !trimmed_host.ends_with(']'))
&& trimmed_host.contains(':')
{
return Err(PairingError::InvalidHost(format!(
"Host '{}' contains forbidden colon delimiter outside IPv6 brackets",
payload.host
)));
}
Затем прогнать cargo clippy --all-targets -- -D warnings локально и убедиться, что других предупреждений нет: CI проверяет только --lib по текущей конфигурации, а после фикса могут вскрыться остальные.
3. Джоб инструментальных тестов.
После пункта 1 перезапустить и разобрать, проходит ли эмулятор. Если adb ... exit code 1 сохранится — диагностировать отдельно: уровень API, arch, таймаут загрузки, disable-animations. Джоб обязан быть либо зелёным, либо с явно зафиксированной причиной невозможности запуска на раннере — но не отключённым и не с continue-on-error.
4. Детерминированные ожидания. Семь delay(50) в четырёх файлах перевести на runTest с виртуальным временем, advanceUntilIdle() и Turbine. Ассерты не менять — только способ ожидания; сверить построчно до и после.
5. Уборка. Удалить agy-work/ и schemas/1.json. Черновики держать в agents/antigravity/notes/. Починить строку 7 манифеста.
6. Прогон и фиксация. Довести пайплайн до полностью зелёного состояния на итоговом SHA и приложить оба вывода из §Роли.
7. Ревизия таблицы сверки (кодер 2). Пройти таблицу «находка → задание → статус» из отчёта задания 10 по всем 63 позициям заново, сверяя с кодом и с логами CI, а не с отчётами предыдущих заданий. Каждую позицию подтвердить или переоткрыть. Как минимум:
SEC-02→ открыто, перенесено в задание 12;BUILD-03→ открыто, закрывается этим заданием;DATA-01→ сверить: миграция подтверждается только зелёнымconnectedDebugAndroidTest, до тогоUNVERIFIED;- все позиции, чей статус опирался на «BUILD SUCCESSFUL» из отчётов, пересчитать после первого зелёного прогона.
Исправленную таблицу поместить в отчёт этого задания. Отчёт задания 10 не переписывать — он остаётся историческим документом; расхождение фиксируется здесь.
Do not change
- Продуктовую логику заданий 01–10. Это задание чинит инфраструктуру и достоверность, а не поведение.
PkceLoopbackAuthManagerиnetwork_security_config.xml— задание 12.dismissClarify— задание 12.- Ассерты существующих тестов.
- Версии зависимостей.
Anti-checklist
- Бит выставлен локально, но не закоммичен:
git ls-files -sпо-прежнему100644. Проверять индекс, а не рабочее дерево — этот фикс уже один раз не долетел. - Вместо бита в workflow добавлен
chmod +x gradlewшагом. Это маскировка: любой другой потребитель репозитория останется сломанным. Требуется именно режим в индексе. - Clippy починен, но прогон делался с
--lib; на--all-targetsвылезли новые ошибки, и они «отложены». - Джоб эмулятора обойдён через
continue-on-error,if: falseили удаление. delay(50)заменены наThread.sleepили на увеличенные таймауты.- Ассерты изменены заодно с переводом ожиданий.
- В отчёте снова «BUILD SUCCESSFUL» без вывода
gh run view. - Таблица сверки скопирована из задания 10 с точечной правкой двух строк вместо повторного прохода по 63 позициям.
- Позиции, закрытые в 01–10 на основании локальных прогонов, оставлены «закрыто» без подтверждения первым зелёным CI.
Definition of Done
git ls-files -s gradlew→100755вorigin/main.- Полный прогон CI на итоговом SHA: все джобы
✓, приложены выводыgh run listиgh run view. - Отдельным прогоном подтверждено, что намеренно сломанный юнит-тест валит пайплайн — приложен лог, коммит откачен.
cargo clippy --all-targets -- -D warningsчистый.- Ни одного
delay-ожидания в тестах; ассерты не изменены. agy-work/иschemas/1.jsonотсутствуют; манифест валиден и отформатирован.- Таблица сверки пересчитана по коду и логам,
SEC-02иBUILD-03переоткрыты, каждая из 63 позиций имеет статус, подтверждённый ссылкой на код, коммит или лог CI.
Required verification
git ls-files -s gradlew
gh run list --limit 5
gh run view <run-id>
cd hermes-pair && cargo clippy --all-targets -- -D warnings
Локальные прогоны Gradle прикладывать дополнительно, но они не заменяют CI.
Result
agents/antigravity/done/TASK-2026-08-25-11-green-pipeline.md — разделы ## Кодер 1, ## Кодер 2 (review + доработка + пункт 7), ## Пересчитанная таблица по 63 находкам, ## Вердикт оркестратора.
BLOCKER не закрывается по заявлению исполнителя. Пока в отчёте нет gh run view с зелёными джобами, задание считается невыполненным независимо от содержания остального текста.