Test Data Analysis Report · HANARO KNSB_250220

Data file: run.csvSHA-256 b356073500dbcfe1…Analysis: rule-based playbookGenerated: 2026-09-29 19:43
4
Findings
▲ 0 · ● 2 · ℹ 2
4/4
Verified claims
32/32
Numbers traceable
7
Evidence entries
0.3 s
Summary — 7 pieces of evidence, 4 findings: 0 critical, 2 warnings.

Overview

overview

Shaded bands are test phases; numbers refer to the findings below (navigation only, not evidence).

Findings

1
● Warningsensor_faultF_thrust8.600–204.470 s✓ Verified

F_thrust has recurring data gaps

F_thrust has 285 data gaps between 8.60 and 204.47 s, 15.86 s in total, the longest 0.120 s, with a median spacing of 0.67 s; 0 of them fall between ignition and the end of tail-off. Gaps that repeat this regularly point to dropped DAQ frames rather than to the measured quantity.

Evidence: E4
2
● Warningsensor_faultF_thrust38.970–38.970 s✓ Verified

1 isolated spikes on F_thrust

F_thrust has 1 isolated spikes between 38.970 and 38.970 s (at most 5 samples wide, shorter than the redline persistence): measurement glitches, not physical events.

Evidence: E4
3
ℹ InfoobservationF_thrust159.930–163.840 s✓ Verified

F_thrust peak 2222 N, action time 3.91 s, total impulse 6362 N·s

Action time taken at 10% of peak: 159.93–163.84 s (3.91 s). F_thrust peaks at 2222.2 N at 160.48 s, averages 1627.1 N over the action time, and integrates to 6361.9 N·s (baseline 3.7 N removed).

Evidence: E3
4
ℹ InfoobservationPc160.220–162.270 s✓ Verified

Test sequence: ignition 159.890 s, mainstage 160.220–162.270 s

Segmented on Pc: ignition at 159.890 s, mainstage 160.220–162.270 s (2.05 s), steady level 41.830 bar.

Evidence: E2

Evidence ledger

Each entry is a deterministic tool call with its parameters, data hash and tool version. Re-run it with the snippet or groundline reproduce report.json.

E1describe_data—
Tool version: 0.1.1+142d4b7d90Data SHA-256: b356073500dbcfe1…Elapsed: 0.6 ms
Result (JSON)
{
  "test_id": "HANARO KNSB_250220",
  "description": "Solid rocket motor static fire (KNSB, 5 grain segments), SNU Rocket Team HANARO. Sample data from github.com/snu-hanaro/static-fire-toolkit (MIT License).",
  "engine_type": "solid rocket motor (no valves, no feed system, no simulation prediction)",
  "n_samples": 20069,
  "duration_s": 200.68,
  "sample_rate_hz": 100.0,
  "channels": {
    "Pc": {
      "unit": "bar",
      "kind": "pressure",
      "desc": "chamber pressure, stand-alone logger (not zero-corrected)",
      "native_rate_hz": 10.0,
      "note": "logged at ~10 Hz and linearly interpolated onto the 100 Hz grid",
      "min": 1.26557,
      "max": 46.1484,
      "mean": 1.95233,
      "nan_samples": 0
    },
    "F_thrust": {
      "unit": "N",
      "kind": "force",
      "desc": "thrust, load cell",
      "native_rate_hz": 103.5,
      "note": "irregular DAQ timing; grid points > 25 ms from a raw sample are NaN",
      "min": -49.8307,
      "max": 2225.88,
      "mean": 40.771,
      "nan_samples": 1871
    },
    "T_logger": {
      "unit": "degC",
      "kind": "housekeeping",
      "desc": "pressure logger internal temperature",
      "native_rate_hz": 10.0,
      "min": 3.8,
      "max": 4.0,
      "mean": 3.9355,
      "nan_samples": 0
    }
  },
  "has_reference": false,
  "reference_channels": [],
  "has_limits": true
}
Reproduce
from groundline import Session
s = Session.open('/home/claude/groundline/examples/hanaro_knsb/run.csv', limits='/home/claude/groundline/examples/hanaro_knsb/limits.json')
ev = s.run('describe_data')
print(ev.result)
E2segment_phases—
E2
Tool version: 0.1.1+831d41e678Data SHA-256: b356073500dbcfe1…Elapsed: 110.1 ms
Result (JSON)
{
  "channel": "Pc",
  "fired": true,
  "steady_level": 41.8302,
  "unit": "bar",
  "ignition_s": 159.89,
  "mainstage_start_s": 160.22,
  "mainstage_end_s": 162.27,
  "tail_off_end_s": 163.94,
  "mainstage_duration_s": 2.05,
  "phases": [
    {
      "name": "pre_test",
      "t_start": 5.66,
      "t_end": 159.89
    },
    {
      "name": "startup",
      "t_start": 159.89,
      "t_end": 160.22
    },
    {
      "name": "mainstage",
      "t_start": 160.22,
      "t_end": 162.27
    },
    {
      "name": "shutdown",
      "t_start": 162.27,
      "t_end": 163.94
    },
    {
      "name": "post_test",
      "t_start": 163.94,
      "t_end": 206.34
    }
  ],
  "command_events": []
}
Reproduce
from groundline import Session
s = Session.open('/home/claude/groundline/examples/hanaro_knsb/run.csv', limits='/home/claude/groundline/examples/hanaro_knsb/limits.json')
ev = s.run('segment_phases')
print(ev.result)
E3pulse_metricschannel=F_thrust
E3
Tool version: 0.1.1+e1bf35a04aData SHA-256: b356073500dbcfe1…Elapsed: 92.6 ms
Result (JSON)
{
  "channel": "F_thrust",
  "unit": "N",
  "baseline": 3.72056,
  "peak": 2222.16,
  "t_peak": 160.48,
  "start_pct": 10.0,
  "end_pct": 10.0,
  "t_start": 159.93,
  "t_end": 163.84,
  "action_time_s": 3.91,
  "integral": 6361.95,
  "integral_unit": "N·s",
  "mean_over_action_time": 1627.1,
  "nan_samples_interpolated": 0
}
Reproduce
from groundline import Session
s = Session.open('/home/claude/groundline/examples/hanaro_knsb/run.csv', limits='/home/claude/groundline/examples/hanaro_knsb/limits.json')
ev = s.run('pulse_metrics', channel='F_thrust')
print(ev.result)
E4check_sensor_health—
E4
Tool version: 0.1.1+46b9498d1dData SHA-256: b356073500dbcfe1…Elapsed: 111.7 ms
Result (JSON)
{
  "checked": [
    "Pc",
    "F_thrust"
  ],
  "issues": [
    {
      "channel": "F_thrust",
      "kind": "recurring_nan_gaps",
      "t_start": 8.6,
      "t_end": 204.47,
      "count": 285,
      "total_s": 15.86,
      "longest_s": 0.12,
      "median_interval_s": 0.67,
      "count_during_firing": 0,
      "gaps_during_firing": []
    },
    {
      "channel": "F_thrust",
      "kind": "spike",
      "t_start": 38.97,
      "t_end": 38.97,
      "count": 1,
      "spikes": [
        {
          "t": 38.97,
          "value": 181.01,
          "local_median": 5.93936,
          "deviation": 175.071,
          "sigmas": 30.987
        }
      ]
    }
  ],
  "n_issues": 2,
  "summary": {
    "Pc": {
      "nan_samples": 0,
      "flatline_s": 0.0,
      "spikes": 0,
      "ok": true
    },
    "F_thrust": {
      "nan_samples": 1871,
      "flatline_s": 0.0,
      "spikes": 1,
      "ok": false
    }
  },
  "criteria": {
    "spike_sigma": 12.0,
    "spike_max_width_samples": 5,
    "flatline_min_s": 0.05,
    "flatline_min_native_samples": 3,
    "flatline_only_during_firing": true,
    "recurring_gap_threshold": 3,
    "nan_margin_s": 0.01
  }
}
Reproduce
from groundline import Session
s = Session.open('/home/claude/groundline/examples/hanaro_knsb/run.csv', limits='/home/claude/groundline/examples/hanaro_knsb/limits.json')
ev = s.run('check_sensor_health')
print(ev.result)
E5check_redlines—
Tool version: 0.1.1+e0386d8633Data SHA-256: b356073500dbcfe1…Elapsed: 0.0 ms
Result (JSON)
{
  "checked": [],
  "violations": [],
  "note": "no redlines defined in limits"
}
Reproduce
from groundline import Session
s = Session.open('/home/claude/groundline/examples/hanaro_knsb/run.csv', limits='/home/claude/groundline/examples/hanaro_knsb/limits.json')
ev = s.run('check_redlines')
print(ev.result)
E6measure_valve_response—
Tool version: 0.1.1+6f46fe4ce0Data SHA-256: b356073500dbcfe1…Elapsed: 0.2 ms
Result (JSON)
{
  "events": [],
  "n_exceeding": 0
}
Reproduce
from groundline import Session
s = Session.open('/home/claude/groundline/examples/hanaro_knsb/run.csv', limits='/home/claude/groundline/examples/hanaro_knsb/limits.json')
ev = s.run('measure_valve_response')
print(ev.result)
E7detect_oscillationchannel=Pc
Tool version: 0.1.1+13904007b7Data SHA-256: b356073500dbcfe1…Elapsed: 0.0 ms
Result (JSON)
{
  "channel": "Pc",
  "t_start": 160.22,
  "t_end": 162.27,
  "fmin_hz": 5.0,
  "fmax_hz": 4.5,
  "native_rate_hz": 10.0,
  "applicable": false,
  "detected": false,
  "events": [],
  "note": "channel recorded at 10 Hz: its Nyquist limit is below fmin, so it cannot show oscillations in the requested band"
}
Reproduce
from groundline import Session
s = Session.open('/home/claude/groundline/examples/hanaro_knsb/run.csv', limits='/home/claude/groundline/examples/hanaro_knsb/limits.json')
ev = s.run('detect_oscillation', channel='Pc')
print(ev.result)