Run a recurring outbound sourcing workflow for a role: source candidates, dedupe against your ATS pipeline, rank them, and serve a review surface where a recruiter marks Yes/Maybe/No — then feed those decisions into the next run. Use to operate, schedule, debug, or rebuild a standing sourcing pipeline ('do this week's sourcing run for the Platform role', 'set up recurring sourcing', 'regenerate the candidate review app'). Not for one-off people lookups — use people-search for those.
Marketplace skill — requires a Kortix ATS connector (e.g. an applicant-tracking system). Install when configured. The ATS connection is what makes this a closed loop: it lets the workflow exclude people already in your pipeline and ingest who got hired. Mint a connect link in-chat per thekortix-systemcredentials reference. With no ATS connected the sourcing + review loop still runs; it just can't dedupe against your live pipeline.
people-search.people-search. Don't load it to write a Slack/email announcement about the workflow, to summarize recruiter feedback, or to discuss recruiting strategy. The request has to be about operating the pipeline itself. role brief + prior reviewer decisions + cadence
│
▼
┌────────────── people-search ──────────────┐
│ source → enrich → filter (delegated) │
└──────────────────────────────────────────────┘
│
▼
dedupe against ATS pipeline + past reviews + hired patterns
│
▼
rank by readiness (rtm-ranker) or fit signals
│
▼
persist candidate state (keyed by profile URL)
│
▼
review surface ── recruiter marks Yes / Maybe / No + notes
(backend-backed page built with webapp tooling)
│
▼
decisions persist → ingested by the NEXT run
people-search owns every search / enrich / filter primitive. Run a sourcing pass by following its pipeline; do not write your own search recipes here. If sourcing needs new search behavior, improve people-search and consume it.rtm-ranker (or ats-ranker if you're scoring against a JD) does the ranking. Don't hand-roll a scorer.talent-pool-rendering / webapp build the review surface. Don't hand-author one-off HTML.No in a prior run, and anyone matching a "hired"/"already-employed-here" pattern. Re-surfacing someone the recruiter already rejected erodes trust in the whole loop.people-search: fan out varied queries for the role/skills/geography, merge and dedupe, enrich the strong candidates, and filter by exclusion down to real matches. Carry every candidate's profile URL through — it's the key for everything downstream.No. What remains is genuinely new candidates worth a recruiter's attention.ATS vendors vary — Ashby is one example, but read whichever ATS is connected. Access it generically: list the role's applications / pipeline, read hired markers, treat them as an exclusion set. If no ATS is connected, say so and proceed without pipeline dedupe (still dedupe against your own prior runs).
rtm-ranker (readiness to move); if you're screening against a written JD, use ats-ranker. Either way the ranking is a transparent rubric, not a black box — carry each candidate's score and reason.unreviewed; previously-seen ones keep their decision and just refresh their metadata.webapp template / talent-pool-rendering) that lists each candidate with their rank, signals, and profile link, and lets a recruiter mark Yes / Maybe / No and leave notes. The frontend reads the candidate list from the backend on load and writes every click straight back to it (hard rule 3). Keep the conventions tight: Yes/Maybe/No (no extra states), a single notes field, score shown on a clean scale, profile link on every card.No → excluded from future sourcing, Yes/Maybe → kept, and the free-text feedback re-tunes the search criteria. That's the whole point — each run should feel like it learned from the last.people-search / rtm-ranker instead.draft-outreach.