fix(scout): English-only requirement reads ENGLISH OK; triage 2026-10-22 decisions

- classify_language_requirement: an ad stating only an English requirement
  ("communication and presentation skills in English") with no Norwegian
  requirement now reads english_ok. Checked after the Norwegian patterns, so
  "fluent English and Norwegian" still reads norwegian_required. Nordic
  Semiconductor's ads read UNCLEAR in the first Norway run.
- Decisions from the 2026-10-22 run: Nordic Embedded Software Test Automation
  Engineer `maybe` (embedded/Bluetooth experience required, coursework only -
  the Kongsberg gate); Nordic ATE Test Engineer `skip`; RUAG Senior DevOps
  Engineer C5I repost `skip` ("Swiss citizenship required"; a different role
  from the July shortlist, whose note is carried into the new row).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
dennisthiessenandClaude Opus 5.5 committed 2026-10-22 09:42:47 +02:00
1 parent 92c3c005b4
commit eee608a213
2 files changed
+35 -8

No files matched your search

+14 -1
View File
@@ -1985,6 +1985,15 @@ _LANG_NORWEGIAN_REQUIRED = [re.compile(p, re.I) for p in (
r"norwegian\s+(?:language\s+)?(?:is\s+)?(?:required|mandatory|a\s+requirement|essential)",
r"(?:must|need\s+to|required\s+to)\s+(?:\w+\s+){0,4}(?:norwegian|scandinavian)",
)]
# An ad that states only an English requirement ("communication and presentation skills in
# English", Nordic Semiconductor 2026-10-22). Checked only AFTER no Norwegian requirement was
# found, so "fluent English and Norwegian" still reads as Norwegian required.
_LANG_ENGLISH_STATED = [re.compile(p, re.I) for p in (
r"(?:communication|presentation|written|spoken|verbal|language)\s+(?:and\s+\w+\s+)?skills?\s+in\s+english",
r"(?:fluent|fluency|proficien\w*|excellent|good|strong)\s+(?:\w+\s+){0,2}(?:in\s+)?english",
r"english\s+(?:is\s+)?(?:required|a\s+must|mandatory)",
r"(?:gode|god|flytende|svært\s+gode)\s+(?:\w+\s+){0,3}engelsk",
)]
# A "Norwegian" that belongs to clearance or citizenship wording is not a language demand.
_LANG_FALSE_CONTEXT = re.compile(
r"clearance|klarering|statsborger|citizen|myndighet|authorit|armed\s+forces|forsvar", re.I)
@@ -2025,7 +2034,11 @@ def classify_language_requirement(text, work_language_tags=None):
if result["lang"] == "norwegian_required":
break
else:
if tags and all(t.startswith("engelsk") or t == "english" for t in tags):
stated = next((m for p in _LANG_ENGLISH_STATED if (m := p.search(text))), None)
if stated:
result.update(lang="english_ok",
evidence=_snippet(text, stated) + " (English stated, no Norwegian requirement)")
elif tags and all(t.startswith("engelsk") or t == "english" for t in tags):
result.update(lang="english_ok", evidence="NAV work-language tag: English only")
elif tags:
result["evidence"] = f"no requirement sentence found; NAV tag: {', '.join(tags)}"