Fase 2 passo 7b invoca today-security-block.py (71.Seguranca, Hub) -- le relatorios/*.md ja gerados (sem correr scans novos), score+delta+alertas por dominio. Secao '## Seguranca' nova no formato do dashboard. v12.0.0 -> v12.1.0.
315 lines
14 KiB
Markdown
315 lines
14 KiB
Markdown
---
|
|
name: today
|
|
description: Checkup diário - dashboard agregador que lê resultados dos agentes systemd locais (desktop/hp) e recolhe dados frescos via skills interactivas. Usar quando "checkup", "hoje", "today", "rotina", início de dia.
|
|
context: fork
|
|
---
|
|
|
|
# /today v12.1 - Checkup Diario (Agregador)
|
|
|
|
Lê resultados dos agentes systemd locais (user timers, desktop/hp) + invoca skills interactivas. Não duplica trabalho automatizado.
|
|
|
|
---
|
|
|
|
## Arquitectura
|
|
|
|
> Migração: crontab (`claude_automations_dev`, extinto 20-04-2026) → Hermes cronjobs (05-05-2026, Task #2080) → **systemd user timers `stack-observer`** (actual, desde ~11-06-2026). Repo agentes: `git.descomplicar.pt/ealmeida/stack-observer` (código) + `~/.config/systemd/user/*.timer` (agendamento).
|
|
|
|
```
|
|
SYSTEMD USER TIMERS (desktop/hp) /today (interactivo, sob pedido)
|
|
├── collector-gate-events (*/5min) ├── Lê estado systemd (list-timers + list-units --failed)
|
|
├── collector-hermes-jobs (*/5min) ├── /daily-digest (dados frescos CRM)
|
|
├── observer-ticket-queue (*/5min) ├── /tasks-overview (dados frescos Desk)
|
|
├── observer-tickets (diário 09:30) ├── /cleanup-downloads (se necessário)
|
|
├── observer-desk-alert (diário 09:00) ├── Specs/Sprints scan
|
|
├── update-omp / update-claude (periódico) ├── Rotinas especiais por dia
|
|
├── okf-confianca (semanal seg) └── Dashboard + Obsidian + Mem0
|
|
├── verify-gates-registry (semanal seg)
|
|
└── stk-drift-check (semanal dom)
|
|
|
|
Timers rclone (rclone-bisync, gdrive-sync — obsoletos: InSync é o único sync GDrive) e OKF secundários
|
|
(okf-health, okf-lint, okf-detect, okf-moc-sync, okf-validate)
|
|
existem mas ficam `disabled`/`inactive` por omissão — confirmar
|
|
estado antes de assumir que correm.
|
|
```
|
|
|
|
---
|
|
|
|
## Regra Fundamental
|
|
|
|
> Fases 1-2 sao **silenciosas**. Executar tudo antes de mostrar output.
|
|
> O utilizador so ve o dashboard final.
|
|
|
|
---
|
|
|
|
## Protocolo
|
|
|
|
### Fase 0: Verificacoes
|
|
|
|
```
|
|
1. mcp__mcp-time__current_time -> data, dia da semana
|
|
2. mcp__mem0__search_memories("today checkup YYYY-MM-DD")
|
|
-> Se ja existe hoje: perguntar se quer re-executar
|
|
```
|
|
|
|
### Fase 1: Ler estado dos agentes systemd (silencioso)
|
|
|
|
```
|
|
3. Ler estado systemd (Bash — sem SSH, tudo corre no desktop/hp):
|
|
|
|
a) Próximas execuções + última corrida de cada timer activo:
|
|
systemctl --user list-timers --all --no-legend
|
|
|
|
b) Unidades falhadas (qualquer serviço, não só os do stack-observer):
|
|
systemctl --user list-units --failed --no-legend --all
|
|
|
|
c) Para cada falha encontrada em (b), obter a causa:
|
|
journalctl --user -u <service>.service -n 20 --no-pager
|
|
|
|
d) Confirmar se os timers de backup estão activos (regra 3-2-1):
|
|
# rclone-bisync/gdrive-sync devem estar DISABLED (InSync é o único sync GDrive)
|
|
systemctl --user is-enabled rclone-bisync.timer gdrive-sync.timer
|
|
systemctl --user is-active rclone-bisync.timer gdrive-sync.timer
|
|
-> Se disabled/inactive: ALERTA "Requer Atencao Urgente" (backup offsite em risco)
|
|
|
|
e) HEARTBEAT WP — ultimo post em descomplicar.pt categoria 1188 (noticias):
|
|
mcp__ssh-unified__ssh_execute(server="server", command="cd /home/ealmeida/public_html && wp post list --post_type=post --category=1188 --posts_per_page=1 --fields=ID,post_title,post_date --format=csv --allow-root 2>&1 | tail -2")
|
|
-> Se a ligação SSH falhar (auth/timeout), NÃO repetir a tentativa mais de uma vez
|
|
(risco de lockout CSF/LFD no servidor CWP) — reportar como alerta de acesso,
|
|
não como heartbeat em falta.
|
|
-> Calcular idade do ultimo post
|
|
-> Se >26h sem post novo: ALERTA "Requer Atencao Urgente" + contexto:
|
|
* Pipeline deveria publicar ate 5 noticias/dia
|
|
* Verificar journalctl dos timers relacionados (researcher/scorer/selector/publisher, se existirem)
|
|
* Verificar se desktop/hp tiveram downtime (uptime / journalctl -b)
|
|
|
|
4. DETECTAR PROBLEMAS:
|
|
- Timer com falha em list-units --failed
|
|
- Timer de backup/OKF crítico disabled/inactive quando deveria estar activo
|
|
- Exit codes != 0 nos journalctl consultados
|
|
- HEARTBEAT WP >26h sem post novo em cat 1188, ou SSH inacessível
|
|
-> Adicionar a seccao "Requer Atencao Urgente"
|
|
|
|
4b. VERIFICAR FORNECEDORES AUTO-CRIADOS:
|
|
Ler ~/.claude-work/fornecedores-iva.json (se existir)
|
|
Filtrar entradas com "auto_proposto": true
|
|
Para cada entrada extrair: nome, dominio (chave), politica, confianca, despesas_count
|
|
-> Se existirem: adicionar secção "Fornecedores Auto-Criados" no dashboard (ver formato abaixo)
|
|
```
|
|
|
|
### Fase 2: Recolha de dados frescos (silencioso)
|
|
|
|
```
|
|
5. Invocar /daily-digest
|
|
-> Timer, tickets, facturas, leads, propostas, agenda
|
|
-> Requer MCP desk-crm-v3 (disabled por omissão, regra 57 CLAUDE.md) —
|
|
se desligado, reportar tickets/facturas/leads/propostas como indisponíveis
|
|
em vez de tentar contornar com desk-project-minimal (cobertura parcial: só tarefas).
|
|
-> Output: dashboard markdown
|
|
|
|
6. Invocar /tasks-overview
|
|
-> Tarefas overdue, pendentes, em curso, workflows sugeridos
|
|
-> desk-project-minimal cobre tarefas (get_overdue_tasks, get_tasks) sem depender do desk-crm-v3
|
|
-> Output: tarefas markdown
|
|
|
|
7. SE >10 ficheiros em ~/Transferencias:
|
|
-> Invocar /cleanup-downloads
|
|
|
|
7b. Bloco de segurança (P2-10, 10-08-2026):
|
|
python3 /media/ealmeida/Dados/Hub/04-Stack/02.04-Sistemas/71.Seguranca/tools/today-security-block.py
|
|
-> Lê relatorios/*.md já gerados (não corre scans novos — demoram minutos, usam APIs externas)
|
|
-> Score actual + delta vs leitura anterior por domínio, alerta se abaixo do SLA (90) ou mínimo (75)
|
|
-> Output: bloco markdown "## 🔒 Segurança" pronto a incluir no dashboard
|
|
```
|
|
|
|
### Fase 2b: Sprint/Spec Activos (silencioso)
|
|
|
|
```
|
|
8. Glob: /media/ealmeida/Dados/Dev/**/SPEC.md (profundidade max 3)
|
|
-> Excluir placeholders genéricos: title "Spec"/"SPEC — <repo>" com status: draft
|
|
e sem secções de conteúdo além do frontmatter (gerados por template, docs/SPECS/SPEC.md)
|
|
-> Para cada SPEC.md real (conteúdo substantivo): ler frontmatter (grep ^status: mais rápido que ler 15 linhas por ficheiro)
|
|
-> Filtrar: status not in [completed, shipped, abandoned, rejected]
|
|
-> Extrair: titulo, status, data approved/updated, projecto Desk associado
|
|
|
|
9. Glob: /media/ealmeida/Dados/Dev/**/SPRINT.md
|
|
-> Para cada encontrado: Ler frontmatter
|
|
-> Filtrar: status == "active"
|
|
-> Extrair: sprint_id, tasks done/total, checkpoint_done, end_date
|
|
```
|
|
|
|
### Fase 2c: Rotinas Especiais
|
|
|
|
```
|
|
10. SE SEGUNDA:
|
|
-> Planeamento semanal (tarefas da semana + capacidade)
|
|
|
|
11. SE SEXTA:
|
|
-> Sugerir manutencao e revisao semanal
|
|
```
|
|
|
|
### Fase 3: Output Final
|
|
|
|
```
|
|
12. AGREGAR resultados de systemd + skills:
|
|
- Estado dos timers/serviços (Fase 1)
|
|
- Dados frescos do /daily-digest e /tasks-overview (Fase 2)
|
|
- Specs/Sprints (Fase 2b)
|
|
|
|
13. DASHBOARD ao utilizador (formato abaixo)
|
|
|
|
14. CRIAR NOTA OBSIDIAN:
|
|
Path: /media/ealmeida/Dados/Hub/00-Inbox/DD-MM-YYYY-checkup.md
|
|
Conteudo: dashboard completo
|
|
|
|
15. GUARDAR em Mem0 (store canónico cross-agent, CLAUDE.md regra 28):
|
|
mcp__mem0__save_memory({
|
|
text: "Checkup diario DD-MM-YYYY: X tarefas vencidas, Y em curso, Z urgentes, timers OK/FALHA",
|
|
metadata: {"type": "today-checkup", "date": "YYYY-MM-DD"}
|
|
})
|
|
```
|
|
|
|
---
|
|
|
|
## Formato Dashboard
|
|
|
|
```markdown
|
|
## Checkup Diario - DD-MM-YYYY (Dia-da-Semana)
|
|
|
|
---
|
|
|
|
## Requer Atencao Urgente
|
|
[Alertas: timer/serviço falhado, backup offsite em risco, SSH inacessível, heartbeat WP em falta, notificacoes criticas]
|
|
|
|
---
|
|
|
|
## Fornecedores Auto-Criados (pendente validação)
|
|
[Omitir secção se nenhum fornecedor tem auto_proposto=true]
|
|
|
|
| Fornecedor | Domínio | Política | Confiança | Despesas | Acção |
|
|
|------------|---------|----------|-----------|----------|-------|
|
|
| [nome] | [dominio] | [politica] | [confianca] | [despesas_count]/3 | [— se alta, "rever" se baixa] |
|
|
|
|
Nota: Promovidos automaticamente após 3 despesas. Confiança "baixa" = fallback EXTRA_UE aplicado — rever manualmente.
|
|
|
|
---
|
|
|
|
## 3 Prioridades Hoje
|
|
1. [ ] [Mais urgente]
|
|
2. [ ] [Segunda]
|
|
3. [ ] [Terceira]
|
|
|
|
---
|
|
|
|
## Workflows Sugeridos
|
|
[Do /tasks-overview]
|
|
|
|
---
|
|
|
|
## Sprint / Spec Activos
|
|
[Projectos com spec/sprint activo: nome, progresso, checkpoint]
|
|
[Se nenhum: "Nenhum sprint/spec activo"]
|
|
|
|
---
|
|
|
|
## Resumo do Dia
|
|
[Do /daily-digest: timer, tickets, facturas, tarefas, leads, agenda — ou "indisponível, desk-crm-v3 desligado" se aplicável]
|
|
|
|
---
|
|
|
|
## 🔒 Segurança
|
|
[Output de today-security-block.py — score+delta por domínio, alertas abaixo do SLA/mínimo]
|
|
|
|
---
|
|
|
|
## Agentes Systemd (desktop/hp local)
|
|
|
|
| Timer | Ultima execucao | Status | Resumo |
|
|
|-------|-----------------|--------|--------|
|
|
| collector-gate-events | HH:MM | OK/FALHA | — |
|
|
| collector-hermes-jobs | HH:MM | OK/FALHA | — |
|
|
| observer-ticket-queue | HH:MM | OK/FALHA | — |
|
|
| observer-tickets | HH:MM | OK/FALHA | — |
|
|
| observer-desk-alert | HH:MM | OK/FALHA | [journalctl summary se FALHA] |
|
|
| rclone-bisync / gdrive-sync | — | DISABLED (esperado) | [alerta se ACTIVO — InSync é o único sync GDrive] |
|
|
|
|
---
|
|
|
|
## Auto-Processamento (ultimas 24h)
|
|
[Resumo agregado: divergências detectadas pelo stack-observer, tickets criados, despesas criadas]
|
|
```
|
|
|
|
---
|
|
|
|
## Nota Obsidian
|
|
|
|
```yaml
|
|
---
|
|
title: Checkup DD-MM-YYYY
|
|
date: DD-MM-YYYY
|
|
type: checkup
|
|
status: active
|
|
---
|
|
```
|
|
|
|
Filename: `DD-MM-YYYY-checkup.md` (Regra #45: formato DD-MM-YYYY)
|
|
|
|
---
|
|
|
|
## Anti-Patterns
|
|
|
|
- NUNCA invocar manualmente os componentes do stack-observer (correm por timer)
|
|
- NUNCA mostrar output antes de terminar Fase 1 e 2
|
|
- NUNCA mostrar mais de 3 prioridades (PHDA)
|
|
- NUNCA executar sem verificar data/hora primeiro
|
|
- SEMPRE correr `list-timers` + `list-units --failed` antes de mostrar dashboard
|
|
- SEMPRE alertar se algum timer crítico (observer-desk-alert, observer-tickets, backup) falhou ou está inactivo
|
|
- NUNCA repetir uma tentativa SSH falhada ao host `server` mais de uma vez na mesma sessão (risco de lockout CSF/LFD)
|
|
- NUNCA contornar um MCP desligado (ex: desk-crm-v3) — reportar e remeter para `/mcp` (regra 57 CLAUDE.md)
|
|
|
|
---
|
|
|
|
## Referencia
|
|
|
|
| Componente | Tipo | Responsabilidade |
|
|
|-----------|------|-----------------|
|
|
| `collector-gate-events` | systemd timer (*/5min) | Recolhe gate_events do Espelho/observer |
|
|
| `collector-hermes-jobs` | systemd timer (*/5min) | Recolhe jobs Hermes |
|
|
| `observer-ticket-queue` | systemd timer (*/5min) | Processa fila de divergências (Node) |
|
|
| `observer-tickets` | systemd timer (diário 09:30) | Processador de fila de tickets → Desk CRM |
|
|
| `observer-desk-alert` | systemd timer (diário 09:00) | Auto-ticket para divergências detectadas |
|
|
| `rclone-bisync` / `gdrive-sync` | systemd timer | Obsoletos — devem ficar `disabled` (InSync é o único sync GDrive; offsite = rclone pontual LocalBackups→GDrive) |
|
|
| `okf-confianca` / `verify-gates-registry` / `stk-drift-check` | systemd timer (semanal) | Relatórios de qualidade/confiança OKF |
|
|
| `HEARTBEAT WP` | Check ao vivo | `wp post list cat=1188` via SSH → idade do ultimo post. Alerta se >26h ou SSH inacessível |
|
|
| `/daily-digest` | Skill (interactivo) | Timer, tickets, facturas, leads, agenda (requer desk-crm-v3) |
|
|
| `/tasks-overview` | Skill (interactivo) | Tarefas pendentes/overdue + workflows (desk-project-minimal) |
|
|
| `/cleanup-downloads` | Skill (interactivo) | Limpeza pasta Transferencias |
|
|
| `today-security-block.py` | Script (leitura) | Score+delta de segurança por domínio, lê `71.Seguranca/relatorios/*.md` (não corre scans novos) |
|
|
| `/spec` + `/sprint` | Scan local | Specs e sprints activos |
|
|
|
|
Repo agentes: `git.descomplicar.pt/ealmeida/stack-observer` (código) — agendamento em `~/.config/systemd/user/*.timer`, não em crontab.
|
|
|
|
---
|
|
|
|
## Self-Healing
|
|
|
|
Antes de executar, ler `~/.claude-work/healing/today.jsonl` (se existir). Cada linha é um padrão de erro conhecido:
|
|
|
|
```json
|
|
{"date":"YYYY-MM-DD","issue":"descrição do problema","fix":"como evitar","source":"user|auto"}
|
|
```
|
|
|
|
Se encontrares um padrão relevante ao contexto actual, aplica o fix preventivamente. Após cada erro ou correcção do utilizador nesta skill, **adicionar nova linha** ao healing log com o padrão aprendido.
|
|
|
|
---
|
|
|
|
*Skill v12.1.0 | 10-08-2026 | Descomplicar® — arquitectura actualizada de crontab/claude_automations_dev (extinto) para systemd user timers `stack-observer`; memory-supabase substituído por mem0; alerta de lockout SSH ao host `server`; bloco de segurança adicionado (P2-10, SPEC-Hardening-Seguranca.md)*
|
|
|
|
## Healing Log
|
|
<!-- Registo automático de erros e correcções nesta skill -->
|
|
|
|
```jsonl
|
|
{"date":"2026-07-06","issue":"Fase 1 apontava para claude_automations_dev/{imap-triage,auto-expense,ticket-triage,aiktop-tasks,infra-check,wp-update} — todos arquivados em z_arquivo/ desde a migração para Hermes cronjobs (05-05) e depois systemd stack-observer (~11-06). Logs nunca existiam, secção 'Agentes Cron' sempre vazia.","fix":"Ler estado via systemctl --user list-timers/list-units --failed + journalctl, não tail de logs em paths fixos que mudam a cada migração de arquitectura.","source":"user"}
|
|
{"date":"2026-07-06","issue":"skill referenciava mcp__mem0 (desactivado) para Fase 0/3.","fix":"Usar mem0 (mcp__mem0__search_memories / save_memory), store canónico actual por CLAUDE.md regra 28.","source":"user"}
|
|
{"date":"2026-08-10","issue":"nao havia visibilidade de seguranca no checkup diario -- score so era visto ao correr /seguranca-check manualmente.","fix":"Adicionada Fase 2 passo 7b: today-security-block.py le relatorios/*.md ja gerados (sem correr scans novos) e mostra score+delta+alertas por dominio. Secao '## Segurança' no dashboard.","source":"agent"}
|
|
```
|