Skip to content

v0.6.0 — cross-source dedup

Choose a tag to compare

@nazboyko nazboyko released this 31 Aug 03:47
· 119 commits to main since this release
d4b09b4

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.js fingerprints 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 like gh_jid are 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

References

  • ADR 0018 — cross-listing is annotated, never merged
  • docs/feature-expansion-plan.md §4 (F3) · PR #29