food-market/docs/sprint28-progress.md
nns ed140cb819
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
docs(s28): api-reference 195→240 + observability + integration #7 + CI
Overnight progress while 4h-soak runs in background:

1. ApiReferenceDocsJob.cs + scripts/gen-api-reference.py — return-type
   regex теперь ловит nested generics любой глубины. Было 195
   endpoint'ов в auto-gen reference; стало 240 (+45). EmployeesController
   GET /api/organization/employees был пропущен из-за
   Task<ActionResult<PagedResult<EmployeeDto>>>.

2. docs/observability.md — добавлен food_market_disk_free_bytes (Sprint 20)
   + раздел "quality-watchdog метрики" (5 метрик textfile exporter'a из
   Sprint 26: run_total, step_failure_total, endpoint_p95_ms,
   last_run_status, incidents_total). Готовые dashboards теперь содержат
   оба JSON (food-market.json + quality-watchdog.json).

3. tests/integration/07-import-export-flows.spec.ts — POST 1C-CSV import
   (semicolon-CSV cp1251) → создаются продукты с группой автоматом;
   POST /api/org/export (НЕ /api/admin/org-export) → возвращает
   {id, status}; orgB не видит export orgA. Прогон 8.2s.

4. tests/food-market.IntegrationTests/PruneQualityTestOrgsTests.cs —
   2 [Fact]'a для метода из Sprint 25. Удаляет только quality-* старше
   threshold, не трогает реальные org. Требует Testcontainers.

5. .forgejo/workflows/regression.yml — добавлен шаг integration suite
   после flows+visual. Telegram: "35 flows + 60 visual + 8 integration".

Soak-real (4h @ 50 RPS) запущен в setsid-detach session, продолжается.
Итоговые числа добавлю в sprint28-progress.md после завершения.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 03:26:39 +05:00

112 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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<ActionResult<PagedResult<EmployeeDto>>>`
(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<ActionResult<PagedResult<EmployeeDto>>>`).
### 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.
<!-- SOAK_FINAL -->
## Метрики
| | До 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 в процессе