режект #2 ozon: readFile is not a function (deps без readFile/writeFile в server.js+entrypoint.js, тест подставлял руками); ждём фикс
This commit is contained in:
@@ -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-монитор).
|
||||
|
||||
Reference in New Issue
Block a user