Skip to main content
Coletânea de receitas práticas do Scheduler (Chronos). Todas assumem que o daemon está rodando (chatcli daemon start --detach) — mas funcionam igual em modo in-process se você mantiver o chatcli aberto.

1. Deploy Terraform + espera K8s + valida

Subir infraestrutura via terraform apply, esperar o deployment ficar Available, então imprimir o estado final. Tudo em uma linha — você pode fechar o CLI.
Volta depois:

2. Docker compose + healthcheck + smoke tests

A condição and(...) só satisfaz quando o container está healthy e o endpoint retorna 200 — evita o caso clássico de “container up mas app ainda inicializando”.

3. Backup noturno com cron

  • Roda todo dia às 02:00 locais.
  • Timeout de 1h (restore longo tolerado).
  • Até 3 retries com exponential backoff.
  • TTL de 7 dias em /jobs history.
  • Filtrável por tag em /jobs list --tag category=backup.

4. Esperar condição e notificar Slack

Sem agendamento — um wait que só avisa quando o banco voltar:
--async faz o comando retornar imediatamente (você recebe o job ID). Quando a porta abrir, o webhook dispara.

5. Pipeline DAG — multi-estágio

Deploy canário → smoke tests → rollout para o restante → notificar:
Se qualquer estágio falhar, a cascata de falha propaga — rollout e notify ficam StatusFailed com dependency failed no message.

6. Agent agendando sozinho (ReAct)

Você pede algo que demora; o agent decide pausar e voltar:
O agent usa schedule com async:true + triggers para encadear; na próxima conversa o resultado já está no contexto.

7. Job que se auto-limita (budget)

Rate-limit e budget explícitos para evitar LLM cost runaway:
  • Uma retry só.
  • 2 min cap na LLM call (se o modelo travar, falha rápido).
Combine com CHATCLI_SCHEDULER_RATE_LIMIT_OWNER_RPS para cap global.

8. Probe periódico com circuit breaker automático

Se o health fica down por 3 polls (90s), --on-timeout fire_anyway dispara a action mesmo — que por sua vez chama o agent para criar a issue. Após 5 falhas consecutivas em 60s, o circuit breaker do http_status abre por 30s — os próximos probes retornam OutcomeBreakerOff sem bombardear a API caída.

9. Cancelar em massa via tag

Enquanto o CLI não expuser /jobs cancel --tag direto, a combinação IPC + shell basta.

10. Auditoria e troubleshooting

Cada entrada do audit inclui type, timestamp, job_id, status, message e payload completo do evento — use como base para alertas em Splunk/Datadog/Loki.

Troubleshooting comum

Verifique:
  • /config scheduler mostra enabled?
  • CHATCLI_SCHEDULER_ACTION_ALLOWLIST inclui o tipo da ação?
  • Rate limiter não rejeitou (veja chatcli_scheduler_enqueue_errors_total{reason="rate_limited"})?
  • Daemon está rodando? chatcli daemon status.
  • Você setou --timeout? (default 30m)
  • Cheque breaker state: /config scheduler mostra breakers na seção daemon; ou métrica chatcli_scheduler_breaker_state.
  • Teste a condição isoladamente com /wait --until <cond> --async — quando dispara, confere que o evaluator está funcionando.
Socket stale de um crash anterior. O start tenta limpar automaticamente, mas pode falhar se outro processo ainda estiver travado nele:
Seu comando shell é classificado pelo CoderMode no momento do /schedule (preflight). Dois casos:ErrShellPolicyDeny — o comando (ou um padrão que casa com ele) está na denylist em ~/.chatcli/coder_policy.json. --i-know NÃO tira essa rejeição; denylist é autoritativa. Remova com:
Ou edite o JSON direto se preferir bulk edit.ErrShellPolicyAsk — o comando bateria num prompt “Allow once / Allow always / Deny” se rodasse interativamente. O scheduler nunca prompta. Três saídas:
  1. Pré-aprovar este job específico com --i-know:
  2. Adicionar permanentemente à allowlist — uma linha:
    Também dá pra rodar o comando uma vez via /coder interativo e escolher “Allow always” no prompt (mesma infra PolicyManager.AddRule por baixo). Ambos persistem em ~/.chatcli/coder_policy.json.
  3. Converter pra agent_task ou slash_cmd — comandos via agent passam pela política interativa no momento do fire.
Defense-in-depth: o bridge re-checa no fire-time. Se você adicionou uma Deny rule nova DEPOIS de um job cron ter sido agendado, o próximo fire falha com ErrShellPolicyDeny no log — não executa.
Pra automação em container efêmero de CI onde você controla a sandbox:
Ambos precisam estar presentes — bypass_safety sozinho sem a env var do operator é rejeitado. Isso impede um agent de escrever bypass_safety:true no spec e escapar da política sem o operator ter ativado antes.

Próximos passos

Doc da feature

Arquitetura, invariantes e padrões plug-in completos.

Referência de comandos

Todas as flags e subcomandos.