docs: add motivation letters, homework and update notes

This commit is contained in:
2026-08-27 09:03:05 +02:00
parent b4957025b1
commit 2402b5d5da
4 changed files with 156 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
# 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/`<title>` 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.