_last_updated_: 2026-08-20T22:00:00Z session_id: publish-dryrun-contract-blocked-2026-08-20 --- # Next session handoff Сессия: **cancel-канал закрыт (schedd 0.9.0, тест зелёный)**, но мок-publish **ЗАБЛОКИРОВАН** — найден сломанный контракт dryRun в ozon. Письмо отправлено, ждём их фикс + отчёт. ## 🔴 БЛОКЕР: ozon publish-dryrun-contract-broken (письмо 21:55Z) **Root cause:** `generator/worker/server.js:159` читает `payload.data` (вложенный ключ), но в sched-режиме `payload` = `envelope.data` ЦЕЛИКОМ (worker-http.js:88) — вложенного `data` в таске нет. → `mergedData.dryRun` всегда `undefined` → `effectiveDryRun` = env `DRY_RUN` = **true всегда** (compose DRY_RUN=1). Снятие `dryRun:true` в таске НЕ перебивает env — publish-стадия ozon навсегда в dry-runDiff. Та же дыра для registry/remoteBase/githubApiBase (читаются как `payload.data.*` → undefined → env-фоллбек). **Контракт (сосед yandex делает ПРАВИЛЬНО, worker/stages/publish.js:92):** `data = ctx.data ?? {}` (плоский envelope.data) → `dryRun = typeof data.dryRun === 'boolean' ? data.dryRun : env`. **Что требует письмо от ozon:** 1. server.js: `...((payload && payload.data) || {})` → spread плоского payload `...(payload || {})` (или читать `payload.dryRun` и т.д. напрямую), комментарий обновить. 2. Тот же плоский контракт в entrypoint.js cron-пути. 3. Тест: envelope data.dryRun:false → реальный publish (мутации); data.dryRun:true → dryRunDiff; отсутствие → env-фоллбек. 4. Сьют без регрессий. 5. **Отчёт письмом в .admin.** ## Стенд (host-stacks/local/sched-pipelines) - schedd **0.9.0** (cancel-форвардинг, commit 225d235c), healthy. Cancel-тест зелёный (generate done → stop before stage fix; стадии после не шли; state.json остался {}). - tasks.json: ozon+yandex dryRun:true (DRY_RUN=1 в compose). **НЕ трогать, пока ozon не фикснет.** - ym-client-builder / ozon-seller-builder / browser / ntfy / alert-bridge / unisender-mock — Up. - Ozon state.json на хосте, `{}` — следующий ран полный (initial). ## Мок-publish — ЗАМОРОЖЕН - yandex готов (13/13 dry, контракт правильный). ozon НЕ готов — контракт сломан, фикс от них. - Снять dryRun:true можно ТОЛЬКО после письма-отчёта от ozon + повторной проверки контракта. - Репо руками не создаём — create-if-missing воркеров (тестируемый сценарий). ## Спроси user'а 1. Проверить письмо-отчёт ozon → если фикс корректный, GO на мок-publish (снять dryRun:true → verdaccio+Gitea). 2. VDS-миграция — после пары дней локально. ## Не делать - Не запускать реальные публикации в npmjs/github.com без явного GO. - Не слать реальные письма unisender — только мок. - Не патчить код команд — ТЗ через их инбоксы (письмо уже отправлено). - Не коммитить в репо команд — только в .admin. Письма доставляются на диск (inbox-монитор), не коммитятся.