job-research/CONTEXT.md
2026-05-27 16:09:28 +02:00

4.2 KiB

Job Discovery

This context exists to describe the domain language for a local system that finds and ranks relevant job opportunities for a single candidate.

Language

Candidate Profile: The structured representation of the candidate's background, skills, experience, and other durable career facts used to evaluate job fit. Avoid: CV only, resume dump

Search Preferences: The current, overrideable search-time preferences used to refine ranking and filtering without changing the underlying Candidate Profile. Search Preferences may override the markdown profile for the current search session, but do not silently rewrite factual career history. Avoid: permanent profile, CV facts

Target Role Profile: The specific kind of role the system is optimizing toward when searching and ranking jobs. For now: Data Engineer, around 2-3 years of experience, strong in Python, good in SQL, Terraform, GCP, and BigQuery, anywhere in France, CDI only, with no preference between remote, hybrid, or onsite, and with French and English listings both in scope but a slight preference for French. France-based means the listing explicitly targets France or a French city or region; company nationality alone is not enough. Primary matches include Data Engineer, Analytics Engineer, BI Engineer with strong SQL/Python pipelines, and Junior Data Platform Engineer. ML Engineer, Data Scientist, Backend Engineer, and Senior Platform Engineer are Stretch Opportunities rather than primary matches. Avoid: matching job, good fit

Job Listing: A published opportunity from a job source that can be extracted, normalized, scored, and discussed. Avoid: offer, ad

Listing Snapshot: One captured observation of a Job Listing from a source at a specific point in time. Multiple Listing Snapshots may correspond to the same Job Listing when a source updates or reposts the opportunity. Avoid: duplicate listing, raw page only

Dismissed Listing: A Job Listing the candidate has reviewed and marked as not worth seeing prominently again. It remains stored, but should be hidden or deprioritized in later results. Avoid: deleted listing, ignored scrape

Listing Freshness: The recency status of a Job Listing based on its published or refreshed date. For now: listings from the last 14 days are preferred, 15-30 day listings are penalized, and listings older than 30 days are hidden unless the source indicates a recent refresh. Avoid: old job, stale ad

Stretch Opportunity: A Job Listing that aligns well enough to review but has a meaningful mismatch, especially on seniority, so it should be shown separately from the main ranked results. Avoid: normal match, false positive

Example Dialogue

Dev: Should this Job Listing rank high because it mentions Python and BigQuery?

Domain expert: Only if it fits the Target Role Profile, not just the Candidate Profile. A senior platform role might mention those skills and still be a poor fit.

Dev: So the Candidate Profile captures the person's background, while the Target Role Profile captures what they want now?

Domain expert: Exactly. The ranking should optimize for the Target Role Profile and use the Candidate Profile as evidence.

Dev: If the user changes their mind in chat, does that update their past experience too?

Domain expert: No. Search Preferences can override what the system searches for right now, but factual career history stays in the Candidate Profile unless explicitly edited.

Dev: What about senior roles that still mention the right stack?

Domain expert: Those are Stretch Opportunities. Keep them visible, but don't let them pollute the main ranking.

Dev: If a listing is a perfect fit but was posted six weeks ago, should it still rank high?

Domain expert: No. Listing Freshness matters. Older listings should drop out unless the source clearly shows they were refreshed.

Dev: If the same role is reposted under a new URL, is that a new listing?

Domain expert: Not necessarily. Keep one Job Listing when confidence is high that it is the same opportunity, but preserve each Listing Snapshot underneath.

Dev: If I reject a listing once, should it disappear forever?

Domain expert: Not necessarily forever, but it should become a Dismissed Listing so it stops wasting attention while still remaining in the record.