Projetoscaso 01 / 05 · engenharia · conteúdo

Nerso

Um assistente só serve se eu confiar nele. Então a confiança virou arquitetura: ele lembra com nível de certeza, avisa sem encher e pede permissão antes de escrever.

papel
autor único
período
abr–out 2026
partes
bot no Telegram · app de voz no Mac
status
em uso diário
código
privado
  • Node.js
  • Claude Agent SDK
  • MCP
  • Electron

01O problema

Minha vida roda em três frentes e numa dúzia de apps: tarefa no TickTick, documento no Notion, agenda, notas no Obsidian. O custo não era fazer as coisas. Era trocar de app e lembrar onde cada coisa estava.

Eu queria um lugar só para falar, de onde cada coisa fosse parar no lugar certo. Mas um assistente que esquece, inventa ou manda mensagem demais não ajuda: vira mais uma coisa para administrar.

O requisito de verdade era confiança.

02 · Arquitetura

Arquitetura.

O caminho de uma mensagem. Em vermelho, o ponto que nenhuma escrita externa atravessa sem regra.

Arquitetura do NersoMensagem do Telegram passa por webhook, checagem de dono e fila FIFO; a entrada é preparada, o vault é atualizado, o Claude Agent SDK roda com o vault como diretório de trabalho; escritas externas passam por hooks antes das ferramentas MCP; o que mudou no vault é commitado e a resposta volta pelo Telegram. Rotinas agendadas entram na mesma fila.rotinas · node-cron7 agendadas, no vaultTelegramtexto, foto, áudiowebhooksó o dono passafila FIFOum turno por vezentradafoto · voz → Whispergit pull do vaultnunca force pushClaude Agent SDKcwd = vault · 14 CLAUDE.mdhooks PreToolUsepropõe → confirmaMCPTickTick · Notioncommit + pushsó os caminhos alteradosrespostaHTML no Telegramvault Obsidian · ~500 notas · 14 domíniosmemória estruturada · lido também pelo Nerso Voz, no Mac

03 · Decisões

O que eu decidi.

  1. Uma fila, um turno por vez.

    Dois agentes escrevendo no mesmo vault geram conflito de git. A fila FIFO resolve antes do problema existir. Pelo mesmo motivo, o bot e o Mac gravam observações em arquivos separados.

  2. Hook, não instrução.

    Escrita destrutiva e escrita em sistema externo passam por hooks PreToolUse. Para o mundo de fora o padrão é propor e executar só depois da confirmação. O modelo pode esquecer uma linha do prompt; o hook não esquece.

  3. Captura sem modelo, destilação à noite.

    Durante o dia, observações são gravadas de forma determinística. Às 23h10 um modelo destila tudo em JSON validado por schema: ou grava tudo, ou não grava nada. Duas falhas seguidas disparam alarme.

  4. Silêncio é resposta válida.

    As rotinas de vigia respondem NADA quando não há o que dizer, e um coordenador limita quantas mensagens proativas chegam por dia. Assistente bom é o que não precisa ser silenciado.

  5. Custo como métrica.

    Duas economias separadas. Primeiro, registro mecânico vai para o modelo rápido: o turno cai de US$ 0,47 para US$ 0,047. Segundo, retomar a sessão em vez de começar do zero corta o turno de US$ 0,51 para US$ 0,04. Cada turno tem teto de gasto e vai para um log de custo.

  6. Conflito resolvido com rede de segurança.

    Quando o vault diverge, o modelo faz o merge. Antes, os dois lados vão para backup; depois, uma checagem confirma que o resultado cresceu em vez de perder conteúdo.

04 · Memória

Memória com nível de confiança.

Cada fato é um arquivo Markdown com tipo (estado, decisão, preferência, precedente, princípio), domínio, confiança e data de revisão. Um índice gerado decide o pedaço da memória que entra em cada conversa nova.

Escada de confiança da memóriaObservação capturada sem modelo; na terceira ocorrência em dias diferentes vira fato com confiança 0,6; na quinta, com confiança alta, vira candidato a princípio, que só entra com aprovação do dono.observaçãocapturada sem LLMpadrãorepetido em dias diferentesfato · 0,63ª ocorrênciaprincípio5ª ocorrência + meu OKabaixo de 0,6: nunca justificauma cobrançanada vira regrasem aprovaçãoconfiança →
A memória sobe devagar e desce sozinha: toda semana um job aplica decaimento.

05 · Rotinas

Sete rotinas.

As rotinas ficam declaradas numa nota do próprio vault. Mudo um horário pelo celular e o servidor obedece.

  1. 06:00

    briefing do dia

    agenda, tarefas e prazos numa mensagem só

  2. 7h–21h

    vigia de prazos

    a cada 30 minutos; responde NADA quando não há nada

  3. 19:00

    follow-up

    o que ficou aberto hoje

  4. contínuo

    sinais vitais

    lê só as datas dos arquivos. Sem modelo, sem token

  5. 23:00

    índice do dia

    o que entrou no vault

  6. 23:10

    destilação da memória

    JSON validado por schema; grava tudo ou nada

  7. dom 23:30

    consolidação

    decaimento, fusão de duplicados, teto de 300 fatos

06 · Nerso Voz

O mesmo Nerso, por voz, no Mac, e dá para ver ele trabalhando.

Wake word local (“Ei, Nerso”), detecção de fala, transcrição, resposta do Claude em streaming cortada por frase e voz sintetizada frase a frase. Dá para interromper no meio. São quatro níveis de operação (conversa, assistente, operador e dev), cada um com modelo, permissões e pasta próprios, e o nível volta sozinho quando a tarefa termina.

Um barramento de eventos tipado é a única fonte da interface, e cada dia fica gravado em JSONL reproduzível. O app foi construído por um loop de agentes: um orquestrador e até três subagentes em worktrees git temporárias. Nada entra sem passar, nesta ordem, por lint, typecheck, teste, build, smoke, teste de mutação, regressão de voz e auditoria de privacidade.

07 · Resultado

O que mudou.

  • 2,0 s

    do fim da minha fala ao primeiro áudio, na mediana (4,0 s no p95)

  • US$ 0,047

    por turno de registro mecânico no modelo rápido, contra US$ 0,47 no modelo padrão

  • 7

    rotinas automáticas, declaradas numa nota editável pelo celular

  • 301

    commits do app de voz em 5 dias, todos passando pelos 8 gates

Sobre este caso

  • O conteúdo do vault não aparece aqui. É a minha vida pessoal; o que interessa é a arquitetura.
  • Custos medidos no log de custo do próprio Nerso, em outubro de 2026.

stack completa · código privado

  • Node.js
  • Express
  • Claude Agent SDK
  • MCP
  • node-cron
  • Whisper
  • ElevenLabs
  • Electron
  • xterm.js