From 2688dbb18756b1eedd5574621d50300948848e1a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 19:16:05 +0900 Subject: [PATCH 1/5] test(ci): add one-shot retry completion race repair --- .../repair-worker-retry-completion-race.yml | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 .github/workflows/repair-worker-retry-completion-race.yml diff --git a/.github/workflows/repair-worker-retry-completion-race.yml b/.github/workflows/repair-worker-retry-completion-race.yml new file mode 100644 index 000000000..205a0bc4b --- /dev/null +++ b/.github/workflows/repair-worker-retry-completion-race.yml @@ -0,0 +1,85 @@ +name: Repair worker retry completion race + +on: + push: + branches: + - test/worker-retry-completion-race-20260815 + paths: + - .github/workflows/repair-worker-retry-completion-race.yml + +permissions: + contents: write + +concurrency: + group: repair-worker-retry-completion-race + cancel-in-progress: false + +jobs: + repair: + runs-on: ubuntu-24.04 + timeout-minutes: 20 + steps: + - name: Check out exact trigger revision + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.0 + with: + ref: ${{ github.sha }} + fetch-depth: 0 + persist-credentials: true + + - name: Use preinstalled Temurin JDK 21 + shell: bash + run: | + echo "JAVA_HOME=$JAVA_HOME_21_X64" >> "$GITHUB_ENV" + echo "$JAVA_HOME_21_X64/bin" >> "$GITHUB_PATH" + + - name: Make retry completion assertion observe the terminal state + shell: bash + run: | + python3 - <<'PY' + from pathlib import Path + + path = Path("src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java") + source = path.read_text(encoding="utf-8") + old = ''' await(() -> attempts.get() >= 1, 3_000); + + assertEquals(1, attempts.get()); + assertEquals(1, job.getAttemptCount()); + assertEquals(ConversionJobStatus.SUCCEEDED, job.getStatus()); +''' + new = ''' await( + () -> attempts.get() >= 1 && job.getStatus() == ConversionJobStatus.SUCCEEDED, + 3_000 + ); + + assertEquals(1, attempts.get()); + assertEquals(1, job.getAttemptCount()); + assertEquals(ConversionJobStatus.SUCCEEDED, job.getStatus()); +''' + if source.count(old) != 1: + raise SystemExit("expected retry completion assertion was not found exactly once") + path.write_text(source.replace(old, new), encoding="utf-8") + PY + + - name: Verify complete repository acceptance + shell: bash + run: | + mvn -B --no-transfer-progress verify + python3 scripts/verify_maven_test_reports.py + git diff --check + + - name: Publish verified test-only repair and remove one-shot workflow + shell: bash + env: + TARGET_BRANCH: test/worker-retry-completion-race-20260815 + TRIGGER_SHA: ${{ github.sha }} + run: | + remote_sha="$(git ls-remote origin "refs/heads/$TARGET_BRANCH" | cut -f1)" + test "$remote_sha" = "$TRIGGER_SHA" + rm .github/workflows/repair-worker-retry-completion-race.yml + git config user.name "opencode-agent[bot]" + git config user.email "219766164+opencode-agent[bot]@users.noreply.github.com" + git add src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java + git add -u .github/workflows/repair-worker-retry-completion-race.yml + git diff --cached --check + git commit -m "test(worker): await retry completion before asserting" + git push origin "HEAD:refs/heads/$TARGET_BRANCH" From a2e55cb70b0822863fa2569d0bb6dd30ff03bf66 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 19:17:24 +0900 Subject: [PATCH 2/5] fix(ci): preserve heredoc indentation in one-shot repair --- .github/workflows/repair-worker-retry-completion-race.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/repair-worker-retry-completion-race.yml b/.github/workflows/repair-worker-retry-completion-race.yml index 205a0bc4b..263774b12 100644 --- a/.github/workflows/repair-worker-retry-completion-race.yml +++ b/.github/workflows/repair-worker-retry-completion-race.yml @@ -45,7 +45,7 @@ jobs: assertEquals(1, attempts.get()); assertEquals(1, job.getAttemptCount()); assertEquals(ConversionJobStatus.SUCCEEDED, job.getStatus()); -''' + ''' new = ''' await( () -> attempts.get() >= 1 && job.getStatus() == ConversionJobStatus.SUCCEEDED, 3_000 @@ -54,7 +54,7 @@ jobs: assertEquals(1, attempts.get()); assertEquals(1, job.getAttemptCount()); assertEquals(ConversionJobStatus.SUCCEEDED, job.getStatus()); -''' + ''' if source.count(old) != 1: raise SystemExit("expected retry completion assertion was not found exactly once") path.write_text(source.replace(old, new), encoding="utf-8") From a0dc50a8674bc145f06f4e29143890d52df00493 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 15 Aug 2026 19:20:51 +0900 Subject: [PATCH 3/5] fix(ci): replace retry wait by exact statement --- .../repair-worker-retry-completion-race.yml | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/.github/workflows/repair-worker-retry-completion-race.yml b/.github/workflows/repair-worker-retry-completion-race.yml index 263774b12..eebe6d986 100644 --- a/.github/workflows/repair-worker-retry-completion-race.yml +++ b/.github/workflows/repair-worker-retry-completion-race.yml @@ -40,23 +40,13 @@ jobs: path = Path("src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java") source = path.read_text(encoding="utf-8") - old = ''' await(() -> attempts.get() >= 1, 3_000); - - assertEquals(1, attempts.get()); - assertEquals(1, job.getAttemptCount()); - assertEquals(ConversionJobStatus.SUCCEEDED, job.getStatus()); - ''' - new = ''' await( + old = " await(() -> attempts.get() >= 1, 3_000);" + new = """ await( () -> attempts.get() >= 1 && job.getStatus() == ConversionJobStatus.SUCCEEDED, 3_000 - ); - - assertEquals(1, attempts.get()); - assertEquals(1, job.getAttemptCount()); - assertEquals(ConversionJobStatus.SUCCEEDED, job.getStatus()); - ''' + );""" if source.count(old) != 1: - raise SystemExit("expected retry completion assertion was not found exactly once") + raise SystemExit("expected retry completion wait was not found exactly once") path.write_text(source.replace(old, new), encoding="utf-8") PY From 23ba9a34e24d62de7974a6e1707dc53f6f69b4ac Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Sat, 15 Aug 2026 10:21:55 +0000 Subject: [PATCH 4/5] test(worker): await retry completion before asserting --- .../repair-worker-retry-completion-race.yml | 75 ------------------- .../service/DefaultConversionWorkerTest.java | 5 +- 2 files changed, 4 insertions(+), 76 deletions(-) delete mode 100644 .github/workflows/repair-worker-retry-completion-race.yml diff --git a/.github/workflows/repair-worker-retry-completion-race.yml b/.github/workflows/repair-worker-retry-completion-race.yml deleted file mode 100644 index eebe6d986..000000000 --- a/.github/workflows/repair-worker-retry-completion-race.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Repair worker retry completion race - -on: - push: - branches: - - test/worker-retry-completion-race-20260815 - paths: - - .github/workflows/repair-worker-retry-completion-race.yml - -permissions: - contents: write - -concurrency: - group: repair-worker-retry-completion-race - cancel-in-progress: false - -jobs: - repair: - runs-on: ubuntu-24.04 - timeout-minutes: 20 - steps: - - name: Check out exact trigger revision - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.0 - with: - ref: ${{ github.sha }} - fetch-depth: 0 - persist-credentials: true - - - name: Use preinstalled Temurin JDK 21 - shell: bash - run: | - echo "JAVA_HOME=$JAVA_HOME_21_X64" >> "$GITHUB_ENV" - echo "$JAVA_HOME_21_X64/bin" >> "$GITHUB_PATH" - - - name: Make retry completion assertion observe the terminal state - shell: bash - run: | - python3 - <<'PY' - from pathlib import Path - - path = Path("src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java") - source = path.read_text(encoding="utf-8") - old = " await(() -> attempts.get() >= 1, 3_000);" - new = """ await( - () -> attempts.get() >= 1 && job.getStatus() == ConversionJobStatus.SUCCEEDED, - 3_000 - );""" - if source.count(old) != 1: - raise SystemExit("expected retry completion wait was not found exactly once") - path.write_text(source.replace(old, new), encoding="utf-8") - PY - - - name: Verify complete repository acceptance - shell: bash - run: | - mvn -B --no-transfer-progress verify - python3 scripts/verify_maven_test_reports.py - git diff --check - - - name: Publish verified test-only repair and remove one-shot workflow - shell: bash - env: - TARGET_BRANCH: test/worker-retry-completion-race-20260815 - TRIGGER_SHA: ${{ github.sha }} - run: | - remote_sha="$(git ls-remote origin "refs/heads/$TARGET_BRANCH" | cut -f1)" - test "$remote_sha" = "$TRIGGER_SHA" - rm .github/workflows/repair-worker-retry-completion-race.yml - git config user.name "opencode-agent[bot]" - git config user.email "219766164+opencode-agent[bot]@users.noreply.github.com" - git add src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java - git add -u .github/workflows/repair-worker-retry-completion-race.yml - git diff --cached --check - git commit -m "test(worker): await retry completion before asserting" - git push origin "HEAD:refs/heads/$TARGET_BRANCH" diff --git a/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java b/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java index 88503b486..c774c61f0 100644 --- a/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java +++ b/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java @@ -392,7 +392,10 @@ void workerReschedulesWhenRetryAtIsInTheFuture() throws Exception { worker.enqueue(jobId); - await(() -> attempts.get() >= 1, 3_000); + await( + () -> attempts.get() >= 1 && job.getStatus() == ConversionJobStatus.SUCCEEDED, + 3_000 + ); assertEquals(1, attempts.get()); assertEquals(1, job.getAttemptCount()); From b3c0f9cfe218a35e05e0cb8b0dc675e5fa84568f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 2 Oct 2026 07:01:44 +0900 Subject: [PATCH 5/5] style(test): align terminal retry await --- .../viewer/service/DefaultConversionWorkerTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java b/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java index c774c61f0..b1ce6950c 100644 --- a/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java +++ b/src/test/java/com/clearfolio/viewer/service/DefaultConversionWorkerTest.java @@ -393,9 +393,9 @@ void workerReschedulesWhenRetryAtIsInTheFuture() throws Exception { worker.enqueue(jobId); await( - () -> attempts.get() >= 1 && job.getStatus() == ConversionJobStatus.SUCCEEDED, - 3_000 - ); + () -> attempts.get() >= 1 && job.getStatus() == ConversionJobStatus.SUCCEEDED, + 3_000 + ); assertEquals(1, attempts.get()); assertEquals(1, job.getAttemptCount());