mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 16:46:24 +00:00
Nothing in the framework checks a posting's language requirements
against what the candidate actually speaks. It is not one of the five
Scoring Dimensions in 04-job-evaluation.md, it is not checked in
/scrape's Step 3 fit assessment, and it is not a field in /rank's JSON
output - even though /apply's Step 1 already extracts a posting's
required language generically, with nowhere to report a mismatch to.
This adds a Language Gate, structured like the existing Eligibility
Gate (read the posting, classify against profile data, hard-stop on a
real mismatch), built on a new structured Languages table in CLAUDE.md
/ 01-candidate-profile.md. /setup now asks for it directly (Path C), or
infers it from a CV/LinkedIn export (Paths A/B - LinkedIn exports
already carry a self-rated Languages section).
The gate compares a posting's stated language requirements against
that table with three outcomes:
- Requires a language not declared at all -> hard FAIL, never
presented.
- Requires a higher level in a language that is declared (e.g. "fluent
English" against a declared B1/B2) -> FLAG, not an auto-reject -
scored and drafted normally, with the gap surfaced so the candidate
judges it themselves (a "fluent" bar reads very differently from a
strict employer vs. one that's flexible on it).
- Requires a language at or below the declared level -> clean PASS.
Wired through the three places that need it: /scrape (Step 3), /rank
(new language_gate/language_note fields alongside the existing
location veto - both are now persisted to seen_jobs.json, not just
used transiently to decide one run's shortlist), and /apply (Step 1's
language extraction now has somewhere to report to).
Out of scope, deliberately: this does not touch the free-form
Deal-breakers list or how it's used elsewhere (e.g. Scoring Dimension
4's relocation check) - that's a separate question this change takes
no position on.
Validated with two live-testing passes against real, unfetched
postings (not fabricated text) across 3 portals and 3 market languages
(Danish, German, Spanish/Argentina): 8/8 postings gated correctly in
the first pass, including ambiguous real-world wording ("you
communicate well in English") a rigid rule would have gotten wrong. A
second pass, run specifically to force a hard-FAIL case, found one
(a Danish posting requiring the ability to read Danish) and confirmed
it persists correctly and would be excluded from /rank's shortlist.
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
74 lines
1.9 KiB
Markdown
74 lines
1.9 KiB
Markdown
---
|
|
framework_version: 1.1.1
|
|
---
|
|
|
|
# Candidate Profile
|
|
|
|
<!-- SETUP: This file is populated by running /setup -->
|
|
<!-- After running /setup, all sections will be filled with your actual information -->
|
|
|
|
## Identity
|
|
- **Name:** [YOUR_NAME]
|
|
- **Location:** [YOUR_ADDRESS]
|
|
- **Phone:** [YOUR_PHONE]
|
|
- **Email:** [YOUR_EMAIL]
|
|
- **LinkedIn:** [YOUR_LINKEDIN_URL]
|
|
- **GitHub:** [YOUR_GITHUB_URL]
|
|
- **Status:** [YOUR_EMPLOYMENT_STATUS]
|
|
- **Constraints:** [YOUR_COMMUTE_OR_LOCATION_CONSTRAINTS]
|
|
|
|
### Languages
|
|
<!-- Every language you can work in professionally, with your honest level. Used by the
|
|
Language Gate in 04-job-evaluation.md and by job-scraper/search-queries.md's query-language
|
|
generation. Omit any language you don't actually work in - an undeclared language is treated as
|
|
a hard no, not a gap to smooth over. -->
|
|
|
|
| Language | Level | Notes |
|
|
|----------|-------|-------|
|
|
| [LANGUAGE] | [LEVEL, e.g. "Native" / "C2" / "B1/B2 (conversational)"] | [optional] |
|
|
|
|
## Education
|
|
|
|
| Degree | Period | Institution | Key Topics |
|
|
|--------|--------|-------------|------------|
|
|
| [DEGREE] | [YEARS] | [INSTITUTION] | [TOPICS] |
|
|
|
|
## Professional Experience
|
|
|
|
### [JOB_TITLE] - [COMPANY] ([START] - [END])
|
|
[LOCATION]
|
|
- [RESPONSIBILITY_OR_ACHIEVEMENT_1]
|
|
- [RESPONSIBILITY_OR_ACHIEVEMENT_2]
|
|
- [RESPONSIBILITY_OR_ACHIEVEMENT_3]
|
|
|
|
<!-- Add more roles as needed -->
|
|
|
|
## Independent Projects
|
|
<!-- Projects outside of employment: freelance, open source, personal -->
|
|
- **[PROJECT_NAME]**: [DESCRIPTION]
|
|
|
|
## Technical Skills
|
|
|
|
### Programming & ML
|
|
- **[LANGUAGE]** ([PROFICIENCY]): [FRAMEWORKS_AND_LIBRARIES]
|
|
- [OTHER_SKILLS]
|
|
|
|
### Domain Expertise
|
|
- [DOMAIN_1]
|
|
- [DOMAIN_2]
|
|
|
|
### Software & Tools
|
|
- [TOOL_LIST]
|
|
|
|
## Publications
|
|
<!-- List peer-reviewed publications, if any -->
|
|
1. [AUTHOR_LIST] ([YEAR]). [TITLE]. [JOURNAL]. [DOI_LINK]
|
|
|
|
## Awards
|
|
- [AWARD] - [EVENT] ([YEAR])
|
|
|
|
## References
|
|
- [NAME], [TITLE], [COMPANY] ([EMAIL], [PHONE])
|
|
|
|
More references available upon request.
|