Test Data Analysis Report · HANARO KNSB_250220
Overview
Shaded bands are test phases; numbers refer to the findings below (navigation only, not evidence).
Findings
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.
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.
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).
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 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—
0.1.1+142d4b7d90Data SHA-256: b356073500dbcfe1…Elapsed: 0.6 msResult (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—
0.1.1+831d41e678Data SHA-256: b356073500dbcfe1…Elapsed: 110.1 msResult (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
0.1.1+e1bf35a04aData SHA-256: b356073500dbcfe1…Elapsed: 92.6 msResult (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—
0.1.1+46b9498d1dData SHA-256: b356073500dbcfe1…Elapsed: 111.7 msResult (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—
0.1.1+e0386d8633Data SHA-256: b356073500dbcfe1…Elapsed: 0.0 msResult (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—
0.1.1+6f46fe4ce0Data SHA-256: b356073500dbcfe1…Elapsed: 0.2 msResult (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
0.1.1+13904007b7Data SHA-256: b356073500dbcfe1…Elapsed: 0.0 msResult (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)