--- _last_updated_: 2026-08-21T01:40:00Z session_id: sched-cancel-rootcause-2026-08-21 --- # Next session handoff Сессия: cancel-канал доведён до root cause (баг sched daemon-диспетчера), фикс 0.9.0 НЕ применён — первым делом. ## 🔴 CRITICAL: применить 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 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` в таске — безопасно в любом случае. ## Стенд (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/. ## Мок-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 чисты — ноль мутаций. - Репо руками НЕ создаём — 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-миграция — после пары дней локально. ## Не делать - Не запускать реальные публикации (publish/githubDistro без dryRun:true) без явного GO. - Не слать реальные письма unisender — только мок. - Не патчить код команд — ТЗ через их инбоксы/доски. - Не коммитить в репо команд — только в .admin.