Tag v0.0.4 создан и запушен, PR #24 смерджен в main (commit 8da09e6),
но deploy-hook упал на git pull origin main: host-репо
/home/slin/repos/enduro-trails имеет root-owned файл
src/api/gps_tracks/mvt.py (Permission denied при unlink) и
конфликтующие модификации tracked-файлов + untracked work-items.
У slin нет беспарольного sudo (наследие ET-011 §3). Rollback также
провалился (нет .deploy-prev-image).
Backend контейнер enduro-trails-app продолжает работать на до-ET-012
образе (Up 7 hours, unhealthy). Фронт ET-012 уже отдаётся живой
test-средой через mounted host-файлы (ручная правка ops после
ET-011), но tier-фильтр build_gps_mvt не применён.
Healthcheck/smoke: PARTIAL — все 4 URL отвечают 200, но это не
подтверждает применение ET-012 в backend. Контракт API не сломан
(REQ-F-15).
deploy_status: FAILED — корректный возврат через QG.check_deploy_status.
Что нужно от ops: см. docs/work-items/ET-012/14-deploy-log.md §6.
Refs: ET-012, ET-011 (тот же класс блокеров).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
13 KiB
deploy_status, version, work_item_id, type, created_at, authors, related, adr_refs
| deploy_status | version | work_item_id | type | created_at | authors | related | adr_refs | |||
|---|---|---|---|---|---|---|---|---|---|---|
| FAILED | v0.0.4 | ET-012 | deploy-log | 2026-06-04 |
|
|
|
Deploy Log — ET-012
- Version (tag): v0.0.4
- Date: 2026-06-04 06:42 UTC
- PR: #24 (merged via Gitea API
Do=merge, merge commit8da09e6) - Environment: test (https://openclaw.mva154.duckdns.org/enduro/)
- Healthcheck: PARTIAL (см. §5; HTTP 200, но runtime — старый образ)
- Smoke: PARTIAL (см. §5; endpoint-ответы 200, но ET-012 backend-логика НЕ применена)
- Status: FAILED — infrastructure blocker (host repo state)
1. Что сделано
- PR #24 (
feat(gps-tracks): lower public-tracks minzoom to z5 (ET-012)) смерджен вmainчерез Gitea API (POST /pulls/24/merge, body{"Do":"merge"}→200 OK). Merge-commit8da09e6(Merge pull request 'feat(gps-tracks): lower public-tracks minzoom to z5 (ET-012)' (#24) from feature/ET-012-z5-z8 into main). - Тег
v0.0.4создан отorigin/mainи запушен в Gitea (git tag v0.0.4 origin/main && git push origin v0.0.4→[new tag] v0.0.4 -> v0.0.4). Инкремент patch отv0.0.3.
2. Что НЕ сделано (и почему)
-
Deploy hook упал на
git pull origin mainна test-хосте.Запуск
ssh slin@127.0.0.1 'bash /home/slin/bin/enduro-deploy-hook.sh'→exit 1. В/var/log/enduro-trails/deploy-hook.log:[2026-06-04T06:40:49Z] Deploy hook called: From http://localhost:3000/admin/enduro-trails * branch main -> FETCH_HEAD error: unable to unlink old 'src/api/gps_tracks/mvt.py': Permission denied error: unable to create file tests/api/test_gps_mvt_simplify.py: Permission denied error: unable to create file tests/api/test_gps_mvt_zoom_tiers.py: Permission denied Updating 81c3394..8da09e6 [2026-06-04T06:40:55Z] Deploy hook called: ... error: Your local changes to the following files would be overwritten by merge: CHANGELOG.md docs/architecture/adr/README.md pyproject.toml src/web/gps_tracks.js src/web/index.html error: The following untracked working tree files would be overwritten by merge: docs/work-items/ET-012/... tests/integration/test_gps_tile_z5_z7.py tests/performance/... Please move or remove them before you merge. AbortingСостояние host-репо
/home/slin/repos/enduro-trails:- HEAD =
81c3394(отстаёт отorigin/mainна 4 коммита, включая этот ET-012-merge). - 5 модифицированных tracked-файлов (
CHANGELOG.md,docs/architecture/adr/README.md,pyproject.toml,src/web/gps_tracks.js,src/web/index.html) — судя по содержимому, кто-то вручную накатил часть фронт-изменений ET-012 прямо вworking treeпосле ET-011 deploy-блокера. - Untracked-каталог
docs/work-items/ET-012/целиком + новые тестовые файлы — кто-то вручную скопировал их на host. src/api/gps_tracks/mvt.pyпринадлежитroot:root(mtimeJun 1 17:32) — дажеgit checkout -- .отslinне удалит этот файл. Это первичная причинаPermission denied.
Все эти модификации лежат на host'е вне git'а с предыдущей попытки ручного фикса ET-011 (см. ET-011 14-deploy-log §«Что нужно от ops»). У
slinнет беспарольногоsudo(зафиксировано в ET-011 §3,sudo -n -l→a password is required), поэтому ниchown, ниrmroot-owned файла из роли deployer недоступны. - HEAD =
-
Healthcheck / smoke запускались уже на текущем running-контейнере, а не на новом образе (см. §5). Они PASS на уровне HTTP, но это не подтверждает применение ET-012 в backend.
-
Rollback также провалился:
[2026-06-04T06:42:01Z] Deploy hook called: --rollback [2026-06-04T06:42:01Z] ROLLBACK requested [2026-06-04T06:42:01Z] ROLLBACK: no previous image recorded, rollback skippedФайла
/home/slin/repos/enduro-trails/.deploy-prev-imageне существует — за всё время существования хука (включая ET-011) ни однаdeployветка не дошла до записи prev-image. Откатывать в смысле docker-образа нечего; production остался на том же контейнере, что и до этой попытки.
3. Текущее состояние production (test env)
| Слой | Что отдаёт | Ожидание ET-012 | Совпадает? |
|---|---|---|---|
GET /enduro/ |
HTML 37 KB, public-tracks hint Зум 5+ (line 80 index.html) |
hint «Зум 5+» | ✅ (но через ручную правку host, не образ) |
GET /enduro/gps_tracks.js |
JS 38 KB, const GPS_TRACKS_MIN_ZOOM = 5 |
GPS_TRACKS_MIN_ZOOM = 5 |
✅ (через mounted volume host) |
GET /enduro/api/health |
{"status":"ok",...} (200) |
200 | ✅ |
GET /enduro/api/gps-tracks/tiles/5/19/9.mvt |
200, body 4542 B | 200, body ≤ 200 KB | ✅ контракт; ⚠️ backend старый |
docker enduro-trails-app |
Up 7 hours (unhealthy) — образ собран ДО ET-012 |
новый образ с tier z5/z6/z7 в build_gps_mvt |
❌ НЕТ |
MVT tier-фильтр z=5 (min_length_m=10000, limit=1500) |
старая логика (без фильтра) | новая логика ADR-016 §T-2 | ❌ НЕТ |
Итог: фронт-часть ET-012 фактически уже видна на проде (за счёт ручной
правки host-файлов оператором между ET-011 и сейчас), а бэкенд-часть
ET-012 (tier-фильтр на z=5/6/7) — НЕ применена. Размер тайла z=5/19/9
= 4542 B; в новом коде limit=1500 (на тестовых данных всё равно
27 треков ≪ 1500), так что внешне разницы не будет до тех пор, пока
территория не наберёт > 1500 треков на тайл. Контракт API
(REQ-F-15) не сломан.
4. Acceptance Criteria — итог по AC
| AC | Что проверяли | Источник | Статус |
|---|---|---|---|
| AC-01 | GPS_TRACKS_MIN_ZOOM = 5 в JS |
gps_tracks.js:11 |
✅ (live HTTP) |
| AC-02 | source.minzoom === 5 |
DevTools, deferred | n/a (раннер недоступен; код-уровень ✅) |
| AC-03 | Линии видны на z=5 | визуальная | n/a (раннер недоступен) |
| AC-04 | Больше линий на z=6/z=7 | визуальная | n/a (раннер недоступен) |
| AC-05 | Hint «Зум 5+» на z=4 | DOM #public-tracks-zoom-hint |
✅ (HTML §3) |
| AC-06 | z≥8 не сломан (регрессия) | live MVT z=8/154/79 | ✅ (test report §5.2) |
| AC-07 | GeoJSON endpoint без регрессий | live HTTP | ✅ (test report §5.4) |
| AC-08 | Качественная читаемость | визуальная | n/a (раннер недоступен) |
| AC-09 | Тайм-аут z=5, X-Cache |
live HTTP × 10 | ✅ (test report §5.1) |
| AC-10 | Размер MVT-тайлов ≤ 200 KB | live HTTP | ✅ (test report §5.2) |
| AC-11–14, 19, 21 | unit/integration/perf/lint | tester | ✅ (test report §3-4) |
| AC-15–18 | визуальные | визуальная | n/a (раннер недоступен) |
| AC-20 | Документация ET-012 | git tree | ✅ + этот файл |
Внимание: AC-06 (регрессия z≥8) и AC-09/AC-10 (live HTTP) проходят на текущем running образе именно потому, что backend ET-012 НЕ задеплоен — как и ожидалось, изменения не сломали z≥8 (тривиально, на нём всё ещё работает старая логика). После настоящего деплоя те же кейсы должны быть перепроверены.
5. Healthcheck / smoke на текущем образе
Запросы по 4 ключевым URL (после фейла deploy-hook'а):
200 size=37252 23ms https://openclaw.mva154.duckdns.org/enduro/
200 size=38695 ~13s https://openclaw.mva154.duckdns.org/enduro/gps_tracks.js
200 size=76 10ms https://openclaw.mva154.duckdns.org/enduro/api/health
200 size=4542 9ms https://openclaw.mva154.duckdns.org/enduro/api/gps-tracks/tiles/5/19/9.mvt
Все 200, прод не сломан этим деплоем (поскольку контейнер не
рестартился). Высокий latency gps_tracks.js (~13s) — сетевой jitter
DuckDNS, аналогичный наблюдавшемуся тестером (test report §5.1
outliers #7/#8/#10).
6. Что нужно от ops, чтобы доехать
ET-011 уже описал требуемые правки /var/log/enduro-trails —
видимо они применены, потому что хук теперь успешно пишет в лог. Но
host-репо /home/slin/repos/enduro-trails остался в "грязном"
состоянии после ручных правок. Нужно (любой вариант):
- Вариант A — очистить host-репо (минимум прав):
cd /home/slin/repos/enduro-trails # удалить root-owned файлы (требует sudo) sudo rm -f src/api/gps_tracks/mvt.py # сбросить остальные правки git checkout -- . # убрать untracked git clean -fd # запустить хук заново bash /home/slin/bin/enduro-deploy-hook.sh - Вариант B — переехать на отдельный git worktree, который хук
использует только для read-only
git fetch+docker build, а prod-файлы не имеют общего volume с git-репо. Это уже сейчас напрашивается архитектурно (см. ET-011 §«Что нужно от ops» вариант B). - Вариант C — дать deployer-агенту NOPASSWD на
chown/rmв/home/slin/repos/enduro-trailsи/или наenduro-deploy-hook.shс пред-rm.
После фикса host-state повторно дернуть
bash /home/slin/bin/enduro-deploy-hook.sh от имени slin — версия
на main (8da09e6) и тег (v0.0.4) уже корректные, пересоздавать
PR/тег не нужно.
7. Артефакты
- Tag:
v0.0.4(origin/main@8da09e6) - PR: #24 (merged at 2026-06-04 06:40 UTC)
- Deploy attempts:
- 2026-06-04 06:40:49 UTC — normal deploy, RC=1 (
git pullPermission denied) - 2026-06-04 06:40:55 UTC — normal deploy retry, RC=1 (untracked overwrite)
- 2026-06-04 06:42:01 UTC —
--rollback, RC=1 (no previous image)
- 2026-06-04 06:40:49 UTC — normal deploy, RC=1 (
- Deploy log on host:
/var/log/enduro-trails/deploy-hook.log - Container in production:
enduro-trails-app—Up 7 hours (unhealthy), pre-ET-012 image
8. Подытоживая
deploy_status: FAILED. Этот тег v0.0.4 существует в git, PR смерджен,
но бэкенд ET-012 (tier-фильтр в build_gps_mvt для z=5/6/7) на проде
не работает. Фронт-часть видна за счёт ручной правки host'а до этой
попытки — это не результат данного deploy-run'а.
Возврат задачи через QG (check_deploy_status) ожидаем и корректен.
Деплоить ET-012 будет повторно после фикса host-state (см. §6) — без
вмешательства developer/tester/reviewer (код уже в main).