## Pre-compact backup [2026-07-08 15:22]

### Key decisions
- Rust `right` field value changed from `"Call"/"Put"` → `"CALL"/"PUT"` to match Python wire format
- Rust sends JSON; Python sends protobuf (but other JSON endpoints work fine)
- `OptionContractItem.strike` is String in Rust (`"310.000"`), but Python sends a number (`310.0`)

### Current state
- **Active unresolved bug**: `GetOptionQuote` returns `latestPrice=0.0000` in Rust, Python returns `11.08` for same contract (AAPL C310 exp=2026-08-07)
- Rust request JSON confirmed via eprintln: `{"option_basic":[{"symbol":"AAPL","expiry":1786075200000,"right":"CALL","strike":"310.000"}]}`
- All 267 unit tests pass

### Don't lose
- **Critical Python SDK bug found**: `quote_client.py` sets `params.option_basic = [param]` (no 's'), but `OptionContractsParams.to_openapi_dict()` reads `self.option_basics` (with 's') — so the array never gets serialized. This means Python may be sending a completely different request structure than expected.
- **Next step**: Read `get_option_briefs` in Python SDK to see what it actually sends at wire level — the `option_basic` nesting vs flat fields question is unresolved.
- Branch: `feat/option-request-structs`, key files: `src/model/quote_requests.rs`, `src/quote/mod.rs`, `src/quote/tests.rs`
