docs(tasks): session handoff — stostayer 0.3.23 deploy + FormSubmissions nvarchar coordination

This commit is contained in:
2026-08-14 09:24:13 +03:00
parent 23216c76d6
commit 2d8c5103a8

View File

@@ -1,65 +1,47 @@
--- ---
_last_updated_: 2026-08-12T12:00:00Z _last_updated_: 2026-08-14T11:00:00Z
session_id: 2026-08-12-admin-kreknin-gitea session_id: 2026-08-14-admin-stostayer-formsubmissions
prev_session_id: 2026-08-10-admin-pi-inbox-monitor prev_session_id: 2026-08-12-admin-kreknin-gitea
--- ---
# Next session handoff # Next session handoff
## Главное за сессию (2026-08-12) ## Recent commits (эта сессия, .admin)
**Gitea на kreknin установлен и работает: https://git.kreknin.site/ (LE-серт).** - `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
- Gitea 1.27.1 + postgres 16, чистые контейнеры (`/volume1/docker/gitea/`), БД на volume1 (не SSD — требование). Админ `kreknin` (pass kreknin/gitea). - `meta(wiki)`: inbox-rename audit — .claude-inbox → .agents/inbox clean (op-log record)
- Traefik на kreknin починен: лежал с 07-31 (restart policy был `no`) → `restart: unless-stopped`. Проброс 80/443→8000/4443 добавлен в GUI Keenetic (API KeeneticOS Viva закрыт для curl — только GUI). - `meta(wiki)`: MSSQL FormSubmissions.Content varchar→nvarchar (₽ fix) — op-log
- **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). - `meta(wiki)`: FormSubmissions nvarchar coordination closed — op-log decision
- **Из 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**: смотрит только `<ctx.cwd>/.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), НЕ развёрнута на пилораме.
## Open треки ## Open треки
| Трек | Готовность | Entry-point | | Трек | Готовность | Entry-point |
|---|---|---| |---|---|---|
| admin-api 0.5.0 (валидация) → пилорама | published, ждёт волны | бамп в apps/web + деплой | | VDS-копия БД `stostayer` (FormSubmissions.Content = varchar cp1251) | вопрос «нужна ли копия вообще» — к оператору; snolla не трогает | ALTER `... NVARCHAR(MAX) NULL` если решат оставить |
| yml_category_id — маппинг для YML-фида | эмпирически сверен, нужен production-тест | loader `bin/index.js` + фид | | stostayer legacy backport unicode-фикса в @snollajs 0.7.x | опция, не срочно; ALTER уже покрывает | референс коммит `065bb44` (snolla) |
| Коллизия `description` (контент-поле ↔ колонка) | на snolla/schema-gen | при следующей встрече | | Бамп тиража `@snolla/data@0.15.1` (forms nvarchar в модели) | в релизную волну snolla, БД уже nvarchar — спешки нет | `yarn up -R @snolla/data@0.15.1` |
| Loader прод-импорт (живой) | НЕ запускался после 0.4.0 | решение vitya | | Тестовые заявки stostayer #68485/#68486 (прод) | НЕ удалены — ждут подтверждения | DELETE по ID после решения |
| Kreknin md3 rebuild (из прошлой сессии) | шёл на 2026-08-10, вне этой сессии | см. kreknin-repair-md3-rebuild |
## Спроси user'а ## Спроси user'а
- Деплоить admin-api 0.5.0 (валидация) на пилораму сейчас или со следующей фичей? - VDS-копия `stostayer` нужна? (если да — ALTER; если нет — можно игнорить)
- Запускать живой импорт loader'а через новый flat API? - Тестовые заявки #68485/#68486 на проде stostayer удалить?
## Не делать (preemptive guards) ## Не делать (preemptive guards)
- НЕ слать vendor-Accept из loader'а — это только для web-админки snolla - НЕ делать warn-харднинг / backward-compat в forms-core — решение vitya «ничего не делать» (передано snolla, docs `forms-email-contract.md` остаются)
- НЕ деплоить admin-api 0.5.0 без проверки required-полей (79/229 продуктов были без yml_category_id) - НЕ трогать VDS-копию stostayer без решения оператора
- Portainer PUT: НЕ использовать `Env:[]` — очищает секреты. Всегда fetch + re-supply. - НЕ писать в `.claude-inbox` — канал = `<target>/.agents/inbox/` (ренейм idea 13, аудит проведён 2026-08-14)
- НЕ ротировать `sk_6a83…` - НЕ долбить push в `docker.stostayer.ru` — один push без retry (бан egress 2026-07-21); 0.3.23 push прошёл штатно (слои already-exists)
- НЕ слать директивы другим сессиям без сверки с vitya - Portainer PUT: НЕ `Env:[]` — очищает секреты; всегда fetch + re-supply
- НЕ удалять заявки/данные без явного подтверждения
## Memory updates за сессию ## Memory updates за сессию
- `snolla-namespace-wins` — подтверждён: вторая волна ренеймов (@snolla/snolla→web) - `stostayer-web-deploy-runbook.md` — прод-тег 0.3.23, offline-гоча РЕШЕНА (supportedArchitectures `5c583f8` + сетевой yarn install один раз), Portainer API `base=http://<IP>:9000` (порт обязателен)
- `admin-api-vds-deploy` — обновлён: стек 25 retire, admin-api в pilonuxt - `.wiki/log.md` — деплой 0.3.23, offline-фикс, inbox-rename audit, FormSubmissions (ALTER + координация)
- `portainer-env-empty-clears-secrets` — новый: Portainer PUT с Env:[] = потеря всех секретов - Инструмент MSSQL-запросов: `tedious` из `stostayer.new/packages/web/node_modules` (скрипты `.admin/.tmp/mssql-{exec,scan}.js`, gitignored)
- `admin-api-content-gating-vendor-accept` — новый: vendor-Accept = web-admin only, default = flat fields - Тиража формы: у ВСЕХ snolla-сайтов есть FormSubmissions (pilorama98 2516, labtools 916 и т.д.) — MoreThenCms общая, Content уже nvarchar
- `piloruxt-build-needs-generated-dir` — новый: src/generated/ gitignored, нужно scp перед docker build - Клиентский stostayer MSSQL: `91.222.236.225:1433` открыт снаружи, креды `pass stostayer/client` (mssql_admin_*)