---
name: sprint
description: Sprints flexíveis que lêem tasks do Desk CRM, agrupam em sprints com checkpoints e reviews.
disable-model-invocation: true
---

# /sprint v1.0 - Sprints Flexiveis

Sprints com duracao flexivel, Desk CRM como fonte de verdade, checkpoints obrigatorios.

## Contexto NotebookLM

ANTES de executar, consultar notebooks para contexto especializado:

| Notebook | ID | Consultar quando |
|----------|-----|-----------------|
| Gestão de Projectos e Agile | 0c9c079c-a426-486c-99eb-1564d42d37ad | Sempre |

```
mcp__notebooklm__notebook_query({
  notebook_id: "0c9c079c-a426-486c-99eb-1564d42d37ad",
  query: "<adaptar ao contexto do pedido do utilizador>"
})
```

Integrar insights do NotebookLM nas recomendações e decisões.

---

## Comandos

| Comando | Funcao |
|---------|--------|
| `/sprint` | Mostrar sprint activo |
| `/sprint plan` | Criar sprint a partir de tasks Desk |
| `/sprint check-in` | Checkpoint a meio do sprint |
| `/sprint review` | Review final do sprint |
| `/sprint close` | Fechar sprint e calcular metricas |
| `/sprint add <task_id>` | Adicionar task ao sprint activo |
| `/sprint remove <task_id>` | Remover task do sprint |

---

## SPRINT.md Template

```markdown
---
sprint_id: YYYY-WNN-[projecto]
project_id: null
start_date: YYYY-MM-DD
end_date: YYYY-MM-DD
status: active
checkpoint_done: false
spec_refs: []
tasks_planned: 0
tasks_added_after: 0
---

# Sprint: [Goal em 1 frase]

## Tasks

| Desk ID | Task | Prioridade | Estimativa | Status | Tempo Real |
|---------|------|-----------|-----------|--------|-----------|

## Checkpoint (Meio do Sprint)
_Data: [a preencher]_
- On track: [sim/nao]
- Bloqueios: [lista]
- Scope changes: [lista]
- Accao: [continuar/ajustar]

## Review (Final do Sprint)
_Data: [a preencher]_
- Tasks completadas: X/Y
- Tasks adicionadas pos-planeamento: N
- Tempo estimado: Xh
- Tempo real: Yh
- Scope changes: N
- Licoes aprendidas: [lista]
- Proximos passos: [lista]
```

---

## Protocolos

### `/sprint` (sem argumentos)

```
1. Procurar SPRINT.md no directorio actual (ou pais, max 3 niveis)
2. SE encontrado e status == active:
   a. Ler SPRINT.md
   b. Buscar estado actual das tasks no Desk CRM:
      Para cada task_id na tabela:
        mcp__desk-crm-v3__get_task({ id: task_id })
   c. Mostrar:
      ---
      ## Sprint Activo: [goal]
      **Projecto:** [nome] (#id)
      **Periodo:** [start] -> [end] (dia X de Y)
      **Checkpoint:** [feito/pendente]

      | Task | Status Desk | Sprint |
      |------|------------|--------|

      **Progresso:** X/Y tasks (Z%)
      ---
3. SE nao encontrado:
   "Sem sprint activo. Usar /sprint plan para criar."
```

### `/sprint plan`

```
1. mcp__mcp-time__current_time -> data actual
2. Detectar contexto:
   a. Ler .desk-project se existe -> project_id
   b. Se nao: perguntar projecto
3. Buscar tasks abertas do Desk CRM:
   mcp__desk-crm-v3__get_tasks({ project_id: X, status: [1, 4] })
   (status 1=Not Started, 4=In Progress)
4. Verificar SPEC.md:
   - Se existe e aprovado: incluir referencia no sprint
   - Se nao existe: WARN "Sem spec aprovado. Considere /spec create."
   - Nao bloquear por isto (gradual adoption)
5. Apresentar tasks ao Emanuel por prioridade:

   ## Tasks Disponiveis para Sprint

   ### Urgente / Alta
   - #1450: Implement API (4h estimado)
   - #1451: Fix login bug (1h estimado)

   ### Normal
   - #1448: Write docs (2h estimado)

   ### Baixa
   - #1452: Refactor CSS (3h estimado)

6. Perguntar:
   "Que tasks incluir neste sprint? E data limite?"
   (pode ser: "todas as urgentes", "#1450 e #1448", etc.)
7. Calcular estimativa total
8. GERAR SPRINT.md:
   - sprint_id: YYYY-WNN-[projecto] (semana ISO actual)
   - tasks_planned: contagem
   - Preencher tabela de tasks
9. CONFIRMAR: "Sprint com [N] tasks, ~[X]h, ate [data]. Criar?"
10. Gravar SPRINT.md
11. Guardar em memory-supabase:
    save_memory({
      content: "Sprint [id] iniciado: [N] tasks, [X]h, ate [data]",
      tags: ["sprint", "project-[id]", sprint_id]
    })
12. "Sprint criado. Check-in recomendado em [data_meio]."
```

### `/sprint check-in`

```
1. Ler SPRINT.md
   - Se nao existe ou status != active: "Sem sprint activo."
2. Se checkpoint_done == true:
   "Checkpoint ja realizado. Para novo check-in, usar /sprint review."
3. mcp__mcp-time__current_time -> calcular dia actual vs periodo
4. Para cada task do sprint:
   mcp__desk-crm-v3__get_task({ id: task_id })
   - Comparar status actual vs planeado
5. Calcular:
   - % tempo decorrido
   - % tasks completadas
   - Tasks adicionadas apos planeamento (comparar com tasks_planned)
6. Detectar alertas:
   - >50% tempo decorrido mas <40% tasks feitas -> "ATRASADO"
   - Tasks novas adicionadas -> "SCOPE CREEP: [N] tasks nao planeadas"
   - Tasks bloqueadas -> "BLOQUEIO: [task]"
7. Apresentar:
   ---
   ## Checkpoint Sprint [id]

   **Progresso:** X/Y tasks (Z%)
   **Tempo:** dia M de N (W% decorrido)
   **Alerta:** [verde/amarelo/vermelho]

   ### Tasks
   | Task | Planeado | Actual |
   |------|----------|--------|

   ### Problemas Detectados
   - [lista ou "nenhum"]

   ### Recomendacao
   [Continuar como esta / Ajustar scope / Pedir ajuda]
   ---
8. Perguntar: "Algum ajuste? Notas?"
9. Actualizar SPRINT.md:
   - Preencher seccao Checkpoint
   - checkpoint_done: true
```

### `/sprint review`

```
1. Ler SPRINT.md
   - Se status != active: "Sprint nao activo."
2. mcp__mcp-time__current_time
3. Estado final de todas as tasks:
   Para cada task: mcp__desk-crm-v3__get_task({ id })
4. Buscar tempo real:
   mcp__desk-crm-v3__get_task_time_logs({ task_id }) para cada task
5. Calcular metricas:
   - Completion rate: tasks_done / tasks_total
   - Scope creep: tasks_added_after (comparar lista actual vs original)
   - Tempo: soma estimativas vs soma real
   - Precisao: |estimado - real| / estimado * 100
6. Apresentar review:
   ---
   ## Sprint Review: [id]

   ### Resultado: [X/Y tasks completadas]

   | Task | Estimativa | Tempo Real | Status |
   |------|-----------|-----------|--------|

   ### Metricas
   - Completion rate: Z%
   - Scope changes: N tasks adicionadas/removidas
   - Tempo: Xh estimado vs Yh real (precisao: W%)

   ### Retrospectiva
   - O que correu bem?
   - O que pode melhorar?
   - Accoes para proximo sprint?
   ---
7. Perguntar retrospectiva ao Emanuel
8. Actualizar SPRINT.md seccao Review
9. Registar metricas:
   a. memory-supabase:
      save_memory({
        content: "Sprint [id] review: [X/Y] tasks, [scope_changes] changes, [Yh] real vs [Xh] estimado",
        tags: ["sprint", "metrics", sprint_id, "project-[id]"]
      })
   b. Se .desk-project existe: comentar na task Desk (formato HTML #27)
10. Perguntar: "Planear proximo sprint? /sprint plan"

### `/sprint close`

```
1. Executar /sprint review se review nao feito
2. Actualizar SPRINT.md: status -> closed
3. "Sprint fechado. Metricas registadas."
```

### `/sprint add <task_id>`

```
1. Ler SPRINT.md activo
2. Verificar se task_id ja esta no sprint
3. Buscar task do Desk: mcp__desk-crm-v3__get_task({ id: task_id })
4. Adicionar a tabela de tasks
5. Incrementar tasks_added_after no frontmatter
6. WARN: "Task adicionada apos planeamento. Isto conta como scope change."
```

---

## Regras

1. **NUNCA** criar sprint sem consultar Desk CRM
2. **SEMPRE** perguntar ao Emanuel que tasks incluir (nao decidir sozinho)
3. Checkpoint e recomendado mas nao obrigatorio
4. Review e obrigatorio antes de fechar sprint
5. Metricas sao factuais - nao ajustar para "parecer bem"
6. Sprint nao tem cadencia fixa - dura o que o projecto precisa

---

## Healing Log

Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.

```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```

*Adicionar nova linha após cada erro corrigido.*
