career-ops

How this site is protected

This site runs the same pages as Kai's private job-search dashboard, over real data. Before every release that data passes three layers, and nothing ships if any of them objects. What you see below is the record of the release you are looking at.

1Known fields

Removed by rule — certain, not guessed.

  • 8 evaluation notes on applications
  • 3 evaluation reports
  • 31 profile fields (phone, visa, salary, city…)
  • 981 casebook excerpts inside tailored drafts
  • 2 places the phone number was masked
2PII detector

A bilingual rules tier, version 2026-09-22.1.

95 data files scanned

1 further values masked

Layer 1 already took the phone number out, so the detector finding nothing more is the expected result.

3Release gate

Scans everything again; any hit stops the release.

Result: pass, 0 problems

Allowed through on purpose: the public email (decision D2) and the resume text (decision D1).

If the detector cannot run, the gate fails closed.

This release: Oct 13, 2026, 10:50 AM UTC.

What the checks caught

Real problems from building this release pipeline. The values themselves are not repeated here.

  • Release gate2026-10-02

    A real phone number was written into a code comment during development, in a file that ships to this server.

    The private-string scan stopped the release. The comment now uses a 555 number; the live server was searched and holds no copy.

  • Reading the output2026-10-02

    The detector masked a 10-digit job-board posting id as a phone number, which broke the link from a tailored draft to its job.

    Caught by reading the output, not by a check. Digits inside URLs and job keys are now treated as identifiers, with a test.

  • PII detector2026-10-02

    The birth-date cue matched "born" inside the company name WindBorne Systems, so a posting date looked like a date of birth.

    The gate re-checks the cue as a whole word. The fix belongs in the detector's own rules.

  • PII detector2026-10-02

    Presidio cut an email out of a LaTeX link with the braces attached ("}{name@…"), so the one public address looked like a different one.

    The gate compares the address inside the span, not the raw span.

  • Release gate2026-10-02

    The private-string scan skipped files over 20 MB, and the job database is 24 MB.

    No size limit any more; a test plants a string past the 20 MB mark.

Pages with withheld parts say so at the top: CV, Pipeline, Follow-ups.

Try the detector

The same rules tier as layer 2, running in your browser. Paste anything — the text never leaves this page and nothing is stored.

7 spansEmail 1Phone 1Payment card 1Bank account 1Date of birth 1National ID 1Health 1

Hi Dana — I'm attaching my notes. You can reach me at alex.rivera@example.comEmail or +1 415-555-0147Phone. My card on file ends 4111 1111 1111 1111Payment card and the account is GB29NWBK60161331926819Bank account. Date of birth 1991-04-02Date of birth. SSN 123-45-6789National ID. MRN: A1234567Health.

Hover a highlight to see which rule matched and its confidence.

Why the patterns look odd

In a Unicode regex a Chinese character counts as a word character, so 号码15337345055 has no word boundary before the digits and an off-the-shelf recognizer walks past it. These rules use digit and letter lookarounds instead, and check the check digit where a format has one — GB 11643-1999 for a Chinese resident ID, Luhn for a card — so a bare 18-digit order number is not reported as an ID.

What this tier cannot do

Regexes find formats, not meaning: no rule finds a person's name or a street address. Those need a model. Recall measured at IoU ≥ 0.5 on a 5,466-record bilingual corpus (2,550 English, 2,916 Chinese), 2026-09-22:

CategoryRules EN / ZHGLiNER2 205MPrivacy Filter 1.5B
Email100% / 100%100% / 26%100% / 100%
Phone85% / 66%96% / 7%96% / 55%
Person name—99% / 28%99% / 34%
Address—12% / 23%92% / 74%
Payment card100% / 21%——

English is strong; Chinese is not. The best detector finds about a third of Chinese names. That gap is why this project treats detection as a release gate over data that carries no real identities, rather than as a way to publish real records with the identities painted over.

Cost of each tier

TierGPU median / p95Laptop CPU
Rules (this page)0.2 / 0.5 ms0.3 / 0.8 ms
GLiNER2-PII (205M)11 / 14 ms87 / 139 ms
Privacy Filter (1.5B)94 / 135 ms607 / 1,409 ms

A 1.5B model at 607 ms on a laptop CPU cannot sit in a request path, so the model tiers run as a batch step on a GPU and the rules tier runs inline. Rules version 2026-09-22.1.