diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index a16c8b0..dc535fc 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -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 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=...` + `[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. diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index d5c8cbe..43c3305 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,10 +1,10 @@ # Admin Task Board -_Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** schedd 0.5.0 применён; одновременный dry-run ozon+yandex через sched — оба зелёные (ozon 8/8, ym 11/11). timeoutMs -1 не применился (баг sched applyTask — письмо 19:30Z, требование vitya: -1=дефолт). Мок-publish: ТЗ обеим командам (publish-mockable). GO на реальный прогон не дан. +_Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** schedd **0.9.0 применён + cancel-тест ЗЕЛЁНЫЙ** (cancel реально останавливает воркера ДО publish: generate done → stop before stage fix; fix/build/postman/state/publish не выполнялись, state.json остался {}, ран cancelled). Мок-publish dry оба зелёные ранее (ozon 10/10, yandex 13/13). Осталось: GO на реальный мок-publish (снять dryRun:true) + VDS-миграция. ## 🟡 [sched-pipelines-local-stack] — локальный стенд: sched daemon + ym/ozon воркеры + browser/ntfy/alert-bridge, потом VDS **Status:** active -**Where I stopped:** schedd **0.8.0** (нужно 0.9.0 — cancel-форвардинг фикс НЕ применён, см. NEXT_SESSION CRITICAL). Мок-publish dry **оба зелёные** (yandex 13/13 вкл publish+githubDistro, ozon 10/10 вкл publish; GitHub/Gitea/verdaccio чисты, ноль мутаций). Cancel-канал: все команды закрыли свои части (sched 0.7.0 канал + 0.8.0 логи; ozon 0649c80+f021f38; yandex e7cf3e5+c740bdc). **Root cause cancel-бага: sched daemon-диспетчер не форвардил cancel к раннеру** — сигнал не слался никогда; фикс daemon 0.9.0 на verdaccio. Инцидент: yandex создал репо на github.com при мок-прогоне (publish без dry-run + cancel не остановил) — удалено, всё чисто. -**Next action:** (1) schedd 0.9.0 + повторный cancel-тест (стоп воркера до publish); (2) GO на реальный мок-publish (снять dryRun:true → verdaccio+Gitea); (3) VDS-миграция. +**Where I stopped:** schedd **0.9.0** применён (verdaccio latest, core 0.48.0), commit 225d235c. **Cancel-тест зелёный**: полный ран ozon → cancel на generate → `[sched] [cancel] POST http://ozon-seller-builder:8080/cancel/` + `ack status=200`; воркер `[cancel] received`/`flag set`, `[stage] generate done` → `[cancel] stop before stage fix`; fix/build/postman/state/publish НЕ выполнялись; state.json остался {}; ран `cancelled (error: cancelled by user)`. Инцидент с github.com-репо (yandex) — закрыт (репо удалено, GitHub/Gitea чисты). Мок-publish dry: yandex 13/13 (publish+githubDistro), ozon 10/10 (publish) — оба зелёные, ноль мутаций. +**Next action:** (1) ✅ schedd 0.9.0 + cancel-тест — DONE; (2) **ждать GO user'а на реальный мок-publish** (снять dryRun:true → verdaccio+Gitea); (3) VDS-миграция (после пары дней локально). **Branch:** master **Weight:** needs-claude _Updated: 2026-08-19 — 🟢 **[sched-fnf-r10] ЗАКРЫТ (их ack 17:24Z): 6/6 PASS, 0 находок, 0 замечаний** — первый раунд без фиксов после режекта. Per-task alert routing (core 0.44.0/daemon 0.4.2): r10-a регресс, r10-b on:[] тишина (массивы replace), r10-c per-task on, r10-d per-task onMissed (missed-slot только для A, delayMs 129016), r10-e мультиканал (+без корневого webhook), r10-f fail-fast на load (3 варианта). Бонус HMAC MATCH. Процесс: раунд начинался с режекта (доки не сгенерированы/битый пример/не запушено), их фикс + push + сгенерированный dist + исправленный пример → ретест 6/6. Урок: F&F тестируется по СКОМПИЛИРОВАННОЙ доке (dev-сервер localhost:5108), не по сырцам; порядок хендоффа 1–6 у них в fnf-testing-procedure.md. Репорт: sched/.agents/inbox/2026-08-19T17-24-00Z-admin-fnf-r10-report.md. Стенд: /tmp/sched-alerts-stand/r10/._