v0.6.0 — cross-source dedup
What's new
- The same job arriving from two sources is now spotted by a content fingerprint (SimHash over the description) and flagged: "Also listed elsewhere — apply through one channel only" on the job page, in both directions, and as a line in the Telegram alert
- Nothing is merged or hidden — both rows stay and both are still classified, so a wrong flag costs a note and nothing else
backfill-fingerprints.jsfingerprints existing jobs and links what it finds; re-running it links nothing new- Feed rows that nothing identifies are skipped instead of sharing one synthesised id, and tracking parameters (
utm_*,gh_src,fbclid, …) no longer change a job's id — functional ones likegh_jidare kept
Measured, not assumed
The plan's constants were re-measured against the 731 stored jobs first, and two were wrong for this corpus:
- guard raised to 400 normalized characters — at 200, Jobicy's truncated teasers made two different roles at one company hash identically
- threshold raised to Hamming 7 — every cross-company match up to 7 was genuine, the first false positive lands at 10
- the plan's "skip same-company matches" was dropped: 27% of them are genuinely different roles sharing a company's boilerplate
Backfill on the existing corpus linked 6 real cross-listings, including Lemon.io across three aggregators and Reddit on both WeWorkRemotely and its own Greenhouse board.
Schema
Job.descriptionSimhash(BIGINT, nullable),Job.crossListedOfJobId(nullable self-FK, ON DELETE SET NULL), index on(fetchedAt, descriptionSimhash)— additive
Verification
- 524 unit tests green; migration applied through the container init path; backfill dry-run → real run → idempotent re-run; one live fetch tick; screenshots 1200/375, 0 console errors