coo-quack’s jev-pii-checker finds personal information using Jev, pattern matching, and candidate-name checks. The code makes a useful boundary visible: classifying a document, finding sensitive text, and enforcing a policy are separate jobs.

The scanner sends the original text to TypeSafe

The README explicitly warns that scanned text goes to Jev’s API. Masking values in the output happens after that disclosure.

Use it only on material you are authorised to send to the provider. A remote personal-data classifier cannot serve as the local barrier that prevents its own provider from receiving that data.

Detection combines model judgments and local rules

  • A category pass asks about personal information and document sensitivity.
  • Pattern matching finds contact details and identifier-shaped strings; Jev helps classify ambiguous matches.
  • Local word segmentation proposes names for Jev to judge, then code assembles matching spans.
  • A separate policy can raise sensitivity when a named person appears alongside health information or another sensitive category.

The code retains the model’s level and the final policy level. That separation helps explain why an application changed the outcome. Typed answers still need tests for missed information and false alarms.

A high report can still pass the command-line check

An offline test ran the inspected CLI with a synthetic SDK fixture, replacing the network client. The fixture supplied a low model-level sensitivity plus positive name and health-category answers.

The actual policy raised the JSON report to high. With --fail-on high, the actual CLI nevertheless returned exit code 0, the successful-command status.

The cause is visible in src/cli.ts: the report uses policy.level, while the exit-status accumulator uses the earlier aggLevel. Automation that trusts only the exit code can therefore disagree with the report.

This reproduces application wiring under controlled inputs. It says nothing about how Jev would classify that text.

Evaluate the complete enforcement path

The README reports 22/24 correct sensitivity labels on its small corpus. That author-reported model result was not reproduced, and it does not test whether a policy-adjusted report triggers the intended exit status.

Other inspected edges deserve regression tests: findings retain chunk-local offsets, and request accounting increments once for localization even when localization makes several model calls. Masked output should also be tested separately from remote disclosure.

Caveat: source inspected at commit 8fff99912e922ca8bb95ce51d683a9012a13d140; the offline CLI reproduction used no live Jev requests, and this was not a security audit.