Este repositório faz parte do processo seletivo para desenvolvimento backend.
Você vai trabalhar em um pequeno serviço Python que aplica créditos em contas a partir de eventos enviados por um provedor de pagamentos.
O uso de IA é permitido e incentivado (ChatGPT, Copilot, Cursor, Claude, etc.). Você é responsável por todo o código entregue e deve conseguir explicar, testar e modificar sua solução durante a entrevista técnica.
Tempo estimado: 2 a 3 horas.
O provedor externo envia eventos como:
event_id = "evt-abc123" # identificador estável do evento
account_id = "acc-42" # conta que recebe o crédito
amount_cents = 1000 # R$ 10 em centavos
O provedor utiliza um modelo de entrega at-least-once. Portanto, um mesmo evento pode ser entregue novamente.
O serviço também pode reiniciar e executar em mais de uma instância compartilhando o mesmo armazenamento.
Independentemente de como ou quando um evento seja entregue, um mesmo event_id não pode produzir o mesmo crédito mais de uma vez.
O saldo é armazenado em um arquivo SQLite (ledger.db). O módulo sqlite3 já vem com o Python — não é necessário instalar ou subir nenhum servidor de banco de dados.
python cli.py evt-abc123 acc-42 1000Exemplo de saída:
Evento evt-abc123: aplicado
Saldo de acc-42: 1000 centavos
O código atual não cumpre completamente este contrato.
Um event_id válido deve produzir seu efeito no máximo uma vez, mesmo que seja recebido novamente ou que o serviço tenha reiniciado.
Uma nova tentativa de aplicar um evento já processado deve retornar:
result.applied is Falsesem aplicar novamente o crédito.
Considere que mais de uma execução do serviço pode compartilhar o mesmo arquivo de banco de dados. A garantia de idempotência precisa continuar válida nesse ambiente.
Um evento é inválido quando:
event_idestá vazio;account_idestá vazio;amount_centsé menor ou igual a zero.
Nesses casos:
InvalidCreditErrordeve ser levantada;- o saldo não deve ser alterado;
- o evento não deve ser registrado como processado;
- o mesmo
event_idpode ser utilizado posteriormente em uma chamada válida.
Eventos válidos com event_id diferentes devem produzir seus respectivos créditos normalmente.
Você pode alterar a implementação interna e o schema do banco, mas a interface abaixo deve continuar funcionando:
ledger = CreditLedger(database_path)
result = ledger.apply_credit(event_id, account_id, amount_cents)
result.applied # bool
result.balance_cents # int
ledger.balance(account_id) # int
InvalidCreditError # exceção de validaçãoresult.balance_cents representa o saldo persistido da conta observado ao término da chamada, considerando as operações já confirmadas naquele momento.
Se alterar o schema do banco, apague seu ledger.db local antes de executar o CLI novamente.
Além dos testes presentes neste repositório, sua solução será executada contra testes adicionais.
Eles verificarão o contrato descrito acima e o comportamento da solução em cenários compatíveis com um serviço backend executado em produção.
Evite implementar apenas o necessário para fazer o teste atualmente vermelho passar.
Não faça fork.
git clone https://github.com/pipe-challenge/young-guns-2026.git
cd young-guns-2026Na sua conta do GitHub, crie um repositório privado e vazio, por exemplo:
young-guns-2026-submission
Não adicione README, .gitignore ou licença ao criá-lo.
Depois, altere o remote do projeto:
git remote remove origin
git remote add origin https://github.com/<seu-usuario>/young-guns-2026-submission.git
git push -u origin maingit checkout -b fix/<seu-primeiro-nome>Implemente sua solução e faça commits que ajudem a entender as mudanças realizadas.
Faça os testes existentes passarem sem remover ou alterar suas asserções.
Adicione pelo menos 2 testes novos que aumentem de forma relevante a confiança na sua solução.
Pelo menos um deles deve demonstrar um comportamento incorreto existente no código original e passar após sua correção.
A escolha dos cenários adicionais faz parte da avaliação.
Faça push da sua branch:
git push -u origin fix/<seu-primeiro-nome>Abra um Pull Request de sua branch para main dentro do seu repositório privado.
Não faça merge do PR.
No seu repositório privado, acesse:
Settings → Collaborators → Add people
Adicione como colaborador o usuário GitHub do avaliador informado no e-mail da Pipefy.
Aguarde o convite ser aceito antes de finalizar sua entrega.
O repositório deve permanecer privado durante e após o processo seletivo.
Use Loom, YouTube não listado ou Google Drive com acesso liberado.
Não envie o arquivo de vídeo para o repositório.
O vídeo deve estar acessível para qualquer pessoa que possua o link, sem necessidade de solicitar permissão ou fazer login.
No vídeo, explique:
- qual abordagem você escolheu e por quê;
- quais problemas relevantes encontrou no código original;
- quais foram as principais alterações realizadas;
- quais testes adicionou e por que escolheu esses cenários;
- como utilizou IA durante o desafio;
- pelo menos uma sugestão da IA que você validou, modificou ou rejeitou, e como chegou a essa decisão;
- alguma limitação que ainda exista ou algo que faria diferente com mais tempo.
Adicione o link do vídeo na descrição do Pull Request.
Na task da Pipefy, envie:
- link do repositório privado;
- link do Pull Request;
- link do vídeo;
Python 3.11+. Sem dependências externas além do pytest.
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pytestNo estado inicial do repositório, pytest não passa completamente. Isso é proposital.
- O uso de IA é permitido e incentivado.
- Você é responsável por todo o código submetido.
- Não altere as asserções dos testes existentes.
- Não adicione dependências novas sem justificar no PR.
- Mantenha a solução simples e proporcional ao problema.
- Não é necessário reorganizar todo o projeto.
- O histórico de Git deve permitir entender as mudanças, mas quantidade de commits não é critério de qualidade.
- O Pull Request precisa conter o link do vídeo.
- O repositório da entrega deve permanecer privado.
Principalmente:
- correção da solução;
- qualidade e relevância dos testes;
- qualidade e simplicidade do código;
- comportamento esperado para um serviço backend em produção;
- capacidade de identificar riscos e trade-offs;
- uso crítico de IA e domínio do código entregue;
- clareza da explicação técnica;
- uso básico de Git e GitHub.
O objetivo não é encontrar uma implementação específica, e sim avaliar as decisões de engenharia que levaram à sua solução.