---
id: TASK-44
title: 'Cover letter: шаблон дизайна + генерация PDF из единого источника'
status: Done
assignee:
  - '@assistant'
created_date: '2026-09-12 18:28'
updated_date: '2026-09-12 18:36'
labels: []
dependencies: []
references:
  - profile/cv.yaml
  - profile/cv-build.py
  - profile/build-western-cv-pdf.sh
  - applications/runware/cover-letter.md
priority: high
type: feature
ordinal: 44000
---

## Description

<!-- SECTION:DESCRIPTION:BEGIN -->
Сделать переиспользуемую инфраструктуру сопроводительного письма (cover letter) в едином визуальном стиле с master-резюме: премиальный минималистичный «инженерный» документ A4, один акцентный цвет, без иконок/карточек/сайдбаров.

По аналогии с резюме (cv.yaml -> cv-build.py -> build-western-cv-pdf.sh): данные письма хранятся в профиле/cover-letter.yaml, генератор рендерит HTML (печатная вёрстка) и Markdown (плоский текст для вставки в формы откликов), скрипт сборки рендерит PDF в /mnt/storage/inbox через Playwright.

Позиционирование: Senior Backend Engineer, Ruby/Rails, distributed systems. Текст письма — редактируемая база, поля под каждую вакансию (адресат, subject, параграфы).
<!-- SECTION:DESCRIPTION:END -->

## Acceptance Criteria
<!-- AC:BEGIN -->
- [x] #1 profile/cover-letter.yaml — единственный источник данных (sender, recipient, subject, salutation, paragraphs, highlight, footer, accent)
- [x] #2 profile/cover-letter-build.py рендерит cover-letter.html и cover-letter.md; python3 ... --check возвращает ненулевой код при расхождении
- [x] #3 bash profile/build-cover-letter-pdf.sh собирает PDF в /mnt/storage/inbox с таймстемпом в имени + стабильную копию cover-letter.pdf
- [x] #4 Дизайн по ТЗ: A4, поля ~60-70px, колонка ~670px, Inter, акцент один (#DC2020), name 28-32px, title 20-24px, body 15-16px/1.5-1.6
- [x] #5 Ровно один сдержанный блок What I bring; в вёрстке нет иконок, skill-bar, карточек, сайдбаров, тяжёлых красных плашек
- [x] #6 Текст письма (4-5 коротких абзацев + highlight) умещается на одну страницу A4
- [x] #7 README/AGENTS.md описывают, как править cover-letter.yaml и собирать PDF/текст
<!-- AC:END -->

## Implementation Plan

<!-- SECTION:PLAN:BEGIN -->
1. Изучить master-резюме (cv.yaml/cv-build.py/build-western-cv-pdf.sh) и взять ту же схему: YAML -> HTML+MD -> PDF через Playwright.
2. Подключить шрифт Inter (локальный assets/fonts) для премиальной типографики, fallback на системные sans.
3. Написать profile/cover-letter.yaml: sender/contacts, recipient, date, subject, salutation, 5 абзацев, highlight «What I bring», footer descriptor, accent (#DC2020).
4. Написать profile/cover-letter-build.py: печатная вёрстка A4 по ТЗ (поля ~64px, колонка ~670px, name 30px, title 22px, body 15.5px/1.55, один акцент, hairline-разделители, без карточек/иконок), Markdown-зеркало для форм откликов, режим --check.
5. Написать profile/build-cover-letter-pdf.sh по образцу резюме: сборка + инжект build-stamp в HTML-комментарий + PDF в /mnt/storage/inbox (таймстемп + stable copy).
6. Собрать PDF, проверить ровно 1 страницу (pdftotext/pdfinfo), глазами проверить вёрстку (рендер в PNG/inbox preview).
7. Обновить AGENTS.md (структура + статус) и добавить короткий профиль/README по cover letter.
<!-- SECTION:PLAN:END -->

## Implementation Notes

<!-- SECTION:NOTES:BEGIN -->
Validation: python3 profile/cover-letter-verify.py — 12/12 PASS (Inter loaded, name 30px, title 22px, body 15.5px/1.52, side padding 65px, one accent #DC2020, one highlight block, 5 paragraphs, one A4 page, footer pinned). PDF page count via ghostscript = 1. Pixel check (gs 150dpi -> raw RGB): 92% white page, accent ~0.08% of pixels in exactly 2 zones (header rule segment + highlight). First real use: GitLab cover letter (applications/gitlab) renders 1 page.
<!-- SECTION:NOTES:END -->

## Final Summary

<!-- SECTION:FINAL_SUMMARY:BEGIN -->
Added a reusable cover-letter pipeline mirroring the master-CV setup: profile/cover-letter.yaml (single source) -> profile/cover-letter-build.py (HTML print layout + Markdown mirror, --check mode, {{placeholder}} substitution, YAML ': ' guard) -> profile/build-cover-letter-pdf.sh (Playwright PDF into /mnt/storage/inbox with timestamp + stable copy). Design per brief: A4, 65px margins, Inter (vendored in profile/assets/fonts, OFL), one #DC2020 accent used only for the header rule + highlight label (borders, not backgrounds, so it survives print without printBackground), restrained What I bring block, no cards/icons/sidebars. Added profile/cover-letter-verify.py for design + one-page regression checks. Verified: 12/12 checks pass, ghostscript reports 1 page, pixel analysis confirms ~92% white + accent in exactly 2 zones. Documented in AGENTS.md. Tailored first application letter for GitLab (applications/gitlab).
<!-- SECTION:FINAL_SUMMARY:END -->
