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

15 KiB

name description
write-as-oleg 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.

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)?