Quiz
Clique em "Resposta" para revelar a resposta correta e a explicação.
Q1. Por que o diffutil.py imprime cada linha do lado novo com o seu número (L21 + ...) antes de enviar o diff ao modelo?
- A. Para reduzir o número de tokens no prompt
- B. Porque modelos não são confiáveis para calcular números de linha a partir dos cabeçalhos de hunk
@@, e o GitHub rejeita comentários de review em linhas que não estão no diff - C. Porque a API do Claude exige números de linha em blocos de código
- D. Para esconder do modelo as linhas removidas
Resposta
B.
Contar linhas a partir de @@ -16,4 +16,9 @@ é exatamente o tipo de contabilidade que um modelo de linguagem erra. Imprimir o número em cada linha transforma a tarefa em copiar um número, e o código então só aceita achados que apontam para uma linha que o PR adicionou — o que também evita um 422 da API do GitHub por um comentário fora do diff.
Q2. O revisor posta o seu review com event: COMMENT. Qual é o principal motivo de ele nunca enviar APPROVE?
- A. O
GITHUB_TOKENnão consegue aprovar pull requests em nenhuma configuração - B. Aprovar é uma decisão; o bot é consultivo, e um prompt injection que convença o modelo não pode virar uma aprovação
- C. Reviews
APPROVEnão podem ter comentários inline - D. Aprovações custam mais chamadas de API
Resposta
B.
É o código que decide qual evento de review é enviado, não o modelo. Mesmo que uma descrição de PR com injection convença o modelo de que "este PR já foi aprovado", não existe caminho do JSON dele até uma aprovação. Humanos aprovam, como exige a proteção de branch.
Q3. Uma execução do revisor produziu 9 achados. Qual deles é descartado pelo review.py com as configurações padrão?
- A.
blocker, confiançahigh, numa linha adicionada - B.
minor, confiançamedium, numa linha adicionada - C.
major, confiançahigh, numa linha de contexto não alterada do hunk - D.
major, confiançamedium, numa linha adicionada
Resposta
C.
Só achados em linhas adicionadas são mantidos: comentar código que o autor não tocou é ruído (e muitas vezes não é o assunto do PR). Os padrões também descartam a severidade nit, a confiança low, achados já postados (mesmo fingerprint) e tudo o que passar de AI_REVIEW_MAX_COMMENTS.
Q4. Por que o prompt de sistema (instruções + CONVENTIONS.md + ADRs) é mantido idêntico entre execuções e o diff é enviado na mensagem do usuário?
- A. A API rejeita prompts de sistema maiores do que a mensagem do usuário
- B. Para que o prefixo estável possa ser servido do prompt cache, cobrado a uma fração do preço de entrada, enquanto só os dados de cada execução são pagos integralmente
- C. Para que o modelo esqueça as convenções depois de cada execução
- D. Porque o diff nunca deve ser mostrado ao modelo como instrução de sistema, apenas por motivos de formatação
Resposta
B.
O prompt caching funciona por correspondência de prefixo: qualquer byte que muda invalida o que vem depois. Conteúdo estável primeiro (instruções, convenções), conteúdo volátil por último (o diff). Na execução do golden set da parte 6, a maior parte do prompt de sistema veio do cache depois da primeira chamada. Colocar texto não confiável no turno do usuário também o mantém fora das instruções do operador.
Q5. O gerador de testes produziu um teste que compila e passa duas vezes, com 100% de cobertura de linhas da classe. O PIT reporta o score de mutação inalterado (40% → 40%). O que o script faz, e por quê?
- A. Aceita o teste, porque 100% de cobertura prova que ele é útil
- B. Rejeita o teste (e devolve os mutantes sobreviventes ao modelo), porque ele não pega nenhum bug que os testes existentes deixam passar
- C. Aceita o teste, mas o marca com
@Disabled - D. Rejeita o teste porque a cobertura está alta demais
Resposta
B.
A cobertura diz quais linhas rodaram; o score de mutação diz se os testes perceberam quando o código foi alterado. Um teste sem asserções significativas chega à cobertura total e não mata nenhum mutante. O script exige um ganho de MIN_GAIN (5 pontos percentuais) e envia a lista de sobreviventes de volta para que a próxima tentativa mire no comportamento não testado.
Q6. Um teste gerado para o HoldService passa e mata muitos mutantes. Ele verifica que uma reserva expira 8 minutos depois de criada. O requisito diz 10 minutos. O que isso ilustra?
- A. Testes instáveis
- B. O problema do oráculo: testes gerados codificam o que o código faz, inclusive os seus bugs; testes de mutação provam sensibilidade, não correção
- C. Um falso positivo dos testes de mutação
- D. Que o PIT está configurado com o
targetClasseserrado
Resposta
B.
O modelo deriva o valor esperado da implementação. Se a implementação está errada, o teste agora protege o bug. A revisão humana de cada asserção contra o requisito continua necessária — é por isso que o gerador abre um PR em rascunho.
Q7. No ai-fix.yaml, o agente roda no job fix (contents: read, actions: read) e o PR é aberto pelo job open-pr (contents: write, pull-requests: write). Por que separá-los?
- A. O GitHub limita cada job a uma permissão
- B. Para rodá-los em sistemas operacionais diferentes
- C. Para que o job que executa código não confiável (o build do PR e as edições do modelo) nunca tenha um token de escrita; o job com acesso de escrita só aplica um patch verificado
- D. Para deixar o workflow mais rápido com paralelismo
Resposta
C.
Privilégio mínimo por job. Se o agente ficar confuso ou sofrer injection, ou se um teste exfiltrar o ambiente, não há token capaz de fazer push ou aprovar naquele job. O open-pr não roda modelo nem build — só git apply, commit e gh pr create.
Q8. Qual flag do Claude Code faz uma execução headless no CI negar qualquer chamada de ferramenta não permitida explicitamente, em vez de esperar que um humano responda a uma pergunta?
- A.
--bare - B.
--permission-mode dontAsk - C.
--max-turns 25 - D.
--output-format stream-json
Resposta
B.
No modo dontAsk, tudo o que geraria uma pergunta é negado; só rodam as entradas de --allowedTools (aqui Read,Edit,Write,Bash(mvn -B *)) e as ações que não precisam de aprovação. O --bare deixa de carregar hooks, plugins, servidores MCP e CLAUDE.md do repositório; --max-turns e --max-budget-usd limitam o loop; stream-json produz a transcrição de auditoria.
Q9. O PR em rascunho aberto pelo agente de correção com o GITHUB_TOKEN não mostra nenhuma execução de CI. Por quê?
- A. PRs em rascunho nunca rodam workflows
- B. Eventos disparados pelo
GITHUB_TOKENnão iniciam novas execuções de workflow, uma proteção do GitHub contra workflows recursivos - C. O label
ai-generateddesabilita o CI - D. Workflows
workflow_runnão conseguem criar branches
Resposta
B.
Pushes e PRs criados com o GITHUB_TOKEN do repositório não disparam workflows push/pull_request (com poucas exceções, como workflow_dispatch). É preciso um push humano (mesmo um commit vazio) ou um token de GitHub App para rodar o CI na proposta — um quebra-molas útil: uma pessoa olha antes.
Q10. O job de release notes descarta um item que diz "order: new refund endpoint (#99)". Por quê?
- A. Reembolsos não são permitidos em release notes
- B. Nenhum commit no intervalo da tag referencia
#99, então o item não tem ancoragem — provavelmente foi inventado - C. O serviço
ordernão faz parte do BoxOffice - D. O item excedeu o orçamento de tokens
Resposta
B.
Todo item precisa citar pelo menos um SHA ou número de PR que de fato aparece em git log previous..tag. A verificação é barata e pega a falha mais perigosa — uma funcionalidade plausível que não existe. Ela não pega um resumo errado de um commit real; é para isso que serve a revisão humana da release em rascunho.
Q11. Na parte 5, o canary tem taxa de erros de 2,9% (stable 0,1%) e p99 2,28× o do stable. A explicação do modelo diz "verdict": "promote". O que acontece?
- A. O rollout é promovido, porque o modelo tem mais contexto do que os limites
- B. O script pergunta de novo ao modelo até ele dizer rollback
- C. O veredito da política (rollback, código de saída 1) prevalece, e a explicação é descartada porque contradiz a política
- D. A análise fica inconclusiva
Resposta
C.
A decisão vem de limites versionados no código; o modelo só explica. Uma explicação que discorda do veredito é descartada em vez de exibida, porque uma explicação errada e confiante ao lado de uma decisão correta engana o engenheiro de plantão.
Q12. Por que o canary_explain.py devolve inconclusivo quando o canary atende 0,8 req/s, mesmo com taxa de erros e p99 que parecem bons?
- A. Porque o Prometheus não consegue calcular o p99 abaixo de 1 req/s
- B. Porque, com tão poucas requisições, uma regressão real pode ainda não ter aparecido: "nenhum erro visto" não é evidência de "nenhum erro"
- C. Porque o modelo precisa de mais tokens
- D. Porque o Argo Rollouts exige pelo menos 1 req/s
Resposta
B.
Falhas raras precisam de muitas requisições para ficarem visíveis (a página de entrega calcula quantas). Declarar saudável um canary com pouco tráfego é um falso negativo clássico; a política exige um tráfego mínimo (MIN_RPS) antes de julgar.
Q13. Um colega propõe trocar o ai-review.yaml de pull_request para pull_request_target "para que o revisor também funcione em PRs de forks", mantendo o checkout do head do PR. Qual é o risco?
- A. Nenhum:
pull_request_targeté o gatilho recomendado para forks - B. Só um custo maior de tokens
- C. Um pwn request: o código do fork (inclusive um
review.pyou plugin de build modificado) roda com os segredos do repositório e um token de escrita - D. O revisor revisaria o branch base em vez do PR
Resposta
C.
O pull_request_target roda no contexto do repositório base, com segredos e (por padrão) um token de escrita. Fazer checkout do head do PR e executá-lo ali entrega os dois a quem abriu o PR. Alternativas seguras: manter pull_request (sem segredos para forks), ou dividir em um job sem privilégios que produz o diff como artefato e um job privilegiado que só lê esses dados.
Q14. Qual passo é uma injeção de script?
- A.
env: { TITLE: ${{ github.event.pull_request.title }} }e depoispython review.py --title "$TITLE" - B. Ler o título de
$GITHUB_EVENT_PATHdentro do Python - C.
run: python review.py --title "${{ github.event.pull_request.title }}" - D.
gh pr view "$PR" --json title
Resposta
C.
O ${{ }} é substituído no texto do script antes de o shell rodá-lo, então um título que contém "; curl ... $ANTHROPIC_API_KEY ... vira código. Passar o valor por uma variável de ambiente (A) ou lê-lo do arquivo do evento (B) o mantém como dado.
Q15. Depois de uma semana, o revisor postou 40 comentários: 12 👍, 18 👎, 10 sem avaliação. O custo foi de US$ 0,60 para 25 PRs. Qual é a melhor decisão?
- A. Ligar o modo portão: 40 comentários mostram que ele é minucioso
- B. A precisão é 12 / 30 = 40%: mantê-lo consultivo, cortar o ruído (severidade mínima maior, menos comentários, adicionar os falsos positivos ao
CONVENTIONS.mde ao golden set) e medir de novo - C. Removê-lo porque custa US$ 0,60
- D. Trocar para o modelo mais barato para reduzir o custo
Resposta
B.
Precisão = 👍 / (👍 + 👎) = 12 / 30 = 40%: a maioria dos comentários avaliados não foi útil, então as pessoas vão aprender a ignorar o bot. Usá-lo como portão bloquearia PRs bons. O custo de tokens (US$ 0,024 por PR) não é o problema — o custo de atenção de 18 comentários ruins é. Ajuste, adicione as falhas à avaliação e meça por mais uma semana.