Open-source AI job search: scan job portals, score listings A-F, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Gemini, Codex, OpenCode…)
This report presents the forensic synthetic code analysis of santifer/career-ops, a JavaScript project with 59,962 GitHub stars. SynthScan v2.0 examined 65,593 lines of code across 451 source files, recording 115 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 3.2 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 115 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | config/profile.example.yml | 116 | # ── Culture Screen ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | config/profile.example.yml | 135 | # ── Cover Letter Settings ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | config/profile.example.yml | 168 | # ── Contact Preferences ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | config/profile.example.yml | 181 | # ── Outreach / greeting ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | config/profile.example.yml | 192 | # ── Application Email Drafts ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | config/profile.example.yml | 206 | # ── Scan / JD extractor ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | config/profile.example.yml | 218 | # ── Auto-PDF threshold ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | config/profile.example.yml | 239 | # ── Re-apply Cooldown Windows ────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/app/actions/registry.ts | 85 | // ── helpers ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/app/actions/registry.ts | 103 | // ── actions ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/apply-view.tsx | 237 | // ── Watch the agent reach the form live (it navigates, never submits) ─────── | COMMENT |
| MEDIUM | web/src/components/apply-view.tsx | 274 | // ── Issues the interpreter surfaced — never fail mute ─────────────────────── | COMMENT |
| MEDIUM | web/src/components/apply-view.tsx | 304 | // ── Journey rail: Reading → Drafting → Review ─────────────────────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-console.tsx | 21 | // inline next to text, both fed by the single JobsProvider store ────────────── | COMMENT |
| MEDIUM | web/src/components/assistant-console.tsx | 39 | // ── envelope parsing: act ONLY on complete <<act:ID {json}>> envelopes ──────── | COMMENT |
| MEDIUM | web/src/components/assistant-console.tsx | 106 | // ── persistence migration: old {role,content:string} → parts[] ──────────────── | COMMENT |
| MEDIUM | web/src/lib/apply/drive.ts | 10 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/apply/drive.ts | 20 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/apply/diagnose.ts | 7 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/apply/diagnose.ts | 13 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/apply/agent-interpret.ts | 7 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/src/lib/apply/agent-interpret.ts | 14 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | templates/portals.example.yml | 503 | # ── Provider auto-detection ─────────────────────────────────────── | COMMENT |
| MEDIUM | templates/portals.example.yml | 539 | # ── Built-in provider examples ──────────────────────────────────── | COMMENT |
| MEDIUM | templates/portals.example.yml | 1514 | # ============================================================ | COMMENT |
| MEDIUM | templates/portals.example.yml | 1516 | # ============================================================ | COMMENT |
| MEDIUM | templates/portals.example.yml | 1538 | # ============================================================ | COMMENT |
| MEDIUM | templates/portals.example.yml | 1645 | # ── Job Boards ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | templates/portals.example.yml | 1652 | # ── SolidJobs (Polish market) ────────────────────────────────────── | COMMENT |
| MEDIUM | templates/portals.example.yml | 1704 | # ── JustJoin.it / NoFluffJobs (Polish tech market) ──────────────────────── | COMMENT |
| MEDIUM | templates/portals.example.yml | 1743 | # ── HigherEdJobs (university / higher-ed RSS) ──────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 161 | # "Add these 5 companies to portals.yml" | COMMENT |
| LOW | config/plugins.example.yml | 1 | # career-ops — Plugin activation (opt-in) | COMMENT |
| LOW | config/profile.example.yml | 81 | # This is separate from language.modes_dir: modes_dir selects market | COMMENT |
| LOW | config/profile.example.yml | 101 | spend_tier: standard | COMMENT |
| LOW | config/profile.example.yml | 121 | # # What you actively look for in a team culture (e.g. org size, meeting frequency, async-first). | COMMENT |
| LOW | config/profile.example.yml | 141 | # Your notice period in calendar days. Surfaced as a prompt default when the | COMMENT |
| LOW | config/profile.example.yml | 161 | target_level: B2 | COMMENT |
| LOW | config/profile.example.yml | 181 | # ── Outreach / greeting ───────────────────────────────────────────────────── | COMMENT |
| LOW | config/profile.example.yml | 201 | # # Use this when you want the email body to say "the email used to send this | COMMENT |
| LOW | config/profile.example.yml | 221 | # `bash batch/batch-runner.sh`). | COMMENT |
| LOW | config/profile.example.yml | 241 | # Define cooldown windows for companies where you've recently applied. | COMMENT |
| LOW | plugins/_types.js | 1 | // Type catalog for the career-ops plugin contract. | COMMENT |
| LOW | web/src/lib/apply/drive.ts | 1 | import { spawn } from "node:child_process"; | COMMENT |
| LOW | web/src/lib/apply/issue.ts | 1 | // Client-safe (no playwright import). A structured, user-facing problem the | COMMENT |
| LOW | dashboard/internal/data/pdf.go | 161 | return manifest | COMMENT |
| LOW | dashboard/internal/data/derive.go | 21 | reMoneySpan = regexp.MustCompile(`~?(?:[$€£]|CHF ?|EUR ?|USD ?|GBP ?)\d[\d,]*(?:\.\d+)?[KkMm]?(?:\s*[-–]\s*(?:[$€£])?\d | COMMENT |
| LOW | dashboard/internal/data/career.go | 761 | } | COMMENT |
| LOW | .github/workflows/auto-triage-scan-output.yml | 1 | name: Auto-triage scan output | COMMENT |
| LOW | templates/portals.example.yml | 1 | # Portal Scanner Configuration | COMMENT |
| LOW | templates/portals.example.yml | 21 | # 4. Adjust search_queries for your preferred job boards | COMMENT |
| LOW | templates/portals.example.yml | 41 | # - Any `block` keyword present → reject | COMMENT |
| LOW | templates/portals.example.yml | 61 | # - "USA" | COMMENT |
| LOW | templates/portals.example.yml | 81 | # - min/max are annual compensation filters (use annualized values) | COMMENT |
| LOW | templates/portals.example.yml | 101 | COMMENT | |
| LOW | templates/portals.example.yml | 121 | # - "forms.gle" | COMMENT |
| LOW | templates/portals.example.yml | 141 | # - If this entire block is absent, descriptions are not filtered (default) | COMMENT |
| LOW | templates/portals.example.yml | 161 | # roles where you want the JD to actually mention a concrete AI tool) without | COMMENT |
| LOW | templates/portals.example.yml | 461 | # -- Tracked companies -- | COMMENT |
| LOW | templates/portals.example.yml | 481 | # parser author (reuse across companies, debug flags, JSON snapshots, etc.). | COMMENT |
| LOW | templates/portals.example.yml | 501 | # enabled: true | COMMENT |
| LOW | templates/portals.example.yml | 521 | # tencent careers.tencent.com (zh-CN board; each keywords: entry queried server-side, results deduped) | COMMENT |
| LOW | templates/portals.example.yml | 541 | # tracked_companies, uncomment, and adjust. Auto-detected providers only | COMMENT |
| LOW | templates/portals.example.yml | 561 | # | COMMENT |
| LOW | templates/portals.example.yml | 581 | # enabled: true | COMMENT |
| LOW | templates/portals.example.yml | 601 | # # Branded hosts carry no "successfactors" string, so set provider: explicitly | COMMENT |
| LOW | templates/portals.example.yml | 621 | # # the board is 100k+ postings otherwise | COMMENT |
| LOW | templates/portals.example.yml | 641 | # - name: Arbeitsagentur — AI Roles # German federal jobs API | COMMENT |
| LOW | templates/portals.example.yml | 661 | # searchLocation: "" # optional location filter | COMMENT |
| LOW | templates/portals.example.yml | 681 | # - name: Heckler & Koch # single-company; SSR Nuxt vacancy list | COMMENT |
| LOW | templates/portals.example.yml | 701 | # - name: Mercedes-Benz # BeeSite (milch & zucker) search backend | COMMENT |
| LOW | templates/portals.example.yml | 721 | # enabled: true | COMMENT |
| LOW | templates/portals.example.yml | 741 | # enabled: true | COMMENT |
| LOW | templates/portals.example.yml | 761 | # provider: larajobs | COMMENT |
| LOW | templates/portals.example.yml | 781 | # | COMMENT |
| LOW | templates/portals.example.yml | 801 | # - name: Booking.com | COMMENT |
| LOW | templates/portals.example.yml | 1521 | # them up. | COMMENT |
| LOW | templates/portals.example.yml | 1741 | notes: "SEA job platform covering ID/SG/MY/VN. Uses searchJobsV3 GraphQL endpoint (v2-alc). WAF blocks non-browser r | COMMENT |
| LOW | templates/benchmarks.yml | 1 | # Career-Ops — Market Calibration Benchmarks | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | AGENTS.md | 148 | #### Step 0: Free Tier Check | COMMENT |
| LOW | AGENTS.md | 156 | #### Step 1: CV (required) | COMMENT |
| LOW | AGENTS.md | 167 | #### Step 2: Profile (required) | COMMENT |
| LOW⚡ | AGENTS.md | 183 | #### Step 3: Portals (recommended) | COMMENT |
| LOW⚡ | AGENTS.md | 189 | #### Step 4: Tracker | COMMENT |
| LOW⚡ | AGENTS.md | 198 | #### Step 5: Get to know the user (important for quality) | COMMENT |
| LOW | AGENTS.md | 215 | #### Step 6: Ready | COMMENT |
| LOW⚡ | modes/interview.md | 27 | ### Step 1: Target Roles & Ambitions | COMMENT |
| LOW⚡ | modes/interview.md | 35 | ### Step 2: Experience & Core Achievements | COMMENT |
| LOW⚡ | modes/interview.md | 42 | ### Step 3: Digging for Metrics (Business Impact) | COMMENT |
| LOW⚡ | modes/interview.md | 48 | ### Step 4: Uncovering Hidden Skills | COMMENT |
| LOW⚡ | docs/RUNNING_ON_A_BUDGET.md | 158 | ### Step 1: Scan for Job Offers (0 Tokens) | COMMENT |
| LOW⚡ | docs/RUNNING_ON_A_BUDGET.md | 166 | ### Step 2: Fetch the Job Description (0 Tokens) | COMMENT |
| LOW⚡ | docs/RUNNING_ON_A_BUDGET.md | 169 | ### Step 3: Evaluate the Offer (~4,500 Tokens) | COMMENT |
| LOW | docs/RUNNING_ON_A_BUDGET.md | 185 | ### Step 4: Tailor the CV HTML (~3,000 Tokens) | COMMENT |
| LOW | docs/RUNNING_ON_A_BUDGET.md | 200 | ### Step 5: Generate ATS-Optimized PDF (0 Tokens) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.fr.md | 283 | │ └── batch-runner.sh # Script d'orchestration | CODE |
| MEDIUM | modes/batch.md | 76 | ### Manual multi-agent fan-out | COMMENT |
| MEDIUM | web/src/app/actions/registry.ts | 3 | // so the human UI and the agentic UI can never drift. Pure module (no React | COMMENT |
| MEDIUM | web/src/app/api/apply/drive/route.ts | 9 | // Streamed agentic drive over an OPEN session: the AI drives the headed page to | COMMENT |
| MEDIUM | web/src/app/api/apply/session/route.ts | 5 | export const maxDuration = 300; // the agentic drive + interpretation fallbacks spawn a planner | CODE |
| MEDIUM | web/src/app/api/apply/session/route.ts | 9 | // cliId enables the agentic fallback (the AI interprets the live form) when | COMMENT |
| MEDIUM | web/src/components/portals-view.tsx | 26 | // map the agentic "fix-portal" workers to the company they're repairing | COMMENT |
| MEDIUM | web/src/components/apply/apply-provider.tsx | 74 | // Stream the agentic drive (the AI reaching the form live) and finalize the | COMMENT |
| MEDIUM | web/src/components/jobs/worker-card.tsx | 55 | // Keeping it single is what guarantees the human UI and the agentic UI stay | COMMENT |
| MEDIUM | web/src/lib/apply/issue.ts | 8 | // One step of the agentic drive loop (the AI reaching/filling the form live). | COMMENT |
| MEDIUM | .github/workflows/no-user-data.yml | 6 | # under examples/. Tracked scaffolding (.gitkeep keepers, dir READMEs) is exempt. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | web/src/app/api/status/route.ts | 41 | // Find the Status column index from the header row (robust to 8- vs 9-col). | COMMENT |
| MEDIUM | web/src/components/cv/cv-ingest.tsx | 158 | // so the Explorer auto-fires the FREE scan itself (robust, no push/replaceState race). | COMMENT |
| MEDIUM | dashboard/internal/ui/screens/pipeline.go | 326 | // the current UI state so manual refresh feels seamless. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | modes/pdf.md | 24 | 15. Read `name` from `config/profile.yml` → normalize to kebab-case lowercase (e.g. "John Doe" → "john-doe") → `{candida | CODE |
| LOW | web/src/lib/apply/diagnose.ts | 247 | const ph = shell?.querySelector('.select__placeholder, [class*="placeholder" i]'); | CODE |
| LOW | dashboard/internal/ui/screens/pipeline_test.go | 121 | {Company: "Acme Corp", Role: "Senior PM, Voice AI", Status: "Evaluated", Score: 4.2, Notes: "Series B in Madrid"}, | CODE |
| LOW | dashboard/internal/ui/screens/pipeline_test.go | 138 | if len(pm.filtered) != 1 || pm.filtered[0].Company != "Acme Corp" { | CODE |
| LOW | dashboard/internal/ui/screens/pipeline_test.go | 145 | if len(pm.filtered) != 1 || pm.filtered[0].Company != "Acme Corp" { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | templates/portals.example.yml | 26 | # Set recheck_after_days to let previously added URLs become eligible again | COMMENT |