mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 00:26:26 +00:00
* feat(job-scraper): flag mass-posting and recycled-listing patterns Adds Step 2.5 to detect two distribution patterns that are worth surfacing to the user as a caution signal, not an accusation: - Mass-posting: the same (or near-identical) listing posted across many cities/locations at once, consolidated into one row instead of presented as separate duplicate results. - Recycled listing: a new candidate whose description closely matches an older seen_jobs.json entry from the same company, but under a different title. Neither pattern is treated as proof of anything - fit is never downgraded and results are never excluded because of it, the point is giving the user the signal so they can decide. Explicitly scoped away from naming companies as fraudulent (see the new Important Rules #8): this documents a detectable behavior pattern, not a blacklist. Motivated by real signal seen today: the same req ID posted across 6 different LATAM cities, and a single-city listing duplicated 3x under slightly different titles. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Fix non-executable Pattern B: add snippet field, move check to Step 4 Pattern B instructed comparing a new posting's description against existing seen_jobs.json entries, but the Step 4 schema never stored descriptions - nothing existed to compare against, so the check couldn't run as written. - Adds an additive `snippet` field to the seen_jobs.json schema (same move as #193's `portal` field), populated when each entry is written. - Moves the recycled-listing check itself to Step 4, where the write happens, leaving Step 2.5 as the in-run mass-posting check only. - Makes the snippet match the actual discriminator, not company + different title alone - that alone would false-flag every company that legitimately runs several concurrent open roles, which is exactly what Rule 9's "signal, not accusation" framing is trying to avoid. - Updates the Step 5 / Important Rules cross-references accordingly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Trim to within-run mass-posting detection only Drop the cross-run recycled-listing check (Step 4) and the snippet field it depended on, per review: no evidence the pattern recurs often enough to justify persisting a description snippet on every seen_jobs.json entry permanently. Step 2.5's in-run mass-posting consolidation is cheap and stays. --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>