---
name: infra-check
description: Health check de MCPs e auditoria de despesas — sábado check completo 9 MCPs + auditoria despesas, domingo check resumido top 5 + despesas sem PDF.
context: fork
---

# /infra-check v1.0

MCP Health Check + Auditoria de Despesas.

---

## MCPs por Prioridade

**P1 - Criticos (bloqueiam trabalho):**
- desk-crm-v3 (CRM)
- filesystem (ficheiros locais)
- mcp-time (data/hora)

**P2 - Importantes (degradam workflow):**
- google-workspace (email/calendar)
- ssh-unified (servidores)
- memory-supabase (memoria)

**P3 - Uteis:**
- gitea (repos)
- moloni (facturacao)
- dify-kb (knowledge base)

---

## Protocolo Sabado (Completo)

### 1. MCP Health Check (9 MCPs)

```
Para cada MCP, executar teste simples:

| MCP | Teste | Timeout |
|-----|-------|---------|
| desk-crm-v3 | get_tickets(limit=1) | 5s |
| filesystem | list_directory(~) | 2s |
| mcp-time | current_time | 2s |
| google-workspace | calendar_get_events(hoje) | 5s |
| ssh-unified | ssh_list_servers | 3s |
| memory-supabase | search_memories("test") | 5s |
| gitea | list_my_repos | 5s |
| moloni | getall (companies) | 5s |
| dify-kb | list_datasets | 5s |

Resultado por MCP:
- OK - respondeu em <2s
- LENTO - respondeu em >2s
- FALHA - timeout ou erro
```

### 2. Auditoria Despesas Completa

```
2a. DESPESAS SEM PDF (ultimos 60 dias):
    mcp__ssh-unified__ssh_execute(server="desk", command="
      mysql -u ealmeida -p'9qPRdCGGqM4o' ealmeida_desk24 -e \"
        SELECT e.id, e.expense_name, e.amount, e.date, e.note,
          (SELECT COUNT(*) FROM tblfiles f WHERE f.rel_id = e.id AND f.rel_type = 'expense') as pdfs
        FROM tblexpenses e
        WHERE e.id >= 770 AND e.date >= DATE_SUB(CURDATE(), INTERVAL 60 DAY)
        HAVING pdfs = 0
        ORDER BY e.date DESC;
      \"
    ")
    Excluir: AT (cat 15), Salarios (cat 22), SS (cat 25) - nao tem recibo

2b. DESPESAS SEM CATEGORIA:
    WHERE id >= 770 AND (category = 0 OR category IS NULL)

2c. VALORES ANOMALOS (>500 EUR ou negativos):
    WHERE id >= 770 AND (amount > 500 OR amount < 0)

2d. RECONCILIACAO MENSAL (apenas 1o sabado do mes, DAY(CURDATE()) <= 7):
    - Contar despesas do mes anterior por categoria
    - Comparar com mes homologo
    - Alertar se variacao >30%

2e. FORNECEDORES RECORRENTES em falta:
    Verificar se fornecedores mensais tem despesa este mes:
    Anthropic, Cursor, Hetzner, Google One, ElasticEmail, Canva
    Alertar se falta apos dia 10 do mes
```

### 3. Verificar Gateway

```
WebFetch("https://gateway.descomplicar.pt/health")
Se falha → alerta critico (todos os MCPs gateway afectados)
```

---

## Protocolo Domingo (Resumido)

### 1. MCP Health Check (top 5)

```
Apenas P1 + P2:
- desk-crm-v3, filesystem, mcp-time, google-workspace, ssh-unified
Teste rapido, timeout 5s
Apenas verificar se responde
```

### 2. Despesas sem PDF (30 dias)

```
Mesma query do sabado mas INTERVAL 30 DAY
SE >3 sem PDF (excl. AT/Salario/SS) → alertar
SE 0 → "Todas as despesas recentes tem documento"
```

---

## Output

```markdown
## MCP Health Check ([Sabado/Domingo])

[status] X/Y MCPs operacionais
[alertas por MCP com problema]

## Auditoria Despesas ([Sabado/Domingo])

### Despesas sem documento (N) [se sabado]
| # | Fornecedor | Valor | Data | Accao |

### Fornecedores recorrentes [se sabado]
- [Fornecedor]: OK ou FALTA

### Resumo mensal [se 1o sabado]
- Total [Mes]: X EUR (Y despesas)
- vs [Mes anterior]: +/-Z%

[ou versao resumida se domingo]
```

---

## Troubleshooting Automatico

```
Se MCP falha:
1. Verificar gateway: WebFetch("https://gateway.descomplicar.pt/health")
2. Se gateway OK mas MCP falha → problema no MCP especifico → documentar
3. Se gateway falha → problema de rede/servidor mcp-hub → alerta critico
```

---

## Anti-Patterns

- NUNCA executar health check em dias uteis (reservado para Sab/Dom via /today)
- NUNCA ignorar falha de MCP P1 (critico)
- SEMPRE incluir accao sugerida para cada problema encontrado

---

*Skill v1.0.0 | 04-03-2026 | Descomplicar®*

---

## 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.*
