# Приёмочный отчёт v2.35.0

**Дата**: 2026-04-27
**Версия**: v2.35.0
**Целевая среда**: prod (glpay.dev)

## Свод результатов

| # | Сценарий | Что проверяется | Статус |
|---|---|---|---|
| 1 | OrgChart pipeline | Консистентность department-кодов | ✅ passed |
| 2 | Brief lifecycle online | Anthropic SSE → BriefStreamEvent mapping | ✅ passed |
| 3 | TG webhook flow | Secret store идемпотентность | ✅ passed |
| 4 | Escalation chain | EscalationStep state transitions | ✅ passed |
| 5 | A/B prompt split | Распределение ≈ 50/50 (±15%) | ✅ passed |
| 6 | Multi-user roles | Owner > User privilege ordering | ✅ passed |
| 7 | Vault unlock cycle | Locked-by-default защита секретов | ✅ passed |
| 8 | Hot-reload adapter | AdapterReloadAuditEntry полный цикл | ✅ passed |
| 9 | Backup integration | PruneListAsync minKeep защита | ✅ passed |

**Итого**: 9/9 сценариев прошли локально (см. `dotnet test src/GLSoft.Studio.E2E/`).

## Детали сценариев

### scenario-01-orgchart — OrgChart pipeline
Проверяет что у студии 6 отделов (`ARCH`, `BACKEND`, `FRONTEND`, `QA`, `DEVOPS`,
`PM`) — соответствует `OrgTemplateSeeder`. Регрессия в наборе отделов сломает
intake → bottleneck → proposal pipeline.

### scenario-02-brief-online — Brief lifecycle online
Прогоняет полную SSE-последовательность через `AnthropicStreamMapper` —
`message_start` → `content_block_start` → `content_block_delta` → `content_block_stop`
→ `message_delta`. Проверяет что в результате есть `BriefStreamPartial`,
корректный `StopReason`, и accounting input/output tokens. Регрессия в парсере
сломает реальный `/brief/stream`.

### scenario-03-tg-webhook — TG webhook secret store
Создаёт два экземпляра `TgWebhookSecretStore` поверх одного файла, проверяет
что `GetOrCreate()` возвращает одинаковое значение — secret persists across
container restarts. Регрессия сломает webhook idempotency.

### scenario-04-escalation — Escalation chain
Проходит `EscalationStep` через состояния `Pending` → `Notified` → `TimedOut`.
Проверяет что `TargetEmployeeCode` сохраняется. Регрессия сломает chain-эскалацию.

### scenario-05-ab-prompt — A/B split distribution
200 случайных subject'ов раскладываются по двум bucket'ам через
deterministic hash. Распределение должно быть в пределах 35–65%.
Регрессия в split-логике сломает корректность A/B-экспериментов.

### scenario-06-multi-user — Role separation
Создаёт `TgUser` с ролями `Owner` и `User`, проверяет что
`(int)Owner.Role > (int)User.Role`. Регрессия в enum (например, переименование
или сортировка) сломает auth gating в TG-командах.

### scenario-07-vault — Locked-by-default
Создаёт пустой `vault.json`, инициализирует `InMemoryVaultService` без
passphrase, проверяет что `IsUnlocked == false` и `TryGet` возвращает null.
Регрессия здесь == массовая утечка секретов.

### scenario-08-hot-reload — Audit cycle
Создаёт два `AdapterReloadAuditEntry`: `Started` и `Success`. Проверяет что
оба статуса присутствуют, `Failed` отсутствует. Регрессия — pipeline без
`Started` не отлавливает аномалии reload-цикла.

### scenario-09-backup — Prune minKeep safety
Один snapshot 30-дневной давности при `retentionDays=14`, `minKeep=1`. Метод
`PruneListAsync` НЕ должен его удалить (защита последнего snapshot'а).
Регрессия здесь — потеря последнего бэкапа после prune.

## Что покрыто и что — нет

### Покрыто

- Доменные модели и парсеры (orgchart, brief stream, escalation, vault, backup).
- Логика prune с retention/minKeep.
- Audit-цепочки.
- Role-based авторизация на уровне модели.

### Не покрыто (backlog)

- Реальный HTTP-стек через `WebApplicationFactory<Program>` (требует
  testcontainers Postgres → docker → CI с docker-in-docker).
- Реальные обращения к Anthropic / Telegram / OpenAI / DigitalOcean
  (требуется DI-injectable `HttpMessageHandler` для мокинга — план v2.36).
- Полная транзакционная логика `IntakeOrchestrator.Approve(...)` →
  brief creation → assignee resolution. Требует БД.
- Multi-instance scenarios (escalation timer cooperation, snapshot
  scheduler concurrency).

Этот отчёт обновляется автоматически после каждого CI-прогона E2E job
(см. step `Run E2E` в `.github/workflows/ci.yml` и `docs/acceptance-last-run.json`).

## Связанные документы

- ADR-051 — `docs/adr/ADR-051-e2e-acceptance.md`
- E2E test project — `src/GLSoft.Studio.E2E/`
- CHANGELOG — `## [2.35.0]`
