diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index c39444b..380735e 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,65 +1,47 @@ --- -_last_updated_: 2026-08-12T12:00:00Z -session_id: 2026-08-12-admin-kreknin-gitea -prev_session_id: 2026-08-10-admin-pi-inbox-monitor +_last_updated_: 2026-08-14T11:00:00Z +session_id: 2026-08-14-admin-stostayer-formsubmissions +prev_session_id: 2026-08-12-admin-kreknin-gitea --- # Next session handoff -## Главное за сессию (2026-08-12) +## Recent commits (эта сессия, .admin) -**Gitea на kreknin установлен и работает: https://git.kreknin.site/ (LE-серт).** - -- Gitea 1.27.1 + postgres 16, чистые контейнеры (`/volume1/docker/gitea/`), БД на volume1 (не SSD — требование). Админ `kreknin` (pass kreknin/gitea). -- Traefik на kreknin починен: лежал с 07-31 (restart policy был `no`) → `restart: unless-stopped`. Проброс 80/443→8000/4443 добавлен в GUI Keenetic (API KeeneticOS Viva закрыт для curl — только GUI). -- **Gitea на kreknin ЗАКРЫТ ПОЛНОСТЬЮ** (2026-08-12): https://git.kreknin.site/ работает и снаружи (LE-серт), и из LAN Алексея. **DNS-override сделан через RCI API** (концепт `.wiki/concepts/keenetic-rci-api.md`): `ip host git.kreknin.site/kreknin.site → 192.168.1.43`. KeeneticOS 5.1.3 hairpin НЕ чинит — DNS-override это решение. Правила порт-форвардинга в 5.x лежат в `ip.static` (to-host=MAC). -- **Из LAN 443 занят встроенным nginx DSM** → reverse proxy `git.kreknin.site:443 → proxy_pass https://127.0.0.1:4443` (traefik) в `server.ReverseProxy.conf` w3conf. LE-серт для nginx — извлечён из traefik acme.json + **автосинк**: `/volume1/scripts/acme-nginx-sync.sh` + cron 15 мин (ротация сама). DSM-пароль не нужен (root SSH). -- Пароль Keenetic: `pass kreknin/keenetic` (t3r1a4k314). -- Keenetic отваливался на провайдере (не свет) — монитор-расширение сработал, удалён после завершения. - -## Pi-доставка инбокса (2026-08-10) - -- **Глобальное pi-расширение** `inbox-monitor.ts` (source of truth: `.common/lib/pi-extensions/`, деплой: `~/.pi/agent/extensions/` — byte-identical) — **session-scoped**: смотрит только `/.agents/inbox/` (свой проект). ПЕРВАЯ версия (глобальный скан всех инбоксов) отменена в тот же день — правило vitya: «ты другие инбоксы читать не имеешь права. Только в своей директории». PUSH-поллер 15s (интерактив) + PULL `agent_settled` sweep, доставка через `sendUserMessage` с заголовком `[inbox] <имя-файла>`, move в `.read/`. Headless (`pi -p`) — доставки нет, сообщения ждут интерактив. -- **Тесты**: `inbox-monitor.test.mjs` — 3 блока ALL PASS (`node --experimental-strip-types`). Живой лоад в pi 0.84.1 подтверждён headless-прогоном. -- **Скил**: `session-inbox-monitor` v0.3.0, секция «Pi support» (claude-skills 07e7820). `.common` 2ad8199. -- **TODO**: при следующей интерактивной pi-сессии сделать `/reload` (или расширение подхватится само при старте новой сессии). - -## Старый контекст (2026-08-07) - -Эпик **flat-fields** ЗАКРЫТ. `fields[]` убран — поля в корне объекта. Loader мигрирован. - -- **@snolla/snolla → @snolla/web** — 7 сайтов пересобраны и передеплоены (вторая волна ренеймов) -- **Content-Type гейтинг** — vendor-Accept (`application/vnd.snolla.admin+json`) только для web-админки. Default = корневые поля. Save: `Content` без vendor → 400. -- **fields[] → корневые поля** — admin-api 0.4.0 (read/write flat), client 0.5.2 (index-signature), schema-gen 0.2.1 (генератор flat). Вся тройка published+pushed. -- **Loader → flat root fields** — pilorama98 `0db46e1` в проде. Тесты 105/105. yml_category_id + short_description для required-полей. -- **Content-валидация** — admin-api 0.5.0 published (snolla), НЕ развёрнута на пилораме. +- `meta(tasks,wiki)`: stostayer-web 0.3.23 deploy — task done + runbook nuances (offline-build linux-bins, :9000 port, prod tag) +- `meta(wiki)`: runbook — offline-cache fixed by 5c583f8 (supportedArchitectures), yarn install replenished cache +- `meta(wiki)`: inbox-rename audit — .claude-inbox → .agents/inbox clean (op-log record) +- `meta(wiki)`: MSSQL FormSubmissions.Content varchar→nvarchar (₽ fix) — op-log +- `meta(wiki)`: FormSubmissions nvarchar coordination closed — op-log decision ## Open треки | Трек | Готовность | Entry-point | |---|---|---| -| admin-api 0.5.0 (валидация) → пилорама | published, ждёт волны | бамп в apps/web + деплой | -| yml_category_id — маппинг для YML-фида | эмпирически сверен, нужен production-тест | loader `bin/index.js` + фид | -| Коллизия `description` (контент-поле ↔ колонка) | на snolla/schema-gen | при следующей встрече | -| Loader прод-импорт (живой) | НЕ запускался после 0.4.0 | решение vitya | +| VDS-копия БД `stostayer` (FormSubmissions.Content = varchar cp1251) | вопрос «нужна ли копия вообще» — к оператору; snolla не трогает | ALTER `... NVARCHAR(MAX) NULL` если решат оставить | +| stostayer legacy backport unicode-фикса в @snollajs 0.7.x | опция, не срочно; ALTER уже покрывает | референс коммит `065bb44` (snolla) | +| Бамп тиража `@snolla/data@0.15.1` (forms nvarchar в модели) | в релизную волну snolla, БД уже nvarchar — спешки нет | `yarn up -R @snolla/data@0.15.1` | +| Тестовые заявки stostayer #68485/#68486 (прод) | НЕ удалены — ждут подтверждения | DELETE по ID после решения | +| Kreknin md3 rebuild (из прошлой сессии) | шёл на 2026-08-10, вне этой сессии | см. kreknin-repair-md3-rebuild | ## Спроси user'а -- Деплоить admin-api 0.5.0 (валидация) на пилораму сейчас или со следующей фичей? -- Запускать живой импорт loader'а через новый flat API? +- VDS-копия `stostayer` нужна? (если да — ALTER; если нет — можно игнорить) +- Тестовые заявки #68485/#68486 на проде stostayer удалить? ## Не делать (preemptive guards) -- НЕ слать vendor-Accept из loader'а — это только для web-админки snolla -- НЕ деплоить admin-api 0.5.0 без проверки required-полей (79/229 продуктов были без yml_category_id) -- Portainer PUT: НЕ использовать `Env:[]` — очищает секреты. Всегда fetch + re-supply. -- НЕ ротировать `sk_6a83…` -- НЕ слать директивы другим сессиям без сверки с vitya +- НЕ делать warn-харднинг / backward-compat в forms-core — решение vitya «ничего не делать» (передано snolla, docs `forms-email-contract.md` остаются) +- НЕ трогать VDS-копию stostayer без решения оператора +- НЕ писать в `.claude-inbox` — канал = `/.agents/inbox/` (ренейм idea 13, аудит проведён 2026-08-14) +- НЕ долбить push в `docker.stostayer.ru` — один push без retry (бан egress 2026-07-21); 0.3.23 push прошёл штатно (слои already-exists) +- Portainer PUT: НЕ `Env:[]` — очищает секреты; всегда fetch + re-supply +- НЕ удалять заявки/данные без явного подтверждения ## Memory updates за сессию -- `snolla-namespace-wins` — подтверждён: вторая волна ренеймов (@snolla/snolla→web) -- `admin-api-vds-deploy` — обновлён: стек 25 retire, admin-api в pilonuxt -- `portainer-env-empty-clears-secrets` — новый: Portainer PUT с Env:[] = потеря всех секретов -- `admin-api-content-gating-vendor-accept` — новый: vendor-Accept = web-admin only, default = flat fields -- `piloruxt-build-needs-generated-dir` — новый: src/generated/ gitignored, нужно scp перед docker build +- `stostayer-web-deploy-runbook.md` — прод-тег 0.3.23, offline-гоча РЕШЕНА (supportedArchitectures `5c583f8` + сетевой yarn install один раз), Portainer API `base=http://:9000` (порт обязателен) +- `.wiki/log.md` — деплой 0.3.23, offline-фикс, inbox-rename audit, FormSubmissions (ALTER + координация) +- Инструмент MSSQL-запросов: `tedious` из `stostayer.new/packages/web/node_modules` (скрипты `.admin/.tmp/mssql-{exec,scan}.js`, gitignored) +- Тиража формы: у ВСЕХ snolla-сайтов есть FormSubmissions (pilorama98 2516, labtools 916 и т.д.) — MoreThenCms общая, Content уже nvarchar +- Клиентский stostayer MSSQL: `91.222.236.225:1433` открыт снаружи, креды `pass stostayer/client` (mssql_admin_*)