# Sprint 28 — docs sync + test coverage gap-fill (overnight) Цель: воспользоваться overnight-окном для накопления реального soak- теста (4 часа), параллельно — мелкие реальные улучшения: точность auto-generated api-reference, новые integration-тесты, CI-integration. Старт: 2026-06-09 03:15. Исполнитель: Claude Opus 4.7 (autonomous). Продолжение [[sprint27_done]]. ## Что сделано ### 1. api-reference.md теперь имеет 240 endpoint'ов (было 195) `ApiReferenceDocsJob` regex для return-type'a слишком строгий — матчил только 1-level generic. Не ловил `Task>>` (double-nested), поэтому пропускал ~45 endpoint'ов. **Фикс:** новый regex `[^(=;{}\n]+?` для return-type (любой identifier с любой глубиной генериков) в: - `src/food-market.api/Background/ApiReferenceDocsJob.cs` (runtime job для weekly auto-gen в /content-root/api-reference-generated.md) - `scripts/gen-api-reference.py` (Python-эквивалент для коммита в репо) Результат: **240 endpoints, 58 controllers** (было 195/57). Пример пропуска: `EmployeesController` имел 4 из 5 endpoint'ов; теперь все 5 (GET /api/organization/employees был пропущен — это list endpoint с return типом `Task>>`). ### 2. observability.md дополнен (Sprint 20+ + Sprint 26) - Добавлен ряд про `food_market_disk_free_bytes` (Sprint 20 `DiskMonitoringJob`). - Новый раздел «quality-watchdog метрики» — 5 метрик textfile exporter'a (`quality_watchdog_run_total`, `step_failure_total`, `endpoint_p95_ms`, `last_run_status`, `incidents_total`). - Раздел «Готовые dashboards» теперь упоминает оба JSON (food-market.json + quality-watchdog.json) с UID/назначением. ### 3. Integration spec #7: 1C-CSV import + GDPR org-export `tests/integration/07-import-export-flows.spec.ts`: - POST `/api/catalog/products/import/1c-csv` с 1С-форматом (Наименование;Штрихкод;Цена;Единица;Группа в semicolon-CSV) → возвращает `{created, skipped, errors[], ids[]}`. - POST `/api/org/export` (НЕ `/api/admin/org-export`, как я было предположил — был баг в моих оригинальных предположениях) → возвращает `{id, status, ...}`. - orgB не видит export orgA — multi-tenant clean. Прогон 8.2s. Pass. ### 4. PruneQualityTestOrgsAsync unit test `tests/food-market.IntegrationTests/PruneQualityTestOrgsTests.cs` — два [Fact]'a: - `Deletes_only_quality_orgs_older_than_threshold` — 4 org'и (старая quality, свежая quality, реальная org, edge-старше-threshold). Threshold 24h. Удаляет 2 (старую quality + edge). Свежая quality и реальная остаются. - `Returns_zero_when_no_candidates_match` — только свежая quality → deleted=0, org остаётся. Тест требует Testcontainers (PostgreSQL для information_schema + DO $$ блоков) — не SQLite. Прогоняется в CI на dev-vm; локально нет .NET 8.0.417 SDK (global.json pin). ### 5. Forgejo CI workflow: integration suite `.forgejo/workflows/regression.yml` добавлен шаг "Run integration cross-feature suite" после regression flows+visual. На failure артефакты из tests/integration/reports/ тоже загружаются. Telegram-уведомление обновлено: `35 flows + 60 visual + 8 integration`. ### 6. 4-часовой soak test запущен в фоне `setsid nohup k6 run ... &` — детачнутая сессия. Параметры: - DURATION=4h, RPS=50 - E2E_ADMIN_URL=stage - Output: `/tmp/soak-real/k6.log`, `/tmp/soak-real/summary.json` - Monitor: 5-минутный snapshot в `/tmp/soak-real/metrics.csv` ETA финиша: ~07:15. Финальные числа добавлю в этот файл после завершения. ## Soak: интерим-результаты В 03:24 (9 минут run): 28005 iterations, 0 interrupted, p95 латентность ровная, RPS ровно 50. ## Метрики | | До Sprint 28 | После | Δ | |---|---|---|---| | API endpoints в docs/api-reference.md | 195 (из 240) | 240 | +45 | | Controllers в reference | 57 | 58 | +1 | | Integration specs | 6 | 7 | +1 | | CI integration step | (нет) | Sprint 27/28 step | new | | PruneQualityTestOrgs unit test | (нет) | 2 [Fact]'a | new | | Observability metrics doc | 6 кастомных | 11 кастомных (+ disk + 5 watchdog) | +5 | ## Артефакты этой ночи - `scripts/gen-api-reference.py` — Python-генератор (соответствует обновлённому `ApiReferenceDocsJob.cs`) - `docs/api-reference.md` — пересгенерирован, 240 endpoints - `docs/observability.md` — дополнен - `tests/integration/07-import-export-flows.spec.ts` — новый spec - `tests/food-market.IntegrationTests/PruneQualityTestOrgsTests.cs` — новый C# test - `.forgejo/workflows/regression.yml` — added integration step - `/tmp/soak-real/k6.log`, `/tmp/soak-real/metrics.csv` — soak в процессе