Skip to main content

Goals

Goals — árvore Mission → Project → Goal com progresso Goals dão direção ao EvoNexus. Sem um goal, rotinas e heartbeats são apenas atividade. Com um goal, cada execução de agente tem um alvo a perseguir — e o progresso é mensurável.

A Hierarquia

Cada camada responde a uma pergunta diferente: Missions são opcionais — um project pode existir sozinho. Goals devem obrigatoriamente pertencer a um project. Tasks opcionalmente pertencem a um goal (se pertencerem, completá-las soma em current_value).

Por que importa

Três coisas acontecem quando você liga trabalho a um goal:
  1. Rotinas injetam contexto do goal. Uma rotina com goal_id: mrr-80k em config/routines.yaml informa ao agente: “este é o resultado que você está perseguindo.” Relatórios, análises e recomendações ficam mais afiados porque o agente sabe como é o “bom”.
  2. Heartbeats injetam contexto do goal. Mesmo mecanismo — um heartbeat com goal_id dá ao agente proativo uma âncora.
  3. Progresso fica visível. O dashboard mostra cada goal com current_value / target_value, prazo e status. Goals parados ou atrasados aparecem automaticamente.

Criando um Goal

Via skill create-goal (recomendado)

No Claude Code:
“Crie um goal para atingir 80k MRR até 30 de junho.”
A skill conduz você por:
  1. Escolher (ou criar) uma mission
  2. Escolher (ou criar) um project sob ela
  3. Definir o goal — título, tipo de métrica, target, due date
  4. (Opcional) anexar tasks iniciais
  5. (Opcional) ligar uma rotina existente

Via dashboard

A página Goals tem um formulário “Novo Goal”. Mesmos campos, mesma hierarquia.

Via API

O slug é o handle público. É o que rotinas e heartbeats referenciam.

Tipos de Métrica

O dashboard renderiza cada tipo com a formatação correta (currency com símbolo, percent com %, etc.).

Acompanhamento de Progresso

Automático (via tasks)

Tasks somam em current_value:
  1. Crie tasks com goal_id: {numeric_id}
  2. Quando o status da task vira done, o backend recalcula current_value a partir da view SQL goal_progress_v
  3. Quando current_value >= target_value, o status do goal vira achieved

Manual (PATCH direto)

Métricas que não são tasks (MRR, NPS, follower count) precisam de updates diretos:
Você pode amarrar uma rotina para fazer isso na agenda — ex. uma rotina diária fin-pulse que faz PATCH no goal de MRR com o número mais recente do Stripe.

Correção de drift

Se a contagem de tasks ficar fora de sincronia com current_value:
Força um recálculo a partir da view SQL.

Ligando uma Rotina

Isso grava goal_id: mrr-80k na entrada correspondente em config/routines.yaml. Todas as próximas execuções dessa rotina verão o contexto do goal.

Ligando um Heartbeat

Heartbeats aceitam goal_id na entrada YAML:
Mesmo efeito das rotinas — o agente roda com contexto do goal.

Ligando um Ticket

Tickets aceitam um goal_id numérico na criação ou via PATCH:
O ticket aparece na lista de tickets do goal e conta para sua atividade.

Visualizando Progresso

Dashboard

A página Goals agrupa goals por project, mostra barras de progresso, sinaliza atrasos em vermelho e permite filtrar por status (active, achieved, dropped), janela de prazo (overdue, this-week, this-month) ou project.

API

Anti-padrões

  • Goals sem métrica. “Melhorar o produto” não é um goal — é um desejo. Todo goal precisa de metric_type, target_value e due_date.
  • Goals que nunca mudam de estado. Se current_value não se move por semanas, o goal está parado (arquive-o) ou não está conectado a um sinal (adicione uma rotina que atualize).
  • Sobrecarregar missions. Uma mission deve cobrir um trimestre ou mais. Se você está criando uma mission por semana, achate-as em projects.
  • Ligar uma rotina a um goal slug inexistente. A API retorna 404. Confirme o slug com GET /api/goals antes.

Skills do CLI

Relacionados

  • docs/heartbeats.md — acordar agentes em intervalos com contexto de goal
  • docs/tickets.md — unidades de trabalho persistentes que podem ser ligadas a goals
  • Código: dashboard/backend/routes/goals.py, dashboard/backend/goal_context.py