Job Priority - sameernagar-hub/regen-engine GitHub Wiki

Job priority and first-applicant mode

A strong match should never wait behind fifty average ones, and the first resumes in an ATS get read first.

Priority score (before any description is fetched)

engine/discovery/priority.py::score(job), O(1) per job; the queue is sorted by it (O(Q log Q)).

Part Points Signal
level 4 / 2 new grad, early career, entry, associate, "Engineer I" / II, mid
lane 1โ€“3 title words for the user's deepest lanes (AI > backend, full stack > general)
fresh 0โ€“4 4 ยท 0.5^(hours/24): halves every day
tier 4 / 2 employer on the user's private tier lists (profile/priority.json, git-ignored)
sponsor 2 employer on the user's known-sponsor list
learned 0โ€“10 reply rate (OA / interview / offer) of that lane, from the inbox, once a lane has 5+ submissions

Every part is kept with the score so the order is explainable.

JD match (after the full description is read)

jd_match(coverage) = share of the posting's terms the Fact Bank covers and the resume shows. The built batch is sorted by it, so the best-matching job of the batch is filled first.

Learning what not to open

engine/pipeline.py::history() reads the last 3 days of attempts (O(E)):

  • an ATS where โ‰ฅ 50% of recent attempts hit a captcha / bot check is skipped and its jobs go to the assist list;
  • a company whose last attempt stopped on something only the user can clear (arbitration, assessments, transcripts, export-control self-certification) is skipped until the user acts. Transient failures (an email code that timed out, no confirmation page) get exactly one retry.

First-applicant mode

python -m engine run --loop 20 (or Rescan every in the control room): one full pass, then every 20 minutes a rescan of only the last few hours of postings, applying to whatever just opened. Scans merge into the queue (bounded to 21 days), so a short rescan never drops untried jobs. It runs until you stop it; it is never scheduled.

Evidence

  • tests/test_core.py::test_priority_orders_good_jobs_first, test_history_learns_walls.

Freshness bands and onsite preference (v0.12)

Selection drains strict bands in order: posted within the last hour, the last day, the last week, then older. Older postings are close to closing, so they're a cold backup. Inside a band the priority score decides. The score adds an onsite term: +3 for Bay Area onsite or hybrid, +2 for onsite elsewhere, 0 for fully remote. Remote roles are still applied to.

Picking k of Q jobs uses a lazy heap: heapify is O(Q) and each pop is O(log Q). Skipped jobs (per-company cap, blocked company) cost one pop each, and the loop stops once k jobs are picked, so there's no O(Q log Q) full sort. Before selection, prune() drops jobs that can never be applied to, so the queue holds only fillable work.