Algures no registo de um cliente, no meio de uma nota comum sobre uma chamada comum, está uma frase como esta: “O orçamento está apertado agora, ficou combinado voltarmos a contactá-los daqui a dois meses para retomar o assunto.”
Escrita uma vez. Nunca mais revista. Não porque alguém se tenha esquecido de que era importante, mas porque nada nela parecia uma tarefa. Não era uma entrada de calendário. Não era um lembrete. Era só uma frase, a fazer o que as frases nas notas fazem: ficar ali, tecnicamente verdadeira, funcionalmente invisível.
Queríamos saber se o sistema conseguia apanhar esse tipo de coisa sozinho, sem que ninguém tivesse de se lembrar de voltar atrás e transformar à mão uma frase numa tarefa.
O que realmente construímos, e o que deliberadamente não
O instinto com uma funcionalidade destas é deixar a IA tratar de tudo — ler a nota, calcular a data, decidir que está em atraso, talvez até redigir o seguimento. Optámos, de propósito, por dividir isto.
O único trabalho do modelo é a compreensão de linguagem: ler as notas recentes de um cliente e reconhecer um compromisso orientado para o futuro, algo como “retomamos o assunto daqui a dois meses” ou “voltamos a contactar depois da reunião do conselho deles.” Estima o atraso implícito em termos simples. É só isso. Todo o cálculo real de datas — o prazo, se hoje já o ultrapassou — acontece depois, em código comum e determinístico. O modelo nunca faz contas nem toma a decisão final sobre o que está em atraso. Ele lê. O código decide.
Essa divisão importa mais do que parece. A compreensão de linguagem é exatamente o tipo de tarefa vaga, dependente de contexto, em que um modelo é bom. O cálculo de datas é exatamente o tipo de tarefa em que não se quer que um modelo improvise, nem um pouco.
O teste real
Não nos limitámos a verificar se o endpoint devolvia algo com aspeto razoável. Escrevemos uma nota real num registo de cliente real: “…ficou combinado voltarmos a contactá-los daqui a 2 meses para retomar o orçamento.” Chamámos o endpoint. Extraiu corretamente o compromisso, calculou um atraso implícito de 60 dias, e chegou a um prazo exatamente 60 dias depois da data e hora reais da nota, corretamente assinalado como ainda não em atraso.
Pequeno, e é exatamente esse o ponto. O sistema não precisou que lhe dissessem que havia um compromisso para encontrar. Leu uma frase que uma pessoa escreveu para si própria, não para um formulário, e tirou dali um prazo real.
A parte fácil de não notar
As notas no Craft11 só podem ser acrescentadas. Ninguém as edita, ninguém as apaga, nem sequer o Stark. É o mesmo princípio que mantém honesto o lado em bruto de cada registo: o que você realmente escreveu fica exatamente como escreveu. Quando depois precisámos de remover a nota de teste, não havia um botão de eliminar a que recorrer, porque não é suposto existir um. Foi preciso uma operação direta na base de dados, confirmada primeiro, desfeita logo a seguir.
Isso é um pequeno incómodo para nós durante os testes. É também a razão pela qual a funcionalidade de deteção de compromissos é, à partida, digna de confiança: lê texto humano real, inalterado, não limpo, e não uma versão higienizada dele.
Porque vale mesmo a pena fazer isto
Nada disto substitui um gestor de tarefas. Substitui aquele modo de falha específico e silencioso em que o único registo de uma promessa é uma frase que ninguém vai voltar a ler. O sistema não precisa que você escreva de forma diferente, estruture as suas notas, ou se lembre de assinalar seja o que for. Só precisa que escreva o que realmente aconteceu, da forma como escreveria para si próprio, e ele trata de reparar nisso.