# Etapa 86 — Resumo da entrega

## Objetivo

Criar a **base do painel de gargalos do ciclo** e **priorização de destravamento**, para que a gestão identifique **quais pontos estão travando mais o caso** e **qual ordem de ação gera maior impacto**. Sem quebrar a camada Quest nem as camadas web já existentes. A nova etapa **adiciona** visão de gargalos; não substitui alertas, dependências nem SLA.

---

## Ficheiros criados

### Web (Assets/Web/)

| Caminho | Descrição |
|---------|-----------|
| **Core/EventCycleBottleneckSeverity.cs** | Enum: Low, Medium, High, Critical. |
| **Core/EventCycleBottleneckCategory.cs** | Enum: Commercial, QuestSession, Handoff, Scope, Preparation, Execution, FinalAcceptance, CrossStage. |
| **Domain/EventCycleBottleneck.cs** | BottleneckId, CycleId, Title, Summary, RelatedSectionKey, Severity, Category, EstimatedImpactScore, EstimatedUnlockValue, RootCauseHint, SuggestedResolution, IsBlocking, IsResolved, CreatedAt. |
| **Domain/EventCycleBottleneckState.cs** | CycleId, Bottlenecks, TopPriorityBottleneck, BlockingBottlenecks, ResolvedBottlenecks, BottleneckSummary, LastEvaluatedAt. |
| **Application/ResolvedBottleneckStore.cs** | MarkResolved(bottleneckId), IsResolved(bottleneckId), ClearResolvedForCycle(cycleId), ClearAllResolved() — em memória. |
| **Application/EventCycleBottleneckController.cs** | EvaluateBottlenecks(orders, opportunities, proposals, sessions, followUpTasks); EvaluateBottlenecksForCycle(cycleId, dashboardState, alertState, actionPlanState, executiveSummary, closureState, dependencyMapState, slaState, evaluatedAt). Deteção: dependência crítica bloqueada, nós bloqueantes, alertas bloqueantes, ciclo bloqueado (closure), SLA em atraso, handoff pendente, aceite final pendente. AddOrUpdateBottleneck com categoria, severidade, impacto e valor de destravamento. Filtra resolvidos via ResolvedBottleneckStore. TopPriorityBottleneck = primeiro por severidade e UnlockValue. MarkBottleneckResolved, ClearResolvedForCycle, ClearAllResolved. |
| **Presentation/EventCycleBottleneckPanel.cs** | Painel: resumo, ★ prioritário, lista de gargalos (severidade, causa, ação, impacto, destravamento), "Marcar resolvido", "Atualizar", "Limpar resolvidos". |
| **Presentation/EventCycleBottleneckStripView.cs** | Faixa: prioritário, severidade, quantidade bloqueante, timestamp. |

### Documentação

| Caminho | Descrição |
|---------|-----------|
| **Docs/Web/WEB_EVENT_CYCLE_BOTTLENECKS.md** | Painel de gargalos, priorização de destravamento, diferença alerta/dependência/gargalo, como ajuda gestão, limitações. |
| **Docs/Web/ETAPA_86_RESUMO.md** | Este resumo. |

---

## Ficheiros alterados

| Caminho | Alteração |
|---------|-----------|
| **Presentation/EventCycleDashboardPanel.cs** | Avaliação de gargalos (EvaluateBottlenecks); por ciclo, quando existe TopPriorityBottleneck, linha "Gargalo: [título] \| Ação: [SuggestedResolution] \| timestamp". |
| **Presentation/HotelCRMDashboardController.cs** | Novas secções: EventCycleBottleneckStripView ("Gargalos do ciclo (resumo)"), EventCycleBottleneckPanel ("Gargalos e priorização de destravamento"). |

---

## Como a análise de gargalos foi implementada

1. **Fontes**  
   Para cada ciclo obtêm-se: EventCycleAlertState, EventCycleActionPlanState, EventCycleExecutiveSummary, EventCycleClosureState, EventCycleDependencyMapState, EventCycleSLAState (e EventCycleDashboardState já usado pelos outros).

2. **Deteção**  
   - Se MostCriticalDependency do mapa está bloqueada → cria gargalo (categoria e resolução conforme ToNodeId).  
   - Cada BlockingNode do mapa → gargalo (categoria e resolução conforme NodeId).  
   - Cada alerta bloqueante → gargalo (severidade e resolução do alerta).  
   - Se closure IsCycleBlocked e MainBlockingReason → gargalo Critical FinalAcceptance.  
   - Se SLA DelayRiskLevel ≥ Medium e MainDelayReason → gargalo CrossStage.  
   - Se Quest feita e handoff não → gargalo Handoff.  
   - Se execução concluída e aceite final não → gargalo FinalAcceptance.  
   AddOrUpdateBottleneck evita duplicar por BottleneckId (atualiza severidade/impacto se já existir).

3. **Resolvidos**  
   ResolvedBottleneckStore guarda BottleneckIds. Ao avaliar, exclui-se os que estão em IsResolved (via store). "Marcar resolvido" chama MarkResolved; "Limpar resolvidos" chama ClearAllResolved.

4. **Prioridade**  
   TopPriorityBottleneck = primeiro por Severity (Critical > High > …) e depois por EstimatedUnlockValue. BlockingBottlenecks = lista com IsBlocking.

5. **Strip e Painel**  
   Strip mostra prioritário, severidade e contagem de bloqueantes. Painel mostra resumo, prioritário em destaque, lista com causa e ação e botão "Marcar resolvido" por gargalo.

6. **Dashboard**  
   Por ciclo, quando há TopPriorityBottleneck, mostra uma linha com título do gargalo, ação sugerida e timestamp.

---

## Garantia de que Quest e camadas web existentes não foram quebrados

- **Quest** — Nenhuma alteração em QuestPresentation, QuestPresentationSession, controllers Quest, runtime XR, input, targeting ou apresentação.
- **Web Hotel** — CRM mantido; apenas adicionadas duas secções (Strip e Panel de gargalos) e uma linha condicional no dashboard. Mapa de dependências, SLA e restantes secções inalterados.
- **Web Produtor** — Painel do produtor e módulos operacionais não foram alterados.
- **Camada agregadora** — Gargalos apenas **lêem** alertas, plano de ações, resumo executivo, closure, mapa de dependências e SLA; não duplicam lógica complexa; não introduzem dependência circular.
