schema_version: geometry-protocol.v1
protocol_id: road-risk-model-3.2-geometry-evidence
model_version: 3.2.0
status: frozen-before-reviewed-geometry-and-outcome-analysis
frozen_at: 2026-08-28T00:00:00Z
change_control:
  thresholds_may_be_tuned_against_collision_outcomes: false
  threshold_change_requires_new_geometry_protocol: true
  material_algorithm_change_requires_new_model_version: true
coordinate_processing:
  sanitize_non_finite_coordinates: true
  consecutive_duplicate_tolerance_m: 0.01
  retain_original_vertices_as_observed: true
  projection: wgs84-ecef-enu
  projection_origin: length_weighted_road_centroid
  station_resampling_m: 5
  interpolated_points_are_measurements: false
  hidden_coordinate_smoothing: forbidden
curvature:
  primary_support_window_m: 25
  sensitivity_support_windows_m: [15, 25, 35]
  signed_heading_change: atan2_sin_delta_cos_delta
  local_estimator: centred_three_point_circumcurvature
  headline_bin_statistic: p95_absolute_supported_curvature
  contextual_statistic: median_absolute_supported_curvature
classification:
  insufficient:
    minimum_distinct_coordinates: 2
    minimum_usable_length_m: 25
  near_straight:
    maximum_absolute_turn_degrees: 3
    maximum_chord_deviation_m: 0.75
  reverse_curve:
    minimum_positive_curvature_coverage_m: 20
    minimum_negative_curvature_coverage_m: 20
  single_arc:
    minimum_stable_sign_share: 0.85
    circle_quality_gates_must_pass: true
  fallback: compound
circle_fit:
  initializer: algebraic_least_squares
  optimizer: geometric_least_squares_orthogonal_radial_residual
  minimum_resampled_points: 5
  minimum_observed_arc_degrees: 10
  maximum_residual_p95_m: 3
  maximum_radius_spread_across_support_windows_fraction: 0.5
  maximum_iterations: 30
  authoritative_global_circle_for_compound_or_reverse: false
binning:
  target_length_m: 100
  merge_tail_shorter_than_m: 25
  maximum_final_bin_length_m: 125
  stable_id_fields: [source_road_identity, start_station_m, end_station_m, geometry_hash]
  aggregation: length_weighted_mean_of_available_bin_indices
  selected_bin_changes_headline: false
  whole_road_circle_drives_headline: false
synthetic_suite:
  radii_m: [15, 30, 60, 100, 250, 500, 1000, 5000]
  arc_spans_degrees: [5, 10, 20, 45, 90, 180]
  required_shapes:
    - exact_circle
    - straight
    - nearly_straight
    - uneven_vertices
    - duplicate_vertices
    - reversed_geometry
    - gaussian_noise
    - isolated_outlier
    - compound_curve
    - reverse_curve
    - transition_like_curve
    - very_short_selection
    - long_road
  invariances: [translation, rotation, direction_reversal, resampling_density, segment_splitting]
numerical_gates:
  exact_arc_minimum_span_degrees: 20
  exact_arc_maximum_relative_radius_error: 0.01
  direction_reversal_preserves: [absolute_curvature, radius, annual_comparative_index, classification]
  direction_reversal_flips: [signed_turn, signed_curvature]
  straight_accepts_finite_circle: false
  reverse_accepts_authoritative_global_circle: false
  deterministic_rejection_reasons_required: true
  deterministic_evidence_hash_required: true
reviewed_geometry_set:
  collision_outcomes_visible_to_reviewers: false
  required_classes: [near-straight, single-arc, compound, junction-adjacent, reverse-curve]
  status: pending
evidence_boundary:
  geometry_verification_is_collision_validation: false
  sensitivity_is_empirical_confidence_interval: false
  unmodelled:
    - superelevation
    - crossfall
    - gradient
    - sight_distance
    - lane_level_paths
    - roadside_obstructions
