diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index f5a0b91..7661089 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,6 +1,7 @@ # Admin Task Board _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/._ -_Updated: 2026-08-19 — 🔴 **[sched-fnf-r10] ВОЗВРАЩЕН без теста** (17:00Z): их пинг r10 (per-task alert routing, core 0.44.0/daemon 0.4.2) — доки не сгенерированы (docs/dist пуст), пример createDaemon в 13.self-hosting.md битый (лишняя `},`, tasks-мапа неоднозначна), коммит не запушен (ahead 2) при опубликованных пакетах (publish раньше push). Код+юнит-тесты+dist пакетов проверены — ок, претензий нет; претензия процессная. Разгромное письмо с порядком хендоффа: `sched/.agents/inbox/2026-08-19T17-00-30Z-admin-r10-rejected-docs-not-generated.md`. Ретрай по их фиксу (push + npm run generate + исправленный пример)._ +_Updated: 2026-08-19 — 🟢 **[sched-fnf-r9] ЗАКРЫТ (их ack 15:06Z, ретест не просили) — бухгалтерия.** Webhook-алерты (core 0.43.0/daemon 0.4.1): лестница 6/6 + 2 бонус-клейма PASS, багов нет. Замечания (их фикс — проза доков): `retry.backoffMs` де-факто required (`maxAttempts:1`+`backoffMs:0`); «catch-up on creation» — свежие расписания не догоняют прошлые слоты (nextRunAt = будущее), гейт lastRunAt гасит history-less late dispatch. Репорт: sched/.agents/inbox/2026-08-19T15-02-00Z-admin-alerts-webhook-fnf-r9.md._ +_Updated: 2026-08-18 — 🟢 **[sched-fnf-r8] ЗАКРЫТ (приёмка №5 UI, U1–U4 закрыты, ui 0.2.1→0.2.3) — бухгалтерия.** Schedule-as-entity (core 0.40.2/daemon 0.3.0/storage-* 0.3.1/ui 0.2.0): 15 репро-скриптов, №4 admin-api 52/52 (F1 tz-hoist, F3 PATCH-merge), №5 UI 13/13 (находки U1 форма-tz→400, U2 вёрстка ~58px). Подтверждённый контракт и карта стенда: .wiki/concepts/sched-fnf-r8-verification-stand.md._ _Updated: 2026-08-18 — 🧹 гигиена: 4 июльских ⚪-блока флипнуты в 🟢 (уже были закрыты по закрывающим 🟢-блокам/_Updated-логу): imgproxy-stack29-watermark-rollback, minio-variant-cache-bucket, imgproxy-watermark-glyph-books-vds, tandemmebel-sharp-staging-rebuild. Wiki: +2 концепта (nvm-junction-ismain-gate-gotcha, nvm-windows-node-switch)._ _Updated: 2026-08-18 — 🟢 **[sched-fnf-r7] ЗАКРЫТ — приёмка r7-fixed (09-29Z): 61/61 + t1 24/24, обе находки стали фичами.** Версии на стенде sched-r2/r7: core 0.35.0/daemon 0.1.29/mcp 0.3.10/storage-* 0.2.10 (verdaccio latest). F1 (рунтим-таска дизаблилась sync → фича fileManaged): POST /tasks → fileManaged:false, sync её НЕ дизаблит (runSyncOnce, тик-путь), переживает рестарт демона (БД-уровень, sqlite), DELETE /tasks/:name → 204/404, runs удалённой таски сохраняются; регресс file-managed → disabled on removal жив; backfill v0.5→v0.6 (DROP COLUMN → миграция вернула DEFAULT 1, legacy = file-managed, disabled); live-адаптеры mysql/postgres (v3-миграция) + mongo (schemaless, отсутствие поля = managed) — runtime жив, file дизаблится, флаг персистентный. F2 (нет валидации heartbeat → фича): createEngine бросает на lockHeartbeatMs >= lockTtlMs (== и >, сообщение внятное); CLI отказ только при явном флаге, --lock-ttl 20 в одиночку легален (дефолт ttl/3=6666ms в баннере), --poll-timeout явный >= ttl тоже отказ. Доки сверены: 03.tasks.md §149 (убрано «on the next daemon start»), 09.admin-api.md §142-143/151 (+§161 пометка про блокирующий sync-trigger), 12.cli.md (enforced at parse + engine throws). Мелочь «на усмотрение»: в published admin-api.d.ts docstring нет строки DELETE /tasks/:name (поведение+09.admin-api.md правы, одной строки в .d.ts не хватает). Стенд-репро: node r7-fixed-acceptance.mjs (61 проверка, sqlite + live docker mysql/postgres/mongo). Отправлено: projects/sched/.agents/inbox/2026-08-18T09-43-00Z-admin-fnf-r7-accepted.md (r7 закрыт, доску sched не трогал, не пушил)._ _Updated: 2026-08-17 (4) — 🟢 **[sched-fnf-r6] РЕПОРТ ОТПРАВЛЕН (жду приёмки).** Real runners on real infra: ssh 25/25 (VDS, реальный ключ/пин/команда), http 29/29 (локальный приёмник, simple+envelope+poll+auth), storage 45/45 (MariaDB 11.4/Postgres 16/Mongo 7 на VDS, БД sched_r6 дропнуты после). Версии core 0.26.2/daemon 0.1.20/mcp 0.3.1/storage-* 0.2.1. Находки: F1 пинг r6 врет про `{"status":"ok"}` (код+дока: succeeded|failed|accepted); D1 дока 07.storage+пинг обещают `createDaemon({storage})` — daemon 0.1.20 хардкодит sqlite, опции нет (тестил через createEngine); F3 ssh fingerprint-mismatch не называет отпечатки («Host denied (verification failed)»); F4 дока ssh timeoutMs смешивает connect(failed)/command(cancelled); F5 manual trigger не пишет task.lastRunId; F6 у Mongo нет schema_version (by design); F7 эксперимент «адаптер по одной доке» — 31/31 PASS, но дока несамодостаточна (refreshLock: дока 16 методов vs published 0.26.2 = 15, фича в неопубликованном 0.27.0; сигнатуры только в .d.ts; async-фабрика в сьюте — ловушка); F8 эксперимент «runner по одной доке» — 15/16 (CR-1 баг доки: `"schedule": "* * * * *"` строкой невалиден, надо объект {cron}; CR-2 дыра: run() показан без hooks/onProgress — live-прогресс sync-раннеров в доке нет); F9 mcp-раннер — «на усмотрение»: единственный раннер без живого прогона за все раунды, ниша узкая (MCP-only тулы + вызов без агента в петле), рекомендация — честное позиционирование в доке + одна живая таска как валидация; **F10 от юзера: admin API+UI Schedules (и Tasks) не показывают статус последнего рана** — /schedules не отдаёт lastRunId/статус (admin-api.ts ~367), UI колонка «last run» = только timestamp (sched-schedules.ts), рекомендация: lastRunId+lastRunStatus в API, колонка «last status» в UI. Отправлено: `victor/sched/.agents/inbox/2026-08-17T20-35-00Z-admin-fnf-r6-report.md`. Стенд: `.tmp/sched-r2/r6/`._ diff --git a/.wiki/concepts/sched-fnf-testing-method.md b/.wiki/concepts/sched-fnf-testing-method.md new file mode 100644 index 0000000..e10fc87 --- /dev/null +++ b/.wiki/concepts/sched-fnf-testing-method.md @@ -0,0 +1,57 @@ +--- +title: "sched F&F — метод тестирования: скомпилированная дока + порядок хендоффа" +type: concept +tags: [sched, fnf, testing, docs, methodology, handoff] +sources: [] +related: [concepts/sched-fnf-r8-verification-stand.md, concepts/sched-admin-client-openapi.md] +updated: 2026-08-19 +--- + +# sched F&F — метод тестирования + +Урок раунда r10 (2026-08-19, режект → фикс → ретест 6/6). Правила тестирования +в кросс-агентном цикле F&F против sched-команды. Применимо к любому следующему раунду. + +## 1. Тестируем по СКОМПИЛИРОВАННОЙ доке, не по сырцам + +- «Публичная дока» текущего этапа = **скомпилированная дока на дев-сервере** + `http://localhost:5108` (nuxi dev, биндится на IPv6 `[::1]` — открывать localhost, + НЕ 127.0.0.1). Роуты: `/docs/tasks`, `/docs/self-hosting` и т.д. +- НЕ тестировать по `docs/content/docs/*.md` в рабочем дереве — тогда битый билд, + пустой dist, мёртвый/устаревший рендер проскочат незамеченными. Дока как артефакт — + часть предмета теста. +- `schedjs.com` — заглушка конфига (NXDOMAIN, домен не зарегистрирован), проект никуда + официально не публиковался. Деплой на публичный URL НЕ требовать — это вопрос фазы + публикации и решение владельца. + +## 2. Порядок хендоффа sched F&F (их процедура, fnf-testing-procedure.md) + +Проверять ВСЕ 6 пунктов ПЕРЕД первым прогоном. Любой пропуск = возврат без теста: + +1. Код + юнит-тесты. +2. Доки source — примеры парсятся (битый пример = возврат; в r10 был сломанный + `createDaemon({ alerts })` — лишняя `},`, `tasks`-мапа неоднозначно вложена). +3. `npm run generate` в `docs/` → `docs/dist` не пуст и закоммичен. ⚠️ Гоча: nuxi + сам создаёт `docs/dist` как **symlink** на `.output/public` — «0 байт», в git не + попадает; у них закрыто `scripts/docs-dist.mjs` (после generate заменяет симлинк + реальной копией) + `!docs/dist/` в .gitignore. +4. `git push` — ноль ahead (тестируем то, что в origin). +5. Пакеты в verdaccio (versions на месте). +6. Пинг тестера со списком версий + целью (URL скомпилированной доки). + +## 3. Ретейст-рецепт (r10, переиспользуем) + +- Стенд: `/tmp/sched-alerts-stand/` (Windows Temp), node_modules `@sched/core` / + `@sched/daemon` из verdaccio, `.npmrc` → `@sched:registry=https://verdaccio.kzntsv.site/`. + Приёмник `receiver.mjs` (порты 8131/8132). +- Лестница r10: a) регресс дефолта, b) `on:[]` = тишина (массивы REPLACE), c) per-task on, + d) per-task onMissed (missed-slot: гашение демона на слот > grace 120s), e) мультиканал + (+ без корневого webhook), f) fail-fast на load (все 3 варианта). +- ⚠️ Гоча путей: write-тул пишет `/tmp/...` как `C:\tmp\...` (диск-рут), bash `/tmp` = + Windows Temp. Синхронизировать через `cp`. +- Крон `* * * * *` — слот на :00 каждой минуты; запускать демон и ждать следующего :00+8s. + +## 4. Результат r10 + +6/6 PASS, 0 находок, 0 замечаний — первый раунд без фиксов после режекта. Бонус: HMAC +`X-Sched-Signature-256` MATCH. Финальные версии: core 0.44.0 / daemon 0.4.2. diff --git a/.wiki/index.md b/.wiki/index.md index 9c5e2c8..9d0762c 100644 --- a/.wiki/index.md +++ b/.wiki/index.md @@ -26,6 +26,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever - [nvm-junction-ismain-gate-gotcha](concepts/nvm-junction-ismain-gate-gotcha.md) — ESM isMain-гейт молча не выполняется под junction'нутым npm-рутом (nvm/mise/volta); realpath-фикс; диагностика за 30 сек - [nvm-windows-node-switch](concepts/nvm-windows-node-switch.md) — смена версии Node на nvm-windows: junction, per-version глобалы, PATH-кэш, npm 11 allow-scripts; Node 22→24 evidence - [sched-fnf-r8-verification-stand](concepts/sched-fnf-r8-verification-stand.md) — стенд верификации F&F r8 (schedule-as-entity): путь, версии core 0.40.2/ui 0.2.0, карта репро-скриптов (миграции/движок/политики/API 52/UI 13), подтверждённый контракт (ceiling, retryCount, snapshot, pause AND, tz-hoist, PATCH-merge), находки №5 (U1 форма-tz, U2 вёрстка), как закрыть раунд +- [sched-fnf-testing-method](concepts/sched-fnf-testing-method.md) — метод F&F-тестирования (урок r10): тест по СКОМПИЛИРОВАННОЙ доке (dev-сервер localhost:5108), не по сырцам; порядок хендоффа 1–6 (код → доки source парсящиеся → generate/dist → push ноль ahead → verdaccio → пинг), битый пример = возврат, schedjs.com = заглушка (деплой не требовать) - [windows-docker-test-harness-gotchas](concepts/windows-docker-test-harness-gotchas.md) — грабли Windows-верификации против docker: rmSync до DatabaseSync (EBUSY), vitest 10s vs ~11s docker-DDL, монотонность фейк-часов, изоляция DB на сценарий, висельники node-процессов - [snolla-smtp-mail-delivery-2026-08](concepts/snolla-smtp-mail-delivery-2026-08.md) — SMTP-инцидент 12–14.08: 525 (Яндекс отключил протоколы) → 554 (холодный ящик, мульти-получатели) → 550 (from not owned); фиксы + монитор на VDS + рецепт деплоя - [keenetic-rci-api](concepts/keenetic-rci-api.md) — KeeneticOS RCI API: auth, чтение конфига, запись через CLI-parser, DNS-override против сломанного hairpin diff --git a/.wiki/log.md b/.wiki/log.md index 80204aa..6542ec3 100644 --- a/.wiki/log.md +++ b/.wiki/log.md @@ -1,3 +1,4 @@ +## [2026-08-19] ingest | NEW concepts/sched-fnf-testing-method.md — метод F&F-тестирования (урок r10): тест по скомпилированной доке (dev-сервер localhost:5108), порядок хендоффа 1–6, битый пример = возврат, schedjs.com заглушка. index.md updated (+1). ## [2026-08-16] ingest | concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md — день деплоев стека 16 (7 операций): рестарт vs пересборка разведены как отдельные операции. Рестарт сбрасывает in-memory viewModel кэш content-api (цена за м³ подтянулась после рестарта без пересборки); пересборка — только для кода. Анти-симптом: 500 на категориях с логом `@snolla/core viewModels/index.js:419 _.find(x=>x.name)` = код/данные (Content object vs array, admin-api create), рестарт не лечит — фикс snolla core 0.26.7 + admin-api 0.11.0 array-canon (1128ddc → 64c2539). Откат-цепочка образов 64c2539→…→8b7e8c4. +index.md. Монорепа-сторона заингестена прогером (lazy-data-not-found-404, admin-api-content-wire array-canon, cms-edits-cache-restart, v-html-on-component-ssr, admin-api-content-edit). ## [2026-08-14] decision | FormSubmissions.Content ₽→«?» — координация закрыта. ALTER на клиентской stostayer сделан (.admin); snolla опубликовала `@snolla/data@0.15.1` (STRING→TEXT=NVARCHAR(MAX), тесты 7/7); скан живых БД VDS: MoreThenCms+Staging уже nvarchar (ALTER не нужен), VDS-stostayer varchar — не прод, не трогаем (роль — к оператору); legacy stostayer.web на @snollajs 0.7.x — фикс не едет, ALTER покрывает (backport опция `065bb44`); формы есть у всех сайтов тиража (pilorama98 2516/labtools 916 — вопреки гипотезе snolla). Бонус: email-контракт задокументирован snolla (forms-email-contract.md), warn при пустом `to` — ждёт решения vitya. Таска snolla [formsubmissions-content-nvarchar] закрыта. ## [2026-08-14] implement | MSSQL stayer_site: ALTER FormSubmissions.Content varchar(max) cp1251 → NVARCHAR(MAX) (запрос их прогера: ₽→«?» в письмах с калькулятора). Verify до/после (nvarchar max). Live-тест не гонял, тестовые заявки #68485/#68486 не удалял (ждут подтверждения). Соединение: tedious из packages/web node_modules, MSSQL 91.222.236.225:1433 открыт снаружи.