Não como metáfora. Um projeto Kortix é um repositório git, e esse repositório é a empresa: seus agentes, as skills que desenvolveu, tudo o que aprendeu e a definição das máquinas em que tudo é executado. Versionado. Comparável por diff. De propriedade integral.
skill: reconcile-invoices — lidar com reembolsos parciais
skills/reconcile-invoices/SKILL.md
9f4c2b7e → main · aberta por invoice-clerk
kortix.yaml é a camada Kortix: a máquina em que as sessões são inicializadas, os conectores, os triggers, os nomes dos secrets e o que cada agente pode acessar. A configuração do OpenCode é o runtime em que os agentes pensam. Todo o restante são arquivos no repositório.
# Versão 2 do schema. O runtime é o OpenCode.kortix_version: 2runtime: opencode project: name: Northwind # O agente que responde quando nenhum é especificado.default_agent: kortix # Onde fica a configuração do runtime. Depois disso: arquivos.opencode: config_dir: harnesses/opencode # Apenas nomes de secrets. Os valores são criptografados na# plataforma e injetados quando a máquina é inicializada.env: required: [STRIPE_API_KEY] optional: [LINEAR_API_KEY] # A máquina em que uma sessão é inicializada.sandbox: default: python templates:- slug: python image: python:3.12-slim cpu: 2 memory: 4 # Acesso ao mundo exterior. A definição está no# git. As credenciais nunca estão.connectors:- slug: gmail-leitura provider: pipedream app: gmail authorization_strategy: user # Governança: o que cada agente pode acessar — nunca o que# ele diz. Uma permissão omitida resulta em none.agents: kortix: connectors: all secrets: all skills: all kortix_permissions: all invoice-clerk: sandbox: python connectors: [gmail-read] secrets: [STRIPE_API_KEY] skills: [reconcile-invoices] kortix_permissions: [project.cr.open]A camada Kortix — um arquivo na raiz do repositório.
{ // Docs: https://opencode.ai/docs/ "$schema": "https://opencode.ai/config.json", "theme": "system", "default_agent": "kortix", // A sessão já é uma máquina isolada em um // branch descartado, para o agente começar totalmente aberto. // Restrinja por ferramenta aqui quando quiser uma // política mais rigorosa. "permission": "allow"}O runtime — modelos, ferramentas, permissões.
---description: Concilia faturas com pagamentos.mode: primarypermission: bash: ask--- Você é o responsável por faturas da Northwind. Associe cada pagamento a uma fatura pelo número, nuncapelo valor. Quando não for possível, abra uma solicitação de alteraçãoe diga exatamente o que não foi possível conciliar.O agente — um arquivo de agente padrão do OpenCode. O que ele diz está aqui.
Qual máquina, quais conectores, quais secrets, quais skills, quais comandos da CLI. Apenas governança. Se um grant for omitido, ele será resolvido como nenhum — o agente recebe exatamente o que você concedeu, e nada mais.
Prompts, modelos, ferramentas, plugins e permissões. Um agente é um agente padrão do OpenCode — markdown como base e, além disso, as ferramentas, os plugins e a configuração do modelo ao lado, no mesmo repo. Leia o diretório e você saberá exatamente o que esse agente fará.
O manifesto nomeia os secrets e os concede por agente. Os valores são criptografados na plataforma, injetados na máquina em tempo de execução e nunca gravados no repo ou nos logs.
Agentes, skills e memória não são linhas em um banco de dados que você não pode ver. São arquivos markdown ao lado do seu código, clonados em cada sessão, legíveis por uma pessoa e editáveis por um agente.
Não há uma camada oculta sobre a qual perguntar. Cada crença, cada permissão e cada instrução é uma linha em um arquivo, e as ferramentas que você já usa respondem à pergunta.
# o que a empresa acredita sobre preços?$ grep -ri "annual" memoryMEMORY.md: nunca cotar anual antes da revisão de segurança # quem pode acessar a chave do Stripe?$ grep -n "STRIPE_API_KEY" kortix.yaml18: obrigatório: [STRIPE_API_KEY]48: segredos: [STRIPE_API_KEY] # quem alterou o invoice clerk e quando?$ git log --oneline agents/8f2a1c4 invoice-clerk: pare de adivinhar sobre reembolsos1d90b73 invoice-clerk: primeiro rascunho da personaCada prompt de agente, cada skill, cada fato lembrado e cada grant é texto em um único repo. Não há console para percorrer nem exportação para solicitar.
Cada alteração em um agente, skill ou arquivo de memória é um commit com autor, data e diff. Nada desaparece e nada acontece às escondidas.
Uma instrução ruim entrou na terça-feira? Leia o diff, reverta o commit e abra uma solicitação de alteração. A empresa volta a ser como era.
Quando um agente descobre uma maneira melhor de fazer o trabalho, ele não a guarda silenciosamente. Edita a skill, faz commit no próprio branch e abre uma solicitação de alteração. Uma pessoa lê o diff e decide.
## Associando um pagamento a uma fatura 1. Busque a fatura pelo número, nunca pelo valor.2. Se os valores forem diferentes, sinalize para uma pessoa.2. Se a diferença corresponder a um reembolso já registrado, encerre como reembolso parcial e anote o id do reembolso na fatura.3. Se forem diferentes por qualquer outro motivo, sinalize para uma pessoa e diga o que você verificou. Nunca emita um reembolso por conta própria.Um agente que reescreve as próprias instruções chega da mesma forma que uma migração de banco de dados: um branch, um commit, um diff e um revisor. A empresa tem um único processo de revisão, não dois.
A máquina pode propor. Uma pessoa decide. O trabalho chega ao main apenas por meio de uma solicitação de alteração aprovada por alguém, para que a empresa não saia do rumo enquanto você não está olhando.
Um agente pode ler a própria configuração, editá-la e propor a alteração. Coloque isso em uma agenda e o repo ficará melhor em representar sua empresa enquanto todos dormem.
agents: memory-reflector: # ele pode abrir uma solicitação de alteração. Nada mais. kortix_permissions: [project.cr.open] triggers:- slug: refletor-de-memórianome: Refletor de Memória type: cron agent: memory-reflector enabled: falsecron: "0 0 3 * * *" timezone: UTC prompt: | Reflita sobre as últimas 24 horas de atividade do projeto. Revise o histórico do git, as solicitações de alteração integradas e os resumos das sessões. Atualize memory/ e abra uma solicitação de alteração intitulada `memory: ...`. Encerre sem abrir uma quando não houver conhecimento duradouro.Do template inicial. Todo projeto novo vem com ele desativado.
Altere enabled para true e ele será executado às 03:00 UTC, sem ninguém observando. Gatilhos são agendas cron e webhooks assinados, declarados no mesmo arquivo que todo o resto.
Ele recebe seu próprio computador na nuvem e seu próprio branch, contendo exatamente o único grant concedido pelo manifesto: permissão para abrir uma solicitação de alteração.
Ele lê o histórico do git e as sessões do último dia, depois grava o que aprendeu em memory/ como markdown puro.
Uma solicitação de alteração aguardando pela manhã. Integre-a e a empresa aprende algo novo. Feche-a e nada aconteceu.
Sem fluxo de exportação, ticket de suporte ou formato proprietário para decifrar. A empresa já é texto em um branch: ela clona, bifurca, reverte e sai pela porta com você.
# transforme qualquer diretório em um Kortix$ kortix init # verifique se compila, peça os secrets ausentes,# envie e coloque tudo no ar$ kortix ship # daqui em diante, é apenas um repo$ git clone git@github.com:northwind/northwind.git$ git revert 8f2a1c4$ kortix crComece com uma tarefa e cresça a partir daí.