Arise Enterpriseโ€บ Job Huntingโ€บ Job Hunting Workflow
NEEV · ๐Ÿ›๏ธ Command Center

Job Hunting Workflow

Same workflow-map idea as the Outreach Engine page, for the team's own job applications: discover โ†’ score โ†’ verify โ†’ draft โ†’ human review โ†’ send. The real difference from outreach: discovery has 4 separate channels feeding the same table (one automated-but-quota-limited, one manual-per-session, one automated-and-free, one fully human) โ€” that resilience is the point, not a redundancy. Everything downstream (scoring, HR verification, resume/cover-letter drafting, sending, reply tracking) works identically no matter which channel a job came from. Every stage below is a real, standalone script โ€” not a manual/chat step, except drafting review itself (a deliberate human gate).

Proven โ€” live-tested, working Proven but currently blocked Working but a real single-point-of-failure risk Not started / no data yet Shared / boundary
๐Ÿ”ญ The Scouts โ€” Job Discovery, 5 channels, 1 table
128
Total tracked
Every job any channel has ever found, live in table 922 right now.
71
JobSpy โ€” zero cost
Added 28 Aug โ€” real Indeed data via the open-source JobSpy library, no API key, no monthly quota. First real run.
31
JSearch โ€” quota-limited
Free tier is 200 calls/month โ€” the old 15 calls/day (450/month) burned through it by 24 Aug. Fixed to a sane budget 28 Aug; needs a fresh key.
17
Manual research โ€” 100% conversion
Gemini/Perplexity/Grok/ChatGPT deep-research + real referrals. Lifetime: 127 of 127 sourced this way got all the way to sent.
9
Company ATS v2 โ€” 28 Aug
Real, public, keyless Greenhouse + Lever job-board APIs, company-by-company. v2 added Lever, fixed a real word-boundary regex bug, and grew to 11 verified companies (from 2) โ€” 90 real Gulf postings seen, 9 total passed the relevance filter across both runs, incl. a genuine Process Automation Engineer role at a Dubai construction firm.
๐ŸŽฏ The Scorer โ€” Job Scoring, match-jobs.mjs
117
Scored so far
Migrated 29 Aug โ€” the full ~57-row backlog that had been stuck since Gemini/DeepSeek both went down finished rescoring on Haiku the same day, 0 errors.
Haiku
Scoring LLM โ€” 29 Aug
Migrated off Gemini/DeepSeek entirely, same day and same reason as The Writer โ€” both real accounts had gone down at once (Gemini quota exceeded, DeepSeek insufficient balance), silently stalling scoring for days. Claude Haiku primary, Sonnet single escalation retry, same proven CLI mechanism, no separate API key.
โœ“
Structural validation
Same discipline as drafting: a conversational non-answer (SCORE:/REASON: format missing) is rejected and escalated to Sonnet rather than trusted as-is โ€” Haiku's occasional prose-instead-of-format habit isn't specific to resumes.
๐Ÿ•ต๏ธ The Detective โ€” HR / Email Verification, find-recipient-email.mjs
48
Recipient email found
Claude (Haiku web search) โ†’ DeepSeek โ†’ Gemini, 3-tier fallback โ€” the most resilient step in the whole pipeline.
0
HR Contact LinkedIn found
Field added 27 Aug for when no email exists but a real HR contact does โ€” genuinely 0% populated so far. The delivered ChatGPT research prompt for this hasn't been run yet.
โœ๏ธ The Writer โ€” Resume + Cover Letter + Message Drafting, tailor-and-draft.mjs
51
Drafted (PDF compiled)
Rewrites a LOCKED LaTeX template's marked blocks only โ€” structure never changes. pdflatex compiles it; a page-count check forces exactly 2 pages, verified mechanically from the compile log.
Haiku
Primary drafting LLM โ€” 29 Aug
Migrated off Ollama/DeepSeek/Gemini entirely โ€” Imran's explicit call. Claude Haiku via the Claude Code CLI (his own subscription, no separate API key) drafts; Claude Sonnet is a single escalation retry if Haiku's answer fails validation. Same subscription, same mechanism Hermes itself already uses to drive Claude Code.
2
Real defenses, not just a prompt rule
(1) Structural validation rejects a conversational non-answer before it ever reaches pdflatex. (2) A mechanical fact-checker cross-verifies every tool name and number in the draft against the real candidate profile โ€” built after a WORDED "don't fabricate" rule alone failed to stop Haiku/Sonnet inventing a specific wrong metric across 6+ separate attempts on 28 Aug.
HIGH
Fabrication stakes
A wrong claim here (fake B.Tech/PMP) risks Gulf visa deportation/blacklist โ€” a materially bigger deal than a marketing message being slightly off. Hard rules are LOCKED in the prompt, byte-for-byte from job_engine.md, PLUS the mechanical check above.
0
LinkedIn/IG/FB message drafting โ€” planned, not built
Baserow already has the fields for this (LinkedIn Message, Instagram DM Message, WhatsApp Message) โ€” but tailor-and-draft.mjs doesn't fill them yet, only Resume+Cover Letter+Email. Honest gap, not yet started โ€” the Writer's job should eventually be "whichever message the channel needs," not just email.
๐Ÿ“ฎ The Messenger + ๐Ÿ“ก The Tracker โ€” Send + Track
49
Sent (Email, automated)
send-via-smtp.mjs โ€” one email per 5-min tick, ~50/day Zoho cap. Was dead 3 weeks (scheduled-task duration-expiry bug) โ€” fixed 27 Aug, 34 real approved applications got unstuck.
17
Replied
check-replies.mjs, IMAP across 4 Zoho inboxes, pings Imran on Telegram immediately.
2
Bounced
check-bounces.mjs, matched against real DSN "Final-Recipient" data โ€” not guessed.
_shared/ library baserow-client ยท search-profiles.mjs ยท pdf-gen ๐Ÿ”ญ The Scouts โ€” Job Discovery, 5 channels โ†’ Baserow 922 1. job-search.mjs (JSearch) โ€” automated, quota-limited Blocked since 24 Aug (429s) โ€” free tier exceeded; fixed to a sane call-budget, needs a fresh key 2. Indeed via Claude Code MCP โ€” semi-manual, session-only Sanctioned, real, but only works inside a live Claude session โ€” can't run unattended overnight 3. jobspy-import.mjs (JobSpy) โ€” automated, zero cost, new 28 Aug Proven โ€” 71 real UAE jobs in the first run ยท not yet scheduled (anti-bot risk, run manually first) 4. ats-collector.mjs (Company ATS v2) โ€” automated, zero cost, Greenhouse+Lever Real public Greenhouse+Lever APIs โ€” 90 Gulf jobs seen (11 companies), 9 relevant so far 5. Manual deep-research (Gemini/Perplexity/Grok/ChatGPT + referrals) โ€” 100% historical conversion ๐ŸŽฏ The Scorer โ€” Job Scoring, match-jobs.mjs Tool: Claude Haiku (Sonnet escalation) โ€” rates 0-100 against locked positioning Proven live โ€” 52/117 scored pass โ‰ฅ60 (44%) โ€” full backlog cleared 29 Aug on the new Haiku engine, 0 errors โœ“ No Ollama/DeepSeek/Gemini (29 Aug migration) โ€” same mechanism as The Writer, structural validation before trusting a response ๐Ÿ•ต๏ธ The Detective โ€” HR / Email Verification, find-recipient-email.mjs Tool: Claude (Haiku web search) โ†’ DeepSeek โ†’ Gemini โ€” 3-tier fallback Proven live โ€” 48 recipient emails found; the most resilient step in this pipeline HR Contact LinkedIn (added 27 Aug, for when no email exists): 0 populated โ€” research prompt not run yet โœ๏ธ The Writer โ€” Resume + Cover Letter + Message Drafting, tailor-and-draft.mjs Tool: Claude Haiku (Sonnet escalation) โ€” rewrites LOCKED LaTeX template; pdflatex forces exactly 2 pages Proven live โ€” 51 drafted (Resume PDF + Cover Letter + Email Subject/Body written) โœ“ No Ollama/DeepSeek/Gemini (29 Aug migration) โ€” Haiku primary, Sonnet escalation-retry, same Claude subscription Mechanical fact-check cross-verifies tool names/numbers against the real profile โ€” a worded rule alone didn't stop fabrication Hard anti-fabrication rules locked byte-for-byte from job_engine.md โ€” no B.Tech/PMP claims, ever โš  Also meant to draft LinkedIn/IG/FB messages โ€” fields exist in Baserow, NOT built into this script yet (honest gap) ๐Ÿ›ก๏ธ The Guard โ€” Imran reviews (Baserow or /job-review/) ticks "Ready to Send" โ€” always manual Channel โ€” by what was actually found 1 ยท Email automated โ€” LIVE 2 ยท LinkedIn draft only โ€” you apply + log it ๐Ÿ“ฎ The Messenger โ€” send-via-smtp.mjs Zoho SMTP ยท 1/5-min tick, ~50/day cap Proven โ€” 49 sent all-time. Was dead 3 weeks (task-duration bug) โ€” fixed 27 Aug LinkedIn โ€” manual, logged by hand No automated sender โ€” by design Applies via LinkedIn/portal directly, "Mark as Applied" on /job-review/ ๐Ÿ“ก The Tracker โ€” Reply + Bounce Tracking, check-replies.mjs ยท check-bounces.mjs IMAP, 4 Zoho inboxes ยท Telegram ping on any reply, DSN-matched bounce flagging Proven โ€” both scheduled (AriseCheckReplies, AriseCheckBounces) โ€” 17 replies, 2 bounces caught ๐ŸŽ›๏ธ Mission Control โ€” 3 dashboards, 1 data source engine.arisegulf.com/job-dashboard โ€” detailed funnel, charts, follow-ups /job-hunting-engine/ โ€” pipeline cards by Person โ†’ Sector /job-review/ โ€” the actual approve-and-send queue Recruitment-Agency fields fields 23-46, same table 922 Agency Name, Based In, Gulf Countries Served... DEAD โ€” never wired, not this pipeline Recruitment Agency Outreach โ€” NEW outreach-engine, table 955 Gulf+India agencies as mediators, own niche 388 scraped ยท Haiku-scoring in progress full detail โ†’ outreach-engine page
Every stage reads/writes Baserow table 922, each one its own standalone script โ€” none of this is a manual/chat step except the human review gate itself. 2 boundary nodes shown separately on purpose: dead recruitment-agency fields (never wired, same table, purple) vs the NEW live recruitment-agency-outreach system (28 Aug, a different table entirely โ€” outreach-engine's 955 โ€” amber). Both dashed lines, neither is a data connection into this pipeline.

Build status โ€” detail

_shared/ librarybaserow-client.mjs ยท search-profiles.mjs
Proven
search-profiles.mjs pulled out of job-search.mjs on 28 Aug specifically so JobSpy could reuse the exact same locked titles/locations without triggering JSearch's own run as a side effect โ€” one list, every discovery channel reads it.
๐Ÿ”ญ job-search.mjsJSearch (OpenWebNinja), no fallback
Blocked
Free tier is 200 calls/month โ€” the original 15 calls/day (450/month, 2.25x over) is the real reason this went dead 24-27 Aug, not a fluke. Fixed 28 Aug to 8 calls/day (240/month, still slightly over โ€” worth a paid tier or one more trim). Waiting on Imran's fresh API key.
๐Ÿ”ญ Indeed via Claude Code MCPsanctioned, session-only
Available, not yet run
Real Indeed data through Claude's own Indeed MCP tool โ€” the same class of tool as scrape-leads.mjs, just constrained to only work while a Claude Code session is actually open (no unattended overnight schedule possible). First live test hit repeated tool-level rate-limiting; will retry with real spacing between attempts rather than hammering it.
๐Ÿ”ญ jobspy-import.mjsJobSpy (Python, open-source), site=indeed only
Proven โ€” first run
Added 28 Aug after real conversion data showed JSearch converts only 12% of what it finds (vs manual research's 100%) โ€” this is a zero-cost, zero-quota resilience layer, not a volume play. Needed a real Python runtime first (the machine's existing installs were corrupted โ€” MSI installer kept losing python.exe specifically; fixed via the installer-less embeddable distribution, `job-engine/python-runtime/`). First real run: 71 new UAE listings, zero errors. Deliberately conservative โ€” top 3 titles/person, Indeed only (skips LinkedIn, JobSpy's own docs call it most block-prone), not yet on a schedule. FreeHire (a sibling recommendation) was evaluated and rejected the same day โ€” its public API's location/country filters don't actually work (verified live: every query returned the same unrelated US listing regardless of filter).
๐Ÿ”ญ ats-collector.mjsGreenhouse + Lever, company-first not keyword-first
Proven โ€” v2
v1 (Greenhouse-only, 2 companies) found a real bug in its own Gulf-location regex โ€” "oman" with no word-boundary matched inside "Romania", falsely counting a Remote-hiring company's Romania-based posting as a Gulf job. v2 (same day) fixed that, added Lever as a second Tier-1 platform (verified live against 6 real companies), and grew to 11 fully-verified companies โ€” every slug tested against the live API before being added, none guessed on faith. A new location_confidence flag (HIGH/LOW) means an ambiguous "Middle East"/"Remote" posting never auto-counts as Gulf just because the company happens to be Gulf-based. Real run 28 Aug: 90 Gulf-located postings seen, 9 passed the relevance filter (2+ keyword overlap with someone's actual locked title โ€” same discipline that already rejected Fraud-Investigator/Collections-Lead-style noise in v1), including a genuine Process Automation Engineer role at a real Dubai construction firm (econstruct). New ats-detect.mjs module (unit-tested, 7/7 pass) can identify a company's ATS platform from its real careers-page HTML โ€” built for future company-list growth, not yet wired into the collector's own run. No target_companies Baserow table โ€” this session's token can't create Baserow fields/tables (hit the same permission wall trying to add a field earlier 28 Aug) โ€” data/ats-companies.json holds the same richer schema (industry, careers_url, confidence, last_checked_at, job_count) instead, trivial to migrate once a schema-capable token exists. Workable/SmartRecruiters/iCIMS not started (spec's own phasing: prove 2 platforms first). Not scheduled โ€” manual runs only, by explicit spec instruction, until reliability is proven over several real runs.
๐ŸŽฏ match-jobs.mjsClaude Haiku + Sonnet escalation ยท structural validation
Proven, migrated 29 Aug
29 Aug: migrated off Ollama/DeepSeek/Gemini entirely โ€” same day, same reason as tailor-and-draft.mjs: both real accounts (Gemini quota, DeepSeek balance) had gone down at once, silently stalling scoring for days. Now runs on Claude Haiku via the Claude Code CLI, Sonnet as a single escalation retry โ€” same proven mechanism as the rest of today's migrations. A response that doesn't match the SCORE:/REASON: format is rejected and retried on Sonnet rather than trusted as-is โ€” happened 3 times in the first full 57-row run, Sonnet recovered all 3. Rates 0-100 against JOB_TARGET_STRATEGY.md's locked "AI Automation Lead" positioning. 52 of 117 scored rows pass โ‰ฅ60 (44%) โ€” the pass rate dropped from the earlier 72% as noisier, broader-net channels (JobSpy/ATS) fed in more low-relevance roles; the targeting itself is working as intended, just being tested against a wider net now.
๐Ÿ•ต๏ธ find-recipient-email.mjsClaude (Haiku web search) โ†’ DeepSeek โ†’ Gemini
Proven
3-tier fallback, never fabricates a contact โ€” if no real email is found, the row stays unverified rather than guessing. 48 real recipient emails found to date. HR Contact Name/LinkedIn/Title fields (added 27 Aug, for the case where no email exists but a decision-maker does) are real fields but genuinely 0% populated โ€” the ChatGPT research prompt delivered for this hasn't been run yet.
โœ๏ธ tailor-and-draft.mjsClaude Haiku + Sonnet escalation ยท LOCKED LaTeX template ยท mechanical fact-check
Proven, migrated 29 Aug
51 real resume+cover-letter+email drafts, mechanically verified 2-page compiles. 29 Aug: migrated off Ollama/DeepSeek/Gemini entirely (Imran's explicit call โ€” all three had gone down at once, silently stalling the pipeline at "found" for days) โ€” now runs on Claude Haiku via the Claude Code CLI (Imran's own subscription, no separate API key), with Claude Sonnet as a single escalation retry. Two real bugs found and fixed live-testing this: a stale-PDF-on-failed-compile bug, and a PowerShell `$null`โ†’`{}` JSON quirk that made CLI errors unreadable. Hard anti-fabrication rules (no B.Tech/PMP claims โ€” Gulf attestation + PMI public registry would catch a lie instantly, risking deportation/blacklist) are locked byte-for-byte from job_engine.md, PLUS a new mechanical fact-checker that cross-verifies every tool name and number in a draft against the real candidate profile โ€” added after a worded "don't fabricate" instruction alone failed to stop Haiku/Sonnet inventing a specific wrong metric across 6+ separate attempts the same day. A row that fails validation is left safely untouched (Status stays "found") rather than accepting a fabricated draft โ€” that's the system working as intended, not a bug.
๐Ÿ“ฎ send-via-smtp.mjsZoho SMTP, "Ready to Send" gate
Proven โ€” live
One email per 5-min scheduled-task tick, ~50/day Zoho cap. Was silently dead for 3 weeks โ€” the exact same Windows Task Scheduler "finite repetition duration" bug found and fixed across several other tasks that day โ€” 34 real, already-approved applications sat unsent the whole time. Fixed 27 Aug (task duration extended to 10 years, StartBoundary reset). Never sends without Imran's own "Ready to Send" tick โ€” that IS the human-approval gate, just relocated from the old Zoho-Draft plan to Baserow directly.
LinkedIn applicationsmanual โ€” no automated sender, by design
Manual, by design
When HR Contact LinkedIn exists but no email does, the job-review page shows the contact and the JD link โ€” Imran (or whoever) connects/applies directly, then clicks "Mark as Applied" to log Status/Applied Date/Applied Via/Send Method exactly the way the automated Email path would. No LinkedIn-scraping/auto-connect tool exists or is planned โ€” LinkedIn's anti-bot posture makes that a bad trade for a low-volume, high-stakes action anyway.
๐Ÿ“ก check-replies.mjs ยท check-bounces.mjsIMAP, 4 Zoho inboxes
Proven โ€” live, scheduled
Both were also silently dead ~12 days (same task-duration bug), fixed 27 Aug alongside send-via-smtp.mjs. check-replies.mjs pings Imran on Telegram the moment a real reply lands โ€” interview, shortlist, rejection, whatever it is; check-bounces.mjs matches real DSN "Final-Recipient" data, not a guess. Gulfisha's own IMAP credentials are separately broken (needs a fresh Zoho app-password from her) โ€” a pre-existing gap, not something this fix touched.
๐ŸŽ›๏ธ 3 dashboardsjob-dashboard ยท job-hunting-engine ยท job-review
Proven โ€” live
All 3 read the same table 922 directly, no separate database. job-dashboard (engine.arisegulf.com) is the detailed funnel/charts view. job-hunting-engine (this system) is the Personโ†’Sector pipeline-card overview โ€” this page is one click from there. job-review is the actual approve-and-send working queue, built 28 Aug as this system's exact counterpart to Outreach Review.