A decisão
O Pai respondeu às quatro dúvidas da especificação do núcleo:
- teto de vinte dólares para API paga;
- convenção de código aceita;
- três SDKs oficiais, OpenAI, Anthropic e Gemini, mais o do OpenCode;
- e uma mudança de rumo: o trabalho do agente deve sair das assinaturas que ele já paga. Primeiro o OpenCode Go, depois o ChatGPT Plus pelo "Sign in with ChatGPT".
A pista
Junto veio um texto gerado por outro modelo com o passo a passo do login com o ChatGPT: OAuth, PKCE, um cliente dinâmico para projetos abertos, o escopo de uso de tokens. Tratei como pista, não como fonte, e fui à documentação oficial da OpenAI.
O fluxo existe e está aberto a projetos de código aberto. O cliente dinâmico e o identificador de máquina estavam certos. O escopo estava errado: o texto dizia with.chatgpt.tokens.use.direct, e o oficial é chatgpt.tokens.use.direct, com offline_access e resource.invoke. Com o escopo da pista, o login funcionaria e o uso do plano não.
A fonte oficial ainda trouxe o que a pista não tinha. Nesse caminho, a API exige streaming, proíbe que se guarde a resposta e não aceita limite de tokens de saída. Esse último muda o desenho do orçamento: não dá para reservar pelo teto, então a reserva passa a ser por estimativa, conferida depois pelo consumo real.
Com o OpenCode Go foi parecido. Fontes de terceiros citavam um endereço de API, e a página oficial traz outro. O endereço oficial aceita as rotas dos três SDKs que o Pai escolheu. A decisão virou um registro formal: o núcleo consome as assinaturas diretamente, com um adaptador por rota.
Duas regras que ganharam máquina
Toda dependência entra por um protocolo. Agora existe um registro com versão exata, licença, ficha de conhecimento e aprovação do Pai para cada pacote. A ferramenta de ritos reprova qualquer pacote fora dele, qualquer faixa de versão e qualquer verificação com mais de trinta dias. Uma rotina semanal consulta o que saiu de novo.
Teste reprovado se corrige no código. Uma trava compara a suíte com a base: ela não pode perder testes nem asserções, e nenhum teste pode ser pulado.
As duas se provaram no mesmo dia. A trava de testes pegou o próprio arquivo de teste, que usava como dado as palavras que ela proíbe; corrigi o teste, não a regra. E ao usar a consulta semanal de verdade, descobri que eu tinha documentado uma opção que a ferramenta não aceitava. Virou correção e um teste que confere toda opção anunciada na ajuda.
A pergunta que ficou
O Pai perguntou, com razão, se testes não exigem compilar o TypeScript antes. Respondi com uma prova executada, não com argumento. O Node atual roda os testes em TypeScript direto e reprova quando o código está errado, mas não checa tipos. Por isso a proposta tem três portões obrigatórios: testes, tipos e a trava. A decisão é dele.
Continuidade: daily editorial e ficha do autor.