{
  "schema": "kinwit.facts.v1",
  "case_id": "SIM-2026-0002",
  "engine": "kinwit-facts/0.1.0",
  "analysis_status": "COMPLETE",
  "cross_source_ordering": "INDETERMINATE",
  "findings": [
    {
      "finding_id": "F-001",
      "category": "observed_sequence",
      "title": "Recorded sequence",
      "statement": "E-003 Facility controller records zone safety input ESTOP-ZONE-B2 open → E-004 Facility controller broadcasts stop request to zone approach group → E-005 Robot safety I/O registers external stop input → E-008 Zero velocity command recorded on /cmd_vel → E-009 Odometry reports speed < 0.01 m/s held ≥ 200 ms. At least one step's order is not determinate within clock uncertainty.",
      "variables": {
        "E-003→E-004": "BEFORE",
        "E-004→E-005": "INDETERMINATE",
        "E-005→E-008": "BEFORE",
        "E-008→E-009": "BEFORE"
      },
      "formula": "pairwise interval relations along the chain",
      "supporting_event_ids": [
        "E-003",
        "E-004",
        "E-005",
        "E-008",
        "E-009"
      ],
      "confidence_kind": "ordering_indeterminate",
      "limitations": [
        "event_order_is_not_causation",
        "both_sources_are_synthetic"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-002",
      "category": "cross_source",
      "title": "Facility stop broadcast vs. robot stop input",
      "statement": "The order of the facility stop broadcast (E-004) and the robot stop input (E-005) cannot be determined: the delta interval [-11.954, 21.046] ms spans zero.",
      "variables": {
        "relation": "INDETERMINATE",
        "delta_lo_ms": -11.954,
        "delta_hi_ms": 21.046
      },
      "formula": "Δ = [SI.lo − FB.hi, SI.hi − FB.lo] on the robot clock; BEFORE iff FB.hi < SI.lo (Allen 1983, interval 'before')",
      "supporting_event_ids": [
        "E-004",
        "E-005"
      ],
      "confidence_kind": "ordering_indeterminate",
      "limitations": [
        "clock_alignment_depends_on_assumptions_A1_A3",
        "event_order_is_not_causation",
        "both_sources_are_synthetic"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-003",
      "category": "cross_source",
      "title": "Facility input change to robot stop input",
      "statement": "Between the facility zone input change (E-003) and the robot stop input (E-005): -11.15 to 25.851 ms (indeterminate).",
      "variables": {
        "relation": "INDETERMINATE",
        "delta_lo_ms": -11.15,
        "delta_hi_ms": 25.851
      },
      "formula": "Δ = [SI.lo − FI.hi, SI.hi − FI.lo]; FI interval includes one PLC scan of detection latency",
      "supporting_event_ids": [
        "E-003",
        "E-005"
      ],
      "confidence_kind": "bounded_interval_under_assumptions",
      "limitations": [
        "clock_alignment_depends_on_assumptions_A1_A3",
        "plc_scan_latency_bound_is_declared_by_the_facility_source"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-004",
      "category": "derived_measurement",
      "title": "Reported speed at stop input",
      "statement": "Wheel odometry reports 1.2 m/s when the stop input is registered (E-005), interpolated between /odom samples #550 (1.202 m/s) and #551 (1.198 m/s).",
      "variables": {
        "speed_mps": 1.2,
        "before_sample_mps": 1.202,
        "after_sample_mps": 1.198,
        "odom_before_index": 550,
        "odom_after_index": 551
      },
      "formula": "linear interpolation of /odom twist.linear.x at the stop-input stamp",
      "supporting_event_ids": [
        "E-005"
      ],
      "confidence_kind": "derived_from_recorded_values",
      "limitations": [
        "odometry_reports_wheel_motion_not_ground_truth",
        "simulated_sensor_noise"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-005",
      "category": "derived_measurement",
      "title": "Stop input to zero velocity command",
      "statement": "The first zero velocity command (E-008) is recorded 40 ms after the stop input (E-005), same robot clock.",
      "variables": {
        "latency_ms": 40,
        "robot_jitter_bound_ms": 0.05
      },
      "formula": "ZC.publish_time − SI.header.stamp (single clock domain; ± one jitter bound)",
      "supporting_event_ids": [
        "E-005",
        "E-008"
      ],
      "confidence_kind": "derived_from_recorded_values",
      "limitations": [
        "cmd_vel_has_no_header_stamp_publish_time_used",
        "a_zero_command_is_not_physical_braking"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-006",
      "category": "derived_measurement",
      "title": "Stop input to reported stationary",
      "statement": "Odometry reports the robot stationary (E-009) 909.857 to 935.058 ms after the stop input (E-005). Reported travel in that window: 0.549 m; mean reported deceleration 1.29 m/s².",
      "variables": {
        "delta_lo_ms": 909.857,
        "delta_hi_ms": 935.058,
        "reported_distance_m": 0.549,
        "mean_decel_mps2": 1.29,
        "odom_samples": 47
      },
      "formula": "Δ = [ST.lo − SI.hi, ST.hi − SI.lo]; distance = Σ‖pᵢ − pᵢ₋₁‖ over /odom poses in [SI, ST]; decel = v(SI) / (ST − SI)",
      "supporting_event_ids": [
        "E-005",
        "E-009"
      ],
      "confidence_kind": "derived_from_recorded_values",
      "limitations": [
        "reported_by_odometry_not_physical_stopping_distance",
        "stationary_threshold_is_a_configured_parameter",
        "simulated_sensor_noise"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-007",
      "category": "derived_measurement",
      "title": "Nearest lidar return when stationary",
      "statement": "The /scan message nearest the reported stop (#119) has its closest return at 3.646 m, bearing -135° (robot frame).",
      "variables": {
        "min_range_m": 3.646,
        "bearing_deg": -135,
        "scan_index": 119,
        "scan_byte_start": 1104445
      },
      "formula": "argmin over LaserScan.ranges; bearing = angle_min + i·angle_increment",
      "supporting_event_ids": [
        "E-009"
      ],
      "confidence_kind": "recorded_value",
      "limitations": [
        "simulated_lidar_ray_cast_not_a_real_sensor",
        "a_return_is_not_an_identified_object",
        "no_contact_sensor_present"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-008",
      "category": "context",
      "title": "Robot position relative to the facility zone",
      "statement": "At the stop input the odometry pose is (9.24, 5.304) m, 1.96 m outside the mapped boundary of ZONE-B2.",
      "variables": {
        "odom_x_m": 9.24,
        "odom_y_m": 5.304,
        "zone_id": "ZONE-B2",
        "distance_to_zone_m": 1.96,
        "inside_zone": false
      },
      "formula": "Euclidean distance from /odom position to the zone rectangle in the recorded map attachment",
      "supporting_event_ids": [
        "E-005"
      ],
      "confidence_kind": "derived_from_recorded_values",
      "limitations": [
        "no_localization_stack_odom_frame_assumed_equal_to_map_frame",
        "zone_geometry_is_synthetic"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-009",
      "category": "clock",
      "title": "Facility-to-robot clock offset (derived from evidence)",
      "statement": "From 7 logged sync exchanges, the facility clock is 28.28 to 56.153 ms ahead of the robot clock at the stop input (width 27.873 ms); skew -200 to 200 ppm.",
      "variables": {
        "offset_lo_ms": 28.28,
        "offset_hi_ms": 56.153,
        "width_ms": 27.873,
        "skew_lo_ppm": -200,
        "skew_hi_ppm": 200,
        "ls_offset_ms": 45.291,
        "samples": 7
      },
      "formula": "feasible region of θ(t)=a+b·t from strips θ(t0) ≤ t1−t0+ε, θ(t3) ≥ t2−t3−ε (RFC 5905 on-wire, Marzullo intersection); interval = min/max over polygon at t*",
      "supporting_event_ids": [
        "E-005"
      ],
      "confidence_kind": "bounded_interval_under_assumptions",
      "limitations": [
        "assumes_A1_nonnegative_delay_A2_linear_drift_A3_declared_jitter",
        "sync_exchanges_are_synthetic"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-010",
      "category": "coverage",
      "title": "Source coverage and evidence gaps",
      "statement": "2 of 2 expected sources present. Not present in this case: camera, physical contact sensor, person detection, and the identity of whatever opened the facility input.",
      "variables": {
        "sources_present": 2,
        "sources_expected": 2,
        "camera": false,
        "contact_sensor": false,
        "person_detection": false
      },
      "formula": "count of manifest sources vs. scenario expectation; absence list is fixed per source kinds",
      "supporting_event_ids": [
        "E-003",
        "E-005"
      ],
      "confidence_kind": "absence_of_signal",
      "limitations": [
        "coverage_is_not_completeness"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-011",
      "category": "integrity",
      "title": "Record continuity",
      "statement": "/odom: 701 messages, largest gap 20.095 ms (nominal 20 ms). Facility log: 23 records, sequence contiguous, hash chain checked separately by the verifier.",
      "variables": {
        "odom_messages": 701,
        "odom_max_gap_ms": 20.095,
        "facility_records": 23,
        "facility_sequence_contiguous": true,
        "mcap_crc_validated": true
      },
      "formula": "max consecutive header-stamp difference; facility seq[i] == i",
      "supporting_event_ids": [],
      "confidence_kind": "recorded_value",
      "limitations": [
        "continuity_does_not_prove_nothing_was_omitted_before_recording"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    },
    {
      "finding_id": "F-012",
      "category": "observed_sequence",
      "title": "Navigation goal outcome",
      "statement": "The navigation goal is recorded as ABORTED (E-007); drive power removal is reported at E-010.",
      "variables": {
        "goal_status": "ABORTED"
      },
      "formula": "action_msgs/GoalStatus.status == 6",
      "supporting_event_ids": [
        "E-007",
        "E-010"
      ],
      "confidence_kind": "recorded_value",
      "limitations": [
        "status_codes_do_not_explain_why"
      ],
      "derived_by": "kinwit-facts/0.1.0"
    }
  ],
  "unknowns": [
    "Whether the facility broadcast preceded the robot stop input: the clock uncertainty is larger than the gap.",
    "What opened the facility zone safety input (a person, a test, an equipment fault): the facility source records the input change, not its cause.",
    "Whether any person or object was in the zone: no camera or person-detection source is present.",
    "Whether physical contact occurred: no contact sensor is present, and a speed drop does not imply a collision.",
    "Whether odometry matches the robot's true motion: there is no external ground-truth tracking source.",
    "The true clock relationship outside assumptions A1–A3.",
    "Cause, fault or responsibility. These are not assessed by KINWIT."
  ],
  "questions_for_reviewer": [
    "Was the zone safety input opened by a person, an automated test, or an equipment fault? A separate source (door sensor, camera, operator log) is needed.",
    "Is the declared PLC scan cycle (and therefore the detection latency bound) correct for the real controller?",
    "Is the safety-link path facility → robot I/O the only path that could have produced the robot's stop input?",
    "Would a measured clock reference (PTP / GNSS) be available on site to tighten the alignment interval?"
  ],
  "banned_claims_checked": [
    "root cause",
    "liable",
    "fault",
    "certified",
    "admissible",
    "100%"
  ]
}
