Skip to content

repeated "file update:" in non-interactive mode #6511

@lopuhin

Description

@lopuhin

What version of Codex is running?

codex-cli 0.57.0

What subscription do you have?

OpenAI API

Which model were you using?

gpt-5-codex

What platform is your computer?

issue happens on both Mac OS and Linux (in Docker)

What issue are you seeing?

When running codex in non-interactive mode in a git repo, the "file update:" outputs the full diff again and again, even for files which are not being changed currently, but which were changed previously.

What steps can reproduce the bug?

Create a git repo with two small files, e.g. like this:

konstantin@MacBookPro codex-file-update-issue % git diff
konstantin@MacBookPro codex-file-update-issue % git log
commit b073d54f4b5c409497fb1bebd64e89aaf760fe7c (HEAD -> main)
Author: Konstantin Lopuhin <kostia.lopuhin@gmail.com>
Date:   Tue Nov 11 16:50:02 2025 +0000

    initial commit
konstantin@MacBookPro codex-file-update-issue % git show
commit b073d54f4b5c409497fb1bebd64e89aaf760fe7c (HEAD -> main)
Author: Konstantin Lopuhin <kostia.lopuhin@gmail.com>
Date:   Tue Nov 11 16:50:02 2025 +0000

    initial commit

diff --git a/a.py b/a.py
new file mode 100644
index 0000000..9332a27
--- /dev/null
+++ b/a.py
@@ -0,0 +1,2 @@
+def foo():
+    pass
diff --git a/b.py b/b.py
new file mode 100644
index 0000000..4371a5a
--- /dev/null
+++ b/b.py
@@ -0,0 +1,2 @@
+def bar():
+    pass

Now run codex on a task which would require edits to two files separately

codex exec --yolo "add a docstring to a.py, then check if we can still import the file, then add a docstring to b.py, and check if we can still import both files"

this results in a lot of repeated outputs of the diff, e.g. see this fragment, where the actual edit was done only to file b.py:

thinking
**Adding docstring with apply_patch**
file update
M /Users/konstantin/dev/codex-file-update-issue/b.py
@@ -1 +1,4 @@
+"""Module b providing bar function."""
+
+
 def bar():
apply_patch(auto_approved=true) exited 0 in 47ms:
Success. Updated the following files:
M b.py
file update:
diff --git a/a.py b/a.py
index 9332a2735b6ab5670bc4dc21c1049e5227ab1e7e..5e2f4434d1be7dcb2092e3a5de45ddc2dd2dab33
--- a/a.py
+++ b/a.py
@@ -1,2 +1,5 @@
+"""Module a providing foo function."""
+
+
 def foo():
     pass
diff --git a/b.py b/b.py
index 4371a5a1f6ed7f53dc5a62ffef65bbb5f4607c38..7d600ffd23fac7e4fb508efa14fcd38342e0e38b
--- a/b.py
+++ b/b.py
@@ -1,2 +1,5 @@
+"""Module b providing bar function."""
+
+
 def bar():
     pass

file update:
diff --git a/a.py b/a.py
index 9332a2735b6ab5670bc4dc21c1049e5227ab1e7e..5e2f4434d1be7dcb2092e3a5de45ddc2dd2dab33
--- a/a.py
+++ b/a.py
@@ -1,2 +1,5 @@
+"""Module a providing foo function."""
+
+
 def foo():
     pass
diff --git a/b.py b/b.py
index 4371a5a1f6ed7f53dc5a62ffef65bbb5f4607c38..7d600ffd23fac7e4fb508efa14fcd38342e0e38b
--- a/b.py
+++ b/b.py
@@ -1,2 +1,5 @@
+"""Module b providing bar function."""
+
+
 def bar():
     pass


thinking
**Verifying module imports**

full log attached: log.txt

In real-life tasks it becomes even more complicated to analyze the logs.

What is the expected behavior?

I expect to see only the diff from the changes done on a particular step, like in interactive mode, e.g. for above quoted example I'd expect to see only

 thinking
**Adding docstring with apply_patch**
file update
M /Users/konstantin/dev/codex-file-update-issue/b.py
@@ -1 +1,4 @@
+"""Module b providing bar function."""
+
+
 def bar():
apply_patch(auto_approved=true) exited 0 in 47ms:
Success. Updated the following files:
M b.py

thinking
**Verifying module imports**

Or at least provide an option to avoid repeated "file update:" output.

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingexecIssues related to the `codex exec` subcommand

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions