# Benchmark interno do ciclo (Etapa 82)

## Visão geral

A **Etapa 82** cria a **base de benchmark interno do ciclo** e **comparação entre casos/sessões** para identificar **padrões de performance comercial e operacional**. A camada é **agregadora**: consome métricas e closure; não substitui métricas, closure nem módulos detalhados.

| Conceito | Descrição |
|----------|-----------|
| **Entrada benchmarkável** | **EventCycleBenchmarkEntry**: CycleId, SessionId, OpportunityId, OverallCyclePerformanceScore, PerformanceLabel, sub-scores (Quest, Comercial, Handoff, Produtor, ScopeRevisionCount, Communication, Preparation, Execution, FinalAcceptance), ClosureStatus, Timestamp. |
| **Estado do benchmark** | **EventCycleBenchmarkState**: Entries, BestPerformingEntry, LowestPerformingEntry, AveragePerformanceScore, ComparisonSummary, TopPatterns, RiskPatterns, LastBenchmarkedAt. |
| **Controller** | **EventCycleBenchmarkController**: BuildBenchmark(orders, opportunities, proposals, sessions, followUpTasks), CompareEntryToAverage(entry, benchmark). |

## Geração de entradas

- As entradas são construídas a partir de **EventCycleMetricsState** (via EventCycleMetricsController.CalculateMetrics) e **EventCycleClosureState** (via EventCycleClosureController.EvaluateClosure).
- Para cada ciclo com métricas, cria-se um **EventCycleBenchmarkEntry** com os scores, label, closure status e IDs (CycleId, SessionId, OpportunityId do ProducerOrder).

## Comparação e médias

- **BestPerformingEntry** — entrada com maior OverallCyclePerformanceScore.
- **LowestPerformingEntry** — entrada com menor OverallCyclePerformanceScore.
- **AveragePerformanceScore** — média simples dos OverallCyclePerformanceScore das entradas.
- **ComparisonSummary** — texto resumido: número de ciclos, média, melhor (cycleId + score), pior (cycleId + score).
- **CompareEntryToAverage(entry, benchmark)** — devolve a diferença em pontos (entry.Score − média) para exibir "vs média +N" ou "vs média −N".

## Padrões (heurísticas simples)

**Padrões positivos (TopPatterns):**

- Se o melhor caso tem QuestCompletionSignalScore ≥ 70 e HandoffDelayRiskScore ≥ 80 → "Ciclos com Quest forte e handoff rápido tendem a performar melhor."
- Se o melhor caso tem ExecutionProgressScore ≥ 80 → "Execução com menos bloqueios melhora score final."
- Se o melhor caso tem CommunicationActivityScore ≥ 50 → "Comunicação ativa associada a melhores resultados."
- Se o melhor caso tem ScopeRevisionCount == 0 e score ≥ 60 → "Sem revisões de escopo associado a performance superior."

**Padrões de risco (RiskPatterns):**

- Se entradas com revisões de escopo têm média de score inferior à média global → "Ciclos com mais revisões de escopo tendem a performar pior."
- Se algum ciclo de baixo desempenho tem ClosureStatus Blocked → "Ciclos bloqueados concentram os piores scores."
- Se existe pelo menos um ciclo com ClosureStatus Blocked → "Alertas bloqueantes e execução bloqueada reduzem score."

A lógica é heurística e pode ser afinada; visa ser clara e útil para gestão.

## UI

- **EventCycleBenchmarkStripView** — Faixa: "Benchmark: N entrada(s) | Média X | Melhor Y | Pior Z | timestamp". HUD/debug.
- **EventCycleBenchmarkPanel** — Resumo, média, melhor caso, pior caso; lista de entradas com "vs média ±N"; secções Padrões positivos e Padrões de risco; botão "Recalcular"; timestamp do benchmark.
- **EventCycleDashboardPanel** — Bloco opcional: "Benchmark: Média X | Melhor cycleId (score) | Pior cycleId (score) | + primeiro padrão positivo | − primeiro padrão risco | timestamp".

## Ações

- **Gerar/Recalcular benchmark** — Refresh (re-chamar BuildBenchmark e repintar).
- **Limpar** — Não há store; benchmark é sempre recalculado.
- **Comparar entrada com média** — CompareEntryToAverage usado no painel para exibir "vs média +N" por entrada.
- **Navegar para casos** — Futuro: abrir ciclo/sessão a partir do CycleId ou OpportunityId.

## Limitações atuais

- **Sem persistência real** — Benchmark calculado on-demand; não guardado em base de dados.
- **Sem massa de dados real** — Com poucos ciclos, padrões são indicativos; não há histórico acumulado.
- **Sem analytics externos** — Sem envio para ferramentas externas; comparação apenas interna.

## Garantias

- **Quest intacto** — Nenhum fluxo Quest nem runtime XR foi alterado.
- **Web Hotel e Produtor intactas** — Apenas adicionadas secções de benchmark e um bloco no dashboard consolidado.
- **Camada agregadora** — Benchmark apenas **lê** métricas e closure; não duplica lógica complexa; sem dependência circular.
