gzucob.
← posts

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.

18 de jul. de 20269 min de leitura

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.

bash
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.

python
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:

bash
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.