tasks: стенд — schedd 0.5.0 применён, dry-run зелёный, ТЗ publish-mockable, handoff

This commit is contained in:
2026-08-20 22:51:39 +03:00
parent 3060263b9d
commit a619f6efce
3 changed files with 44 additions and 23 deletions

View File

@@ -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 (ТЗ).

View File

@@ -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), не по сырцам; порядок хендоффа 16 у них в fnf-testing-procedure.md. Репорт: sched/.agents/inbox/2026-08-19T17-24-00Z-admin-fnf-r10-report.md. Стенд: /tmp/sched-alerts-stand/r10/._

View File

@@ -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)