Files
admin/.tasks/coord-loader-admin-api-client.md
vitya 219a8b3d43 meta(handoff): camel-эпик ОТМЕНЁН (vitya) — деплой-парковки нет, live ca0dfa3 (Pascal) остаётся
- vitya: «после S2 деплой не нужен» — весь camel-эпик (S1 wire + S2 клиент 0.3.x + loader re-миграция) отменён
- loader уже мигрирован на Pascal-провод (клиент 0.2.1), прод-импорт done — переделывать нечего
- 2ffd66a — мусор (собран, не запушен); деплой не отдельная веха, релиз = часть выпуска фичи
- письмо snolla отправлено (18-10-26Z): S2 не стартуем
- урок: не строить rework-эпик на работающем проводе без потребителя

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-04 21:11:51 +03:00

12 KiB
Raw Blame History

coord-loader-admin-api-client

Goal

Я (admin-сессия) — координатор таски у pilorama98.ru loader-migrate-to-admin-api-client: перевод apps/loader с прямого DB-доступа (@snollajs/data, MSSQL MoreThenCms) на типизированный @snolla/admin-api-client (разрабатывает snolla, таска admin-typed-api). Vitya назначил 2026-08-04.

Роль

  • Координатор миграции загрузчика (pilorama98): отслеживать готовность snolla (клиент + API Key + ответы на open questions), маршрутизировать, разблокировать, эскалировать застой.
  • Ревьюер snolla (назначен vitya 2026-08-04): код admin-typed-api — S1 auth/keys, S2 @snolla/admin-api-client, S3 @snolla/admin-schema-gen. Канал: snolla шлёт ревью-запрос в мой inbox (commit/hash + что смотреть), я ревьюю и возвращаю финайдинги. Ревью S2 — до публикации в Verdaccio (pilorama98 завязан на клиент).
  • Ревьюер загрузчика pilorama98 (назначен vitya 2026-08-04): код миграции — ApiCatalogStore, contract-tests, identity-тест. Канал: pilorama98 шлёт commit'ы + что смотреть; фокус — identity (API vs DB одинаковое состояние) и byte-for-byte Content.

Ревью-чекпойнты (snolla)

  • S2 + S3 — ревью DONE, F1 CONFIRMED 2026-08-04T14:48Z, publish разрешён. Фиксы f9714f2+ddf47a1: F1a server-guard Fields.length>0, F1b typed-save без Fields при пустых defs (Content byte-for-byte), F3 джанкции в $transaction (tx прокинут), F5 pascal-сан, F6 no-clobber. Пере-ревью + тесты: admin-api 13/13, schema-gen 19/19, client 19/19+tsc0, остатков [TEST] в проде 0. Нюанс F2: variants ?sku= , Sku в products search-OR не добавлен (не блокер; loader матчит продукты списком/ProductId). Жду: publish 0.2.0/0.1.0 + API Key.
  • S1 auth-плагин (PAT+cookie-JWT) + keys-эндпоинты — DONE (в проде; snolla admin-typed-api: ApiKeys DDL на обоих SNOLLA, auth 396/396, keys-эндпоинты live)

Текущий статус

  • 🟢 2026-08-04T18:10Z — КООРДИНАЦИЯ ЗАКРЫТА, camel-эпик ОТМЕНЁН vitya. Loader-миграция сделана и в проде (см. ниже). Отдельная camel-нормализация (S1 wire camelCase
    • S2 клиент 0.3.x camel + loader re-миграция) — ОТМЕНЕНА: loader уже на Pascal (0.2.1), прод-импорт done; деплой 2ffd66a не будет, S2 не стартуем. Письмо snolla отправлено (18-10-26Z). Ревью-роль на S2-клиент снята (S2 нет). Live admin-api ca0dfa3 (Pascal) остаётся.
  • 🟢 2026-08-04T16:30Z — ПРОД-ИМПОРТ ЧЕРЕЗ API ВЫПОЛНЕН, ВСЁ ЗАКРЫТО. pilorama98: exit 0, 224 rows, products 224 update/0 create, pages 32, price-tables 25. Прод admin-api: ~2070 API-вызовов, 0 ошибок (только внешние 401-пробы на /, /robots.txt). Read-back: 229 products, контент на месте. Миграция 100% (координация + ревью + деплой + прод).
  • 🟢 2026-08-04T16:17Z — МИГРАЦИЯ ЗАВЕРШЕНА. Таска pilorama98 🟢 done. Все acceptance 14 выполнены (identity PASS, bin/* через store, TDD 105/105, ключ gitignored). baseUrl переключён на прод https://admin-api.vds.kzntsv.site. Координация закрыта. Остаётся операционный шаг: реальный прод-импорт (node bin/index.js, store:api) — решение vitya; рекомендация — через identity-check против прод-эндпоинта.
  • 🟢 2026-08-04T16:16Z — ротация ключа: РЕШЕНО не ротировать (vitya: «на ключ похуй», риск приватного Gitea принят). Ключ sk_6a83… остаётся. Вопрос закрыт.
  • 🟢 2026-08-04T15:42Z — IDENTITY PASS , миграция по коду ЗАКРЫТА.
    • Ошибки (оператор прав): (1) 400 на числовом sku → String() с null-guard; (2) toLegacyTag без content → 86 breadcrumbs-diff. Пофикшены (665006f, 105/105).
    • identity-check.js харнесс ревьюнут (оба пути→staging, полевой diff content, --fresh). PASS: 229 products / 3327 variants идентичны (API vs DB). Acceptance №1 закрыт.
    • Прод-cutover: admin-api прод жив (https://admin-api.vds.kzntsv.site), pilorama98 переключает baseUrl; staging-PASS достаточно, прод-прогон опционален.
  • 🟢 2026-08-04T15:36Z — ДЕПЛОЙ admin-api LIVE на vds. admin-api.vds.kzntsv.site (стек 25, образ ca0dfa3 ESM-фикс). /health ok, LE-серт выдан, ключ pilorama98 проходит. Prod-эндпоинт для loader'а после identity. Compose source-of-truth закоммичен (cd76ce8f).
  • 🔵 2026-08-04T15:26Z — деплой admin-api: стек 25 создан, блокер в Dockerfile.
    • Образ admin-api:e1540de собран+запушен. Стек 25 (admin-api.vds.kzntsv.site, env 8/8, proxy-сеть, mem_limit 512m) создан. Контейнер крашится: ESM ERR_MODULE_NOT_FOUND dist/plugins/prisma — 32 файла extensionless импортов + tsconfig moduleResolution:bundler. Фикс маршрутизирован snolla (15-26-16Z): добавить .js + node16, или bundle esbuild. Staging 4732 (tsx) работает — identity не блокируется. Жду sha фикса → пересборка + PUT.
  • 🟢 2026-08-04T15:18Z — staging admin-api перезапущен с Number-fix (911b9b7). Write-probe сам: Number 424242→424242 , throwaway удалён. pilorama98 запускает identity-прогон (bump 0.2.1 + Number в ApiCatalogStore, 104/104).
  • 🟢 2026-08-04T15:14Z — Number РЕШЁН, identity-тест разблокирован.
    • snolla: Number добавлен в products/save (911b9b7/6fe1088, client 0.2.1): create — присланный иначе findNextNumber, update — ставит если прислан. Тесты 23/23+19/19, чисто.
    • pilorama98: F1 (apiKey→local.json gitignored)+F2 (TypeId из чтения) пофикшены (4372c59, 103/103). Собирают identity-тест на staging (bump 0.2.1 + Number в ApiCatalogStore).
    • Ротация ключа (был в истории git fb07849): рекомендация — принять риск (приватный Gitea), решение за vitya.
    • Деплой: жду Dockerfile от snolla.
  • 🟢 2026-08-04T15:12Z — ревью ApiCatalogStore DONE (тесты 102/102).
    • F1 🔴 API-ключ sk_6a83… закоммичен в apps/loader/config/default.json (трекаемый) — нарушение acceptance №4; фикс: config/local.json gitignored + ротация (по решению pilorama98).
    • F2 🟡 updateProduct хардкодит TypeId (расходится с DB-путем для др. типа); F3 🟡 get+save на джанкции (перф). Content byte-for-byte/джанкции/пагинация/store-selection .
    • Number: зазор подтверждён, вопрос у snolla (15:06Z).
  • 🟢 2026-08-04T15:06Z — staging write-probe: ок, но зазор Number.
    • pilorama98: products/save Content byte-for-byte , variants/save . ⚠️ Number серверно-манится (saveSchema без Number, create = findNextNumber max+1) → identity по Number ломается (лоадер пишет явно). Вопрос маршрутизирован snolla (15-06-26Z), рекомендация — добавить Number в save-schema. Если server-managed → решение vitya (ослабить identity по Number / гибрид).
    • Деплой-план согласован с snolla (14-56-38Z): Dockerfile — snolla коммитит, оркестрация/деплой — я; хостнейм admin-api.vds.kzntsv.site; один общий инстанс; env JWT_SECRET (реальный)/DATABASE_URL/S3; mem_limit 512m.

Хронология

  • Staging admin-api поднят 127.0.0.1:4732MoreThenCmsStaging (свежая копия MoreThenCms на vds mssql, restore из COPY_ONLY-бэкапа, snolla=db_owner, логи сжаты). Ключ pilorama98 проходит (scope read-write). Письмо pilorama98 14-59-32Z (staging + роль ревьюера).
  • Лог-чистка (вопрос vitya): MoreThenCms 10ГБ→1ГБ (SIMPLE recovery + SHRINK, кап-риск Express устранён), staging log 10ГБ→259МБ. Диск 35ГБ свободно.
  • Деплой-план согласован с snolla (14-56-38Z): Dockerfile — snolla коммитит, оркестрация/деплой — я; хостнейм admin-api.vds.kzntsv.site; один общий инстанс; env JWT_SECRET (реальный)/DATABASE_URL/S3; mem_limit 512m.
  • Инцидент snolla: cleanup-live-keys [CLIENT-VERIFY] — LIKE character class снёс ключ, перевыпущен + скрипт починен (7eb1bb8).

Хронология

  • Решение vitya: расширять snolla (AskUserQuestion). snolla подтвердила независимо — variants/categories/tags + джанкции в текущем скоупе, реализует после ядра кодгена.
  • Контракт от snolla relay'нут pilorama98 (14-29-11Z): query (GET list?scope&skip&take / POST list; {success,data,total}), write (save=upsert по entity-id, delete по id, идемпотентно; 400/404/500), page.content byte-for-byte только при Content (не Fields[]), auth Bearer sk_… + POST /api/keys, base URL per-env. Джанкции = reconciliation CategoryIds[]/TagIds[] в products/save.
  • pilorama98: prep разблокирован (seam-рефактор DbCatalogStore + contract-tests-каркас), таска 🔵 до publish + ключ.
  • snolla: ревьюер-роль подтверждена; S2 publish держится до моего ревью.
  • Жду: publish S2 + API Key; пинги с commit'ами на ревью (S1 auth/keys, S2 клиент, джанкции).

Открытый вопрос оператору (vitya) — РЕШЁН 2026-08-04

Расширять snolla на variants/categories/tags (+ джанкции). Выбрано vitya, подтверждено snolla. Полный разблок миграции loader'а; acceptance №1 pilorama98 цел.

Хронология

  • 2026-08-04: ApiKeys миграция прогнана на обоих боевых SNOLLA (vds MoreThenCms
    • stostayer stostayer) — таблица dbo.ApiKeys + индексы + FK. Это предпосылка S1 auth-плагина / keys-эндпоинтов snolla. Письмо snolla отправлено (snolla/.claude-inbox/2026-08-04T13-29-54Z-admin.md).
  • 2026-08-04: назначен координатором, письма-интро обоим проектам.

Связанное

  • Таска pilorama98: ~/projects/pilorama98.ru/.tasks/loader-migrate-to-admin-api-client.md (🔵 blocked на snolla; open questions там).
  • Таска snolla: ~/projects/snolla/.tasks/admin-typed-api.md (S1 auth — после DDL).