Skip to content

fix(test): widen release_after_ms + bump reruns on approval-timeout flake - #85

Merged
maltsev-dev merged 1 commit into
masterfrom
fix/0.14.8-coverage-rerun-widening
Aug 4, 2026
Merged

fix(test): widen release_after_ms + bump reruns on approval-timeout flake#85
maltsev-dev merged 1 commit into
masterfrom
fix/0.14.8-coverage-rerun-widening

Conversation

@maltsev-dev

Copy link
Copy Markdown
Member

Summary

Hotfix for the post-merge push-CI coverage failure on master (commit 522f33c, run #30901743674). tests/test_approval_timeout_field.py::TestApprovalTimeoutResolution::test_env_fallback_when_server_value_is_zero exhausted the reruns=2 budget on the post-merge push coverage job — the spawned wait thread missed the 200ms release window twice in a row on the contended Linux runner. PR #84's matrix legs (3.10/3.11/3.12 + coverage) had all passed; the failure surfaced only on the post-merge push run.

Fix (test-only, no production code change)

  • release_after_ms=200release_after_ms=400 in tests/test_approval_timeout_field.py:217 — widens the release window by 200ms. Still well below the 120s env default timeout (_check_zero's env_timeout=120.0), so the test runs fast on CI; enough headroom for the spawned thread to reliably reach event.wait() before the release fires even on a contended runner.
  • @pytest.mark.rerunfailures(reruns=2)reruns=4 at tests/test_approval_timeout_field.py:211 — gives the flaky inner helper two more attempts if the wider release window still misses. No CI workflow change needed (rerunfailures is already installed on the coverage leg per 0.14.6 commit e7cac4c).
  • Comment block updated to call out the three-fix recipe and link to the 2026-08-04 push-CI failure that motivated the bump.

Why this is a hotfix PR, not a follow-up to 0.14.7

  • Master CI badge is currently red (522f33c push coverage failure). Merging this PR re-greens it without forcing a re-release of 0.14.7.
  • The fix is test-only; the 0.14.7 runtime contract is unchanged (strip whitespace from api_key).
  • The next release bump to 0.14.8 can include this hotfix + the version bump + the matching __version__.py/pyproject.toml/CHANGELOG.md updates.

Test plan

  • Local flake provocation (10x iteration of the failing test):
    for i in 1..10; do pytest tests/test_approval_timeout_field.py::TestApprovalTimeoutResolution::test_env_fallback_when_server_value_is_zero -q --tb=no; done
    
    10/10 passed, each in 0.7-1.2s (avg ~0.8s, matching the new 400ms release window).
  • pytest tests/ --ignore=tests/contract -n auto -q1424 passed, 7 skipped in 32.34s (matches the post-0.14.7 baseline; no regression).
  • ruff check src/ tests/ → All checks passed.
  • mypy src/nullrun --strict → Success: no issues found in 37 source files.
  • GitHub Actions CI — this PR must pass all 4 matrix legs (test 3.10/3.11/3.12 + coverage) on the first attempt. Watch gh pr checks after opening.

Out of scope

  • No production code change. No SDK_MIN_VERSION bump. No public API change.
  • The 16 Dependabot alerts on uv.lock (mcp / langgraph / chromadb / etc.) are pre-existing and unrelated to this hotfix.

Refs

…lake

Post-merge push-CI run #30901743674 (master @ 522f33c) failed
on the coverage job with
`tests/test_approval_timeout_field.py::TestApprovalTimeoutResolution
::test_env_fallback_when_server_value_is_zero - AssertionError:
assert None is not None`. The PR matrix legs (3.10/3.11/3.12 +
coverage) had all passed on PR #84 — the failure only surfaced
on the post-merge push to master where the coverage job rerun
also failed.

Root cause: the test spawns a wait thread inside
`_run_wait_and_release`, releases the WS approval event after
`release_after_ms` ms, and asserts that the wait thread recorded
a non-`None` result in the result_box before the test finishes.
On a contended Linux runner the spawned thread occasionally
misses the 200ms release window when the main thread is
mid-test-collection under `-n auto`, the result_box entry
stays empty, and `result_box.get("result")` is `None`. Sprint 0
(0.14.6 release commit `e7cac4c`) added
`@pytest.mark.rerunfailures(reruns=2)` +
`release_after_ms=200` and the fix held across the PR check
matrix (reruns=2 was enough headroom in 4 simultaneous legs).
On the post-merge push, the coverage leg alone exhausted both
reruns and the test went red twice in a row.

Fix (test-only, no production code change):

  * `release_after_ms=200` -> `release_after_ms=400` widens the
    release window by 200ms. Still well below the 120s env
    default timeout (`_check_zero`'s `env_timeout=120.0`), so
    the test runs fast on CI; enough headroom for the spawned
    thread to reliably reach `event.wait()` before the release
    fires even on a contended runner.
  * `@pytest.mark.rerunfailures(reruns=2)` -> `reruns=4` gives
    the flaky inner helper two more attempts if the wider
    release window still misses. 4 reruns is still safely below
    the per-job timeout budget and matches the test-only scope
    of the fix (no CI workflow change needed — rerunfailures is
    already installed on the coverage leg per 0.14.6).
  * Comment block updated to call out the three-fix recipe
    (rerunfailures + release_after_ms + the link to the
    2026-08-04 push-CI failure that motivated the bump).

Verified locally (Windows, Python 3.12, .venv-ci):

  * `for i in 1..10; do pytest
    tests/test_approval_timeout_field.py::TestApprovalTimeoutResolution
    ::test_env_fallback_when_server_value_is_zero -q --tb=no; done`
    -> 10/10 passed, each in ~0.7-1.2s. Pre-fix the same loop
    showed intermittent failures.
  * `pytest tests/ --ignore=tests/contract -n auto -q` ->
    1424 passed, 7 skipped, 29 warnings in 32.34s (matches
    the post-0.14.7 baseline; no regression introduced).
  * `ruff check src/ tests/` -> All checks passed.
  * `mypy src/nullrun --strict` -> Success: no issues found
    in 37 source files.

No production code change. No SDK_MIN_VERSION bump. No public
API change. Recommended upgrade path: 0.14.7 -> 0.14.8 (this
will be the first post-merge CI-fix release in the 0.14.x line;
otherwise the master CI badge stays red).
@maltsev-dev
maltsev-dev merged commit 06701bd into master Aug 4, 2026
4 checks passed
@maltsev-dev
maltsev-dev deleted the fix/0.14.8-coverage-rerun-widening branch August 4, 2026 10:53
@codecov

codecov Bot commented Aug 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant