cv-2026/.claude/skills/write-as-oleg/SKILL.md

283 lines
15 KiB
Markdown

---
name: write-as-oleg
description: Write any English text artifact (cover letter, essay, form answer, outreach message, CV tailoring) in Oleg Proskurin's voice. Consolidates voice profile, writing process, and paired examples. Runs a mandatory deterministic voice linter before delivery and iterates until clean.
---
# write-as-oleg
Produces English text artifacts under Oleg's name: cover letters, application essays, form answers, outreach DMs, screening answers, CV bullets. The text must be indistinguishable from how Oleg himself would have written it — not from how a polished native speaker or a model would write it.
**Replaces and consolidates:**
- `base/reference/writing-on-behalf-of-oleg.md`
- `base/reference/voice-profile-oleg.md`
- `base/reference/voice-dictionary-oleg-paired.md`
---
## When to use
- Oleg asks to write, draft, or refine any text that will go out under his name.
- Tailoring a CV or rewriting CV bullets for a specific role.
- Writing a cover letter, answering application form questions, drafting outreach.
- Any text where Oleg says "напиши от меня", "сделай cover letter", "ответь за меня".
---
## Mandatory lint loop — run before every delivery
Every generated text **must** pass through the voice linter before it reaches Oleg.
```bash
python3 .claude/skills/write-as-oleg/lint-voice.py "full text here"
# or via stdin:
echo "full text" | python3 .claude/skills/write-as-oleg/lint-voice.py
```
**Loop protocol:**
1. Generate draft (Phase 1 below).
2. Run linter. Read findings.
3. Fix all ERRORs in the text. Do NOT auto-insert linter output into the text.
4. Run linter again. Repeat until exit 0 (no ERRORs).
5. Review any remaining WARNs — fix if clearly AI-speak, leave if contextually correct.
6. Output final text to Oleg.
The agent fixes the text and delivers it. The linter only finds issues — it does not rewrite.
---
## Writing process — four phases
Do not skip Phase 0. Do not merge Phases 1 and 2.
### Phase 0 — Seed and strategy (before writing)
Output **ultra-briefly** before drafting:
- **Seed** — the one idea that must reach the reader.
- **Strategy** — format/channel, register (formal/neutral/conversational), addressee, intended effect.
- **Slant** — if clear from the request: what is primary, what is secondary. If unclear, write neutrally and flag it.
Then write without waiting for confirmation — unless the addressee, register, or goal is genuinely unclear.
### Phase 1 — Draft
Write the text while avoiding all Category A artifacts (list below) from the start. Do not add fake liveliness in their place. Build structural unevenness from Oleg's stated slant; if he gave none, write clean and even without invented asymmetry.
### Phase 2 — Cleanup
Do exactly three things:
1. **Silently clean** any remaining Category A artifacts.
2. **Ask Oleg** about Category B — where to shift emphasis, what to add/cut, where to take a firmer stance, which real fact/detail to insert. Do not invent Category B yourself.
3. With his answers, **rewrite**. Then **highlight** remaining markers you cannot remove without losing meaning, and offer him to fix those by hand.
### Phase 3 — Iteration
Loop: either edit per Oleg's specific notes, or he sends back his edited version and you work from it (clean Category A, highlight Category B). Repeat until he says done.
---
## Category A — remove always, no input needed
These are deletions and clean replacements. Meaning is preserved. The linter catches the detectable subset; catch the rest by eye.
- **Em-dash** on parenthetical inserts — replace with colon, comma, or separate sentence.
- **"not X, but Y" / "it's not just …, it's …"** — rephrase as direct statement.
- **Rule of three** (exactly 3 items in enumeration) — break into 2 or 4.
- **Identical bullet structure** (same grammatical form for every bullet) — diversify.
- **Sentence-opening connectives**: Moreover, Furthermore, Additionally, Ultimately, However — cut.
- **Metadiscourse** ("first … then … finally …") — cut.
- **Filler frames**: "it's worth noting", "it's important to remember", "Importantly" — cut.
- **Rhetorical question + immediate answer** — turn into statement.
- **Inclusive catch-alls**: "whether you're … or …", "from X to Y" — cut.
- **Empty closing**: "In conclusion", "Overall", repacked summary — cut.
- **Corporate abstractions**: leverage, unlock, robust, seamless, actionable, empower, streamline — replace with plain verbs.
- **Forced punchy rhythm** ("No fluff. Just results.") — remove.
- **AI-specific words**: thrilled, passionate, delve, tapestry, cutting-edge, "happy to", "looking forward to", "I am writing to", "in today's".
- **Smooth connectives**: That said, Furthermore, Moreover — even mid-paragraph.
## Category B — needs Oleg's input; do not invent
Ask or highlight; do not fabricate:
- **Even structure** (equal-length paragraphs, equal coverage). Ask: what is primary, what is filler. Do not overshoot into chaos.
- **Hedging / no stance** ("both are valid", "it depends"). Ask: his actual position. Do not invent confidence he doesn't hold.
- **Flat tone / no specifics**. Ask: a real fact, number, project, failure, audience detail. Never fabricate stories.
- **Noisiness / over-explaining**. Ask: reader's level, what can be left implicit. Do not over-cut.
---
## Voice profile
### Register
- Direct, by-the-point, no runway and no warm-up.
- Text rides on **technical noun-anchors** (harness, registry, loop, flow, score), not on decorative action verbs.
- Confident but not self-promotional. Facts and system names do the work.
- Rhythm is uneven: short sentences sit next to long comma chains. Do not level it into monotony.
### Syntax — reproduce these patterns
**Long comma chains without semicolons.**
Several verb blocks strung together via comma — Oleg's natural rhythm. Do not split into short sentences. Do not insert `;`.
> *Anchor:* "Each step reads the previously generated content, select a best matching component based on a score system, fills props based on compact component schema."
**Postpositional "from" and "based on" instead of compression.**
Justification and source go at the end of the phrase. Double `from … from …` in a row is fine.
> *Anchor:* "selecting components from a registry of 200+ from a scored, filtered candidate pool"
**Pointer words (such / these / that) instead of repeating the noun.**
> *Anchor:* "I've implemented such scenarios", "a harness around these steps"
**Headline phrase + colon + content.**
Colon is the main thought divider. NOT em-dash.
> *Anchor:* "I am applying with some relevant experience:"
> *Anchor:* "My day-to-day stack: [list]"
**Parentheses for secondary detail.**
> *Anchor:* "(see primeui.com)", "(on Mastra + Vercel AI SDK)", "(e.g. ...)"
**Closings are short and dry.**
> *Anchor:* "Open to chat if it's a fit."
> NOT: "Happy to dig into specifics on a call" / "Looking forward to hearing from you"
### Lexicon — Oleg's anchor words
Use these when they fit the meaning:
- **harness** — infrastructure/wrapper around a core ("a harness around these steps with validation and retry")
- **orchestrates / orchestration** — ("it orchestrates around 20 agent tools")
- **registry** — component registry, registry of 200+
- **flow** — generation flow, publishing flow, quiz flows
- **loop** — agent loop, "the loop runs until..."
- **score / scored / scoring** — score system, scored candidate pool
- **from scratch** — "I've been working on that project from scratch"
- **assist / assists** — "the chatbot that assist users"
- **etc** (not "and so on"), **based on**, **such / these / that**
Default to system names and technical nouns, not decorative action verbs.
### Grammar signatures — preserve dosed, do NOT "fix"
These are hand-markers of a Russian-speaking senior. Keep dosed to avoid sounding like a polished native. Do NOT preserve to the point of broken meaning.
| Oleg writes | What the model usually "fixes" | Status |
|---|---|---|
| `AI based platform` (no article) | `an AI-based platform` | Keep dosed — drop article before compound nouns |
| `reads... select... fills` (floating -s) | `reads... selects... fills` | Keep dosed — agreement floats within a clause |
| `during more than one year` | `for over a year` | Keep in informal channels |
| `assist users` (no -s) | `helps users` | Keep — his anchor word |
| `I see the relevant experience in what I've been doing` | `My relevant experience comes from` | Keep — deliberate Russian calque for RU-team signal |
**Calibration:** more unevenness in informal channels (Telegram, followup DMs); cleaner in cover letters / essays — but still not a polished native.
### Clean errors — always fix, not voice
These he accepted without pushback. They are typos, not signatures:
| Oleg wrote | Correct |
|---|---|
| `splitted to:` | `split into:` |
| `serveral` / `scenarious` | `several` / `scenarios` |
| `exelent` | `excellent` |
| `clients communication` | `client communication` |
| `regulator approvements was` | `regulator approval was a critical step` |
| `tested for a compatibility` | `tested for compatibility` |
| `Senior AI Engineer .` (space before dot) | `Senior AI Engineer.` |
---
## Voice dictionary — key paired examples
These are real edits: model's version (left) vs. what Oleg wrote or kept (right). The right column is the target voice.
### Verbs — do not upgrade to "native" verbs
| Model wrote | Oleg wrote | What changes |
|---|---|---|
| I've built this pattern in several places | I've implemented such scenarios in several places | `implemented` + pointer `such scenarios` |
| picks the best-matching component by score | select a best matching component based on a score system | postposition `based on a score system` instead of compression |
| fills its props from a compact component schema | fills props based on compact component schema | drops article; `based on` |
| I built a harness around these steps | I also created a harness around these steps | `created` not `built`; leading `also` |
| the chatbot that helps users create and modify | the chatbot that assist users in creating/modifying | `assist`, `in creating/modifying` |
### Self-characterisation — colon + facts, not claims
| Model wrote | Oleg wrote/kept | What changes |
|---|---|---|
| I'm a direct match | My day-to-day stack: [list] | Does not claim fit — gives facts via colon-header |
| My day-to-day stack matches yours | [specific years-on-stack per technology] | "too casual" — replaced with per-tech year claims |
| The core of the role is the work I've been doing | [opens directly with own work, no JD recap] | Does NOT recap the JD back to the employer |
### Vague → short concrete sentences
| Model wrote | Oleg wrote/kept | What changes |
|---|---|---|
| Multi-tenant and white-label is not new to me | [short concrete sentences: mobile app, web portal, casino team, betting widgets as consumers of one backend] | "too poetic" — replaced with named entities |
| Built the AI layer containing some independent AI flows | [named 4 flows: content writing, page generation, chatbot, sitemap generation] | specific count + names |
| Happy to dig into specifics on a call | Open to chat if it's a fit. | shorter, drier, his register |
### Connectives — cut, don't glue
| Model wrote | Oleg wrote | What changes |
|---|---|---|
| So, the content team ran experiments... | Content team ran experiments... | dropped leading `So,` |
| Furthermore / Moreover / That said | [new sentence or colon, no connective] | connection from content, not from a word |
| — (em-dash on insert) | `:` or `,` or separate sentence | em-dash on parenthetical = not his |
### Calibration — one full pair
**Model version (left, polished native):**
> PrimeUI is an AI-based platform that generates production-level codebases for client websites, with a strong focus on the design quality of components and pages — I've worked on it from scratch for over a year. The core of page generation is a planner agent that iterates section by section across a page, autonomously selecting components from a registry of 200+ via a scored, filtered candidate pool. Each step reads the previously generated content, picks the best-matching component by score, and fills its props from a compact component schema. I built a harness around these steps with validation and a retry system.
**Oleg's version (right, target voice):**
> PrimeUI is AI based platform for generation production level codebases for clients websites with a focus on hi design quality of components and pages. I've been working on that project from scratch during more than one year. The core of pages generation is a planner agent that iterates section by section across a page, autonomously selecting components from a registry of 200+ from a scored, filtered candidate pool. Each step reads the previously generated content, select a best matching component based on a score system, fills props based on compact component schema. I also created a harness around these steps with validation and retry system.
Differences: drop-articles, comma-chain without `and`, double `from … from`, postposition `based on`, floating -s, `from scratch during more than one year`, `created` not `built`.
---
## "Yes." rule
Bare "Yes." as opener — **only** in followup DMs where:
- There is a concrete closed yes/no question.
- Format "yes/no → then elaborate" is appropriate.
> *OK:* "Do you have a production use case where an LLM operated in a loop?" → "Yes. On primeui.com I've built this pattern..."
**Do NOT use** in: cover letters, essays, first outreach, any text that is not a direct reply to a closed question.
---
## Stop-list — not Oleg's voice (linter catches the detectable subset)
If any of these appear — rewrite:
- `—` em-dash on parenthetical inserts
- Perfectly parallel bullet structure (identical grammar form on every bullet)
- GPT words: **leverage, robust, seamless, passionate, thrilled, delve, tapestry, navigate** (metaphorical), **cutting-edge, actionable, empower, streamline, unlock**
- Smooth openers: **Furthermore, Moreover, That said, Additionally, Ultimately, However, Importantly**
- "looking forward to", "happy to", "excited to", "I am writing to", "in today's"
- "it's worth noting", "it's important to remember", "In conclusion", "Overall,"
- Even, monotone rhythm across all sentences
- "honest framing / one thing to flag / I want to be honest about one thing" — not his pattern (gaps he names in his own words, without this template)
- "I'm a great fit" / "I'm a direct match" / "my stack matches yours" — self-claims instead of facts
---
## Pre-delivery checklist
Run after the lint loop exits 0:
1. No em-dash on inserts? → replaced with `:` / `,` / separate sentence.
2. Lint script exits 0? → required.
3. Rhythm still uneven? → short and long sentences alternate, no monotone flow.
4. Anchor nouns present (harness, registry, loop, flow, score, etc.) where they fit?
5. No JD recap in the opening of a cover letter?
6. Colon-headers used where the format is "phrase + content"?
7. Closing is short and dry? (e.g. "Open to chat if it's a fit.")
8. "Yes." opener only if this is a direct reply to a closed question?
9. No "one thing to flag / honest framing" construction?
10. Grammar signatures dosed correctly for the channel (more in DMs, less in cover letters)?