Skip to content
Benchmarks

EVALUATION METHOD

Mutation

An operator alters the secret itself: its length, its last or first character, its alphabet, a delimiter or a segment. Whether the altered value is still a secret depends on the format contract, and the result is scored only where the contract says it is.

  • Run 6183a594 · 2026-10-10
  • redact-secret 0.1.0-beta.14 · Published npm package · default detectors
  • Accounting v1.1

1 · How it runs

Does a scanner still find a value that was altered but is still valid?

  1. InputA source case with a single secret in a known format.
  2. ChangeA lexical, boundary or structural operator alters the value.
  3. CheckWhere the altered value still matches the format contract, the scanner is expected to detect it as before. Where it no longer matches, the expectation is deferred and nothing is scored.
Source cases
4,913
Altered values
12,037
Operators
7

2 · Recorded now

Does detection survive an altered value?

Only values that still match the format contract are scored. One row per operator.
Mutation: checks that did not hold, per scanner
Operatorredact-secret0.1.0-beta.14gitleaks8.30.1trufflehog3.97.4flare-redact1.6.1
Same detection, format still valid
lexical.length-minus-oneDrops the last character of the secret0 of 414184 of 414288 of 414352 of 414
lexical.length-plus-oneAppends one character to the secret0 of 416187 of 416306 of 416350 of 416
lexical.replace-lastReplaces the last character of the secret0 of 1,505502 of 1,505929 of 1,5051,083 of 1,505
lexical.invalid-alphabetReplaces the last character with one outside the formatNeeds review 2,020 unscoredNeeds review 2,020 unscoredNeeds review 2,020 unscoredNeeds review 2,020 unscored
lexical.prefix-changeReplaces the first character of the secret0 of 4311 of 4314 of 4341 of 43
boundary.remove-delimiterRemoves one delimiter (dot, underscore or hyphen) from the secret0 of 11276 of 11286 of 11293 of 112
structural.remove-segmentRemoves one delimited segment (SendGrid and Slack token formats only)Needs review 48 unscoredNeeds review 48 unscoredNeeds review 48 unscoredNeeds review 48 unscored
The altered value on its own
Value detectedA value that should be detected is, within its expected envelope0 of 2,490955 of 2,4901,604 of 2,4901,899 of 2,490

Altered values where the check did not hold, of those scored for that scanner.

A count opens the checks behind it: the ones that did not hold, from this run only. "Needs review" opens the checks that wait for a person. A zero has none to open, and a scanner that did not run has none to list.

Needs review

9,547 altered values no longer match the format contract. Their expectation is deferred, so they are counted in no row above.

3 · How to read it

Reading mutation

  • Most altered values no longer match the format. Those are deferred to review, because a scanner may reasonably report a valid substring or ignore the value.
  • The authored pairs in this method are the twin method. They are not repeated here.

4 · Exact inputs

Where the cases come from

4,913 source cases read by this method. Synthetic content only.

Suites

Every case comes from a published suite. Open a suite to read its fixtures.

Show the 75 suites
Suites the cases come from
SuiteSource cases
Reviewed credential formatscommon-formats58
Detection accuracyaccuracy10
GitHub token contextstoken-contexts6
Credential formatscredential-formats27
Context & boundariescontext-edges116
Negative controlsnegative-controls24
SendGrid regressionssendgrid-regressions38
Reference syntaxreference-syntax26
Beta.3 regressionsmilestone-6-closed92
Detector coveragedetector-coverage1,182
Untargeted real-world shapesreal-world-shapes120
Beta.8 low-coverage hardening (#207)beta8-207249
Beta.8 documented-stable hardening (#209)beta8-20948
Beta.8 AI inference arrival evidence (#208)beta8-20872
Beta.8 · LangSmith and Langfuse arrival evidencebeta8-21038
Beta.8 developer credential arrival evidence (#211)beta8-211104
Beta.8 second-wave arrival evidence (#212)beta8-212132
Beta.8 legacy-stable profile restoration (#213, set a)beta8-213a33
Beta.8 stable restoration evidence (#213, 213c)beta8-213c98
Beta.8 documented-stable restoration, batch b (#213)beta8-213b59
Beta.8 empirical-route fixture debt (#213, 213d)beta8-213d140
Beta.8 context-twin debt for the legacy Datadog application key (#213, 213e)beta8-213e4
Beta.8 replacement fixtures for provider-undecided properties (#213, 213f)beta8-213f7
Beta.8 evidence for Travis CI, Neon, Postman collection access keys and the Mailgun key triplet (#259)beta8-25993
Beta.8 empirical fixture-floor raise for ten T2 families (#263)beta8-26373
Beta.10 evidence for the Anthropic api01/admin01 prefixes and the OpenAI admin key (#384, slice a)beta8-384a62
Beta.10 evidence for the Amazon Bedrock long-term and short-term API keys (#384, slice b)beta8-384b41
Beta.10 evidence for the ElevenLabs API key (#384, slice c)beta8-384c20
Beta.10 evidence for the Together AI and Tavily API keys (#384, slice d)beta8-384d58
Beta.10 evidence for keyword-gated Mistral, Cohere, Deepgram, AI21 and Exa keys (#384, slice e)beta8-384e185
Beta.11 independent family evidence for fifteen selected credential families (#379)beta8-379164
Beta.11 evidence for Convex deployment and admin keys with a hex body (#436, slice a)beta8-436a23
Beta.11 evidence for the 1Password service-account token (#436, slice b)beta8-436b22
Beta.11 evidence for the Inngest signing key (#436, slice c)beta8-436c23
Beta.11 evidence for the Resend API key (#436, slice d)beta8-436d23
Beta.11 evidence for the Apify API token (#436, slice e)beta8-436e23
Beta.11 evidence for the Weights & Biases wandb_v1_ API key (#436, slice f)beta8-436f21
Beta.11 evidence for Doppler tokens (#434, slice a)beta8-434a172
Beta.11 evidence for the Trigger.dev secret key and PAT (#434, slice b)beta8-434b46
Beta.11 evidence for the E2B API key (#434, slice c)beta8-434c24
Beta.11 evidence for the PostHog personal and project secret API keys (#434, slice d)beta8-434d50
Beta.11 evidence for the Helicone read-write and write-only keys (#434, slice e)beta8-434e45
Beta.11 evidence for the Firecrawl API key (#434, slice f)beta8-434f26
Beta.11 evidence for the Composio project, org and user API keys (#434, slice g)beta8-434g78
Beta.11 replacement near-miss controls for the redact-secret#948 relabel (948)beta8-9489
Beta.12 evidence for the Daytona API key (#464, slice a)beta8-464a28
Beta.12 evidence for the ClickHouse Cloud API key secret (#464, slice b)beta8-464b27
Beta.12 evidence for the NVIDIA API key (#464, slice c)beta8-464c25
Beta.12 evidence for the Browserbase API key (bb_live_) (#464, slice d)beta8-464d24
Beta.12 evidence for the Cerebras inference API key (#464, slice e)beta8-464e32
Beta.12 evidence for the RunPod API key (#464, slice f)beta8-464f23
Beta.12 evidence for the Bitwarden Secrets Manager access token (#528, slice a)beta8-528a24
Beta.12 evidence for Polar organization access tokens and API credentials (#528, slice b)beta8-528b44
Beta.12 evidence for SonarQube user and analysis tokens (#528, slice c)beta8-528c44
Beta.12 evidence for the RubyGems.org API key (#528, slice d)beta8-528d22
Beta.12 evidence for the Clojars deploy token (#528, slice e)beta8-528e21
Beta.12 evidence for crates.io API and trusted-publishing tokens (#528, slice f)beta8-528f43
Beta.12 evidence for Dynatrace access and platform tokens (#528, slice g)beta8-528g22
Beta.12 evidence for the Paddle Billing API key (#528, slice h)beta8-528h21
Beta.12 evidence for Honeycomb ingest keys (#528, slice i)beta8-528i22
Beta.12 evidence for Axiom API and personal tokens (#528, slice j)beta8-528j40
Beta.12 evidence for the AWS IAM user secret access key (#528, #1012 slice a)beta8-1012a34
Beta.12 evidence for the Google OAuth client secret (#528, #1012 slice b)beta8-1012b24
Beta.12 evidence for the routable GitLab personal access token (#528, #1012 slice c)beta8-1012c23
Beta.12 evidence for the AWS STS temporary access key id (#528, #1012 slice d)beta8-1012d23
Beta.12 evidence for Vercel personal, app access and app refresh tokens (#528, #1012 slice e)beta8-1012e96
Beta.14 evidence for the Square access token and OAuth application secret (#583, slice a)beta8-583a50
Beta.14 evidence for the Xata API key (#583, slice b)beta8-583b33
Beta.14 evidence for the Sourcegraph access token (#583, slice c)beta8-583c25
Beta.14 evidence for the Unkey root key (#583, slice d)beta8-583d31
Beta.14 evidence for the Buildkite token (#583, slice e)beta8-583e44
Beta.14 evidence for the Pydantic Logfire token (#583, slice f)beta8-583f30
Beta.14 evidence for the Mapbox secret access token (#583, slice g)beta8-583g27
Beta.14 evidence for the Fly.io access token (#583, slice h)beta8-583h32
Public policy qualification controls for bounded T3 credentials (#365)policy-qualified-credentials15

Operators

Generated counts exclude the unaltered source. Deferred values no longer match the format contract. Not applicable means the operator could not be applied to that source.

Operators and what they generated
OperatorWhat it changesGeneratedScoredDeferred to reviewNot applicable
lexical.length-minus-oneDrops the last character of the secret2,0204141,6062,893
lexical.length-plus-oneAppends one character to the secret2,0204161,6042,893
lexical.replace-lastReplaces the last character of the secret2,0201,5055152,893
lexical.invalid-alphabetReplaces the last character with one outside the format2,02002,0202,893
lexical.prefix-changeReplaces the first character of the secret2,020431,9772,893
boundary.remove-delimiterRemoves one delimiter (dot, underscore or hyphen) from the secret1,8891121,7773,024
structural.remove-segmentRemoves one delimited segment (SendGrid and Slack token formats only)480484,865