From exec-recruiter
Run the daily Phase 1 sweep for senior product leadership roles. Triggers on "run today's sweep", "Phase 1", "find new roles", "/sweep", "what's new today", "morning sweep", "scan LinkedIn for product roles". Sources roles from LinkedIn AND directly from major ATS domains (Greenhouse, Lever, Workday, Ashby, etc.) via Google site: search, pulls JD bodies via the apply-link redirect or direct fetch, scores each role 1-10 against the user's ICP and scoring weights, dedupes against the existing dashboard, and produces a Tier-1 / Tier-2 / Skip greenlight summary. Stops before Phase 2 - waits for the user's per-role greenlight.
How this skill is triggered — by the user, by Claude, or both
Slash command
/exec-recruiter:phase-1-sweepThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Run the daily Phase 1 sweep. Source new roles from LinkedIn AND directly from major ATS domains, score, dedupe, triage, and produce the greenlight summary.
Run the daily Phase 1 sweep. Source new roles from LinkedIn AND directly from major ATS domains, score, dedupe, triage, and produce the greenlight summary.
The user says: "run today's sweep", "Phase 1", "find new roles", "what's new today", "morning sweep", "scan LinkedIn for product roles", "/sweep". Or this skill is fired by a scheduled task at 9am [Operator Home City] time.
Before running:
${CLAUDE_PLUGIN_ROOT}/config/icp.yaml for target titles, stage filters, sector filters, recruiter-masked handling${CLAUDE_PLUGIN_ROOT}/config/geo-rules.yaml for sourcing regions${CLAUDE_PLUGIN_ROOT}/config/scoring.yaml for dimensional weights and tier thresholds${CLAUDE_PLUGIN_ROOT}/config/ats-sources.yaml for ATS domains, liveness signals, query caps (used by Step 1B)dashboard.html exists there, parse the ROLES = [...] array for dedupe. If not, scaffold one from ${CLAUDE_PLUGIN_ROOT}/templates/dashboard.html.For each region in geo-rules.sourcing_regions and each title pattern in icp.target_titles:
mcp__Claude_in_Chrome__list_connected_browsers -> select_browser).f_TPR=r86400 (last 24h), sortBy=DD. For US Remote add f_WT=2,3 for Remote+Hybrid filter.(jobId, title, company, location, posted, applicants_count) for each card visible in the results pane.Cover the LinkedIn keyword pluralization gap explicitly - both "VP of Product" and "VP Products" search variants.
In parallel with the LinkedIn sweep, delegate to the ats-google-sweep agent. This catches roles that never reach LinkedIn or arrive there days late.
Inputs to the agent:
regions: same set as Step 1Atitle_cluster: from icp.target_titlesats_domains: from config/ats-sources.yaml ats_domains[]existing_dashboard_urls: parsed from dashboard.ROLES[]The agent handles:
jd-extractor for Chrome rendericp.recruiter_masked_known_aggregatorsReturns a list of candidates in the same shape as Step 1A but with source: "ats-google" and score_confidence: medium by default (see ats-sources.yaml).
Merge the LinkedIn (Step 1A) and ATS (Step 1B) candidate lists. For each candidate role, match against dashboard.ROLES[] by:
(company, role_title) substring matchSkip duplicates. Cross-source dedupe: if the same role appears on both LinkedIn and the ATS (common case for high-profile roles), prefer the LinkedIn entry (richer metadata: applicants_count, posted timestamp, recruiter_masked detection at LinkedIn level) but record the ATS URL in a secondary_url field for completeness.
Note: companies with multiple listings (e.g., The AA London Hybrid + The AA Basingstoke Hybrid for the same role) should be deduplicated to a single entry, with the better location captured.
For each truly new LinkedIn-sourced role, do NOT score from the LinkedIn card alone. The card is a skeleton; titles regularly misclassify the actual JD body. Delegate to the jd-extractor agent (or run inline):
/safety/go/?url=... redirect param.ATS-Google-sourced roles (Step 1B) already have the JD body fetched by the agent, so this step is skipped for them. They flow directly to Step 4.
For each role with a full JD body:
scoring.yaml weights: stage, domain, scope, comp, geo, founder_quality, ai_native_signal, founder_partnership.scoring.hard_blockers. Hard blocker -> drop the role entirely.icp.title_red_flags and JD-body red flags from icp.jd_body_red_flags.score_confidence discount: ATS-Google-sourced roles default to medium (per ats-sources.yaml); LinkedIn card-only with no body extraction is low; LinkedIn + extracted body is medium; LinkedIn + body + verified contacts + comp band is high. Confidence does not change the numeric score; it controls how aggressively to greenlight.scoring.tier_1_threshold AND no hard blockers AND no major frictionscoring.tier_2_threshold with manageable friction (geo-flexibility cost, hybrid commute, narrower-than-CPO scope, recruiter-masked, ATS-only body-extraction-failed)scoring.skip_below OR hard blocker OR clear structural mismatch revealed by JD bodyFor recruiter-masked listings from known aggregators (icp.recruiter_masked_known_aggregators), default to Skip unless the user has explicitly overridden. Surface as a flagged Skip with the de-anon-then-pursue alternative noted.
For ATS-Google-sourced roles where body extraction failed (snippet-only data), default to Tier 2 with a body_unreachable flag so the user can manually open the URL.
Output a chat-ready summary with:
Also produce the Today's Actions follow-up tracker by reading the dashboard:
Do NOT proceed to Phase 2. Wait for the user's explicit greenlight. Do NOT generate CVs, do NOT draft outreach, do NOT identify contacts deeply. The Phase 1 deliverable is decision-ready triage, not action.
The summary in chat should:
Do NOT use em or en dashes anywhere (per outreach-style.yaml). Do NOT include trailing summaries.
The plugin can be triggered on a 9am [Operator Home City]-time daily schedule via Cowork's scheduled task system:
mcp__scheduled-tasks__create_scheduled_task with prompt: "Run the phase-1-sweep skill"
The user installs this scheduled task once at plugin setup time (see README.md).
score_confidence: lowats-google-sweep agent runs liveness checks pre-fetch; staleness should rarely surface to the user.${CLAUDE_PLUGIN_ROOT}/skills/phase-1-sweep/references/linkedin-search-recipes.md - canonical LinkedIn search-URL builder patterns by region.${CLAUDE_PLUGIN_ROOT}/skills/phase-1-sweep/references/jd-extraction-patterns.md - ATS-specific extraction patterns.${CLAUDE_PLUGIN_ROOT}/skills/phase-1-sweep/references/ats-google-recipes.md - canonical Google site: query patterns and per-ATS liveness signals (NEW in v0.2.0).npx claudepluginhub bgolubovski/exec-recruiter --plugin exec-recruiterProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.