Greenhouse Sourcing
Use this skill when Liam wants to mine Greenhouse for fresh software engineering roles, add strong matches to the CodexSkills dataset, tailor batches of resumes, and submit applications efficiently.
This skill is a sourcing and batching layer. Route actual resume edits through resume-tailor, actual submissions through finish-applications, and dashboard updates through application-visualizer-refresh.
Sources Of Truth
- Tracker:
application-trackers/applications.md
- Candidate profile and generic resume:
generic-resume/README.md and generic-resume/resume.tex
- Queue builder:
skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py
- Resume workflow:
skills/resume-tailor/SKILL.md
- Apply workflow:
skills/finish-applications/SKILL.md
Markdown is authoritative. Never let scraped search results overwrite tracker truth.
Default Search
Start from Liam's MyGreenhouse search unless he gives a different one:
https://my.greenhouse.io/jobs?query=Software%20engineer&location=United%20States&lat=39.71614&lon=-96.999246&location_type=country&country_short_name=US&date_posted=past_day&employment_type[]=full_time
MyGreenhouse requires Liam's logged-in browser session, so use Chrome or the in-app browser when authentication is needed. Do not try to bypass login, CAPTCHA, bot checks, or anti-automation controls.
Fit Target
Maximize volume, but only queue roles that plausibly fit Liam's profile:
- Strong yes: SWE I, SWE II, Software Engineer, Backend, Full Stack, Platform, Product Engineer, Generalist, Founding Engineer, Forward Deployed Engineer, Member of Technical Staff, Applied AI Engineer, early-career, university grad, new grad, associate engineer.
- Maybe yes: all-levels engineering roles when the posting does not require senior-only ownership, startup founding/generalist roles that value 1-3 years, customer-facing/deployed engineering roles.
- Usually skip: senior/staff/principal/manager, internships, unpaid roles, contractor-only roles, cleared-only roles, embedded-only roles when the resume has no strong match, roles requiring 4+ years unless the rest is unusually flexible.
- Hard skip: jobs already tracked, closed/unavailable postings, roles outside the United States unless remote-US is explicit, non-engineering sales/recruiting/support roles unless Liam explicitly asks.
Default location behavior is broad for U.S. roles. Treat location as ranking, not exclusion: NYC first, SF/Bay Area second, then remote/Seattle/DC, while other U.S. locations are still allowed when the role is strong. Use repeated --allowed-location flags only for a deliberately narrow run.
If a role is a stretch but plausible, keep it in the queue with a note rather than silently discarding it.
Browser Capture
For MyGreenhouse, prefer browser capture over manual clicking through every card.
- Open the search URL in Liam's logged-in Chrome session.
- Apply filters: United States, full-time, past day or the requested freshness window.
- Scroll until the result list stops loading.
- Capture results by the fastest available route:
- Browser/network JSON if visible in devtools or the in-app browser inspector.
- Page DOM extraction if result cards are rendered in the document.
- Manual copy/paste only as fallback.
- Save captured jobs as JSON, JSONL, CSV, or TSV, usually in
/tmp/greenhouse_jobs.json.
Useful console snippet for DOM extraction when result cards are visible:
copy(JSON.stringify([...document.querySelectorAll("a[href*='greenhouse'], a[href*='gh_jid'], a[href*='jobs']")].map((a) => ({
title: a.innerText.trim(),
url: a.href,
company: a.closest("[data-testid], li, article, div")?.innerText?.split("\n")?.find(Boolean) || "",
location: a.closest("[data-testid], li, article, div")?.innerText || ""
})).filter((job) => job.title && job.url), null, 2))
The snippet is intentionally broad. Clean ranking happens locally in the queue builder.
Build The Queue
After saving captured jobs, build a ranked, deduped queue:
python3 skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py \
--input /tmp/greenhouse_jobs.json \
--limit 60 \
--format markdown
For machine-readable output:
python3 skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py \
--input /tmp/greenhouse_jobs.json \
--limit 120 \
--format json > /tmp/greenhouse_queue.json
Use --include-stretch when Liam wants maximum volume and is comfortable with plausible 3-4 year or all-levels roles.
Batch Workflow
- Refresh context:
python3 skills/application-visualizer-refresh/scripts/refresh_visualizer_data.py
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode resume
- Capture Greenhouse jobs from the logged-in browser and save them to
/tmp/greenhouse_jobs.json, or run the job-intake listener with --greenhouse-input.
- Run the queue builder and take the top 10 strong matches:
python3 skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py \
--input /tmp/greenhouse_jobs.json \
--limit 10 \
--format json > /tmp/greenhouse_queue_batch_10.json
- For each of the 10 queue items, use
resume-tailor:
- Extract company, title, location, posting URL, responsibilities, qualifications, and repeated keywords.
- Prepare the resume folder, tailor
resume.tex, render the PDF, verify one page, and update applications.md with Source set to Greenhouse.
- Use the direct Greenhouse board URL when available, not only the MyGreenhouse search URL.
- After the 10 resumes are tailored, use
finish-applications to submit those 10 ready rows:
- Prefer Greenhouse's own
Autofill with resume or MyGreenhouse autofill button.
- Upload the tailored PDF from the tracker row, not the generic resume.
- Use Liam's standing answers from
finish-applications.
- Stop for CAPTCHA, login, 2FA, account creation, legal signature, custom essay, or any non-routine consent.
- Present one batch review before final submission that lists all 10 companies, roles, destinations, resume PDFs, and any non-default answers. Use one grouped approval for the final submit buttons; do not interrupt for every routine field.
- After the batch, refresh the visualizer cache, stage only the batch's tracker/cache/resume changes, commit, and push:
python3 skills/application-visualizer-refresh/scripts/refresh_visualizer_data.py
git status --short
git add application-trackers/applications.md application-visualizer/src/data/tracker-data.json companies/<batch-company-dirs> skills/greenhouse-sourcing
git commit -m "Add Greenhouse application batch"
git push
Volume Defaults
For a mass pass:
- Work in strict batches of 10: source 10, tailor 10, apply 10, update tracker/cache, commit, and push.
- Keep the queue file for resume-tailor follow-through; do not lose skipped roles.
- If fewer than 10 strong Greenhouse roles are available in the current search, widen the search window or add compatible queries such as
backend engineer, full stack engineer, new grad software engineer, founding engineer, platform engineer, and forward deployed engineer until the batch has 10 or the available pool is exhausted.
- Prefer early-career/new-grad/associate/SWE I/SWE II roles whenever possible.
- If time is short, prioritize direct Greenhouse apply forms with autofill over roles that redirect to Workday or require account creation.
- Minimize approvals by batching them. The agent may source, tailor, fill routine fields, update local tracker files, commit, and push within the batch flow; final submission to employers still needs the grouped batch review when required by Codex action policy.
Tracker Rules
- Use posting IDs from
gh_jid, Greenhouse board paths, or direct job URLs as Posting Key.
- Record
Source as Greenhouse for Greenhouse board or MyGreenhouse-sourced roles.
- If a role is found via MyGreenhouse but the application form lives on an employer site, record the final direct posting URL.
- Dedupe by posting key, job URL, and company plus normalized title.
- Record blockers with dated, factual notes such as
Manual apply needed: Greenhouse reCAPTCHA 2026-04-30.
- Do not mark
Applied until a confirmation page, confirmation email, or portal status confirms submission.
Guardrails
- Keep every resume truthful. Do not invent skills, titles, years of experience, or domain expertise to chase volume.
- Do not submit custom essays without reviewing the exact answer or getting Liam's approval.
- Do not bypass anti-bot controls or terms-sensitive gates.
- Prefer high-throughput routine forms; pause or mark manual when the form becomes legally or personally sensitive.
1---2name: greenhouse-sourcing3description: Source high-volume SWE I, SWE II, early-career, new-grad, founding engineer, generalist, backend, full-stack, and forward-deployed roles from MyGreenhouse or Greenhouse job boards, dedupe them against Liam Van's CodexSkills application tracker, rank fit, queue resume tailoring, and apply through Greenhouse autofill where possible.4---56# Greenhouse Sourcing78Use this skill when Liam wants to mine Greenhouse for fresh software engineering roles, add strong matches to the CodexSkills dataset, tailor batches of resumes, and submit applications efficiently.910This skill is a sourcing and batching layer. Route actual resume edits through `resume-tailor`, actual submissions through `finish-applications`, and dashboard updates through `application-visualizer-refresh`.1112## Sources Of Truth1314- Tracker: `application-trackers/applications.md`15- Candidate profile and generic resume: `generic-resume/README.md` and `generic-resume/resume.tex`16- Queue builder: `skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py`17- Resume workflow: `skills/resume-tailor/SKILL.md`18- Apply workflow: `skills/finish-applications/SKILL.md`1920Markdown is authoritative. Never let scraped search results overwrite tracker truth.2122## Default Search2324Start from Liam's MyGreenhouse search unless he gives a different one:2526```text27https://my.greenhouse.io/jobs?query=Software%20engineer&location=United%20States&lat=39.71614&lon=-96.999246&location_type=country&country_short_name=US&date_posted=past_day&employment_type[]=full_time28```2930MyGreenhouse requires Liam's logged-in browser session, so use Chrome or the in-app browser when authentication is needed. Do not try to bypass login, CAPTCHA, bot checks, or anti-automation controls.3132## Fit Target3334Maximize volume, but only queue roles that plausibly fit Liam's profile:3536- Strong yes: SWE I, SWE II, Software Engineer, Backend, Full Stack, Platform, Product Engineer, Generalist, Founding Engineer, Forward Deployed Engineer, Member of Technical Staff, Applied AI Engineer, early-career, university grad, new grad, associate engineer.37- Maybe yes: all-levels engineering roles when the posting does not require senior-only ownership, startup founding/generalist roles that value 1-3 years, customer-facing/deployed engineering roles.38- Usually skip: senior/staff/principal/manager, internships, unpaid roles, contractor-only roles, cleared-only roles, embedded-only roles when the resume has no strong match, roles requiring 4+ years unless the rest is unusually flexible.39- Hard skip: jobs already tracked, closed/unavailable postings, roles outside the United States unless remote-US is explicit, non-engineering sales/recruiting/support roles unless Liam explicitly asks.4041Default location behavior is broad for U.S. roles. Treat location as ranking, not exclusion: NYC first, SF/Bay Area second, then remote/Seattle/DC, while other U.S. locations are still allowed when the role is strong. Use repeated `--allowed-location` flags only for a deliberately narrow run.4243If a role is a stretch but plausible, keep it in the queue with a note rather than silently discarding it.4445## Browser Capture4647For MyGreenhouse, prefer browser capture over manual clicking through every card.48491. Open the search URL in Liam's logged-in Chrome session.502. Apply filters: United States, full-time, past day or the requested freshness window.513. Scroll until the result list stops loading.524. Capture results by the fastest available route:53 - Browser/network JSON if visible in devtools or the in-app browser inspector.54 - Page DOM extraction if result cards are rendered in the document.55 - Manual copy/paste only as fallback.565. Save captured jobs as JSON, JSONL, CSV, or TSV, usually in `/tmp/greenhouse_jobs.json`.5758Useful console snippet for DOM extraction when result cards are visible:5960```js61copy(JSON.stringify([...document.querySelectorAll("a[href*='greenhouse'], a[href*='gh_jid'], a[href*='jobs']")].map((a) => ({62 title: a.innerText.trim(),63 url: a.href,64 company: a.closest("[data-testid], li, article, div")?.innerText?.split("\n")?.find(Boolean) || "",65 location: a.closest("[data-testid], li, article, div")?.innerText || ""66})).filter((job) => job.title && job.url), null, 2))67```6869The snippet is intentionally broad. Clean ranking happens locally in the queue builder.7071## Build The Queue7273After saving captured jobs, build a ranked, deduped queue:7475```bash76python3 skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py \77 --input /tmp/greenhouse_jobs.json \78 --limit 60 \79 --format markdown80```8182For machine-readable output:8384```bash85python3 skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py \86 --input /tmp/greenhouse_jobs.json \87 --limit 120 \88 --format json > /tmp/greenhouse_queue.json89```9091Use `--include-stretch` when Liam wants maximum volume and is comfortable with plausible 3-4 year or all-levels roles.9293## Batch Workflow94951. Refresh context:9697```bash98python3 skills/application-visualizer-refresh/scripts/refresh_visualizer_data.py99python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode resume100```1011022. Capture Greenhouse jobs from the logged-in browser and save them to `/tmp/greenhouse_jobs.json`, or run the job-intake listener with `--greenhouse-input`.1033. Run the queue builder and take the top 10 strong matches:104105```bash106python3 skills/greenhouse-sourcing/scripts/build_greenhouse_queue.py \107 --input /tmp/greenhouse_jobs.json \108 --limit 10 \109 --format json > /tmp/greenhouse_queue_batch_10.json110```1111124. For each of the 10 queue items, use `resume-tailor`:113 - Extract company, title, location, posting URL, responsibilities, qualifications, and repeated keywords.114 - Prepare the resume folder, tailor `resume.tex`, render the PDF, verify one page, and update `applications.md` with `Source` set to `Greenhouse`.115 - Use the direct Greenhouse board URL when available, not only the MyGreenhouse search URL.1165. After the 10 resumes are tailored, use `finish-applications` to submit those 10 ready rows:117 - Prefer Greenhouse's own `Autofill with resume` or MyGreenhouse autofill button.118 - Upload the tailored PDF from the tracker row, not the generic resume.119 - Use Liam's standing answers from `finish-applications`.120 - Stop for CAPTCHA, login, 2FA, account creation, legal signature, custom essay, or any non-routine consent.121 - Present one batch review before final submission that lists all 10 companies, roles, destinations, resume PDFs, and any non-default answers. Use one grouped approval for the final submit buttons; do not interrupt for every routine field.1226. After the batch, refresh the visualizer cache, stage only the batch's tracker/cache/resume changes, commit, and push:123124```bash125python3 skills/application-visualizer-refresh/scripts/refresh_visualizer_data.py126git status --short127git add application-trackers/applications.md application-visualizer/src/data/tracker-data.json companies/<batch-company-dirs> skills/greenhouse-sourcing128git commit -m "Add Greenhouse application batch"129git push130```131132## Volume Defaults133134For a mass pass:135136- Work in strict batches of 10: source 10, tailor 10, apply 10, update tracker/cache, commit, and push.137- Keep the queue file for resume-tailor follow-through; do not lose skipped roles.138- If fewer than 10 strong Greenhouse roles are available in the current search, widen the search window or add compatible queries such as `backend engineer`, `full stack engineer`, `new grad software engineer`, `founding engineer`, `platform engineer`, and `forward deployed engineer` until the batch has 10 or the available pool is exhausted.139- Prefer early-career/new-grad/associate/SWE I/SWE II roles whenever possible.140- If time is short, prioritize direct Greenhouse apply forms with autofill over roles that redirect to Workday or require account creation.141- Minimize approvals by batching them. The agent may source, tailor, fill routine fields, update local tracker files, commit, and push within the batch flow; final submission to employers still needs the grouped batch review when required by Codex action policy.142143## Tracker Rules144145- Use posting IDs from `gh_jid`, Greenhouse board paths, or direct job URLs as `Posting Key`.146- Record `Source` as `Greenhouse` for Greenhouse board or MyGreenhouse-sourced roles.147- If a role is found via MyGreenhouse but the application form lives on an employer site, record the final direct posting URL.148- Dedupe by posting key, job URL, and company plus normalized title.149- Record blockers with dated, factual notes such as `Manual apply needed: Greenhouse reCAPTCHA 2026-04-30`.150- Do not mark `Applied` until a confirmation page, confirmation email, or portal status confirms submission.151152## Guardrails153154- Keep every resume truthful. Do not invent skills, titles, years of experience, or domain expertise to chase volume.155- Do not submit custom essays without reviewing the exact answer or getting Liam's approval.156- Do not bypass anti-bot controls or terms-sensitive gates.157- Prefer high-throughput routine forms; pause or mark manual when the form becomes legally or personally sensitive.