Como validei meu currículo contra máquinas de ATS
Como usei uma ferramenta própria para medir se um currículo é lido por sistemas ATS, compará-lo a uma vaga e acompanhar mudanças entre versões.
Eu sempre escrevi meu currículo para a pessoa recrutadora: título bonito, design e palavras que soavam bem. Quando comecei a testar o próprio CV contra a leitura automática de sistemas ATS, descobri que havia duas perguntas diferentes: o arquivo consegue ser lido? E o conteúdo combina com a vaga?
O cv-ats-checker é uma skill para agentes de IA que nasceu para separar essas perguntas. A ferramenta analisa PDF e DOCX, mede sinais estruturais, organiza uma avaliação de 0 a 100 e deixa claro onde termina a evidência mecânica e começa o julgamento.
Usei meu próprio currículo como primeiro caso real. A análise mostrou melhorias que não eram óbvias olhando apenas para o PDF: antes de discutir a qualidade do texto, eu precisava saber o que um sistema conseguiria extrair daquele arquivo.
O primeiro erro foi tratar “ATS” como uma coisa só
ATS é a sigla de Applicant Tracking System: um sistema que recebe candidaturas e pode transformar o arquivo enviado em texto estruturado antes de alguém ler o currículo. Nesse fluxo, um documento visualmente bonito pode perder informação durante a leitura automática.
O problema é que nem toda plataforma funciona assim. O repositório separa o parsing direto de PDF ou DOCX de plataformas que usam campos estruturados, como a Gupy. No LinkedIn, ainda existem duas dinâmicas: o arquivo anexado em uma candidatura via Easy Apply e o texto do perfil público usado na busca de recrutadores.
Na candidatura, o arquivo anexado costuma ser o que chega ao empregador. Na busca do Recruiter, o que pesa é o texto do perfil, especialmente o título abaixo do nome e o cargo atual. A própria referência do projeto classifica essa informação com confiança mista, então trato a direção como evidência útil, não como uma regra universal (referência sobre LinkedIn).
Quando a plataforma não está no mapa, a skill pesquisa
Uma tabela fixa de ATS parecia um atalho, mas ficaria desatualizada assim que uma vaga usasse uma plataforma nova. Por isso, quando recebe um link de vaga, a skill tenta identificar a plataforma pelo domínio e procura primeiro uma referência existente em references/.
Se a referência não existe, o fluxo não segue fingindo que todo ATS funciona como um parser de PDF. A skill aciona um subagente de pesquisa para descobrir como aquela plataforma recebe o currículo, o que realmente analisa, como funciona o filtro e quais particularidades mudam a avaliação.
O resultado é salvo como references/plataforma_<nome>.md e passa a orientar a análise daquela plataforma. A pesquisa usa informação pública e funciona como guia, não como verdade absoluta: referências dinâmicas podem estar incompletas ou desatualizadas.
Antes da nota, eu precisava ver o que o arquivo escondia
Abrir o PDF e conseguir ler não era evidência suficiente. Um currículo pode parecer organizado e ainda conter tabela, duas colunas, caixa de texto, imagem, fonte incomum ou informação importante apenas no cabeçalho.
O primeiro passo passou a ser mecânico: extrair fatos do documento antes de dar opinião sobre ele.
python3 scripts/analyze_resume.py caminho/para/curriculo.pdf
O script mede se o texto é extraível, procura tabelas e layout multicoluna, identifica imagens e fontes não padrão, verifica cabeçalho e rodapé, encontra títulos de seções, compara estilos de data, reconhece marcadores e procura e-mail e telefone no corpo do documento.
Ele também trata PDF e DOCX por caminhos diferentes. Não é uma distinção cosmética: no DOCX, por exemplo, o analisador consegue verificar caixas de texto, colunas de seção e listas nativas do Word; no PDF, usa heurísticas para detectar colunas, cabeçalhos e rodapés.
def analyze_file(path):
ext = Path(path).suffix.lower()
if ext == ".pdf":
result = analyze_pdf(path)
elif ext == ".docx":
result = analyze_docx(path)
else:
raise ValueError("formato não suportado")
return result
O detalhe mais importante está no limite do script: ele não decide se o currículo é bom ou ruim. Ele mede fatos objetivos. A interpretação fica para a leitura do texto e para a rubrica.
A ferramenta não entrega um veredito; ela organiza evidências
A rubrica divide a análise em cinco perguntas. Parseabilidade, isto é, a capacidade de o sistema ler o arquivo corretamente, vale 30 pontos. Estrutura e seções valem 20: o conteúdo está organizado de um jeito reconhecível? Contato vale 10: nome, e-mail e telefone aparecem no corpo do texto?
Os 40 pontos restantes tratam do conteúdo. Correspondência com palavras-chave vale 25 e qualidade do conteúdo vale 15. Os pesos ajudam a calibrar a leitura, mas o próprio projeto alerta que a soma não é uma fórmula rígida.
| Categoria | Peso | Pergunta que orienta a leitura |
|---|---|---|
| Parseabilidade e formato | 30 | O ATS consegue extrair o conteúdo sem embaralhar ou ignorar partes? |
| Estrutura e seções | 20 | Experiência, formação e habilidades têm títulos reconhecíveis? |
| Contato e identificação | 10 | O contato está no corpo do documento, e não apenas no cabeçalho? |
| Palavras-chave | 25 | O currículo usa os termos relevantes da vaga? |
| Qualidade do conteúdo | 15 | Há verbos de ação, resultados e evidências concretas? |
Esse desenho corrigiu uma simplificação perigosa. Um currículo pode ter conteúdo forte e ainda falhar na leitura. Também pode ser perfeitamente legível e não conter os termos que a vaga exige. Uma nota única esconderia exatamente a diferença que eu precisava enxergar.
O primeiro caminho que falhou foi confiar na aparência
Eu costumava revisar o currículo como uma pessoa: abria o arquivo, conferia o alinhamento e lia as experiências. Esse caminho responde se o documento parece bom na tela, mas não responde em que ordem as palavras serão extraídas.
O caso mais traiçoeiro é a coluna. Para a pessoa, duas colunas podem deixar a página mais equilibrada. Para um parser, a ordem pode virar uma mistura de cargo, habilidade, data e empresa. O mesmo risco aparece quando uma informação fica dentro de uma caixa de texto ou só no cabeçalho.
O projeto também evita transformar o resultado do script em certeza. Um PDF com texto extraível não está automaticamente aprovado. Esse sinal apenas elimina uma dúvida: o arquivo tem algo que pode ser lido. Ainda é preciso verificar a estrutura e o conteúdo.
A vaga muda a pergunta mais do que uma nota geral
Sem uma vaga específica, a avaliação de palavras-chave é orientativa. O projeto recomenda avisar isso porque a correspondência com os termos da vaga é a maior parte da avaliação de conteúdo e pode mudar bastante o resultado.
Quando existe uma descrição de vaga, o processo fica mais específico. Primeiro separo requisitos obrigatórios, diferenciais, perfil comportamental e contexto prático. Depois comparo cada requisito com o que o currículo realmente demonstra.
| Situação | Como interpretar |
|---|---|
| Presente e evidenciado | O termo aparece dentro de uma experiência, projeto ou resultado concreto. |
| Presente, mas fraco | A palavra está no documento, mas não mostra profundidade nem aplicação. |
| Ausente, mas coberto por adjacência | O termo exato não aparece, mas uma experiência equivalente sustenta a relação. |
| Ausente, sem cobertura | O requisito obrigatório não aparece nem encontra evidência próxima. |
Isso mudou a forma de tratar palavras-chave. A palavra exata pode ajudar um filtro, mas repetir tecnologia em uma lista não substitui mostrar onde ela foi usada. O contexto decide se a correspondência é forte ou apenas decorativa.
Comparar versões evita confundir mudança com melhoria
Outra tentativa frágil seria comparar dois currículos apenas olhando um antes e depois. Uma versão pode parecer mais limpa e, ao mesmo tempo, introduzir uma tabela, esconder o contato no cabeçalho ou alterar a ordem de leitura.
Para separar essas coisas, o repositório tem um segundo script:
python3 scripts/compare_versions.py curriculo-antigo.pdf curriculo-novo.pdf
O relatório compara tipo de arquivo, texto extraível, tabelas, imagens, colunas, fontes, contagem de palavras, seções, datas, marcadores e contato. Ele registra o que apareceu, sumiu ou mudou e salva o histórico em historico_comparacoes/.
O script não afirma que a versão nova é melhor. Essa escolha continua dependendo da rubrica e da leitura do conteúdo. A vantagem é não precisar confiar apenas na memória ou na impressão visual.
As escolhas e os custos ficaram visíveis no desenho
| Decisão | Alternativa descartada | Ganho | Custo |
|---|---|---|---|
| Separar sinais mecânicos de julgamento | Uma nota produzida por uma única leitura | Mostra exatamente o que o arquivo apresenta | Exige uma segunda etapa de interpretação |
| Identificar a plataforma antes de avaliar | Tratar todo ATS como parser de PDF | Evita aplicar a rubrica errada a Gupy ou ao perfil do LinkedIn | A análise precisa de mais contexto |
| Comparar requisitos com evidências | Procurar apenas palavras soltas | Distingue experiência real de palavra decorativa | A leitura semântica não é totalmente automática |
| Comparar versões por sinais | Confiar no antes e depois visual | Revela regressões mecânicas | Não mede sozinho a qualidade da escrita |
Esse é o ponto em que o projeto deixou de ser um “validador de currículo” genérico. Ele virou um processo: descobrir o fluxo, extrair sinais, comparar com a vaga, interpretar os resultados e só então decidir o que mudar.
O que o projeto ainda não consegue provar
O cv-ats-checker não simula fielmente um ATS específico. Sistemas como Workday, Taleo, iCIMS, Greenhouse e plataformas brasileiras podem tratar o mesmo arquivo de maneiras diferentes. A pontuação é uma estimativa educada, não uma garantia de entrevista.
Também não existe um resultado universal sem uma vaga real. A mesma versão pode ter boa compatibilidade com uma posição e fraca com outra porque os requisitos e os termos usados mudam.
No LinkedIn, o script cobre o arquivo PDF ou DOCX anexado, mas não avalia o perfil público. Headline, cargo atual e habilidades são outra frente. Misturar as duas coisas ocultaria a diferença entre o arquivo da candidatura e o conteúdo usado na busca de perfis.
O que aprendi
A pergunta útil não é “meu currículo passou pelo ATS?”. É: o sistema consegue ler o arquivo, a vaga encontra evidências no texto e eu consigo explicar o que mudou entre uma versão e outra?
Se eu repetisse o processo hoje, começaria identificando o canal da candidatura. Depois rodaria a extração mecânica, compararia o currículo com uma vaga específica e registraria cada alteração antes de fazer a próxima. A ferramenta não transformou recrutamento em uma ciência exata. Ela fez algo mais prático: tornou as suposições visíveis.