UAT: Circular import between retry_patterns.py and retry_service_patterns.py — direct import of retry_service_patterns fails with ImportError #1862

Open
opened 2026-04-03 00:00:30 +00:00 by freemo · 2 comments
Owner

Metadata

  • Branch: fix/uat-circular-import-retry-patterns-retry-service-patterns
  • Commit Message: fix(core): resolve circular import between retry_patterns and retry_service_patterns by extracting shared symbols to retry_base
  • Milestone: v3.7.0
  • Parent Epic: #1669

Description

There is a circular import dependency between src/cleveragents/core/retry_patterns.py and src/cleveragents/core/retry_service_patterns.py.

Root Cause:

  • retry_service_patterns.py imports from retry_patterns.py (line 41)
  • retry_patterns.py imports from retry_service_patterns.py (lines 433–460)

This creates a circular dependency. When retry_service_patterns is imported directly (before retry_patterns has been initialized), Python raises:

ImportError: cannot import name '_MAX_RETRY_NESTING_DEPTH' from partially initialized module 'cleveragents.core.retry_service_patterns' (most likely due to a circular import)

Reproduction:

import sys
# Clear all cleveragents modules
for key in list(sys.modules.keys()):
    if 'cleveragents' in key:
        del sys.modules[key]

# This fails with ImportError
from cleveragents.core.retry_service_patterns import RetryContext

Impact:

  • Any code that imports retry_service_patterns directly (without first importing retry_patterns) will fail
  • The test step file features/steps/retry_service_patterns_coverage_steps.py imports retry_service_patterns directly and would fail if loaded in isolation
  • Currently works in practice only because behave loads step files alphabetically and retry_patterns_steps.py (which imports retry_patterns) happens to be loaded before retry_service_patterns_coverage_steps.py
  • This is a fragile import-order dependency that could break if step files are reorganized or if retry_service_patterns is imported from a new context

Expected Behavior (per spec):
The spec requires fail-fast behavior and proper module organization. A module should be importable directly without relying on import order side effects.

Proposed Fix:
The circular import should be resolved by either:

  1. Moving the shared constants (_MAX_RETRY_NESTING_DEPTH, _UNSET, _sanitize_error_message, CircuitBreaker, CircuitBreakerOpen) to a third module (e.g., retry_base.py) that both modules can import from without circularity
  2. Or restructuring so that retry_patterns.py does not import from retry_service_patterns.py at module level (use lazy imports or restructure the re-exports)

Files Affected:

  • src/cleveragents/core/retry_patterns.py (lines 433–460)
  • src/cleveragents/core/retry_service_patterns.py (line 41)
  • features/steps/retry_service_patterns_coverage_steps.py (lines 27–31)

Subtasks

  • Audit the full set of symbols imported between retry_patterns.py and retry_service_patterns.py to map the circular dependency precisely
  • Design the resolution strategy (introduce retry_base.py or use lazy imports) and confirm with team
  • Implement the chosen fix — extract shared symbols or restructure module-level imports
  • Update all import sites in retry_patterns.py, retry_service_patterns.py, and any other files that import the moved symbols
  • Verify from cleveragents.core.retry_service_patterns import RetryContext succeeds in a clean Python process (no prior retry_patterns import)
  • Verify from cleveragents.core.retry_patterns import ... still works correctly after the refactor
  • Update/add Behave step tests in features/steps/ to cover direct import of retry_service_patterns in isolation
  • Run nox -e typecheck to confirm Pyright passes with no errors
  • Run nox -e unit_tests to confirm all Behave tests pass
  • Run nox -e coverage_report to confirm coverage ≥ 97%

Definition of Done

  • from cleveragents.core.retry_service_patterns import RetryContext succeeds in a fresh Python process without any prior import of retry_patterns
  • from cleveragents.core.retry_patterns import ... continues to work correctly
  • No module-level circular import exists between retry_patterns.py and retry_service_patterns.py
  • All import sites updated — no references to moved symbols from their old locations remain broken
  • Behave tests cover direct import of retry_service_patterns in isolation
  • All nox stages pass
  • Coverage >= 97%

Automated by CleverAgents Bot
Supervisor: UAT Testing | Agent: ca-new-issue-creator

## Metadata - **Branch**: `fix/uat-circular-import-retry-patterns-retry-service-patterns` - **Commit Message**: `fix(core): resolve circular import between retry_patterns and retry_service_patterns by extracting shared symbols to retry_base` - **Milestone**: v3.7.0 - **Parent Epic**: #1669 ## Description There is a circular import dependency between `src/cleveragents/core/retry_patterns.py` and `src/cleveragents/core/retry_service_patterns.py`. **Root Cause**: - `retry_service_patterns.py` imports from `retry_patterns.py` (line 41) - `retry_patterns.py` imports from `retry_service_patterns.py` (lines 433–460) This creates a circular dependency. When `retry_service_patterns` is imported directly (before `retry_patterns` has been initialized), Python raises: ``` ImportError: cannot import name '_MAX_RETRY_NESTING_DEPTH' from partially initialized module 'cleveragents.core.retry_service_patterns' (most likely due to a circular import) ``` **Reproduction**: ```python import sys # Clear all cleveragents modules for key in list(sys.modules.keys()): if 'cleveragents' in key: del sys.modules[key] # This fails with ImportError from cleveragents.core.retry_service_patterns import RetryContext ``` **Impact**: - Any code that imports `retry_service_patterns` directly (without first importing `retry_patterns`) will fail - The test step file `features/steps/retry_service_patterns_coverage_steps.py` imports `retry_service_patterns` directly and would fail if loaded in isolation - Currently works in practice only because behave loads step files alphabetically and `retry_patterns_steps.py` (which imports `retry_patterns`) happens to be loaded before `retry_service_patterns_coverage_steps.py` - This is a fragile import-order dependency that could break if step files are reorganized or if `retry_service_patterns` is imported from a new context **Expected Behavior** (per spec): The spec requires fail-fast behavior and proper module organization. A module should be importable directly without relying on import order side effects. **Proposed Fix**: The circular import should be resolved by either: 1. Moving the shared constants (`_MAX_RETRY_NESTING_DEPTH`, `_UNSET`, `_sanitize_error_message`, `CircuitBreaker`, `CircuitBreakerOpen`) to a third module (e.g., `retry_base.py`) that both modules can import from without circularity 2. Or restructuring so that `retry_patterns.py` does not import from `retry_service_patterns.py` at module level (use lazy imports or restructure the re-exports) **Files Affected**: - `src/cleveragents/core/retry_patterns.py` (lines 433–460) - `src/cleveragents/core/retry_service_patterns.py` (line 41) - `features/steps/retry_service_patterns_coverage_steps.py` (lines 27–31) ## Subtasks - [ ] Audit the full set of symbols imported between `retry_patterns.py` and `retry_service_patterns.py` to map the circular dependency precisely - [ ] Design the resolution strategy (introduce `retry_base.py` or use lazy imports) and confirm with team - [ ] Implement the chosen fix — extract shared symbols or restructure module-level imports - [ ] Update all import sites in `retry_patterns.py`, `retry_service_patterns.py`, and any other files that import the moved symbols - [ ] Verify `from cleveragents.core.retry_service_patterns import RetryContext` succeeds in a clean Python process (no prior `retry_patterns` import) - [ ] Verify `from cleveragents.core.retry_patterns import ...` still works correctly after the refactor - [ ] Update/add Behave step tests in `features/steps/` to cover direct import of `retry_service_patterns` in isolation - [ ] Run `nox -e typecheck` to confirm Pyright passes with no errors - [ ] Run `nox -e unit_tests` to confirm all Behave tests pass - [ ] Run `nox -e coverage_report` to confirm coverage ≥ 97% ## Definition of Done - [ ] `from cleveragents.core.retry_service_patterns import RetryContext` succeeds in a fresh Python process without any prior import of `retry_patterns` - [ ] `from cleveragents.core.retry_patterns import ...` continues to work correctly - [ ] No module-level circular import exists between `retry_patterns.py` and `retry_service_patterns.py` - [ ] All import sites updated — no references to moved symbols from their old locations remain broken - [ ] Behave tests cover direct import of `retry_service_patterns` in isolation - [ ] All nox stages pass - [ ] Coverage >= 97% --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: ca-new-issue-creator
freemo added this to the v3.7.0 milestone 2026-04-03 00:01:06 +00:00
Author
Owner

Issue triaged by project owner:

  • State: Verified
  • MoSCoW: MoSCoW/Should Have — bug or error handling improvement.

Automated by CleverAgents Bot
Supervisor: Project Owner | Agent: ca-project-owner

Issue triaged by project owner: - **State**: Verified - **MoSCoW**: MoSCoW/Should Have — bug or error handling improvement. --- **Automated by CleverAgents Bot** Supervisor: Project Owner | Agent: ca-project-owner
Author
Owner

Issue triaged by project owner:

  • State: Verified
  • MoSCoW: MoSCoW/Should Have — bug or error handling improvement.

Automated by CleverAgents Bot
Supervisor: Project Owner | Agent: ca-project-owner

Issue triaged by project owner: - **State**: Verified - **MoSCoW**: MoSCoW/Should Have — bug or error handling improvement. --- **Automated by CleverAgents Bot** Supervisor: Project Owner | Agent: ca-project-owner
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Blocks
#1669 Bug Hunting Session
cleveragents/cleveragents-core
Reference
cleveragents/cleveragents-core#1862
No description provided.