Files
admin/.tasks/NEXT_SESSION.md

5.6 KiB
Raw Blame History

_last_updated_, session_id
_last_updated_ session_id
2026-08-21T01:40:00Z 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 <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 в таске — безопасно в любом случае.

Стенд (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.