Files
claude-plugins/gestao/skills/today/SKILL.md
T
ealmeida cf75218330 sync: InSync como único sync GDrive; rclone só para offsite LocalBackups
Timers rclone-bisync/gdrive-sync marcados obsoletos (devem ficar disabled);
backup-strategies reescrito: offsite via rclone pontual LocalBackups→GDrive,
nunca rclone mount/bisync em pastas de trabalho (conflito com InSync).
2026-07-22 11:31:24 +01:00

12 KiB

name, description, context
name description context
today 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. fork

/today v12.0 - 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

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

## 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]

---

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

---
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
/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:

{"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.0.0 | 06-07-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

Healing Log

{"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"}