Repository Analysis

santifer/career-ops

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…)

3.2 Likely human-written View on GitHub

Analysis Overview

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).

3.2
Adjusted Score
3.2
Raw Score
100%
Time Factor
2026-07-13
Last Push
60.0K
Stars
JavaScript
Language
65.6K
Lines of Code
451
Files
115
Pattern Hits
2026-07-14
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

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.

Severity Breakdown

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.

CRITICAL 0HIGH 0MEDIUM 45LOW 70

Directory Score Breakdown

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.

Pattern Findings

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.

Decorative Section Separators31 hits · 93 pts
SeverityFileLineSnippetContext
MEDIUMconfig/profile.example.yml116# ── Culture Screen ───────────────────────────────────────────────────────────COMMENT
MEDIUMconfig/profile.example.yml135# ── Cover Letter Settings ──────────────────────────────────────────────────COMMENT
MEDIUMconfig/profile.example.yml168# ── Contact Preferences ──────────────────────────────────────────────────────COMMENT
MEDIUMconfig/profile.example.yml181# ── Outreach / greeting ─────────────────────────────────────────────────────COMMENT
MEDIUMconfig/profile.example.yml192# ── Application Email Drafts ────────────────────────────────────────────────COMMENT
MEDIUMconfig/profile.example.yml206# ── Scan / JD extractor ─────────────────────────────────────────────────────COMMENT
MEDIUMconfig/profile.example.yml218# ── Auto-PDF threshold ──────────────────────────────────────────────────────COMMENT
MEDIUMconfig/profile.example.yml239# ── Re-apply Cooldown Windows ──────────────────────────────────────────────COMMENT
MEDIUMweb/src/app/actions/registry.ts85// ── helpers ──────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/app/actions/registry.ts103// ── actions ──────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/components/apply-view.tsx237// ── Watch the agent reach the form live (it navigates, never submits) ───────COMMENT
MEDIUMweb/src/components/apply-view.tsx274// ── Issues the interpreter surfaced — never fail mute ───────────────────────COMMENT
MEDIUMweb/src/components/apply-view.tsx304// ── Journey rail: Reading → Drafting → Review ───────────────────────────────COMMENT
MEDIUMweb/src/components/assistant-console.tsx21// inline next to text, both fed by the single JobsProvider store ──────────────COMMENT
MEDIUMweb/src/components/assistant-console.tsx39// ── envelope parsing: act ONLY on complete <<act:ID {json}>> envelopes ────────COMMENT
MEDIUMweb/src/components/assistant-console.tsx106// ── persistence migration: old {role,content:string} → parts[] ────────────────COMMENT
MEDIUMweb/src/lib/apply/drive.ts10// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/lib/apply/drive.ts20// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/lib/apply/diagnose.ts7// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/lib/apply/diagnose.ts13// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/lib/apply/agent-interpret.ts7// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMweb/src/lib/apply/agent-interpret.ts14// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMtemplates/portals.example.yml503# ── Provider auto-detection ───────────────────────────────────────COMMENT
MEDIUMtemplates/portals.example.yml539# ── Built-in provider examples ────────────────────────────────────COMMENT
MEDIUMtemplates/portals.example.yml1514 # ============================================================COMMENT
MEDIUMtemplates/portals.example.yml1516 # ============================================================COMMENT
MEDIUMtemplates/portals.example.yml1538 # ============================================================COMMENT
MEDIUMtemplates/portals.example.yml1645# ── Job Boards ────────────────────────────────────────────────────────COMMENT
MEDIUMtemplates/portals.example.yml1652 # ── SolidJobs (Polish market) ──────────────────────────────────────COMMENT
MEDIUMtemplates/portals.example.yml1704 # ── JustJoin.it / NoFluffJobs (Polish tech market) ────────────────────────COMMENT
MEDIUMtemplates/portals.example.yml1743 # ── HigherEdJobs (university / higher-ed RSS) ────────────────────────COMMENT
Over-Commented Block48 hits · 38 pts
SeverityFileLineSnippetContext
LOWREADME.md161# "Add these 5 companies to portals.yml"COMMENT
LOWconfig/plugins.example.yml1# career-ops — Plugin activation (opt-in)COMMENT
LOWconfig/profile.example.yml81 # This is separate from language.modes_dir: modes_dir selects marketCOMMENT
LOWconfig/profile.example.yml101spend_tier: standardCOMMENT
LOWconfig/profile.example.yml121# # What you actively look for in a team culture (e.g. org size, meeting frequency, async-first).COMMENT
LOWconfig/profile.example.yml141 # Your notice period in calendar days. Surfaced as a prompt default when theCOMMENT
LOWconfig/profile.example.yml161 target_level: B2COMMENT
LOWconfig/profile.example.yml181# ── Outreach / greeting ─────────────────────────────────────────────────────COMMENT
LOWconfig/profile.example.yml201# # Use this when you want the email body to say "the email used to send thisCOMMENT
LOWconfig/profile.example.yml221# `bash batch/batch-runner.sh`).COMMENT
LOWconfig/profile.example.yml241# Define cooldown windows for companies where you've recently applied.COMMENT
LOWplugins/_types.js1// Type catalog for the career-ops plugin contract.COMMENT
LOWweb/src/lib/apply/drive.ts1import { spawn } from "node:child_process";COMMENT
LOWweb/src/lib/apply/issue.ts1// Client-safe (no playwright import). A structured, user-facing problem theCOMMENT
LOWdashboard/internal/data/pdf.go161 return manifestCOMMENT
LOWdashboard/internal/data/derive.go21 reMoneySpan = regexp.MustCompile(`~?(?:[$€£]|CHF ?|EUR ?|USD ?|GBP ?)\d[\d,]*(?:\.\d+)?[KkMm]?(?:\s*[-–]\s*(?:[$€£])?\dCOMMENT
LOWdashboard/internal/data/career.go761 }COMMENT
LOW.github/workflows/auto-triage-scan-output.yml1name: Auto-triage scan outputCOMMENT
LOWtemplates/portals.example.yml1# Portal Scanner ConfigurationCOMMENT
LOWtemplates/portals.example.yml21# 4. Adjust search_queries for your preferred job boardsCOMMENT
LOWtemplates/portals.example.yml41# - Any `block` keyword present → rejectCOMMENT
LOWtemplates/portals.example.yml61# - "USA"COMMENT
LOWtemplates/portals.example.yml81# - min/max are annual compensation filters (use annualized values)COMMENT
LOWtemplates/portals.example.yml101COMMENT
LOWtemplates/portals.example.yml121# - "forms.gle"COMMENT
LOWtemplates/portals.example.yml141# - If this entire block is absent, descriptions are not filtered (default)COMMENT
LOWtemplates/portals.example.yml161# roles where you want the JD to actually mention a concrete AI tool) withoutCOMMENT
LOWtemplates/portals.example.yml461# -- Tracked companies --COMMENT
LOWtemplates/portals.example.yml481# parser author (reuse across companies, debug flags, JSON snapshots, etc.).COMMENT
LOWtemplates/portals.example.yml501# enabled: trueCOMMENT
LOWtemplates/portals.example.yml521# tencent careers.tencent.com (zh-CN board; each keywords: entry queried server-side, results deduped)COMMENT
LOWtemplates/portals.example.yml541# tracked_companies, uncomment, and adjust. Auto-detected providers onlyCOMMENT
LOWtemplates/portals.example.yml561#COMMENT
LOWtemplates/portals.example.yml581# enabled: trueCOMMENT
LOWtemplates/portals.example.yml601# # Branded hosts carry no "successfactors" string, so set provider: explicitlyCOMMENT
LOWtemplates/portals.example.yml621# # the board is 100k+ postings otherwiseCOMMENT
LOWtemplates/portals.example.yml641# - name: Arbeitsagentur — AI Roles # German federal jobs APICOMMENT
LOWtemplates/portals.example.yml661# searchLocation: "" # optional location filterCOMMENT
LOWtemplates/portals.example.yml681# - name: Heckler & Koch # single-company; SSR Nuxt vacancy listCOMMENT
LOWtemplates/portals.example.yml701# - name: Mercedes-Benz # BeeSite (milch & zucker) search backendCOMMENT
LOWtemplates/portals.example.yml721# enabled: trueCOMMENT
LOWtemplates/portals.example.yml741# enabled: trueCOMMENT
LOWtemplates/portals.example.yml761# provider: larajobsCOMMENT
LOWtemplates/portals.example.yml781#COMMENT
LOWtemplates/portals.example.yml801# - name: Booking.comCOMMENT
LOWtemplates/portals.example.yml1521 # them up.COMMENT
LOWtemplates/portals.example.yml1741 notes: "SEA job platform covering ID/SG/MY/VN. Uses searchJobsV3 GraphQL endpoint (v2-alc). WAF blocks non-browser rCOMMENT
LOWtemplates/benchmarks.yml1# Career-Ops — Market Calibration BenchmarksCOMMENT
Structural Annotation Overuse16 hits · 32 pts
SeverityFileLineSnippetContext
LOWAGENTS.md148#### Step 0: Free Tier CheckCOMMENT
LOWAGENTS.md156#### Step 1: CV (required)COMMENT
LOWAGENTS.md167#### Step 2: Profile (required)COMMENT
LOWAGENTS.md183#### Step 3: Portals (recommended)COMMENT
LOWAGENTS.md189#### Step 4: TrackerCOMMENT
LOWAGENTS.md198#### Step 5: Get to know the user (important for quality)COMMENT
LOWAGENTS.md215#### Step 6: ReadyCOMMENT
LOWmodes/interview.md27### Step 1: Target Roles & AmbitionsCOMMENT
LOWmodes/interview.md35### Step 2: Experience & Core AchievementsCOMMENT
LOWmodes/interview.md42### Step 3: Digging for Metrics (Business Impact)COMMENT
LOWmodes/interview.md48### Step 4: Uncovering Hidden SkillsCOMMENT
LOWdocs/RUNNING_ON_A_BUDGET.md158### Step 1: Scan for Job Offers (0 Tokens)COMMENT
LOWdocs/RUNNING_ON_A_BUDGET.md166### Step 2: Fetch the Job Description (0 Tokens)COMMENT
LOWdocs/RUNNING_ON_A_BUDGET.md169### Step 3: Evaluate the Offer (~4,500 Tokens)COMMENT
LOWdocs/RUNNING_ON_A_BUDGET.md185### Step 4: Tailor the CV HTML (~3,000 Tokens)COMMENT
LOWdocs/RUNNING_ON_A_BUDGET.md200### Step 5: Generate ATS-Optimized PDF (0 Tokens)COMMENT
Modern AI Meta-Vocabulary11 hits · 31 pts
SeverityFileLineSnippetContext
MEDIUMREADME.fr.md283│ └── batch-runner.sh # Script d'orchestrationCODE
MEDIUMmodes/batch.md76### Manual multi-agent fan-outCOMMENT
MEDIUMweb/src/app/actions/registry.ts3// so the human UI and the agentic UI can never drift. Pure module (no ReactCOMMENT
MEDIUMweb/src/app/api/apply/drive/route.ts9// Streamed agentic drive over an OPEN session: the AI drives the headed page toCOMMENT
MEDIUMweb/src/app/api/apply/session/route.ts5export const maxDuration = 300; // the agentic drive + interpretation fallbacks spawn a plannerCODE
MEDIUMweb/src/app/api/apply/session/route.ts9// cliId enables the agentic fallback (the AI interprets the live form) whenCOMMENT
MEDIUMweb/src/components/portals-view.tsx26 // map the agentic "fix-portal" workers to the company they're repairingCOMMENT
MEDIUMweb/src/components/apply/apply-provider.tsx74 // Stream the agentic drive (the AI reaching the form live) and finalize theCOMMENT
MEDIUMweb/src/components/jobs/worker-card.tsx55// Keeping it single is what guarantees the human UI and the agentic UI stayCOMMENT
MEDIUMweb/src/lib/apply/issue.ts8// One step of the agentic drive loop (the AI reaching/filling the form live).COMMENT
MEDIUM.github/workflows/no-user-data.yml6# under examples/. Tracked scaffolding (.gitkeep keepers, dir READMEs) is exempt.COMMENT
AI Slop Vocabulary3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMweb/src/app/api/status/route.ts41 // Find the Status column index from the header row (robust to 8- vs 9-col).COMMENT
MEDIUMweb/src/components/cv/cv-ingest.tsx158 // so the Explorer auto-fires the FREE scan itself (robust, no push/replaceState race).COMMENT
MEDIUMdashboard/internal/ui/screens/pipeline.go326// the current UI state so manual refresh feels seamless.COMMENT
Fake / Example Data5 hits · 5 pts
SeverityFileLineSnippetContext
LOWmodes/pdf.md2415. Read `name` from `config/profile.yml` → normalize to kebab-case lowercase (e.g. "John Doe" → "john-doe") → `{candidaCODE
LOWweb/src/lib/apply/diagnose.ts247 const ph = shell?.querySelector('.select__placeholder, [class*="placeholder" i]');CODE
LOWdashboard/internal/ui/screens/pipeline_test.go121 {Company: "Acme Corp", Role: "Senior PM, Voice AI", Status: "Evaluated", Score: 4.2, Notes: "Series B in Madrid"},CODE
LOWdashboard/internal/ui/screens/pipeline_test.go138 if len(pm.filtered) != 1 || pm.filtered[0].Company != "Acme Corp" {CODE
LOWdashboard/internal/ui/screens/pipeline_test.go145 if len(pm.filtered) != 1 || pm.filtered[0].Company != "Acme Corp" {CODE
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtemplates/portals.example.yml26# Set recheck_after_days to let previously added URLs become eligible againCOMMENT