{
  "schema": "kinwit.facts.v1",
  "case_id": "SIM-2026-0003",
  "engine": "kinwit-facts/0.1.0",
  "analysis_status": "COMPLETE",
  "cross_source_ordering": "BEFORE",
  "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. Each step is ordered within its stated uncertainty.",
      "variables": {
        "E-003→E-004": "BEFORE",
        "E-004→E-005": "BEFORE",
        "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": "bounded_interval_under_assumptions",
      "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 facility stop broadcast (E-004) precedes the robot's recorded stop input (E-005) by 11.754 to 17.976 ms on the aligned timeline.",
      "variables": {
        "relation": "BEFORE",
        "delta_lo_ms": 11.754,
        "delta_hi_ms": 17.976
      },
      "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": "bounded_interval_under_assumptions",
      "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): 12.367 to 22.589 ms (before).",
      "variables": {
        "relation": "BEFORE",
        "delta_lo_ms": 12.367,
        "delta_hi_ms": 22.589
      },
      "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.196 m/s when the stop input is registered (E-005), interpolated between /odom samples #550 (1.202 m/s) and #551 (1.196 m/s).",
      "variables": {
        "speed_mps": 1.196,
        "before_sample_mps": 1.202,
        "after_sample_mps": 1.196,
        "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 30 ms after the stop input (E-005), same robot clock.",
      "variables": {
        "latency_ms": 30,
        "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) 899.876 to 925.069 ms after the stop input (E-005). Reported travel in that window: 0.561 m; mean reported deceleration 1.3 m/s².",
      "variables": {
        "delta_lo_ms": 899.876,
        "delta_hi_ms": 925.069,
        "reported_distance_m": 0.561,
        "mean_decel_mps2": 1.3,
        "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.675 m, bearing -135° (robot frame).",
      "variables": {
        "min_range_m": 3.675,
        "bearing_deg": -135,
        "scan_index": 119,
        "scan_byte_start": 1107637
      },
      "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.243, 5.291) m, 1.957 m outside the mapped boundary of ZONE-B2.",
      "variables": {
        "odom_x_m": 9.243,
        "odom_y_m": 5.291,
        "zone_id": "ZONE-B2",
        "distance_to_zone_m": 1.957,
        "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 56 logged sync exchanges, the facility clock is -1813.217 to -1812.117 ms ahead of the robot clock at the stop input (width 1.1 ms); skew -111.039 to 99.017 ppm.",
      "variables": {
        "offset_lo_ms": -1813.217,
        "offset_hi_ms": -1812.117,
        "width_ms": 1.1,
        "skew_lo_ppm": -111.039,
        "skew_hi_ppm": 99.017,
        "ls_offset_ms": -1812.623,
        "samples": 56
      },
      "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: 72 records, sequence contiguous, hash chain checked separately by the verifier.",
      "variables": {
        "odom_messages": 701,
        "odom_max_gap_ms": 20.095,
        "facility_records": 72,
        "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": [
    "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%"
  ]
}
