Operating Card
Before every batch item, re-read skills/recruiting-pipeline/OPERATING_CARD.md. The card wins in any conflict with prose below.
Recruiting Pipeline
Use this skill when the user wants the best end-to-end recruiting workflow, a daily recruiting plan, or help deciding which recruiting skill to run next.
This is the coordinator skill. It does not replace the specialized skills; it sequences them.
Sources Of Truth
Use these in order:
- Markdown tracker:
application-trackers/applications.md - Job intake tracker:
application-trackers/job-intake.md - Outreach prospect tracker:
application-trackers/outreach-prospects.md - Generated cache:
application-visualizer/src/data/tracker-data.json
Markdown stays authoritative. The generated cache is the fast read model for dashboards and target builders.
Notion is a separate optional mirror handled by notion-application-sync; do not include it in normal recruiting runs.
Daily Command
Start every recruiting session with:
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py
Useful options:
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --format json
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --limit 8
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode linkedin
That script reads the generated tracker cache and emits a prioritized plan:
- Gmail/status refresh
- applications that are tailored but not applied
- recruiter outreach lane
- engineer outreach lane
- prospecting/Apollo gaps
- interview or assessment prep
- visualizer refresh/deploy commands
Focused Modes
Use a focused mode when the user wants to run one lane without losing the adjacent work that keeps the tracker reliable:
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode resume
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode linkedin
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode recruiter
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode engineer
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode prospecting
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode prep
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode status
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode intake
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode dashboard
python3 skills/recruiting-pipeline/scripts/build_daily_recruiting_plan.py --mode notion
Mode behavior:
resume: refresh status, tailor/update roles, apply ready rows, then queue recruiter and engineer outreach.apply: refresh status, submit ready tailored rows, then queue both LinkedIn lanes.linkedin: refresh status, run recruiter and engineer outreach, check prospecting gaps, then refresh the dashboard.recruiter: run the recruiter lane with prospecting and dashboard follow-through.engineer: run the engineer lane with prospecting and dashboard follow-through.prospecting: find company-level people/email gaps and surface related LinkedIn lanes.prep: focus on interviews and online assessments.status: focus on Gmail/application status changes.intake: run fresh LinkedIn and Greenhouse job intake, then surface resume/apply follow-through.dashboard: only rebuild visualizer data/site output.notion: refresh website data and preview the optional Notion mirror.
When the user explicitly says "only LinkedIn outreach" or "just resume tailor," run the matching mode first, then perform only the companion steps that are listed for that mode.
If the cache is stale, run:
python3 skills/application-visualizer-refresh/scripts/refresh_visualizer_data.py
Optimal Flow
Follow this sequence unless the user asks for a specific step:
Refresh state
- Run the daily plan script.
- Run
gmail-application-refreshwhen statuses may have changed. - Refresh visualizer data after tracker edits.
Listen for fresh jobs
- Use the Codex automation in
.agents/automations/hourly-job-intake.mdfor hourly LinkedIn and Greenhouse/MyGreenhouse discovery. - Use
job-intakeas the deterministic ledger/scoring helper after Codex captures browser results. - Prefer early-career SWE-family roles.
- Treat location as ranking, not exclusion: NYC first, SF/Bay Area second, remote/Seattle/DC next, and other U.S. locations allowed for strong roles.
- Dedupe against both
applications.mdandjob-intake.md.
- Use the Codex automation in
Add or tailor new roles
- Use
resume-tailorfor new job links. - Render and verify the one-page PDF.
- Update
application-trackers/applications.md. - Let fit score and
Reach Outbe set by the tracker helper unless the user overrides.
- Use
Submit applications
- Use
finish-applicationsfor ready tailored rows. - Prioritize high-fit
Resume Tailoredrows that are not applied. - After applying, use
gmail-application-refreshor the status helper to markApplied.
- Use
Do LinkedIn outreach
- Use
linkedin-outreach. - Treat recruiter and engineer as separate lanes.
- For each
Reach Outrow, try to complete both:- one recruiter contact
- one engineer contact
- Recording recruiter outreach must not mark engineer outreach complete, and vice versa.
- When speed matters, run recruiter and engineer outreach as two parallel Codex workstreams from the same refreshed cache snapshot.
- Use
Build deeper prospect lists
- Use
company-prospectingfor companies that need more than LinkedIn invites. - Each company should have at least one recruiter and one engineer prospect when possible.
- Export Apollo queue only after real names are selected.
- Use
Monitor responses
- Use
gmail-application-refreshto detect confirmations, rejections, assessments, and interviews. - High-confidence changes update markdown. Notion sync is separate and optional.
- Ambiguous messages should be reported, not guessed.
- Use
Prepare interviews and assessments
- Prioritize
InterviewingandOnline Assessmentrows from the daily plan. - Keep factual notes in the tracker after each scheduling or prep event.
- Prioritize
Refresh dashboard
- Run the visualizer refresh.
- Build the site before deploy:
cd application-visualizer && npm run build
Skill Routing
- User asks for a whole recruiting session: run
--mode all. - User asks for only one recruiting lane: run the closest focused mode first.
- User asks for all-in-one LinkedIn sourcing, resume tailoring, recruiter outreach, and application attempts from a LinkedIn search: use
linkedin-full-pipeline. - New job link or pasted posting: use
resume-tailor. - Fresh LinkedIn/Greenhouse sourcing: use
job-intake. - Ready tailored rows need submission: use
finish-applications. - Need next LinkedIn people: use
linkedin-outreach. - Need company-level people plus emails: use
company-prospecting. - Need email/status updates: use
gmail-application-refresh. - Need dashboard data rebuilt: use
application-visualizer-refresh. - Need Notion mirroring or 12-hour schedule setup: use
notion-application-sync. - Need overall priorities: use this skill first.
Parallel Workstreams
Use parallel Codex workstreams only when the lanes are independent and both can update through deterministic scripts.
Best parallel pattern:
- Refresh the cache once:
python3 skills/application-visualizer-refresh/scripts/refresh_visualizer_data.py
- Build separate lane queues from that same snapshot:
python3 skills/linkedin-outreach/scripts/build_outreach_targets.py --contact-type recruiter --limit 20 --format json
python3 skills/linkedin-outreach/scripts/build_outreach_targets.py --contact-type engineer --limit 20 --format json
Run two Codex workstreams:
- Workstream A owns recruiter outreach only.
- Workstream B owns engineer outreach only.
Each workstream records sends only through:
python3 skills/linkedin-outreach/scripts/update_outreach_tracker.py --contact-type recruiter ...
python3 skills/linkedin-outreach/scripts/update_outreach_tracker.py --contact-type engineer ...
- After both finish, refresh the visualizer cache and rebuild the website.
Avoid more than two concurrent outreach workstreams unless each has a disjoint company list. Do not let parallel workers manually edit the same tracker row; they should use the lane-aware update script so recruiter and engineer fields merge cleanly.
Guardrails
- Do not let a generated cache overwrite markdown truth.
- Do not invent contacts, emails, application statuses, or recruiter names.
- Keep recruiter and engineer outreach separate.
- Do not create Apollo emails from guessed patterns.
- Prefer small factual tracker notes over long summaries.
- If a row is ambiguous, leave it unchanged and report why.