From dfe1045fbd8c50fde7fa5acd107c1d29869b60e7 Mon Sep 17 00:00:00 2001 From: rishigupta1599 Date: Tue, 6 Oct 2026 18:39:58 +0530 Subject: [PATCH 1/2] fix(client): allow diffSensitivity 0 in PERCY_VISUAL_CONFIG The API passes visual-config.diffSensitivity straight through as the 0-indexed fuzz level (0 = Very Strict, matching the project enum and the snapshot diffSensitivity schema). The 1..5 range made Very Strict unreachable and silently turned "1" into Strict. Fixes PER-10796 Co-Authored-By: Claude Opus 5.5 (1M context) --- packages/client/src/client.js | 3 ++- packages/client/test/client.test.js | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/client/src/client.js b/packages/client/src/client.js index 6ef451c00..17d1e5d1b 100644 --- a/packages/client/src/client.js +++ b/packages/client/src/client.js @@ -134,7 +134,8 @@ function parseVisualConfigFromEnv(log) { validateBoolean(visualConfig.compareWithPreviousRun, 'compareWithPreviousRun'); validateBoolean(visualConfig.diffIgnoreEnabled, 'diffIgnoreEnabled'); validateNumberInRange(visualConfig.diffIgnorePercentage, 'diffIgnorePercentage'); - validateIntegerRange(visualConfig.diffSensitivity, 'diffSensitivity', 1, 5); + // the API uses diffSensitivity as-is as the 0-indexed fuzz level (0 = Very Strict) + validateIntegerRange(visualConfig.diffSensitivity, 'diffSensitivity', 0, 5); if (visualConfig.browsers != null) { if (!Array.isArray(visualConfig.browsers) || !visualConfig.browsers.every(b => typeof b === 'string')) { diff --git a/packages/client/test/client.test.js b/packages/client/test/client.test.js index baefb4e38..03ebce783 100644 --- a/packages/client/test/client.test.js +++ b/packages/client/test/client.test.js @@ -769,13 +769,30 @@ describe('PercyClient', () => { .toBeRejectedWithError('Invalid PERCY_VISUAL_CONFIG: value must be valid JSON'); }); + it('accepts diffSensitivity 0 (Very Strict)', async () => { + process.env.PERCY_VISUAL_CONFIG = JSON.stringify({ diffSensitivity: 0 }); + + await expectAsync(client.createBuild({ projectType: 'web' })).toBeResolved(); + + expect(api.requests['/builds'][0].body.data.attributes['visual-config']) + .toEqual({ diffSensitivity: 0 }); + }); + it('throws when PERCY_VISUAL_CONFIG contains invalid types', async () => { process.env.PERCY_VISUAL_CONFIG = JSON.stringify({ diffSensitivity: 'high' }); await expectAsync(client.createBuild({ projectType: 'web' })).toBeRejectedWithError( - "Invalid PERCY_VISUAL_CONFIG: 'diffSensitivity' must be an integer between 1 and 5" + "Invalid PERCY_VISUAL_CONFIG: 'diffSensitivity' must be an integer between 0 and 5" + ); + }); + + it('throws when PERCY_VISUAL_CONFIG diffSensitivity is out of range', async () => { + process.env.PERCY_VISUAL_CONFIG = JSON.stringify({ diffSensitivity: -1 }); + + await expectAsync(client.createBuild({ projectType: 'web' })).toBeRejectedWithError( + "Invalid PERCY_VISUAL_CONFIG: 'diffSensitivity' must be an integer between 0 and 5" ); }); From 1411b97c2f77f6f4244f89a0d454e9c474180a54 Mon Sep 17 00:00:00 2001 From: rishigupta1599 Date: Tue, 6 Oct 2026 18:44:17 +0530 Subject: [PATCH 2/2] fix(client): limit visual-config diffSensitivity to 0-4 Match Project.diff_sensitivity_level and the snapshot diffSensitivity schema. Index 5 in the differ is an internal app-percy value with the same threshold (60) as 4. Co-Authored-By: Claude Opus 5.5 (1M context) --- packages/client/src/client.js | 4 ++-- packages/client/test/client.test.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/client/src/client.js b/packages/client/src/client.js index 17d1e5d1b..5d49a7d0f 100644 --- a/packages/client/src/client.js +++ b/packages/client/src/client.js @@ -134,8 +134,8 @@ function parseVisualConfigFromEnv(log) { validateBoolean(visualConfig.compareWithPreviousRun, 'compareWithPreviousRun'); validateBoolean(visualConfig.diffIgnoreEnabled, 'diffIgnoreEnabled'); validateNumberInRange(visualConfig.diffIgnorePercentage, 'diffIgnorePercentage'); - // the API uses diffSensitivity as-is as the 0-indexed fuzz level (0 = Very Strict) - validateIntegerRange(visualConfig.diffSensitivity, 'diffSensitivity', 0, 5); + // 0-indexed like the project setting: 0 = Very Strict ... 4 = Very Relaxed + validateIntegerRange(visualConfig.diffSensitivity, 'diffSensitivity', 0, 4); if (visualConfig.browsers != null) { if (!Array.isArray(visualConfig.browsers) || !visualConfig.browsers.every(b => typeof b === 'string')) { diff --git a/packages/client/test/client.test.js b/packages/client/test/client.test.js index 03ebce783..937bc91bd 100644 --- a/packages/client/test/client.test.js +++ b/packages/client/test/client.test.js @@ -784,15 +784,15 @@ describe('PercyClient', () => { }); await expectAsync(client.createBuild({ projectType: 'web' })).toBeRejectedWithError( - "Invalid PERCY_VISUAL_CONFIG: 'diffSensitivity' must be an integer between 0 and 5" + "Invalid PERCY_VISUAL_CONFIG: 'diffSensitivity' must be an integer between 0 and 4" ); }); it('throws when PERCY_VISUAL_CONFIG diffSensitivity is out of range', async () => { - process.env.PERCY_VISUAL_CONFIG = JSON.stringify({ diffSensitivity: -1 }); + process.env.PERCY_VISUAL_CONFIG = JSON.stringify({ diffSensitivity: 5 }); await expectAsync(client.createBuild({ projectType: 'web' })).toBeRejectedWithError( - "Invalid PERCY_VISUAL_CONFIG: 'diffSensitivity' must be an integer between 0 and 5" + "Invalid PERCY_VISUAL_CONFIG: 'diffSensitivity' must be an integer between 0 and 4" ); });