Skip ALL of these in job-search digests:
1. Posted by recruiters/sourcers/agencies — poster title contains: Recruiter, Sourcer, Talent Acquisition AT a staffing firm, Headhunter, Executive Search
2. Known staffing/consulting firms (skip list — case-insensitive substring match):
- Robert Half · Insight Global · Aerotek · TEKsystems · Beacon Hill · Randstad · Adecco · Manpower · ManpowerGroup
- Kforce · Hays · Michael Page · Jefferson Frank · Mason Frank · Major Players
- Hired · Triplebyte · Toptal · Andela · Crossover · Turing.com
- Cognizant · Infosys · Wipro · TCS · HCL · Capgemini · Accenture (consulting arm) · Deloitte Consulting · KPMG Consulting · EY Consulting · PwC Consulting
- Apex Systems · Mastech · Collabera · UST Global · CGS · DXC Technology
- Confidential Company · Confidential · Stealth Mode (only stealth-mode startups → ALLOW, but flag as "stealth — verify")
3. JD language signals (case-insensitive substring match):
- "Our client is hiring", "on behalf of our client", "for our client", "leading [industry] firm/Fortune 500 client"
- "C2H", "Corp-to-Corp", "W2 contract via [agency]"
- "1099 contract via [agency]"
- "Submit through [agency]"
score_jobs.py — hard filter: any match on skip list (firm name OR JD signal) → score = 0, droplinkedin_job_search.py — capture poster_company (the entity that posted) separately from hiring_company (the entity that will hire). If they differ AND poster_company is in skip list → drop.job_digest_email.py — annotate filtered count in footer ("47 postings dropped: agency/consultancy")