5 Commits (0fda8383ea2bf117937ee2f31ef28950488d4edc)

Author SHA1 Message Date
I Luk Kim 555b450f0f proactive: role gate filters support/admin jobs, scoped ortho signal
Two false positives (Account Payable Specialist, Dental Assistant) were
classified ACTIVE because ortho signal was matched against whole-page
boilerplate — dental employers mention 'orthodontics' in every posting.

- roles.py: title-based role gate (target/support/non_clinical/unknown)
  with defaults + config terms; support/admin candidates are dropped at
  board fetch and SERP discovery before verification
- verifier: ortho signal now checks title + job-description container only
  (greenhouse/workday/icims/lever/smartrecruiters selectors); unknown
  titles need a dentist credential (DDS/DMD/license) to become ACTIVE
- Orthodontic Clinician is treated as support — verified against Smile
  Doctors postings ('under close supervision of an Orthodontist')
- non-target candidates are logged to workspace/candidates/*.roles.jsonl
  (30-day retention) as offline audit input
- role_audit.py + 'proactive role-audit': gemma4 reviews borderline titles
  offline and proposes terms; --write appends to sites/role_terms.auto.yaml
  (runtime stays non-AI per CLAUDE.md)
4 weeks ago
I Luk Kim 942f863908 proactive: add Bing engine, deprioritize filter, and enrich lead fields
- bing: additional engine (secondary) for more discovery coverage
- deprioritize: locum/DSO/per-diem/temp → FILTERED (doc §25)
- verifier now extracts salary/FTE/license and the actual apply URL,
  surfaced in the report alongside the posting URL
- report sorts NEW/REOPENED/STILL_OPEN by a §26 priority score
4 weeks ago
I Luk Kim 05510274a3 proactive: require job signal for ACTIVE, filter school/program pages
ATSU school pages were classified ACTIVE because 'APPLY' nav buttons
matched apply keywords. Now:
- job_terms (position/hiring/vacancy/...) must be present for ACTIVE
  unless an official ATS platform is detected
- program_terms (residency/admissions/curriculum/tuition/...) classify
  school pages as FILTERED (not a job posting)
- added tests for both cases; cleaned the two false-positive leads
4 weeks ago
I Luk Kim d3fd62d51c proactive: add weekly deep scan, daily report, and scheduler
- deepscan: employer ATS domain queries (site:myworkdayjobs/icims/
  peopleadmin/governmentjobs/higheredjobs/usajobs/ihs/adea/dentalpost)
  + employer category lanes, reused through the same verify pipeline
- report: doc §23/§24 format with state coverage map, zero-result notice,
  KakaoTalk self-memo delivery with markdown fallback, optional Ollama
  qwen3.5:9b Korean summary
- scheduler: in-process daily loop (--at HH:MM), Sunday weekly deep scan
  auto-included, timezone-aware next-run computation
- CLI: proactive group with run/auto/report/list subcommands
4 weeks ago
I Luk Kim 6e9ac732db proactive: add discovery + verification core for active job search
- sites/proactive.yaml: search plan (50 states, terms, OCONUS, budget,
  denylist for known false positives, verification rules)
- plan: query matrix generator with per-day rotation and budget caps
- engines: DuckDuckGo HTML primary + Google Jobs secondary with anti-bot
  fallback
- verifier: pure-heuristic ATS detection and ACTIVE/VERIFY/CLOSED/STALE
  classification (no AI at runtime)
- ledger: ProactiveLead/ProactiveRun with lifecycle transitions
  (NEW → STILL_OPEN, inactive → REOPENED, VERIFY → ACTIVE = NEW)
- CLI: gimme-job proactive [--dry-run --limit --max-verify]
4 weeks ago