Repository navigation
sdk-sync: API 2.0.0+ffb34b7 → sdk-java 1.1.0 (minor) - #84
marketdata-sdk-sync[bot] wants to merge 2 commits into
Conversation
tests: Build fails as expected — the 10 new tests reference `ExpirationFilter.dteList`, `dteRange`, `dteComparison`, and `Operator`, none of which exist yet (phase 2 implements them). Added all 10 planned tests to `OptionsResourceTest.java`: 3 wire cases (comma list, range, comparison), 1 regression (`dte(int)` unchanged), 1 parity (sync honors `dteRange`), and 5 validation cases (empty list, negative values, min>max) — exactly per the plan, no production code touched. implement: Both `test` and `build` pass, including Spotless and JaCoCo's 100% coverage gate. Added `ExpirationFilter.dteList(List<Integer>)`, `dteRange(int,int)`, and `dteComparison(Operator,int)` (new `Operator` enum GT/GTE/LT/LTE) as new sealed-permitted variants rendering `?dte=15,30,45`, `?dte=0-45`, and `?dte=>=30` respectively — the list/range/comparison forms the API's `dte` delta adds. The existing `dte(int)` single-value factory and its wire form are untouched (binary-compatible, no new error paths on it). Updated `docs/options/chain.md` to document the new factories and add a usage example; all 10 planned tests pass unmodified. review fix 1: Both pass, including Spotless (which reformatted automatically) and the JaCoCo coverage gate. Finding resolved: Converted `chainExpirationFilterDteComparisonTranslatesToOperatorPrefix` into a `@ParameterizedTest` with a `@MethodSource` supplying all four `ExpirationFilter.Operator` constants (`GT`→`%3E`, `GTE`→`%3E%3D`, `LT`→`%3C`, `LTE`→`%3C%3D`), each asserted against its own rendered URI. Every operator's `wireValue()` is now exercised on the wire, so a transposed prefix would fail the test. No production code changed; `gradle test` and `gradle build` both pass. changelog: Added changelog entry documenting three new `ExpirationFilter` variants (`dteList`, `dteRange`, `dteComparison`) and the `Operator` enum for API 2.0.0 compatibility.
🧾 Job log — sdk-syncsdk-auto-sync job log
Changes in the API surface1. test planCoder (23 turns, US$ 0.77) — test plan, 10 case(s) (wire 3, regression 1, validation 5, parity 1):
Plan reviewer (15 turns, US$ 1.02): approved
2. testsCoder (5 turns, US$ 0.50):
Gates:
3. implementCoder (22 turns, US$ 0.63):
Gates:
4. review 1Reviewer (11 turns, US$ 1.14): 2 blocking finding(s)
Security (2 turns, US$ 0.34): approved
5. review fix 1Findings sent back to the coder:
Coder (10 turns, US$ 0.32):
Gates:
6. review 2Reviewer (16 turns, US$ 1.43): 1 blocking finding(s)
Security (4 turns, US$ 0.33): approved
7. assessAnalyst (3 turns, US$ 0.09) — public surface:
Computed by the pipeline: minor, 1.0.0 → 1.1.0; changelog entry written 8. changelogCoder (5 turns, US$ 0.07):
Gates:
Findings outside the agent's limitsReported to the PR, not sent to the coder: it may not write these files.
Totals
Agent runs
Code review fix 1 — 2026-10-02 12:47:16ZOutcome: done 1. code review fix 1The code review asked for changes:
Coder (39 turns, US$ 0.95):
Gates:
2. review 1Reviewer (13 turns, US$ 1.31): 1 blocking finding(s)
Security (6 turns, US$ 0.44): 1 blocking finding(s)
Code review fix 2 — 2026-10-02 13:07:26ZOutcome: failed — the agent changed no files 1. code review fix 2Coder (8 turns, US$ 0.22):
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #84 +/- ##
============================================
+ Coverage 98.27% 98.30% +0.02%
- Complexity 1043 1052 +9
============================================
Files 123 123
Lines 2606 2649 +43
Branches 301 309 +8
============================================
+ Hits 2561 2604 +43
Partials 45 45
Continue to review full report in Codecov by Harness.
🚀 New features to boost your workflow:
|
🟡 Needs changes — Code reviewAdds three additive DTE filter variants and wires them into option-chain requests, with unit tests and documentation updates. Version impact: minor (1.0.0 -> 1.1.0). Rating patch 4/6 (works with reservations) · proof 3/6 (partial) · overall 3/6 Before merge
FindingsShould fix
Since last review
Reviewed |
code review fix 1: Summary of fixes, finding by finding: 1. Records bypass factory validation — moved all invariant checks (non-null/non-empty/non-negative/max, defensive `List.copyOf`, min≤max, null-operator) into compact constructors of `DteList`, `DteRange`, and `DteComparison`; the `dteList`/`dteRange`/`dteComparison` factories now just delegate (`return new DteX(...)`). Added `src/test/java/com/marketdata/sdk/options/ExpirationFilterTest.java` exercising the canonical constructors directly (bypassing the factories), including a defensive-copy test matching the repo's `RequestHeadersTest` pattern. 2. DTE maximum not enforced/documented — `validateDte` now rejects values above 36500; added test cases for `dteList`/`dteRange`/`dteComparison` hitting the new bound; documented the 36500 cap and the dte/`from`-`to` mutual-exclusivity (already compiler-enforced by the sealed type) in each factory's Javadoc and in `docs/options/chain.md`. 3. Missing live integration test — left untouched: `src/integrationTest/java/` is outside my write limits (`src/main/java/`, `src/test/java/`, `docs/`); this needs a maintainer, as the earlier review round already noted. 4. Reachable null branch excluded from coverage — removed the `@Generated` annotation (and the now-unused `Generated` import) since the null-operator check is reachable both via the public factory and via the record's public canonical constructor; added tests for both paths (`expirationFilterDteComparisonRejectsNullOperator` in `OptionsResourceTest`, `dteComparisonCanonicalConstructorRejectsNullOperator` in the new test file). `gradle test` and `gradle build` (including Spotless and the 100% JaCoCo gate) both pass. `CHANGELOG.md` left unchanged — no caller-visible behaviour changed.
🙋 Needs a person — sdk-syncWhy: Code review fix 2 failed: the agent changed no files · failures/2026-10-02T13-07-26Z_sdk-java_2.0.0_review.md Pending findings
Code-review fix rounds used: 2 of 2 · CI repairs used: 0 of 2 What to do
This pull request is back to draft and labelled |
|
Closed to rerun the sdk-sync pipeline from scratch for API 2.0.0 (live-API tests, PR description, findings out of reach). |
Generated by sdk-auto-sync for API release 2.0.0 (commit
ffb34b7).Changes in the API surface
Snapshots
ae2b047c8f6f→c2a31e277345:What the agent did
tests: Build fails as expected — the 10 new tests reference
ExpirationFilter.dteList,dteRange,dteComparison, andOperator, none of which exist yet (phase 2 implements them).Added all 10 planned tests to
OptionsResourceTest.java: 3 wire cases (comma list, range, comparison), 1 regression (dte(int)unchanged), 1 parity (sync honorsdteRange), and 5 validation cases (empty list, negative values, min>max) — exactly per the plan, no production code touched.implement: Both
testandbuildpass, including Spotless and JaCoCo's 100% coverage gate.Added
ExpirationFilter.dteList(List<Integer>),dteRange(int,int), anddteComparison(Operator,int)(newOperatorenum GT/GTE/LT/LTE) as new sealed-permitted variants rendering?dte=15,30,45,?dte=0-45, and?dte=>=30respectively — the list/range/comparison forms the API'sdtedelta adds. The existingdte(int)single-value factory and its wire form are untouched (binary-compatible, no new error paths on it). Updateddocs/options/chain.mdto document the new factories and add a usage example; all 10 planned tests pass unmodified.review fix 1: Both pass, including Spotless (which reformatted automatically) and the JaCoCo coverage gate.
Finding resolved: Converted
chainExpirationFilterDteComparisonTranslatesToOperatorPrefixinto a@ParameterizedTestwith a@MethodSourcesupplying all fourExpirationFilter.Operatorconstants (GT→%3E,GTE→%3E%3D,LT→%3C,LTE→%3C%3D), each asserted against its own rendered URI. Every operator'swireValue()is now exercised on the wire, so a transposed prefix would fail the test. No production code changed;gradle testandgradle buildboth pass.changelog: Added changelog entry documenting three new
ExpirationFiltervariants (dteList,dteRange,dteComparison) and theOperatorenum for API 2.0.0 compatibility.Files
CHANGELOG.mddocs/options/chain.mdsrc/main/java/com/marketdata/sdk/OptionsResource.javasrc/main/java/com/marketdata/sdk/options/ExpirationFilter.javasrc/test/java/com/marketdata/sdk/OptionsResourceTest.javaVersion
Public-surface change computed by the pipeline: minor — next version 1.1.0 (from 1.0.0).
ExpirationFilter.dteList(List)ExpirationFilter.dteRange(int, int)ExpirationFilter.dteComparison(Operator, int)ExpirationFilter.DteListExpirationFilter.DteRangeExpirationFilter.DteComparisonExpirationFilter.OperatorExpirationFilter.Operator.GTExpirationFilter.Operator.GTEExpirationFilter.Operator.LTExpirationFilter.Operator.LTEExpirationFilter.Operator.wireValue()Test plan
10 case(s) (wire 3, regression 1, validation 5, parity 1)
chainExpirationFilterDteListTranslatesToCommaSeparatedchainExpirationFilterDteRangeTranslatesToDashedRangechainExpirationFilterDteComparisonTranslatesToOperatorPrefixchainExpirationFilterDteSingleValueStillWorksAfterRangeSupportchainSyncHonorsDteRangeFilterexpirationFilterDteListRejectsEmptyListexpirationFilterDteListRejectsNegativeValueexpirationFilterDteRangeRejectsMinGreaterThanMaxexpirationFilterDteRangeRejectsNegativeMinexpirationFilterDteComparisonRejectsNegativeValueReviewer notes
dteas at most 36500;dteList,dteRangeanddteComparisonvalidate only non-negativity, so an out-of-range value is caught server-side instead of at construction, and neither the javadoc nordocs/options/chain.mdmentions the cap or the "should not be used together with from and to" constraint. Add the upper-bound check alongsidevalidateDteand state both limits in the doc comment and the chain page.ExpirationFilter.OperatorduplicatesStrikeFilter.Operatorverbatim (same four constants, samewireValue()), adding a second public enum for one wire concept the API describes as shared syntax. Consider extracting one public comparison-operator type incom.marketdata.sdk.optionsand having both filters reference it, rather than growing a third copy whendeltagains the same syntax.dtewire forms (0-45,15,30,45,>=30) are only proven against a canned client; nothing verifies the live API accepts the syntax the SDK now emits. The repo's own precedent ischainExpirationAllSpansMultipleExpirations, a live test added for exactly one distinguishing filter form. Add at least one integration test callingchain()withExpirationFilter.dteRange(...)(and ideally a comparison) that asserts non-empty decoded rows whosedte()falls in the requested bounds. — outside the agent's limits, for a personJob 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.
5 coder run(s) · 5 review(s) · 116 turns · 7,549,723 tokens · US$ 6.63 · item
5c097984-5f7b-401b-abba-235a3f417767Agent runs