mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 00:26:26 +00:00
* feat(linkedin-search): add active status verification for job postings * fix(linkedin-search): scope closed-posting detection to the top card, pin with tests (#280) The first version matched five markers against the whole document, so recruiter boilerplate quoting 'no longer accepting applications' in a description flagged a live job CLOSED. Detection now stops where the description markup begins and matches only the two markers real closed pages carry (closed-job__flavor and the banner text, verified against live guest pages); the three speculative phrases are dropped. Four new fixture tests pin both directions plus the two description false-positive cases - the false-positive pair fails on the unscoped version. * feat(scrape): mark closed-at-source LinkedIn postings expired, never drop (#280) /scrape Step 2 now consumes linkedin-search detail's isActive: a job whose posting page renders the closed banner is written to seen_jobs.json with status expired rather than silently dropped, per the /rank marking pattern - the fix for the ghost-jobs class in #331. isActive: true is documented as absence of the banner, not proof the posting is open. --------- Co-authored-by: Navakanth Reddy Dumpa <navkanthr@gmail.com>
This commit is contained in:
co-authored by
Navakanth Reddy Dumpa
parent
730dcfb079
commit
3d296448bd
@@ -40,6 +40,21 @@ per-file diff commands.
|
||||
|
||||
### Added
|
||||
|
||||
- **`linkedin-search detail` reports closed postings** (#280, adopted with the original
|
||||
author's commit preserved) - a new `isActive` field: `false` when the posting page
|
||||
renders LinkedIn's own "No longer accepting applications" top-card banner. Detection
|
||||
is scoped to the top card and pinned by fixture tests in both directions, including
|
||||
the false-positive case the review required (recruiter boilerplate quoting the closed
|
||||
phrase in a *description* must not flag a live job - on the unscoped first version it
|
||||
did, and the new tests fail there). Only the two markers real closed pages carry are
|
||||
matched (`closed-job__flavor` and the banner text, verified against live guest
|
||||
pages); three speculative phrases from the first version were dropped as
|
||||
false-positive-only risk. `/scrape` Step 2 now consumes the signal: a closed-at-source
|
||||
job is recorded in `seen_jobs.json` as `"status": "expired"` - marked, never silently
|
||||
dropped, per the `/rank` pattern - which is the fix for the ghost-LinkedIn-jobs class
|
||||
in #331 (an expired LinkedIn URL redirects to a *similar live job*, so a stored hit
|
||||
can die unnoticed between scrape and click). `isActive: true` is documented as
|
||||
absence of the banner, not proof the posting is open.
|
||||
- **pypdf ATS text-layer fallback** - `/apply` Step 5d and `tools/verify_pdf.py` extract the CV PDF text layer with **pypdf** first (BSD, `pip install pypdf`) so Windows machines without Poppler still get a mechanical parseability check. Poppler `pdftotext -layout -enc UTF-8` remains the fallback; if both are missing the check still degrades to a visual keyword review. No extra cache or installer. `05-cv-templates.md` `framework_version` 1.4.2 → 1.4.3.
|
||||
- **CI now tests the full documented Python range** (#370) - the Python tool tests job
|
||||
runs a 3.10-3.14 version matrix instead of pinning 3.12, so both the documented 3.10
|
||||
|
||||
Reference in New Issue
Block a user