cv · v1.1.0 · 2026-09-24 · sha256 0c27da513bf1d4d2
cv v1.1.0A
Immutable. This exact content never changes and is served at /api/v1/blob/0c27da513bf1d4d2.
---
name: cv
description: "Обновление CV Антона по ВСЕМУ конвейеру одной командой — мастер resume.json → cv_forge (кластерные CV) → лендинг… Триггеры “/cv“, “обнови CV“, “обнови резюме“, “правка в резюме“, “добавь в CV“, “update my resume“, а также ЛЮБАЯ голосовая/текстовая правка фактов биографии Антона (опыт, компании, даты, позиционирование"
version: 1.1.0
---
# /cv — конвейер резюме Антона
Один источник правды → все поверхности. Правка в одном месте, дальше механика.
## Карта конвейера
```
МАСТЕР $OBSIDIAN_VAULT/05-Resources/External-Mirror/resume.json ← правим ТОЛЬКО его
├─→ cv_forge.py ($IMPORTS_ROOT/cv_forge.py, 0 LLM)
│ └─→ CV по кластеру → $OBSIDIAN_VAULT/05-Resources/CV-Variants/*.md → репо github.com/tonydzi/cv
└─→ лендинг tonydzi.github.io: resume.json (копия) + resume.html (ATS-текст) + resume.pdf
```
Пути в карте — только forward slashes (работают на Mac И Win; backslash в zsh съедается молча).
Клоны репо: scratchpad текущей сессии (`.../scratchpad/tonydzi.github.io` и `.../scratchpad/cv-repo`);
нет в этой сессии → `gh repo clone tonydzi/tonydzi.github.io` / `gh repo clone tonydzi/cv cv-repo` в свой scratchpad
(ssh-URL `git clone git@github.com:...` на хабе отбивается — ключ не заряжен, 03.09; ssh = запасной путь).
Дефолтная ветка cv-repo = `master`, не `main` — raw-проверка по `/main/` даст пустоту, это не поломка.
Python: везде `python3` (на Win-узле, если python3 — заглушка Store, взять `python`).
## Правила фактов (главное)
1. В CV идут только факты **подтверждённые волтом** или **сказанные Антоном голосом/текстом** (origin: anton + дата в комменте кода/коммите). Мутное из расшифровки → пометить 🤔, в CV НЕ нести, положить в карточку человека/компании в 07-People и спросить Антона.
2. Непроверяемый нейм-дроппинг (типа «его босс был Майкл Блумберг») в CV не носим — только проверяемую форму («12 years at Bloomberg»).
3. Цифры — правда всегда: не занижать и не завышать ([[fake-it-courage-not-fake-numbers]]).
4. Формулировки Антона не смягчать (§9.7); свежее его слово бьёт старое по той же теме.
5. LinkedIn нигде не указывать — аккаунт забанен.
6. Контакты найма (приказ anton 01.09.2026): `dzyatkovskiy.a@gmail.com` + WhatsApp +1 341 222 9178 + Calendly; `a@platinum.fund` в CV/анкеты НЕ носим. Право на работу: US O-1 active + гражданин ЕС (польский паспорт) → «no visa sponsorship required» и в США, и в ЕС ([[anton-eu-polish-passport]]).
6-бис. География (anton голосом 03.09.2026): «базируюсь в Пало-Альто, семья живёт в **Синтре**» → везде `Palo Alto, CA (Silicon Valley) – Sintra, PT`, живёт константой `GEO` в форже. Lisbon больше не пишем: был разнобой лендинг(Sintra)↔CV(Lisbon) на одной анкете.
6-тер. Питчи `Pitch-*.md` (3 одностраничника) с 03.09 **генерятся форжем** (`PITCHES` + `build_pitch`) — руками НЕ править, правка уедет при перегенерации; контакты/география общие с CV через `contact_line()`. Правишь текст питча → правишь константу в `cv_forge.py`.
7. ⛔ Титулы — ПЕРЕПИСАНО anton голосом 14.09.2026, отменяет правило 02.09: слово **Founder / Co-Founder не употребляется НИГДЕ** (ни в CV, ни в питчах, ни на лендинге, ни в анкетах, ни в аутриче). Дословно: «если ты говоришь, что я фаундер, это токсично». Platinum = **COO/CTO, наёмная руководящая позиция**; титул выбирается по кластеру: операционный/системный кластер → **COO**, инженерный → **CTO**. Небольшой [человек] фаундерством не делает и в CV не выносится. Причина не вкусовая: полевой эксперимент на 2400 заявках — бывшие фаундеры получают на 43% меньше откликов (Organization Science, найдено в DR26-09-14-ZB-11). Вместо «был фаундером» продаём **законченный продуктовый цикл**: нашёл проблему → построил → этим пользуются. Нарратив лояльности (Merlion 9 лет + Platinum 11 лет) остаётся и усиливается — он и есть лекарство от flight-risk.
7-бис. ⛔ Слово **«не-кодер» вычеркнуто** (anton голосом 14.09): Антон программист — **Python, C++**; программистский опыт вспоминается и вносится в CV поимённо. Причина: «не-кодер» = дисквалификатор №1 в DevRel консенсусом hiring-менеджеров (DR26-09-14-ZB-10). Для кластера Technical-Writer-AI-Educator отдельно держать: годы **обучения разработчиков и фаундеров** + **PhD по теме обучения разработчиков** — это прямое закрытие требования «5+ лет DevEd ИЛИ 5+ лет SWE + преподавание», не натяжка. Канон: память [[never-call-anton-a-founder]].
## Шаги (порядок жёсткий)
0. **📛 ON AIR + свежесть диска** (урок 01.09: две сессии дважды взаимно затёрли правки мастера/форжа, взяв EXCLUSIVE в РАЗНЫХ зонах): `python3 ~/.claude/scripts/onair.py list` — если CV-работу держит другая сессия (любая зона со словами cv/identity), сперва договорись по шине; протухший lease (TTL истёк / сессия мертва) = зона свободна, объяви поверх. Затем `onair declare --zone content-factory/cv-identity --mode exclusive --title "<что правишь>"`. Перед КАЖДЫМ write и перед пушем — перечитай resume.json и cv_forge.py С ДИСКА, не пиши из памяти контекста.
1. **RECALL**: что уже решено по этой правке — grep мастера + `cv_forge.py` (FACTS/PLATINUM_*/CLUSTERS), при биографических якорях — волт (`brain_ask.py`).
2. **Правка мастера** resume.json (summary / work / highlights). Той же правкой — зеркальные константы в `cv_forge.py`: контакты/visa → FACTS, титулы/Summary-текст → PLATINUM_SUMMARY/BD/TECH, кластеры → CLUSTERS. Дублирующийся текст мастер↔константы — расхождение = баг; автоматического детектора пока НЕТ, сверяй глазами оба места.
3. **Прогон**: `cd "$IMPORTS_ROOT" && python3 cv_forge.py && python3 jobs-watch/_test_jobs_discover.py` — успех = строка `OK: <N> CV` (N = число кластеров в CLUSTERS форжа), тест exit 0 и ни одной строки FAIL. Тест сверяет кластеры дискавера С ФОРЖЕМ (внешний эталон, с 03.09) и существование каждого CV-файла. Новый кластер = править ТРИ места одним заходом: CLUSTERS+fnames в `cv_forge.py`, CLUSTER_RX+CV_FILE в `jobs-watch/jobs_discover.py` — тест парности поймает, если забыл.
3-бис. **ATS-инварианты** (24.09, из задачи «пройти ats рекрутер»): даты текущих мест = `Present`, НЕ `now` (корень: дефолт endDate в `cv_forge.py`); одна колонка, стандартные секции, ключи Skills дословно из языка вакансий кластера; титул CV = титул вакансии. Полный чеклист + что уже сверено = волт `03-Insights/ats-checklist-applied-2026-09-24.md`. Быстрый смок: `grep -l "– now)" 05-Resources/CV-Variants/*.md` обязан вернуть пусто.
4. **Лендинг**: в клоне tonydzi.github.io — `git pull --rebase`, скопировать свежий resume.json, обновить resume.html той же правкой (⚠️ html НЕ генерится из json — рассинхрон = старые факты в ATS; сверь ключевые поля глазами), затем PDF:
`python3 "$IMPORTS_ROOT/make_resume_pdf.py" <путь-к-клону>` — скрипт сам находит Chrome по ОС (или бери из env CHROME_BIN), печатает, проверяет sanity (>50KB, ≥1 стр., pdf свежее html) и печатает число страниц — сверь с прошлым прогоном, резкий скачок = разобраться.
⭐ **4-бис. ГЕЙТЫ ЛЕНДИНГА — обязательный шаг, добавлен 21.09** (без него репо тихо краснеет):
`python3 tools/check_resume_sync.py --stamp` (перепечатал PDF — обязан переставить штамп
`resume.pdf.sources`, иначе гейт скажет «pdf напечатан из старого html»), затем тот же
набор, что гоняет CI: `python3 tools/build_site.py && python3 tools/build_site.py --check &&
python3 tools/_test_build_site.py && python3 tools/_test_check_resume_sync.py &&
python3 tools/check_resume_sync.py` — все пять exit 0 ДО пуша.
⚠️ Замер 21.09: воркфлоу `rebuild-site` падал КАЖДУЮ ночь с 18.09, потому что число цитирований
подняли 136→137 на index.html и resume.html, а в мастере забыли. Гейт сверяет ТРИ поверхности
(index.html · resume.html · resume.json) — правишь цифру, правь все три плюс `FACTS["scholar"]`
и прозу в `cv_forge.py`. Пока job красный, генерённые страницы не коммитятся: публичная строка
вкладов три дня показывала «94 PR / 66 репо» вместо реальных «128 / 80».
Проверка состояния рельсы: `gh run list -R tonydzi/tonydzi.github.io --limit 5`.
5. **Пуш обоих репо** (лендинг + cv-repo: `git pull --rebase` → скопировать CV-Variants/*.md → commit → push). Коммиты с 4 трейлерами (Assisted-by / Machine / Account / Operator — §4.9). Плюс provenance-коммит `cv_forge.py` в _imports, если код менялся.
6. **Проверка наружу**: https://tonydzi.github.io/resume.pdf и https://github.com/tonydzi/cv отдают свежее (curl -sI = 200; кэш Pages догоняет за ~1-2 мин).
7. **Отчёт Антону + закрытие**: что изменилось (до→после по фактам), хэши коммитов, что помечено 🤔 и ждёт его слова. Последней командой ОБЯЗАТЕЛЬНО: `python3 ~/.claude/scripts/onair.py close` — иначе эксклюзивная зона висит и блокирует флот.
## Потребители конвейера (Connect §4.2 — кто ест выход)
- `jobs-watch/jobs_discover.py` — матчит вакансии на кластеры, CV_FILE должен знать каждый кластер форжа (тест парности).
- `jobs-watch/batch_daily.py`, `pipe_a_sheet.py` — пачки подач Pipe-A берут CV-файлы по карте кластеров.
- Лендинг tonydzi.github.io (resume.html/pdf) — уходит в ATS и рекрутёрам.
- Репо github.com/tonydzi/cv — публичная витрина, README перегенерирует форж.
## Грабли (заплачено кровью)
- resume.html — единственный источник resume.pdf; забыть его = старый PDF уходит в ATS (случилось 28-31.08).
- Хардкод-команда Chrome для Win валила шаг 4 на [машина флота] (аудит 03.09) — теперь только make_resume_pdf.py.
- Числа в прозе скилла/докстрингов («13 CV», «9/9 тестов») протухают при каждом новом кластере — критерии пишем формой «N = len(CLUSTERS)» и «exit 0», не числом.
- academia.edu / wellfound отдают 403 роботам — это НЕ мёртвые ссылки, проверять живым браузером.
- Пред-правочная версия для ревизии Антона: `git show <hash>:resume.json` из репо волта — не выдумывать «старую версию» по памяти.
- Кириллица/эмодзи в Bash-heredoc на Win — ок, но пути с `!` экранировать.
- **Дубль ключа в словаре кластера Python съедает МОЛЧА** (20.09): патч вставил `merlion_summary`
трижды подряд в ОДИН кластер, два других остались пустыми, форж и тест парности были зелёные.
Любая правка ключей кластеров проверяется AST-сканом на дубли и чтением САМОГО выхода в
CV-Variants (`grep -l` по новой фразе = ровно те файлы, что задумал), а не отчётом форжа.
- **Разные переводы строк у поверхностей** (20.09, число ПЕРЕПРОВЕРЕНО 21.09): мастер resume.json
на самом деле **CRLF**, не LF (замер: 170 CRLF, 0 голых LF), `resume.html` лендинга тоже CRLF.
`json.dumps` + запись в текстовом режиме дают LF и красят ВЕСЬ файл в diff (374 строки на
32 добавленных). Правило без гадания: снять окончание с самого файла ДО правки
(`b.count(b"\r\n")`), писать `wb` и вернуть родное окончание перед коммитом.
- **Правило 7 (никаких Founder/Co-Founder) НЕ ИМЕЛО ДВЕРИ** (замер 20.09: 11 из 17 CV печатали
титул спустя 6 дней после приказа): титулы живут в МАСТЕРЕ (`work[].position`, `basics.label`,
`basics.summary`), кластерный `positions` их только переопределяет поштучно. Правишь запрет на
слово - правь мастер, иначе правило держится лишь в тех кластерах, где кто-то вспомнил.
Проверка: `grep -h -o '^\*\*[^—]*—' CV-Variants/*.md | sort -u` - титул виден списком.
⚠️ Проза `Co-founded and ran` в PLATINUM_SUMMARY на 20.09 ЖИВА в 12 CV - ждёт слова Антона.
## Блок «Beyond work» (хобби, с 21.09.2026)
Источник один: `resume.json["interests"]` (JSON-Resume-совместимый список `{name, keywords}`).
Форж печатает его секцией `## Beyond work` перед Keywords во ВСЕХ кластерах. Кластер может дать
свой список ключом `"personal"` или заглушить блок целиком `"personal": []`.
⛔ **Здоровье Антона (опухоль, лечение голоданием) в мастер НЕ заносится** — тогда оно физически
не может утечь в CV или на лендинг. Полная картина живёт только в волте:
`06-Concepts/concept-anton-personal-profile-hobbies-values.md`. Канон CLAUDE.md §3.3 Поправка 08.09.
Ждут слова Антона и пока НЕ в мастере: четверо детей · шаббат · аяуаска · число часов на fixed-[человек].
## Ключи кластера, которые легко проглядеть
`merlion_summary` / `merlion_bullets` (с 20.09) - полная hardware-версия Merlion с оборотами
(~$5M/мес личных, отдел $15-25M/мес) идёт ТОЛЬКО в compute / founder-bd / coo. Остальные 14
кластеров получают нейтральный `MERLION_SUMMARY` без цифр: панель 2О 20.09 (codex+grok
независимо) - «sold GPUs, $5M/mo» в research/security CV читается как sales-резюме и закрывает
кандидата. То же правило формы у `platinum_summary` / `platinum_bullets` / `lab_bullets`.
## Границы
- Скилл НЕ подаётся на вакансии (это apply-brief + сессии-податчики) и НЕ строит cover-letters (это /cv-outreach и пачки Pipe-A).
- Радикальная перестройка структуры CV (новая секция, смена нарратива) → сперва до→после Антону (§2.2), потом конвейер.