This is an automated email from the ASF dual-hosted git repository.
hello-stephen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 173a0e2064e [improvement](ci) Upgrade review runtime to Codex 0.166.0
(#69990)
173a0e2064e is described below
commit 173a0e2064e529bfa6f017608c40ff003c2f1066
Author: shuke <[email protected]>
AuthorDate: Tue Nov 3 17:45:20 2026 +0800
[improvement](ci) Upgrade review runtime to Codex 0.166.0 (#69990)
### What problem does this PR solve?
Related PR: https://github.com/shuke987/codex/pull/6
Upgrade the Code Review Runner and its runtime canary from Codex 0.162.1
to the validated [0.166.0 fork
release](https://github.com/shuke987/codex/releases/tag/exec-goal-v0.166.0),
retaining goal completion and same-session resume support.
Codex 0.166.0 distinguishes `policy_capacity_unavailable` from ordinary
overloads. Accept both canonical terminal capacity messages so the
existing bounded recovery policy continues to apply. Preserve the
original diagnostic and exact submission verification; unrelated
failures remain non-retryable.
Update the archive, version and CLI checksum pins together. The workflow
changes are limited to seven package pin replacements. Existing model
selection and delivery checks are preserved.
---
.github/scripts/run_review_with_resume.py | 10 ++-
.github/scripts/test_run_review_with_resume.py | 93 +++++++++++++++++++++++++-
.github/workflows/code-review-runner.yml | 14 ++--
3 files changed, 107 insertions(+), 10 deletions(-)
diff --git a/.github/scripts/run_review_with_resume.py
b/.github/scripts/run_review_with_resume.py
index 484deeba4e2..a5a4ffc72c2 100644
--- a/.github/scripts/run_review_with_resume.py
+++ b/.github/scripts/run_review_with_resume.py
@@ -40,6 +40,12 @@ from submit_review import RUN_FILE, RESULT_FILE,
SUBMISSION_FILE, verify_complet
RETRY_DELAYS = (300,) * 6
CAPACITY_FALLBACK_AFTER = 5
CAPACITY_MESSAGE = "Selected model is at capacity. Please try a different
model."
+# Codex 0.166 distinguishes policy capacity from ordinary overloads. Both
+# retain the same bounded recovery; other policy/safety failures must not
retry.
+CAPACITY_MESSAGES = (
+ CAPACITY_MESSAGE,
+ "Policy-restricted capacity is unavailable. Please try again later.",
+)
UNSUPPORTED_CHATGPT_MODEL = "model is not supported when using Codex with a
ChatGPT account."
PROCESS_EXIT_GRACE_SECONDS = 5
HEAD_POLL_SECONDS = 60
@@ -547,7 +553,7 @@ def run_review(args, reaper=None):
)
model = fallback_model
continue
- if message is not None and message != CAPACITY_MESSAGE:
+ if message is not None and message not in CAPACITY_MESSAGES:
return fail(message)
current_id = session_id(events)
if thread_id and current_id != thread_id:
@@ -565,7 +571,7 @@ def run_review(args, reaper=None):
# The head can move between the exit check and readback.
watchdog.check(force=True)
raise
- result["recovered_after_capacity"] = message ==
CAPACITY_MESSAGE
+ result["recovered_after_capacity"] = message in
CAPACITY_MESSAGES
write_json(context / RESULT_FILE, result)
with aggregate.open("a") as handle:
handle.write(json.dumps({"type": "review.completed",
**result}) + "\n")
diff --git a/.github/scripts/test_run_review_with_resume.py
b/.github/scripts/test_run_review_with_resume.py
index 5d71f6adc19..79692fa8b39 100644
--- a/.github/scripts/test_run_review_with_resume.py
+++ b/.github/scripts/test_run_review_with_resume.py
@@ -451,6 +451,88 @@ class ResumeReviewTest(unittest.TestCase):
self.assertEqual("gpt-6-sol\n", (self.context /
"codex-review-model.txt").read_text())
self.verification.assert_called_once()
+ def test_policy_capacity_resumes_same_session_with_shared_budget(self):
+ before = self.ledger.read_text()
+ message = "Policy-restricted capacity is unavailable. Please try again
later."
+ self.assertEqual(0, self.execute([
+ {"events": [thread_event(), failed(message)], "elapsed": 5},
+ {"events": [thread_event(), completed()], "status": 0},
+ ]))
+ self.assertEqual([300], self.sleeps)
+ self.assertEqual([1000, 695], self.timeouts)
+ self.assertEqual(["resume", THREAD], self.commands[1][-3:-1])
+ self.assertEqual(before, self.ledger.read_text())
+ self.target_check.assert_called_once()
+
+ def test_mixed_capacity_errors_share_fallback_and_retry_limit(self):
+ self.args.budget_seconds = 3600
+ policy_message = "Policy-restricted capacity is unavailable. Please
try again later."
+ messages = [policy_message, runner.CAPACITY_MESSAGE] * 3 +
[policy_message]
+ self.assertEqual(1, self.execute([
+ {"events": [thread_event(), failed(message)]} for message in
messages
+ ]))
+ self.assertEqual([300] * 6, self.sleeps)
+ self.assertEqual(
+ [self.args.model] * 5 + [self.args.capacity_fallback_model] * 2,
+ [command[command.index("--model") + 1] for command in
self.commands],
+ )
+ for command in self.commands[1:]:
+ self.assertEqual(["resume", THREAD], command[-3:-1])
+ self.assertEqual(policy_message, self.last_error())
+
+ def test_policy_capacity_error_event_with_zero_exit_resumes(self):
+ message = "Policy-restricted capacity is unavailable. Please try again
later."
+ self.assertEqual(0, self.execute([
+ {"events": [thread_event(), {"type": "error", "message":
message}], "status": 0},
+ {"events": [thread_event(), completed()], "status": 0},
+ ]))
+ self.assertEqual([300], self.sleeps)
+
+ def test_policy_capacity_after_submission_requires_verified_delivery(self):
+ (self.context / runner.SUBMISSION_FILE).write_text("{}")
+ message = "Policy-restricted capacity is unavailable. Please try again
later."
+ self.assertEqual(0, self.execute([{"events": [thread_event(),
failed(message)]}]))
+ self.verification.assert_called_once()
+ self.assertTrue(json.loads((self.context /
runner.RESULT_FILE).read_text())["recovered_after_capacity"])
+ self.assertEqual([], self.sleeps)
+ self.target_check.assert_not_called()
+
+ def test_policy_capacity_with_partial_submission_does_not_resume(self):
+ (self.context / runner.SUBMISSION_FILE).write_text("{}")
+ self.verification.side_effect = ValueError("Final review inline
comments were not completely verified")
+ message = "Policy-restricted capacity is unavailable. Please try again
later."
+ self.assertEqual(1, self.execute([{"events": [thread_event(),
failed(message)]}]))
+ self.verification.assert_called_once()
+ self.assertIn("not completely verified", self.last_error())
+ self.assertEqual([], self.sleeps)
+ self.assertFalse((self.context / runner.RESULT_FILE).exists())
+
+ def test_policy_capacity_does_not_override_cancellation(self):
+ message = "Policy-restricted capacity is unavailable. Please try again
later."
+ self.assertEqual(1, self.execute([
+ {"events": [thread_event(), failed(message)], "status": 143},
+ ]))
+ self.assertEqual([], self.sleeps)
+ self.verification.assert_not_called()
+
+ def test_policy_capacity_does_not_exceed_shared_budget(self):
+ self.args.budget_seconds = 300
+ message = "Policy-restricted capacity is unavailable. Please try again
later."
+ self.assertEqual(1, self.execute([{"events": [thread_event(),
failed(message)]}]))
+ self.assertIn("Insufficient shared review budget", self.last_error())
+ self.assertEqual([], self.sleeps)
+
+ def
test_policy_capacity_text_in_tool_output_does_not_override_safety_failure(self):
+ event = {"type": "item.completed", "item": {
+ "type": "command_execution",
+ "aggregated_output": "Policy-restricted capacity is unavailable.
Please try again later.",
+ }}
+ self.assertEqual(1, self.execute([
+ {"events": [thread_event(), event, failed("Request blocked by
safety policy")]},
+ ]))
+ self.assertEqual("Request blocked by safety policy", self.last_error())
+ self.assertEqual([], self.sleeps)
+
def test_capacity_fallback_is_optional(self):
self.args.capacity_fallback_model = None
self.args.budget_seconds = 3600
@@ -1392,6 +1474,14 @@ class ProcessLifecycleTest(unittest.TestCase):
reaper.reap.assert_called_once_with()
def test_real_process_capacity_then_resume_preserves_state(self):
+ self.assert_real_process_capacity_then_resume(runner.CAPACITY_MESSAGE)
+
+ def test_real_process_policy_capacity_then_resume_preserves_state(self):
+ self.assert_real_process_capacity_then_resume(
+ "Policy-restricted capacity is unavailable. Please try again
later."
+ )
+
+ def assert_real_process_capacity_then_resume(self, message):
with tempfile.TemporaryDirectory() as tmp,
redirect_stderr(io.StringIO()):
root = Path(tmp)
write_fake_gh(root)
@@ -1425,7 +1515,7 @@ else:
}) + "\n")
(root / "request-count").write_text("1")
print(json.dumps({"type": "turn.failed", "error": {
- "message": "Selected model is at capacity. Please try a different
model."
+ "message": os.environ["FAKE_CAPACITY_MESSAGE"]
}}))
sys.exit(1)
"""
@@ -1450,6 +1540,7 @@ else:
"CODEX_HOME": str(root / "isolated-home"),
"FAKE_REVIEW_ROOT": str(root),
"FAKE_THREAD_ID": THREAD,
+ "FAKE_CAPACITY_MESSAGE": message,
},
),
mock.patch.object(runner, "RETRY_DELAYS", (0, 0, 0)),
diff --git a/.github/workflows/code-review-runner.yml
b/.github/workflows/code-review-runner.yml
index 719f460466c..fed7781b91d 100644
--- a/.github/workflows/code-review-runner.yml
+++ b/.github/workflows/code-review-runner.yml
@@ -65,12 +65,12 @@ jobs:
archive="$RUNNER_TEMP/codex-exec-goal.tar.gz"
package="$RUNNER_TEMP/codex-exec-goal"
ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" \
- cp -f
oss://doris-community-ci/codex/releases/codex-exec-goal-0.162.1-3547e9086675-x86_64-unknown-linux-gnu.tar.gz
"$archive"
- echo
"51304e4f9c343ae84e00a304344df41c2fd32821c83bdbf5be68b0f0c25ddae1 $archive" |
sha256sum --check
+ cp -f
oss://doris-community-ci/codex/releases/codex-exec-goal-0.166.0-217b6e00e031-x86_64-unknown-linux-gnu.tar.gz
"$archive"
+ echo
"19fe4ad3224b4c1bfb90952fd2054b63029bb9ffab6b9e8db3269039193f071c $archive" |
sha256sum --check
mkdir -p "$package"
tar -xzf "$archive" -C "$package"
(cd "$package" && sha256sum --check SHA256SUMS)
- test "$(jq -r .version "$package/codex-package.json")" = 0.162.1
+ test "$(jq -r .version "$package/codex-package.json")" = 0.166.0
"$package/bin/codex" --version
"$package/bin/codex" exec --help | grep -q -- '--goal'
echo "CODEX_CANARY_BIN=$package/bin/codex" >> "$GITHUB_ENV"
@@ -370,17 +370,17 @@ jobs:
package="$RUNNER_TEMP/codex-exec-goal"
ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" \
cp -f "$OSS_CODEX_PACKAGE_OBJECT" "$archive"
- echo
"51304e4f9c343ae84e00a304344df41c2fd32821c83bdbf5be68b0f0c25ddae1 $archive" |
sha256sum --check
+ echo
"19fe4ad3224b4c1bfb90952fd2054b63029bb9ffab6b9e8db3269039193f071c $archive" |
sha256sum --check
mkdir -p "$package"
tar -xzf "$archive" -C "$package"
(cd "$package" && sha256sum --check SHA256SUMS)
- test "$(jq -r .version "$package/codex-package.json")" = 0.162.1
+ test "$(jq -r .version "$package/codex-package.json")" = 0.166.0
echo "$package/bin" >> "$GITHUB_PATH"
env:
OSS_AK: ${{ secrets.OSS_AK }}
OSS_SK: ${{ secrets.OSS_SK }}
OSS_ENDPOINT: oss-cn-hongkong.aliyuncs.com
- OSS_CODEX_PACKAGE_OBJECT:
oss://doris-community-ci/codex/releases/codex-exec-goal-0.162.1-3547e9086675-x86_64-unknown-linux-gnu.tar.gz
+ OSS_CODEX_PACKAGE_OBJECT:
oss://doris-community-ci/codex/releases/codex-exec-goal-0.166.0-217b6e00e031-x86_64-unknown-linux-gnu.tar.gz
- name: Verify pinned Codex runtime
timeout-minutes: 2
@@ -388,7 +388,7 @@ jobs:
set -euo pipefail
codex_cmd="$(command -v codex)"
test "$(readlink -f "$codex_cmd")" =
"$RUNNER_TEMP/codex-exec-goal/bin/codex"
- echo
"a0d5ec053074d66570aa967129d350541f344f76671a199b5a7bc0d45366cdf7 $codex_cmd"
| sha256sum --check
+ echo
"9346ee98398cb7240702e45eed4cbe38c7fb990d9e031dba4e7525383c415deb $codex_cmd"
| sha256sum --check
codex --version
codex exec --help | grep -q -- '--goal'
codex exec --goal resume --help >/dev/null
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]