Skip to content

Releases

v0.1.2 — Kaya-parity scrubbing

Choose a tag to compare

@jkt-check jkt-check released this 09 Oct 00:30

Kaya-parity release: user input is now scrubbed aggressively by default, and the tier-0 net catches the generic key shapes that previously slipped through (a pasted CN phone number, a lowercase deepseek_api_key=sk_… assignment).

Added

  • inputLevel config (default aggressive): admitted user messages at agent/pre-step are scrubbed at this depth regardless of level, so pasted PII and credentials are redacted with the full rule table even when tool output stays at balanced. level now governs tool output only.
  • Tier-0 rules: api-key (generic apikey assignments — =, :, and JSON quoted forms, claimed inside longer names like deepseek_api_key=…), rollbar-token, slack-signing-secret, slack-webhook-url, age-secret-key, docker-pat, notion-token, supabase-token, linear-api-key, private-key-truncated (unclosed/orphaned PEM armor), generic-sk-key (sk-/sk_ fallback after every provider-specific rule).
  • Tier-1 rule: key-assignment — the NAME=value secret shape in any letter case (the lowercase/mixed-case forms env-var-secret cannot see), with a value filter that spares code shapes (token = 5, token=computeToken(), dotted identifier chains like password=req.body.password, PEM-armored public keys).

Fixed

  • api-key value class now includes .: api_key=<jwt> is redacted whole. Previously the match stopped after the JWT header segment, which also hid the intact token from generic-bearer — leaking payload and signature.
  • key-assignment's identifier-chain rejection is bounded to segments of at most 20 characters, so dotted credentials with a long random tail (Doppler's dp.pt.… family) stay redacted while code traversals pass through.
  • Plugin-level regression tests for both motivating complaint scenarios (CN phone number, lowercase deepseek_api_key) plus the full 3-level × 2-arm gating matrix. 130 tests, all green.

Install / upgrade

dsh plugin --profile <name> add dsh-secret-scrub

Verified end-to-end inside DeepSeek Harness (desktop profile): a pasted CN phone number arrives at the model as [REDACTED:phone-cn], and a lowercase deepseek_api_key=sk_… assignment as deepseek_[REDACTED:api-key].

Full Changelog: https://github.com/jkt-check/dsh-secret-scrub/blob/v0.1.2/CHANGELOG.md