STET

agent_patch

runs/2026-02-27__21-30-28__gpt-5-3-codex/flux-pr-4539/flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/agent-logs/agent.patch

4176 bytes

Back to adjudication
diff --git a/app/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json b/app/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json
new file mode 100644
index 0000000..57173dc
--- /dev/null
+++ b/app/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json
@@ -0,0 +1 @@
+{"version":"4.0.18","results":[[":packages/zod/src/v4/classic/tests/optional.test.ts",{"duration":0,"failed":true}],[":packages/zod/src/v4/classic/tests/prefault.test.ts",{"duration":0,"failed":true}]]}
\ No newline at end of file
diff --git a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/classic/tests/optional.test.ts b/app/packages/zod/src/v4/classic/tests/optional.test.ts
index 1fc142b..44cbade 100644
--- a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/classic/tests/optional.test.ts
+++ b/app/packages/zod/src/v4/classic/tests/optional.test.ts
@@ -101,3 +101,14 @@ test("pipe optionality inside objects", () => {
     e: string;
   }>();
 });
+
+test("object keys are optional only when both input and output are optional", () => {
+  const schema = z.object({
+    b: z.string().optional().pipe(z.string()),
+  });
+
+  const result = schema.safeParse({});
+  expect(result.success).toEqual(false);
+  if (result.success) throw new Error("unreachable");
+  expect(result.error.issues[0]?.path).toEqual(["b"]);
+});
diff --git a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/classic/tests/prefault.test.ts b/app/packages/zod/src/v4/classic/tests/prefault.test.ts
index 72178ab..903d8f1 100644
--- a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/classic/tests/prefault.test.ts
+++ b/app/packages/zod/src/v4/classic/tests/prefault.test.ts
@@ -35,3 +35,14 @@ test("prefault inside object", () => {
     email: string;
   }>();
 });
+
+test("prefault object keys do not swallow missing-key validation errors", () => {
+  const schema = z.object({
+    requiredAfterPrefault: z.string().prefault(1234 as any),
+  });
+
+  const result = schema.safeParse({});
+  expect(result.success).toEqual(false);
+  if (result.success) throw new Error("unreachable");
+  expect(result.error.issues[0]?.path).toEqual(["requiredAfterPrefault"]);
+});
diff --git a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/core/schemas.ts b/app/packages/zod/src/v4/core/schemas.ts
index fcd5ba1..bc36565 100644
--- a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/core/schemas.ts
+++ b/app/packages/zod/src/v4/core/schemas.ts
@@ -1768,7 +1768,7 @@ export const $ZodObject: core.$constructor<$ZodObject> = /*@__PURE__*/ core.$con
         // }
 
         const r = el._zod.run({ value: input[key], issues: [] }, ctx);
-        const isOptional = el._zod.optin === "optional";
+        const isOptional = util.isOptionalObjectKey(el);
 
         if (r instanceof Promise) {
           proms.push(
diff --git a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/core/util.ts b/app/packages/zod/src/v4/core/util.ts
index b1fdefa..bd3fb46 100644
--- a/tmp/agent-patch-flux-pr-4539.1-of-1.2026-02-27__21-30-28__gpt-5-3-codex/app/packages/zod/src/v4/core/util.ts
+++ b/app/packages/zod/src/v4/core/util.ts
@@ -489,10 +489,14 @@ export function stringifyPrimitive(value: any): string {
 
 export function optionalKeys(shape: schemas.$ZodShape): string[] {
   return Object.keys(shape).filter((k) => {
-    return shape[k]._zod.optin === "optional";
+    return isOptionalObjectKey(shape[k]);
   });
 }
 
+export function isOptionalObjectKey(schema: schemas.$ZodType): boolean {
+  return schema._zod.optin === "optional" && schema._zod.optout === "optional";
+}
+
 export type CleanKey<T extends PropertyKey> = T extends `?${infer K}` ? K : T extends `${infer K}?` ? K : T;
 export type ToCleanMap<T extends schemas.$ZodLooseShape> = {
   [k in keyof T]: k extends `?${infer K}` ? K : k extends `${infer K}?` ? K : k;