Skip to content

feat: 24-hour job queue, classifier fix, and /draft PDF tailing - #526

Merged
pushkarverma3698 merged 2 commits into
mainfrom
feat/jobhunt-apply-loop
Aug 20, 2026
Merged

feat: 24-hour job queue, classifier fix, and /draft PDF tailing#526
pushkarverma3698 merged 2 commits into
mainfrom
feat/jobhunt-apply-loop

Conversation

@pushkarverma3698

Copy link
Copy Markdown
Owner

Summary

QA audit and fixes for the jobhunt pipeline. Seven defects fixed, all verified green.

  • Classifier starvation: Generic "Software Engineer" was starving frontend track (228 backend vs 10 frontend on prod). Rewrote classifyTrack in 3 passes; 572→802 classified (+39% reaching screening, zero regressions).
  • NULL posted_at regression: Hand-screened jobs vanished from the queue. Fixed with coalesce(posted_at, created_at).
  • Country classification: Expanded NL cities (19→80) and IN cities (20→65) from measured real postings.
  • /draft N wiring: Tailors CV, renders PDF, delivers via Telegram (HITL-gated).
  • /applied N wiring: Drains row from queue by marking applied and clearing brief rank.
  • Brief clarity: Added aged-out counter ("12 fresh · 319 older roles") so empty brief is unambiguous.
  • Vocabulary split: Extracted 230-term classifier vocabulary into track-vocabulary.ts (LOC budget fix).

Verification

  • pnpm gate ✅ green: 300 files / 3,281 tests, all ratchets at baseline
  • Classification measured on 4,412 live postings: 572→802 (+39%), zero regressions
  • Regression test pinned: five false positives from earlier draft designed out
  • Country expansion verified: cities that produced 0 rows now produce hits; no false-positive countries
  • NULL posted_at fix verified: manually pasted jobs no longer disappear on screening

Outstanding

  1. Paid pipeline diagnosis: Metered lane dead since 2026-08-12 (198h). Blocks Phase 2 (registry compounding via token harvest).
  2. Phase 2 – Make registry compound: Recruitee/Personio boards (~320 new), IND sponsor probe, discovered boards outside repo, harvest moved to fetch boundary.
  3. Phase 3 – Denmark: Gated behind Phase 1 live-proof (applying daily).

Test Plan

  • Load /brief → verify rows are all < 24h old
  • /draft 1 → PDF arrives in Telegram, is tailored to that JD
  • /applied 1 → row gone from /brief
  • Aged-out counter shows non-zero
  • Failure path: unset STORAGE_BUCKET, /draft falls back to text draft with explicit note

Related


🤖 Generated with Claude Code

pushkarverma3698 and others added 2 commits August 20, 2026 12:26
…/draft PDF and /applied drain

QA audit on production data: classifier dropping 89.5% of fresh postings due to generic "Software Engineer" starving frontend track (228 backend vs 10 frontend). Rewrote classifyTrack in 3 passes with 230+ terms from measured real postings; classified 572→802 (+39%), zero regressions. Also: expanded country lists (NL cities 19→80, IN cities 20→65), fixed NULL posted_at dropping hand-screened jobs, wired /draft N to render tailored CV PDF, /applied N to drain queue. All tests green, pnpm gate passes.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
@pushkarverma3698
pushkarverma3698 merged commit 23131f2 into main Aug 20, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant