diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 7b9a325..d0a45b2 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,70 +1,55 @@ -_last_updated_: 2026-08-20T22:25:00Z -session_id: publish-mock-reject-2-readfile-deps-2026-08-20 +_last_updated_: 2026-08-20T22:50:00Z +session_id: publish-mock-reject-3-git-identity-2026-08-20 --- # Next session handoff -Сессия: **cancel-канал закрыт (0.9.0, тест зелёный)**, контракт dryRun в ozon **починен и принят** (297bc31), -но **2-й режект ozon**: реальный publish падает `readFile is not a function` — deps без readFile/writeFile. -Мок-publish заморожен до фикса #2. +Сессия: **мок-publish в прогрессе** — контракт dryRun работает (npm publish + create-repo +реально прошли), но **режект #3 ozon**: git push падает `Author identity unknown`. +Ждём фикс #3. -## 🔴 БЛОКЕР (2-й режект): ozon readFile-deps (письмо 22:20Z) +## 🔴 БЛОКЕР (режект #3): ozon git identity (письмо 22:45Z) -**Симптом на стенде:** снял dryRun:true (tasks.json → render-tasks.cjs, schedd рестарт, -ozon dryRun:false подтверждён) → полный ран ozon: стадии 8/10 прошли, publish упал: -``` -[stage] publish start -❌ error: readFile is not a function -``` +**Симптом:** 3-й полный ран ozon (dryRun:false): стадии 8/10 прошли, publish: +- ✅ npm publish `@apilki/ozon-seller@0.1.0` → verdaccio (проверено `npm view` → 0.1.0) +- ✅ create-if-missing: репо `apilki/ozon-seller-typescript` создано в Gitea (REST POST) +- ❌ `git push` exit 128: `Author identity unknown` / `unable to auto-detect email address` -**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-прогоны были зелёные. +**Root cause:** `service/publish.js:180` ghPublish: `git init && git add && git commit -m "release ${v}" && git push` — в команде НЕТ `-c user.name=/-c user.email=`. Контейнер без git identity → commit падает. Yandex решает (worker/stages/github-distro.js:132): `-c user.name=apilki -c user.email=apilki@users.noreply.github.com` — этот паттерн и требовать от ozon. -**Разрыв тест/прод:** их e2e `server-publish.test.js:275` (e2ePublishWorker) подставлял -`readFile: (f,enc) => fs.promises.readFile(f,enc)` в deps руками → тест зелёный, прод падает. +**ТЗ в письме:** (1) `-c user.name=apilki -c user.email=apilki@users.noreply.github.com` в git-команду commit; (2) тест на сборку команды (assert `-c user.name=` в строке — их exec-стаб identity не ловит), идеально — интеграционный с реальным git в tmp; (3) сьют без регрессий; (4) отчёт письмом. -**ТЗ в письме:** (1) server.js + entrypoint.js — добавить readFile/writeFile/removeFile -(async-обёртки fs.promises) в deps, обе точки конформны; (2) e2e должен использовать -ТУ ЖЕ фабрику deps что прод (не подставлять руками) ИЛИ тест createPublishStage с -дефолтными deps + dryRun:false → не падает; (3) сьют без регрессий; (4) отчёт письмом. +## ✅ Принято (проверено независимо) -## ✅ Принято (фикс #1, ozon 297bc31 — проверено независимо) +- **Фикс #1** (297bc31): dryRun-контракт — плоский `...(payload || {})` вместо `payload.data`. Проверено: 202/202, e2e dryRun=false→real, dryRun=true→dryRunDiff. +- **Фикс #2** (5ce9852): prodDeps(root) — readFile/writeFile/removeFile (fs.promises) в deps ОБЕИХ точек (server.js createPublishStage + entrypoint.js cron). e2e больше НЕ подставляет readFile руками (стабы только exec/httpGetFn/httpPostFn/log/warn/recipesVersion). Проверено: 202/202, код в пересобранном контейнере (`...prodDeps({ root })` server.js:194, `deps: prodDeps({ root: ROOT })` entrypoint.js:126). +- Yandex: плоский `data.dryRun` (publish.js:92), прямые fs.readFileSync, git identity в команде — контракт правильный. **Yandex не запускал** — жду стабильного полного ozon-цикла. -- Контракт 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 НЕТ. +## Артефакты стенда (мок) + +- verdaccio: `@apilki/ozon-seller@0.1.0` опубликован (мок — ок). +- Gitea: `apilki/ozon-seller-typescript` создан, пустой (push не прошёл) — после фикса #3 ран до-push'нет его. ## Стенд (host-stacks/local/sched-pipelines) -- 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. +- schedd 0.9.0 healthy. ozon контейнер пересобран (фиксы #1+#2 внутри). +- tasks.json: **dryRun:false у ОБОИХ тасок** (по GO user'а), schedd рестартнут. +- state.json обновился (sha записан) — следующий ран ozon пойдёт diff-путь, + npm версия 0.1.0→0.1.1 (или patch), репо существует → push в существующее. -## Мок-publish — ЗАМОРОЖЕН до фикса #2 +## Мок-publish — ждём фикс #3 -Порядок после фикса: пересобрать ozon → ран (diff-путь, publish) → проверить мутации -verdaccio (@apilki/ozon-seller версия) + Gitea (репо/релизы apilki) → затем yandex -(13/13 с publish+githubDistro). +Порядок после фикса: пересобрать ozon → ран (diff-путь) → проверить verdaccio (0.1.1?) ++ Gitea (содержимое репо) → затем yandex (13 стадий: fetch...publish, githubDistro). ## Спроси user'а -1. Проверить отчёт ozon по фиксу #2 → GO на повторный мок-publish. +1. Проверить отчёт ozon по фиксу #3 → GO на продолжение мок-publish. 2. VDS-миграция — после пары дней локально. ## Не делать - Не запускать реальные публикации в npmjs/github.com без явного GO. - Не слать реальные письма unisender — только мок. -- Не патчить код команд — ТЗ через их инбоксы (письма 21:55Z + 22:20Z отправлены). -- Не коммитить в репо команд — только в .admin. Письма доставляются на диск (inbox-монитор). +- Не патчить код команд — ТЗ через их инбоксы (письма 21:55Z, 22:20Z, 22:45Z). +- Не коммитить в репо команд — только в .admin. Письма на диск (inbox-монитор). diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index b10aa4c..293c6fa 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 ЗАБЛОКИРОВАН (2-й режект ozon)**: контракт dryRun починен (297bc31, 202/202, e2e зелёные — проверено независимо), но реальный publish падает `readFile is not a function` — deps без readFile/writeFile в server.js+entrypoint.js (тест подставлял их руками → разрыв тест/прод). Письмо-режект 22:20Z, ждём фикс #2. +_Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** schedd **0.9.0 применён + cancel-тест ЗЕЛЁНЫЙ**. **Мок-publish в прогрессе (режект #3 ozon)**: фиксы #1 (dryRun-контракт) и #2 (prodDeps) приняты и проверены — **npm publish реально прошёл** (@apilki/ozon-seller@0.1.0 в verdaccio) + Gitea-репо создано (apilki/ozon-seller-typescript). Третий баг: `git push` падает `Author identity unknown` — нет `-c user.name/-c user.email` в git commit (yandex это имеет, ozon нет). Письмо-режект 22:45Z, ждём фикс #3. ## 🟡 [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-тест зелёный (стоп воркера до 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-миграция (после пары дней локально). +**Where I stopped:** schedd **0.9.0** (verdaccio latest, core 0.48.0), commit 225d235c. Cancel-тест зелёный. **Мок-publish: 3-й ран ozon** — фиксы #1 (dryRun плоский payload, 297bc31) и #2 (prodDeps readFile, 5ce9852) приняты+проверены (202/202 каждый, e2e прод-набором deps). Ран: **npm publish РЕАЛЬНО прошёл** (@apilki/ozon-seller@0.1.0 → verdaccio, проверено npm view), Gitea-репо создано (apilki/ozon-seller-typescript, REST create). **git push упал: Author identity unknown** — publish.js:180 git commit без `-c user.name/-c user.email` (yandex github-distro.js:132 имеет). Письмо-режект 22:45Z (ТЗ: -c identity в commit + тест на сборку команды). Yandex НЕ запускал (ждём полный зелёный ozon-цикл). tasks.json: dryRun:false у обоих. +**Next action:** (1) ✅ schedd 0.9.0 + cancel-тест — DONE; (2) 🔴 **ждать фикс #3 ozon (git identity) + отчёт** → пересобрать → ран ozon (diff-путь; npm уже 0.1.0 → будет 0.1.1; репо существует → push) → проверить verdaccio версию+Gitea содержимое → затем yandex (13 стадий); (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/._