tasks: sched-fnf r4 closed + r5 reviewed; close stale sched dups; handoff

This commit is contained in:
2026-08-17 20:07:26 +03:00
parent 79c1384f1e
commit 10ff656e43
2 changed files with 25 additions and 38 deletions

View File

@@ -1,46 +1,31 @@
---
_last_updated_: 2026-08-17T08:15:00Z
session_id: 2026-08-17-pi-models-llm-router-fnf-r3
_last_updated_: 2026-08-17T17:02:34Z
session_id: 2026-08-17-pi-sched-fnf-r4-r5
---
# Next session handoff
## Состояние: три нитки, все в ожидании внешнего шага
**1. sched F&F раунд 3 — наша часть сделана, ждём от sched cache-фикс.**
Прогнано (стенд `.admin/.tmp/sched-r2/r3/`, изолированный node_modules: core 0.22.0 / daemon 0.1.15 / ui 0.1.8 из verdaccio):
- 4 новых раннера протестированы IRL: process ✅, mcp ✅ (vds-ops HTTP, env-токен), docker-envelope ✅, **ssh — найден критичный баг host-key pin** (`keyHash.replace is not a function`: ssh2 отдаёт в `hostVerifier` сырой Buffer, `hostHash` не задан) → sched починил в core 0.21.0 (`hostHash:'sha256'` + Buffer-safe fingerprintMatches), перетест ✅.
- Найден **UI cache-баг**: serve/daemon не шлют `Cache-Control` → браузер кэширует `/api/runs`, строки залипают на `running` (progress % виден, терминальный статус нет), лечится только Ctrl+F5. Воспроизведено live (DOM до/после `location.reload(true)`). sched подтвердил, фикс «в треке».
- Live-прогресс (0.22/0.1.15) работает (API растёт 7→100, exit-code→100%, fail→N%), но его **маскирует cache-баг** — репорт с просьбой поднять приоритет отправлен.
- Репорты (3): `victor/sched/.agents/inbox/2026-08-17T06-35-00Z-*`, `07-07-00Z-*`, `07-32-00Z-*`, `08-10-00Z-*`.
**Следующий шаг:** когда sched пингнёт cache-фикс — перетест: поднять `cd .admin/.tmp/sched-r2/r3 && node daemon.mjs` (порт 8082) + `node node_modules/@sched/ui/dist/serve.js --proxy http://127.0.0.1:8082 --port 8083`, проверить, что терминальные строки рендерятся **без Ctrl+F5**.
**2. llm-router (failover-прокси pi) — конфиг готов, ждёт рестарт службы от юзера (admin).**
- Пул переконфигурен: **routerai (deepseek-v4-flash-0731 / deepseek-v4-pro-0813) → deepseek (chat/reasoner)**; teamorouter/orcarouter/anymodel убраны.
- **ВАЖНО: служба winsw читает фабричную копию `C:\Users\vitya\AppData\Local\llm-router\config\llm-router.json`**, НЕ проектную `.common/lib/llm-router-proxy/config/`. Обе обновлены (gotcha в `.common/.wiki/concepts/llm-router-failover-proxy.md`).
- Ключи: routerai+deepseek в `~/.pi/agent/auth.json` (orcarouter/teamorouter ключи удалены).
- **Ждёт:** `Restart-Service llm-router` (админская PS) → потом проверить `curl :8787/health` + minimal probe: в логе `upstream=routerai` (не teamorouter).
**3. pi models.json — готово.** orcarouter/teamorouter убраны, в `routerai` добавлены deepseek/deepseek-v4-flash-0731 + deepseek-v4-pro-0813. Цены от юзера даны в рублях, **переведены в USD** (pi рендерит `$`; курс 83.44 ₽/$): flash 0.0839/0.1678/0.0175, pro 1.594/3.2/0.132. Релоад — при открытии `/model`.
## Recent commits
- (нет коммитов в `.admin` за сессию — вся работа = репорты в inbox `victor/sched`)
## Open треки
| Трек | Готовность | Entry-point |
|---|---|---|
| sched F&F r3 cache-фикс перетест | ⚪ ждёт пинг sched | `.admin/.tmp/sched-r2/r3/` + их инбокс |
| sched F&F раунд 5 — allowedTools sandbox | 🟡 репорт отправлен, ждём фикс + пинг | `.admin/.tmp/sched-r2/r5/` + их inbox |
| sched F&F раунд 4 — run-метаданные/retention/manual-retry | 🟢 закрыт (5/5 + A/B/C починены) | — |
| llm-router рестарт службы + verify routerai | 🔴 ждёт юзера (admin restart) | `.common/lib/llm-router-proxy/` + AppData-копия |
| pi models.json | 🟢 done | `~/.pi/agent/models.json` |
## Спроси user'а
- **Перезапусти `llm-router` службу** (админская PowerShell) → скажи, я проверю probe→routerai.
- Ритуал закрытия (ниже в ответе): ингестить ли знание в вики (см. Memory updates), закрывать ли что-то.
- **Перезапусти `llm-router` службу** (админская PowerShell) → скажи, проверю probe→routerai (трек из прошлой сессии, всё ещё висит).
- Ритуал закрытия ниже в ответе.
## Не делать (preemptive guards)
- **НЕ пушить в victor/sched, НЕ трогать их доску/NEXT_SESSION/wiki** — только письма в их инбокс (правило F&F).
- **НЕ пушить в victor/sched, НЕ трогать их доску/NEXT_SESSION/wiki** — только письма в их inbox (правило F&F).
- Не трогать R2-стенд daemon :8080 (общий регресс-стенд, живёт).
- Не писать секреты в этот файл (git-tracked).
## Memory updates за сессию
- `.common/.wiki/concepts/llm-router-failover-proxy.md` — секция «Две копии конфига» (служба читает AppData-копию) + актуальный пул routerai→deepseek.
- **pi cost = USD** (рендер `$`): рубли от юзера конвертировать по курсу, иначе оценка в ~83 раза выше. (кандидат в вики)
- **HTTP_PROXY на этой машине**: `curl 127.0.0.1` уходит в прокси (503 маскирует «down»). Проверки локальных портов — `curl --noproxy '*'` + `netstat`. (кандидат в вики)
- sched ssh-runner паттерн: ssh2 `hostVerifier` получает Buffer, hex-диджест — только с `hostHash:'sha256'`; UI: отсутствие `Cache-Control` замораживает таблицы на промежуточном состоянии. (кандидат в вики, если закрепить)
- **sched r4 закрыт**: 5/5 исходных (run-метаданные `trigger/triggeredBy/temporary/retryOf`, trigger-only, manual retry, auto-retry линковка, retention) + 3 находки починены (core 0.25.0 / daemon 0.1.18): syncTasks disable-on-remove, `POST /tasks/:name/run` с `{temporary?, data?}`, `--help` дефолты. Перетест 12/12 зелёный.
- **sched r5 заревьюен** (core 0.26.0 / mcp 0.3.0 / daemon 0.1.19, allowedTools sandbox): 30/30 зелёный, 7/7 пунктов. 3 «на ваше усмотрение» отправлены sched'у, ждём фикс: **A** ssh — единственный раннер, где ceiling проверяется на run (не load); **B** mcp http server-only spec (`["https://host"]`) тихо no-match (нужен `url:*`); **C** docker `alpine@echo` блокирует таску без явного `command`. Стенды: `r4/` (r4-harness/r4-bonus/r4-retest/r4-probe-removed-task), `r5/` (r5-harness) — все с изолированным node_modules из verdaccio.
- **F&F-репорты живут в `victor/sched/.agents/inbox/`** (НЕ в .admin/.tasks/) — rounds 4-5 шли через inbox-пинги, без board-задач. Следующий раунд (6?) придёт тем же пингом в `.admin/.agents/inbox/`.

View File

@@ -1,4 +1,6 @@
# Admin Task Board
_Updated: 2026-08-17 — 🟢 **[sched-fnf-r4] ЗАКРЫТ (5/5 + находки A/B/C починены, core 0.25.0/daemon 0.1.18).** Run-метаданные (trigger/triggeredBy/temporary/retryOf), trigger-only, manual retry (`POST /runs/:id/retry`), auto-retry линковка, retention — всё зелёное (43 чек-пойнта). Находки: A) syncTasks disable-on-remove (removed → disabled, док стал правдой); B) `POST /tasks/:name/run` с `{temporary?, data?}`; C) `--help` дефолты. Перетест 12/12. Репорты: `victor/sched/.agents/inbox/2026-08-17T16-02-00Z-*-report.md` + `…T16-09-00Z-*-retest-report.md`. Стенд `.admin/.tmp/sched-r2/r4/`._
_Updated: 2026-08-17 — 🟡 **[sched-fnf-r5] РЕПОРТ ОТПРАВЛЕН — allowedTools sandbox (core 0.26.0/mcp 0.3.0/daemon 0.1.19), ждём фикс.** 30/30 зелёный, 7/7 пунктов (per-task allowedTools, ceiling через runners-блок, mcp per-tool, ssh per-command, docker image@cmd, порядок policy→runner, регресс opt-in). 3 «на ваше усмотрение»: A) ssh — единственный раннер, где ceiling на run (не load); B) mcp http server-only spec тихо no-match (нужен `url:*`); C) docker `alpine@echo` блокирует таску без явного command. Стенд `.admin/.tmp/sched-r2/r5/`. Репорт: `victor/sched/.agents/inbox/2026-08-17T16-58-00Z-admin-fnf-r5-sandbox-report.md`._
_Updated: 2026-08-17 — 🟢 **[sched-fnf-r3-refresh0] ACCEPTED — раунд 3 закрыт.** sched починил `?refresh=0` (ui 0.1.10→0.1.11, comm 926465b): чистую функцию refreshFromSearch (browser-safe модуль, morda.ts с node-импортами ломал esbuild) + NaN-guard. Перетест на стенде r3 (ui 0.1.11, Chrome/CDP, 3 вкладки): (1) `?refresh=0` — fail-fast замер на next 13:42:30/fails 12 за 35с, пока API-истина росла до 14 — polling реально выключен; (2) `?refresh=2500` — 4 запроса /api/tasks за 10с (2.5с каденс) vs 2 (5с) без параметра; (3) дефолт 5с жив. Раунд 3 закрыт полностью (все 4 пункта: tasks/schedules/runs polling + refresh-оверрайд). Репорт: `victor/sched/.agents/inbox/2026-08-17T10-44-00Z-admin-fnf-r3-refresh0-retest.md`._
_Updated: 2026-08-17 — 🟢 **[sched-fnf-r3-ui-autorefresh] ACCEPTED.** sched починил мёртвый polling в Tasks/Schedules (ui 0.1.9→0.1.10, comm 83ac7be): morda слала `el.refreshMs` всем компонентам, но SchedTasks/SchedSchedules его не декларировали — поллил только Runs. Проверил на стенде r3 (8082 daemon + 8083 serve, ui 0.1.10 из verdaccio, реальный Chrome через CDP, без единого клика refresh): Tasks — next run `13:35:37→13:36:52` и fails `0→2` за 35с (fail-fast), stale nextRunAt 5-мин задач пересчитались сами; Schedules — next `13:36:52→13:37:23` + last `13:36:22→13:36:53`; Runs регресс — 4→10 строк без refresh. ⚠️ Находка «на ваше усмотрение»: `?refresh=0` polling НЕ выключает (morda.ts:99 `Number(...) || cfg.refreshMs` — 0 falsy → дефолт 5000; предсуществующий, из 6e64582c, не регрессия фикса; фикс однострочный null-check). Репорт: `victor/sched/.agents/inbox/2026-08-17T10-39-00Z-admin-fnf-r3-ui-autorefresh-retest.md`._
_Updated: 2026-08-17 — 🟢 **[sched-fnf-r3-cache-headers] ACCEPTED.** sched починил отсутствие Cache-Control (core 0.22→0.23.0: admin-api JSON/204 no-store + artifact-proxy no-cache; ui 0.1.8→0.1.9: serve bundle no-store + /api/* прокси no-cache; daemon 0.1.15→0.1.16, comm 3352edb). Перепроверил вживую против собранных dist (поднял admin-api+serve, curl -D): bundle→no-store ✅, serve-proxy /api→no-cache ✅, admin /health+/runs+4xx+trigger→no-store ✅, DELETE 204→no-store ✅ (на существующем ране), artifact-proxy→no-cache ✅. Сьют 464 ✓ (29 файлов; 2 unhandled-warning — известный Lit class-field, не регресс). Версии совпали с опубликованными (core 0.23.0/ui 0.1.9/daemon 0.1.16). Закрывает вчерашние «залипшие running» без Ctrl+F5. Репорт: `victor/sched/.agents/inbox/2026-08-17T08-31-30Z-admin-fnf-r3-cache-headers-retest.md`. Остаток (visibilitychange/refetch-on-focus) — опционально, не блокер._
@@ -1766,10 +1768,10 @@ Cutover DNS уже сделан (07-02) — тут только смена об
---
## [sched-fnf-02-docker-runner] — F&F-тест sched №2 (после приёмки №1): docker runner — периодический one-shot контейнер. Раз в 6ч запускать контейнер с read-only проверкой (например alpine du -sh по каталогу через bind-mount, или rclone stat бакета variant-cache на MinIO), результат/алерт — в ntfy-топик sched-fnf. Учит: docker runner (доки 06.runners/02.docker.md), image allowlist, exit codes, retries. Косяки доки/кода — репортить в inbox victor/sched сразу, не чинить.
## 🟢 [sched-fnf-02-docker-runner] — F&F-тест sched №2 (после приёмки №1): docker runner — периодический one-shot контейнер. Раз в 6ч запускать контейнер с read-only проверкой (например alpine du -sh по каталогу через bind-mount, или rclone stat бакета variant-cache на MinIO), результат/алерт — в ntfy-топик sched-fnf. Учит: docker runner (доки 06.runners/02.docker.md), image allowlist, exit codes, retries. Косяки доки/кода — репортить в inbox victor/sched сразу, не чинить.
**Status:** ready
**Where I stopped:** (не начато) — письмо-приёмка №1 в .agents/inbox/ (sched-fnf-01-accepted)
**Status:** 🟢 done
**Where I stopped:** (закрыто как дубль — работа принята в основном 🟢-блоке, F&F цикл закрыт 2026-08-16)
**Next action:** прочитать docs/content/docs/06.runners/02.docker.md; собрать задачу runner=docker (one-shot контейнер, read-only проверка → ntfy); прогнать; проверить run history + exit codes/retries; репорт в inbox victor/sched (коммит в .agents/inbox/)
**Branch:** n/a
**Notify:** victor/sched
@@ -1777,10 +1779,10 @@ Cutover DNS уже сделан (07-02) — тут только смена об
---
## [sched-fnf-03-async-poll] — F&F-тест sched №3 (после приёмки №2): async/poll протокол. Свой мини-воркер-эндпоинт (HTTP): принимает задачу (202 accepted + statusUrl), завершает через N секунд; sched-задача в envelope-режиме http-runner поллит statusUrl до терминального статуса. Проверить: историю ранов (queued → running → succeeded), контракт PollResult; опционально — poll-timeout кейс (воркер, который не завершается, на embedded-движке с коротким pollTimeoutMs). Учит: 06.runners/01.http.md (envelope mode), 05.protocol.md, poll-цикл движка. Косяки доки/кода — репортить в inbox victor/sched сразу, не чинить.
## 🟢 [sched-fnf-03-async-poll] — F&F-тест sched №3 (после приёмки №2): async/poll протокол. Свой мини-воркер-эндпоинт (HTTP): принимает задачу (202 accepted + statusUrl), завершает через N секунд; sched-задача в envelope-режиме http-runner поллит statusUrl до терминального статуса. Проверить: историю ранов (queued → running → succeeded), контракт PollResult; опционально — poll-timeout кейс (воркер, который не завершается, на embedded-движке с коротким pollTimeoutMs). Учит: 06.runners/01.http.md (envelope mode), 05.protocol.md, poll-цикл движка. Косяки доки/кода — репортить в inbox victor/sched сразу, не чинить.
**Status:** ready
**Where I stopped:** (не начато) — письмо-приёмка №2 в .agents/inbox/ (sched-fnf-02-accepted)
**Status:** 🟢 done
**Where I stopped:** (закрыто как дубль — работа принята в основном 🟢-блоке, F&F цикл закрыт 2026-08-16)
**Next action:** прочитать docs 06.runners/01.http.md (envelope mode) + 05.protocol.md; написать мини-воркер (accepted + statusUrl + отложенное завершение); собрать задачу с envelope:true; прогнать; проверить queued→running→succeeded и poll-историю; опционально timeout-кейс; репорт в inbox victor/sched (коммит в .agents/inbox/)
**Branch:** n/a
**Notify:** victor/sched
@@ -1788,10 +1790,10 @@ Cutover DNS уже сделан (07-02) — тут только смена об
---
## [sched-fnf-04-embedded-alerts] — F&F-тест sched №4 (финальный, после приёмки №3): embedded-режим без daemon. Один Node-скрипт: createEngine + createInternalRunner + createSqliteStorage + syncTasks (внутренний хендлер в процессе). Реальная проверка из твоей инфры: свежесть бэкапов (возраст последнего снапшота/бэкап-файла — kreknin или бэкап-каталог, SSH/локально на выбор), если stale → алерт через createAlerts (ntfy basic user+password теперь поддержан, или email). Retries (maxAttempts/backoff) на транзиентные ошибки. Учит: 02.quick-start §1 (embedded), 06.runners/04.internal.md, 03.tasks.md (retry), 11.self-hosting.md (alerts/onRunFinal). Косяки доки/кода — репортить в inbox victor/sched сразу, не чинить.
## 🟢 [sched-fnf-04-embedded-alerts] — F&F-тест sched №4 (финальный, после приёмки №3): embedded-режим без daemon. Один Node-скрипт: createEngine + createInternalRunner + createSqliteStorage + syncTasks (внутренний хендлер в процессе). Реальная проверка из твоей инфры: свежесть бэкапов (возраст последнего снапшота/бэкап-файла — kreknin или бэкап-каталог, SSH/локально на выбор), если stale → алерт через createAlerts (ntfy basic user+password теперь поддержан, или email). Retries (maxAttempts/backoff) на транзиентные ошибки. Учит: 02.quick-start §1 (embedded), 06.runners/04.internal.md, 03.tasks.md (retry), 11.self-hosting.md (alerts/onRunFinal). Косяки доки/кода — репортить в inbox victor/sched сразу, не чинить.
**Status:** ready
**Where I stopped:** (не начато) — письмо-приёмка №3 в .agents/inbox/ (sched-fnf-03-accepted)
**Status:** 🟢 done
**Where I stopped:** (закрыто как дубль — работа принята в основном 🟢-блоке, F&F цикл закрыт 2026-08-16)
**Next action:** прочитать docs 02.quick-start §1 (embedded) + 06.runners/04.internal.md + 03.tasks.md (retry) + 11.self-hosting.md (alerts); написать embedded-скрипт (внутренний хендлер: проверка свежести бэкапа; retries; createAlerts на onRunFinal); прогнать happy path + stale-кейс; репорт в inbox victor/sched (коммит в .agents/inbox/)
**Branch:** n/a
**Notify:** victor/sched
@@ -1799,9 +1801,9 @@ Cutover DNS уже сделан (07-02) — тут только смена об
---
## 🟡 [sched-fnf-round2-docs-review] — F&F sched раунд 2: ревью доков после storage-сплита (core 0.13.0, адаптеры 0.1.0). Проверено живьём (стенд .admin/.tmp/sched-r2/): 3 косяка в репорт — (1) @sched/core/storage-contract subpath нерабочий (vitest не в deps core, ERR_MODULE_NOT_FOUND), (2) quick-start §1 embedded-пример на CJS против ESM-only пакета (мёртв с первой команды), (3) §2.4 обещает result {greeting}, legacy http-runner отдаёт result:null. Мелочи: CLI игнорит неизвестные флаги; sched shim в git-bash сломан. Гладкое: storage-сплит чистый, MySQL-адаптер живьём против MySQL 8.4, 13.ui delete/токен-бокс, --poll-timeout. Репорт: victor/sched/.agents/inbox/2026-08-16T17-40-09Z-admin-fnf-round2-review.md.
## 🟢 [sched-fnf-round2-docs-review] — F&F sched раунд 2: ревью доков после storage-сплита (core 0.13.0, адаптеры 0.1.0). Проверено живьём (стенд .admin/.tmp/sched-r2/): 3 косяка в репорт — (1) @sched/core/storage-contract subpath нерабочий (vitest не в deps core, ERR_MODULE_NOT_FOUND), (2) quick-start §1 embedded-пример на CJS против ESM-only пакета (мёртв с первой команды), (3) §2.4 обещает result {greeting}, legacy http-runner отдаёт result:null. Мелочи: CLI игнорит неизвестные флаги; sched shim в git-bash сломан. Гладкое: storage-сплит чистый, MySQL-адаптер живьём против MySQL 8.4, 13.ui delete/токен-бокс, --poll-timeout. Репорт: victor/sched/.agents/inbox/2026-08-16T17-40-09Z-admin-fnf-round2-review.md.
**Status:** paused
**Status:** 🟢 done
**Where I stopped:** DONE (2026-08-16) — ревью отправлено (17:40Z). 3 косяка + 2 мелочи. **Дополнение 17:48Z — критичный баг UI sched-runs**: статусы врут (сдвиг на 1 при обновлении списка, не-keyed Lit + sched-status не перерисовывается по атрибуту); воспроизведено 11/17 строк; репорт `victor/sched/.agents/inbox/2026-08-16T17-48-12Z-admin-fnf-round2-ui-status-bug.md`. **Перепроверка 18:08Z**: 5/5 фиксов core 0.14.0/daemon 0.1.5 приняты (contract subpath без vitest, embed.mjs ESM, legacy result {greeting}, CLI strict, git-bash shim); UI status-desync ЖИВ (33/50 строк) — письмо `2026-08-16T18-08-55Z-admin-fnf-round2-recheck.md`, ждём фикс. **ФИНАЛ 18:39Z**: UI-фикс подтверждён на @sched/ui 0.1.3 (keyed list, 0/50 после 4 сдвигов); 0.1.2 ушёл со stale-dist (md5==0.1.1, их гоча снова выстрелила; prepack 75dd146 закрывает). Раунд 2 полностью закрыт.
**Next action:** ждать приёмки/фиксов sched → перепроверить по пингу.
**Branch:** n/a