""" Deterministic regression for Phase 7 / R13: CLEAN JD extraction. Locks in two complementary fixes (no LLM, no browser, no network): 1. src/external_ats.py::extract_external_keywords must REJECT checker-overlay CTA/marketing phrases (Simplify/Jobalytics) even when they leak into the JD text, while still surfacing genuine craft terms. 2. extension/content.js must strip page/extension chrome (stripChrome + OVERLAY_CTA + cloneNode + known checker-overlay substrings) before the generic densest-block heuristic measures text. Runs from the repo root in < 5 seconds. Exits non-zero on any failure. """ import os import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") sys.path.insert(0, os.path.abspath(".")) from src.external_ats import extract_external_keywords ok = True def check(name, cond, detail=""): global ok ok = ok and bool(cond) print(f" [{'PASS' if cond else 'FAIL'}] {name} {detail}") # ── 1. Build a noisy JD: real PM/AI content + the full overlay CTA block ────── REAL_JD = ( "We are hiring a Senior Product Manager to own product strategy and the " "product roadmap. You will drive stakeholder management across global teams, " "apply machine learning to product discovery, run a/b testing and user " "research, and lead go-to-market for our SaaS B2B platform." ) OVERLAY_BLOCK = ( "Show Match Details\nPeople Clicked Apply\nMonth Free Trial\nFree Trial\n" "Actively Reviewing Applicants\nMessage Hiring Managers\n" "Get Personalized Cover Letter\nGet Insider Access\nDays Ago\n" "Members Use Premium\nRecruiting Bond\nVisit Website\nLacs Pa\n" "Help Me Stand\nTailor My Resume\nUses Advanced Ai\nTry Premium" ) noisy_jd = REAL_JD + "\n\n" + OVERLAY_BLOCK kw = [k.lower() for k in extract_external_keywords(noisy_jd)] # ── 2. NONE of the UI phrases may appear as / inside any returned keyword ───── UI_PHRASES = [ "show match details", "people clicked apply", "month free trial", "free trial", "actively reviewing applicants", "message hiring managers", "get personalized cover letter", "get insider access", "members use premium", "recruiting bond", "visit website", "lacs pa", "help me stand", "tailor my resume", "uses advanced ai", "try premium", ] leaked = [p for p in UI_PHRASES if any(p in k for k in kw)] check("no UI/CTA/marketing phrase became a keyword", not leaked, f"leaked={leaked}") # ── 3. At least 6 genuine craft terms survive ───────────────────────────────── CRAFT = [ "roadmap", "stakeholder management", "machine learning", "a/b testing", "user research", "go-to-market", "saas", "b2b", ] survived = [t for t in CRAFT if any(t in k for k in kw)] check("at least 6 genuine craft terms survive", len(survived) >= 6, f"{len(survived)}/{len(CRAFT)} survived={survived}") # ── 4. content.js statically proves the client-side strip exists ────────────── js = open("extension/content.js", encoding="utf-8").read().lower() required = ["stripchrome", "overlay_cta", "clonenode", "simplify", "jobalytics"] missing = [r for r in required if r not in js] check("content.js strips chrome + checker overlays", not missing, f"missing={missing}") # ── 5. PASS/FAIL banner ─────────────────────────────────────────────────────── print("\n" + ("\u2713 CLEAN-JD-EXTRACTION REGRESSION PASSES" if ok else "\u2717 SOME CHECKS FAILED")) sys.exit(0 if ok else 1)