Release-level history for completed roadmap phases. The per-task delivery ledger remains in roadmap/tasks.toml; upcoming work is in ROADMAP.md.

0.3.0 - 2026-08-10

Completes milestones v0_3 (consumer decision primitives) and v0_4 (base-numeraire covered-call math).

  • Split the Calc god-module along cohesion seams into DeltaCalc.Leverage, Liquidation, Allocation, Safety, and Quantization (DCA-ladder logic moved to DCAPlanner). DeltaCalc.Calc remains as an undocumented compatibility façade delegating all 11 previous public functions; the agent manifest advertises the extracted modules instead.
  • Breaking: moved rounding to explicit caller-controlled output boundaries — generic price/rate/percentage/ratio math no longer quantizes internally and returns full active Decimal.Context precision (34 under decimal 3.x). OptionLadder strike rounding takes caller :strike_increment + :rounding_mode; whole-day rounding in FundingProjection/ MarginBridge is documented as intrinsic. Calc.quantize/1 remains only as the documented eight-place legacy compatibility boundary.
  • Advertised every exact Decimal money/price/rate :value input as a canonical JSON-string contract across all calculation modules (matching the DeltaCalc.Decimal coercion boundary); a manifest-wide CI invariant now rejects any MCP input schema advertising {"type": "number"}.
  • Made Calc.multi_leg_position public and side-aware (side defaults to :long), so short multi-leg positions reach the existing side-aware math through a documented API.
  • Added base-numeraire math to DeltaCalc.DeltaNeutral: inverse-perp exposure, settlement-period net-delta handling, covered-call coverage (capacity/uncovered reporting without implying approval), and risk-target checks.
  • Breaking: DeltaCalc.PositionCalculator.calculate_position/2 (removed) is now DeltaCalc.PositionCalculator.calculate_position/1 — the unused fee_rate input (fee modeling belongs to DeltaCalc.Fees) and the echoed risk-mode config were removed, so the API no longer advertises inputs that don't affect the calculation. Calc.dca_ladder now actually applies the advertised mark_buffer to every intermediate and final liquidation MMR (zero preserves prior results).
  • Removed baked-in venue risk constants from generic margin/liquidation math: Calc takes a caller-supplied MMR tier schedule (:mmr_schedule), and MarginBridge.check_kill_switch compares a per-period funding rate scaled by caller-supplied cadence against an overridable daily threshold. Defaults are documented conventions, not venue truths.
  • Registered DeltaCalc.Decimal (the shared input-coercion boundary from task 39) in the agent manifest with api() annotations for cast/1 and cast!/1, and hardened the manifest-consistency suite: every publicly documented lib/delta_calc/ module must now be registered — a documented module without api() coverage fails CI instead of silently missing from the agent surface.
  • Added DeltaCalc.describe/0..2 — progressive disclosure over the manifest registry, so an agent narrows from library to module to function without reading source.
  • Breaking: renamed DeltaCalc.PnL (unbackticked: the module no longer exists, and an ex_doc autolink would try to load it) to DeltaCalc.Pnl. Descripex derives discovery short names with Macro.underscore/1, which split the internal capital into "pn_l"; the module now resolves as "pnl". Function names and signatures are unchanged.

Phase 1: Extraction

  • Extracted the retired TradingDashboard calculation engine into a standalone, headless DeltaCalc library with Decimal arithmetic, tests, documentation, and agent discovery.

Phase 2: Calc primitives

  • Added the dashboard-facing funding, hedging, account, concentration, margin-bridge, funding-projection, option-ladder, and options-risk calculation primitives.