доска+хендофф: cancel-тест зелёный, schedd 0.9.0, ждём GO на мок-publish

This commit is contained in:
2026-08-21 00:48:23 +03:00
parent 225d235cd5
commit 415134b929
2 changed files with 23 additions and 42 deletions

View File

@@ -1,61 +1,42 @@
---
_last_updated_: 2026-08-21T01:40:00Z
session_id: sched-cancel-rootcause-2026-08-21
_last_updated_: 2026-08-20T22:00:00Z
session_id: sched-cancel-fixed-2026-08-20
---
# Next session handoff
Сессия: cancel-канал доведён до root cause (баг sched daemon-диспетчера), фикс 0.9.0 НЕ применён — первым делом.
Сессия: **cancel-баг закрыт** — schedd 0.9.0 применён, cancel-тест зелёный. Ждём GO на реальный мок-publish.
## 🔴 CRITICAL: применить schedd 0.9.0 и повторить cancel-тест
## ✅ DONE: schedd 0.9.0 применён + cancel-тест ЗЕЛЁНЫЙ
**sched нашёл root cause cancel-бага (письмо 21:27:46Z):**
- daemon-диспетчер НЕ форвардил `cancel` к per-task раннеру — обёртка Runner содержала только `{run, poll}`, без `cancel`. `runner.cancel` = undefined → `if (ar.cancelUrl && runner.cancel)` = false → **сигнал не слался никогда**, ран финишил `cancelled` с чистым error (провала нет → `signal failed` не откуда). Воркер продолжал стадии.
- Логи 0.8.0 в этом случае врали: `[cancel] no cancelUrl — legacy stop-polling`, хотя cancelUrl был в envelope.
- **Фикс: daemon 0.9.0** (core 0.48.0 остаётся), commit a6c8a4b, на verdaccio latest. Диспетчер форвардит cancel по task.runner; нет хука → no-op.
**Что сделать:**
1. `schedd.Dockerfile`: `@sched/daemon@0.8.0``@sched/daemon@0.9.0` (host-stacks/local/sched-pipelines/)
2. `docker compose up -d --build schedd`
3. Повторить cancel-тест: ран ozon (state сброшен в {} — full run) → cancel на generate → по логам `[sched] [cancel] POST <cancelUrl> runId=...` + `[cancel] ack status=200` + воркер `[cancel] received` + `[cancel] stop before stage ...` + `[stage] ... done` — стоп ДО publish.
4. Если после ack стадии продолжаются — баг воркера (флаг не проверяется), контракт-ревью с sched.
**Важно про cancel-тест:** cancel теперь реально остановит воркер (если 0.9.0 работает) — воркер не будет публиковать после cancel. Но publish у ozon с `dryRun: true` в таске — безопасно в любом случае.
- `schedd.Dockerfile`: `@sched/daemon@0.8.0``@sched/daemon@0.9.0` (verdaccio latest, core 0.48.0), commit `225d235c`, запушен.
- `docker compose up -d --build schedd` — контейнер healthy.
- Cancel-тест (полный ран ozon, state {} → full run, cancel на generate):
- schedd: `[sched] [cancel] POST http://ozon-seller-builder:8080/cancel/<runId> runId=...` + `[cancel] ack runId=... status=200`**форвардинг реально слал сигнал** (в 0.8.0 не слался никогда).
- воркер: `[cancel] received runId=...` + `[cancel] flag set`; generate докрутился → `[stage] generate done``[cancel] stop before stage fix`.
- Стадии fix/build/postman/state/publish **НЕ выполнялись**; state.json остался `{}`; ран `cancelled (error: cancelled by user)`.
- Root cause подтверждён: daemon-диспетчер не форвардил cancel → теперь форвардит по task.runner, нет хука → no-op.
## Стенд (host-stacks/local/sched-pipelines)
- schedd **0.8.0** (нужно 0.9.0!), ym-client-builder свежий (e7cf3e5 cancel-канал + c740bdc логи), ozon свежий (0649c80 + f021f38 логи).
- tasks.json: ozon stages [...publish] dryRun:true; yandex stages [...publish, githubDistro] dryRun:true. DRY_RUN=1 в compose (безопасный дефолт).
- Ozon state.json на хосте (bind-mount), сейчас {} (сброшен тестами) — следующий ран полный (initial).
- Все контейнеры Up. Исключение: **озон-контейнер был пересоздан** (docker rm + up) — образ тот же, данные в data-ozon/.
- schedd 0.9.0, ym-client-builder свежий (cancel-канал + логи), ozon свежий. Все контейнеры Up, schedd healthy.
- tasks.json: ozon stages [...publish] dryRun:true; yandex stages [...publish, githubDistro] dryRun:true. DRY_RUN=1 в compose.
- Ozon state.json на хосте (bind-mount), `{}` — следующий ран полный (initial).
## Мок-publish статус
- **Мок-npm = verdaccio** (verdaccio.kzntsv.site), **мок-GitHub = Gitea** (git.kzntsv.site, орга `apilki` создана, API v1, push x-access-token:TOKEN@ проверен).
- **Оба dry-publish зелёные**: yandex 13/13 (publish+githubDistro, reposToCreate честно показан), ozon 10/10 (publish dryRun preview). GitHub/Gitea/verdaccio чисты — ноль мутаций.
- **Мок-npm = verdaccio** (verdaccio.kzntsv.site), **мок-GitHub = Gitea** (git.kzntsv.site, орга `apilki`, push x-access-token:TOKEN@ проверен).
- **Оба dry-publish зелёные**: yandex 13/13 (publish+githubDistro), ozon 10/10 (publish dryRun preview). GitHub/Gitea/verdaccio чисты — ноль мутаций.
- Репо руками НЕ создаём — create-if-missing воркеров (тестируемый сценарий).
- data dryRun в тасках: `registry/remoteBase/githubApiBase` через `__PUBLISH_*__` плейсхолдеры в render-tasks.cjs (из .env, gitignored).
## Команды — все таски закрыты, ждём только применение
- **sched**: timeoutMs (0.6.0), dry-run контракт (0.7.0 был... нет — 0.7.0 это cancel-канал), cancel-канал (0.7.0), cancel-логи (0.8.0), **cancel-форвардинг фикс (0.9.0 — НЕ применён)**.
- **ozon**: publish-mockable ✅, gitea-mock-publish ✅, dry-run-contract-align ✅, worker-cancel-url ✅, cancel-signal-logging ✅.
- **yandex**: publish-mockable ✅, gitea-mock-publish ✅, dry-run-contract-align ✅, worker-cancel-url ✅, cancel-signal-logging ✅.
## Инцидент сессии (важно для истории)
- Yandex **создал репо на github.com** (apilki/yandex-market-typescript) при мок-прогоне — потому что (а) publish без dry-run (тогда ещё не было фикса) и (б) cancel не остановил воркер (баг sched daemon-диспетчера). Репо **удалено** (204→404), npmjs не тронут, verdaccio пуст. GitHub/Gitea сейчас чисты.
- Урок: yandex publish реальный без dryRun — не запускать publish/githubDistro без явного dryRun:true или GO.
## Спроси user'а
1. Применить schedd 0.9.0 + повторить cancel-тест (см. CRITICAL).
2. GO на реальный мок-publish (снять dryRun:true, публиковать в verdaccio+Gitea) — после зелёного cancel-теста.
3. VDS-миграция — после пары дней локально.
1. **GO на реальный мок-publish**: снять `dryRun:true` → воркеры реально публикуют в verdaccio (npm) + Gitea (репо/релизы). Теперь безопасно: cancel останавливает воркера, dry-run инфраструктура мок-окружения (не npmjs/github.com).
2. VDS-миграция — после пары дней локально.
## Не делать
- Не запускать реальные публикации (publish/githubDistro без dryRun:true) без явного GO.
- Не слать реальные письма unisender — только мок.
- Не запускать реальные публикации в npmjs/github.com (реальный publish без dryRun на реальные endpoints) без явного GO.
- Не слать реальные письма unisender — только мок (unisender-mock).
- Не патчить код команд — ТЗ через их инбоксы/доски.
- Не коммитить в репо команд — только в .admin.