# CV & application materials — to update Audit date: 2026-07-27. Scope: `linkme/cv/`, `linkme/motivation*.md`, `rafapolo/` portfolio + `rafapolo/job/`. ## Why ~270 applications over 18 months (≈15/month, mostly LinkedIn Easy Apply) with no offers. Volume was never the problem. Three causes found: 1. **The CV omits the entire target stack.** Keyword audit of `Rafael_Polo_CV_EN_2026.pdf`: | Keyword | Count | |---|---| | TypeScript | 0 | | React | 0 | | Rails | 0 | | PostgreSQL | 0 | | LLM / RAG / LangChain | 0 | | Rodado | 0 | | Staff / Principal | 0 | | `98%` (best metric) | 0 | Skills line says "Javascript Frameworks" instead of `React` / `TypeScript` — no ATS or recruiter searches that string. Space is spent on `Slack`, `UX`, `UML`, `MVC`. 2. **The CV pitches a security-ops job.** Profile paragraph leads with *"operating production infrastructure … security patching, vulnerability remediation, and system hardening under strict SLAs"* — likely written for `job/applications/helvetia/` (Cyber Hire). Every Staff/Principal software, AI and platform application since has carried that framing. Tell: the HCLTech *Application Support Engineer* posting is a good match for this CV. 3. **Two different CVs are in circulation, with conflicting employment dates.** | Source | Swisscom start | Date | |---|---|---| | `rafapolo/rafael-polo-cv.pdf` (served at extrapolo.com) | 02/2024 | May 13 | | `rafapolo/job/cv/Rafael_Polo_CV_EN_2026.pdf` (what gets sent) | 03/2024 | Jul 24 | | `linkme/cv/polo.md` | 2024, no month | — | Secondary: LinkedIn Easy Apply is the lowest-conversion channel for Staff/Principal roles (300–1000 applicants/posting; recruiters review the first ~20–30). Swiss senior roles fill via company portals, recruiters and referrals. --- ## Priority 1 — the CV - [ ] **new** `rafapolo/job/cv/cv-source.md` — single canonical source; both PDF and HTML generated from it. No source of truth today, which is how three versions drifted. - [ ] `rafapolo/job/cv/Rafael_Polo_CV_EN_2026.pdf` — rebuild: - [ ] New profile line: platform / data / AI engineering. Drop the security-ops framing. - [ ] Skills as literal searchable strings: `Python · TypeScript · React · Node.js · Ruby on Rails · PostgreSQL · Docker · Kubernetes · AWS · Terraform · CI/CD · LLM · RAG · LangChain` - [ ] Remove `Slack`, `UX`, `Modeling with UML`, `MVC system architecture`, `Javascript Frameworks` - [ ] Restore metrics: 98% processing reduction, CI/CD 14 → 4 min - [ ] Add **Rodado** (~730 datasets, 1TB Parquet, DuckDB, NL-to-SQL over MCP) — currently absent. Keep HelvetiScan (already appears 3×). - [ ] `Swiss B-Visa` → `Swiss B permit` (correct term: *Aufenthaltsbewilligung B*) - [ ] Compress ExtraPolo `01/2008–01/2023` — a 15-yr freelance block overlapping two employed roles reads as unverifiable to Swiss HR. One line: "Independent consulting (40+ projects)". - [ ] Keep single-column layout so ATS text extraction stays clean (verify with `pdftotext file.pdf -` — name and contact block currently land mid-document). - [ ] `rafapolo/rafael-polo-cv.pdf` — replace with a copy of the rebuilt PDF. Currently a stale May 13 file with a different Swisscom start date. - [ ] `rafapolo/curriculum.html` — same profile/skills/keyword fixes so the web CV matches the PDF. Header/`` should carry positioning, not just "CV". ## Priority 2 — dedupe - [ ] `linkme/cv/polo.md` - [ ] `:13` — `"no work permit required"` is wrong (CH is not in the EU) → `Swiss B permit · Portuguese (EU) citizen` - [ ] `:118` — drop `Java` (own scraper filters Java roles via `JAVA_TITLE_RE`) - [ ] Add Rodado / HelvetiScan and the metrics; sync dates with canonical CV. This file drives job ranking per `CLAUDE.md`, so it must match reality. - [ ] `linkme/cv/` — archive to `cv/old/` or delete: `polo-cv.html`, `polo-cv-accurate.html`, `polo-new-cv.{html,odt,pdf}`, `rafael-polo-cv-2026-senior.{odt,pdf}`, `rafael-polo-cv.pdf` (a file named `-accurate` implies the others aren't) - [ ] `rafapolo/job/cv/` — 14 files; keep the canonical pair, move the rest into the existing `old/` ## Priority 3 — letters & tracking - [ ] `linkme/motivation1.md` (Roche) — delete `:15`, the *"While I have not worked directly inside clinical development…"* paragraph. Never volunteer a disqualification. Trim ~800 → ~250 words. - [ ] `linkme/motivation-adobe.md` — strongest of the two; trim to ~250 words. Permit line at `:13` is already correct — use as the template for all others. - [ ] **new** `linkme/results/applications.csv` — `date,company,role,channel,url,stage,outcome`. No record exists of what happened to any of the ~270 applications, so there is no way to tell whether the failure is at screening, phone screen, or onsite. ## Not changing Scraper is fine — `fetch.ts`, filter pipeline, `index.ts` all working. No changes needed. ## Channel shift (behavioural, not a file) - [ ] Invert the mix: ~70% company career portals + recruiter/referral, ~30% Easy Apply. - [ ] Apply direct (not via LinkedIn) for the live Basel/Zürich targets: Adobe, Roche, Exeon, Crypto Finance, Swiss Post Cybersecurity. - [ ] Reconsider German-first corporates (Coop, Valora, Helvetia) while at B1 — screening failure precedes any engineering assessment.