Skip to content

feat: Change HITL default TTL from unlimited to 90 days#1796

Open
vishnuszipstack wants to merge 3 commits intomainfrom
feat/hitl-default-ttl-90-days
Open

feat: Change HITL default TTL from unlimited to 90 days#1796
vishnuszipstack wants to merge 3 commits intomainfrom
feat/hitl-default-ttl-90-days

Conversation

@vishnuszipstack
Copy link
Contributor

@vishnuszipstack vishnuszipstack commented Feb 17, 2026

What

  • Updates WorkflowUtil.get_hitl_ttl_seconds() to always return a valid TTL (default 90 days) instead of None for unlimited
  • This is the open-source counterpart to the full TTL enforcement in unstract-cloud

Why

  • HITL records without a TTL live forever, consuming storage and cluttering the review queue
  • A 90-day default ensures records are eventually cleaned up without requiring explicit configuration

How

  • Changed return type of WorkflowUtil.get_hitl_ttl_seconds() from int | Noneint
  • ImportError fallback (when manual_review_v2 plugin is not installed) now returns 2160 * 3600 (90 days in seconds) instead of None
File Change
backend/plugins/workflow_manager/workflow_v2/utils.py Return type int | Noneint; ImportError fallback returns 2160 * 3600 (90 days) instead of None

Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)

  • No. Previously the function could return None (unlimited TTL). Now it always returns an integer. All callers already handle an integer TTL, so existing behavior is preserved — records just get a default expiry instead of living forever.

Database Migrations

  • None

Env Config

  • None

Relevant Docs

  • N/A

Related Issues or PRs

  • Cloud counterpart: unstract-cloud#1281 (backend models, helpers, serializers, migration, and frontend changes)

Dependencies Versions

  • None

Notes on Testing

  • Verify WorkflowUtil.get_hitl_ttl_seconds(workflow) returns 7776000 (90 days in seconds) when manual_review_v2 plugin is not installed
  • Verify existing workflow execution with HITL destination continues to work with a numeric TTL value

Screenshots

N/A

Checklist

I have read and understood the Contribution Guidelines.

🤖 Generated with Claude Code

Update WorkflowUtil.get_hitl_ttl_seconds() to always return an int
TTL value instead of None for unlimited. The ImportError fallback
now returns 2160 * 3600 (90 days in seconds) instead of None.

This is the open-source counterpart to the full TTL enforcement
in unstract-cloud, where the backend models, helpers, serializers,
migration, and frontend are also updated.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vishnuszipstack vishnuszipstack self-assigned this Feb 17, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 17, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between da3819d and a8ec3db.

📒 Files selected for processing (1)
  • backend/plugins/workflow_manager/workflow_v2/utils.py

Summary by CodeRabbit

  • Bug Fixes
    • Ensures workflows now consistently use a 90-day default timeout when external configuration is missing or errored, preventing unexpected timeouts or interruptions.
    • Improves reliability and stability by normalizing missing timeout values to a concrete default across workflow operations.

Walkthrough

Reworked HITL TTL logic: introduced SECS_IN_DAY and DEFAULT_HITL_TTL_SECONDS (90 days), converted get_hitl_ttl_seconds from a @staticmethod to an instance method, and normalized all None/ImportError TTL outcomes to return the concrete DEFAULT_HITL_TTL_SECONDS value (return type now int).

Changes

Cohort / File(s) Summary
HITL TTL Utility
backend/plugins/workflow_manager/workflow_v2/utils.py
Added module-level constants SECS_IN_DAY and DEFAULT_HITL_TTL_SECONDS (90 days). Removed @staticmethod from WorkflowUtil.get_hitl_ttl_seconds (now an instance method) and changed its return type from `int

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: converting HITL TTL from unlimited to a concrete 90-day default.
Description check ✅ Passed The description is comprehensive and follows the template with all critical sections filled: What, Why, How, breaking changes assessment, and test notes.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/hitl-default-ttl-90-days

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
backend/plugins/workflow_manager/workflow_v2/utils.py (1)

166-173: ⚠️ Potential issue | 🟡 Minor

Guard against None return from the plugin function.

The method signature declares -> int, but line 171 returns the result of get_hitl_ttl_seconds_by_workflow(workflow) without checking if it returns None. If the external plugin function returns None, this violates the type contract. Use return get_hitl_ttl_seconds_by_workflow(workflow) or 2160 * 3600 to ensure an int is always returned.

Additionally, 2160 * 3600 (90 days) is a magic number—consider extracting it as a named constant for clarity.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/plugins/workflow_manager/workflow_v2/utils.py` around lines 166 -
173, The call to get_hitl_ttl_seconds_by_workflow(workflow) may return None but
the function is declared to return int; change the return to use a safe fallback
(e.g. return get_hitl_ttl_seconds_by_workflow(workflow) or
DEFAULT_HITL_TTL_SECONDS) and extract the magic value 2160 * 3600 into a named
constant (e.g. DEFAULT_HITL_TTL_SECONDS) at the top of the module so the
function always returns an int and the default is clear; update the try/except
block that currently returns the plugin value to use this fallback and keep the
ImportError branch returning the same constant.
🧹 Nitpick comments (1)
backend/plugins/workflow_manager/workflow_v2/utils.py (1)

173-173: Consider extracting the magic number into a named constant.

2160 * 3600 requires mental arithmetic to confirm it equals 90 days. A named constant improves readability and makes the value reusable.

♻️ Suggested refactor
+# Default HITL TTL: 90 days in seconds
+DEFAULT_HITL_TTL_SECONDS = 90 * 24 * 3600
+
 class WorkflowUtil:
         except ImportError:
-            return 2160 * 3600
+            return DEFAULT_HITL_TTL_SECONDS

Using 90 * 24 * 3600 also makes the "90 days" intent immediately obvious.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/plugins/workflow_manager/workflow_v2/utils.py` at line 173, Extract
the magic number "2160 * 3600" in utils.py into a clearly named module-level
constant (e.g., NINETY_DAYS_SECONDS or DEFAULT_RETENTION_SECONDS) defined near
the top of the file and replace the literal return expression with that
constant; use an explicit expression like 90 * 24 * 3600 for the constant so the
"90 days" intent is obvious and reusable across functions that reference the
same TTL/retention value.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@backend/plugins/workflow_manager/workflow_v2/utils.py`:
- Around line 166-173: The call to get_hitl_ttl_seconds_by_workflow(workflow)
may return None but the function is declared to return int; change the return to
use a safe fallback (e.g. return get_hitl_ttl_seconds_by_workflow(workflow) or
DEFAULT_HITL_TTL_SECONDS) and extract the magic value 2160 * 3600 into a named
constant (e.g. DEFAULT_HITL_TTL_SECONDS) at the top of the module so the
function always returns an int and the default is clear; update the try/except
block that currently returns the plugin value to use this fallback and keep the
ImportError branch returning the same constant.

---

Nitpick comments:
In `@backend/plugins/workflow_manager/workflow_v2/utils.py`:
- Line 173: Extract the magic number "2160 * 3600" in utils.py into a clearly
named module-level constant (e.g., NINETY_DAYS_SECONDS or
DEFAULT_RETENTION_SECONDS) defined near the top of the file and replace the
literal return expression with that constant; use an explicit expression like 90
* 24 * 3600 for the constant so the "90 days" intent is obvious and reusable
across functions that reference the same TTL/retention value.

@vishnuszipstack vishnuszipstack force-pushed the feat/hitl-default-ttl-90-days branch from da3819d to c689705 Compare February 24, 2026 04:31
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
backend/plugins/workflow_manager/workflow_v2/utils.py (1)

162-180: ⚠️ Potential issue | 🟠 Major

Plugin's get_hitl_ttl_seconds_by_workflow may return None, violating the declared int return type.

The return type annotation is -> int (line 157), but line 171 passes the plugin's return value through unguarded. Although the plugin code is not accessible in this repository, the fallback helper implementations in workers/shared/utils/manual_review_factory.py (lines 150, 348, 456) consistently return None for OSS/fallback cases, suggesting the cloud plugin's get_hitl_ttl_seconds_by_workflow may do the same for workflows without explicit TTL configuration. This would cause a type violation since callers rely on the declared -> int contract.

While the queue operations accept ttl_seconds: int | None, the function should guard against None from the plugin to maintain type safety:

🛡️ Proposed guard against None from plugin
         try:
             from pluggable_apps.manual_review_v2.helper import (
                 get_hitl_ttl_seconds_by_workflow,
             )

-            return get_hitl_ttl_seconds_by_workflow(workflow)
+            ttl = get_hitl_ttl_seconds_by_workflow(workflow)
+            if ttl is None:
+                return 2160 * 3600
+            return ttl
         except ImportError:
             return 2160 * 3600
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/plugins/workflow_manager/workflow_v2/utils.py` around lines 162 -
180, The get_hitl_ttl_seconds function currently forwards the plugin result from
get_hitl_ttl_seconds_by_workflow unguarded, which may be None and violates the
declared int return; update get_hitl_ttl_seconds to capture the plugin return
into a local (e.g., ttl = get_hitl_ttl_seconds_by_workflow(workflow)), check if
ttl is None or not an int, and if so return DEFAULT_HITL_TTL_HOURS * 3600;
preserve the existing ImportError fallback behavior but ensure the function
always returns an int.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@backend/plugins/workflow_manager/workflow_v2/utils.py`:
- Around line 18-20: DEFAULT_HITL_TTL_HOURS is computed at import time with
int(os.environ.get(...)) which will raise ValueError on non-numeric input and
accepts non-positive numbers; change this to read the raw env var (e.g., env_val
= os.environ.get("HITL_DEFAULT_TTL_HOURS")), attempt to convert it inside a
try/except (catch ValueError/TypeError), and fall back to the default 2160 on
failure; after conversion validate that the integer is > 0 and if not use the
default (optionally log/warn), ensuring the module import never raises and
DEFAULT_HITL_TTL_HOURS is always a positive int.

---

Outside diff comments:
In `@backend/plugins/workflow_manager/workflow_v2/utils.py`:
- Around line 162-180: The get_hitl_ttl_seconds function currently forwards the
plugin result from get_hitl_ttl_seconds_by_workflow unguarded, which may be None
and violates the declared int return; update get_hitl_ttl_seconds to capture the
plugin return into a local (e.g., ttl =
get_hitl_ttl_seconds_by_workflow(workflow)), check if ttl is None or not an int,
and if so return DEFAULT_HITL_TTL_HOURS * 3600; preserve the existing
ImportError fallback behavior but ensure the function always returns an int.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between c689705 and da3819d.

📒 Files selected for processing (1)
  • backend/plugins/workflow_manager/workflow_v2/utils.py

Copy link
Contributor

@chandrasekharan-zipstack chandrasekharan-zipstack left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest adding it as a constant instead of leaving it this way. The constant could just be a local variable if you think it won't be used elsewhere.
Or it could be something like 90 * SECS_IN_DAY

Replace raw `2160 * 3600` with `DEFAULT_HITL_TTL_SECONDS = 90 * SECS_IN_DAY`
for readability. Also guard against None return from plugin function.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@sonarqubecloud
Copy link

@github-actions
Copy link
Contributor

Test Results

Summary
  • Runner Tests: 11 passed, 0 failed (11 total)
  • SDK1 Tests: 66 passed, 0 failed (66 total)

Runner Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_logs}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup\_skip}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_client\_init}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config\_without\_mount}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_run\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_for\_sidecar}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_sidecar\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{11}}$$ $$\textcolor{#23d18b}{\tt{11}}$$
SDK1 Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_non\_retryable\_http\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retryable\_http\_errors}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_post\_method\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_logging}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_retry\_on\_errors}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_wrapper\_methods\_retry}}$$ $$\textcolor{#23d18b}{\tt{4}}$$ $$\textcolor{#23d18b}{\tt{4}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_connection\_error\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_timeout\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_non\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_without\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_non\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_other\_exception\_not\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_without\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_successful\_call\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_after\_transient\_failure}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_max\_retries\_exceeded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_max\_time\_exceeded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_with\_custom\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_no\_retry\_with\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_exception\_not\_in\_tuple\_not\_retried}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_delay\_would\_exceed\_max\_time}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_default\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_environment\_variable\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_max\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_max\_time}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_base\_delay}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_multiplier}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_jitter\_values}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_exceptions\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_predicate\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_both\_exceptions\_and\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_exceptions\_match\_but\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_platform\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_prompt\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_platform\_service\_decorator\_retries\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_prompt\_service\_decorator\_retries\_on\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_warning\_logged\_on\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_info\_logged\_on\_success\_after\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_exception\_logged\_on\_giving\_up}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{66}}$$ $$\textcolor{#23d18b}{\tt{66}}$$

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.

4 participants