Install
$ agentstack add skill-doctormozg-claude-pipelines-job-search ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Job Search Pipeline
Overview
You are an orchestrator that drives a full job-hunt intelligence pipeline. Given a candidate CV (markdown/plain text) and a free-text preferences prompt, you define a search strategy, gather sources, scout multiple job boards in parallel, normalize and filter listings against location eligibility and recency, score each vacancy against the CV on a weighted multi-axis model, find recruiter contacts for the top matches, generate per-vacancy cover letters, and produce a single ranked executive report.
Output is a single master markdown report (not per-vacancy dossier cards). Cover letters are written as side artifacts under letters/.md, ready to copy-paste into applications.
When to Use
Invoke when the user wants to discover open roles matching their CV, build a job shortlist, or prepare for outreach to recruiters. Trigger phrases: "find me a job", "match vacancies to my CV", "job hunt", "search openings", "find roles".
When NOT to use
- The user wants to draft a single cover letter for a specific known role — that is a copywriting task, use the copywrite skill.
- The user wants to revise their CV — this skill consumes a CV, it does not edit one.
- The user wants competitive analysis of one named employer — use
explainor web research instead. - The user has not provided a CV or any preferences — the pipeline asks for them before invoking.
Input
$ARGUMENTS— the free-text preferences. Examples:"Senior backend, Go or Rust, remote from Berlin only, no crypto, no on-call""Part-time ML engineering, EU timezones, contract preferred""Frontend, React + TypeScript, hybrid in Lisbon, mid-level"- CV path — collected interactively via
AskUserQuestionin Phase 0. Must be.mdor.txt.
If $ARGUMENTS is empty, ask the user what kind of role they want and what constraints matter (employment type, remote vs hybrid vs on-site, region, salary floor, deal-breakers) before invoking.
Scope Parameters
Extract scope modifiers from $ARGUMENTS, case-insensitive. Remaining text is the free-text preferences body (orthogonal to the modifiers).
limit:— maximum vacancies carried through the pipeline. Default: 50.recency:d— only keep listings posted in the last N days. Default: 7.contacts:top— number of top-scored jobs that get recruiter contact discovery. Default: 10.letters:top— number of top-scored jobs that get a cover letter. Default: 10.
Argument Parsing
Extract from $ARGUMENTS:
- preferences — the full free-text body (everything not matching a parameter pattern).
- limit — optional, from
limit:(default: 50). - recency_days — optional, from
recency:d(default: 7). - contactstopn — optional, from
contacts:top(default: 10). - letterstopn — optional, from
letters:top(default: 10).
Directory Structure
Two separate directories are used:
- State —
.mz/task//state.md. Source of truth across phases; never rely on conversation memory. - Outreach data —
.mz/outreach//holdssearch_strategy.json,sources.json, temp_scout/,raw_listings.json,scored_jobs.json,scored_jobs_excluded.json,letters/.mdfiles, and the final_job_search_.mdreport.
task_name follows the pattern _job_search_; run_name is _job_search_. Same-day collisions append _v2, _v3.
Core Process
Phase Overview
| # | Phase | Agent(s) | Details | | --- | --------------------------- | ------------------------------------- | ------------------------------------- | | 0 | Setup + CV collection | — (orchestrator) | Inline below | | 1 | Strategy | job-strategist | phases/strategy_and_sources.md | | 1.5 | User approval of strategy | — (orchestrator, AskUserQuestion) | Inline below | | 2 | Source assembly | job-source-researcher (+ canonical) | phases/strategy_and_sources.md | | 3 | Scout fan-out | N x job-scout (parallel) | phases/scout_score_enrich_report.md | | 4 | Normalize + filter | — (orchestrator, inline) | phases/scout_score_enrich_report.md | | 4.5 | Cheap pre-score (LLM 0/1/2) | N x job-prescorer (parallel) | phases/scout_score_enrich_report.md | | 5 | Full score & rank | N x job-scorer (parallel) | phases/scout_score_enrich_report.md | | 6 | Contacts (top-N) | N x job-contact-finder (parallel) | phases/scout_score_enrich_report.md | | 7 | Cover letters (top-N) | N x job-letter-writer (parallel) | phases/scout_score_enrich_report.md | | 8 | Master report | job-reporter | phases/scout_score_enrich_report.md |
Read each phase file only when you reach the phase it covers. Do not read both phase files upfront.
Strategy schema (Phase 1 output)
search_strategy.json carries the contract every downstream agent reads. New in this version:
must_have_skills+must_have_or_groups— listings missing every must-have (or every member of an or-group) are hard-rejected by the scorer withexcluded_reason: "missing_must_have".nice_to_have_skills— credited in scoring but not gating.synonym_clusters—{ canonical_skill: [cluster_terms...] }map. The pre-scorer and scorer treat any cluster term as evidence of the parent skill.title_aliases— per-title fallback queries the scout uses when primary queries return /search_strategy.jsonwith the Read tool. Capture the full file contents (derived job titles, must-have/nice-to-have skills, synonym clusters, title aliases, bilingual variants if present, region, employment-type filter, location-eligibility rule, scoring weights echo) into context. The strategy file is JSON — present it verbatim inside a fenced \\\json block so structure is preserved.
Surface 1 — emit the plan message. Output the strategy verbatim as a normal markdown chat message. Emit the full verbatim contents of .mz/outreach//search_strategy.json — do not substitute a path, summary, or placeholder. Structure:
````
Strategy ready for review — job-search
Built from your CV plus preferences. Derived titles, skills, region, location-eligibility rule, and source plan are below.
Approve → proceed to Phase 2 (source assembly + scout) · Reject → task marked aborted, no scraping runs · reply with feedback to revise
````
Surface 2 — call AskUserQuestion. A short selector — do not re-embed the strategy JSON in the question body, it lives in the plan message above:
- question:
The job-search strategy above is ready for review. - options:
- Approve — proceed to Phase 2 (source assembly + scout)
- Reject — mark the task aborted, no scraping runs
Response handling:
- Approve → update
.mz/task//state.mdPhasetostrategy_approved, proceed to Phase 2. - Reject → update
.mz/task//state.mdStatustoaborted_by_userand stop. - Any other reply (feedback) → re-dispatch
job-strategistwith the feedback appended, overwritesearch_strategy.json, return to Surface 1, re-readsearch_strategy.json, and re-emit the full plan message from scratch with the new JSON contents — never diff-only, never summary-only. This is a loop — repeat until the user explicitly approves. Never proceed to Phase 2 without explicit approval.
Techniques
Techniques: delegated to phase files — see Phase Overview table above.
Common Rationalizations
N/A — orchestration skill, not a discipline skill.
Red Flags
- You dispatched scouts before the user approved the strategy.
- You used a banned data source (scraped LinkedIn profiles, AI-summarized aggregators, undated blog posts) or fabricated a vacancy that does not exist in search results.
- Master report lives in chat instead of
.mz/outreach//_job_search_.md. - A cover letter contains AI clichés ("excited to apply", "passionate", "leverage", "synergy") or fabricates experience absent from the CV.
- A remote job is marked eligible without verifying the listing permits work from the user's location.
Verification
Before completing, output a visible block showing: run name, total listings scraped, listings excluded by location-eligibility, total ranked, top-1 final score, count of cover letters written, and the absolute path of the master report. Confirm the report file, scored JSON, and letters/.md files all exist on disk.
______________________________________________________________________
Phase 0: Setup + CV collection
Parse arguments. Derive two names:
task_name(state dir) =_job_search_where `` is a snake_case summary of the preferences (max 20 chars).run_name(outreach output dir) =_job_search_, max 40 chars. Example:"Senior backend Go/Rust remote from Berlin"→2026_05_11_job_search_senior_be_berlin.
mkdir -p .mz/task/
mkdir -p .mz/outreach//letters
CV collection
Collect the CV path as an open-value input collector — ask a direct prose question, then read the reply. Acceptable formats: .md, .txt.
Ask: What is the path to your CV file? Provide an absolute or relative path to a .md or .txt file — the skill needs your CV in markdown or plain text. PDF and DOCX are not supported; convert first. Reply with the path, or "Cancel" to abort.
Validation:
- If the answer is "Cancel" → update
state.mdStatustoaborted_by_user, stop. - If the file does not exist or is not
.md/.txt→ re-ask once with the error inlined; on a second failure, setStatustoaborted_missing_cvand stop. - On success, read the CV and capture its absolute path.
State file
Write .mz/task//state.md:
schema_version: 2
Status: running
Phase: 0
Started:
phase_complete: false
what_remains: []
Preferences:
CV path:
Limit: 50
RecencyDays: 7
ContactsTopN: 10
LettersTopN: 10
RunName:
After setup completes, read phases/strategy_and_sources.md and proceed to Phase 1.
______________________________________________________________________
State Management
State persists to .mz/task//state.md. Schema is v2: the file's first line is schema_version: 2, and alongside the skill's existing Status / Phase / Started keys it carries phase_complete (boolean) and what_remains (YAML list of strings). Set phase_complete: false on phase entry and true once the phase's artifacts are written and its gates pass; refresh what_remains on every phase transition; what_remains MUST be [] when Status: complete. On reading a schema_version: 1 or unversioned file, add the missing keys, set schema_version: 2, and log the upgrade.
______________________________________________________________________
Resume Support
Before creating anything in Phase 0, check if .mz/task//state.md exists for the resolved task_name. If it does, read the Phase field and resume from the next incomplete phase. All phases are idempotent — re-running overwrites output files.
Error Handling
- Agent fails or returns empty: append an
Errors:bullet instate.md, continue with available data. - ALL agents in a phase fail (zero results): stop the pipeline and report the failure.
- Never fabricate data — incomplete results are better than false results.
- An agent returns
STATUS: NEEDS_CONTEXTfor missing user input (e.g. no location in CV but remote-only preferences): invokeAskUserQuestionto fill the gap, then re-dispatch.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: DoctorMozg
- Source: DoctorMozg/claude-pipelines
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.