From a619f6efce4def73a68fa8c9acdace6f951eb6cb Mon Sep 17 00:00:00 2001 From: vitya Date: Thu, 20 Aug 2026 22:51:39 +0300 Subject: [PATCH] =?UTF-8?q?tasks:=20=D1=81=D1=82=D0=B5=D0=BD=D0=B4=20?= =?UTF-8?q?=E2=80=94=20schedd=200.5.0=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=91=D0=BD,=20dry-run=20=D0=B7=D0=B5=D0=BB=D1=91=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9,=20=D0=A2=D0=97=20publish-mockable,=20handoff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tasks/NEXT_SESSION.md | 45 ++++++++++++++++----------- .tasks/STATUS.md | 6 ++-- .tasks/sched-pipelines-local-stack.md | 16 +++++++++- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 05deee4..5f535b8 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,43 +1,50 @@ --- -_last_updated_: 2026-08-20T19:20:00Z -session_id: sched-pipelines-setup-2026-08-20 +_last_updated_: 2026-08-20T19:55:00Z +session_id: sched-pipelines-apply-0.5.0-2026-08-20 --- # Next session handoff -Сессия: сборка локального sched-стенда + интеграция 2 воркеров (yandex/ozon) + email-канал + dry-run. +Сессия: schedd 0.5.0 применён, timeoutMs -1, одновременный dry-run обеих тасок зелёный, мок-publish ТЗ разосланы. ## Recent commits (в .admin) -- `d4828592` tasks: план vitya — sched-фикс → параллельный dry-run → verdaccio → books -- `4f5f4738` tasks: оба dry-run зелёные (yandex 11/11, ozon 9/9) -- `c99e0472` ops: yandex dry-run SUCCESS (11/11), мок unisender работает -- `859304de` tasks: email канал ожил (tracking-домен trk.snolla.com активен) +- `3060263b` ops: стенд — schedd 0.5.0 (run-deadline), timeoutMs -1, ozon bind-mount state на хост ## Open треки | Трек | Готовность | Entry-point | |---|---|---| -| `sched-pipelines-local-stack` (🟡 active) | стенд жив: schedd 0.4.2 + ym/ozon воркеры + browser + ntfy + alert-bridge + unisender-mock; оба dry-run зелёные | `.tasks/sched-pipelines-local-stack.md` + `host-stacks/local/sched-pipelines/` | +| `sched-pipelines-local-stack` (🟡 active) | schedd 0.5.0; **оба dry-run зелёные через sched (ozon 8/8, yandex 11/11)**; publish-мок ТЗ на досках команд | `.tasks/sched-pipelines-local-stack.md` | + +## Что разослано командам (жду фиксы) + +1. **sched** — письмо `2026-08-20T19-30-00Z-admin.md` (в .read уже есть, мой инбокс): баг `applyTask` не переносит `timeoutMs` при upsert существующей задачи + требование vitya: **`-1` = дефолт, можно не указывать** (absent должен вести себя как -1, не legacy-25мин потолок). +2. **ozon** — письмо 19:40Z + таска `publish-mockable`: выровнять publish с ym (data.registry + .npmrc + --registry; data.remoteBase для push; опц. data.githubApiBase). У них всё хардкод. +3. **yandex** — письмо 19:52Z + таска `publish-mockable`: добавить только `data.githubApiBase` для REST github-distro (repoExists/ensureRepo/createRelease); registry+remoteBase уже есть. + +## Стенд (host-stacks/local/sched-pipelines) + +- schedd 0.5.0 (daemon), tasks.json: `timeoutMs: -1` на ozon+yandex (в файле есть, в БД/API не применился из-за бага sched). +- Оба воркера свежие (ozon с фиксами ТЗ №1-10: envelope реализован; ym с JSDoc-фиксом). +- Compose: ozon bind-mount `./data-ozon` → /app/data + `data-ozon/state.json` → /app/state.json (раньше state жил в слое образа). ym: `./data-ym` → /app/data. +- Находка для ozon: run.js хардкодит state/output в ROOT образа, /app/data не используется воркером — не включено в их ТЗ (могу добавить позже). ## Спроси user'а -1. **Фикс sched ПРИЛЕТЕЛ (письмо 19:20Z) — применять в следующей сессии**: core 0.45.0 / daemon 0.5.0 на verdaccio (latest), коммиты 4cff4c1 + ca617b3. Реализовано: (1) envelope-дыра → громкий broken-worker; (2) относительный statusUrl резолвится (new URL(statusUrl, cfg.url)); (3) poll-флейк → ретрай 2×500мс + метка `http runner: poll failed:`; (4) НОВОЕ — run-deadline контракт: task-level `timeoutMs` в tasks.json (`-1` = никогда, `>0` = фейл через N мс, absent = legacy). **Рекомендация sched: поставить `"timeoutMs": -1` на обе пайплайн-таски (ozon + yandex)**. После обновления schedd: **одновременный dry-run обеих тасок через sched** (ozon + yandex в параллель, конкурентность — план vitya). -2. **GO на реальный прогон** — пока НЕ дан. План vitya: сначала публикация на **verdaccio** (не npmjs!) → **books тестирует** (у него тесты) → потом релиз. Воркерам: `registry: https://verdaccio.kzntsv.site` + `NPM_TOKEN` verdaccio (в `~/.npmrc`), НЕ npmjs-токен. -3. **«Да» по 2 фичам sched** (обе ⚪ на их доске): `http-runner-envelope-violation`, `http-runner-relative-status-url`. Poll-баг уже в работе по заданию vitya (`http-runner-poll-error-resilience`). -4. **VDS-миграция** — после пары дней локально + зелёных реальных прогонов. +1. **Мок-publish стенд**: после фиксов publish-mockable от обеих команд — построить мок-GitHub (локальный HTTP-мок REST + git remote на локальный bare-репо) + мок-npm (verdaccio) и прогнать publish-стадию. Либо просто ждать GO и идти на verdaccio напрямую. +2. **GO на реальный прогон** — пока НЕ дан. План vitya: verdaccio (не npmjs) → books тестирует → релиз. Воркерам: registry verdaccio + NPM_TOKEN verdaccio. +3. **VDS-миграция** — после пары дней локально + зелёных реальных прогонов. ## Не делать - Не запускать реальные публикации (publish/githubDistro) без явного GO. -- Не слать реальные письма unisender — только мок (`data-mail/`); email-каналы воркеров указывают на мок. -- Не патчить код команд — ТЗ через их инбоксы, они пушат, я пересобираю. +- Не слать реальные письма unisender — только мок (data-mail/). +- Не патчить код команд — ТЗ через их инбоксы/доски, они пушат, я пересобираю. - Не коммитить в репо команд (yandex/ozon/sched) — только в .admin. -- schedd: НЕ использовать debug-fetch обёртку (убрана). ## Memory updates за сессию -- **Контракт Unisender Go** (проверен живьём): `POST goapi.unisender.ru/ru/transactional/api/v1/email/send.json`, ключ `X-API-KEY`-заголовок или `api_key` в теле, вложенный `message {template_engine, body.{plaintext|html}, subject, from_email, from_name, recipients[]}`; `body.text` → 400 code 1577. Требует tracking-domain (NS-делегация на uns1-3.unisender.com) + sender-domain (SPF/DKIM/hash). Кандидат на wiki-ingest. -- **reg.ru API**: клиентский SSL-серт (генерил openssl, ключ в pass `reg-ru/snolla-com-api-key|cert`, вставлен в панель); DNS-команд в API НЕТ (NO_SUCH_COMMAND) — записи только панелью; панель дописывает домен к имени поддомена (`trk` а не `trk.snolla.com` — иначе `trk.snolla.com.snolla.com`). Кандидат на wiki-ingest. -- **Секреты**: `pass sched-pipelines/local/*` (sched-api-key, admin-key, webhook-secret, unisender-go-api-key), `pass reg-ru/snolla-com` (+ api-key/cert). GH-токен OpeItcLoc03 — репо в оргах создаёт (apilki admin, проверено). -- **GitHub**: apilki/ozon-seller-typescript, apilki/ozon-seller-postman, apilki/yandex-market-postman ещё не существуют — создадутся при первом реальном publish (create-if-missing у обоих воркеров). +- **sched run-deadline контракт**: task-level `timeoutMs` (-1 = никогда, >0 = фейл через N мс, absent = legacy 25-мин poll-потолок). Баг: applyTask при upsert не переносит timeoutMs. Требование vitya: -1 = дефолт, absent должен быть -1. +- **ozon publish.js**: npm publish хардкод (нет registry), pushUrl хардкод github.com, GH API хардкод — мокабельность только через data-поля (ТЗ). +- **ym github-distro.js**: data.registry (npm) + data.remoteBase (git remotes) уже есть; GH_API константа — нужен data.githubApiBase (ТЗ). diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index b43e6aa..6c12cbf 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,10 +1,10 @@ # Admin Task Board -_Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** План vitya: (1) ждём фикс sched poll-бага → принять; (2) после приёмки — одновременный dry-run обеих тасок через sched (конкурентность); (3) реальная публикация — на VERDACCIO (не npmjs) → тесты books → потом релиз. Воркерам: registry verdaccio + NPM_TOKEN verdaccio (из ~/.npmrc). +_Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** schedd 0.5.0 применён; одновременный dry-run ozon+yandex через sched — оба зелёные (ozon 8/8, ym 11/11). timeoutMs -1 не применился (баг sched applyTask — письмо 19:30Z, требование vitya: -1=дефолт). Мок-publish: ТЗ обеим командам (publish-mockable). GO на реальный прогон не дан. ## 🟡 [sched-pipelines-local-stack] — локальный стенд: sched daemon + ym/ozon воркеры + browser/ntfy/alert-bridge, потом VDS **Status:** active -**Where I stopped:** стек поднят (docker compose up -d, `host-stacks/local/sched-pipelines/`): schedd 0.4.2 healthy (admin 127.0.0.1:18080), задачи загружены (ozon `0 2 * * *`, yandex `30 2 * * *`), ym ping envelope+auth ✓, bridge HMAC+ntfy ✓, browser CDP ✓. Ozon-воркер остановлен (их баги: `job.getTask()` → restart-loop; envelope не реализован; нет notify/publish на sched-пути; email на старый домен; Dockerfile COPY-шелл; lock пинит yaml на verdaccio). ТЗ отправлены: ozon `2026-08-20T17-06-00Z-admin.md`, ym `2026-08-20T17-06-30Z-admin.md`, sched (впрячься) `2026-08-20T17-05-48Z-admin.md`. Секреты в pass `sched-pipelines/local/*` (api-key/admin-key/webhook-secret/unisender). Email: go2 требует sender-domain в аккаунте (код 229) — вопрос человеку. GitHub-токен: репо в оргах создаёт ✓ (apilki admin, тест create+delete). -**Next action:** решения vitya: (1) ратифицировать фикс sched `http-runner-envelope-violation` («делай»/«отмени»); (2) sender-domain в go2.unisender.ru (иначе email 229). Дальше: фиксы ozon/ym (пересобрать после пушей) → контракт-ревью envelope у sched → снять DRY_RUN по «GO» → dry-run пайплайнов → VDS. +**Where I stopped:** schedd **0.5.0** (core 0.45.0) пересобран, `timeoutMs: -1` на обе таски (не применился — баг sched applyTask, письмо 19:30Z + требование vitya absent=-1). **Одновременный dry-run через sched — оба зелёные**: ozon 8/8, yandex 11/11. Ozon пересобран с их фиксами (envelope реализован), ym свежий. Мок-publish: ТЗ обеим командам `publish-mockable` (ozon: registry/remoteBase/githubApiBase — у них хардкод; ym: только githubApiBase). Compose: ozon bind-mount state на хост (был в слое образа). Осталось: GO на реальный прогон → verdaccio → книги → релиз. +**Next action:** ждать фиксы команд: sched (timeoutMs applyTask + absent=-1 дефолт), ozon+ym (publish-mockable). После: мок-publish стенд (локальный мок-GitHub REST + verdaccio), контракт-ревью envelope, GO vitya → реальный прогон → 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/._ diff --git a/.tasks/sched-pipelines-local-stack.md b/.tasks/sched-pipelines-local-stack.md index bd020f3..aa2d6a9 100644 --- a/.tasks/sched-pipelines-local-stack.md +++ b/.tasks/sched-pipelines-local-stack.md @@ -4,7 +4,21 @@ + CDP-browser + локальный ntfy + alert-bridge (sched webhook → ntfy/email Unisender Go). Потом миграция на VDS. -## Статус (2026-08-20) +## Статус (2026-08-20 вечер) + +**Сделано в этой сессии:** +- schedd обновлён 0.4.2 → **0.5.0** (core 0.45.0): envelope-дыра → громкий broken-worker, относительный statusUrl, poll-ретраи 2×500мс, run-deadline контракт (task-level timeoutMs). +- tasks.json: `"timeoutMs": -1` на обе пайплайн-таски (рекомендация sched). ⚠️ **НЕ применился** — баг sched: `applyTask` при upsert существующей задачи не переносит `timeoutMs` (поле не в списке merged). Письмо sched 19:30Z + требование vitya: `-1` = дефолт, можно не указывать (absent должен вести себя как -1, не legacy-25мин). +- **Одновременный dry-run обеих тасок через sched — оба зелёные**: ozon 8/8 стадий succeeded, yandex 11/11 succeeded (outcome published, notify sent). Конкурентность работает. +- Воркеры: ozon пересобран с их фиксами (ТЗ №1-10, envelope реализован), ym свежий (JSDoc-фикс в образе). +- publish-мокабельность: ТЗ обеим командам (`publish-mockable` на их досках + письма): ozon — data.registry/.remoteBase/.githubApiBase (у них хардкод); ym — только data.githubApiBase (REST), registry+remoteBase уже есть. +- docker-compose: ozon bind-mount на хост (`./data-ozon` → /app/data + state.json → /app/state.json) — раньше state/output жили в слое образа и терялись. +- Находка: у ozon state.json/output в слое образа (run.js хардкодит ROOT), /app/data volume пуст — это их недоработка, state персистится только mount'ом. У ym state в bind (data-ym). + +**Открытые вопросы (к sched):** +1. applyTask timeoutMs-баг (см. письмо 19:30Z) — фикс + absent=-1 дефолт. +2. Устаревшая таска `pipeline` (disabled) осталась в БД sched после переименования — sync не удаляет, контракт такой. + **Поднято и проверено:** - schedd 0.4.2 (published, verdaccio) — healthy; admin API 127.0.0.1:18080 (SCHED_ADMIN_KEY из pass)