# Atlas data dictionary

All JSON files are arrays. Amount fields are unrounded USD numbers; rates and fee fractions are decimal fractions; month fields are whole months. `null` is JSON null. CSV represents null as a blank cell (a numeric zero remains `0`).

## `comparisons`

Each row is one hypothetical loan against one fixed current-debt baseline. `scenario_id` is `baseline_id-n{term}-r{ratePercent}-f{feePercent}` and `baseline_id` is `c{currentRatePercent}-p{payment}`. `dataset_version` and `method_version` identify the frozen inputs/method. `current_balance`, `current_rate`, `current_payment`, `loan_rate`, `loan_fee_fraction`, and `loan_term_months` are inputs. `principal` is the gross loan, `fee` is `principal * loan_fee_fraction`, and `net_cash` is principal minus fee. The remaining amount/payment/month fields are full-precision modeled results and signed loan-minus-current deltas. `cost_label` and `payment_label` are `lower`, `equal`, or `higher`, using the configured one-cent tolerance; `time_label` is `shorter`, `equal`, or `longer` using integer months.

## `rate-boundaries` and `fee-boundaries`

`boundary_id` begins `rb-` or `fb-`; all other baseline/version/current fields have the same meanings as above. `loan_term_months` is fixed. Rate boundaries set `loan_fee_fraction` and leave `loan_rate` null; fee boundaries set `loan_rate` and leave `loan_fee_fraction` null. `family` is `rate_boundary` or `fee_boundary`.

`solution` contains the configured domain as `domain_low` and `domain_high`, its retained signed numerical endpoints `low` and `high`, signed `delta_low` and `delta_high` (loan total paid minus current total paid), `root`, `residual`, and `iterations`. `root` is null for non-root states. `status` is exactly one of `root_in_range`, `equal_at_lower`, `equal_at_upper`, `no_savings_in_range`, `savings_throughout_range`, or `invalid`. CSV flattens these as `solution_*` fields. Endpoint-only roots retain their endpoint as `root`; nonroot residuals are null.
