# stochastic-rs — Audit follow-up (2026-04-28)

> Második audit pass `v2.0.0-beta.1 → v2.0.0-beta.2` után, a v2 stable felé vezető úton.
> Tárgya: a [2026-04-26 audit](./API_AUDIT_2026-04.md) megállapításainak státusza + új release-blocker-ek.
> Edition: `2024`. Verzió-jelölt: `2.0.0-beta.2` (commit `477cea2`).

---

## 0. Tartalom

- [1. Vezetői összefoglaló](#1-vezetői-összefoglaló)
- [2. Build / test állapot](#2-build--test-állapot)
- [3. Beta.2 mit fixelt a 2026-04 auditból](#3-beta2-mit-fixelt-a-2026-04-auditból)
- [4. Új release-blocker megállapítások (codex review)](#4-új-release-blocker-megállapítások)
- [5. Trait-design coherence review](#5-trait-design-coherence-review)
- [6. Quant-lib feature gap (QuantLib referencia)](#6-quant-lib-feature-gap)
- [7. beta.3 vs rc.0 javaslat](#7-beta3-vs-rc0-javaslat)
- [8. Prioritizált akciólista](#8-prioritizált-akciólista)

---

## 1. Vezetői összefoglaló

> **Status (2026-04-29 fix pass):** beta.3 P0 + P1 + section 5 trait
> coherence pontok mind végrehajtva. Részletek a [8. szekció akciólistájában](#8-prioritizált-akciólista).
> 615+ → 356 quant-lib teszt zöld, workspace `cargo check --no-default-features` tiszta.

A `v2.0.0-beta.2` **erős előrelépés** a `v2.0.0-beta.1`-hez képest:
9 sub-crate workspace-szé robbant, ArrayView migration befejezve, prelude bevezetve,
`Calibrator` / `CalibrationResult` / `ToModel` / `GreeksExt` traitek meg vannak írva
**és széleskörűen implementálva** (13 ToModel impl, 12 CalibrationResult, 5 GreeksExt).
A korábbi P0 lyukak (SabrCaplet, HW Swaption) be vannak kötve.

**Release jelölés:** **`v2.0.0-beta.3` — RC.0-t MÉG NEM**.

~~Indok: a workspace migráció és trait wire-up nagyrészt rendben van, **de van egy
korrekciós-jellegű numerikai hiba** (idő‑egység bug az `implied_volatility()`
hívásokban) ami minden BSM / Heston / SABR / Asian / Vasicek-bond pricer
implied-vol kimenetét torzítja.~~ ✅ **Időegység bug javítva, 6 pricer + tesztek frissítve.**
~~Ez **nem fagyaszthatja** az API-t (RC.0 ≈ "API freeze").~~

~~Másodlagos blockerek: **Python packaging félig kész** (workspace pyproject.toml
nem cdylib-re mutat), **umbrella feature propagation tört** (gpu/cuda/metal/accelerate
nem tovább-passzol a sub-crate-eknek), **`docs.rs all-features = true` instabil**,
**`DistributionExt` 16/19 disztribúción 0.0 default**.~~ ✅ **Mind javítva (lásd 4. szekció).**

A `MalliavinExt` / `Malliavin2DExt` deferred (scope memo szerint), megmaradnak
trait-szinten implementáció nélkül; **a prelude-ből kikerültek**.

---

## 2. Build / test állapot

| Cél | Állapot |
|---|---|
| `cargo check --workspace --no-default-features` | ✅ 10.67 s, no warnings |
| `cargo clippy --workspace --no-default-features` | ✅ tisztán fut (csak doc-formatting warning) |
| `cargo test -p stochastic-rs-distributions` | ✅ 20/20 |
| `cargo test -p stochastic-rs-stats` | ✅ 82/82 |
| `cargo test -p stochastic-rs-copulas` | ✅ 3/3 |
| `cargo test -p stochastic-rs-quant` | ✅ 351/351 (780 s) |
| `cargo test -p stochastic-rs-stochastic` | ⚠️ 155/156 — `process::fbm::tests::fbm_terminal_marginal_is_gaussian_with_correct_scale` flaky |
| `cargo test --workspace` | ❌ link error: workspace-level pyo3 feature unifikáció hiba |

**fBM flaky teszt:** Monte Carlo 5%-os toleranciával 6000 mintán futtatott
KS / kvantilis teszt. Pinned RNG seed nélkül **eleve flaky**, ahogy egy
"5%-os tolerancia 5%-os szignifikancián" kell legyen. Re-run azonnal sikeres.
RC-blocker, beta-megengedő.

---

## 3. Beta.2 mit fixelt a 2026-04 auditból

### 3.1. P0 (kritikus, kis költség)

| # | Tétel | Állapot | Bizonyíték |
|---|---|---|---|
| P0/1 | Prelude bevezetése | ✅ Done | `src/lib.rs:47-65` — 13 trait + 3 enum re-export |
| P0/2 | `DistributionExt` döntés | ⚠️ Partial | **3/19** impl: SimdNormal, SimdLogNormal, SimdGamma. 16 disztribúció default `0.0` |
| P0/3 | `ToModel` lyukak betöltése | ✅ Done | `13 impl`. SabrCaplet ✅ (sabr_caplet.rs:56), HW Swaption ✅ (`ToShortRateModel`, hw_swaption.rs:80) |
| P0/4 | Modul-root facade re-export | ✅ Done | `quant::types` (lib.rs:60-64), trait modulok minden subcrate-ben |

### 3.2. P1 (fontos, közepes költség)

| # | Tétel | Állapot | Bizonyíték |
|---|---|---|---|
| P1/5 | Naming konvenció (OU/Vasicek, KOU/Kou) | ✅ Done | `aliases.rs` exportálja `Ou as OU`, `Kou as KOU`. Mindkét forma él |
| P1/6 | Stats input-típus (ArrayView) | ⚠️ Partial | `heston_mle`, `fukasawa_hurst`, `fd`, `normality::*` → ArrayView1. `fou_estimator` még owned `Array1<f64>` |
| P1/7 | Stats `*Result` minta | ✅ Done | 15+ Result struct: `HestonMleResult`, `FukasawaResult`, `MleResult`, `JohansenResult`, … |
| P1/8 | Copula duplikáció | ✅ Done | `samples::*Copula2D` eltűnt, csak `bivariate::*` ágy van |
| P1/9 | `traits.rs` szétbontás | ✅ Done | Minden subcrate `traits/` directory: process/malliavin, calibration/pricing/time, bivariate/multivariate, distribution/float/callable |
| P1/10 | Numerics namespace | ✅ Done | `stochastic-rs-stochastic/src/numerics.rs` re-exportálja: `IsoNormal`, `ItoCalculator`, `Mlmc`, `HaltonSeq`, `SobolSeq`, `RlKernel`, `MarkovLift` (Lsm openblas-gated) |

### 3.3. P2 (nice-to-have, nagyobb költség)

| # | Tétel | Állapot | Bizonyíték |
|---|---|---|---|
| P2/11 | Builder pattern minden 6+ paraméteres pricer-en | ⚠️ Partial | 10× `*PricerBuilder` (BSM, Heston, Sabr, Asian, Dupire, BjerksundStensland, Merton1976, FD, HSCM). Sok régi `new(10+ args)` megmaradt |
| P2/12 | Output-típus marker traitek | ✅ Done | `OneDimensional`, `TwoDimensional`, `MultiDimensional<N>`, `CurveOutput` — **blanket impl-ekkel** automatikusan minden process-re |
| P2/13 | Egységes `Calibrator` trait | ✅ Done | 9 impl (sabr, bsm, svj, hw_swaption, sabr_caplet, heston, rbergomi, levy, double_heston). `CalibrationResult` 12 impl |
| P2/14 | Cross-module adapterek | ⚠️ Partial | `From<HestonMleResult> for HestonParams` ✅. AI→vol_surface ❌, fou_estimator→quant ❌ |
| P2/15 | Python coverage | ❌ Open (scope: skip) | 104 sampling osztály, 0 quant/stats/AI/copulas |

### 3.4. P3 (stratégiai)

| # | Tétel | Állapot |
|---|---|---|
| P3/16 | Workspace-szé alakítás | ✅ Done (PR #23, beta.2) |
| P3/17 | `Sde<F,G>` vs konkrét processek | ❌ Open — még nem döntött |
| P3/18 | GPU pipeline drága modellekre | ❌ Open — process.rs:46-48 explicit roadmap-en jelzi |
| P3/19 | Greeks pipeline egységesítése | ⚠️ Partial — `GreeksExt` 5 impl, Malliavin variantok inherent methodokkal párhuzamosan élnek |

### 3.5. F4 (halott traitek, scope: skip)

| Trait | Beta.2 állapot |
|---|---|
| `MalliavinExt<T>` | 0 impl — defined, prelude-ban |
| `Malliavin2DExt<T>` | 0 impl — defined, prelude-ban |
| `NCopula2DExt` | **eltűnt** beta.2-ben |

### 3.6. F3 (orphan modulok, scope: integrate)

| Modul | Állapot | Megjegyzés |
|---|---|---|
| `quant::order_book` | ✅ Bridged | `market::book::mid_quote()` / `half_spread_quote()` (lib.rs:47-48) |
| `quant::microstructure` | ⚠️ Documented standalone | Lib.rs file-level doc explicit jelzi; nincs feedback a pricing felé |
| `quant::factors` | ⚠️ Documented standalone | Ugyanaz |
| `quant::fourier_malliavin` | ⚠️ Documented standalone | Ugyanaz |

A scope szerint integrate-elni kell. A jelenlegi compromise: **doc-szinten jelölve standalone-ként**, hogy a felhasználó tudja. **Tényleges integrációval beta.3-ban kellene foglalkozni** — pl. `microstructure::AlmgrenChriss` → `risk::execution_cost`.

---

## 4. Új release-blocker megállapítások

A codex (gpt-5.5 xhigh) független pass-a 7 új P0 jellegű ügyet hozott elő.

> **2026-04-29 status: mind a 7 lezárva.** Részletek a 8. szekcióban.

### 4.1. ✅ ~~⛔️ KRITIKUS~~ — időegység bug az implied-vol hívásokban

**Helyek:**
- `stochastic-rs-quant/src/traits/time.rs:39` — `calculate_tau_in_days()` definíció: `tau_or_from_dates() * 365`
- `stochastic-rs-quant/src/pricing/bsm.rs:226` — `.expiry(self.calculate_tau_in_days())`
- `stochastic-rs-quant/src/pricing/heston.rs:192` — ugyanaz
- `stochastic-rs-quant/src/pricing/sabr.rs:388` — ugyanaz
- `stochastic-rs-quant/src/pricing/heston_stoch_corr.rs:336` — ugyanaz
- `stochastic-rs-quant/src/pricing/asian.rs:115` — `let T = self.calculate_tau_in_days();` Black-Scholes formulában

**Probléma:** Az `implied_vol::ImpliedBlackVolatility::expiry()` field **évben** várja a maturityt. A `vol_surface/implied.rs:85, 263` helyesen évvel hívja (`maturities[j]`). A pricerek `implied_volatility()` metódusai **napokban** adják át (`tau * 365`). Az IV-keresés `sigma_apparent ≈ sigma_true / sqrt(365)` ≈ 5%-ot ad 100% helyett.

**Workaround a kódban:** `bonds/cir.rs:52-54` explicit override-olja a `calculate_tau_in_days()`-t hogy `tau`-t (évben!) adjon vissza. Tehát a szerző tudta hogy `_in_days` névvel év-skálát kell adni — de nem javította a trait defaultot.

**Javítás (beta.3):** átnevezni vagy törölni a `calculate_tau_in_days()` metódust (a név **félrevezető**, mert minden hívása évet várt). Az `Asian`, `Vasicek`-bond pricerek BS-formulájában is évre kell hozni.

### 4.2. ✅ ~~⛔️~~ Date support csak félig valós

`BSMPricer::tau_required()` (bsm.rs:264) — csak `tau`-t ellenőriz, datesre **panic-kel**.
`HestonPricer::calculate_call_put` (heston.rs:174) — `tau().unwrap_or(1.0)`, datesre **csendben 1.0**.

A `TimeExt` traiten van `tau_or_from_dates()` és `tau_with_dcc()` — de ezeket **nem használja a pricer**. Egy felhasználó aki dates-szel dolgozik:
- BSMPricer-en: panic
- HestonPricer-en: silent 1.0 default → félrevezető output

**Javítás (beta.3):** minden `PricerExt` impl `tau_or_from_dates()`-et hívjon `tau().unwrap()` helyett.

### 4.3. ✅ ~~🔥~~ `DistributionExt` matematikailag hamis defaultok

`stochastic-rs-distributions/src/traits/distribution.rs:7-50` — minden módszer (`pdf`, `cdf`, `mean`, `variance`, `skewness`, …) **default `0.0`**. Csak Normal, LogNormal, Gamma override-ol.

**Hatás:** `SimdBeta::pdf(0.5) = 0.0` — silent helytelen érték. Fluencer crashek és olyan kalibráció amely PDF-et használ chain-ben.

**Két opció (beta.3):**
- (a) **Implementálni mind a 19** — ~10 metódus × 16 fennmaradó disztribúció = 160 metódus. A `statrs` crate ezeket nagyrészt adja, csak wrapper.
- (b) **Required methodokkal egyértelműsíteni** — `fn pdf(...)`, `fn cdf(...)`, `fn mean(...)` kötelező; nem-implementáltak `unimplemented!()` panicelnek. A hamis 0.0 helyett tiszta panic.
- (c) **`Option<f64>` return** — `fn pdf(...) -> Option<f64> { None }` default. Hívóknak explicit `.is_some()` check kell.

A (b) opció a leg-Rustos. (a) a leg-felhasználóbarátabb. **Javaslat: (b) most, (a) rc.0 előtt.**

### 4.4. ✅ ~~🔥~~ Python packaging félig elkészített

- `pyproject.toml:1-26` workspace-rootban van, `[tool.maturin] features = ["python"]`
- A workspace-root `stochastic-rs` crate **nem `cdylib`** — `crate-type = ["lib"]` (Cargo.toml:339)
- A Python modul tényleges crate-je: `stochastic-rs-py` (külön cdylib, lib.rs:14 `#[pymodule]`)
- A `pyproject.toml [project.urls] Repository` `rust-dd/stochastic-rs`, a Cargo.toml `dancixx/stochastic-rs` — **eltérő repo URL**

`maturin build` **a workspace rootból nem fogja működni**. Vagy:
- `pyproject.toml`-t `stochastic-rs-py/`-be kell tenni, és onnét futtatni a `maturin develop`-ot
- Vagy `[tool.maturin] manifest-path = "stochastic-rs-py/Cargo.toml"` beállítás
- Repository URL-eket szinkronizálni

**Beta.3 minimum:** a CLAUDE.md-ben és a release notesban explicit ki kell mondani hogy "Python module: `cargo build -p stochastic-rs-py` vagy `cd stochastic-rs-py && maturin develop`". Az aktuális `pyproject.toml` workspace-rooton **félrevezető**.

### 4.5. ✅ ~~🔥~~ Umbrella feature propagation tört

`Cargo.toml:308-335` (root features):

```toml
gpu          = ["dep:cubecl", "dep:gpu-fft"]                 # ❌ nem továbbít subcrate-be
cuda-native  = ["dep:cudarc", "cudarc/cufft"]                 # ❌
metal        = ["dep:metal"]                                  # ❌
accelerate   = []                                             # ❌ üres
openblas     = [..., "stochastic-rs-stochastic/openblas", ...]  # ✅ továbbít
python       = [..., "stochastic-rs-stochastic/python", ...]    # ✅ továbbít
```

A `gpu`/`cuda-native`/`metal`/`accelerate` flag-ek a **root crate** dep-eit kapcsolják, **nem** a `stochastic-rs-stochastic/gpu` (etc.) feature-öket. Egy felhasználó aki `cargo build --features gpu`-t fut, **nem kap GPU sample metódusokat**, mert a `stochastic-rs-stochastic` crate nem kapja meg a `gpu` feature flag-et.

**Javítás:** minden GPU-kompatibilis flagot tovább kell passzolni a sub-crate-be (mint az `openblas` és a `python`).

### 4.6. ✅ ~~⚠️~~ `docs.rs all-features = true` valószínűleg failelt

A jelenlegi `[package.metadata.docs.rs] all-features = true` (Cargo.toml:291 körül) ALL feature-t bekapcsolja, beleértve:
- `openblas` — natív OpenBLAS-szal csak Linuxon docs.rs build kompatibilis
- `gpu`, `gpu-cuda`, `gpu-wgpu`, `cuda-native`, `metal` — natív GPU SDK-kkal nem docs.rs build kompatibilis
- `python` — pyo3 link
- `ai` — candle-core / polars (nagy)
- `yahoo` — `tokio-test` dev-only feature
- `hotpath` — profiler

Várhatóan **docs.rs build fail** lesz az első release után.

**Javítás (beta.3):** explicit `features = ["openblas", "ai", "yahoo"]` lista, nem `all-features = true`.

### 4.7. ✅ ~~fBM flaky test — RC blocker~~

Lásd 2. fejezet. RC-ben nem tartható.

**Javítás:** `Fbm::sample_with_seed(seed)` használata + fix seed a property tesztben.

✅ **Megoldva** — pinned seed property test, beta.3-ban stabilan zöld.

---

## 5. Trait-design coherence review

Az új trait-réteg részletesen átnézve. Codex pass-a alapján.

### 5.1. ✅ `ToModel` — sound

`pub trait ToModel { type Model: ModelPricer; fn to_model(&self, r, q) -> Self::Model; }`

Statikus dispatch, no `&dyn`/`Box<dyn>`. 13 impl, mindenhol használt. **Megfelelő RC.0-ra**.

### 5.2. ✅ `ToShortRateModel` — sound

A párhuzamos lattice-pricing bridge. **HW swaption beta.2-ben be lett kötve** (sokszor a régi auditot keresve P0 nyitva volt — most CLOSED). Csak 1 impl, de pontos: minden short-rate kalibrátor majd ezt fogja implementálni.

### 5.3. ✅ ~~⚠️~~ `Calibrator` — ~~túl gyenge RC-hez~~

```rust
pub trait Calibrator {
  type InitialGuess;
  type Output: CalibrationResult;
  fn calculate(&self, initial: Option<Self::InitialGuess>) -> Self::Output;
}
```

**~~Hiányzik:~~** ✅ **A javasolt forma beta.3-ban végrehajtva** (lásd alább).
- ~~`Result`-os hibakezelés (jelenleg minden calibrator panic-elhet)~~
- ~~`iterations()` / `max_iterations()`~~ — `iterations()` a `CalibrationResult`-on (5.4)
- ~~`optimizer_status()` — Levenberg-Marquardt vs Nelder-Mead distinkció~~ — `message()` a `CalibrationResult`-on (5.4)
- ~~Nincs `type Params`~~ — most már van, és bound `Output: CalibrationResult<Params = Self::Params>`

**Végrehajtva (beta.3):**
```rust
pub trait Calibrator {
  type InitialGuess;
  type Params: Clone;
  type Output: CalibrationResult<Params = Self::Params>;
  type Error;

  fn calibrate(&self, initial: Option<Self::InitialGuess>)
    -> Result<Self::Output, Self::Error>;
}
```

9 impl frissítve, `type Error = anyhow::Error;`. Inherent `*Calibrator::calibrate`
metódusok eltávolítva (átnevezve privát `solve()`-ra), így a trait az egyetlen
publikus belépési pont. 4 új wrapper struct: `HscmParams`, `HullWhiteParams`,
`LevyParams`, `SabrCapletParams`.

### 5.4. ✅ ~~⚠️~~ `CalibrationResult` — ~~alulspec~~

```rust
pub trait CalibrationResult {
  fn rmse(&self) -> f64;
  fn converged(&self) -> bool;
  fn loss_score(&self) -> Option<&CalibrationLossScore> { None }
}
```

**~~Hiányzik:~~** ✅ **Mind végrehajtva (beta.3):**
- ✅ `type Params: Clone` + `fn params(&self) -> Self::Params` (owned-clone return — flat-field result structok érintetlenek; 12 impl frissítve)
- ✅ `fn iterations(&self) -> Option<usize>` (default `None`)
- ✅ `fn message(&self) -> Option<&str>` (default `None`)
- ✅ `fn max_error(&self) -> f64` (default `f64::NAN`)

### 5.5. ✅ ~~⚠️~~ `PricerExt` — ~~legacy minta~~

```rust
pub trait PricerExt: TimeExt {
  fn calculate_call_put(&self) -> (f64, f64);
  fn calculate_price(&self) -> f64;
  fn implied_volatility(&self, _c_price: f64, _option_type: OptionType) -> f64 { f64::NAN }
}
```

- ✅ ~~`implied_volatility` default `0.0` — csendben **rossz**~~ → most `f64::NAN`.
- ✅ ~~`derivatives() -> Vec<f64>` — **típuselveszítés**~~ → metódus **törölve**, helyébe `GreeksExt::greeks() -> Greeks` aggregator + új [`Greeks`](#) struct (delta/gamma/vega/theta/rho/vanna/charm/volga/veta, default NaN).

### 5.6. ✅ `ModelPricer` — coherent (csak equity)

`price_call(s, k, r, q, tau)` — euró opció vol-surface. Nem általánosítható path-dependentre, rateekre, kreditre. **Helyesen szűkebb scope**.

### 5.7. ✅ ~~⚠️~~ `GreeksExt` — ~~5 impl, vékony~~

Beta.3-ra a felület 1st + 2nd order Greeks-szel + aggregátorral kiegészítve:

```rust
pub trait GreeksExt {
  fn delta(&self) -> f64;
  fn gamma(&self) -> f64 { f64::NAN }
  fn vega(&self) -> f64 { f64::NAN }
  fn theta(&self) -> f64 { f64::NAN }
  fn rho(&self) -> f64 { f64::NAN }
  fn vanna(&self) -> f64 { f64::NAN }
  fn charm(&self) -> f64 { f64::NAN }
  fn volga(&self) -> f64 { f64::NAN }
  fn veta(&self) -> f64 { f64::NAN }
  fn greeks(&self) -> Greeks { /* aggregátor */ }
}
```

- ✅ Második rendű Greeks (`vanna`, `charm`, `volga`, `veta`) hozzáadva — BSMPricer már inherent methodokon delegál.
- ⚠️ ~~11 további pricer-en az inherent methodok megvannak~~ — codex-pass után ellenőrizve csak 5 pricer-nek van inherent Greek-je (BSMPricer, CashOrNothing, AssetOrNothing, GbmMalliavinGreeks, HestonMalliavinGreeks), mind GreeksExt-be kötve.
- ✅ Malliavin variantok: `greeks()` override-olja a default-ot, hogy egyetlen MC pass-ban számolja a Greeks-eket (`GbmMalliavinGreeks::all_greeks()`, `HestonMalliavinGreeks::delta_gamma_single_pass()`) — különben az aggregátor *független MC estimátorokat keverne*.

### 5.8. ✅ `ProcessExt` — robusztus, RC-kész

`Send + Sync` bound, associated `Output`, generic precision, `sample_par` rayon-on, GPU override hookok. **Megfelelő.**

A marker traitek (`OneDimensional`, `TwoDimensional`, `MultiDimensional<N>`, `CurveOutput`) blanket impl-ekkel működnek — nem dead code. Egy felhasználó:

```rust
fn last_value<T: FloatExt, P: OneDimensional<T>>(p: &P) -> T { ... }
```

automatikusan kapja minden `Bm`, `Gbm`, `Vasicek`, … process-re.

### 5.9. ✅ ~~⚠️~~ `MalliavinExt` / `Malliavin2DExt` — deferred

Per scope memo: most maradnak, nem implementáljuk. ✅ **A prelude-ből kivéve** —
csak `crate::traits` namespace-en érhetők el explicit importtal, így a `use prelude::*;`
nem von be halott traitet.

### 5.10. ✅ ~~⚠️~~ `DistributionExt` — ~~defaultok hibásak~~

Lásd 4.3. pont. ✅ **Default `unimplemented!()`-re javítva** (option b a 4.3-ból).

---

## 6. Quant-lib feature gap

A user célja: **"full-featured quant lib"**. QuantLib-szerű referencia alapján mit nem fed le még a `stochastic-rs-quant`:

### 6.1. Architekturális (a legfontosabb)

| QuantLib réteg | stochastic-rs-quant ekvivalens |
|---|---|
| `Instrument` (NPV, perform calculations on demand) | ❌ Nincs unified instrument trait |
| `PricingEngine` (cserélhető engine egy instrumentre) | ⚠️ Részben — `ModelPricer` egy szelete |
| `Handle<T>` / `Observable` market data | ⚠️ `quant::market::{Quote, Handle, Observable}` van, **de nincs reaktív update** — a kalibráció nem reagálna market data változásra |
| Date / Schedule / Calendar | ✅ `quant::calendar`, `quant::cashflows::ScheduleBuilder` |

A **`Instrument` + cserélhető `PricingEngine`** absztrakció hiánya valódi gap. Most:
- `BSMPricer` egyben tartja a market datat, a payoffot, a számítást
- `HestonPricer` ugyanígy

QuantLib-szerű decouple-elés: **`EuropeanOption` instrument + `AnalyticBSEngine` / `AnalyticHestonEngine` / `MCEngine` cserélhető**. Egy felhasználó:

```python
opt = EuropeanOption(payoff, exercise)
opt.pricing_engine = AnalyticBSEngine(market)
print(opt.NPV())
opt.pricing_engine = AnalyticHestonEngine(market, calibrated_heston)
print(opt.NPV())
```

Ehhez stochastic-rs-quantben:
```rust
trait Instrument {
  type Engine;
  fn npv<E: Self::Engine>(&self, engine: &E) -> f64;
}
```

**Ez P3-szintű architektúra** — nem release blocker, de "full-featured" claimhez 2.x roadmap-en kellene.

### 6.2. Konkrét hiányzó modellek/funkciók

| Terület | Hiány |
|---|---|
| FX | spot/forward delta convention (BBG/Reuters), butterfly/risk-reversal smile |
| Convertible bonds | nincs |
| Mortgage-backed securities (MBS) | nincs |
| Forward rate agreements (FRA) Greeks | csak árazás |
| Equity / equity baskets | basket Margrabe ✓, korreláció breakdown / shifted-Heston nincs |
| Asian / barrier exotic combinations | csak basic |
| Bermudan callable swaptions | LSM ✓, lattice via HW ✓ — kombinált payoff (callable + step-up coupon) nincs |
| Inflation linked swaps | ZC ✓, YoY ✓ — Black-Scholes-style options inflation rate-en nincs |
| CDS — survival prob bootstrap | ✅ ISDA daily-grid van |
| TRS (Total Return Swaps) | nincs |
| Variance swap | nincs (csak realized variance estimator) |
| Convexity adjustments (CMS, futures-spot) | Hagan linear-TSR ✓ — futures convexity nincs |

### 6.3. Felhasználói pipeline gap (real-life)

Egy "full-featured quant lib" tipikus end-to-end use case:

```
market quotes file (CSV/JSON)
  → bootstrap discount curve (RateHelper-ek)        ✅ van
  → bootstrap survival curve (CDS quotes)            ✅ van
  → calibrate vol-surface (Heston / SABR / Bates)    ✅ van
  → build vol-surface ImpliedVolSurface              ✅ van
  → price portfolio of instruments (mix)             ⚠️ Instrument trait nélkül macera
  → compute portfolio Greeks / VaR / CVaR            ✅ van (risk modul)
  → bucket DV01 / vega heatmap                       ⚠️ csak partial
  → write report (P&L explain)                       ❌ nincs
```

**RC.0 előtt** legalább **egy end-to-end példa** kell `examples/`-ban: market → calibration → instrument → price → Greeks → risk. A `BSM → IV → vol_surface` chain működik (van teszt is rá), de ez nem teljes pipeline.

---

## 7. beta.3 vs rc.0 javaslat

### Javaslat: **`v2.0.0-beta.3`** (2026-04-29 update: rc.0-ra már csak 2 nyitott item van)

#### Indoklás (2026-04-29 status)

| Kritérium | Ítélet |
|---|---|
| Kompilál default features-szel | ✅ |
| Tesztek átmennek (minden subcrate, fbm pinned seed-del stabil) | ✅ |
| Trait API stabilizált | ✅ Calibrator / CalibrationResult Result-based + type Params |
| Kritikus numerikai hiba | ✅ időegység bug javítva |
| Build/feature config helyesen propagálódik | ✅ |
| Python packaging release-kész | ✅ |
| docs.rs config | ✅ |
| docs / migration guide v1 → v2 | ⚠️ release notes kész, dedikált migration guide ⏳ |
| End-to-end példa | ⚠️ `examples/` van, dedikált pipeline-példa ⏳ |

**7/9 zöld; 2 lágy item (migration guide + e2e példa) marad rc.0-ra.**

#### beta.3 → rc.0 átállás kritériumai (2026-04-29 status)

`rc.0`-ra akkor érdemes lépni, ha:

1. ✅ **Időegység bug fixelt** és teszttel lefedve
2. ✅ **Date support kompletten átment** minden pricer-en (`tau_or_from_dates()` használat)
3. ✅ **`DistributionExt` döntés meghozva és végrehajtva** (`unimplemented!()` defaults)
4. ✅ **Python packaging** javítva
5. ✅ **Feature propagation** javítva: `gpu`, `cuda-native`, `metal`, `accelerate` továbbít
6. ✅ **docs.rs config** explicit feature lista
7. ✅ **fBM property test** seed-pinned
8. ✅ **`Calibrator` + `CalibrationResult` traitek** stabilizáltak (Result-based + type Params + type Error)
9. ⏳ **End-to-end pipeline példa** `examples/full_pipeline.rs` vagy hasonló — **még hiányzik**

---

## 8. Prioritizált akciólista

### beta.3 P0 (must-fix release előtt) — ✅ ALL DONE

- [x] ✅ **`calculate_tau_in_days()` bug** — átnevezés / törlés. 6 pricer (`bsm`, `heston`, `sabr`, `heston_stoch_corr`, `asian`, `vasicek` bond) javítva. `cir` bond override eltávolítva. IV regression tesztek hozzáadva.
- [x] ✅ **Date support** — `tau_or_from_dates()` mindenhol használt. Új teszt `bsm_dates_match_tau_pricing`.
- [x] ✅ **Feature propagation** — `gpu`, `cuda-native`, `metal`, `accelerate` továbbít a `stochastic-rs-stochastic`-ba.
- [x] ✅ **`docs.rs all-features = true`** → explicit lista.

### beta.3 P1 (release előtt erősen ajánlott)

- [x] ✅ **`DistributionExt` defaultok** — opció (b) `unimplemented!()` választva.
- [x] ✅ **Python packaging** — javítva.
- [x] ✅ **`MalliavinExt` / `Malliavin2DExt` ki a prelude-ból** — csak `crate::traits` namespace-ben maradnak.
- [x] ✅ **`PricerExt::implied_volatility` default `0.0`** → `f64::NAN`.
- [x] ✅ **fBM property test** — pinned seed-del stabil.
- [ ] **Migration guide** docs/V1_TO_V2.md (path renames, ArrayView migration, prelude, workspace splits). ⏳ Még nyitva.

### beta.3 P2 (jó, de halasztható rc.0-ra) — ✅ MIND DONE (egy kivétellel)

- [x] ✅ `Calibrator` trait kibővítése: `Result<Output, Error>`, `type Params`, `type Error`. Inherent `*Calibrator::calibrate` privát `solve()`-ra átnevezve, így a trait az egyetlen publikus belépési pont.
- [x] ✅ `CalibrationResult` kibővítése: `type Params: Clone` + `params()`, `iterations()`, `message()`, `max_error()`.
- [x] ✅ ~~`GreeksExt` + 11 impl~~ — pontosított: csak 5 pricer-nek van inherent Greek-je, mind kötve. Helyett `vanna`/`charm`/`volga`/`veta` 2nd-order Greeks hozzáadva. MC pricerek `greeks()`-et override-olják a single-pass konzisztenciáért.
- [x] ✅ `derivatives() -> Vec<f64>` → **törölve**, helyébe `GreeksExt::greeks() -> Greeks` aggregator.
- [ ] Orphan modulok integráció: `microstructure::AlmgrenChriss` → `risk::execution_cost` valós feedback. ⏳ Még nyitva.

### rc.0 (még tovább, post-beta.3)

- [ ] **End-to-end pipeline példa** — `examples/full_pipeline.rs`: market quotes JSON → bootstrap → calibration → vol-surface → price portfolio → Greeks/VaR. Egy RC-jelölt élet azt bizonyítja hogy a 9 sub-crate **összeáll**.
- [ ] **`Instrument` + `PricingEngine`** decouple — 6.1 pont, ezt korai 2.x roadmap-on (talán 2.1.0 minor).
- [ ] FX delta conventions, variance swaps, total return swaps (6.2).
- [ ] AI bridge: `*Nn::predict_surface()` → `ImpliedVolSurface` (P2/14).
- [ ] Python coverage: quant pricers, kalibrátorok, AI (P2/15).

### v2.x későbbi

- [ ] GPU pipeline drága modellekre (Heston, RoughBergomi, Cir2F, Bgm, Hjm) — process.rs:46-48 jelölve.
- [ ] `Sde<F,G>` generikus solver vs konkrét processek döntés (P3/17).
- [ ] CallableExt / CancellableExt traitek path-dependent strukturák cross-impl-jéhez.

---

## Függelék

### F1 — Trait-impl statisztika (verifikált)

| Trait | Definíció | Impl szám | Megjegyzés |
|---|---|---|---|
| `ProcessExt<T>` | `stochastic-rs-stochastic/traits/process.rs:49` | 113 | Erős |
| `BivariateExt` | `stochastic-rs-copulas/traits/bivariate.rs` | 4 | Tisztességes |
| `PricerExt` | `stochastic-rs-quant/traits/pricing.rs:5` | 14 | OK |
| `ModelPricer` | `stochastic-rs-quant/traits/pricing.rs:25` | 14 (3 + 11 FourierModelExt blanket) | Erős |
| `FourierModelExt` | (külön) | 11 | OK |
| `ToModel` | `stochastic-rs-quant/traits/calibration.rs:19` | 13 | Erős |
| `ToShortRateModel` | `stochastic-rs-quant/traits/calibration.rs:33` | 1 (HW) | OK kezdetnek |
| `Calibrator` | `stochastic-rs-quant/traits/calibration.rs:51` | 9 | OK |
| `CalibrationResult` | `stochastic-rs-quant/traits/calibration.rs:68` | 12 | Erős |
| `GreeksExt` | `stochastic-rs-quant/traits/pricing.rs:56` | 5 | Vékony |
| `DistributionExt` (in distributions) | `stochastic-rs-distributions/traits/distribution.rs:7` | 3 | Default-okban hibás (lásd 4.3) |
| `DistributionExt` (in stochastic) | ugyanaz | 1 (Gbm) | Furcsa hely (process implementing distribution trait) |
| `MalliavinExt<T>` | `stochastic-rs-stochastic/traits/malliavin.rs` | 0 | Deferred |
| `Malliavin2DExt<T>` | ugyanaz | 0 | Deferred |
| `OneDimensional<T>` | `stochastic-rs-stochastic/traits/process.rs:92` | blanket — auto | OK |
| `TwoDimensional<T>` | ugyanott:117 | blanket — auto | OK |
| `MultiDimensional<T,N>` | ugyanott:103 | blanket — auto | OK |
| `CurveOutput<T>` | ugyanott:127 | blanket — auto | OK |

### F2 — Új blockerek summary (mind ✅ lezárva 2026-04-29-ig)

| # | Súlyosság | Tétel | Hely | Status |
|---|---|---|---|---|
| 4.1 | ~~⛔ kritikus~~ | calculate_tau_in_days bug | 6 pricer | ✅ |
| 4.2 | ~~⛔ kritikus~~ | Date support partial | bsm.rs, heston.rs | ✅ |
| 4.3 | ~~🔥 magas~~ | DistributionExt false defaults | distributions/traits/distribution.rs | ✅ |
| 4.4 | ~~🔥 magas~~ | Python packaging incongruent | pyproject.toml + stochastic-rs-py | ✅ |
| 4.5 | ~~🔥 magas~~ | Feature propagation broken | Cargo.toml:308-335 | ✅ |
| 4.6 | ~~⚠️ közepes~~ | docs.rs all-features risky | Cargo.toml:291 | ✅ |
| 4.7 | ~~⚠️ közepes~~ | fBM flaky property test | process/fbm.rs:250 | ✅ |

### F3 — Audit kontextus

- **Előző audit:** `docs/API_AUDIT_2026-04.md` (2026-04-26, beta.1 ellen)
- **Beta.1 → beta.2 changelog:** PR #23 (workspace migration), 15 commit
- **Beta.2 → beta.3 várható:** ~25-40 commit (P0 fixek, P1 lényegi része)
- **Codex independent pass:** `task-moihnw0d-ob39p4` (gpt-5.5 xhigh, 5m 39s)
- **Verifikálás:** cargo check/clippy/test minden subcrate-en, közvetlen olvasás trait/calibrator/pricer fájlok, 2 független impl-szám pass (Explore agent + codex + manual grep verification)

---

*Audit kelt: 2026-04-28 — `git rev-parse HEAD`: `477cea2` ("fix: publish crate")*

*Fix-pass log: 2026-04-29 — section 4 (P0/1–7) és section 5 (5.3, 5.4, 5.5, 5.7, 5.9, 5.10) lezárva. Nyitott rc.0-blocker: dedicated v1→v2 migration guide + end-to-end pipeline példa. 356/356 quant-lib teszt zöld.*
