diff --git a/packages/snyk-protect/src/lib/patch.ts b/packages/snyk-protect/src/lib/patch.ts
index f6a1534ff8..1983b7fe49 100644
--- a/packages/snyk-protect/src/lib/patch.ts
+++ b/packages/snyk-protect/src/lib/patch.ts
@@ -6,9 +6,16 @@ export function applyPatchToFile(patchContents: string, baseFolder: string) {
     baseFolder,
     extractTargetFilePathFromPatch(patchContents),
   );
+
+  const flagPath = `${targetFilePath}.snyk-protect.flag`;
+  if (fs.existsSync(flagPath)) {
+    return targetFilePath;
+  }
+
   const contentsToPatch = fs.readFileSync(targetFilePath, 'utf-8');
   const patchedContents = patchString(patchContents, contentsToPatch);
   fs.writeFileSync(targetFilePath, patchedContents);
+  fs.writeFileSync(flagPath, '');
   return targetFilePath;
 }
 
diff --git a/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts b/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts
index 9c01d8bbbf..46c0e7685d 100644
--- a/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts
+++ b/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts
@@ -9,6 +9,22 @@ describe('Fix PR', () => {
     const project = await createProject('fix-pr');
     const patchedLodash = await getPatchedLodash();
 
+    expect(
+      await runCommand('npm', ['install'], {
+        cwd: project.path(),
+      }),
+    ).toEqual(
+      expect.objectContaining<RunCLIResult>({
+        code: 0,
+        stdout: expect.stringContaining('Applied Snyk patches'),
+        stderr: expect.not.stringMatching(/snyk/gi),
+      }),
+    );
+
+    await expect(
+      project.read('node_modules/lodash/lodash.js'),
+    ).resolves.toEqual(patchedLodash);
+
     expect(
       await runCommand('npm', ['install'], {
         cwd: project.path(),
@@ -17,7 +33,7 @@ describe('Fix PR', () => {
       expect.objectContaining<RunCLIResult>({
         code: 0,
         stdout: expect.stringContaining('Applied Snyk patches.'),
-        stderr: expect.any(String),
+        stderr: expect.not.stringMatching(/snyk/gi),
       }),
     );