Vacancy study
Tailored interview prep — turns a job description and resume into hands-on labs, prep file, 2-min self-intro, theory cheatsheet, and one-liner Q&A. A Claude Agent Skill. Works in Claude Code, Cowork, and Claude.ai. Multilingual.
npx -y skills add veeskelad/vacancy-study --skill vacancy-studyAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Prepares a candidate for a technical interview against a specific job posting. Accepts the user's resume in any format (PDF / docx / md / txt / direct text / URL to LinkedIn / HH.ru / habr.com/career) and a job description, then generates a tailored study kit — hands-on labs (theory + practice) with platform-specific commands (macOS / Linux / WSL), an interview prep file with a 2-minute "tell me about yourself", a theory cheatsheet, and one-liner Q&A. Works in Claude Code, Cowork, and Claude.ai. Activate when the user pastes a job description, attaches a resume file, says "prepare me for the interview", "adapt the labs for this JD", "study this vacancy", "make theory for this role", "help me with the interview", or invokes /vacancy-study.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
16.1 KB, ~3.7k tokens by cl100k_base, as published. Nobody here has run it
vacancy-study — Tailor labs and prep materials to a specific job posting
This skill turns a pair of inputs — the user's resume + a job description — into a personalised interview preparation kit:
- Hands-on labs (theory + step-by-step practice) for each gap topic from the JD
- A
prepfile with a 2-minute "tell me about yourself", JD-to-experience mapping, top-10 questions with answer skeletons, STAR+R stories, weak spots with preventive answers, and questions to ask the company - A
THEORY-CHEATSHEET.mdto skim on the morning of the interview - A
QUICKQA.mdwith one-liner Q&A for the battle phase right before the call
The skill is universal — it works for any role family (DevOps / SRE, AI / ML / MLOps, Backend, Frontend, Data, Mobile, mixed), in any language, and adapts shell commands to the platform the user will run them on.
Communication language
Detect the user's language from their first message and respond in the same language. This applies to all conversational output — questions, summaries, status updates.
- Inside generated artefacts (theory, labs, prep file, cheatsheets), match the language of the resume + JD. If the JD is in Russian and the resume is in English, ask the user which language to use for the artefacts.
- Code, file names, and technical identifiers stay in their original form (no transliteration).
- For Russian and other languages with diacritics — preserve all accents and special characters (ё, й, ñ, ü, etc).
If the user explicitly switches languages mid-conversation, follow them.
When to use
- The user provides a JD (text, URL, or path to a file) and asks for interview prep
- The user attaches a resume in any format (PDF / docx / txt / md / direct text / URL)
- The user says "adapt the labs to this vacancy", "make theory for this JD", "prepare me for the interview at X", or invokes
/vacancy-study - The user mentions an upcoming interview date with a specific company and needs materials
What NOT to do
- Never invent experience the user doesn't have. The resume from step 1 is the only source of truth.
- Don't claim familiarity with tools the user has not touched. If a tool from the JD is missing from the resume, mark it as a gap and write a preventive answer ("haven't used in production, ran a lab yesterday — happy to explain the concept and trade-offs").
- Don't assume specific file names or project structure — probe and adapt to whatever the project layout is.
- Don't score the fit of the vacancy or recommend whether to apply — that's a different concern.
Execution environments
This skill runs across three Claude surfaces. The logic differs slightly:
| Surface | Filesystem | Resume intake | Output location |
|---|---|---|---|
| Claude Code (local) | Full project access | Search standard locations first, ask if nothing found | Write to project files |
| Cowork | Sandboxed filesystem | Ask the user to upload or paste | Write to the working directory |
| Claude.ai (web/desktop) | Limited (unless a filesystem MCP is connected) | Ask for attachment or pasted text | Return artefacts as conversation files; persist to filesystem if MCP is available |
Detect the surface by checking available tools — if Read / Write exist, treat the environment as Code or Cowork; otherwise treat it as Claude.ai.
Workflow
Step 0 — Detect the user's platform
Needed once, so that lab commands use the right package manager (brew install vs apt install vs dnf install).
- If a platform record file already exists in the project (e.g.
<area>-labs/PLATFORM.mdor.vacancy-study/platform.txt) — read it. - Otherwise, try
unameon Claude Code if available. - Otherwise, ask once:
"Which OS will you run the labs on? macOS / Linux (Debian/Ubuntu) / Linux (RHEL/Fedora) / WSL?"
Remember the choice for the session. If a filesystem is available, persist it to a one-line file (darwin / linux-debian / linux-rhel / linux-arch / wsl) so the question doesn't repeat.
Full platform adaptation details → references/platform-adaptation.md.
Step 1 — Collect the resume / profile
This is the critical step. Without an accurate picture of the user's experience, the skill becomes a template generator.
Algorithm:
-
Look for an existing resume (only if a filesystem is available):
- Probe standard names:
cv.md,resume.md,profile.md,about.md - Also check the home directory:
~/cv.md,~/resume.md,~/.career-ops/resume.md - Look for any
*career*.md,*resume*.md,*profile*.mdin the project root - Ask the user too: "Do you have a resume somewhere in this project or on disk? If yes, tell me the path."
- Probe standard names:
-
If a file is found:
- Read it
- Compare
mtimeto today, and ask:< 30 days: "I found your resume at<path>(updated<date>). Using it as-is. Tell me if anything new isn't in there yet."30–180 days: "I found<path>(updated<date>). Anything added in the last couple of months — new projects, technologies, role change?"> 180 days: "I found<path>(updated<date>— getting old). What's changed since then?"
-
If no file (or the surface has no filesystem):
Say to the user:
"To make the prep honest, I need your resume. You can:
- Attach a file (PDF / docx / txt / md) — I'll read it
- Paste the text directly in chat
- Give me a URL (LinkedIn / HH.ru / habr.com/career / GitHub / personal site)
- Or just tell me about yourself — I'll ask clarifying questions"
Handle each format:
- PDF / docx → use the
pdf/docxskills if available, otherwise ask for paste/markdown - txt / md → read directly
- URL →
WebFetchif accessible, otherwise ask the user to export and paste - Free-form story → start asking clarifying questions
-
Clarifying questions (after the first pass): Read what you have → identify gaps → ask 3–5 short questions relevant to this JD. Don't run a long survey without reason. See references/clarifying-questions.md.
-
Persist the understanding (optional, only with filesystem and explicit consent):
- If the resume came as a free-form story → offer to save it as
resume.mdin the project so the user doesn't have to retell it next time. - If the resume was updated → offer to append a
## Recent updatessection with today's date, never silently overwrite. - On Claude.ai without filesystem the resume lives only in conversation context — that's fine.
- If the resume came as a free-form story → offer to save it as
Full intake rules → references/resume-intake.md.
Step 2 — Receive the JD and metadata
If the JD wasn't included, ask. Frequently the user sends the resume + JD in one message — parse both at once.
Capture:
- The JD body (responsibilities, requirements, "nice to have")
- The company name
- The interview date if known (used in the prep file name)
- The interview format if known (technical / HR / system design / live coding / take-home)
If no date is provided, use today's date from the system context.
Step 3 — Classify the role
Pattern-match the JD against keyword clusters:
| Cluster | Keywords (non-exhaustive) |
|---|---|
| DevOps / SRE / Platform | Kubernetes, Docker, Ansible, Terraform, GitLab CI, GitHub Actions, Prometheus, observability, on-call, infrastructure |
| AI / ML / MLOps | LLM, agents, prompts, RAG, embeddings, LangGraph, vector DB, GPU inference, MLflow, model serving |
| AI Engineer / AI Architect | AI products, LLM in production, MCP, AI tooling, agent orchestration |
| Backend | REST / GraphQL APIs, microservices, databases, queues, backend languages |
| Frontend | React / Vue / Svelte, TypeScript, SSR, design systems, accessibility |
| Data Engineering / Analytics | ETL, Airflow, Spark, Snowflake, dbt, BI, warehouse SQL |
| Mobile | iOS / Swift, Android / Kotlin, React Native, Flutter |
| Mixed | two clusters strongly represented |
If the JD is ambiguous, ask the user — never guess silently.
Step 4 — Extract topics from the JD
Pull a list of technologies and competencies from "responsibilities", "requirements", and "nice to have" sections. Group related items (e.g. multistage + BuildKit + Buildah + Kaniko → "Docker builders") so labs don't fragment.
Step 5 — Cross-reference existing materials
If a filesystem is available, look for prior lab directories in the project:
<role>-labs/(devops-labs/,ai-labs/,backend-labs/, …) — labs and theorylabs/,practice/labs/,interview-prep/labs/— alternative locationsinterview-prep/— past prep filesnotes/,learning/— long-form notes
Match each topic from step 4 to one of three states:
- Full lab already exists → reuse, link from the prep file
- Theory exists, lab missing → add only the lab
- Nothing yet → create both theory and lab
On Claude.ai without filesystem, skip this step.
Step 6 — Resume gap analysis
Compare JD topics against the resume from step 1:
- Topic + production experience → strength, mapped in the prep file with concrete project references
- Topic missing from the resume → gap, with a preventive honest answer ready
- Topic in "nice to have" → separate bucket, not critical
Step 7 — Generate the missing labs
Choose the target directory <area>-labs/:
- If the project already has a structure, reuse it
- Otherwise create
devops-labs/,ai-labs/,backend-labs/, etc. matching the role family - For mixed roles, distribute labs by topic (Docker → devops-labs, LangGraph → ai-labs)
For each gap topic:
<area>-labs/theory/NN-topic.md— five-section theory write-up (see references/lab-format.md)<area>-labs/labs/labNN-topic/README.md+ supporting files (Dockerfile, yaml, scripts)
Lab commands adapt to the platform detected in step 0. For example, Buildah:
- macOS → Lima VM or a Docker-based wrapper
- Linux Debian/Ubuntu →
apt install buildah, native - Linux RHEL/Fedora →
dnf install buildah, native - WSL → like Linux Debian/Ubuntu with caveats
Full adaptation table → references/platform-adaptation.md.
Parallelisation: if the environment supports subagents (Claude Code / Cowork) and more than three new labs are needed, delegate one topic per subagent in parallel with strict constraints and a reference example.
Step 8 — Generate the prep file
Path: interview-prep/<vacancy-slug>-<YYYY-MM-DD>.md (or whichever directory the project uses for prep notes — e.g. prep/, interviews/).
Contents (full format in references/prep-format.md):
- TL;DR of the company — 2–3 paragraphs
- 2-minute "tell me about yourself" — see references/tell-me-about-yourself.md
- JD → experience mapping — table linking each requirement to a concrete project from the resume
- Top-10 likely questions — each with a 3–5 point answer skeleton
- 2–3 STAR+R stories — pulled from the resume or from a project-local
story-bank.mdif it exists - Weak spots — preventive answers for gaps from step 6
- 5 questions to ask the company
- Morning-of checklist
Step 9 — Theory cheatsheet and one-liner Q&A
In <area>-labs/:
THEORY-CHEATSHEET.md— add a compressed summary for the new topics. Create the file if it doesn't exist.QUICKQA.md— add one-liner Q&A for the new topics. Create the file if it doesn't exist.
Format details → references/cheatsheet-quickqa-format.md.
Step 10 — Report back
Short summary at the end:
- What was reused (links to existing labs)
- What was newly created (file list)
- Where the prep file lives
- Reading order: theory → lab → cheatsheet → quickqa → prep
- Platform used for lab commands
Principles
- The resume is the foundation. Without an accurate picture of the user's experience, the skill produces template content. Step 1 is mandatory.
- Be universal. Don't assume specific file names or directory structures — probe and adapt.
- Don't duplicate. If a topic already exists in the project, reuse it.
- Theory completeness. Every theory file has the same five sections (what/why, key concepts, architecture, trade-offs, production pitfalls). Tone is "personal note" — no marketing, no "this powerful tool".
- Commands must run. Lab commands are tailored to the user's platform from step 0.
- Every lab ends with 5 talking points ready to drop into the interview.
- The "tell me about yourself" must cover the full delivery cycle: architecture → development → testing → deployment → observability/operations. Never invent experience.
- The source of truth for experience is the resume collected in step 1. If multiple resume files exist with conflicts, ask the user which one is current — don't silently pick one.
Output structure summary
<role>-labs/ # devops-labs/, ai-labs/, backend-labs/, etc
├── PLATFORM.md # platform record (first run only)
├── theory/NN-newtopic.md # if gap
├── labs/labNN-newtopic/ # if gap
│ └── README.md + supporting files # commands tailored to platform
├── THEORY-CHEATSHEET.md # updated or created
└── QUICKQA.md # updated or created
interview-prep/ # or whichever directory the project uses
└── <vacancy-slug>-<YYYY-MM-DD>.md # new prep file
resume.md # optional — only if the resume was new and the user consented
Reference index
| Reference | When to read |
|---|---|
| references/resume-intake.md | Step 1 — receiving a resume in any format across platforms |
| references/clarifying-questions.md | Step 1 — follow-up questions to fill gaps in the resume |
| references/platform-adaptation.md | Steps 0 and 7 — adapting lab commands to macOS / Linux / WSL |
| references/lab-format.md | Step 7 — theory + lab structure |
| references/prep-format.md | Step 8 — prep file structure |
| references/tell-me-about-yourself.md | Step 8 — the 2-minute self-introduction |
| references/cheatsheet-quickqa-format.md | Step 9 — cheatsheet and one-liner Q&A format |
Future extensions
- Mock interview mode — drill the user with random questions from QUICKQA
- Company research — short investigation of the product, stack on job boards, recent news
- Post-interview capture — record what was actually asked and append to QUICKQA so the kit gets sharper each cycle
- Resume auto-update — after the interview, offer to record any new projects/technologies the user mentioned, with explicit consent
Gives 0 of the 12 instructions most pdf office docs skills give in ~3.7k tokens
Counted across 635 of the 690 authors here whose files we hold, read 2026-08-06
- extract text using pdfplumberin 92 of 635, across 25 files
- create PDFs using reportlabin 83 of 635, across 16 files
- read FORMS.md to fill out PDF formsin 80 of 635, across 13 files
- OCR scanned PDFs using pytesseractin 77 of 635, across 10 files
- merge or split PDFs using qpdfin 70 of 635, across 3 files
- use Excel formulas instead of hardcoded calculated valuesin 68 of 635, across 12 files
- unpack edit xml and repack existing documentsin 63 of 635, across 8 files
- document sources for hardcoded valuesin 61 of 635, across 9 files
- write minimal python code without unnecessary commentsin 59 of 635, across 7 files
- run the recalculation script after adding or modifying formulasin 58 of 635, across 6 files
- fix all identified formula errors and recalculatein 58 of 635, across 6 files
- format years as text stringsin 57 of 635, across 5 files
Said here and by no other author read
- detect the user language and respond in that language
- persist the user operating system choice to a file
- search standard filesystem locations for an existing resume
- ask clarifying questions to fill resume gaps
- classify the job description role family
- extract technologies and competencies from the job description
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.