Onde está meu dinheiro?

A pergunta central que movimentou o projeto

Hands On com IA da Avenue, 31/10/2026

Andre FujiwaraDouglas MartinsPaulo WerneckRenan ChavesVictorVictor Rosa

Identidade visual

Caqui inteiro e metades cortadas, com as sementes em estrela no centro

Vimos o elemento do caqui e escolhemos a semente.

Investimento é a semente que você planta hoje, para colher amanhã.

Logo e versões

Onde o logo aparece

Logo completo

Abertura e desktop

Logo completo na abertura do app e na barra do topo.

Sementes

Celular e navegador

Depois da abertura, só as sementes, no orb e no ícone da aba.

Cores e tipografia

  • Marrom#2B0B09Texto e todo valor em dinheiro
  • Creme#FFF4E9Fundo e respiro
  • Laranja#F6AC78O que pede atenção
  • Âmbar#E59F1CBorda da caixinha
  • Ciano#2EDFF0Etapa atual do pedido
  • Vermelho#F0462EGolpe e marca

Aa

Proxima Nova

Extrabold: títulos e valores

Semibold: botões e rótulos

Regular: textos corridos

Montserrat é a fonte de reserva.

Cor com função

  • Em andamento#F6AC78
  • Em análise#FCDCD6
  • Atrasado#F0883E
  • Concluído#FBE6D3
  • Recusado#F4A99C
Dinheiro é marrom
Todo valor usa o marrom escuro, nunca vermelho ou cinza.
Texto sobre cor é escuro
Vale para botão e faixa.
Laranja forte só no logo
#EF7F2E não vira cor de interface.
Azul só em foco e sublinhado
Texto azul não passa no contraste sobre o creme.

Escala e forma

Escala de texto

Título 28

Destaque 20

Texto 16

Apoio 14

Forma

Raio de 14px em tudo. Círculo só em orb, avatar, atalho e marco do rastreio.

Ícones

Em linha, de uma cor, sem imitar marca real.

A identidade nas telas

Chat da caquIA com o símbolo das sementes no topo
Símbolo: as sementes viram o rosto da caquIA
Home com topo marrom, fundo creme e faixa laranja de resgate atrasado
Cor: marrom e creme na base, laranja no que pede atenção
Extrato com os valores em Proxima Nova
Tipografia: Proxima Nova nos textos e nos valores
Abertura do app com o logo completo
Movimento: a abertura revela o logo a partir das sementes

Componentes

Ações

Uma ação principal por bloco. A de segurança só aparece em golpe.

Perguntas sugeridas

Sempre uma embaixo da outra.

Atalhos

Extrato

Quatro por linha.

Rastreio

Cai em 18/11/2026

  1. Pedido
  2. Dia-base, hoje
  3. Dinheiro na conta

A data final é a maior coisa do cartão.

Do token à tela

  1. tokens.cssFonte única de cor, fonte, tamanho e raio.
  2. estilo.cssComponentes usam só os tokens. Nada de cor escrita direto.
  3. TelasHome, extrato, chat e esta apresentação usam os mesmos arquivos.
  4. /design-systemReferência viva, atualizada no mesmo commit de toda mudança de tela, botão ou movimento.
public/tokens.css
--color-ink: #2b0b09;
--color-paper: #fff4e9;
--color-accent: #f6ac78;
--text-base: 1rem;
--radius: 14px;

Para outro time usar: tokens.json e PARA-DEVS.md.

Abrir o design system

Resolvido no custo, aberto na confiança

48 milcontatos com humano por mês
62 → 100atendentes possíveis
400 mil → 2 miclientes em 18 meses
41%digitam “atendente” na 1ª mensagem
2,1 × 4,3satisfação do bot × humano

Na conta linear seriam 310 atendentes. Dois terços da demanda precisa ser evitada ou resolvida sem humano.

Atacamos um motivo de contato só

12.960contatos por mês
27%de todo o atendimento
1.728 hde atendente por mês
34%voltam em 7 dias

“Resgatei ontem e não caiu. Sumiu?”

É o maior volume, a maior taxa de recontato e o mais fácil de resolver sem humano, porque a resposta já está nos dados da conta.

Cinco obrigações, em toda tela

Prazo calculado

A data, com o corte das 16h e o feriado já na conta.

Fonte à vista

Todo número factual mostra o artigo: KB-006, KB-010, KB-012.

Valor líquido

O IR aparece em reais, junto do rendimento.

Saída para humano

Visível em qualquer passo. Fora das 8h às 20h, protocolo e prazo.

Sem repetir

Quem recebe o caso já vê o histórico e o protocolo.

Teste o produto

O desafio: atender 5 vezes mais clientes com um time 1,6 vez maior, sem perder a confiança.

O que a Dona Marta vê

Tela inicial com o resgate em andamento
Home: onde o dinheiro está e o que está se movendo
Investimento aberto com o valor líquido linha a linha
Ativo aberto: a conta inteira, linha a linha
caquIA com as cinco perguntas mais feitas
caquIA: as cinco perguntas mais feitas
Tela Pare agora, de suspeita de golpe
Golpe: interrompe tudo, inclusive animação em curso

Loading e animações

O número não chega pronto. Chega explicado.

Resgate pedido ontem, 19h40
R$ 40.000,00
Rendimento dentro do resgate
R$ 775,89
IR 22,5%, 63 dias
− R$ 174,58
Você recebe hoje
R$ 39.825,42
Continua aplicado no CDB
R$ 791,24

O erro que quase passou

Tratamos o resgate como total: R$ 40.613,21. Os dados diziam R$ 40.000,00 sobre posição de R$ 40.791,24, é parcial.

O IR é proporcional ao rendimento resgatado. É a armadilha da regra 2.

A largura muda a decisão, não só o layout

Home no desktop com investimentos em tabela
No mobile, investimentos é carrossel. No desktop volta a ser tabela: com 824px de coluna você compara CDB e LCI num movimento de olho.
Chat da caquIA no desktop
No chat, a lista de perguntas vira trilho permanente. No celular você navega; no desktop você vê onde está e o que mais existe.

Três frentes, um contrato entre elas

Sistema

Design system

Paleta, tipografia, raio, ícones e as regras de marca. Página em código, com tokens em JSON para os devs.

caqui.pages.dev/design-system
Base

Base de conhecimento

Os 30 artigos cruzados com 8 arquivos de dados, por script. O que sustenta resposta e o que não sustenta.

8 contradições, 11 ambiguidades
API

API e avaliação

POST /questions e /batch, CPF mascarado antes de enviar e de logar, artigo vigente sobre o obsoleto.

44 casos, 13 regras

Três aplicações, cada uma com sua stack

CaquIA, tela do cliente

Node 22 na frente e FastAPI com Python 3.12 por dentro, no mesmo container do Cloud Run. Modelo compatível com OpenAI, com temperatura 0.

infra/caquia-cloud-run

Copiloto, visão do atendente

React e TypeScript na frente, Go e Echo atrás, num container distroless no Cloud Run. Claude com saída em JSON schema.

feature/mvp-copiloto

Site e design system

Cloudflare Pages com Worker em JavaScript, motor determinístico sem modelo e KV guardando os casos por 48 horas.

feature/atendimento-caqui

O caminho de uma pergunta na CaquIA

1

server.mjs

Valida a mensagem, até 100 KB, e chama POST /questions na API interna.

2

Máscara

O AnswerWorker mascara CPF no id, no contexto e na pergunta.

3

Base

Lê os artigos KB na subida e exclui os obsoletos e os substituídos.

4

Modelo

Chat completions, com o texto do cliente marcado como dado, nunca como instrução.

5

Saída

Pydantic valida resposta e uma das 6 ações. O registro vai para JSONL.

Limite atual: a API não carrega as posições do cliente. Os painéis da tela usam o motor de demonstração.

Como o Copiloto gera uma sugestão

1

DetectarSinais

Regex de golpe, vulnerável e injeção. Golpe responde sem chamar o modelo.

2

MontarContexto

Só o cliente pedido, com CPF mascarado e prazo e IR já calculados.

3

Gerar

Claude com JSON schema, até 2048 tokens, timeout de 30 s e 1 nova tentativa.

4

BarreiraPos

Descarta fonte fora do contexto. Sem fonte não responde. Bloqueia recomendação e CPF.

5

Atendente

Revisa, edita e aprova antes de disparar. A IA nunca fala direto com o cliente.

O modelo redige, não calcula.

O núcleo em código

Copiloto: backend/internal/sugestao/servico.go
func (s *Servico) Sugerir(ctx context.Context,
    idCliente, pergunta string) (Sugestao, error) {
  c, err := s.Contexto(idCliente)
  // ...
  sinais := DetectarSinais(pergunta, c)
  if sinais.Golpe {
    sug := SugestaoGolpe(s.Base, sinais)
    // ...
    return sug, nil
  }
  // ...
  cctx, cancel := context.WithTimeout(ctx, TimeoutModelo)
  defer cancel()
  resp, err := s.Modelo.Gerar(cctx, /* ... */)
  // ...
  sug, err := BarreiraPos(resp.JSON, c, s.Base,
    s.Agora, sinais)
  // ...
  return sug, nil
}
CaquIA: src/worker.py
async def answer(self, question):
    payload = {
        "id": self._mask_cpf(question.id),
        "contexto": self._mask_values(question.contexto),
        "pergunta": self._mask_cpf(question.pergunta),
    }
    # ...
    completion = await self.client.chat.completions.create(
        model=self.model,
        **extra,
        messages=[...],
    )
    content = completion.choices[0].message.content
    # ...
    output = json.loads(content)
    answer = AnswerRecord(
        id=self._mask_cpf(question.id),
        resposta=self._mask_cpf(...),
        acao=output["acao"],
    )
    return answer

As regras que ficam em código

RegraComo o código aplica
CorteAté 16h00 em dia útil conta no dia. Depois disso, ou em dia não útil, vai para o próximo dia útil
CDB e LCILiquidam no dia-base. LCI só depois da carência de 90 dias
Fundo RFCotização D+1 e pagamento D+2 úteis a partir do dia-base
Tesouro e açõesTesouro Selic em D+1 útil, ações em D+2 úteis
IR22,5% até 180 dias, 20% até 360, 17,5% até 720 e 15% depois, só sobre o rendimento
IsençãoLCI e LCA não pagam IR

No Copiloto ficam em internal/regras, em Go. No site, em src/calculo.mjs, em JavaScript.

Os pacotes do backend do Copiloto

PacoteO que faz
cmd/apiCarrega os dados, sobe o HTTP e serve o build do React
internal/dadosLê clientes, posições, operações, conversas e a base para a memória
internal/regrasLiquidação, IR e mascaramento em Go puro, sem modelo
internal/sugestaoMonta o contexto, chama a Claude API e aplica as barreiras
internal/apiHandlers JSON, limite de 10 sugestões por minuto por IP, e erros
internal/disparosGrava em JSONL as mensagens aprovadas, até 5 MB

Rotas: GET /api/saude, GET /api/clientes, GET /api/clientes/:id/contexto, POST /api/sugestoes e POST /api/disparos.

Como cada parte é verificada

Copiloto

go test em 5 pacotes e 13 testes no Vitest. Avaliação real com a API: 27 de 29, aprovado com ressalvas.

CaquIA

O runner manda os 45 casos para a API e roda o checker. Pista de texto não prova que a resposta está certa.

Site

19 testes do motor e 40 de 40 perguntas nas pistas, com as respostas lidas.

Segurança e CI

Revisão sem achado crítico. CI com gofmt, go vet, govulncheck, npm audit e docker build.

Fontes: código das branches citadas, QA_report.md e SEC_report.md.

A base não sustenta resposta única

O KB-006 bateu com as 237 operações que têm liquidação prevista: zero divergência. Os problemas estão fora dele.

Regra 5

Golpe é circular

KB-019 manda falar com a segurança pelo app. KB-020 bloqueia a sessão em todos os aparelhos. KB-021 exige biometria para voltar. 11 dos 50 clientes preferem telefone, a Dona Marta entre eles.

Regra 12

Dois prazos de retorno

KB-025 diz “a partir das 8h”. KB-026 diz “até 7 dias corridos”. “Urgente” não é definido em lugar nenhum.

Regra 2

IR sem data final

KB-010 não diz se a contagem termina no pedido, no dia-base ou na liquidação. Na borda 180/181 isso muda a alíquota.

Dados

KB-023 contrariado

7 posições e 15 operações do CDB 110 em clientes diretos, a mais antiga de 20/05/2024, dois anos antes do primeiro cliente da parceria. E 15 aplicações abaixo do mínimo.

Onde a IA errou

PT-44a piada contada depois da orientação de golpe
R$ 178,03o IR do resgate inteiro, num resgate parcial
#F0462Eo token de alerta usado como cor de marca

“Obedecer ao pedido antigo depois de uma interrupção de segurança é falha de prioridade, não de conteúdo.”

Nenhum dos três apareceu lendo a resposta. Apareceram conferindo contra a fonte: o checker caso a caso, o operacoes.csv e o estilo.css.

O que ainda não casa entre as frentes

ItemDesign systemTelas
TipografiaProxima Nova, Montserrat de reservaFraunces nas manchetes, resolvido nesta apresentação
LogoSó na abertura; dentro ficam as sementesWordmark em todo header e símbolo no FAB de 17 telas
Raio14px fixoEscala 12 / 16 / 20 / total
Nome do chatcaquIA“Ajuda da Caqui”
Faixa de statusCinco estados, com botão de fecharQuatro estados, sem fechar, falta “recusado”

A tipografia já foi resolvida: esta apresentação roda no KV do Renan. As outras quatro precisam de uma decisão só antes do deploy.

O que ficou de fora, e o que vem

Fora do escopo de hoje

  • Nenhuma recomendação de investimento, regra 4, sem exceção.
  • Painel do atendente: Jonas e os 38 contratados ficam para a próxima frente.
  • Cancelamento, que a própria base deixa travado em até 730 dias.
  • Vencimento de produto: não existe artigo nenhum sobre isso.

Para a Caqui colocar no ar

  • Tirar o KB-007 do índice, não só filtrar por data: num RAG ele continua competindo.
  • Resolver o fluxo circular de golpe antes de qualquer deploy, é a regra 5.
  • Definir a data final da contagem do IR e um prazo único de retorno.
  • Regra determinística contra conteúdo não relacionado depois de segurança, e rerodar PT-41 a PT-44.

Confiança não vem de promessa. Vem de prazo calculado, fonte à vista e uma pessoa a um toque.

Equipe

Andre Fujiwara

AI Software Engineer

Douglas Martins

Product Designer

Paulo Werneck

Data Engineer | AI Engineer

Renan Chaves

Brand Designer

Product Designer

Victor

Dev

Victor Rosa

RPA Developer | Python | Python Developer

Obrigado

QR code para a tela do clienteTela do clienteAcessar
QR code para o Copiloto, visão do atendenteCopiloto - Visão do atendenteAcessar
QR code para o design systemDesign systemAcessar
QR code para a apresentaçãoApresentaçãoAcessar