Skip to content

sdk-sync: API 2.0.0+ffb34b7 → sdk-py (minor) - #176

Open
marketdata-sdk-sync[bot] wants to merge 1 commit into
mainfrom
sdk-sync/2.0.0-ffb34b7
Open

marketdata-sdk-sync[bot] wants to merge 1 commit into
mainfrom
sdk-sync/2.0.0-ffb34b7

Conversation

@marketdata-sdk-sync

@marketdata-sdk-sync marketdata-sdk-sync Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Generated by sdk-auto-sync for API release 2.0.0 (commit ffb34b7).

Changes in the API surface

Snapshots ae2b047c8f6f → c2a31e277345:

~ GET /v1/options/chain/{underlying}/ ?dte: string  (was integer)

What the agent did

tests: Added tests for the dte query parameter of GET /v1/options/chain/{underlying}/, widened from integer to a string expression matching strike/delta syntax. Wire tests in test_chain_filters.py cover the single-value regression plus the three new forms (comma list, closed range, comparison operator >=/<) across all four output formats. Live tests in test_options_live.py cover the same forms against the real API, deriving boundary values from actual expirations rather than guessed constants, and assert inclusive/exclusive boundary behavior for the range and operator forms. No validation tests were added since days_to_expiration is an existing field and the delta adds no new public symbol; wrote build/sdk-sync-compat/probe.py covering the existing OptionsChainInput(dte=...) constructor with today's int type.

implement: Widened OptionsChainInput.days_to_expiration (alias dte) from int | None to int | str | None: the plain int form still works unchanged, and a string now carries the API's expression syntax (comma list, closed range, comparison operator), matching strike/delta.

  • Doc comment/example: updated the field's description and added a "Filter by days to expiration" example in docs/options.md, mirroring the strike/delta style.
  • Every new public member documented: no new method/class was added, only the existing field's description, which is updated.
  • Wire test per form: test_chain_filters.py covers single value (regression), comma list, closed range, >=, <, each across all four output formats.
  • New-type validation on every path, empty/null elements: not applicable, dte is a scalar (int/str), not a collection.
  • Coverage: no # pragma: no cover added; full suite at 100% coverage.
  • Examples/docs still correct: the strike/delta sections are untouched and still accurate.
  • No unrequested client-side check: the field only widened its annotation, no new local validation, so an out-of-range or malformed value still reaches the API exactly as before.
  • Existing parameter keeps its old form: days_to_expiration=30 (int) still type-checks and sends dte=30; confirmed with the compatibility probe against the widened field.
    Left as-is: README.md and the other options-chain tests/files only mention the unrelated response-side dte field (list[int]) or unrelated resources, not this query parameter, so nothing there was wrong or incomplete.

review fix 1: Fixed the two major findings: reworded the days_to_expiration description in docs/options.md and src/marketdata/input_types/options.py to the repo's own grammar — a closed range is inclusive, >=/<=/>/< are a one-sided bound, dropping the false claim that operators are inclusive — and added test_dte_closed_range_spans_every_expiration_within_its_bounds to test_options_live.py, which builds its range from two independent single-value baseline calls (dte=15, dte=45) and asserts every returned dte is within [low, high], both bounds are present, and more than one expiration came back, so a server that only matched the nearest value can no longer pass it.
Resolved both actionable minor notes: added a days_to_expiration="30" (str) row to the wire-test parametrization in test_chain_filters.py, and added the "at most 36500" cap to both the field description and docs/options.md.
Resolved the flakiness note by making live_chain_dte_nearest function-scoped instead of module-scoped, so each of the boundary tests (single-value, collapsed range, >=, <) derives its own boundary from its own fresh dte=90 call instead of reusing one call's value across several later live calls.
Left the question-for-a-person finding (the API's own description implying <N should be inclusive, contradicted by the live run) untouched, as instructed — no code or doc changed for it.
Reran uv run --frozen pytest -n 4 -p no:cacheprovider --junitxml=build/test-results/pytest.xml (2188 passed, 100% coverage) and the ruff version/check/format commands (all green) after every change.

changelog: Added changelog entry documenting that OptionsChainInput.days_to_expiration now accepts str for the API's expression syntax (comma-list, closed range, comparison operators), matching the forms of strike and delta (API release 2.0.0), with backward compatibility for int values.

Questions for a person

The internal reviewers raised these for a person to answer. They did not block the change, and the coder was not asked to resolve them.

  • src/tests/integration/test_options_live.py:189 — The API's description says a comparison operator returns expirations "within the bounds, inclusive", yet the live run shows dte=<N excluding N (this test asserts the exclusion and passed). Request: GET /v1/options/chain/AAPL/?dte=<N; documentation: "a comparison operator (>=30, <45) returns every expiration whose dte falls within the bounds, inclusive"; response: no row with dte == N. The "syntax matches strike and delta" sentence implies the exclusion, so this needs confirming with the API team rather than fixing here.

Files

  • CHANGELOG.md
  • docs/options.md
  • src/marketdata/input_types/options.py
  • src/tests/integration/test_options_live.py
  • src/tests/test_chain_filters.py

Version

Public-surface change computed by the pipeline: minor

  • added: client.options.chain(days_to_expiration) — OptionsChainInput.days_to_expiration widened from int | None to int | str | None; every existing call such as client.options.chain("AAPL", days_to_expiration=30) still type-checks and behaves the same, and callers gain the ability to pass the API's comma-list, range and comparison-operator expressions as a string.

Live-API suite

  • src/tests/integration/test_options_live.py

Files of this suite changed by this pull request. The pipeline ran the ones the change added or modified against the live API before the pull request, and they passed; this pull request's CI runs the whole suite.

Job log

The full record of this job — every phase, test and build result, review findings and how they were resolved, and each fix round after the PR was opened — is in the job log comment.


4 coder run(s) · 3 review(s) · 106 turns · 8,942,129 tokens · US$ 5.17 · item 1380e6e8-31e3-4322-a204-207422fcb4d5

Agent runs
  • coder · claude-haiku-4-5-20251001, claude-sonnet-5 · 1,626,107 tokens (98,643 in, 1,496,389 cached, 31,075 out) · 30 turns · US$ 1.01 · 6 min 18 s
  • coder · claude-sonnet-5 · 3,461,853 tokens (33,316 in, 3,415,619 cached, 12,918 out) · 28 turns · US$ 0.95 · 4 min 50 s
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 490,472 tokens (71,093 in, 406,845 cached, 12,534 out) · 10 turns · US$ 1.26 · 2 min 49 s
  • coder · claude-sonnet-5 · 2,841,158 tokens (19,431 in, 2,811,916 cached, 9,811 out) · 20 turns · US$ 0.74 · 3 min 20 s
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 122,525 tokens (50,735 in, 68,466 cached, 3,324 out) · 4 turns · US$ 0.66 · 48 s
  • security · claude-haiku-4-5-20251001, claude-sonnet-5 · 189,740 tokens (56,581 in, 131,259 cached, 1,900 out) · 4 turns · US$ 0.31 · 26 s
  • analyst · claude-haiku-4-5-20251001, claude-sonnet-5 · 93,339 tokens (27,639 in, 64,418 cached, 1,282 out) · 5 turns · US$ 0.15 · 19 s
  • changelog · claude-haiku-4-5-20251001 · 116,935 tokens (26,281 in, 85,975 cached, 4,679 out) · 5 turns · US$ 0.09 · 52 s

tests: Added tests for the `dte` query parameter of `GET /v1/options/chain/{underlying}/`, widened from integer to a string expression matching strike/delta syntax. Wire tests in test_chain_filters.py cover the single-value regression plus the three new forms (comma list, closed range, comparison operator `>=`/`<`) across all four output formats. Live tests in test_options_live.py cover the same forms against the real API, deriving boundary values from actual expirations rather than guessed constants, and assert inclusive/exclusive boundary behavior for the range and operator forms. No validation tests were added since `days_to_expiration` is an existing field and the delta adds no new public symbol; wrote build/sdk-sync-compat/probe.py covering the existing `OptionsChainInput(dte=...)` constructor with today's `int` type.

implement: Widened `OptionsChainInput.days_to_expiration` (alias `dte`) from `int | None` to `int | str | None`: the plain int form still works unchanged, and a string now carries the API's expression syntax (comma list, closed range, comparison operator), matching `strike`/`delta`.
- Doc comment/example: updated the field's `description` and added a "Filter by days to expiration" example in docs/options.md, mirroring the strike/delta style.
- Every new public member documented: no new method/class was added, only the existing field's description, which is updated.
- Wire test per form: test_chain_filters.py covers single value (regression), comma list, closed range, `>=`, `<`, each across all four output formats.
- New-type validation on every path, empty/null elements: not applicable, `dte` is a scalar (int/str), not a collection.
- Coverage: no `# pragma: no cover` added; full suite at 100% coverage.
- Examples/docs still correct: the strike/delta sections are untouched and still accurate.
- No unrequested client-side check: the field only widened its annotation, no new local validation, so an out-of-range or malformed value still reaches the API exactly as before.
- Existing parameter keeps its old form: `days_to_expiration=30` (int) still type-checks and sends `dte=30`; confirmed with the compatibility probe against the widened field.
Left as-is: README.md and the other options-chain tests/files only mention the unrelated response-side `dte` field (`list[int]`) or unrelated resources, not this query parameter, so nothing there was wrong or incomplete.

review fix 1: Fixed the two major findings: reworded the `days_to_expiration` description in docs/options.md and src/marketdata/input_types/options.py to the repo's own grammar — a closed range is inclusive, `>=`/`<=`/`>`/`<` are a one-sided bound, dropping the false claim that operators are inclusive — and added `test_dte_closed_range_spans_every_expiration_within_its_bounds` to test_options_live.py, which builds its range from two independent single-value baseline calls (dte=15, dte=45) and asserts every returned dte is within [low, high], both bounds are present, and more than one expiration came back, so a server that only matched the nearest value can no longer pass it.
Resolved both actionable minor notes: added a `days_to_expiration="30"` (str) row to the wire-test parametrization in test_chain_filters.py, and added the "at most 36500" cap to both the field description and docs/options.md.
Resolved the flakiness note by making `live_chain_dte_nearest` function-scoped instead of module-scoped, so each of the boundary tests (single-value, collapsed range, `>=`, `<`) derives its own boundary from its own fresh `dte=90` call instead of reusing one call's value across several later live calls.
Left the question-for-a-person finding (the API's own description implying `<N` should be inclusive, contradicted by the live run) untouched, as instructed — no code or doc changed for it.
Reran `uv run --frozen pytest -n 4 -p no:cacheprovider --junitxml=build/test-results/pytest.xml` (2188 passed, 100% coverage) and the ruff version/check/format commands (all green) after every change.

changelog: Added changelog entry documenting that `OptionsChainInput.days_to_expiration` now accepts `str` for the API's expression syntax (comma-list, closed range, comparison operators), matching the forms of `strike` and `delta` (API release 2.0.0), with backward compatibility for `int` values.
@marketdata-sdk-sync marketdata-sdk-sync Bot added minor adds to the SDK's public surface and breaks nothing sdk-sync: in progress sdk-sync is still working on this PR: CI, code review, fixes labels Oct 30, 2026
@marketdata-sdk-sync

Copy link
Copy Markdown
Author

🧾 Job log — sdk-sync

sdk-auto-sync job log

API release 2.0.0 (commit ffb34b7)
SDK sdk-py
Branch sdk-sync/2.0.0-ffb34b7
API surface ae2b047c8f6f → c2a31e277345
Date 2026-10-30 13:48:16Z
Outcome done

Changes in the API surface

~ GET /v1/options/chain/{underlying}/ ?dte: string  (was integer)

1. tests

Coder (30 turns, US$ 1.01, 6 min 18 s):

uv run --frozen pytest -n 4 -p no:cacheprovider --junitxml=build/test-results/pytest.xml → red as required: 16 failed (the new dte string-form wire tests, across internal/json/csv/dataframe), 2168 passed. uv run --frozen --with pyright[nodejs]==1.1.414 pyright build/sdk-sync-compat/probe.py → 0 errors, confirming the probe type-checks against today's code.

Added tests for the dte query parameter of GET /v1/options/chain/{underlying}/, widened from integer to a string expression matching strike/delta syntax. Wire tests in test_chain_filters.py cover the single-value regression plus the three new forms (comma list, closed range, comparison operator >=/<) across all four output formats. Live tests in test_options_live.py cover the same forms against the real API, deriving boundary values from actual expirations rather than guessed constants, and assert inclusive/exclusive boundary behavior for the range and operator forms. No validation tests were added since days_to_expiration is an existing field and the delta adds no new public symbol; wrote build/sdk-sync-compat/probe.py covering the existing OptionsChainInput(dte=...) constructor with today's int type.

Gates:

  • compatibility probe on the base, attempt 1: passed (2 s)
  • tests (expected to fail), attempt 1: failed — 16 failing test(s): src.tests.test_chain_filters.test_the_dte_query_string_carries_the_expression_the_api_reads[internal-comma_list], src.tests.test_chain_filters.test_the_dte_query_string_carries_the_expression_the_api_reads[internal-closed_range], src.tests.test_chain_filters.test_the_dte_query_string_carries_the_expression_the_api_reads[internal-at_least] and 13 more (28 s)

2. implement

Coder (28 turns, US$ 0.95, 4 min 50 s):

uv run --frozen pytest -n 4 -p no:cacheprovider --junitxml=build/test-results/pytest.xml → 2184 passed. uv run --frozen python .github/scripts/check_ruff_version.py && uv run --frozen ruff check src/ examples/ .github/scripts/ && uv run --frozen ruff format --check src/ examples/ .github/scripts/ → all green. Coverage run → 100%. Pyright on build/sdk-sync-compat/probe.py → 0 errors.

Widened OptionsChainInput.days_to_expiration (alias dte) from int | None to int | str | None: the plain int form still works unchanged, and a string now carries the API's expression syntax (comma list, closed range, comparison operator), matching strike/delta.

  • Doc comment/example: updated the field's description and added a "Filter by days to expiration" example in docs/options.md, mirroring the strike/delta style.
  • Every new public member documented: no new method/class was added, only the existing field's description, which is updated.
  • Wire test per form: test_chain_filters.py covers single value (regression), comma list, closed range, >=, <, each across all four output formats.
  • New-type validation on every path, empty/null elements: not applicable, dte is a scalar (int/str), not a collection.
  • Coverage: no # pragma: no cover added; full suite at 100% coverage.
  • Examples/docs still correct: the strike/delta sections are untouched and still accurate.
  • No unrequested client-side check: the field only widened its annotation, no new local validation, so an out-of-range or malformed value still reaches the API exactly as before.
  • Existing parameter keeps its old form: days_to_expiration=30 (int) still type-checks and sends dte=30; confirmed with the compatibility probe against the widened field.
    Left as-is: README.md and the other options-chain tests/files only mention the unrelated response-side dte field (list[int]) or unrelated resources, not this query parameter, so nothing there was wrong or incomplete.

The pipeline:

  • the coder wrote build/sdk-sync-compat/probe.py, the compatibility probe; removed, the pipeline checks its own copy

Gates:

  • tests, attempt 1: passed (27 s)
  • build, attempt 1: passed (0 s)
  • compatibility probe, attempt 1: passed (2 s)
  • live API suite, attempt 1: passed (16 s) — uv run --frozen pytest -m integration -p no:cacheprovider --junitxml=build/test-results/live.xml src/tests/integration/test_options_live.py

3. review 1

Reviewer (10 turns, US$ 1.26, 2 min 49 s): 2 blocking finding(s)

The widening of days_to_expiration to int | str is correct and non-breaking (version impact: minor), with wire tests for all four enumerated forms across the four output formats and no client-side check added that would change the error type of existing calls. Two problems remain: the new documentation asserts that comparison operators are "inclusive", which the repository's own strike/delta documentation and the passing live <N test contradict, and the closed-range form has no live test that proves range semantics (only a degenerate N-N).

  • [major] docs/options.md:196 — "A range or an operator returns every expiration within the bounds, inclusive" asserts inclusivity for < and >, which this repository's own documentation of the same syntax contradicts (src/marketdata/input_types/filters.py:4 — 250-260 an inclusive range, <250 a one-sided bound; below() is "strictly below"), and which the passing live test test_dte_below_excludes_the_boundary contradicts too. Reword to the repo's own grammar: a closed range is inclusive, >=/<=/>/< are one-sided bounds as documented for strike and delta. The identical sentence in the days_to_expiration field description (src/marketdata/input_types/options.py:38) needs the same correction.
  • [major] src/tests/integration/test_options_live.py:160 — The closed-range form is covered only as N-N, whose result is identical to what a single dte=N returns, so the test passes even if the server parsed the range as a single nearest value and proves nothing about "every expiration whose dte falls within the bounds". Add a live test with a range spanning several expirations, with both bounds taken from dte values of its own single-value baseline calls, asserting every returned dte lies within [low, high], that both bound dtes are present, and that more than one distinct expiration came back.
  • [minor · question for a person] src/tests/integration/test_options_live.py:189 — The API's description says a comparison operator returns expirations "within the bounds, inclusive", yet the live run shows dte=<N excluding N (this test asserts the exclusion and passed). Request: GET /v1/options/chain/AAPL/?dte=<N; documentation: "a comparison operator (>=30, <45) returns every expiration whose dte falls within the bounds, inclusive"; response: no row with dte == N. The "syntax matches strike and delta" sentence implies the exclusion, so this needs confirming with the API team rather than fixing here.
  • [minor] src/tests/test_chain_filters.py:545 — The single-value form — the one the parameter already had — is only sent as int (30); no wire test passes it in the newly accepted str type (days_to_expiration="30"). Add that row to the parametrization.
  • [minor] docs/options.md:199 — The documentation transcribes the API's description but drops its stated cap ("at most 36500" days). Add it to the docs entry and the field description so the documented accepted range is complete.
  • [minor] src/tests/integration/test_options_live.py:120 — live_chain_dte_nearest is module-scoped and its dte[0] is reused as the boundary in three later live calls; a run that crosses midnight US/Eastern shifts the API's dte by one and the N-N, >=N and <N assertions then fail. Derive the boundary inside each test from its own dte=90 call, or compare expirations rather than dte values.

4. review fix 1

Findings sent back to the coder:

  • [major] docs/options.md:196 — "A range or an operator returns every expiration within the bounds, inclusive" asserts inclusivity for < and >, which this repository's own documentation of the same syntax contradicts (src/marketdata/input_types/filters.py:4 — 250-260 an inclusive range, <250 a one-sided bound; below() is "strictly below"), and which the passing live test test_dte_below_excludes_the_boundary contradicts too. Reword to the repo's own grammar: a closed range is inclusive, >=/<=/>/< are one-sided bounds as documented for strike and delta. The identical sentence in the days_to_expiration field description (src/marketdata/input_types/options.py:38) needs the same correction.
  • [major] src/tests/integration/test_options_live.py:160 — The closed-range form is covered only as N-N, whose result is identical to what a single dte=N returns, so the test passes even if the server parsed the range as a single nearest value and proves nothing about "every expiration whose dte falls within the bounds". Add a live test with a range spanning several expirations, with both bounds taken from dte values of its own single-value baseline calls, asserting every returned dte lies within [low, high], that both bound dtes are present, and that more than one distinct expiration came back.

Minor findings sent along, as optional:

  • [minor] src/tests/test_chain_filters.py:545 — The single-value form — the one the parameter already had — is only sent as int (30); no wire test passes it in the newly accepted str type (days_to_expiration="30"). Add that row to the parametrization.
  • [minor] docs/options.md:199 — The documentation transcribes the API's description but drops its stated cap ("at most 36500" days). Add it to the docs entry and the field description so the documented accepted range is complete.
  • [minor] src/tests/integration/test_options_live.py:120 — live_chain_dte_nearest is module-scoped and its dte[0] is reused as the boundary in three later live calls; a run that crosses midnight US/Eastern shifts the API's dte by one and the N-N, >=N and <N assertions then fail. Derive the boundary inside each test from its own dte=90 call, or compare expirations rather than dte values.

Questions for a person, shown to the coder and not for it to resolve:

  • [minor · question for a person] src/tests/integration/test_options_live.py:189 — The API's description says a comparison operator returns expirations "within the bounds, inclusive", yet the live run shows dte=<N excluding N (this test asserts the exclusion and passed). Request: GET /v1/options/chain/AAPL/?dte=<N; documentation: "a comparison operator (>=30, <45) returns every expiration whose dte falls within the bounds, inclusive"; response: no row with dte == N. The "syntax matches strike and delta" sentence implies the exclusion, so this needs confirming with the API team rather than fixing here.

Coder (20 turns, US$ 0.74, 3 min 20 s):

pytest: 2188 passed, 100% coverage. ruff check_ruff_version.py, ruff check, ruff format --check: all green. pyright on build/sdk-sync-compat/probe.py: 0 errors.

Fixed the two major findings: reworded the days_to_expiration description in docs/options.md and src/marketdata/input_types/options.py to the repo's own grammar — a closed range is inclusive, >=/<=/>/< are a one-sided bound, dropping the false claim that operators are inclusive — and added test_dte_closed_range_spans_every_expiration_within_its_bounds to test_options_live.py, which builds its range from two independent single-value baseline calls (dte=15, dte=45) and asserts every returned dte is within [low, high], both bounds are present, and more than one expiration came back, so a server that only matched the nearest value can no longer pass it.
Resolved both actionable minor notes: added a days_to_expiration="30" (str) row to the wire-test parametrization in test_chain_filters.py, and added the "at most 36500" cap to both the field description and docs/options.md.
Resolved the flakiness note by making live_chain_dte_nearest function-scoped instead of module-scoped, so each of the boundary tests (single-value, collapsed range, >=, <) derives its own boundary from its own fresh dte=90 call instead of reusing one call's value across several later live calls.
Left the question-for-a-person finding (the API's own description implying <N should be inclusive, contradicted by the live run) untouched, as instructed — no code or doc changed for it.
Reran uv run --frozen pytest -n 4 -p no:cacheprovider --junitxml=build/test-results/pytest.xml (2188 passed, 100% coverage) and the ruff version/check/format commands (all green) after every change.

The pipeline:

  • the coder wrote build/sdk-sync-compat/probe.py, the compatibility probe; removed, the pipeline checks its own copy

Gates:

  • tests, attempt 1: passed (28 s)
  • build, attempt 1: passed (0 s)
  • compatibility probe, attempt 1: passed (2 s)
  • live API suite, attempt 1: passed (15 s) — uv run --frozen pytest -m integration -p no:cacheprovider --junitxml=build/test-results/live.xml src/tests/integration/test_options_live.py

5. review 2

Reviewer (4 turns, US$ 0.66, 48 s): approved

Both blocking findings are fixed: the docs and field description now use the repository's own grammar for the same syntax ("inclusive range", "one-sided bound") instead of asserting inclusivity for </>, and the new closed-range live test derives both bounds from its own single-value dte baselines and asserts every row lies within them, both ends present, and more than one distinct expiration — so it cannot pass with the range ignored. The optional minors (str wire row, 36500 cap, function-scoped fixture) were also taken up, and nothing the fix touched weakens an existing test.

  • no findings

6. security

Security (4 turns, US$ 0.31, 26 s): approved

The change widens the days_to_expiration/dte query parameter from int to int | str, passing the string through unchanged to the existing request path that already handles string filter values (strike, delta) safely via httpx's query-param encoding. No new dependencies, credentials, logging, file handling, or deserialization paths are introduced, and the added tests only exercise the existing mocked/live HTTP client. No security issues found.

  • no findings

7. assess

Analyst (5 turns, US$ 0.15, 19 s) — public surface:

The only public-surface change is OptionsChainInput.days_to_expiration (the days_to_expiration keyword on client.options.chain), whose annotation widens from int | None to int | str | None to carry the API's new comma-list, closed-range and comparison-operator expressions alongside the existing single integer. No parameter was renamed, reordered or made required, no default changed, and no other model, method or exception type was touched.

  • added: client.options.chain(days_to_expiration) — OptionsChainInput.days_to_expiration widened from int | None to int | str | None; every existing call such as client.options.chain("AAPL", days_to_expiration=30) still type-checks and behaves the same, and callers gain the ability to pass the API's comma-list, range and comparison-operator expressions as a string.

Computed by the pipeline: minor; changelog entry written

8. changelog

Coder (5 turns, US$ 0.09, 52 s):

Edited CHANGELOG.md only; no commands run (edit successful).

Added changelog entry documenting that OptionsChainInput.days_to_expiration now accepts str for the API's expression syntax (comma-list, closed range, comparison operators), matching the forms of strike and delta (API release 2.0.0), with backward compatibility for int values.

Gates:

  • build, attempt 1: passed (0 s)

Questions for a person

The internal reviewers raised these for a person to answer. They did not block the change, and the coder was not asked to resolve them.

  • src/tests/integration/test_options_live.py:189 — The API's description says a comparison operator returns expirations "within the bounds, inclusive", yet the live run shows dte=<N excluding N (this test asserts the exclusion and passed). Request: GET /v1/options/chain/AAPL/?dte=<N; documentation: "a comparison operator (>=30, <45) returns every expiration whose dte falls within the bounds, inclusive"; response: no row with dte == N. The "syntax matches strike and delta" sentence implies the exclusion, so this needs confirming with the API team rather than fixing here.

Totals

  • Bump: minor
  • Coder runs: 4
  • Review runs: 3
  • Gates run: 11 (1 failed)
  • Files changed by the agent: 5
  • Turns: 106
  • Tokens: 8,942,129
  • Estimated cost: US$ 5.17
  • Time: 22 min 13 s (agents 19 min 42 s, gates 2 min 00 s)

Agent runs

  • coder · claude-haiku-4-5-20251001, claude-sonnet-5 · 1,626,107 tokens (98,643 in, 1,496,389 cached, 31,075 out) · 30 turns · US$ 1.01 · 6 min 18 s
  • coder · claude-sonnet-5 · 3,461,853 tokens (33,316 in, 3,415,619 cached, 12,918 out) · 28 turns · US$ 0.95 · 4 min 50 s
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 490,472 tokens (71,093 in, 406,845 cached, 12,534 out) · 10 turns · US$ 1.26 · 2 min 49 s
  • coder · claude-sonnet-5 · 2,841,158 tokens (19,431 in, 2,811,916 cached, 9,811 out) · 20 turns · US$ 0.74 · 3 min 20 s
  • reviewer · claude-haiku-4-5-20251001, claude-opus-5 · 122,525 tokens (50,735 in, 68,466 cached, 3,324 out) · 4 turns · US$ 0.66 · 48 s
  • security · claude-haiku-4-5-20251001, claude-sonnet-5 · 189,740 tokens (56,581 in, 131,259 cached, 1,900 out) · 4 turns · US$ 0.31 · 26 s
  • analyst · claude-haiku-4-5-20251001, claude-sonnet-5 · 93,339 tokens (27,639 in, 64,418 cached, 1,282 out) · 5 turns · US$ 0.15 · 19 s
  • changelog · claude-haiku-4-5-20251001 · 116,935 tokens (26,281 in, 85,975 cached, 4,679 out) · 5 turns · US$ 0.09 · 52 s

@codecov

codecov Bot commented Oct 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (6a54e86) to head (b4054b7).

Additional details and impacted files
@@            Coverage Diff            @@
##              main      #176   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           62        62           
  Lines         3297      3297           
=========================================
  Hits          3297      3297           
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@marketdata-code-review

Copy link
Copy Markdown

✅ Ready — Code review

Version impact: minor. OptionsChainInput.days_to_expiration changes from int | None to int | str | None, widening the accepted type without changing its default or existing calls; wire tests cover every output format and live tests cover the new expression forms.

Rating patch 6/6 (exemplary) · proof 6/6 (comprehensive) · overall 6/6


Reviewed b4054b7 · revision 1 · codex (gpt-5.6-sol) · claude unavailable · rules: default, sdk

@marketdata-sdk-sync marketdata-sdk-sync Bot removed the sdk-sync: in progress sdk-sync is still working on this PR: CI, code review, fixes label Oct 30, 2026

This branch has not been deployed

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

Labels

minor adds to the SDK's public surface and breaks nothing review: ready

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants