Review-only / approval gate
No implementation, PR merge, package publication or production mutation until the owner approves the full sprint plan.
Evidence
Reviewed main 68795010c4c83b02ae5972959c8bd2321691aebf.
src/Client.php historical/demoPrices use Price::fromArray without latestPriceOrFail validation. src/Price.php defaults absent code to empty string, price to 0.0, currency to USD. Mock successful historical response data.prices=[{}] returns a Price with code='',price=0,currency='USD'; a missing/non-array prices field becomes an empty successful list.
Preferred smallest change
Use one minimal validated price-row boundary across latest/history/demo. Distinguish a legitimately empty list from a malformed envelope. Preserve legitimately zero numeric prices; do not use truthiness or invent defaults for missing required market data.
Acceptance / negative-path tests
Fixtures: absent/non-array prices, empty list, null/missing/non-numeric/zero/negative values according to contract, missing code/currency, malformed timestamps. Latest/history/demo agree and surface ApiException rather than misleading data.
Risk and PR gate
P1 data correctness; response-only isolated fix, Sunday eligible if no API schema change.
One focused issue PR; independent adversarial review must challenge deletion safety, public compatibility, failure recovery and whether a smaller deletion suffices. Include red/green test evidence and packed/installable artifact proof for any published SDK/MCP change. Merge only in the approved priority order after reviewer objections are resolved. Do not publish a breaking change as a patch. If already fixed at execution time, record evidence and skip without a cosmetic PR.
Review-only / approval gate
No implementation, PR merge, package publication or production mutation until the owner approves the full sprint plan.
Evidence
Reviewed main
68795010c4c83b02ae5972959c8bd2321691aebf.src/Client.php historical/demoPrices use Price::fromArray without latestPriceOrFail validation. src/Price.php defaults absent code to empty string, price to 0.0, currency to USD. Mock successful historical response data.prices=[{}] returns a Price with code='',price=0,currency='USD'; a missing/non-array prices field becomes an empty successful list.
Preferred smallest change
Use one minimal validated price-row boundary across latest/history/demo. Distinguish a legitimately empty list from a malformed envelope. Preserve legitimately zero numeric prices; do not use truthiness or invent defaults for missing required market data.
Acceptance / negative-path tests
Fixtures: absent/non-array prices, empty list, null/missing/non-numeric/zero/negative values according to contract, missing code/currency, malformed timestamps. Latest/history/demo agree and surface ApiException rather than misleading data.
Risk and PR gate
P1 data correctness; response-only isolated fix, Sunday eligible if no API schema change.
One focused issue PR; independent adversarial review must challenge deletion safety, public compatibility, failure recovery and whether a smaller deletion suffices. Include red/green test evidence and packed/installable artifact proof for any published SDK/MCP change. Merge only in the approved priority order after reviewer objections are resolved. Do not publish a breaking change as a patch. If already fixed at execution time, record evidence and skip without a cosmetic PR.