ROX.ONE Тестирование и CI — надёжный gate от регрессий
Тестовая инфраструктура ROX.ONE использует bun:test для unit-тестов и Playwright для E2E. После серии крупных изменений (T537, Wave 1/2, RC2) накопились pre-existing failures в RTL и дрейф test discovery. Этот эпик приводит тестовый стек в порядок и устанавливает неснижаемые пороги качества для каждого PR.
Unit-тесты: coverage threshold ≥80% на изменённом коде фиксируется через nyc/c8 report в CI, запрет на `it.skip` и `.only` в main ветке через pre-commit hook. Playwright E2E suite с xvfb для headless режима становится обязательным gate — сейчас harness готов (xvfb настроен), но не блокирует merge. LocalStack позволит тестировать AWS S3/Cloudflare интеграции без реального cloud-аккаунта. TypeStat автоматически находит места, где можно заменить `any` на конкретный тип — снижая счётчик при каждом PR. Audit-probes тесты верифицируют инварианты append-only storage на уровне интеграционных тестов.
**Ключевые истории:**
- bun:test coverage gate ≥80% на changed files с PR-comment отчётом
- Playwright E2E suite в CI (xvfb, headless) — обязательный gate для всех адаптеров
- TypeStat CI check: `any` count не должен расти между PRs
- LocalStack: изолированные тесты S3, Cloudflare R2, CF Workers без live credentials
- Audit-probes integration tests: append-only, PII-mask, UUID v7 sort invariants
**Источники вдохновения:**
- [localstack/localstack](https://github.com/localstack/localstack) — локальный эмулятор AWS для детерминированных тестов
- [hegelai/prompttools](https://github.com/hegelai/prompttools) — тестирование LLM промптов и outputs
- [JoshuaKGoldberg/TypeStat](https://github.com/JoshuaKGoldberg/TypeStat) — автоматическое устранение `any` в TypeScript
**Ожидаемая ценность:** Каждый PR автоматически проверяется полным набором тестов — regression в chat, auth или artifact viewer не доедет до main без красного CI gate.
## 🔗 Linear
- [PZD-452](https://linear.app/kuhjie/issue/PZD-452) — backing ticket