ECG Record schema 1.1 — field reference

Emitted by this release: 1.1.0. Readers accept schema major 1. JSON Schema: ecgfeat/schemas/ecg-record/1.1/schema.json ($id urn:ecg-record:1.1).

Validation tiers come only from the shipped registry (validation-evidence.json); a field can claim more than unvalidated only by citing an evidence manifest (see tools/check_validation_registry.py).

Published fields

Pointer Profiles Validation (ceiling) Evidence Validated for Engine source Known limitations
/delineation/fiducials/p_onset summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/p/onset P-wave delineation is the weakest endpoint in the repository's LUDB/QTDB benchmarks; P waves are frequently missed at short RR (<600 ms) or when the P wave overlaps the preceding T wave.
/delineation/fiducials/p_peak all, debug unvalidated (benchmark_validated) — — /beat_features/*/p/peak P-wave delineation is the weakest endpoint in the repository's LUDB/QTDB benchmarks; P waves are frequently missed at short RR (<600 ms) or when the P wave overlaps the preceding T wave.
/delineation/fiducials/p_offset summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/p/offset P-wave delineation is the weakest endpoint in the repository's LUDB/QTDB benchmarks; P waves are frequently missed at short RR (<600 ms) or when the P wave overlaps the preceding T wave.
/delineation/fiducials/qrs_onset summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/qrs/onset —
/delineation/fiducials/r_peak summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/r_peak_index —
/delineation/fiducials/qrs_offset summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/qrs/offset —
/delineation/fiducials/j_point summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/j_index —
/delineation/fiducials/t_offset summary, all, debug benchmark_validated (benchmark_validated) ludb-t-offset-lead-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the LUDB 1.0.1 population, input_mode standard_12, default configuration; per-beat, per-lead cell paired with the expert annotation of the same lead; CSE delineation tolerance: error SD not above 30.6 ms /beat_features/*/t/offset LUDB vs expert reference: mean +4.8 ms, SD 28.1 ms (n=19393), beat x lead cells, CSE tolerance 30.6 ms, sensitivity 99.4%.
/delineation/fiducials/t_onset all, debug unvalidated (benchmark_validated) — — /beat_features/*/t/onset T onset bounds the ST segment for display and J-point search only; no published interval is derived from it and it has no LUDB/QTDB benchmark here.
/delineation/fiducials/t_peak all, debug unvalidated (benchmark_validated) — — /beat_features/*/t/peak —
/measurements/intervals/p_duration_ms summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/p_dur_ms P-wave delineation is the weakest endpoint in the repository's LUDB/QTDB benchmarks; P waves are frequently missed at short RR (<600 ms) or when the P wave overlaps the preceding T wave.
/measurements/intervals/pr_interval_ms summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/pr_ms P-wave delineation is the weakest endpoint in the repository's LUDB/QTDB benchmarks; P waves are frequently missed at short RR (<600 ms) or when the P wave overlaps the preceding T wave.
/measurements/intervals/qrs_duration_ms summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/qrs_ms Per-beat per-lead QRS width; the record-level consensus QRS can differ from per-lead widths near 100-120 ms.
/measurements/intervals/qt_interval_ms summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/qt_ms Raw measured interval; it is not formal QT reporting and is not rate corrected.
/measurements/intervals/tpeak_tend_ms summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/tpe_ms —
/measurements/intervals/jt_interval_ms all, debug unvalidated (benchmark_validated) — — /beat_features/*/jt_ms —
/measurements/amplitudes/p_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/p_amp_mv LUDB distributes amplitude-normalised signals, so LUDB results cannot validate amplitudes. P-wave delineation is the weakest endpoint in the repository's LUDB/QTDB benchmarks; P waves are frequently missed at short RR (<600 ms) or when the P wave overlaps the preceding T wave.
/measurements/amplitudes/r_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/r_amp_mv LUDB distributes amplitude-normalised signals, so LUDB results cannot validate amplitudes.
/measurements/amplitudes/s_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/s_amp_mv LUDB distributes amplitude-normalised signals, so LUDB results cannot validate amplitudes.
/measurements/amplitudes/st_80ms_uv summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/st_80ms_mv LUDB distributes amplitude-normalised signals, so LUDB results cannot validate amplitudes. Legacy native ST level at J+80 ms on the analysis signal; the opt-in hybrid ST sources do not replace this published value.
/measurements/amplitudes/t_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/t_amp_mv LUDB distributes amplitude-normalised signals, so LUDB results cannot validate amplitudes.
/measurements/amplitudes/u_amplitude_uv all, debug unvalidated (benchmark_validated) — — /beat_features/*/u_amp_signed_mv LUDB distributes amplitude-normalised signals, so LUDB results cannot validate amplitudes.
/measurements/areas/qrs_signed_area_uv_ms summary, all, debug unvalidated (benchmark_validated) — — /beat_features/*/qrs_signed_area Trapezoid integral of the baseline-subtracted analysis signal over [QRS onset, QRS offset] inclusive; legacy unit mV x internal sample converted by 1e6 / internal_fs.
/measurements/global/heart_rate_bpm summary, all, debug indirectly_validated (benchmark_validated) ptbxl-heart-rate-bpm-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the PTB-XL 1.0.1 patient-disjoint hold-out (3,000 records), input_mode standard_12, default configuration; record-level value; agreement with GE 12SL; criterion: CSE-trimmed SD not above the Uni-G minus 12SL SD and |mean| not above max(|Uni-G minus 12SL mean|, 1 /min) /global_features/heart_rate_bpm PTB-XL hold-out vs GE 12SL (indirect): mean +0.0 /min, SD 0.8 /min (n=2992); Glasgow Uni-G vs 12SL on the same records: mean -0.5 /min, SD 1.2 /min.
/measurements/global/frontal_qrs_axis_deg summary, all, debug indirectly_validated (benchmark_validated) ptbxl-frontal-qrs-axis-deg-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the PTB-XL 1.0.1 patient-disjoint hold-out (3,000 records), input_mode standard_12, default configuration; record-level value; agreement with GE 12SL; criterion: CSE-trimmed SD not above the Uni-G minus 12SL SD and |mean| not above max(|Uni-G minus 12SL mean|, 1 deg) /global_features/qrs_axis_deg not_applicable(input_mode_limited) for limited input. PTB-XL hold-out vs GE 12SL (indirect): mean -0.5 deg, SD 5.6 deg (n=2991); Glasgow Uni-G vs 12SL on the same records: mean +0.1 deg, SD 6.7 deg.
/measurements/global/qtc_bazett_ms summary, all, debug unvalidated (benchmark_validated) — — /global_features/qtc_bazett_ms Formal QTc; not_applicable(input_mode_limited) for limited input.
/measurements/global/qrs_wide_ms all, debug unvalidated (benchmark_validated) — — /global_features/qrs_wide_ms —
/measurements/flags/p_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/p Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/qrs_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/qrs Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/q_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/q Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/r_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/r Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/s_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/s Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/r_prime_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/r_prime Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/s_prime_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/s_prime Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/t_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/t Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/flags/u_present all, debug unvalidated (benchmark_validated) — — /beat_features/*/wave_observations/u Algorithm observation, not proof of physiological absence; read the per-cell reason and scope.
/measurements/global/p_duration_ms summary, all, debug benchmark_validated (benchmark_validated) ludb-p-duration-ms-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the LUDB 1.0.1 population (adults and children, sinus and non-sinus rhythms), input_mode standard_12, default configuration; record-level value; IEC 60601-2-25 global-interval limits ±10/15 ms after CSE trimming /global_features/p_duration_ms Record-level value from the engine's global measurement; read the feature state before use. LUDB vs expert reference: mean -0.1 ms, SD 11.8 ms (n=167).
/measurements/global/pr_interval_ms summary, all, debug benchmark_validated (benchmark_validated) ludb-pr-interval-ms-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the LUDB 1.0.1 population (adults and children, sinus and non-sinus rhythms), input_mode standard_12, default configuration; record-level value; IEC 60601-2-25 global-interval limits ±10/10 ms after CSE trimming /global_features/pr_ms Record-level PR; withheld when lead-level P onsets conflict. LUDB vs expert reference: mean +2.9 ms, SD 5.5 ms (n=165).
/measurements/global/qrs_duration_ms summary, all, debug benchmark_validated (benchmark_validated) ludb-qrs-duration-ms-record-1.1, ptbxl-qrs-duration-ms-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the LUDB 1.0.1 population (adults and children, sinus and non-sinus rhythms), input_mode standard_12, default configuration; record-level value; IEC 60601-2-25 global-interval limits ±10/10 ms after CSE trimming /global_features/qrs_ms Record-level value from the engine's global measurement; read the feature state before use. LUDB vs expert reference: mean +2.8 ms, SD 6.3 ms (n=192). PTB-XL hold-out vs GE 12SL (indirect): mean -0.1 ms, SD 7.8 ms (n=2992), within the same limits.
/measurements/global/qt_interval_ms summary, all, debug benchmark_validated (benchmark_validated) ludb-qt-interval-ms-record-1.1, ptbxl-qt-interval-ms-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the LUDB 1.0.1 population (adults and children, sinus and non-sinus rhythms), input_mode standard_12, default configuration; record-level value; IEC 60601-2-25 global-interval limits ±25/30 ms after CSE trimming /global_features/qt_ms Record-level QT from the multilead T-end fusion; check the feature state (qt_not_reportable marks a value that failed the QT reportability gate). About 30% of values carry a non-observed feature state (QT reportability gate); they are included in the evidence above; read the state before using a value. LUDB vs expert reference: mean +9.9 ms, SD 9.9 ms (n=192). PTB-XL hold-out vs GE 12SL (indirect): mean +0.5 ms, SD 13.5 ms (n=2983), within the same limits.
/measurements/global/qtc_fridericia_ms summary, all, debug unvalidated (benchmark_validated) — — /global_features/qtc_fridericia_ms Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/qtc_framingham_ms all, debug unvalidated (benchmark_validated) — — /global_features/qtc_framingham_ms Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/qtc_hodges_ms all, debug unvalidated (benchmark_validated) — — /global_features/qtc_hodges_ms Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/p_axis_deg summary, all, debug indirectly_validated (benchmark_validated) ptbxl-p-axis-deg-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the PTB-XL 1.0.1 patient-disjoint hold-out (3,000 records), input_mode standard_12, default configuration; record-level value; agreement with GE 12SL; criterion: CSE-trimmed SD not above the Uni-G minus 12SL SD and |mean| not above max(|Uni-G minus 12SL mean|, 1 deg) /global_features/p_axis_deg Withheld when the median-beat P wave fails or the rhythm has no organized P waves. PTB-XL hold-out vs GE 12SL (indirect): mean +0.8 deg, SD 11.3 deg (n=2589); Glasgow Uni-G vs 12SL on the same records: mean +0.7 deg, SD 14.1 deg.
/measurements/global/t_axis_deg summary, all, debug indirectly_validated (benchmark_validated) ptbxl-t-axis-deg-record-1.1 Resting 10 s, 500 Hz, 12-lead ECGs of the PTB-XL 1.0.1 patient-disjoint hold-out (3,000 records), input_mode standard_12, default configuration; record-level value; agreement with GE 12SL; criterion: CSE-trimmed SD not above the Uni-G minus 12SL SD and |mean| not above max(|Uni-G minus 12SL mean|, 1 deg) /global_features/t_axis_deg Hybrid area/amplitude T axis; unreliable at low T amplitude (feature state t_axis_quality_gate). PTB-XL hold-out vs GE 12SL (indirect): mean -0.1 deg, SD 11.8 deg (n=2921); Glasgow Uni-G vs 12SL on the same records: mean -0.9 deg, SD 17.7 deg.
/measurements/global/qrs_t_angle_deg all, debug unvalidated (benchmark_validated) — — /global_features/qrs_t_angle_deg Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/atrial_rate_bpm summary, all, debug unvalidated (benchmark_validated) — — /global_features/atrial_rate_bpm Rate of detected atrial events; in AF/AFL it reflects the detector, not a physiological atrial rate.
/measurements/global/heart_rate_min_bpm all, debug unvalidated (benchmark_validated) — — /global_features/heart_rate_min_bpm Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/heart_rate_max_bpm all, debug unvalidated (benchmark_validated) — — /global_features/heart_rate_max_bpm Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/rr_mean_ms all, debug unvalidated (benchmark_validated) — — /global_features/rr_mean_ms Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/rr_sd_ms all, debug unvalidated (benchmark_validated) — — /global_features/rr_sd_ms Standard deviation of RR intervals over the record; ectopic beats are not excluded.
/measurements/global/rmssd_ms all, debug unvalidated (benchmark_validated) — — /global_features/rmssd_ms Short-record HRV; a 10 s record holds few intervals and ectopic beats are not excluded.
/measurements/global/pnn50 all, debug unvalidated (benchmark_validated) — — /global_features/pnn50 Fraction (0-1) of successive RR differences above 50 ms; a 10 s record holds few intervals.
/measurements/global/rr_cv all, debug unvalidated (benchmark_validated) — — /global_features/rr_cv Coefficient of variation of RR intervals (0-1 fraction).
/measurements/global/qt_dispersion_ms all, debug unvalidated (benchmark_validated) — — /global_features/qt_dispersion_ms Record-level value from the engine's global measurement; read the feature state before use.
/measurements/global/ptf_v1_uv_ms all, debug unvalidated (indirectly_validated) — — /global_features/ptf_v1_mv_ms P-terminal force in V1 (negative terminal P amplitude x duration), median beat.
/measurements/global/sokolow_lyon_uv all, debug unvalidated (indirectly_validated) — — /representative_leads/*/params/{s_amp_mv,r_amp_mv} S(V1) + max(R(V5), R(V6)) on median-beat amplitudes; a voltage measurement, not an LVH statement.
/measurements/global/cornell_voltage_uv all, debug unvalidated (indirectly_validated) — — /representative_leads/*/params/{r_amp_mv,s_amp_mv} R(aVL) + S(V3) on median-beat amplitudes; a voltage measurement, not an LVH statement.
/measurements/global/paced_beat_fraction all, debug unvalidated (indirectly_validated) — — /metadata/paced_beat_fraction Fraction (0-1) of beats with a confirmed pacing spike.
/measurements/global/pacing_spike_count all, debug unvalidated (indirectly_validated) — — /global_features/pacing_spikes Number of pacing spikes accepted by the revised detector.
/measurements/global/organized_p_fraction all, debug unvalidated (indirectly_validated) — — /metadata/rhythm_analysis/af_afl_summary/organized_p_ratio Fraction (0-1) of beats with an organized, conducted P wave (atrial rhythm evidence).
/measurements/global/atrial_residual_rms_uv all, debug unvalidated (indirectly_validated) — — /metadata/rhythm_analysis/atrial_residual/residual_rms_mv RMS of the QRST-subtracted atrial residual; fibrillatory-wave evidence, sensitive to noise.
/measurements/global/atrial_dominant_cycle_ms all, debug unvalidated (indirectly_validated) — — /metadata/rhythm_analysis/atrial_residual/dominant_cycle_ms Dominant cycle length of the atrial residual; flutter/fibrillation evidence, not a rhythm label.
/measurements/intervals/rr_interval_ms summary, all, debug unvalidated (benchmark_validated) — — /beats/*/rr_prev_ms Interval from the previous beat's R sample; the first beat is not_applicable.
/measurements/intervals/median_p_duration_ms all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/p_dur_ms Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/intervals/median_pr_interval_ms all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/pr_ms Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/intervals/median_qrs_duration_ms all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/qrs_ms Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/intervals/median_qt_interval_ms all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/qt_ms Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/intervals/median_q_duration_ms all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/q_duration_ms Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_p_amplitude_uv all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/p_amp_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_q_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/q_amp_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_r_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/r_amp_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_s_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/s_amp_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_r_prime_amplitude_uv all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/r_prime_amp_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_st_j_uv summary, all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/st_on_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_st_40ms_uv all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/st_mid_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_st_60ms_uv summary, all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/st_hybrid_60ms_mv ST level 60 ms after the global J point on the median beat; published only when the global ST path ran.
/measurements/amplitudes/median_st_80ms_uv all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/st_80ms_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/amplitudes/median_t_amplitude_uv summary, all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/t_amp_mv Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.
/measurements/areas/median_qrs_signed_area_uv_ms all, debug unvalidated (benchmark_validated) — — /representative_leads/*/params/qrs_signed_area_uv_ms Median (representative) beat of the dominant non-paced group, measured inside the global QRS window; differs from per-beat cells.

Debug-only and capped quantities

Quantity Tier Ceiling Reason
/debug/st_morphology internal_debug known_problem The four-class ST morphology was never validated and is anti-correlated with ischemia; it must not be used as ischemia evidence.
/debug/st_pattern_class internal_debug unvalidated No stable definition or validation.
/debug/st_t_confusion internal_debug unvalidated No stable definition or validation.
st_hybrid_* internal_debug unvalidated Experimental opt-in ST bypass (22 legacy keys); may appear only in debug output.
twelve_sl_* internal_debug unvalidated Vendor-style compatibility block (16 legacy keys); not part of the core schema.

Top-level members

Member Required
schema_version yes
profile yes
record_id yes
intended_use no
acquisition yes
axes yes
quality yes
provenance yes
delineation yes
measurements yes
artifacts yes
metadata no
debug no
extensions no

Absence states

Plain null (no stronger claim), unmeasurable(reason) and not_applicable(reason). Dense fields encode reasons as a whole-field {kind, reason}, a per-field default state, and sparse <beat_id>|<lead> maps that override it.