[CL-PIX-7269] Доставка recovery-коммитов: фикс типа hiddenUI и разрешение merge-конфликта #918

Merged
andrei merged 51 commits from agent-fullstack/pix-7269-recovery into master 2026-06-27 00:17:12 +00:00
Owner

Что сделано

Доставлены восстановленные (recovery) коммиты ветки agent-fullstack/pix-7269-recovery (задача PIX-7269) в master через PR. Разрешён merge-конфликт и устранён блокер доставки:

  • Исправлена ошибка типов TS2559: hiddenUI в LI.FI-виджете возвращён к объектной форме { poweredBy: true } (тип HiddenUIConfig в @lifi/widget@4.0.0). Коммит 5c42917b7 ошибочно сменил его на массив ['poweredBy'], что блокировало tsc в app/ и всю доставку. Файлы: app/src/components/p2p/SwapContent.tsx, app/src/pages/cabinet/SwapPage.tsx.
  • Разрешены конфликты слияния с актуальной remote-веткой (объединение, без потери чужих коммитов, включая фикс теста Redis rate limiting):
    • api/src/__tests__/dotenv.setup.ts — объединены комментарий загрузки .env и проверка REDIS_URL.
    • api/vitest.config.ts — сохранены и GOOGLE_CLIENT_ID/APPLE_CLIENT_ID, и REDIS_URL.
    • app/src/__tests__/public-compliance-claims.test.ts — сохранены guardrail-тесты PIX-7494.
  • В api/src/__tests__/rls.security.test.ts метки security-scan-ignore перенесены на строки самих вызовов $queryRawUnsafe/$executeRawUnsafe (контролируемый тестовый SQL без пользовательского ввода) — иначе pre-commit security-scan блокировал коммит.

Зачем

Recovery-коммиты IR/контент/тесты были зафиксированы локально, но не доезжали до master из-за конфликта слияния и реальной ошибки типов. Это закрывает потерю доставленной работы (PIX-13302).

План тестирования

Локальный pre-push гейт пройден полностью: api tsc --noEmit, app tsc --noEmit, app build (176 маршрутов prerender), api vitest — 189 тестов passed. Финальную проверку выполнит CI Forgejo на PR.

Где могу ошибаться

  • Объём PR большой (накопленные merge-коммиты); основной content-diff к master — ~22 файла. Перед merge нужен зелёный CI.
  • Незакоммиченная правка api/src/controllers/public.controller.ts в основном worktree принадлежит другому агенту и в доставку НЕ включена.
## Что сделано Доставлены восстановленные (recovery) коммиты ветки `agent-fullstack/pix-7269-recovery` (задача PIX-7269) в `master` через PR. Разрешён merge-конфликт и устранён блокер доставки: - Исправлена ошибка типов TS2559: `hiddenUI` в LI.FI-виджете возвращён к объектной форме `{ poweredBy: true }` (тип `HiddenUIConfig` в `@lifi/widget@4.0.0`). Коммит `5c42917b7` ошибочно сменил его на массив `['poweredBy']`, что блокировало `tsc` в `app/` и всю доставку. Файлы: `app/src/components/p2p/SwapContent.tsx`, `app/src/pages/cabinet/SwapPage.tsx`. - Разрешены конфликты слияния с актуальной remote-веткой (объединение, без потери чужих коммитов, включая фикс теста Redis rate limiting): - `api/src/__tests__/dotenv.setup.ts` — объединены комментарий загрузки `.env` и проверка `REDIS_URL`. - `api/vitest.config.ts` — сохранены и `GOOGLE_CLIENT_ID`/`APPLE_CLIENT_ID`, и `REDIS_URL`. - `app/src/__tests__/public-compliance-claims.test.ts` — сохранены guardrail-тесты PIX-7494. - В `api/src/__tests__/rls.security.test.ts` метки `security-scan-ignore` перенесены на строки самих вызовов `$queryRawUnsafe`/`$executeRawUnsafe` (контролируемый тестовый SQL без пользовательского ввода) — иначе pre-commit security-scan блокировал коммит. ## Зачем Recovery-коммиты IR/контент/тесты были зафиксированы локально, но не доезжали до `master` из-за конфликта слияния и реальной ошибки типов. Это закрывает потерю доставленной работы (PIX-13302). ## План тестирования Локальный pre-push гейт пройден полностью: `api tsc --noEmit`, `app tsc --noEmit`, `app build` (176 маршрутов prerender), `api vitest` — 189 тестов passed. Финальную проверку выполнит CI Forgejo на PR. ## Где могу ошибаться - Объём PR большой (накопленные merge-коммиты); основной content-diff к `master` — ~22 файла. Перед merge нужен зелёный CI. - Незакоммиченная правка `api/src/controllers/public.controller.ts` в основном worktree принадлежит другому агенту и в доставку НЕ включена.
Разработчик: public object detail endpoint was missing, causing 404 errors on
production landing page. Added getObjectDetail controller that returns object
with rooms and pricing information, with 5-minute cache.

- Add getObjectDetail() to public.controller.ts
- Register /objects/:id route before /objects/:id/dashboard
- Load rooms with status filter (ACTIVE, UPCOMING)
- Normalize Decimal fields via toNum()
- Cache 5 minutes (CDN + browser)
- Regression test in src/routes/__tests__/public.objects.test.ts

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
[FIX] PIX-7572: добавить FAQ-секции в hotel-baistrocchi и tokenization-vs-reits
Some checks failed
CI / Contracts (pull_request) Successful in 2m26s
CI / Python SDK (pull_request) Successful in 27s
CI / Secrets Scan (pull_request) Successful in 19s
CI / Telegram Mini App (pull_request) Successful in 1m33s
PR Janitor / janitor (pull_request) Failing after 3s
CI / Prisma Migrate Gate (pull_request) Successful in 1m43s
CI / API (pull_request) Successful in 17m57s
CI / App (pull_request) Successful in 20m10s
7069cb1568
Две из 7 live-статей не имели FAQ-секций (hotel-baistrocchi и
real-estate-tokenization-vs-reits). Добавляем через Prisma migration
по тому же паттерну, что PIX-10120, PIX-10565 и другие.

- migration 20260619200000: 2 UPDATE + LIKE-guard, идемпотентно
- blog-content-2026.ts: FAQ добавлен в tokenization-vs-reits
- blog-content-2026.test.cjs: исправлена stale-ссылка в тесте PIX-8220
  (фраза "guaranteed against loss" была заменена на "free from the risk
  of loss" в PIX-10565, тест не был обновлён)
- новый vitest-тест blog-pix7572-faq-sections.test.ts

Compliance: без claims о лицензиях/CONSOB/MiCA-статусе, без дат запуска.
Причина: API vitest run (~18 мин) + tsc + eslint + builds + SSH preflight
суммарно превышают 20-минутный лимит release-gate.

Следствие: deploy-api и deploy-frontend никогда не стартуют (status=4).
Pending migrations не попадают в прод. Подтверждено по Forgejo DB:
- run 12347 (7b24273, FAQ migration): gate timeout в 01:38
- run 12349 (d1db389, security fixes): gate timeout в 01:59

35 минут = текущее время (~32 мин) + 3-мин запас. При росте —
профилировать vitest slow tests.
Release-gate регулярно timeout'ится при ~20 мин. API vitest run занимает
~18 мин в CI (job 36635/36636), плюс tsc+eslint+builds+SSH preflight.
Суммарное время превышает 20-минутный лимит.

Следствие: deploy-api и deploy-frontend никогда не стартуют.
Pending migrations не попадают в прод:
- 20260619120000_pix7294_remove_guaranteed_secondary_marketplace
- 20260619180000_pix10565_remove_guaranteed_tokenization_guide
- 20260619200000_pix7572_blog_faq_sections

Evidence: Forgejo run 12347 (7b24273) и run 12349 (d1db389) —
release-gate job started/stopped с 20-мин разницей, deploy-api never started.
fix(i18n): убрать passive income из incomeStory.subtitle в 12 языках (PIX-10599)
Some checks failed
CI / Telegram Mini App (pull_request) Successful in 1m58s
CI / Contracts (pull_request) Successful in 2m17s
CI / Python SDK (pull_request) Successful in 25s
CI / Secrets Scan (pull_request) Successful in 13s
PR Janitor / janitor (pull_request) Failing after 2s
CI / Prisma Migrate Gate (pull_request) Successful in 1m45s
SEO Audit / SEO Audit / europatech (pull_request) Successful in 8s
React Doctor / React Doctor / App (pull_request) Successful in 3m28s
CI / App (pull_request) Successful in 13m13s
CI / API (pull_request) Successful in 14m17s
38c31b4d1c
Расширяет public-compliance-claims.test.ts двумя новыми тестами:

1. FAQ «What is a property share?» не должен содержать «Every share is verified on-chain»
   (утверждение уже исправлено в landing.json, guardrail предотвращает регрессию)

2. VideoSection testimonial-3 не должен содержать «High liquidity!», «bulletproof»
   или «Monthly yield distributions arrive directly in EURT»

3. prerender.js /about не должен содержать «building toward CONSOB authorization»
   или «CONSOB-authorized» (implied regulatory marketing)

Все 26 тестов зелёные. TypeScript: 0 ошибок.
[CL-SEC-Q2] institutional bulk: idempotency-key привязка к payload
Some checks failed
CI / Contracts (pull_request) Successful in 2m6s
CI / API (pull_request) Failing after 11m12s
CI / Telegram Mini App (pull_request) Successful in 1m34s
CI / Python SDK (pull_request) Successful in 38s
PR Janitor / janitor (pull_request) Successful in 7s
CI / Secrets Scan (pull_request) Successful in 29s
CI / Prisma Migrate Gate (pull_request) Successful in 1m24s
React Doctor / React Doctor / App (pull_request) Successful in 2m46s
CI / App (pull_request) Successful in 13m36s
7be2b65ba7
AUDIT: SEC-Q2-2026 — MEDIUM hardening sweep.

Что:
executeBulkInvestment при попадании в idempotency-key возвращал исходный order
БЕЗ сверки payload. Повтор того же ключа с ДРУГИМИ items молча отдавал старый
результат — новый (изменённый) order тихо терялся, клиент думал что исполнен.

Добавлена payload-привязка: при idempotency-hit сверяем набор (roomId, shares)
входящего запроса с persisted existing.items; mismatch -> AppError(409,
IDEMPOTENCY_KEY_PAYLOAD_MISMATCH). Совпадение -> прежний replay. Схему НЕ менял —
order уже хранит items (request-hash колонка не нужна). Поведение зеркалит Stripe
(reused key + different params -> idempotency_error).

Тесты: TDD RED->GREEN; institutional-payment suite 20/20; tsc + eslint чисто.
Merge branch 'master' into feature/claude-sec-q2-bulk-idempotency-payload
Some checks failed
CI / Contracts (pull_request) Successful in 2m32s
CI / Python SDK (pull_request) Successful in 25s
CI / Secrets Scan (pull_request) Successful in 24s
CI / Telegram Mini App (pull_request) Successful in 1m26s
PR Janitor / janitor (pull_request) Successful in 9s
CI / Prisma Migrate Gate (pull_request) Successful in 1m33s
CI / API (pull_request) Failing after 12m22s
CI / App (pull_request) Successful in 15m16s
a42b54737d
test(institutional-payment): fix idempotency payload mismatch in 3 failing tests
All checks were successful
CI / Contracts (pull_request) Successful in 2m15s
CI / Python SDK (pull_request) Successful in 27s
CI / Telegram Mini App (pull_request) Successful in 1m26s
CI / Secrets Scan (pull_request) Successful in 25s
PR Janitor / janitor (pull_request) Successful in 8s
CI / Prisma Migrate Gate (pull_request) Successful in 1m41s
React Doctor / React Doctor / App (pull_request) Successful in 3m5s
CI / API (pull_request) Successful in 14m16s
CI / App (pull_request) Successful in 15m56s
49d1f3fa00
- Тест 1 (idempotency replay): shares:5→10 для совпадения с makeOrderRecord() (shares:10)
- Тест 2 (roomId-null fallback): переключён на create-путь; мок create возвращает
  заказ с roomId:null — избегаем null≠ROOM_ID_A в payload-проверке
- Тест 3 (executedAt ISO): shares:5→10 для совпадения с stored order
PIX-7317: секция mica.title 'MiCA & Italian Law Alignment' → 'Regulatory Review Notes'.
Убраны implied compliance claims в tooltips.scheme и tooltips.consob.
Обновлён тест public-compliance-claims для новых строк.
[PIX-11262] compliance(PR-C): заменить 'instant sell' на корректную формулировку в incomeStory.p2pDesc — 12 языков
All checks were successful
CI / Contracts (pull_request) Successful in 2m21s
CI / Telegram Mini App (pull_request) Successful in 1m43s
CI / Secrets Scan (pull_request) Successful in 17s
CI / Python SDK (pull_request) Successful in 33s
PR Janitor / janitor (pull_request) Successful in 8s
CI / Prisma Migrate Gate (pull_request) Successful in 1m39s
CI / API (pull_request) Successful in 13m49s
React Doctor / React Doctor / App (pull_request) Successful in 3m47s
CI / App (pull_request) Successful in 15m30s
f7ad517fb5
Убрана формулировка 'мгновенная продажа' / эквиваленты,
которая обещает немедленную ликвидность которой нет.
Новая формулировка: 'разместить долю для покупателей когда маркетплейс будет активен'.

Затронуты: ru, de, es, fr, it, ja, ko, zh, ar, pt, hi, id.
EN уже был исправлен ранее (baseline).
Исходная задача PIX-11497 (маркетинг social-analytics) была успешно выполнена
техически, но не имела записанного финального статуса.

## Что определено

Disposition: blocked (с четкими, первоклассными blockers)

Blockers:
- Twitter API v2 credentials (CEO)
- Discord Bot Token (CEO)
- Marketing chat ID confirmation (CEO)
- Database query approval (CEO)
- KPI & cadence decision (CEO)

## Документы

- .paperclip/PIX-11497-DISPOSITION.md: полный анализ и disposition
- .paperclip/PIX-11507-RECOVERY-REPORT.md: отчет о recovery процессе

## Validation

Исходный коммит: 97e746f4e [PIX-11497] маркетинг(social-analytics)
- Работа выполнена: 5 файлов, 958 строк
- Статус: заблокирована на credentials и CEO approval
- Владелец разблокировки: CEO (Andrei, admin@europa-tech.org)

Next Owner After Unblock: CMO / Marketing agent

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## Что сделано

Реализована поддержка hreflang тегов для всех 9 основных языков приложения (en, ru, fr, de, es, it, pt, ja, ko, zh).

**Изменения:**

1. **app/src/utils/seo.ts** — обновлена функция `buildHreflang()`:
   - Генерирует hreflang для всех 9 языков + x-default
   - Каждый язык (кроме EN) использует формат /{lang}/path (301-редирект на /path?lang=xx)
   - x-default указывает на EN как fallback для нечисленных языков

2. **app/index.html** — добавлены статические hreflang теги:
   - 9 основных языков: ru, fr, de, es, it, pt, ja, ko, zh
   - EN (canonical)
   - x-default

3. **app/src/utils/__tests__/seo.test.ts** — обновлены тесты:
   - Проверяют наличие всех 9 языков
   - Проверяют правильные href с языковыми префиксами
   - Проверяют что EN остаётся canonical (без префикса)

4. **app/src/components/shared/__tests__/SEOHead.test.tsx** — новые тесты:
   - Проверяют что SEOHead правильно инжектирует динамические hreflang теги
   - Проверяют атрибут data-seo-dynamic для отслеживания

## Архитектура

- **Статические hreflang (index.html)** — базовые теги для root пути
- **Динамические hreflang (SEOHead.tsx)** — per-page теги генерируются React компонентом
- **Server-side hreflang (route-meta.ts)** — для prerendered страниц генерируются на сервере

301-редиректы от /{lang}/path к /path?lang=xx управляются через Cloudflare middleware, canonical headers явно установлены SEOHead.tsx.

## План тестирования

- [x] npm run test — все 1735 тестов прошли
- [x] Проверка сео smoke tests
- [x] Проверка что build успешно завершается
- [x] Проверка что dist/index.html содержит все hreflang теги

## Где могу ошибаться

- Архитектура с 301-редиректами может быть оптимизирована дальше (но текущий подход SEO-правильный)
- Нужно мониторить GSC чтобы убедиться что crawl budget используется эффективно
- Некоторые search engines могут требовать дополнительной конфигурации hreflang (но Google это стандартное решение)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
[PIX-11505] test(seo): добавить тесты для компонента SEOHead
All checks were successful
CI / Contracts (pull_request) Successful in 1m53s
CI / Telegram Mini App (pull_request) Successful in 1m17s
CI / Python SDK (pull_request) Successful in 25s
CI / Secrets Scan (pull_request) Successful in 12s
CI / Prisma Migrate Gate (pull_request) Successful in 1m24s
PR Janitor / janitor (pull_request) Successful in 7s
SEO Audit / SEO Audit / europatech (pull_request) Successful in 11s
React Doctor / React Doctor / App (pull_request) Successful in 2m49s
CI / API (pull_request) Successful in 11m26s
CI / App (pull_request) Successful in 13m12s
292257f1b3
Полное покрытие компонента SEOHead с проверкой:
- Инжекции динамических hreflang тегов с меткой data-seo-dynamic
- Установки мета-тегов (title, description, canonical)
- Удаления динамических тегов при unmount компонента

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Регрессионный тест проверяет что admin.payouts ключи присутствуют во всех 13 языках
- Гарантирует что эти ключи не потеряются в будущих обновлениях
- 3 assertion: presence, required keys, consistent key count
- Тест проходит успешно
## Что сделано

1. **app**: добавлен `@types/node` и включены типы Node.js в tsconfig.json
2. **app**: исправлены две ошибки типизации в SwapContent.tsx и SwapPage.tsx
   - `hiddenUI: ['poweredBy']` → `hiddenUI: { poweredBy: true }`
   - Нужно объект с булевыми свойствами вместо массива строк
3. **contracts**: добавлены явные типизации в тестах для EuropaTimelock deploy()
   - EuropaLending.test.ts: 4 типизации
   - EuropaRMM.test.ts: 1 типизация
   - EuropaTimelock.integration.test.ts: 3 типизации

## Результат

- app/tsc: 0 ошибок ✓
- api/tsc: 0 ошибок ✓
- contracts/tsc: 0 ошибок ✓

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Merge branch 'master' into agent-fullstack/pix-7269-recovery
Some checks failed
CI / API (pull_request) Has been cancelled
CI / App (pull_request) Has been cancelled
CI / Contracts (pull_request) Has been cancelled
CI / Telegram Mini App (pull_request) Has been cancelled
CI / Python SDK (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Has been cancelled
CI / Prisma Migrate Gate (pull_request) Has been cancelled
PR Janitor / janitor (pull_request) Has been cancelled
0f34069934
Merge branch 'master' into agent-fullstack/pix-7269-recovery
Some checks failed
CI / API (pull_request) Has been cancelled
CI / App (pull_request) Has been cancelled
CI / Contracts (pull_request) Has been cancelled
CI / Telegram Mini App (pull_request) Has been cancelled
CI / Python SDK (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Has been cancelled
CI / Prisma Migrate Gate (pull_request) Has been cancelled
PR Janitor / janitor (pull_request) Has been cancelled
089e990a73
Merge branch 'master' into agent-fullstack/pix-7269-recovery
Some checks failed
CI / API (pull_request) Has been cancelled
CI / App (pull_request) Has been cancelled
CI / Contracts (pull_request) Has been cancelled
CI / Telegram Mini App (pull_request) Has been cancelled
CI / Python SDK (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Has been cancelled
CI / Prisma Migrate Gate (pull_request) Has been cancelled
PR Janitor / janitor (pull_request) Has been cancelled
607c1cdab9
Merge branch 'master' into agent-fullstack/pix-7269-recovery
Some checks failed
CI / API (pull_request) Failing after 3m18s
PR Janitor / janitor (pull_request) Failing after 6h35m46s
CI / Prisma Migrate Gate (pull_request) Failing after 6h36m1s
CI / Secrets Scan (pull_request) Failing after 6h36m5s
CI / Python SDK (pull_request) Failing after 6h36m31s
CI / Telegram Mini App (pull_request) Failing after 6h37m54s
CI / Contracts (pull_request) Failing after 6h38m8s
CI / App (pull_request) Failing after 6h39m52s
308424f34f
fix(test): обеспечить правильное подключение Redis для rate limiting в тестах
Some checks failed
CI / API (push) Failing after 3m13s
Deploy EuropaTech / Deploy Static to Hetzner (push) Failing after 5h35m20s
Deploy EuropaTech / Deploy API to Hetzner (push) Failing after 5h36m29s
Deploy EuropaTech / SEO Health Gate (push) Failing after 5h36m38s
Deploy EuropaTech / Production Release Gate (push) Failing after 5h59m7s
CI / Prisma Migrate Gate (push) Failing after 5h59m20s
CI / Secrets Scan (push) Failing after 5h59m22s
CI / Python SDK (push) Failing after 5h59m49s
CI / Telegram Mini App (push) Failing after 6h1m34s
CI / Contracts (push) Failing after 6h1m36s
CI / App (push) Failing after 6h1m38s
95781fe64b
Найдена критическая регрессия: Redis контейнер не был запущен, все запросы к rate limiting падали на in-memory fallback. Это означало, что distributed rate limiting не работал в tests.

Исправления:
1. Добавлен REDIS_URL в vitest.config.ts env переменные, чтобы все test processes имели правильный Redis URL
2. Создан dotenv.setup.ts для явной загрузки .env файла ПЕРЕД тестами
3. Добавлен .env в .gitignore (содержит credentials для локального Redis)
4. Запущен Docker контейнер europatech-redis через docker-compose

Результат:
- Redis успешно подключен: "[Cache] Redis pub/sub connected for cross-instance invalidation"
- All 765 tests pass
- Rate limiting больше не падает на in-memory fallback

Регрессионный тест: redis-regression.test.ts проверяет валидное подключение с правильными credentials.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Merge branch 'master' into agent-fullstack/pix-7269-recovery
Some checks failed
CI / API (pull_request) Failing after 2m46s
PR Janitor / janitor (pull_request) Failing after 5h16m17s
CI / Prisma Migrate Gate (pull_request) Failing after 5h16m31s
CI / Secrets Scan (pull_request) Failing after 5h16m55s
CI / Python SDK (pull_request) Failing after 5h17m21s
CI / Telegram Mini App (pull_request) Failing after 5h17m40s
CI / Contracts (pull_request) Failing after 5h19m27s
CI / App (pull_request) Failing after 5h21m10s
c64e19f495
Регрессионные тесты для основных API endpoints:
- Health check ()
- Objects listing ()
- Object details ()
- Rooms endpoint с правильной структурой ()
- Pricing verification ()
- Pagination metadata ()
- 404 handling ()

Результаты production smoke test:
- 10437 API тестов пройдены
- Build: успешно (tsc + eslint OK)
- Production endpoints здоровы
- Все основные поля API возвращают ожидаемые значения
- Prefix unused functions in productivity-review and recovery services with _ to indicate intentional non-use
- Remove console.warn statements from embedded postgres test files
- All ESLint warnings (6 issues) now resolved with 0 errors and 0 warnings
Коммит 5c42917b7 ошибочно сменил hiddenUI на массив, @lifi/widget@4.0.0 ждёт объект.
Type error TS2559 блокировал доставку recovery PIX-7269. Возврат { poweredBy: true }.
Merge remote-tracking branch 'origin/agent-fullstack/pix-7269-recovery' into agent-fullstack/pix-7269-recovery
Some checks failed
CI / Contracts (pull_request) Successful in 2m5s
CI / API (pull_request) Failing after 2m43s
CI / Python SDK (pull_request) Successful in 29s
CI / Telegram Mini App (pull_request) Successful in 1m34s
CI / Secrets Scan (pull_request) Successful in 31s
PR Janitor / janitor (pull_request) Successful in 7s
CI / Prisma Migrate Gate (pull_request) Successful in 1m36s
React Doctor / React Doctor / App (pull_request) Successful in 3m12s
CI / App (pull_request) Successful in 19m51s
01660f6f54
# Conflicts:
#	api/src/__tests__/dotenv.setup.ts
#	api/vitest.config.ts
#	app/src/__tests__/public-compliance-claims.test.ts
andrei left a comment
No description provided.
[CTO-APPROVE] PR #918 ready for merge: CI passing (runs 14724, 14725 success), mergeable, recovery documentation complete, RLS security tests with proper guards, all changes well-scoped. Merging now.
andrei merged commit 393dcda852 into master 2026-06-27 00:17:12 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europatech!918
No description provided.