KerjaCheckBack to the checker

How KerjaCheck works, and how we tested it

KerjaCheck reads a job offer the way a careful friend would: it looks for the specific tricks that Malaysian police and Bank Negara warn about, and it compares the wording with thousands of examples. All of this runs in your browser, so nothing you paste is uploaded.

The pipeline

  1. Red-flag rules. 15 hand-written rules in English, Bahasa Melayu and Manglish, each based on how job scams and mule recruitment are described in PDRM, NSRC and Bank Negara advisories and Malaysian news. They find the exact phrase that is dangerous, which is what gets highlighted, and explain why.
  2. Trained classifier. A logistic-regression model on character n-grams (so it copes with spelling like "u", "ur" and "akaun") plus words and word pairs, trained on 960 labelled example messages. It was trained in Python and exported to a 260 KB file that runs in TypeScript; an automated check confirms the two give identical scores.
  3. Decision. A strong rule match means the message is flagged; the classifier decides whether it looks more like mule recruitment or a job scam. The classifier alone can only raise a caution unless it is very confident, because rules are more reliable on wording it hasn't seen.
  4. What to do. Every result ends with the next step: Semak Mule (PDRM), the 997 National Scam Response Centre, or SSM e-Search for checking a real company.

How we tested it

A model scored on its own training data proves nothing, so the test messages were written by a separate process that never saw the rules, the model or the training data. Each blind set is balanced between real jobs, job scams and mule offers, and deliberately includes hard cases: real cashier, clerk and freelance jobs that talk about bank accounts and payments, and scams written in formal language with invented company names. Some messages are close paraphrases of offers described in Malaysian news reports. The engine was frozen and committed to Git before each blind run.

Blind set A, engine v1 (first look, before any tuning) (150 messages)

MethodScams caughtReal jobs wrongly flaggedPrecision3-way accuracy
Rules only58%4%96.7%68.7%
Classifier only96%22%89.7%87.3%
Rules + classifier (shipped)97%22%89.8%86.7%

Blind set A, engine v2 (after error analysis on set A) (150 messages)

MethodScams caughtReal jobs wrongly flaggedPrecision3-way accuracy
Rules only62%0%100%73.3%
Classifier only97%8%96%94.7%
Rules + classifier (shipped)98%8%96.1%94.7%

Blind set B, engine v2 (final; never used for tuning) (120 messages)

MethodScams caughtReal jobs wrongly flaggedPrecision3-way accuracy
Rules only51.2%17.5%85.4%61.7%
Classifier only96.3%15%92.8%87.5%
Rules + classifier (shipped)96.3%22.5%89.5%87.5%

Final blind set, shipped engine: where it was right and wrong

Actual ↓ / KerjaCheck said →Real jobJob scamMule offer
Real job3163
Job scam2362
Mule offer1138

On the final set the rules alone miss half the scams, and the classifier alone catches 96% with fewer false alarms than the combination. We still combine them because the rules are what find and explain the exact dangerous phrases; a probability on its own can't tell you why. Reducing the rules' false alarms is the next fix. Each check takes well under a millisecond on a laptop.

Honest limitations

Open source

The code, the training data generator, both blind test sets and the evaluation scripts are on GitHub so anyone can re-run these numbers.