Kshana run report
Campaign: existing scenario kinds composed into one run, with every number read from a real run of the named kind.
campaign f87a4a0e0bab | Jamming, spoofing, holdover and integrity: a chained mission | chain: 6 phases over 4570 s, 2 events, alarm raised on 2770 s of the grid | 18 member runs (MODELLED)
Honesty label (result `label`): MODELLED composition of existing scenario kinds. Every number is read from a real run of the named kind; the chaining (additive carry of a channel across a phase boundary, zero-order hold onto the timeline grid, a phase ended at a computed time) is a modelling choice, and each phase carries the label of the kind that produced it.
Capabilities used: 4 VALIDATED, 8 MODELLED, 1 PARTNER (relied on, not provided); see section 5.
Member runs: 18, aggregated in section 3a.
Every field the scenario file sets, flattened to its path. Units come from the result's units block (the field-units schema, docs/field-units-schema.json) where it describes the field, otherwise from the field-name suffix; a unit neither states is shown as not stated.
| Parameter | Value | Unit | Unit source |
|---|---|---|---|
kind | campaign | text | a text input carries no unit |
phases[0].duration_s | 600 | s | field-name suffix |
phases[0].name | nominal | text | a text input carries no unit |
phases[0].runs[0].scenario.clock_classical.id | csac-sa45s | text | a text input carries no unit |
phases[0].runs[0].scenario.clock_classical.provenance | Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2. | text | a text input carries no unit |
phases[0].runs[0].scenario.clock_classical.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.clock_classical.q_wf | 9.0000e-20 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.clock_classical.y0 | 5.0000e-10 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.clock_quantum.id | optical-sr-lattice | text | a text input carries no unit |
phases[0].runs[0].scenario.clock_quantum.provenance | Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (arXiv:1503.08457); not flown. | text | a text input carries no unit |
phases[0].runs[0].scenario.clock_quantum.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.clock_quantum.q_wf | 1.0000e-30 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.clock_quantum.y0 | 5.0000e-17 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.gnss.windows[0].state | nominal | text | a text input carries no unit |
phases[0].runs[0].scenario.gnss.windows[0].t0 | 0 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.gnss.windows[0].t1 | 600 | not stated | no units entry and no unit suffix |
phases[0].runs[0].scenario.seed | 42 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[0].runs[0].scenario.threshold_ns | 50 | ns | field-name suffix |
phases[0].runs[0].scenario.time.duration_s | 600 | s | field-name suffix |
phases[0].runs[0].scenario.time.step_s | 10 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[0].runs[1].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[0].runs[1].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[0].runs[1].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[0].runs[1].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[0].runs[1].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[0].runs[1].scenario.kind | jamming | text | a text input carries no unit |
phases[0].runs[1].scenario.mask_deg | 5 | deg | field-name suffix |
phases[0].runs[1].scenario.receiver.alt_m | 0 | m | field-name suffix |
phases[0].runs[1].scenario.receiver.lat_deg | 52 | deg | field-name suffix |
phases[0].runs[1].scenario.receiver.lon_deg | 4 | deg | field-name suffix |
phases[0].runs[1].scenario.seed | 1 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[0].runs[1].scenario.time.duration_s | 600 | s | field-name suffix |
phases[0].runs[1].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[0].runs[1].scenario.tracking_threshold_dbhz | 25 | dB-Hz | field-name suffix |
phases[0].runs[2].scenario.al_h_m | 40 | m | field-name suffix |
phases[0].runs[2].scenario.al_v_m | 50 | m | field-name suffix |
phases[0].runs[2].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[0].runs[2].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[0].runs[2].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[0].runs[2].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[0].runs[2].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[0].runs[2].scenario.kind | integrity | text | a text input carries no unit |
phases[0].runs[2].scenario.mask_deg | 5 | deg | field-name suffix |
phases[0].runs[2].scenario.p_fa | 1.0000e-5 | not stated | no units entry and no unit suffix |
phases[0].runs[2].scenario.p_md | 0.001 | not stated | no units entry and no unit suffix |
phases[0].runs[2].scenario.seed | 7 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[0].runs[2].scenario.sigma_uere_m | 1 | m | field-name suffix |
phases[0].runs[2].scenario.time.duration_s | 600 | s | field-name suffix |
phases[0].runs[2].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[0].runs[2].scenario.user.altitude_km | 0.4 | km | field-name suffix |
phases[0].runs[2].scenario.user.inclination_deg | 45 | deg | field-name suffix |
phases[0].runs[2].scenario.user.raan_deg | 10 | deg | field-name suffix |
phases[0].runs[2].scenario.user.u0_deg | 0 | deg | field-name suffix |
phases[1].duration_s | 600 | s | field-name suffix |
phases[1].name | jamming | text | a text input carries no unit |
phases[1].runs[0].scenario.clock_classical.id | csac-sa45s | text | a text input carries no unit |
phases[1].runs[0].scenario.clock_classical.provenance | Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2. | text | a text input carries no unit |
phases[1].runs[0].scenario.clock_classical.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.clock_classical.q_wf | 9.0000e-20 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.clock_classical.y0 | 5.0000e-10 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.clock_quantum.id | optical-sr-lattice | text | a text input carries no unit |
phases[1].runs[0].scenario.clock_quantum.provenance | Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (arXiv:1503.08457); not flown. | text | a text input carries no unit |
phases[1].runs[0].scenario.clock_quantum.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.clock_quantum.q_wf | 1.0000e-30 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.clock_quantum.y0 | 5.0000e-17 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.gnss.windows[0].state | nominal | text | a text input carries no unit |
phases[1].runs[0].scenario.gnss.windows[0].t0 | 0 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.gnss.windows[0].t1 | 600 | not stated | no units entry and no unit suffix |
phases[1].runs[0].scenario.seed | 43 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[1].runs[0].scenario.threshold_ns | 50 | ns | field-name suffix |
phases[1].runs[0].scenario.time.duration_s | 600 | s | field-name suffix |
phases[1].runs[0].scenario.time.step_s | 10 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[1].runs[1].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[1].runs[1].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[1].runs[1].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[1].runs[1].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[1].runs[1].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[1].runs[1].scenario.jammer.bandwidth_mhz | 20 | MHz | field-name suffix |
phases[1].runs[1].scenario.jammer.gain_dbi | 0 | dBi | field-name suffix |
phases[1].runs[1].scenario.jammer.jammer_type | broadband | text | a text input carries no unit |
phases[1].runs[1].scenario.jammer.position_ecef_m | [3.9264e6, 2.7449e5, 5.0028e6] | m | field-name suffix |
phases[1].runs[1].scenario.jammer.power_dbw | -30 | dBW | field-name suffix |
phases[1].runs[1].scenario.kind | jamming | text | a text input carries no unit |
phases[1].runs[1].scenario.mask_deg | 5 | deg | field-name suffix |
phases[1].runs[1].scenario.receiver.alt_m | 0 | m | field-name suffix |
phases[1].runs[1].scenario.receiver.lat_deg | 52 | deg | field-name suffix |
phases[1].runs[1].scenario.receiver.lon_deg | 4 | deg | field-name suffix |
phases[1].runs[1].scenario.seed | 1 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[1].runs[1].scenario.time.duration_s | 600 | s | field-name suffix |
phases[1].runs[1].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[1].runs[1].scenario.tracking_threshold_dbhz | 25 | dB-Hz | field-name suffix |
phases[1].runs[2].scenario.al_h_m | 40 | m | field-name suffix |
phases[1].runs[2].scenario.al_v_m | 50 | m | field-name suffix |
phases[1].runs[2].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[1].runs[2].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[1].runs[2].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[1].runs[2].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[1].runs[2].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[1].runs[2].scenario.kind | integrity | text | a text input carries no unit |
phases[1].runs[2].scenario.mask_deg | 5 | deg | field-name suffix |
phases[1].runs[2].scenario.p_fa | 1.0000e-5 | not stated | no units entry and no unit suffix |
phases[1].runs[2].scenario.p_md | 0.001 | not stated | no units entry and no unit suffix |
phases[1].runs[2].scenario.seed | 7 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[1].runs[2].scenario.sigma_uere_m | 1 | m | field-name suffix |
phases[1].runs[2].scenario.time.duration_s | 600 | s | field-name suffix |
phases[1].runs[2].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[1].runs[2].scenario.user.altitude_km | 0.4 | km | field-name suffix |
phases[1].runs[2].scenario.user.inclination_deg | 45 | deg | field-name suffix |
phases[1].runs[2].scenario.user.raan_deg | 10 | deg | field-name suffix |
phases[1].runs[2].scenario.user.u0_deg | 0 | deg | field-name suffix |
phases[2].duration_s | 900 | s | field-name suffix |
phases[2].end_at | classical.detect_time_s | text | a text input carries no unit |
phases[2].name | spoofing | text | a text input carries no unit |
phases[2].runs[0].scenario.attack.rate_ns_per_s | 0.1 | s | field-name suffix |
phases[2].runs[0].scenario.attack.start_s | 0 | s | field-name suffix |
phases[2].runs[0].scenario.clock_classical.id | csac-sa45s | text | a text input carries no unit |
phases[2].runs[0].scenario.clock_classical.provenance | Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2. | text | a text input carries no unit |
phases[2].runs[0].scenario.clock_classical.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[2].runs[0].scenario.clock_classical.q_wf | 9.0000e-20 | not stated | no units entry and no unit suffix |
phases[2].runs[0].scenario.clock_classical.y0 | 5.0000e-10 | not stated | no units entry and no unit suffix |
phases[2].runs[0].scenario.clock_quantum.id | optical-sr-lattice | text | a text input carries no unit |
phases[2].runs[0].scenario.clock_quantum.provenance | Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (arXiv:1503.08457); not flown. | text | a text input carries no unit |
phases[2].runs[0].scenario.clock_quantum.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[2].runs[0].scenario.clock_quantum.q_wf | 1.0000e-30 | not stated | no units entry and no unit suffix |
phases[2].runs[0].scenario.clock_quantum.y0 | 5.0000e-17 | not stated | no units entry and no unit suffix |
phases[2].runs[0].scenario.kind | spoof | text | a text input carries no unit |
phases[2].runs[0].scenario.threshold_ns | 50 | ns | field-name suffix |
phases[2].runs[0].scenario.time.duration_s | 900 | s | field-name suffix |
phases[2].runs[0].scenario.time.step_s | 10 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[2].runs[1].scenario.attack.carrier_aligned | false | flag | a true/false input carries no unit |
phases[2].runs[1].scenario.attack.el_imbalance | 0.12 | not stated | no units entry and no unit suffix |
phases[2].runs[1].scenario.attack.num_biased | 3 | not stated | no units entry and no unit suffix |
phases[2].runs[1].scenario.attack.power_advantage_db | 1.5 | dB | field-name suffix |
phases[2].runs[1].scenario.attack.push | position | text | a text input carries no unit |
phases[2].runs[1].scenario.attack.push_magnitude_m | 75 | m | field-name suffix |
phases[2].runs[1].scenario.detector.agc_margin_db | 3 | dB | field-name suffix |
phases[2].runs[1].scenario.detector.fusion_threshold | 0.5 | not stated | no units entry and no unit suffix |
phases[2].runs[1].scenario.detector.raim_p_fa | 0.001 | not stated | no units entry and no unit suffix |
phases[2].runs[1].scenario.detector.sat_power_dbm | -130 | dBm | field-name suffix |
phases[2].runs[1].scenario.detector.sigma_m | 5 | m | field-name suffix |
phases[2].runs[1].scenario.detector.sqm_tolerance | 0.1 | not stated | no units entry and no unit suffix |
phases[2].runs[1].scenario.kind | spoof-detect | text | a text input carries no unit |
phases[2].runs[2].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[2].runs[2].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[2].runs[2].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[2].runs[2].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[2].runs[2].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[2].runs[2].scenario.jammer.bandwidth_mhz | 20 | MHz | field-name suffix |
phases[2].runs[2].scenario.jammer.gain_dbi | 0 | dBi | field-name suffix |
phases[2].runs[2].scenario.jammer.jammer_type | broadband | text | a text input carries no unit |
phases[2].runs[2].scenario.jammer.position_ecef_m | [3.9264e6, 2.7449e5, 5.0028e6] | m | field-name suffix |
phases[2].runs[2].scenario.jammer.power_dbw | -30 | dBW | field-name suffix |
phases[2].runs[2].scenario.kind | jamming | text | a text input carries no unit |
phases[2].runs[2].scenario.mask_deg | 5 | deg | field-name suffix |
phases[2].runs[2].scenario.receiver.alt_m | 0 | m | field-name suffix |
phases[2].runs[2].scenario.receiver.lat_deg | 52 | deg | field-name suffix |
phases[2].runs[2].scenario.receiver.lon_deg | 4 | deg | field-name suffix |
phases[2].runs[2].scenario.seed | 1 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[2].runs[2].scenario.time.duration_s | 900 | s | field-name suffix |
phases[2].runs[2].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[2].runs[2].scenario.tracking_threshold_dbhz | 25 | dB-Hz | field-name suffix |
phases[3].carry | [time_error_ns] | not stated | no units entry and no unit suffix |
phases[3].duration_s | 1800 | s | field-name suffix |
phases[3].name | holdover | text | a text input carries no unit |
phases[3].runs[0].scenario.clock_classical.id | csac-sa45s | text | a text input carries no unit |
phases[3].runs[0].scenario.clock_classical.provenance | Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2. | text | a text input carries no unit |
phases[3].runs[0].scenario.clock_classical.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.clock_classical.q_wf | 9.0000e-20 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.clock_classical.y0 | 5.0000e-10 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.clock_quantum.id | optical-sr-lattice | text | a text input carries no unit |
phases[3].runs[0].scenario.clock_quantum.provenance | Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (arXiv:1503.08457); not flown. | text | a text input carries no unit |
phases[3].runs[0].scenario.clock_quantum.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.clock_quantum.q_wf | 1.0000e-30 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.clock_quantum.y0 | 5.0000e-17 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.gnss.windows[0].state | nominal | text | a text input carries no unit |
phases[3].runs[0].scenario.gnss.windows[0].t0 | 0 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.gnss.windows[0].t1 | 1 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.gnss.windows[1].state | denied | text | a text input carries no unit |
phases[3].runs[0].scenario.gnss.windows[1].t0 | 1 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.gnss.windows[1].t1 | 1800 | not stated | no units entry and no unit suffix |
phases[3].runs[0].scenario.seed | 44 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[3].runs[0].scenario.threshold_ns | 50 | ns | field-name suffix |
phases[3].runs[0].scenario.time.duration_s | 1800 | s | field-name suffix |
phases[3].runs[0].scenario.time.step_s | 10 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[3].runs[1].scenario.alt_m | 0 | m | field-name suffix |
phases[3].runs[1].scenario.fix_interval_s | 1 | s | field-name suffix |
phases[3].runs[1].scenario.gnss.windows[0].state | nominal | text | a text input carries no unit |
phases[3].runs[1].scenario.gnss.windows[0].t0 | 0 | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.gnss.windows[0].t1 | 100 | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.gnss.windows[1].state | denied | text | a text input carries no unit |
phases[3].runs[1].scenario.gnss.windows[1].t0 | 100 | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.gnss.windows[1].t1 | 1900 | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.imu_classical.accel_bias | [0.03, -0.02, 0] | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.imu_classical.gyro_bias | [0, 0, 1.0000e-4] | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.imu_classical.id | tactical-imu | text | a text input carries no unit |
phases[3].runs[1].scenario.imu_classical.provenance | Tactical-grade MEMS/quartz inertial unit: larger residual bias | text | a text input carries no unit |
phases[3].runs[1].scenario.imu_quantum.accel_bias | [0.015, 0, 0] | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.imu_quantum.gyro_bias | [0, 0, 5.0000e-5] | not stated | no units entry and no unit suffix |
phases[3].runs[1].scenario.imu_quantum.id | cold-atom-imu | text | a text input carries no unit |
phases[3].runs[1].scenario.imu_quantum.provenance | Quantum-grade inertial unit: low residual accelerometer/gyro bias (cold-atom-class) | text | a text input carries no unit |
phases[3].runs[1].scenario.kind | gnss-ins | text | a text input carries no unit |
phases[3].runs[1].scenario.lat_deg | 52 | deg | field-name suffix |
phases[3].runs[1].scenario.lon_deg | 4 | deg | field-name suffix |
phases[3].runs[1].scenario.seed | 7 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[3].runs[1].scenario.sigma_pos_m | 1 | m | field-name suffix |
phases[3].runs[1].scenario.sigma_vel_mps | 0.05 | m/s | field-name suffix |
phases[3].runs[1].scenario.threshold_m | 50 | m | field-name suffix |
phases[3].runs[1].scenario.time.duration_s | 1900 | s | field-name suffix |
phases[3].runs[1].scenario.time.step_s | 0.5 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[3].runs[1].skip_s | 100 | s | field-units schema: input entry `timeline.phases[].runs[].skip_s`, matched by field name |
phases[3].runs[2].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[3].runs[2].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[3].runs[2].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[3].runs[2].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[3].runs[2].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[3].runs[2].scenario.jammer.bandwidth_mhz | 20 | MHz | field-name suffix |
phases[3].runs[2].scenario.jammer.gain_dbi | 0 | dBi | field-name suffix |
phases[3].runs[2].scenario.jammer.jammer_type | broadband | text | a text input carries no unit |
phases[3].runs[2].scenario.jammer.position_ecef_m | [3.9264e6, 2.7449e5, 5.0028e6] | m | field-name suffix |
phases[3].runs[2].scenario.jammer.power_dbw | 10 | dBW | field-name suffix |
phases[3].runs[2].scenario.kind | jamming | text | a text input carries no unit |
phases[3].runs[2].scenario.mask_deg | 5 | deg | field-name suffix |
phases[3].runs[2].scenario.receiver.alt_m | 0 | m | field-name suffix |
phases[3].runs[2].scenario.receiver.lat_deg | 52 | deg | field-name suffix |
phases[3].runs[2].scenario.receiver.lon_deg | 4 | deg | field-name suffix |
phases[3].runs[2].scenario.seed | 1 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[3].runs[2].scenario.time.duration_s | 1800 | s | field-name suffix |
phases[3].runs[2].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[3].runs[2].scenario.tracking_threshold_dbhz | 25 | dB-Hz | field-name suffix |
phases[4].carry | [time_error_ns] | not stated | no units entry and no unit suffix |
phases[4].duration_s | 600 | s | field-name suffix |
phases[4].name | integrity-alarm | text | a text input carries no unit |
phases[4].runs[0].scenario.clock_classical.id | csac-sa45s | text | a text input carries no unit |
phases[4].runs[0].scenario.clock_classical.provenance | Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2. | text | a text input carries no unit |
phases[4].runs[0].scenario.clock_classical.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.clock_classical.q_wf | 9.0000e-20 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.clock_classical.y0 | 5.0000e-10 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.clock_quantum.id | optical-sr-lattice | text | a text input carries no unit |
phases[4].runs[0].scenario.clock_quantum.provenance | Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (arXiv:1503.08457); not flown. | text | a text input carries no unit |
phases[4].runs[0].scenario.clock_quantum.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.clock_quantum.q_wf | 1.0000e-30 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.clock_quantum.y0 | 5.0000e-17 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.gnss.windows[0].state | nominal | text | a text input carries no unit |
phases[4].runs[0].scenario.gnss.windows[0].t0 | 0 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.gnss.windows[0].t1 | 1 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.gnss.windows[1].state | denied | text | a text input carries no unit |
phases[4].runs[0].scenario.gnss.windows[1].t0 | 1 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.gnss.windows[1].t1 | 600 | not stated | no units entry and no unit suffix |
phases[4].runs[0].scenario.seed | 45 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[4].runs[0].scenario.threshold_ns | 50 | ns | field-name suffix |
phases[4].runs[0].scenario.time.duration_s | 600 | s | field-name suffix |
phases[4].runs[0].scenario.time.step_s | 10 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[4].runs[1].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[4].runs[1].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[4].runs[1].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[4].runs[1].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[4].runs[1].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[4].runs[1].scenario.jammer.bandwidth_mhz | 20 | MHz | field-name suffix |
phases[4].runs[1].scenario.jammer.gain_dbi | 0 | dBi | field-name suffix |
phases[4].runs[1].scenario.jammer.jammer_type | broadband | text | a text input carries no unit |
phases[4].runs[1].scenario.jammer.position_ecef_m | [3.9264e6, 2.7449e5, 5.0028e6] | m | field-name suffix |
phases[4].runs[1].scenario.jammer.power_dbw | -30 | dBW | field-name suffix |
phases[4].runs[1].scenario.kind | jamming | text | a text input carries no unit |
phases[4].runs[1].scenario.mask_deg | 25 | deg | field-name suffix |
phases[4].runs[1].scenario.receiver.alt_m | 0 | m | field-name suffix |
phases[4].runs[1].scenario.receiver.lat_deg | 52 | deg | field-name suffix |
phases[4].runs[1].scenario.receiver.lon_deg | 4 | deg | field-name suffix |
phases[4].runs[1].scenario.seed | 1 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[4].runs[1].scenario.time.duration_s | 600 | s | field-name suffix |
phases[4].runs[1].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[4].runs[1].scenario.tracking_threshold_dbhz | 25 | dB-Hz | field-name suffix |
phases[4].runs[2].scenario.al_h_m | 40 | m | field-name suffix |
phases[4].runs[2].scenario.al_v_m | 50 | m | field-name suffix |
phases[4].runs[2].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[4].runs[2].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[4].runs[2].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[4].runs[2].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[4].runs[2].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[4].runs[2].scenario.kind | integrity | text | a text input carries no unit |
phases[4].runs[2].scenario.mask_deg | 25 | deg | field-name suffix |
phases[4].runs[2].scenario.p_fa | 1.0000e-5 | not stated | no units entry and no unit suffix |
phases[4].runs[2].scenario.p_md | 0.001 | not stated | no units entry and no unit suffix |
phases[4].runs[2].scenario.seed | 7 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[4].runs[2].scenario.sigma_uere_m | 1 | m | field-name suffix |
phases[4].runs[2].scenario.time.duration_s | 600 | s | field-name suffix |
phases[4].runs[2].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[4].runs[2].scenario.user.altitude_km | 0.4 | km | field-name suffix |
phases[4].runs[2].scenario.user.inclination_deg | 45 | deg | field-name suffix |
phases[4].runs[2].scenario.user.raan_deg | 10 | deg | field-name suffix |
phases[4].runs[2].scenario.user.u0_deg | 0 | deg | field-name suffix |
phases[5].duration_s | 600 | s | field-name suffix |
phases[5].name | recovery | text | a text input carries no unit |
phases[5].runs[0].scenario.clock_classical.id | csac-sa45s | text | a text input carries no unit |
phases[5].runs[0].scenario.clock_classical.provenance | Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2. | text | a text input carries no unit |
phases[5].runs[0].scenario.clock_classical.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.clock_classical.q_wf | 9.0000e-20 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.clock_classical.y0 | 5.0000e-10 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.clock_quantum.id | optical-sr-lattice | text | a text input carries no unit |
phases[5].runs[0].scenario.clock_quantum.provenance | Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (arXiv:1503.08457); not flown. | text | a text input carries no unit |
phases[5].runs[0].scenario.clock_quantum.q_rw | 0 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.clock_quantum.q_wf | 1.0000e-30 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.clock_quantum.y0 | 5.0000e-17 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.gnss.windows[0].state | nominal | text | a text input carries no unit |
phases[5].runs[0].scenario.gnss.windows[0].t0 | 0 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.gnss.windows[0].t1 | 600 | not stated | no units entry and no unit suffix |
phases[5].runs[0].scenario.seed | 46 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[5].runs[0].scenario.threshold_ns | 50 | ns | field-name suffix |
phases[5].runs[0].scenario.time.duration_s | 600 | s | field-name suffix |
phases[5].runs[0].scenario.time.step_s | 10 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[5].runs[1].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[5].runs[1].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[5].runs[1].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[5].runs[1].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[5].runs[1].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[5].runs[1].scenario.kind | jamming | text | a text input carries no unit |
phases[5].runs[1].scenario.mask_deg | 5 | deg | field-name suffix |
phases[5].runs[1].scenario.receiver.alt_m | 0 | m | field-name suffix |
phases[5].runs[1].scenario.receiver.lat_deg | 52 | deg | field-name suffix |
phases[5].runs[1].scenario.receiver.lon_deg | 4 | deg | field-name suffix |
phases[5].runs[1].scenario.seed | 1 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[5].runs[1].scenario.time.duration_s | 600 | s | field-name suffix |
phases[5].runs[1].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[5].runs[1].scenario.tracking_threshold_dbhz | 25 | dB-Hz | field-name suffix |
phases[5].runs[2].scenario.al_h_m | 40 | m | field-name suffix |
phases[5].runs[2].scenario.al_v_m | 50 | m | field-name suffix |
phases[5].runs[2].scenario.constellation.altitude_km | 20200 | km | field-name suffix |
phases[5].runs[2].scenario.constellation.inclination_deg | 55 | deg | field-name suffix |
phases[5].runs[2].scenario.constellation.phasing_f | 1 | not stated | no units entry and no unit suffix |
phases[5].runs[2].scenario.constellation.planes | 6 | not stated | no units entry and no unit suffix |
phases[5].runs[2].scenario.constellation.sats_per_plane | 4 | not stated | no units entry and no unit suffix |
phases[5].runs[2].scenario.kind | integrity | text | a text input carries no unit |
phases[5].runs[2].scenario.mask_deg | 5 | deg | field-name suffix |
phases[5].runs[2].scenario.p_fa | 1.0000e-5 | not stated | no units entry and no unit suffix |
phases[5].runs[2].scenario.p_md | 0.001 | not stated | no units entry and no unit suffix |
phases[5].runs[2].scenario.seed | 7 | 1 | field-units schema: input entry `seed`, matched by field name |
phases[5].runs[2].scenario.sigma_uere_m | 1 | m | field-name suffix |
phases[5].runs[2].scenario.time.duration_s | 600 | s | field-name suffix |
phases[5].runs[2].scenario.time.step_s | 30 | s | field-units schema: input entry `timeline.step_s`, matched by field name |
phases[5].runs[2].scenario.user.altitude_km | 0.4 | km | field-name suffix |
phases[5].runs[2].scenario.user.inclination_deg | 45 | deg | field-name suffix |
phases[5].runs[2].scenario.user.raan_deg | 10 | deg | field-name suffix |
phases[5].runs[2].scenario.user.u0_deg | 0 | deg | field-name suffix |
seed | 20260928 | 1 | field-units schema: units entry `seed` |
timeline.step_s | 10 | s | field-units schema: units entry `timeline.step_s` |
title | Jamming, spoofing, holdover and integrity: a chained mission | text | a text input carries no unit |
| Result | Value | Unit |
|---|---|---|
reproducibility.campaign_hash | f87a4a0e0babe2ea4b7e8adc7739cf564e270dc1c261d2ff48386766bf9d1ba1 | text |
reproducibility.run_digest | 08c7967b399f4635ed5c9b025c7eedce7202959d42646f31876626edc521accb | text |
reproducibility.runs_total | 18 | count |
seed | 20260928 | 1 |
timeline.channels.alarm.label | alarm flag: 1 while any monitor of the phase alarms | text |
timeline.channels.alarm.unit | 1 | text |
timeline.channels.alert_limit_m.label | vertical alert limit | text |
timeline.channels.alert_limit_m.unit | m | text |
timeline.channels.cn0_dbhz.label | mean effective carrier-to-noise density ratio over the visible satellites | text |
timeline.channels.cn0_dbhz.unit | dB-Hz | text |
timeline.channels.cn0_floor_dbhz.label | tracking-loss floor of the receiver | text |
timeline.channels.cn0_floor_dbhz.unit | dB-Hz | text |
timeline.channels.guard_ns.label | time-error guard (the run's own threshold) | text |
timeline.channels.guard_ns.unit | ns | text |
timeline.channels.position_error_m.label | position error | text |
timeline.channels.position_error_m.unit | m | text |
timeline.channels.position_threshold_m.label | position-error threshold (the run's own) | text |
timeline.channels.position_threshold_m.unit | m | text |
timeline.channels.protection_level_m.label | vertical protection level | text |
timeline.channels.protection_level_m.unit | m | text |
timeline.channels.time_error_ns.label | clock time error | text |
timeline.channels.time_error_ns.unit | ns | text |
timeline.channels.tracking.label | satellites still tracking | text |
timeline.channels.tracking.unit | count | text |
timeline.duration_s | 4570 | s |
timeline.step_s | 10 | s |
| Column | Count | Min | Max | First | Last | Unit |
|---|---|---|---|---|---|---|
timeline.channels.alarm.values[] | 458 | 0 | 1 | 0 | 0 | 1 |
timeline.channels.alert_limit_m.values[] | 241 | 50 | 50 | 50 | 50 | m |
timeline.channels.cn0_dbhz.values[] | 458 | -12.157675 | 43.037304 | 43.037304 | 43.019529 | dB-Hz |
timeline.channels.cn0_floor_dbhz.values[] | 458 | 25 | 25 | 25 | 25 | dB-Hz |
timeline.channels.guard_ns.values[] | 458 | 50 | 50 | 50 | 50 | ns |
timeline.channels.position_error_m.values[] | 180 | 0.616602 | 24343.217838 | 0.616602 | 24343.217838 | m |
timeline.channels.position_threshold_m.values[] | 180 | 50 | 50 | 50 | 50 | m |
timeline.channels.protection_level_m.values[] | 223 | 8.949323 | 135.284532 | 21.635892 | 8.949323 | m |
timeline.channels.time_error_ns.values[] | 458 | -0.432776 | 62.737749 | 0 | -0.432776 | ns |
timeline.channels.tracking.values[] | 458 | 0 | 8 | 8 | 8 | count |
timeline.events[].t_s | 2 | 1200 | 1570 | 1200 | 1570 | s |
timeline.phases[].carried.time_error_ns | 2 | 37 | 59.580321 | 37 | 59.580321 | ns |
timeline.phases[].runs[].skip_s | 18 | 0 | 100 | 0 | 0 | s |
timeline.phases[].t0_s | 6 | 0 | 3970 | 0 | 3970 | s |
timeline.phases[].t1_s | 6 | 600 | 4570 | 600 | 4570 | s |
timeline.t_s[] | 458 | 0 | 4570 | 0 | 4570 | s |
Mode chain, 18 member runs.
Run digest (SHA-256 over the member result digests, in dispatch order): 08c7967b399f4635ed5c9b025c7eedce7202959d42646f31876626edc521accb
| phase | start (s) | end (s) | duration (s) | ended by | member kinds | carried in |
|---|---|---|---|---|---|---|
| nominal | 0 | 600 | 600 | duration_s | clock, jamming, integrity | nothing carried |
| jamming | 600 | 1200 | 600 | duration_s | clock, jamming, integrity | nothing carried |
| spoofing | 1200 | 1570 | 370 | end_at classical.detect_time_s = 370 s | spoof, spoof-detect, jamming | nothing carried |
| holdover | 1570 | 3370 | 1800 | duration_s | clock, gnss-ins, jamming | time_error_ns = 37 |
| integrity-alarm | 3370 | 3970 | 600 | duration_s | clock, jamming, integrity | time_error_ns = 59.580321 |
| recovery | 3970 | 4570 | 600 | duration_s | clock, jamming, integrity | nothing carried |
--animate svg; it shows the finished picture under reduced motion and in print).The interactive player is written by kshana scenarios/campaign-jam-spoof-holdover-integrity.toml --animate html.
| Export | Applies | Files or reason |
|---|---|---|
| czml https://github.com/AnalyticalGraphicsInc/czml-writer/wiki/CZML-Structure | yes | written by kshana scenarios/campaign-jam-spoof-holdover-integrity.toml --export all |
| kml https://www.ogc.org/standard/kml/ | yes | written by kshana scenarios/campaign-jam-spoof-holdover-integrity.toml --export all |
| geojson https://www.rfc-editor.org/rfc/rfc7946 | yes | written by kshana scenarios/campaign-jam-spoof-holdover-integrity.toml --export all |
| stk https://help.agi.com/stk/#stk/importfiles-02.htm | yes | written by kshana scenarios/campaign-jam-spoof-holdover-integrity.toml --export all |
| sigmf https://github.com/sigmf/SigMF/blob/main/sigmf-spec.md | no | no member scenario of the campaign has anything this format describes; export a member on its own to see its reason |
| Start (s) | End (s) | Event | Source |
|---|---|---|---|
| 0 | 600 | phase nominal (ended by duration_s) | result `timeline.phases[0]` |
| 600 | 1200 | phase jamming (ended by duration_s) | result `timeline.phases[1]` |
| 1200 | 1570 | phase spoofing (ended by end_at classical.detect_time_s = 370 s) | result `timeline.phases[2]` |
| 1200 | point event | RF spoofing detector alarms (fused consistency, power and signal-quality monitors) (phase spoofing) [alarm] | result `timeline.events[]` |
| 1570 | 3370 | phase holdover (ended by duration_s) | result `timeline.phases[3]` |
| 1570 | point event | clock-aided spoofing monitor alarms (phase spoofing) [alarm] | result `timeline.events[]` |
| 3370 | 3970 | phase integrity-alarm (ended by duration_s) | result `timeline.phases[4]` |
| 3970 | 4570 | phase recovery (ended by duration_s) | result `timeline.phases[5]` |
Each row is a verification-matrix row this run's kinds exercise, with the label and the oracle the matrix gives it (src/verification.rs, docs/VERIFICATION-MATRIX.md). A label grades the capability as the matrix records it; it does not grade this scenario's configuration, and a VALIDATED row does not make the run's inputs measured. A PARTNER row is a discipline the run relies on that Kshana does not provide.
| Capability (matrix requirement) | Label | Used by | Source: oracle | Test evidence |
|---|---|---|---|---|
| Frequency stability characterisation Allan/modified/Hadamard deviation + power-law noise ID with χ² CIs | VALIDATED exercised | clock | NIST SP 1065 (Riley) / Stable32 reference deviations on NBS14 (ExternalDataset) | tests/allan_reference.rs (NBS14 vs Stable32 to 1e-4); allan::tests |
| Integrity (RAIM/ARAIM/SBAS) Snapshot/MHSS RAIM, ARAIM P_HMI budget, SBAS DO-229E combination | VALIDATED exercised | integrity | DO-229E/DO-316 K-factors; real IGS SP3 geometry (ExternalDataset) | tests/igs_real_data.rs, tests/araim_dual_real_data.rs (real IGS SP3 + Celestrak TLE) |
| GNSS geometry / dilution of precision (DOP) GDOP/PDOP/HDOP/VDOP/TDOP from line-of-sight geometry via Q=(HᵀH)⁻¹ with a local ENU split | VALIDATED exercised | integrity | gnss_lib_py 1.0.4 (Stanford NAV Lab) DOP — independent library, matched to 1e-6 relative (ExternalDataset) | tests/dop_reference.rs (8 geometries, well-conditioned → near-singular) |
| RAIM/ARAIM integrity statistical kernel (χ² / non-central χ² / normal laws) The distributional core every protection level rests on: the snapshot fault-detection threshold χ²₁₋ₚfₐ(dof), the missed-detection non-centrality pbias=√λ, and the K_fa/K_md/K_V solution-separation multipliers | VALIDATED exercised | integrity | SciPy 1.17.0 (scipy.stats.chi2/.norm/.ncx2 + optimize.brentq) — independent library (Cephes/Boost), a different algorithm from Kshana's incomplete-gamma series; matched to ≤1e-6 rel. Kernel only. The ARAIM MHSS P_HMI budget *allocation* is no longer without a published numeric oracle — the WG-C ARAIM Technical Subgroup's own worked example now backs the separate 'ARAIM MHSS protection levels against published reference vectors' row, matched at the reference's own TOL_PL = 5e-2 m — so this row's scope is the statistical kernel and that row carries the allocation (see docs/ARAIM_REFERENCE.md) (ExternalDataset) | tests/raim_reference.rs (171 cases: χ² CDF/quantile, normal CDF/quantile, non-central χ² CDF, pbias across the P_fa/P_md/redundancy ranges) |
| GNSS-denied clock holdover Closed-form coast-error growth + holdover-to-threshold; quantum-clock classes | MODELLED exercised | clock | Multi-step clock_state covariance recursion (same-codebase cross-check); the underlying coast-variance & holdover-inversion kernel is externally validated vs scipy (see 'Clock-holdover coast-variance & threshold inversion'). The per-class red-noise-floor holdover figures stay MODELLED (ReferenceImpl) | holdover::tests (vs multi-step Kalman covariance recursion; white-FM exact; round-trip); coast-variance kernel externally validated in tests/gnss_denied_clock_holdover_reference.rs (vs scipy Van-Loan/brentq) |
| Onboard clock state estimation 3-state (phase/freq/drift) van-Loan Kalman clock, Joseph-stabilised | MODELLED exercised | clock | filterpy 1.4.5 KalmanFilter (R. Labbe, MIT), with F via scipy.linalg.expm and Q via the Van-Loan 1978 block-matrix — an independent reference implementation reproducing kshana's full filter trajectory. Cross-implementation consistency: the clock physics / Allan calibration are not externally validated, so this stays MODELLED (ReferenceImpl) | clock_state::tests (analytic van-Loan Q; NEES; PSD positivity); tests/clock_state_reference.rs (full predict+update trajectory — state x and 3×3 covariance P over 1925 steps / 4 parameter sets vs filterpy 1.4.5; worst |relΔ| 2.8e-14) |
| Quantum inertial sensor performance Cold-atom interferometer accelerometer from first principles (k_eff·T², QPN) | MODELLED exercised | gnss-ins | Published CAI primary-paper numeric vectors (Cheinet 2008 transfer function; Peters/Freier sensitivity): k_eff·T² matched exactly, shot-noise ASD a one-sided floor within ~2× of each published instrument (real devices carry technical noise above the quantum floor). A bracket, not parity (ExternalDataset) | quantum_imu::tests (k_eff; Mach-Zehnder T²; Freier-2016 floor bracket); tests/quantum_inertial_sensor_reference.rs (transfer function |H(ω)|, k_eff·T² and shot-noise ASD vs published Cheinet 2008 / Peters / Freier numeric vectors) |
| GNSS/INS sensor fusion 15-state error-state EKF (loosely & tightly coupled), tightly-coupled pseudorange/Doppler UKF, and a coupled clock+position filter | MODELLED exercised | gnss-ins | filterpy 1.4.5 (R. Labbe, MIT) on numpy/scipy. The three LINEAR filters reach the uniquely-defined Bayesian posterior independently (Joseph vs standard form, machine precision) — a genuine library-vs-library check; the tightly-coupled UKF shares the same sigma-point recursion, so it is consistency-only. Stays MODELLED (the trajectory truth / sensor calibration are not externally validated) (ReferenceImpl) | fusion::tests (UKF==linear-KF identity; outage coast; NEES); tests/gnss_ins_sensor_fusion_reference.rs (50 cases vs filterpy 1.4.5: linear EKF loose/tight + coupled-PNT posteriors to ≤2.4e-12; UKF 40-epoch run worst |Δx| 1.9e-7 / |ΔP| 9.5e-6) |
| GNSS-denied jamming resilience Geometry J/S link budget, anti-jam C/N₀, per-satellite loss-of-lock | MODELLED exercised | jamming | Anti-jam C/N₀ link-budget equation cross-checked against an independent numpy re-derivation (shares the same closed form → InternalConsistency) plus a real-JammerTest-2024 C/N₀ degradation characterisation (InternalConsistency) | jamming::tests (PSD-derived Q cross-check; despreading); tests/gnss_denied_jamming_resilience_reference.rs (FSPL/J-S/effective-C-N₀ vs an independent numpy re-derivation of the Kaplan & Hegarty §9.4 link budget; real JammerTest C/N₀ falls monotonically through the 25 dB-Hz threshold) |
| Spoofing detection Clock-aided χ², RAIM, AGC, SQM fused per-epoch security FoM | MODELLED exercised | clock, spoof, spoof-detect | TEXBAT scenario parameters (Humphreys 2012) — characterisation, not pinned vectors (ExternalDataset) | tests/spoof_texbat_validation.rs (TEXBAT parameter characterisation) |
| Reproducibility & software assurance Deterministic, scenario-hashed, SBOM + cross-platform golden gates | MODELLED exercised | every run | SBOM conformance to the official CycloneDX 1.5 JSON Schema (+ valid SPDX identifiers) — an external published standard, zero validation errors over the full dependency graph; the FoM-determinism / byte-reproducibility part remains a pinned self-consistency check, so the row stays MODELLED (ExternalDataset) | tests/golden.rs, tests/determinism.rs, tests/cross_platform_golden.rs; tests/reproducibility_software_assurance_reference.rs (the generated SBOM validates with zero errors against the official CycloneDX 1.5 JSON Schema over the full 66-component shipped graph: default + python + wasm features, dev-dependencies excluded) |
| Navigation RF payload & antenna hardware design Not provided — Kshana models signal performance, not payload/antenna hardware | PARTNER relied on, not provided | jamming, spoof-detect | none: a partner-owned discipline, with no module and no test by design (NoneKind) | none: a partner-owned discipline |
| A chained mission across scenario kinds on one shared timeline The `campaign` kind's phases: each phase runs one or more scenarios of existing kinds through run_toml, reads their outputs into named channels (clock time error and guard, mean effective carrier-to-noise density ratio and tracking floor, vertical protection level and alert limit, position error, satellites tracking, alarm flags) by per-kind presets or explicit result paths, places them at the phase start and holds them onto a common grid, with phase boundaries and events; state is handed on by carry (a channel continues from the previous phase's end value), handoff (a previous phase's number written into the next scenario) and end_at (a phase ends at a time a run computed, such as a spoofing monitor's detection time); a campaign hash and a digest over every member result | MODELLED exercised | campaign | Composition identities against the stand-alone runs of the same kinds: a one-phase campaign reproduces the stand-alone output bit for bit, the carried offset equals the previous run's own last sample, and the phase ended by end_at has exactly the run's detection time as its length. The additive carry across a phase boundary and the zero-order hold are modelling choices, and each phase is as good as the kind that ran it; no chained mission has been checked against a measured one (InternalConsistency) | tests/campaign_composition_reference.rs (a_one_phase_clock_campaign_reproduces_the_standalone_run_bit_for_bit, a_one_phase_integrity_campaign_reproduces_the_standalone_run_bit_for_bit, a_one_phase_jamming_campaign_reproduces_the_standalone_run_bit_for_bit — the member result byte-identical to the stand-alone run and every aligned value equal to the stand-alone series; the_chained_mission_hands_state_on_and_ends_the_spoofing_phase_on_detection; a_handoff_writes_the_previous_phase_number_into_the_next_scenario; malformed_campaigns_fail_loudly) |
Each item is quoted from where it is stated: the result document, the kind catalogue, the scenario file, or the verification matrix's reason a MODELLED row stays modelled.
| Statement | Source |
|---|---|
| MODELLED composition of existing scenario kinds. Every number is read from a real run of the named kind; the chaining (additive carry of a channel across a phase boundary, zero-order hold onto the timeline grid, a phase ended at a computed time) is a modelling choice, and each phase carries the label of the kind that produced it. | result `label` |
| MODELLED: the additive carry and the zero-order hold are modelling choices, and each phase carries the label of the kind that ran it. | kind catalogue (`kshana kinds --json`) |
| MODELLED: the chaining is a modelling choice (additive carry, zero-order hold), and each phase is as good as the kind that ran it. | scenario file comment, lines 30 to 31 |
| GNSS-denied clock holdover is MODELLED, not validated: checked against a separate implementation in this same codebase — independent of the unit under test, but not externally authoritative. | verification matrix (docs/MODELLED-RATIONALE.md) |
| Onboard clock state estimation is MODELLED, not validated: checked against a separate implementation in this same codebase — independent of the unit under test, but not externally authoritative. | verification matrix (docs/MODELLED-RATIONALE.md) |
| Quantum inertial sensor performance is MODELLED, not validated: a sub-claim is externally checked, but the whole capability composes modelled pieces, so the capability stays Modelled. | verification matrix (docs/MODELLED-RATIONALE.md) |
| GNSS/INS sensor fusion is MODELLED, not validated: checked against a separate implementation in this same codebase — independent of the unit under test, but not externally authoritative. | verification matrix (docs/MODELLED-RATIONALE.md) |
| GNSS-denied jamming resilience is MODELLED, not validated: checked against its own closed-form / analytic identity — catches transcription and coefficient errors, but is not an external oracle. | verification matrix (docs/MODELLED-RATIONALE.md) |
| Spoofing detection is MODELLED, not validated: a sub-claim is externally checked, but the whole capability composes modelled pieces, so the capability stays Modelled. | verification matrix (docs/MODELLED-RATIONALE.md) |
| Reproducibility & software assurance is MODELLED, not validated: a sub-claim is externally checked, but the whole capability composes modelled pieces, so the capability stays Modelled. | verification matrix (docs/MODELLED-RATIONALE.md) |
| A chained mission across scenario kinds on one shared timeline is MODELLED, not validated: checked against its own closed-form / analytic identity — catches transcription and coefficient errors, but is not an external oracle. | verification matrix (docs/MODELLED-RATIONALE.md) |
| Command to reproduce | kshana scenarios/campaign-jam-spoof-holdover-integrity.toml |
|---|---|
| Working directory | Run the command from the directory the original run was started in: the scenario path, and any relative data path inside the scenario, resolve against it. Check the scenario file against scenario_sha256 first. |
| Engine version | 0.29.0 |
| Source commit | not recorded: this engine was built without the KSHANA_GIT_COMMIT environment variable; the engine version identifies the release |
| Scenario file | campaign-jam-spoof-holdover-integrity.toml |
| Scenario file SHA-256 (Secure Hash Algorithm 256-bit) | cec1e10f8eb478bae58acebe9c2f06cfccf6572f6f6895dc633fb409b8d8ee5f |
| Result scenario_hash | f87a4a0e0babe2ea4b7e8adc7739cf564e270dc1c261d2ff48386766bf9d1ba1 (the kind's own fingerprint of the scenario; not the file digest) |
| Result document SHA-256 | cb8d821da6eabd70e638b5ad5eb5103efcff69ab63c78f97d34e7d5d2cb5879a (campaign-jam-spoof-holdover-integrity.result.json) |
| Seed | 20260928 (scenario `seed`) |
| Platform | macos / aarch64 (unix) |
| Determinism | Same scenario bytes, seed and engine build give a byte-identical result document and report; this report carries no timestamp. Floating-point results are pinned per platform; another operating system or architecture may differ in the last digits. |
To print this page to a Portable Document Format (PDF) file, use the browser's print dialog and choose “Save as PDF”; the print stylesheet fits A4 and US Letter paper, repeats table headers across pages and starts the inputs, results, labels and reproducibility sections on a new page. The engine writes no PDF itself. report.json carries the same content as this page.