{"schemaVersion":2,"feedRevision":6,"lastUpdated":"2026-08-19T13:10:08Z","semantics":{"publishedAt":"The first time this correction id became visible in the public feed. It does not change after publication.","updatedAt":"The most recent mutation of this correction record, including status, deployment identity, affected scope, or validation.","deployedAt":"When the deployment currently identified by the record became effective. It may change while work is in progress; once status is deployed, a different deployment is published as a new correction id.","changeDetection":"Poll top-level lastUpdated. When it changes, compare correction ids and updatedAt values; do not watch only for new ids.","recollection":"For a deployed correction, use deployment.deployedAt together with affected and recommendedRecollection to delimit or invalidate collected batches.","unpublishedDeployments":"The feed cannot signal a correction before its record is published. A delayed record is published with its actual effective deployedAt so clients can invalidate intersecting batches retroactively."},"corrections":[{"id":"HIST-2026-08-19-V1-IV-BID-ASK-VALIDATION","status":"deployed","publishedAt":"2026-08-19T13:10:08Z","updatedAt":"2026-08-19T13:10:08Z","summary":"Excluded unavailable, non-positive, extreme, and bid-above-ask source quotes before v1 IV smile interpolation.","cause":"Legacy source history can encode an unavailable bid or ask as -100 or another non-positive value. The interpolation query previously admitted those sentinels and did not enforce bid IV less than or equal to ask IV, allowing invalid source quotes to become normal-looking interpolated values.","deployment":{"deployedAt":"2026-08-19T11:17:53Z","gitCommit":"9f5f0dadb9765c13eaec9f745e969a42ee58febc","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/32246722337"},"affected":[{"apiVersion":"v1","endpoints":["/historical/options/type/iv_bid_ask/:market/:currency/:type"],"fields":["{tenor}.b","{tenor}.a","{tenor}.m"],"historicalWindow":"Every closed window whose selected interpolation inputs contained a non-positive, non-finite, above-10,000-percent, or bid-above-ask IV quote."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect every v1 iv_bid_ask history used. Treat -100 in a frozen legacy capture as an unavailable-quote sentinel, not as a volatility observation; current publication excludes it before interpolation.","validation":["The serving query now requires finite positive bid, ask, and mark IV at or below 10,000 percent and requires bid IV to be less than or equal to ask IV before selecting and interpolating source observations.","Focused query regression tests assert rejection of sentinel, extreme, and inverted source quotes.","The public field contract defines b as interpolated bid IV, a as interpolated ask IV, and m as independently interpolated exchange mark IV; m is not a bid/ask midpoint and may lie outside the b-to-a interval."]},{"id":"HIST-2026-08-19-V2-TICKER-DETERMINISM","status":"deployed","publishedAt":"2026-08-19T11:58:49Z","updatedAt":"2026-08-19T11:58:49Z","summary":"Made futures and perpetuals ticker-history selection deterministic without an unbounded final-merge read.","cause":"The minute source is a versioned ReplacingMergeTree. Reading unmerged duplicate versions without an explicit winner could vary, while forcing FINAL over the high-volume table exceeded the request timeout. The serving query now selects by source minute, replacement version, producer sequence, and a deterministic final tie-break.","deployment":{"deployedAt":"2026-08-19T11:47:12Z","gitCommit":"6ff0c1289a2bea8e5920a422a1878a398562f76e","workflowRun":"https://github.com/Laevitas/lvt-api-v2/actions/runs/32248979880"},"affected":[{"apiVersion":"v2","endpoints":["/api/v1/futures/ticker-history","/api/v1/perpetuals/ticker-history"],"fields":["days_to_expiry","mark_price_close","index_price_close","bid_price_close","ask_price_close","ask_size_close","bid_size_close","next_funding_time","bid_ask_spread_close","oi_close","funding_rate_close","volume_usd_24h"],"historicalWindow":"Every retained closed ticker-history window containing duplicate source-minute versions."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect retained futures and perpetuals ticker-history windows previously used. The correction selects one canonical source version at request time and does not rewrite persisted minute rows.","validation":["The complete production E2E matrix passed, including futures and perpetuals ticker-history pagination, before the image was deployed.","Eight identical public perpetuals ticker-history requests over a closed Binance BTCUSDT window returned HTTP 200, 73 rows, one response-body SHA-256, and one ETag; observed request latency was 0.904 to 3.800 seconds.","The customer reproduction kit completed all eight checks after deployment with every prior defect reported as NOT REPRODUCED and zero HTTP 429 responses."]},{"id":"HIST-2026-08-19-V1-GAMMA-GEX-ACTIVITY-FOLLOWUP","status":"deployed","publishedAt":"2026-08-19T11:58:49Z","updatedAt":"2026-08-19T11:58:49Z","summary":"Corrected gamma-band skew scaling and recovered valid history, made GEX averages finite-aware, bounded global-activity pagination work, and rejected negative open-interest source rows.","cause":"Gamma-band skew was applied in volatility-point units directly to price instead of being converted through the estimated delivery price and daily volatility scale. GEX averaged null replacements instead of only finite inputs, global-activity pages built and grouped the full requested range before applying pagination, and total-OI aggregation admitted invalid negative source observations.","deployment":{"deployedAt":"2026-08-19T11:17:53Z","gitCommit":"9f5f0dadb9765c13eaec9f745e969a42ee58febc","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/32246722337"},"affected":[{"apiVersion":"v1","endpoints":["/historical/options/type/gamma_bands/:market/:currency/:tenor"],"fields":["l1_4","l1_2","l1","l2","u1_4","u1_2","u1","u2","vwap","price"],"historicalWindow":"Every closed gamma-band window served before the deployment."},{"apiVersion":"v1","endpoints":["/historical/options/gex_index/:market/:currency"],"fields":["gex","vex","gex_plus","index_price"],"historicalWindow":"Every closed GEX window containing non-finite or missing index-price inputs."},{"apiVersion":"v1","endpoints":["/historical/futures/oi_total_global_activity","/historical/futures/volume_total_global_activity"],"fields":["future","perpetual","option","items","meta.total"],"historicalWindow":"Every requested page, including the reported 2025 and older historical windows."},{"apiVersion":"v1","endpoints":["/historical/futures/total_oi_by_exchange/:currency/:option"],"fields":["Per-exchange open interest and notional fields"],"historicalWindow":"Historical rows containing a negative open-interest or notional source value."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect all gamma-band history used, retry GEX and global-activity windows that failed or were incomplete, and re-collect total-OI-by-exchange windows that contained negative values. These corrections are applied by the serving queries.","validation":["Across the customer's 35 gamma-band coordinates, 4,990 of 5,040 input timestamps now publish valid rows; all five reported DERIBIT XRP/TRX coordinates return 144 of 144 rows. The remaining 50 rows fail the documented bracketing predicate rather than disappearing because of the former scaling defect.","The patched DERIBIT/BTC 2020 GEX query returns rows while excluding non-finite index-price values from the average.","The global-activity query is page-bounded before aggregation and completed a production dry benchmark in approximately 0.34 seconds.","Gateway validation passed 18 focused tests, TypeScript compilation, and three Coinbase recovery tests before production deployment."]},{"id":"HIST-2026-08-19-V1-COINBASE-SPOT-PRE-MAY","status":"deployed","publishedAt":"2026-08-19T11:58:49Z","updatedAt":"2026-08-19T11:58:49Z","summary":"Filled the remaining Coinbase XRP, ADA, and XLM v1 spot-history gaps immediately before the May 8 restoration boundary.","cause":"The first Coinbase recovery began at the common 2026-05-08 publication-stop boundary. Three symbols also had earlier symbol-specific gaps, so following the original recollection recommendation left those ranges incomplete.","deployment":{"deployedAt":"2026-08-19T10:41:37Z","gitCommit":"9f5f0dadb9765c13eaec9f745e969a42ee58febc","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/32246722337"},"affected":[{"apiVersion":"v1","endpoints":["/historical/spot/COINBASE/XRP-USDT/:period","/historical/spot/COINBASE/ADA-USDT/:period","/historical/spot/COINBASE/XLM-USDT/:period"],"fields":["date","open","high","low","close","volume_base","volume_quote"],"historicalWindow":"XRP: 2026-05-03 through 2026-05-07; ADA: 2026-03-07 through 2026-05-07; XLM: 2026-01-18 through 2026-05-07. Coarser periods are derived from the restored one-minute rows."}],"changesClosedWindowResponsesWithoutBackfill":false,"recommendedRecollection":"Re-collect XRP-USDT from 2026-05-03, ADA-USDT from 2026-03-07, and XLM-USDT from 2026-01-18 through the existing Coinbase restoration range.","validation":["Inserted 256 XRP-USDT, 6,617 ADA-USDT, and 4,560 XLM-USDT one-minute rows; both production ClickHouse replicas reported matching inventories.","Public v1 daily requests returned complete expected coverage: XRP 46 of 46 days, ADA 143 of 143 days, and XLM 143 of 143 days for the customer-reported windows.","A production inventory was generated for all 951 stored Coinbase symbols, including first date, latest date, and internal gap ranges."]},{"id":"HIST-2026-08-14-V1-COINBASE-SPOT-HISTORY","status":"deployed","publishedAt":"2026-08-16T13:26:01Z","updatedAt":"2026-08-16T13:26:01Z","summary":"Restored Coinbase v1 spot history after the May 8 coverage stop and resumed current publication.","cause":"The legacy Coinbase spot publication stopped advancing while Coinbase remained available in the v2 source. The v1 persisted history was rebuilt from the authoritative Coinbase candle source and current publication was restored.","deployment":{"deployedAt":"2026-08-14T07:03:00Z","gitCommit":"d4ad96599d542edd5573c5442d642ba527b9a1ba","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/31740464153"},"affected":[{"apiVersion":"v1","endpoints":["/historical/spot/COINBASE/:symbol/:period"],"fields":["date","open","high","low","close","volume_base","volume_quote"],"historicalWindow":"Coinbase one-minute spot history after the prior publication stop on 2026-05-08 through the restoration cutover; coarser periods are derived from the restored one-minute rows."}],"changesClosedWindowResponsesWithoutBackfill":false,"recommendedRecollection":"Re-collect Coinbase v1 spot history from 2026-05-08 onward for every symbol and period used. Requests made while the route was frozen may have returned an incomplete closed window.","validation":["The restoration ran from 2026-08-13 21:38:00 UTC through 2026-08-14 07:03:00 UTC in 4,390 completed insert batches with zero failed batches and 12,782,346 written rows.","The production v1 Coinbase one-minute inventory contains 120,736,641 rows across 951 stored symbols, including 12,868,398 rows after 2026-05-08; the observed range is 2023-10-02 through current ingestion.","Public v1 Coinbase requests return post-May history, and a matching v2 Coinbase control also returns post-May data."]},{"id":"HIST-2026-08-13-V1-HISTORY-FOLLOWUP","status":"deployed","publishedAt":"2026-08-16T13:26:01Z","updatedAt":"2026-08-16T13:26:01Z","summary":"Made affected v1 futures/options aggregates deterministic, made gamma bands tenor-aware, restored two futures global-activity routes, and enabled the v1 Hyperliquid liquidation selector.","cause":"Gamma bands used request-time aggregate states without a stable Decimal accumulation order and did not consistently apply the tenor segment; two global-activity routes used invalid legacy query projections; and the v1 liquidation exchange validator omitted Hyperliquid.","deployment":{"deployedAt":"2026-08-13T20:24:58Z","gitCommit":"d4ad96599d542edd5573c5442d642ba527b9a1ba","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/31740464153"},"affected":[{"apiVersion":"v1","endpoints":["/historical/futures/alt_summary/:currency","/historical/futures/total_oi/:currency","/historical/futures/total_volume/:currency","/historical/futures/total_oi_by_margin/:currency","/historical/futures/total_volume_by_margin/:currency","/historical/futures/oi_weighted_funding/:currency","/historical/futures/oi_weighted_volume_funding/:currency","/historical/futures/perpetual_funding_exchange/:currency/:option","/historical/options/volume_total/:market/:currency","/historical/options/oi_total/:market/:currency","/historical/options/oi_pc_ratio/:market/:currency","/historical/options/volume_pc_ratio/:market/:currency","/historical/options/total/volume_by_currency/:currency","/historical/options/gex_index/:market/:currency","/historical/options/type/gamma_bands/:market/:currency/:tenor"],"fields":["Aggregate numeric fields","l1","l2","l3","u1","u2","u3","vwap","price","tenor"],"historicalWindow":"Every closed window requested from the listed aggregate routes before the deployment."},{"apiVersion":"v1","endpoints":["/historical/futures/oi_total_global_activity","/historical/futures/volume_total_global_activity"],"fields":["items","meta.total"],"historicalWindow":"Every window that returned HTTP 500 before the deployment."},{"apiVersion":"v1","endpoints":["/historical/derivs/liquidation_by_currency/HYPERLIQUID/:currency"],"fields":["exchange selector","items","meta.total"],"historicalWindow":"Every Hyperliquid liquidation window requested before the deployment."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect history used from the listed deterministic aggregate and gamma-band routes, and retry failed global-activity and Hyperliquid liquidation windows. Gamma bands bracket vwap, the spot input to the calculation; price is a separate estimated delivery/index input and is not the band-bracketing field.","validation":["Focused query regressions cover fixed-scale Decimal accumulation for futures totals, margin totals, weighted funding, perpetual funding by exchange, alternative summary, options OI/volume totals, put/call ratios, per-currency volume, and GEX.","Four repeated production DERIBIT/BTC/30D gamma-band reads returned one canonical item SHA-256; BINANCE/SOL 1D, 7D, and 30D returned three distinct tenor-specific histories.","Validated gamma-band rows bracketed vwap between the lower and upper boundaries after invalid source rows were excluded.","Both restored global-activity routes returned HTTP 200 with data for the production test window.","The v1 Hyperliquid BTC liquidation-by-currency selector returned HTTP 200 with data for the production test window."]},{"id":"HIST-2026-08-13-V2-REFERENCE-PRICE-QUALITY","status":"deployed","publishedAt":"2026-08-16T13:26:01Z","updatedAt":"2026-08-16T13:26:01Z","summary":"Excluded incomplete or non-positive persisted source minutes from futures and perpetuals reference-price rollups.","cause":"A minute with a null index side and a zero mark side could be admitted to request-time aggregation, producing a valid-looking zero open or low at 1h and coarser resolutions.","deployment":{"deployedAt":"2026-08-13T19:20:25Z","gitCommit":"6ca37d2341cd0a4c02e99effe0e17ec9ee409c09","workflowRun":"https://github.com/Laevitas/lvt-api-v2/actions/runs/31735030032"},"affected":[{"apiVersion":"v2","endpoints":["/api/v1/futures/reference-price","/api/v1/perpetuals/reference-price"],"fields":["mark_price_open","mark_price_high","mark_price_low","mark_price_close","index_price_open","index_price_high","index_price_low","index_price_close"],"historicalWindow":"Every closed rollup containing a persisted minute with a non-positive mark field or an incomplete/non-positive index field."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect futures and perpetuals reference-price history at every resolution used. The correction changes request-time rollups without rewriting the persisted one-minute source.","validation":["The reported Bybit BTCUSDT-25SEP26 2026-01-30 08:00 hourly bucket returned non-zero, complete mark/index OHLC values after deployment.","Focused query tests reject null, non-finite, and non-positive source-minute fields before aggregation."]},{"id":"HIST-2026-08-13-V2-VOLUME-END-BOUND","status":"deployed","publishedAt":"2026-08-16T13:26:01Z","updatedAt":"2026-08-16T13:26:01Z","summary":"Applied the requested end timestamp before limiting and cursoring futures and perpetuals volume history.","cause":"The futures and perpetuals volume queries applied the inclusive start bound but omitted the end predicate, so limit and cursor pagination could continue from start toward the present.","deployment":{"deployedAt":"2026-08-13T19:20:25Z","gitCommit":"6ca37d2341cd0a4c02e99effe0e17ec9ee409c09","workflowRun":"https://github.com/Laevitas/lvt-api-v2/actions/runs/31735030032"},"affected":[{"apiVersion":"v2","endpoints":["/api/v1/futures/volume","/api/v1/perpetuals/volume"],"fields":["end","data","meta.next_cursor"],"historicalWindow":"Every bounded historical window requested before the deployment."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect bounded futures and perpetuals volume windows if over-fetched rows were loaded or if cursor exhaustion was used to define the requested export. No persisted source rows were rewritten.","validation":["The reported DERIBIT BTC-PERPETUAL 2026-01-01 through 2026-01-08 daily request returned exactly eight bounded rows and no next cursor at limit=200.","Focused futures and perpetuals regression tests verify that end is applied before limit and cursor generation; spot volume behavior is unchanged."]},{"id":"HIST-2026-08-16-BINANCE-REFERENCE-PRICE-GAP","status":"deployed","publishedAt":"2026-08-16T11:58:44Z","updatedAt":"2026-08-16T11:58:44Z","summary":"Restored missing Binance futures and perpetuals reference-price minutes through a versioned endpoint-specific correction overlay.","cause":"The persisted Binance ticker source has an ingestion gap from 2026-01-30 06:57 UTC through 08:42 UTC. Reference-price rollups therefore omitted or incompletely formed buckets intersecting that interval.","deployment":{"deployedAt":"2026-08-16T11:16:37Z","gitCommit":"7ba94a1bf43f75edf33b735085b82c4e767a7c6a","workflowRun":"https://github.com/Laevitas/lvt-api-v2/actions/runs/31943231715"},"affected":[{"apiVersion":"v2","endpoints":["/api/v1/futures/reference-price","/api/v1/perpetuals/reference-price"],"fields":["mark_price_open","mark_price_high","mark_price_low","mark_price_close","index_price_open","index_price_high","index_price_low","index_price_close"],"historicalWindow":"Binance timestamps from 2026-01-30 06:57:00 UTC through 08:42:00 UTC."}],"changesClosedWindowResponsesWithoutBackfill":false,"recommendedRecollection":"Re-collect Binance futures and perpetuals reference-price windows intersecting 2026-01-30 06:57:00 UTC through 08:42:00 UTC at every resolution used. The correction covers 625 instruments for which authoritative mark and index history was recoverable. ZAMAUSDT is excluded because no authoritative Binance index history was available for this interval.","validation":["The correction contains 66,136 rows and 66,136 unique logical keys across 625 instruments. Both production replicas returned identical counts, 2/2 active replicas, and empty replication queues.","Validation found zero non-positive mark/index values, zero OHLC-order violations, and zero duplicate logical keys. Existing published source rows were preserved rather than overwritten.","The inserted JSONEachRow artifact SHA-256 is c7ca33c8ba518020747a21642f5311608f079ca46712b40349ab2dc5b5d2aaad.","Production BTCUSDT and XRPUSDT 07:00 hourly responses matched their 60 corrected source minutes exactly across every returned mark/index OHLC field.","Four repeated production requests per instrument returned one canonical data SHA-256 and one ETag across Cloudflare FRA, MRS, and AMS edges. BTCUSDT data SHA-256 was 80a2b4dc3bfef7ab4ffdcef4498ebbba61aa1a404d1de9258939bae872021f16; XRPUSDT was f38675b9a0ae99f8f85de3da9c6e80e9772e5c558e5af9df6554d175c8a9ff7c."]},{"id":"HIST-2026-08-06-REFERENCE-PRICE-RESOLUTION","status":"deployed","publishedAt":"2026-08-06T09:20:19Z","updatedAt":"2026-08-06T09:20:19Z","summary":"Applied the requested resolution to futures and perpetuals reference-price history.","cause":"The reference-price endpoint accepted a resolution parameter but queried persisted one-minute mark/index aggregates without bucketing them.","deployment":{"deployedAt":"2026-08-06T09:18:02Z","gitCommit":"8c9e7b2f1e3c610c3fcd863c9e6bc734b97504e2","workflowRun":"https://github.com/Laevitas/lvt-api-v2/actions/runs/31088124397"},"affected":[{"apiVersion":"v2","endpoints":["/api/v1/futures/reference-price","/api/v1/perpetuals/reference-price"],"fields":["resolution","mark_price_open","mark_price_high","mark_price_low","mark_price_close","index_price_open","index_price_high","index_price_low","index_price_close"],"historicalWindow":"All available closed windows requested at a resolution above 1m before the deployment."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect the full available futures and perpetuals reference-price history at every resolution above 1m. The persisted 1m source aggregates were not rewritten.","validation":["For the same inclusive one-day window, futures and perpetuals returned 1,441 1m buckets, 25 1h buckets, and two 1d buckets.","The 1m, 1h, and 1d canonical row payloads were distinct for both tested families.","Immediate repeated reads were identical at all three resolutions for both tested families.","All tested mark-price and index-price OHLC quartets satisfied low <= open/close <= high.","Production evidence retained Date, CF-RAY, ETag, body SHA-256, row counts, and canonical row SHA-256; evidence-file SHA-256 ca203320da7c7d4d0c53ba614318df7846a29ea344d0e070b69e2d5d6ef3ed6e."]},{"id":"HIST-2026-08-01-V1-CANONICAL-QUERIES","status":"deployed","publishedAt":"2026-08-06T08:46:31Z","updatedAt":"2026-08-06T08:46:31Z","summary":"Canonicalized v1 cross-currency aggregates, tied-row liquidation pagination, and recent-year options currency aggregates.","cause":"Parallel Float64 accumulation could differ at representation scale, liquidation pages ordered tied timestamps without a side tie-break, and options year-range queries aggregated the full source range before selecting the requested page.","deployment":{"deployedAt":"2026-08-01T13:41:18Z","gitCommit":"a2be377a426f1f65ab745b085aaa2add650d7b4a","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/30702141011"},"affected":[{"apiVersion":"v1","endpoints":["/historical/futures/total_open_interest_by_currency","/historical/futures/total_volume_by_currency","/historical/derivs/perpetual/total_open_interest_by_currency","/historical/derivs/perpetual/total_volume_by_currency"],"fields":["BTC","ETH","Other"],"historicalWindow":"Every closed window fetched before the deployment."},{"apiVersion":"v1","endpoints":["/historical/derivs/liquidation/:market/:symbol","/historical/derivs/liquidation_by_currency/:market/:currency"],"fields":["date","side","meta.total","items"],"historicalWindow":"Every paginated closed window fetched before the deployment."},{"apiVersion":"v1","endpoints":["/historical/options/total_open_interest_by_currency","/historical/options/total_volume_by_currency"],"fields":["BTC","ETH","Other","meta.total","items"],"historicalWindow":"Every requested window; the reported HTTP 500 failures affected annual ranges beginning in 2025."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect cross-currency aggregates where byte-level identity matters, every liquidation window previously consumed through page-based pagination, and failed or incomplete options currency-aggregate ranges. Legacy aggregate rows that differ only at floating-point representation scale are one logical observation, not separate market events.","validation":["Six repeated production requests to each reported perpetual currency aggregate returned one parsed row multiset; fixed-scale Decimal128(8) accumulation is used before Float64 response serialization.","Both limit=144 and limit=36 production pagination runs delivered all 536 declared (date, side) keys for the reported aggregate BTC liquidation window.","The reported 2025 and 2026 options open-interest and volume annual ranges returned HTTP 200 with data at 1h, 2h, 4h, and 1d.","Focused gateway regression tests cover fixed-scale sums, stable (date, side) ordering, and timestamp-first options pagination."]},{"id":"HIST-2026-08-05-MODEL-YIELD-V1","status":"deployed","publishedAt":"2026-08-05T12:44:30Z","updatedAt":"2026-08-06T09:20:19Z","summary":"Stabilized model-implied yield publication and completed a versioned rebuild of eligible affected v1 history.","cause":"The producer could standardize a forward curve without three expiries or a 30-day anchor, and could accept a copied-underlying-across-expiries source pattern that becomes an inverse-tenor annualized-rate curve. Asynchronous source refreshes then exposed abrupt changes between five-minute publications.","deployment":{"deployedAt":"2026-08-06T06:11:51Z","gitCommit":"630243b5f8164905206f4640e69075403144dc07","workflowRun":"https://github.com/Laevitas/model-fetcher-lambda/actions/runs/31076451213"},"affected":[{"apiVersion":"v1","endpoints":["/historical/options/type/atm_iv_model/:market/:currency/yield"],"fields":["7","14","30","60","90","180","270","365"],"historicalWindow":"2023-09-07 00:00:00 UTC through 2026-08-04 23:55:00 UTC."}],"changesClosedWindowResponsesWithoutBackfill":false,"recommendedRecollection":"Re-collect model-implied yield from 2023-09-07 10:30:00 UTC through 2026-08-04 23:55:00 UTC. Eligible observations were rebuilt into the versioned correction overlay; timestamps without enough valid source expiries to reconstruct a curve remain on their previously published state.","validation":["The producer now requires at least three expiries and a 30-day anchor, rejects copied-underlying source curves, applies a causal three-point median, and bounds each published five-minute step to one percentage point.","Forward-curve input now rejects malformed, non-positive, non-finite, and zero-after-conversion expiry knots and deterministically consolidates duplicate expiries. Focused model validation passed 51 tests.","The exact previously failing UTC day completed in two independent read-only production reproductions, each producing 33,008 correction rows with logical SHA-256 6478f8b4f8cd4347549e84a2fb8a4ff366a8a9c9834e3b4dbd79d183367edd4e.","The completed recent correction contains 3,136,056 rows through 2026-08-04 23:55 UTC on each production replica; both replicas reported 2/2 active replicas and zero replication queue.","The completed older correction contains 29,368,264 unique logical rows across 294,767 timestamps from 2023-09-07 10:30 UTC through 2026-06-30 23:55 UTC. Both replicas returned logical hash 16195314979335562594 and zero invalid values.","The complete corrected model-yield view contains 38,784,686 unique logical rows through 2026-08-04 23:55 UTC. Both replicas returned logical hash 2852794060259188964, zero invalid values, 2/2 active replicas, and no queued inserts or merges.","Post-deployment BTC, ETH, and SOL reads were byte-identical on immediate repetition, with maximum observed five-minute moves between 0.2558 and 0.2999 percentage points.","API v1 was cut over to the versioned correction view by gateway commit ecb7c3d98e905ddf07153c844ae2784fe8012eef in production workflow 31004711208; all eight tenors in a sampled corrected XRP row matched the production correction view at public response precision.","The restart-safe older-history runner completed all 1,028 UTC days and exited cleanly after checkpointing 2026-06-30."]},{"id":"HIST-2026-08-05-ACTUAL-VOL-DELTA","status":"deployed","publishedAt":"2026-08-05T06:03:12Z","updatedAt":"2026-08-05T06:03:12Z","summary":"Corrected v1 actual-volatility model endpoints to apply the requested 10D, 15D, 25D, or 35D delta bucket.","cause":"The public path bucket already contained a D suffix. The service appended another leg suffix directly, producing unsupported query keys and silently omitting the delta predicate.","deployment":{"deployedAt":"2026-08-05T06:03:09Z","gitCommit":"2c9475e471a55673cf5d49eb2574ca52e84a367a","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/30979941113"},"affected":[{"apiVersion":"v1","endpoints":["/historical/options/actual_vol/butterfly_model/:market/:currency/:type/:days","/historical/options/actual_vol/risk_reversal_model/:market/:currency/:type/:days","/historical/options/actual_vol/skew_model/:market/:currency/:type/:days"],"fields":["c","p","d"],"historicalWindow":"All closed windows requested through the affected endpoint paths."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect every actual-volatility model history previously requested with a delta bucket. The persisted published values were not rewritten; the corrected request now selects the intended bucket.","validation":["A service-level regression test verified that public 10D input resolves to the supported 10C, 10P, and 10D query keys.","Three consecutive production runs returned four distinct histories for 10D, 15D, 25D, and 35D, while both skew controls remained distinct."]},{"id":"HIST-2026-08-04-IMMUTABLE-VOLATILITY","status":"deployed","publishedAt":"2026-08-04T16:44:28Z","updatedAt":"2026-08-04T16:44:28Z","summary":"Rebuilt historical model-volatility data into an immutable, validity-filtered publication and cut v1 model endpoints over to it.","cause":"The legacy aggregate table allowed invalid model values and merge-order-dependent same-key winners. Historical publication did not preserve a stable first valid value for each logical key.","deployment":{"deployedAt":"2026-08-04T16:44:25Z","gitCommit":"c6fd55dbcfb472c52878e9799b4f240212140a52","workflowRun":"https://github.com/Laevitas/laevitas-api-gateway/actions/runs/30930428808"},"affected":[{"apiVersion":"v1","endpoints":["/historical/options/type/atm_iv_model/:market/:currency/:type","/historical/options/type/butterfly_model/:market/:currency/:type","/historical/options/type/risk_reversal_model/:market/:currency/:type","/historical/options/type/skew_model/:market/:currency/:type","/historical/options/actual_vol/butterfly_model/:market/:currency/:type/:days","/historical/options/actual_vol/risk_reversal_model/:market/:currency/:type/:days","/historical/options/actual_vol/skew_model/:market/:currency/:type/:days"],"fields":["atm","c","p","d","7","14","30","60","90","180","270","365"],"historicalWindow":"2017-08-20 UTC through the publication cutover on 2026-08-04."}],"changesClosedWindowResponsesWithoutBackfill":false,"recommendedRecollection":"Re-collect the full model and actual-volatility history used by your system. The immutable publication replaces invalid or unstable legacy aggregate winners.","validation":["The restart-safe rebuild completed all 109 UTC months with zero failed months and produced 2,237,255,785 active state rows.","Both production replicas reported identical counts and sampled logical hashes with zero replication queue and zero delay.","Every monthly validation reported zero non-finite values, zero values above the 10,000-percent bound, and zero non-positive volatility levels.","The reported 2023 DERIBIT/ETH 25D risk-reversal case returned 144 rows and a byte-identical result across direct published-state reads."]},{"id":"HIST-2026-08-04-NEO-REALIZED-VOLATILITY","status":"deployed","publishedAt":"2026-08-04T16:55:00Z","updatedAt":"2026-08-04T16:55:00Z","summary":"Corrected and backfilled the NEO realized-volatility history that stopped advancing after 2026-07-28.","cause":"The producer advanced from one global BTC watermark, so currencies whose spot observations arrived after that watermark could be skipped permanently. Spot selection also relied on symbol parsing and a non-deterministic equal-timestamp winner.","deployment":{"deployedAt":"2026-08-04T16:43:37Z","gitCommit":"286a07847d7afa43f05165445e01cd1f7e68d0a3","workflowRun":"https://github.com/Laevitas/options-fetcher-lambda/actions/runs/30930424230"},"affected":[{"apiVersion":"v1","endpoints":["/historical/futures/realized_volatility/NEO"],"fields":["3","7","30","60","90","180","270","365"],"historicalWindow":"2026-07-28 00:00:00 UTC through 2026-08-04 16:00:00 UTC."}],"changesClosedWindowResponsesWithoutBackfill":false,"recommendedRecollection":"Re-collect NEO realized volatility from 2026-07-28 00:00:00 UTC onward. The corrected publication is versioned 2026-08-04 16:55:00 UTC.","validation":["The bounded source reconstruction produced 185 hourly timestamps and eight tenors (1,480 rows) with zero non-positive, non-finite, or extreme values.","Every corrected published row matched the deterministic normalized-USDT source calculation; logical hash 13593388322320676545.","Both production replicas returned the same row count, window, correction version, and logical hash with zero replication queue and zero delay."]},{"id":"HIST-2026-08-04-ROLLUP-CLOSE","status":"deployed","publishedAt":"2026-08-04T15:11:21Z","updatedAt":"2026-08-04T15:11:21Z","summary":"Corrected futures and perpetual resolution rollups to select open/close from the first/last source minute and to apply ticker-history resolution.","cause":"The output bucket alias was expanded inside argMin/argMax, making the ordering weight constant within a bucket. Carry close fields also used averaging.","deployment":{"deployedAt":"2026-08-04T15:02:49Z","gitCommit":"460bdb3766afb459bd176ae3b18af51edc6e8454","workflowRun":"https://github.com/Laevitas/lvt-api-v2/actions/runs/30921526191"},"affected":[{"apiVersion":"v2","endpoints":["/api/v1/futures/ohlcvt","/api/v1/futures/level1","/api/v1/futures/open-interest","/api/v1/futures/carry","/api/v1/futures/ticker-history","/api/v1/perpetuals/ohlcvt","/api/v1/perpetuals/level1","/api/v1/perpetuals/open-interest","/api/v1/perpetuals/carry","/api/v1/perpetuals/ticker-history"],"fields":["open","close","*_open","*_close","resolution"],"historicalWindow":"All available closed windows requested at a resolution above 1m."}],"changesClosedWindowResponsesWithoutBackfill":true,"recommendedRecollection":"Re-collect the full available history for the listed endpoints at every resolution above 1m. The persisted 1m source aggregates were not rewritten.","validation":["Three complete 1d OHLCVT bars reconstructed from the API 1h response matched first open, maximum high, minimum low, and last close; zero matched first close.","Twelve complete 1h buckets reconstructed from API 1m responses passed first/open, maximum/high, minimum/low, and last/close checks across OHLCVT, level1, open-interest, and carry.","Ticker-history returned distinct 1h and 1d bucket sets for the same window."]},{"id":"HIST-2026-08-04-L2-DETERMINISM","status":"deployed","publishedAt":"2026-08-04T13:26:25Z","updatedAt":"2026-08-14T07:22:54Z","summary":"Cut over futures, perpetual, and spot L2 history to deterministic serving tables with a sequence-based tie-break; retained history was populated from then-retained production raw snapshots where available and a serial legacy stabilization elsewhere.","cause":"Aggregate states used exchange timestamp alone for argMin/argMax. Equal-timestamp snapshots could select different winners after ClickHouse part merges.","deployment":{"deployedAt":"2026-08-04T13:26:25Z","gitCommit":"e42672fc6792df5e4d8a376e4e007da317159aa7","workflowRun":"https://github.com/Laevitas/lvt-api-v2/actions/runs/30913344399"},"affected":[{"apiVersion":"v2","endpoints":["/api/v1/futures/orderbook","/api/v1/perpetuals/orderbook","/api/v1/spot/l2-orderbook"],"fields":["All aggregated L2 fields"],"historicalWindow":"All L2 rows retained by the 90-day production TTL at cutover."}],"changesClosedWindowResponsesWithoutBackfill":false,"recommendedRecollection":"Re-collect the retained 90-day L2 history. Older L2 rows are outside the production retention policy.","validation":["Retained raw ranges were rebuilt with exchange timestamp and NATS sequence ordering; ranges unavailable in the raw tables were copied once from the legacy aggregates to stabilize their then-published values. The serving tables were not populated by replaying the S3 archive.","A later support-export comparison found more source snapshots in the S3 archive than in the serving-table source for an overlapping hour. S3 archive reconstructions are therefore labelled as a separate corrected revision and are not represented as byte-equivalent to the August 4 serving generation.","Repeated production reads returned byte-identical bodies and ETags for the reported futures, perpetual, and spot controls."]}]}