# GMX E1 monitor - tick data column key

One JSON object per line, one line per ~120 s poll of the GMX v2
DataStore on Arbitrum. CSV downloads flatten nested fields into
dotted column names (markets.BTC.s_usd). All dollar quantities are
USD. Sign convention for the ledger: LP-LOSS-POSITIVE (a positive
X/dX/D means liquidity providers lost to traders on marks). Skew
sign: positive = net long open interest.

## Start here: the core risk set

These ~15 columns reproduce the dashboard headline state.

| column | meaning |
| --- | --- |
| ts_iso / ts_unix | poll time (UTC) |
| markets.{M}.s_usd | market M skew in USD, signed (net_tokens * index_price) |
| state.X | cumulative marked LP P&L this epoch, LP-loss-positive |
| state.D | X minus the anchor taken when the current incident opened |
| state.C_mark | banked (one-way) incident harm; only grows, at incident close |
| exit.tail | stressed forward-loss term of the safety test |
| exit.numerator | TaR = max(state.D, 0) + state.C_mark + exit.tail |
| bnet.b_net_usd | the budget B_net the test compares against |
| exit.u | THE DIAL: exit.numerator / bnet.b_net_usd; RED condition is u >= 1 |
| exit.red | true when u >= 1 on this tick |
| state.machine | IDLE / INCIDENT / RED_LATCHED - the safety state machine |
| state.incident_id | current incident number (claims accounting unit) |
| pre_gate.armed | early-warning: lhs crossed arm threshold |
| exit.projected_time_to_red_h | hours to u = 1 at the current drift, if finite |

Identities an analyst (or LLM) can verify per row:
u = numerator / b_net_usd; numerator = max(D, 0) + C_mark + tail;
s_usd = net_tokens * index_price; D = X - (anchor X at incident open).

## markets.{BTC|ETH|SOL}.* - per-market chain reads

| column | meaning |
| --- | --- |
| long_tokens / short_tokens | open interest per side, in tokens |
| net_tokens | long - short: the skew, token space |
| s_usd | skew in USD (net_tokens * index_price), signed |
| index_price | oracle index price at the poll |
| px_min / px_max / range_n | min/max price over range_n (16) reads inside the poll |
| impact_pool_tokens / _usd | price-impact escrow pool (feeds the budget basis) |
| r | per-poll log return of index_price |
| dt_r_h | horizon of that return, hours (~0.033 h = 2 min) |
| sigma_ewma | EWMA volatility of r, per sqrt(hour) |
| sigma_range | range-based volatility estimate |
| sigma_floor | governed floor for this market |
| sigma_gate | max(ewma, range, floor) - the value the risk test uses |
| sigma_warm | estimator warmed up (enough samples) |

## state.* - the harm ledger and state machine

| column | meaning |
| --- | --- |
| X | cumulative marked LP P&L, epoch-to-date, LP-loss-positive |
| dX | this tick's increment of X |
| D | X - incident anchor (0-referenced at incident open) |
| M | running max of D inside the incident (peak harm) |
| C_mark | banked harm: at incident close, max(M, 0) adds here; never decreases within the epoch |
| V | total open notional across markets |
| a_exposure | exposure-weighted activity term used by drag |
| drag | expected-cost drag term of the projection |
| incident_id / incident_t0 | current incident number and open timestamp |
| labels_open.{M} | per-market episode label currently open (|S| above E_hi hysteresis) |
| machine | IDLE / INCIDENT / RED_LATCHED |
| red_reason | which trigger latched red (e.g. exit_test_u_ge_1) |
| red_class | v0.12+: 'structural' (marked-actual breach; instant latch) or 'projected' (forecast breach; 600 s dwell). Absent before 2026-07-27 ~20:00Z |
| red_subsided_s | v0.12+: seconds u has been back below 1 while latched (hold-clear needs >= 600) |
| close_quiet_s | seconds all labels have been quiet toward incident close |
| partial | tick computed with partial data |

## exit.* - the safety (exit-cost) test

| column | meaning |
| --- | --- |
| u | the dial (see core set) |
| numerator | TaR (see core set) |
| tail | k95 * sqrt(dv_exit)-shaped stressed forward-loss term |
| tar.k95 | calibrated 95th-percentile impact coefficient |
| dv_exit | stressed exit volume driving the tail |
| a_now | current activity input to the projection |
| sigma_stress.{M} | per-market stressed volatility used in the tail |
| red | u >= 1 this tick |
| red_equivalent_reason | non-u condition treated as red (e.g. invalid budget), else null |
| yellow_latched / yellow_lead | early-warning yellow states (lead-time trigger) |
| projected_time_to_red_h | hours to u = 1 at current drift (null/inf if not approaching) |

## bnet.* - the budget side

| column | meaning |
| --- | --- |
| b_net_usd | B_net: the loss budget the test divides by |
| pool_cash_usd | impact-pool cash basis across markets |
| basis_usd | budget basis before deductions |
| boost_deducted_usd | APR-boost funding carve-out removed from the basis |
| funding_source | where the boost funds from (e.g. pool_funded) |
| partial / nonpositive | data-quality flags; nonpositive B_net is a red-equivalent |

## pre_gate.* - the early-warning arm

| column | meaning |
| --- | --- |
| lhs | max(X - anchor_x floored, 0) + C_mark + tail over the trailing window |
| arm_threshold | arm_frac * B_net (0.5 * B_net) |
| armed | lhs crossed the threshold (v0.14: stays armed until lhs < 0.475 * B_net) |
| margin_ok | not armed; required for incidents to quiet-close |
| d_prov | the floored provisional-anchor D term inside lhs |
| anchor_ts / anchor_x | the trailing-window anchor used for d_prov |

## lp_outflow.* - LP withdrawal watch

| column | meaning |
| --- | --- |
| frac.{M} | net LP outflow fraction per market over the watch window |
| aggregate_frac | portfolio-level outflow fraction |
| flag / latched | threshold crossed / latched |
| stale / summary_age_h | freshness of the flow summary feeding this |

## Provenance and plumbing (singletons)

| column | meaning |
| --- | --- |
| seq | monotone tick counter this run/epoch |
| block | Arbitrum block of the reads |
| price_ts_unix | oracle price timestamp |
| config_md5 | md5 of the governing gates file - ties every row to exact parameters |
| schema | tick schema id (a6b-flows-1) |
| run_id | loop process identity (restart forensics) |
| source / rpc / referee | read path (datastore via primary RPC; referee disagreements if any) |
| dry_run | monitor writes nothing on-chain (always true in shadow) |
| ok / errors | tick health; errors is a list (JSON-string cell in CSV) |
| read_ms / dt_s / dt_wall_s / poll_target_s | timing telemetry |
| resumed_from | checkpoint resume marker after restarts |

## ttr_snapshot.json (the dashboard TTR tile)

Trailing-7d balancer study summary per market: n (displacement events
at/above bar_usd), coverage_pct (share answered by a program desk
within 60 min with a >= 25% counter-trade), resp_med_m /
resp_any_med_m / rec_med_m (median minutes to program response / any
response / half-retrace recovery; null = the median case exceeded 60
min), rec_cens_pct (share not recovered at 60 min), computed_at,
window t0/t1.

## Notes

- Schema grows additively; days before 2026-07-27 ~20:00Z lack the
  v0.12 red fields. Range CSVs use one union header; missing = blank.
- Today's file is partial through the newest tick.
- Excluded from the public export by design: alert/ack ledgers, the
  operator control file, balancer roster and any addresses, per-fill
  TTR event data.
