Mon CV V2 commençait par « 39 ans, 10 ans d'expérience ». J'en ai 14. Le PDF
dormait sur OVH depuis quatre ans, lié depuis index.php:1019, et personne ne
l'avait rouvert. J'ai voulu corriger trois lignes. J'ai fini avec 36 itérations, un double
scoring ATS/recruteur, un QR code qui décalle tout, et un V3 qui écrase le V2 pour ne pas
casser le lien.
Voilà comment ça s'est vraiment passé.
Le premier piège : Claude ne voit pas mon PDF
Premier réflexe : « montre-moi le rendu, je te dirai quoi corriger ». Sauf que
Claude tournait sur un serveur distant, en SSH, sans navigateur. Pas de localhost
accessible depuis chez moi. Le PDF généré dans /tmp/cv-build/cv.html n'était
visible que pour Claude — et Claude ne sait pas regarder une image.
La phrase qui a tout débloqué : « tu te rends bien compte que tu es sur un serveur et que le localhost j'y ai pas accès ». À partir de là, le workflow s'est inversé :
- Claude génère
cv.html+cv-v{n}.pdfavecgoogle-chrome --headless=new --print-to-pdf - Upload immédiat sur OVH via
lftp(les credentials sont dansscripts/.ftp.env, gitignored) - Je clique sur le lien public, je note ce qui cloche, je renvoie en langage humain
- Claude diffe la version précédente et corrige
C'est ce que Claude ne peut pas faire seul : juger un rendu visuel. Il n'a pas d'œil. Moi si. La boucle exploite ça : il code, je regarde, je gueule, il corrige.
Le double scoring : ATS d'abord, humain ensuite
Un CV moderne passe par deux filtres avant d'arriver sur un bureau : un parseur ATS (Applicant Tracking System) qui extrait les champs structurés, et un humain qui scanne en 7 secondes. Les deux ne notent pas la même chose.
J'ai demandé à Claude de jouer les deux rôles à chaque itération :
| Critère | ATS / IA recruteur | Recruteur humain |
|---|---|---|
| Noms de sections | Canoniques FR (EXPÉRIENCE, COMPÉTENCES…) | Lisibles, hiérarchisés |
| Mots-clés métier | Densité, présence dans DOMAINES D'EXPERTISE | Pas de bourrage, intégrés à la prose |
| Verbes d'action | Début de bullet (« Conçu », « Migré ») | Pas trop bullet-point, du liant |
| Métriques chiffrées | Présence de chiffres | Crédibilité, contexte |
| Lisibilité PDF | Police extractible, ordre de lecture | Aération, hiérarchie visuelle |
| Soft skills | Souvent ignorés | Indispensables, mais sans cliché |
Cible : ≥ 90/100 sur les deux notes. Pas de moyenne — il faut les deux. Un CV qui maximise l'ATS mais bourre les keywords se fait jeter par l'humain. Un CV qui séduit l'humain mais oublie la canonicité ne passe jamais le filtre auto. Les consignes « notes-le et tourne en boucle jusqu'à ce qu'il ait une excellente note » ont structuré toute la session.
La pyramide : du général au spécifique
Un CV ne se lit pas de gauche à droite. Il se lit en zigzag, de haut en bas, avec un œil qui décroche dès qu'un bloc ne donne pas envie. La règle qu'on s'est fixée : flux pyramidal, du plus général au plus spécifique.
- Profil professionnel — prose narrative, parcours résumé en 4 phrases, soft skills intégrés
- DOMAINES D'EXPERTISE — ligne unique en callout vert, mots-clés densifiés pour l'ATS
- Compétences techniques — chips colorées par niveau de maîtrise (soft teal = maîtrisé, blanc = supporting)
- Expériences — timeline avec verbes d'action et métriques
- Projets — concret, lien cliquable, stack visible
Le profil professionnel a été réécrit cinq fois. La version finale est de la prose, pas une suite de bullets déguisés :
Développeur Full-Stack Senior, je cumule 14 ans d'expérience en développement web et en architecture backend distribuée. Depuis 4 ans, je conçois des plateformes critiques pour la fintech et la crypto, où la conformité réglementaire et la fiabilité ne sont pas négociables. Mon parcours est atypique : ancien enseignant en mathématiques et sciences physiques, reconverti en ingénieur environnement avant de basculer vers le développement en 2012. J'ai gardé de chaque étape une approche méthodique et le goût de creuser les problèmes jusqu'à leur racine, peu importe le langage. Autonome et habitué à vulgariser, je communique aussi bien avec un PO non-tech qu'avec un architecte chevronné. Formateur DWWM/CDA certifié et jury professionnel RNCP, je transmets également cette exigence aux nouvelles générations de développeurs.
Soft skills inclus, mais glissés dedans : « approche méthodique », « creuser les problèmes jusqu'à leur racine », « autonome et habitué à vulgariser ». Pas de « passionné depuis l'enfance ». Pas de « joueur d'équipe rigoureux ». Les clichés ATS, on les évite — ils crament la crédibilité humaine sans rien rapporter à la machine.
Les rétroactions qui ont fait basculer le rendu
Sur 36 itérations, certaines remarques ont eu un impact disproportionné. Les voici dans l'ordre où elles sont tombées :
1. Kubernetes, Terraform, PostGIS — jamais fait
La première version générée par Claude avait piochée dans les buzzwords. J'ai dû couper sec : « Kubernetes tu veux virer jamais fait, PostGIS je sais pas ce que c'est, Terraform pas fait non plus ». Un CV qui ment sur la stack se grille au premier entretien technique. Claude n'a aucun moyen de savoir ce que tu as réellement touché — c'est ton job de filtrer.
2. « Méthodes 14 ans » — pas pertinent
Mettre une durée d'expérience sur Agile/Scrum, c'est du remplissage. « Méthodes 14 an tu as pas besoin de mettre d'âge pour les méthodes ». Supprimé. Le CV gagne en densité utile.
3. Le QR code en haut décalle tout
J'avais demandé un QR code vers le portfolio. Claude l'a mis dans le header. Résultat :
« ça décalle tout c moche ». Déplacé en footer page 3, 15mm, accent teal,
généré en SVG inline avec le package qrcode Node. Discret, fonctionnel,
au bon endroit.
4. « Go / PHP / Vue.js » qui wrappe avec un seul mot orphelin
Le titre passait à la ligne en laissant « Go / » tout seul. Hideux. Fix :
<span style="white-space:nowrap">Go / PHP</span> / <span style="white-space:nowrap">Vue.js</span>
Le genre de détail qui se voit en 30 secondes mais qu'on rate en passant l'œil sur le HTML. C'est l'œil humain qui détecte. Pas l'agent.
5. Localisation trop longue
« Besançon · Mobile Franche-Comté / Suisse · Full remote » faisait déborder le
bloc droit du header. Pas envie de raccourcir l'info — j'ai laissé Claude jouer avec le
CSS Grid : grid-template-columns: auto minmax(0, 62mm) + max-width:
88mm pour permettre le wrap propre.
6. Profil en background vert comme le reste
J'ai voulu garder le style callout pour DOMAINES D'EXPERTISE seulement. « le début là a pas besoin d'être en background vert comme le reste ». Style différencié : la prose reste neutre, le callout vert ne sert qu'aux mots-clés.
L'écrasement V2 → V3 pour ne pas casser le lien
Le fichier sur OVH s'appelait HUGONNOT Odilon CV - Developpeur WebV2.pdf.
Le lien dans index.php:1019 pointait dessus. Plutôt que de modifier le HTML,
de redéployer, et de risquer de casser une référence externe (LinkedIn, e-mails
archivés, recruteurs qui ont sauvegardé le PDF), j'ai écrasé V2 avec le contenu
de V3.
cp /tmp/cv-build/cv-v36.pdf "assets/images/projects/HUGONNOT Odilon CV - Developpeur WebV2.pdf"
cp /tmp/cv-build/cv-v36.pdf "assets/images/projects/HUGONNOT Odilon CV - Developpeur WebV3.pdf"
lftp -e "set ftp:passive-mode true; put -O /www/assets/images/projects 'HUGONNOT Odilon CV - Developpeur WebV2.pdf'; put -O /www/assets/images/projects 'HUGONNOT Odilon CV - Developpeur WebV3.pdf'; bye" \
-u "$FTP_USER,$FTP_PASS" "$FTP_HOST"
Le V2 garde son nom et son URL. Le contenu est neuf. Les anciens partages continuent de marcher, les nouveaux pointent vers V3. Pas de migration, pas de redirection à maintenir. Le genre de bricolage qu'un humain trouve évident et qu'un agent ne propose pas spontanément — parce qu'il n'a pas le contexte des partages externes que je n'ai pas mentionnés.
Ce que la boucle a produit
Le résultat est ici :
Trois pages strictes :
- Page 1 — Header + Profil + Compétences techniques
- Page 2 — Expériences complètes en timeline
- Page 3 — Projets cliquables + bottom-grid (Formation, Langues, Centres d'intérêt) + QR code
Layout forcé via page-break-before: always sur les sections 03 et 04. Pas
de page fantôme, pas de gros trou blanc. Chaque page tient seule, et l'œil ne décroche
jamais en bas pour chercher la suite ailleurs.
Conclusion
L'agent ne peut pas voir. C'est la limite. Sur 36 itérations, environ 30 corrections sont venues de moi — du regard, pas du code. Claude excelle à transformer une remarque humaine (« ça décalle tout », « le titre orphelin », « Kubernetes jamais fait ») en diff CSS ou en réécriture de bloc en quelques secondes. Mais le jugement esthétique, la cohérence du parcours, la sincérité de la stack — ça reste mon boulot.
La vraie productivité, ce n'est pas « l'IA fait mon CV ». C'est « je peux tester 36 variantes en deux heures au lieu d'une par jour ». La bande passante de l'itération s'élargit. La qualité du jugement, elle, reste à ma charge. Et c'est très bien comme ça.