# Release Notes
This page is the source of truth for troy release notes. Each section below
maps to a tagged release on
[GitHub](https://github.com/quantmind/troy/releases). When a new tag is
pushed, the matching section is extracted by
`.github/workflows/release.yml` and published as the GitHub Release body.
Keep entries compact: grouped bullets under `Fixed`, `Added`, `Changed` and
`Removed`, one bullet per change, one or two lines each. Say what changed and
what a caller does about it. Reasoning belongs in the code, beside the thing it
explains.
## v0.1.3
Square roots, and a rounding strategy on the operations that round.
Added
- `Dec::sqrt`, `Dec::checked_sqrt` and `Dec::sqrt_approx`. `sqrt` rounds half
away from zero at `Dec::SCALE` and is the one operation here that cannot
overflow: the largest root the range holds is about `1.3e10`, so a negative
value and NaN are its only failures, which is what `checked_sqrt` reports as
`None`. `sqrt_approx` goes through `f64` for about three times the speed,
accurate to the double's sixteen significant digits rather than to the last
place; take it where a root feeds a comparison, not where two of them are
tested equal.
- `RoundingStrategy`, taken by `Dec::round_dp_with` and
`Dec::round_to_step_with`: `MidpointAwayFromZero`, `MidpointNearestEven`,
`ToZero`, `AwayFromZero`, `ToNegativeInfinity` and `ToPositiveInfinity`. Pass
one where the direction is the exchange's rather than yours: `ToZero` for a
quantity filter, the infinity pair for a bid or ask pinned to a tick,
`MidpointNearestEven` where many rounded values are summed. It derives
`Default` as `MidpointAwayFromZero` and serialises under the `serde` feature,
so a per-instrument policy stores and restores with the instrument.
Changed
- `round_dp` and `round_to_step` are unchanged, and are now defined as the
`MidpointAwayFromZero` case of their `_with` counterparts. `floor`, `ceil`
and `trunc` are the `dp` 0 cases of the three directed strategies, and say so
in their docs.
- The `arithmetic` benchmark is now `dec` and carries the roots alongside the
arithmetic, so `cargo bench --bench arithmetic` is `cargo bench --bench dec`.
`make bench` is unchanged. `docs/bench-data.json` is re-measured, and the
site's front page hands off to a `Dec` page for the per-operation numbers.
- The readme says who writes this crate: every line generated by an AI agent
under the review of high frequency trading practitioners, and what a
contribution has to clear before it lands.
## v0.1.2
Added
- The market types serialise under the `serde` feature: `PriceAmount`,
`OrderBookSide`, `OrderBook`, `OrderBookTop` and `OrderBookDiff`. A book
snapshot now round trips whole, where before only `Dec` did.
- `OrderBook::is_consistent` — every level valid, each side ordered the way its
slot requires, no price held twice, and a spread above zero. A book built
through `set` holds this by construction, so check it on one that arrived
another way: deserialised from a snapshot, or assembled by hand.
- `Display` honours the format spec. A precision rounds to exactly that many
places, halves away from zero, padded with zeros past `Dec::SCALE`; width,
fill, alignment, `0` and `+` behave as they do on the built-in numeric types.
Bare `{}` is unchanged, and still compiles to what it did before. The
rounding runs on the digits rather than through a `Dec`, so a carry out of
the range still renders: `format!("{:.0}", Dec::MAX)` is
`170141183460469231732`, a number `Dec` cannot hold and `round_dp` answers
with `Dec::NAN`.
- A benchmark and docs site at <https://troy.quantmind.com>, carrying the full
benchmark set, the order book numbers, the digit and depth sweeps and the
design docs. `make site` builds it, `make site-dev` serves it locally.
Removed
- `make bench-page`, which rendered a single page from the snapshot. `make
site` builds the whole site instead.
## v0.1.1
Fixed
- Parser reported `Overflow` for text carrying more significant digits than a
`u128` holds, even for values well inside the range: `1.0` written with 43
decimal places, or a float printed as its exact expansion. Surplus digits now
round the last one kept instead of failing the parse.
Added
- `OrderBook::imbalance` — `(bid - ask) / (bid + ask)` at the touch, in `[-1, 1]`.
- `OrderBook::range_imbalance(from, to)` — the same over a half open band of
levels. An empty or inverted band reads `None`, not zero.
- `tests/fuzz.rs` — proptest properties over `Dec`; `make rs-fuzz` sweeps wider.
- `tests/fuzz_book.rs` — capped-book invariants at 10, 50, 100 and 200 levels.
- `benches/orderbook.rs` — book operations by depth; `make bench` runs it.
Changed
- `OrderBookSide` drops its running `total_amount`. `amount_mean` and
`amount_std_dev` sum on demand, `trim` becomes a `truncate`, and a non-finite
amount can no longer poison a side for good.
## v0.1.0
First release: `Dec`, a fixed-scale decimal backed by an `i128` with
`Dec::SCALE` decimal places, with parsing, formatting, arithmetic, rounding,
and optional `serde` and `rust_decimal` support.
Arithmetic is exact over a symmetric finite range of roughly +/-1.7e20.
Anything leaving it becomes `Dec::NAN`, which propagates through every later
operation so the fault reaches the boundary where `Dec::is_finite` is checked,
rather than being clamped to a plausible number or raised as a panic on a hot
path. The ordering stays total, so `Dec` remains usable as a map key and in a
sorted book. See the `design` module for the reasoning.