diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 139f802..7b9a325 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,53 +1,70 @@ -_last_updated_: 2026-08-20T22:00:00Z -session_id: publish-dryrun-contract-blocked-2026-08-20 +_last_updated_: 2026-08-20T22:25:00Z +session_id: publish-mock-reject-2-readfile-deps-2026-08-20 --- # Next session handoff -Сессия: **cancel-канал закрыт (schedd 0.9.0, тест зелёный)**, но мок-publish **ЗАБЛОКИРОВАН** — -найден сломанный контракт dryRun в ozon. Письмо отправлено, ждём их фикс + отчёт. +Сессия: **cancel-канал закрыт (0.9.0, тест зелёный)**, контракт dryRun в ozon **починен и принят** (297bc31), +но **2-й режект ozon**: реальный publish падает `readFile is not a function` — deps без readFile/writeFile. +Мок-publish заморожен до фикса #2. -## 🔴 БЛОКЕР: ozon publish-dryrun-contract-broken (письмо 21:55Z) +## 🔴 БЛОКЕР (2-й режект): ozon readFile-deps (письмо 22:20Z) -**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-фоллбек). +**Симптом на стенде:** снял dryRun:true (tasks.json → render-tasks.cjs, schedd рестарт, +ozon dryRun:false подтверждён) → полный ран ozon: стадии 8/10 прошли, publish упал: +``` +[stage] publish start +❌ error: readFile is not a function +``` -**Контракт (сосед yandex делает ПРАВИЛЬНО, worker/stages/publish.js:92):** -`data = ctx.data ?? {}` (плоский envelope.data) → `dryRun = typeof data.dryRun === 'boolean' ? data.dryRun : env`. +**Root cause:** `runPublish` деструктурирует `readFile/writeFile/removeFile` из deps +(service/publish.js:254; npmPublish→preparePackage вызывает `await readFile(...)`). +Но **оба** продакшн-пути передают в deps только `exec/httpGetFn/httpPostFn`: +- `generator/worker/server.js` createPublishStage +- `service/entrypoint.js:126` (cron-путь) +→ readFile = undefined → реальный publish падает на первой же строке. Dry-run путь +(dryRunDiff) readFile не использует — поэтому dry-прогоны были зелёные. -**Что требует письмо от 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.** +**Разрыв тест/прод:** их e2e `server-publish.test.js:275` (e2ePublishWorker) подставлял +`readFile: (f,enc) => fs.promises.readFile(f,enc)` в deps руками → тест зелёный, прод падает. + +**ТЗ в письме:** (1) server.js + entrypoint.js — добавить readFile/writeFile/removeFile +(async-обёртки fs.promises) в deps, обе точки конформны; (2) e2e должен использовать +ТУ ЖЕ фабрику deps что прод (не подставлять руками) ИЛИ тест createPublishStage с +дефолтными deps + dryRun:false → не падает; (3) сьют без регрессий; (4) отчёт письмом. + +## ✅ Принято (фикс #1, ozon 297bc31 — проверено независимо) + +- Контракт dryRun выровнен: `...(payload || {})` вместо `...(payload.data || {})` + (server.js:161). В sched-режиме payload = envelope.data целиком — плоский spread. +- Проверил сам: коммит в репо, код в пересобранном контейнере, `node --test` 202/202 (12.9s), + e2e `data.dryRun=false` при DRY_RUN=1 → реальный publish; `data.dryRun=true` → dryRunDiff. +- Yandex: `worker/stages/publish.js:92` плоский `data.dryRun` — правильный контракт; + прямые fs.readFileSync — дыры readFile-deps НЕТ. ## Стенд (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). +- schedd 0.9.0 healthy. ozon контейнер пересобран (фикс #1 внутри). +- **tasks.json: dryRun:false у ОБОИХ тасок** (снял по GO user'а), tasks.generated.json + отрендерен, schedd рестартнут — ozon dryRun:false активен (проверено через API). +- Ozon state.json обновился (initial ран записал sha) — следующий ран пойдёт diff-путь + (не initial). Стадии 8/10 прошли, publish упал. +- Остальные контейнеры Up. -## Мок-publish — ЗАМОРОЖЕН +## Мок-publish — ЗАМОРОЖЕН до фикса #2 -- yandex готов (13/13 dry, контракт правильный). ozon НЕ готов — контракт сломан, фикс от них. -- Снять dryRun:true можно ТОЛЬКО после письма-отчёта от ozon + повторной проверки контракта. -- Репо руками не создаём — create-if-missing воркеров (тестируемый сценарий). +Порядок после фикса: пересобрать ozon → ран (diff-путь, publish) → проверить мутации +verdaccio (@apilki/ozon-seller версия) + Gitea (репо/релизы apilki) → затем yandex +(13/13 с publish+githubDistro). ## Спроси user'а -1. Проверить письмо-отчёт ozon → если фикс корректный, GO на мок-publish (снять dryRun:true → verdaccio+Gitea). +1. Проверить отчёт ozon по фиксу #2 → GO на повторный мок-publish. 2. VDS-миграция — после пары дней локально. ## Не делать - Не запускать реальные публикации в npmjs/github.com без явного GO. - Не слать реальные письма unisender — только мок. -- Не патчить код команд — ТЗ через их инбоксы (письмо уже отправлено). -- Не коммитить в репо команд — только в .admin. Письма доставляются на диск (inbox-монитор), не коммитятся. +- Не патчить код команд — ТЗ через их инбоксы (письма 21:55Z + 22:20Z отправлены). +- Не коммитить в репо команд — только в .admin. Письма доставляются на диск (inbox-монитор). diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 3d03cb3..b10aa4c 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.9.0 применён + cancel-тест ЗЕЛЁНЫЙ**. **НО мок-publish ЗАБЛОКИРОВАН**: контракт dryRun в ozon сломан (`payload.data` вместо плоского `payload` → data.dryRun=false не доезжает до publish-стадии, env DRY_RUN=1 всегда выигрывает). Письмо-ТЗ отправлено (21:55Z), ждём фикс + отчёт. Yandex контракт правильный. +_Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** schedd **0.9.0 применён + cancel-тест ЗЕЛЁНЫЙ**. **Мок-publish ЗАБЛОКИРОВАН (2-й режект ozon)**: контракт dryRun починен (297bc31, 202/202, e2e зелёные — проверено независимо), но реальный publish падает `readFile is not a function` — deps без readFile/writeFile в server.js+entrypoint.js (тест подставлял их руками → разрыв тест/прод). Письмо-режект 22:20Z, ждём фикс #2. ## 🟡 [sched-pipelines-local-stack] — локальный стенд: sched daemon + ym/ozon воркеры + browser/ntfy/alert-bridge, потом VDS **Status:** active -**Where I stopped:** schedd **0.9.0** применён (verdaccio latest, core 0.48.0), commit 225d235c. **Cancel-тест зелёный**: полный ран ozon → cancel на generate → `[sched] [cancel] POST .../cancel/` + `ack status=200`; воркер `[cancel] received`/`flag set`, `[stage] generate done` → `[cancel] stop before stage fix`; стадии после НЕ шли; state.json остался {}; ран cancelled. **БЛОКЕР мок-publish**: ozon server.js:159 читает `payload.data` (вложенный) — в sched-режиме payload = envelope.data целиком, вложенного data нет → mergedData.dryRun всегда undefined → effectiveDryRun = env DRY_RUN = true всегда. Снятие dryRun:true в таске не перебивает env — ozon publish навсегда в dry-runDiff. yandex контракт правильный (плоский data.dryRun). Письмо-ТЗ ozon: 2026-08-20T21-55-00Z-admin.md. Инцидент с github.com-репо (yandex) — закрыт. -**Next action:** (1) ✅ schedd 0.9.0 + cancel-тест — DONE; (2) 🔴 **ждать фикс ozon (publish-dryrun-contract-broken) + их отчёт** → проверить контракт → GO user'а на мок-publish (снять dryRun:true → verdaccio+Gitea); (3) VDS-миграция (после пары дней локально). +**Where I stopped:** schedd **0.9.0** (verdaccio latest, core 0.48.0), commit 225d235c. Cancel-тест зелёный (стоп воркера до publish). **Мок-publish**: снял dryRun:true в tasks.json (render-tasks), schedd рестартнут (dryRun:false активен), полный ран ozon — стадии 8/10 прошли, **publish упал `readFile is not a function`**: runPublish деструктурирует readFile из deps (service/publish.js:254, npmPublish→preparePackage), а server.js+entrypoint.js передают только exec/httpGetFn/httpPostFn. Их e2e-тест подставлял readFile руками (server-publish.test.js:275) — разрыв тест/прод, тест зелёный а прод падает. Письмо-режект 22:20Z (ТЗ: добавить readFile/writeFile/removeFile в deps обеих точек + тест на реальную фабрику deps). Фикс #1 (dryRun-контракт, 297bc31) — принят, проверен независимо (202/202, e2e dryRun=false→real, dryRun=true→dryRunDiff). Yandex — прямые fs.readFileSync, дыры нет. +**Next action:** (1) ✅ schedd 0.9.0 + cancel-тест — DONE; (2) 🔴 **ждать фикс #2 ozon (readFile deps) + отчёт** → пересобрать контейнер → повторный мок-publish ран ozon → проверить verdaccio+Gitea мутации → затем yandex; (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/._