--- 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.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 de backup (rclone-bisync, gdrive-sync) 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 -n 20 --no-pager d) Confirmar se os timers de backup estão activos (regra 3-2-1): 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 — " 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] --- ## 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 | — | ACTIVO/DISABLED | [alerta se desligado] | --- ## 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 | Sync offsite (regra 3-2-1) — confirmar `enabled`/`active` | | `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: ```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.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 ```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"} ```