Um gatilho inicia uma sessão sem a presença de uma pessoa. Uma programação cron dispara no horário; um webhook assinado dispara a partir de um evento. Em ambos os casos, o agente recebe seu próprio computador na nuvem, sua própria branch e a mesma revisão no retorno.
No primeiro dia do mês às 06:30
0 30 6 1 * *
Um gatilho é um horário ou uma assinatura. Todo o resto — em qual agente ele executa, o que diz, em qual sessão chega — é a mesma configuração nos dois casos.
Uma expressão cron de 6 campos — segundo, minuto, hora, dia, mês, dia da semana — em qualquer fuso horário IANA. Ou um único timestamp run_at, para algo que deve acontecer uma vez e depois permanecer quieto.
Um serviço externo faz POST para a URL do gatilho. O Kortix verifica a assinatura, transforma o payload em prompt e inicia a sessão. Um payload que não passa pelo seu filtro é aceito e ignorado.
Cada gatilho em um projeto é uma linha: como é chamado, quando dispara, em qual fuso horário, como qual agente e em qual sessão esse disparo chega. Nada é um estado oculto que você precise abrir.
| Trigger | Cron | Timezone | Agent | Session |
|---|---|---|---|---|
| daily-digest | 0 0 9 * * 1-5Dias úteis às 09:00 | America/Los_Angeles | kortix | novo |
| invoice-sweep | 0 30 6 1 * *No primeiro dia do mês às 06:30 | Europe/Berlin | finanças | reutilizar |
| oncall-handoff | 0 0 17 * * 5Sextas-feiras às 17:00 | UTC | suporte | novo |
| roadmap-review | 0 0 8 * * 1Segundas-feiras às 08:00 | America/New_York | planejador | fixado |
Os gatilhos ficam em kortix.yaml, junto dos seus agentes e imagens de sandbox. Cada um identifica seu agente, sua programação ou seu segredo e o template de prompt que se torna a primeira mensagem da sessão.
# fires on the clocktriggers: - slug: daily-digest type: cron agent: kortix cron: "0 0 9 * * 1-5" timezone: America/Los_Angeles session_mode: fresh prompt: | Summarize yesterday’s commits. Open a change request against main. # fires on an event - slug: new-lead type: webhook agent: sales secret_env: WEBHOOK_SECRET prompt: >- A new lead arrived: {{ body.name }} ({{ body.email }}). Add it to the CRM.# add it, ship it, and the schedule is live$ kortix triggers add daily-digest --type cron \ --cron "0 0 9 * * 1-5" \ --timezone America/Los_Angeles \ --prompt "Summarize yesterday. Open a CR."$ kortix ship→ kortix.yaml pushed. daily-digest is scheduled. # see every trigger and when it last fired$ kortix triggers ls # do not wait for 09:00 to find out$ kortix triggers fire daily-digest→ session startedUm prompt renderiza {{ token.dotted.path }} usando o payload que o acionou. Um disparo de webhook recebe {{ body.* }} e os headers da solicitação; um disparo cron recebe {{ cron.schedule }}, {{ cron.timezone }} e {{ cron.scheduled_for }}. Um valor ausente é renderizado como nada — sem erro e sem chaves sobrando na mensagem lida pelo agente.
Todo gatilho de webhook identifica um segredo do projeto que o assina. Um gatilho sem segredo é rejeitado na validação — não existe webhook não autenticado para você esquecer de proteger depois.
POST /v1/webhooks/projects/{projectId}/{slug}
X-Kortix-Signature: sha256=<hmac>
HMAC-SHA256 sobre o corpo bruto da solicitação, comparado em tempo constante. O header X-Hub-Signature-256, compatível com o GitHub, também funciona, portanto um webhook de repositório não precisa de adaptador.
Um filtro é um caminho pontilhado correspondido pelo mesmo payload que o prompt recebe. Ele existe para interromper loops: uma fonte que relata os dois lados de uma conversa acionaria o agente na própria resposta.
Por padrão, toda execução começa do zero. Quando o trabalho é uma conversa em andamento, e não uma tarefa nova, um trigger pode enviar um novo prompt para uma sessão que já possui. A Kortix tenta os modos na ordem e passa ao próximo em caso de falha, para que uma execução nunca simplesmente desapareça.
Enviar um novo prompt para uma sessão específica, indicada pelo id. Se essa sessão não existir ou tiver falhado, passar ao próximo modo.
Gerar uma chave a partir do payload e enviar um novo prompt para a sessão saudável mais recente marcada com essa chave exata. Um cliente, uma conversa. Nunca passa para a sessão de outra chave.
Enviar um novo prompt para a sessão saudável mais recente criada por este trigger. Um trigger fixado recorre a este modo antes de continuar.
Criar uma nova ramificação e iniciar um novo computador na nuvem. Este é o padrão e o último recurso para todos os outros modos.
Uma sessão acionada fica visível para todo o projeto, não apenas para quem configurou o trigger. Ela é encerrada após 5 minutos de inatividade, para que uma automação executada às 3h não mantenha uma máquina gerando custos até de manhã.
Uma automação não recebe privilégios que uma pessoa não receberia. O mesmo isolamento, o mesmo alcance delimitado, o mesmo caminho de volta para a branch principal.
Comece com uma tarefa e cresça a partir daí.