-
Notifications
You must be signed in to change notification settings - Fork 12
prep release 1.23.0 #1259
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
prep release 1.23.0 #1259
Changes from all commits
8300e68
10a45a0
7fce489
9a85580
169f1cb
08fa009
645553a
97886fd
f821605
54d96aa
51cd2c5
1fe0ccd
26ec3ec
ef6bbc5
ce019bd
112a7c5
28a33ad
d417166
bd93619
ab49028
fdfbe23
c40ab56
d4125e1
f1d46e3
f828cb1
c401806
9c74bfa
fefd01c
6fe1bf1
07eb001
bb88b2d
62e6be2
72540fd
5a0176e
2506cb6
e9e85ca
40d7ae6
3a490da
fead632
43990f3
a6b7d1d
89e848a
f0338b8
e0b4725
02b4da5
f736cc6
d3c2493
3b964a8
7e99f52
f7eb7ea
ef694f5
cd5a2c3
ab60207
48b9fd6
2952d5a
01f7c6f
7ee6566
fbcb569
fd7f55b
3596555
816d834
ba6f582
b0b5bce
c9e8b5d
e281381
c121d45
632e542
37f5847
cc72f69
30ddc7f
0db7361
f728151
231a285
ea27bcf
44d882c
9161e24
ea11136
b951dc7
b1dcb35
12af188
1face70
165ea52
d70aaa1
48359e9
438f1cd
07bc7ba
7779004
72fc224
c59cf87
d0c3a32
75a5b2c
1ea829b
c0cac67
e6f65a3
45f367e
99e923a
8f4de3c
7d0c1b0
4ea2bbf
78060c6
5fabbec
9474ffe
a592f7c
22fc7ac
c7313d5
eabb609
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| --- | ||
| # yamllint disable rule:truthy rule:line-length | ||
| name: Schema Drift Check | ||
|
|
||
| # Warn-only: surfaces when the published Infrahub JSON schema has drifted from | ||
| # the formatter's committed baseline (infrahub_sdk/ctl/schema_properties.json). | ||
| # This never fails the run — it emits ::warning:: annotations and a job summary | ||
| # so a maintainer can account for the change in schema_format.py. | ||
|
|
||
| on: | ||
| release: | ||
| types: | ||
| - published | ||
| workflow_dispatch: | ||
|
|
||
| jobs: | ||
| schema-drift: | ||
| runs-on: "ubuntu-22.04" | ||
| timeout-minutes: 5 | ||
| steps: | ||
| - name: "Check out repository code" | ||
| uses: "actions/checkout@v6" | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v6 | ||
| with: | ||
| python-version: "3.12" | ||
| - name: Install UV | ||
| uses: astral-sh/setup-uv@v7 | ||
| - name: Install dependencies | ||
| run: uv sync --all-groups --all-extras | ||
| - name: "Check for Infrahub schema drift (warn only)" | ||
| run: uv run invoke schema-drift-check |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -45,6 +45,7 @@ exceptions: | |
| - IP | ||
| - IP Fabric | ||
| - IPAM | ||
| - IPAddress | ||
| - IPHost | ||
| - IPNetwork | ||
| - JavaScript | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,6 +8,7 @@ artifact_definitions | |
| artifact_name | ||
| async | ||
| Authentik | ||
| backoff | ||
| boolean | ||
| check_definitions | ||
| class_name | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| # Spec/Ask Alignment Check: SDK retry with backoff on HTTP 429 responses | ||
|
|
||
| **Date**: 2026-07-07 | ||
| **Feature**: [spec.md](./spec.md) | ||
|
|
||
| ## 1. Source | ||
|
|
||
| **Source PRD**: Jira IHS-249 — "SDK retry with backoff on HTTP 429 responses" | ||
| (`https://opsmill.atlassian.net/browse/IHS-249`), fetched via the Atlassian MCP tool. | ||
| The issue body is itself a full, structured PRD (Problem Statement, Solution Overview, 9 User | ||
| Stories, 3 prioritised User Journeys with acceptance criteria, FR-001…009, Key Entities, Edge | ||
| Cases, SC-001…005, Implementation/Testing Decisions, Out of Scope, one Open Question). Related | ||
| GitHub issue: opsmill/infrahub-sdk-python#1124. No secondary URLs to fetch. | ||
|
|
||
| ## 2. Verdict | ||
|
|
||
| Result: ✅ ALIGNED | ||
|
|
||
| `spec.md` faithfully carries every PRD requirement, acceptance criterion, and scope boundary. | ||
| The only additions are an expansion of an existing requirement and the authorized resolution of | ||
| the PRD's explicit open question — neither is drift under the check's definition. | ||
|
|
||
| ## 3. Findings | ||
|
|
||
| | Severity | Category | PRD reference | Spec reference | Description | | ||
| | ---------- | ---------- | --------------- | ---------------- | ------------- | | ||
| | ✅ none | missing | FR-001…009 | FR-001…009 | All nine functional requirements present, none dropped or softened (attempt cap, jittered+clamped backoff, Retry-After both forms, malformed fallback, RateLimitError with url/attempts/last-Retry-After, all request paths, per-retry logging, async/sync parity, tune+disable). | | ||
| | ✅ none | missing | Journeys P1–P3, User Stories 1–9 | US1–US4, Edge Cases | P1/P2/P3 journeys map to US1/US2/US3; PRD user story 8 (tune/disable) surfaced as US4. All acceptance scenarios preserved. | | ||
| | ✅ none | missing | SC-001…005 | SC-001…005 | Success criteria carried over with equivalent semantics. | | ||
| | ✅ none | contradicted | Out of Scope (503, server-side INFP-636/635, `retry_on_failure`) | Out of Scope | Scope boundaries reproduced verbatim; nothing contradicted. | | ||
| | ℹ️ info | added (authorized) | Open Question (chain httpx.HTTPStatusError as `__cause__`?) | FR-005, Assumptions | The PRD's single open question was resolved affirmatively (chain the transport error as `__cause__`). The parent prep flow explicitly authorizes autonomous clarification resolution; recorded as an assumption. Not drift. | | ||
| | ℹ️ info | added (derived) | FR-009 (disable via Config) | SC-006 | Spec adds SC-006 (disabled path raises immediately). This is a measurable expansion of FR-009, not new scope. | | ||
| | ℹ️ info | added (design) | Assumption: single `_request` chokepoint | plan.md R1 / data-model | Plan (not spec) records that multipart/streaming bypass `_request`, so retry is applied at three sites. This corrects a PRD *assumption* at the implementation layer while still satisfying FR-006; spec requirements unchanged. Not spec drift. | | ||
|
|
||
| No requirements are missing, no acceptance criteria dropped or softened, no requirement semantics | ||
| changed, and no off-scope scope items were introduced. The Config field defaults (enabled, 5, 0.5, | ||
| 60), the new `RateLimitError`, and the additive-only API surface all match the PRD exactly. | ||
|
|
||
| ## 4. Action | ||
|
|
||
| **Proceed.** No remediation passes required (remediation counter: 0). `tasks.md` is safe to hand to | ||
| the implementation phase. The affirmative resolution of the open question and the SC-006 derivation | ||
| are documented above for traceability. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| # Specification Quality Checklist: SDK retry with backoff on HTTP 429 responses | ||
|
|
||
| **Purpose**: Validate specification completeness and quality before proceeding to planning | ||
| **Created**: 2026-07-07 | ||
| **Feature**: [spec.md](../spec.md) | ||
|
|
||
| ## Content Quality | ||
|
|
||
| - [x] No implementation details (languages, frameworks, APIs) | ||
| - [x] Focused on user value and business needs | ||
| - [x] Written for non-technical stakeholders | ||
| - [x] All mandatory sections completed | ||
|
|
||
| ## Requirement Completeness | ||
|
|
||
| - [x] No [NEEDS CLARIFICATION] markers remain | ||
| - [x] Requirements are testable and unambiguous | ||
| - [x] Success criteria are measurable | ||
| - [x] Success criteria are technology-agnostic (no implementation details) | ||
| - [x] All acceptance scenarios are defined | ||
| - [x] Edge cases are identified | ||
| - [x] Scope is clearly bounded | ||
| - [x] Dependencies and assumptions identified | ||
|
|
||
| ## Feature Readiness | ||
|
|
||
| - [x] All functional requirements have clear acceptance criteria | ||
| - [x] User scenarios cover primary flows | ||
| - [x] Feature meets measurable outcomes defined in Success Criteria | ||
| - [x] No implementation details leak into specification | ||
|
|
||
| ## Notes | ||
|
|
||
| - The PRD's single open question (whether the exhaustion error should chain the | ||
| underlying transport error as its cause) was resolved affirmatively and encoded | ||
| into FR-005 and the Assumptions section, so no [NEEDS CLARIFICATION] markers remain. | ||
| - Entity names in the spec are described in capability terms (e.g. "rate-limit retry | ||
| decision logic") rather than concrete class names to keep the spec implementation-agnostic; | ||
| concrete names (`RateLimitRetryHandler`, `RateLimitError`, `Config` fields) are deferred to plan.md. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P3: The Notes claim that concrete names like Prompt for AI agents |
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| # Contract: `Config` rate-limit fields (additive, public) | ||
|
|
||
| Added to `infrahub_sdk/config.py::ConfigBase`. All additive; no existing field changes. | ||
|
|
||
| ```python | ||
| rate_limit_retry_enabled: bool = Field( | ||
| default=True, | ||
| description="Retry requests that receive HTTP 429 using backoff. Set False to disable.", | ||
| ) | ||
| rate_limit_max_retries: int = Field( | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P2: The contract documents Prompt for AI agents |
||
| default=5, | ||
| ge=0, | ||
| description="Maximum number of retries after the initial attempt when receiving HTTP 429.", | ||
| ) | ||
| rate_limit_backoff_base: float = Field( | ||
| default=0.5, | ||
| gt=0, | ||
| description="Base interval in seconds for exponential backoff between 429 retries.", | ||
| ) | ||
| rate_limit_backoff_max: float = Field( | ||
| default=60.0, | ||
| gt=0, | ||
| description="Maximum wait in seconds for any single 429 retry (also clamps Retry-After).", | ||
| ) | ||
| ``` | ||
|
|
||
| ## Backward compatibility | ||
|
|
||
| - Purely additive; existing code constructing `Config(...)` / `InfrahubClient(...)` is unaffected. | ||
| - Environment-variable overrides follow the existing `BaseSettings` mechanism (e.g. | ||
| `INFRAHUB_RATE_LIMIT_MAX_RETRIES`), consistent with current fields. | ||
|
|
||
| ## Guarantees | ||
|
|
||
| - `rate_limit_retry_enabled=False` ⇒ a 429 is returned/raised exactly as before this feature | ||
| (no wait, no extra attempt). (FR-009, SC-006) | ||
| - Defaults produce transparent retry for typical background workloads. (FR-001) | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P2: A valid
v0.0.0.devNor local tag is rejected becausebase_versionidentifies only0.0.0, not whether Hatch used the fallback. Check exact tag reachability before rejecting the fallback version.Prompt for AI agents