From ed1ee6a48908d27e90abd5ac61e108f50aa7fb72 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Fri, 10 Jul 2026 18:00:33 -0700 Subject: [PATCH] docs(retry): add CHANGELOG entry and README module row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to b812943 — these were authored alongside the retry module but not staged in the original commit. --- CHANGELOG.md | 17 +++++++++++++++++ README.md | 1 + 2 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dd2d39..caf527c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,23 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [0.22.0] — 2026-07-10 + +### Added + +**`circuitforge_core.retry`** — standard retry/backoff wrapper over `backon` (closes #65) + +Standardizes retry/backoff behavior for cf-core modules and products that make external calls, replacing ad-hoc per-product retry loops. Wraps [backon](https://github.com/Llucs/backon) (MIT, zero stdlib dependencies) rather than reimplementing retry logic — chosen over `tenacity`/`backoff` per the eval in #65 for its native async support, built-in circuit breaker/hedging primitives, and a process-wide enable/disable toggle that's ideal for tests. + +- `on_exception(exception, *, max_tries=3, max_time=30.0, **backon_kwargs)` — decorator with CF's standard defaults (full-jitter exponential backoff); extra kwargs forward to `backon.on_exception` (e.g. `sleep=` for tests, `on_backoff=` for logging hooks). +- `retry(target, *args, exception=Exception, max_tries=3, max_time=30.0, **kwargs)` — call an already-defined callable with the same retry behavior, for use without decorator syntax. +- `disable_retries()` / `enable_retries()` — re-exported `backon` context managers for scoping retry-disable to a test or block. +- `disable_retries_globally()` / `enable_retries_globally()` — re-exported `backon.disable()`/`enable()` process-wide toggles, for a test-suite-level fixture. +- New core dependency: `backon>=4.0`. +- Scope note: only the standalone wrapper module ships in this PR. Wiring it into `llm`, `affiliates`, `reranker`, and `activitypub` (the call sites identified in #65) is left as follow-up work per module, rather than retrofitting `LLMRouter`'s existing fallback-chain error handling in the same change. + +--- + ## [0.20.0] — 2026-05-05 ### Fixed / Enhanced diff --git a/README.md b/README.md index d06acd5..3ac9d9e 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ pip install circuitforge-core[dev] # All dev dependencies | `cloud_session` | Implemented | Cloud session management primitives | | `input` | Implemented | Input handling — MediaPipe gesture recognition | | `job_quality` | Implemented | Job listing quality scoring and signal extraction | +| `retry` | Implemented | Standard retry/backoff wrapper over `backon` for external-call modules | | `vision` | Stub | Vision router (moondream2 / SigLIP dispatch — planned) | | `wizard` | Stub | First-run wizard base class — products subclass `BaseWizard` | | `pipeline` | Stub | Staging queue base — products provide concrete schema |