Оцінювання Jammertest: опублікований план як запланована істина
kshana jammertest import читає каталог тестів Jammertest і план передавання та перетворює слоти однієї тестової зони на [[events]] для receiver-trust. kshana jammertest score пропускає журнал приймача через монітори довіри й оцінює його щодо цього розкладу, тест за тестом. Кожен результат — MODELLED: розклад каже, коли тест було заплановано, а не коли був увімкнений передавач.
Консультативне програмне забезпечення, не навігаційне обладнання із затвердженням типу (IEC 61108, IEC 61162): відповідальність за навігацію судна залишається на операторі. Нічого з цього не схвалено Норвезькою адміністрацією державних доріг, Nkom чи організаторами заходу; жодної угоди з ними не заявляється.
План і каталог#
Джерело: репозиторій NPRA/jammertest-plan Норвезької адміністрації державних доріг (https://github.com/NPRA/jammertest-plan), ліцензія MIT (авторське право 2024 Норвезька адміністрація державних доріг; текст ліцензії перевіряється в xval/jammertest-plan/MANIFEST.tsv). Файли завантажують, а не вбудовують до репозиторію:
xval/jammertest-plan/fetch.sh <dest-dir-outside-the-repo>
Він завантажує каталоги та файли плану 2025 за закріпленим комітом 75c0b2ceea10e470c3799d14a8ef18842d8375a7 і відхиляє будь-який файл, чий SHA-256 відрізняється від xval/jammertest-plan/MANIFEST.tsv.
Тест каталогу має ідентифікатор із крапками, type.group.test (наприклад, 1.2.5: тип 1 глушіння, група 2, тест 5). План перелічує для кожної тестової зони та часового слоту, який ідентифікатор заплановано. Типи 1 (глушіння), 2 (спуфінг) і 3 (meaconing) передають; тип 0 (брифінги, пільговий період, бронювання та позачергові слоти) не передає і пропускається. Час у плані — місцевий настінний; --local-offset-h (типово 2, CEST) каже, наскільки він відрізняється від UTC. Файли плану містять поле контактної особи тесту з ім'ям людини: його ніколи не читають, і нічого, отриманого з нього, не записують.
Імпорт#
kshana jammertest import --catalog testcatalog2025.json \
--plan plan-tuesday-2025-09-16.json --plan plan-wednesday-2025-09-17.json \
--location 1 --log receiver.ubx --format ubx --out events.toml
--log-start <UTC time> замінює --log/--format, коли журнал не вказує свого початку. Вихід — це TOML [[events]], який додають до сценарію receiver-trust; кожна мітка починається з scheduled truth: і несе рік видання, ідентифікатор каталогу та зону, а заголовок записує SHA-256 кожного вихідного файла. --attack-log <scenario.json> натомість читає істину про події однієї теки набору даних JammerTest 2024 (його attack_log, мітки зсунуто на --time-shift-h, типово -2: вони містять Z, але це місцевий час).
Оцінка#
kshana jammertest score session.toml --catalog testcatalog2025.json --plan plan-....json \
--location 1 [--json] [--key signer.key --out pack/]
session.toml — це сценарій receiver-trust ([log] format/path, необов'язково [monitors], [compare]). Його власні [[events]] замінюються імпортованим розкладом. Для кожного запланованого тесту:
| поле | значення |
|---|---|
outcome |
detected (тривога протягом compare.detect_tol_s, типово 10 с, від запланованого початку), late (пізніше, у межах слота), missed (жодної), not-evaluable |
latency_s |
перша тривога мінус запланований початок |
time_to_recover_s |
від кінця слота до початку першого відрізка щонайменше --recover-hold-s (10 с) без тривоги, перед наступним тестом |
Тест піддається оцінюванню, лише якщо він починається щонайменше через calibration_s + guard_s після початку журналу; журнал із раннішим тестом позначається baseline_contaminated (базовий рівень міг формуватися під завадами). Хибні тривоги — це епохи тривоги після калібрування поза кожним слотом, розширеним на --guard-s (60 с) до і після (або після точки відновлення), що рахуються як епохи й як прогони, із прогонами на годину чистого часу. З --key і --out прогін записують як підписаний пакет доказів (docs/EVIDENCE-PACKS.md): таблиця оцінок і імпортований розклад лежать усередині config.json, а отже, усередині ланцюжка хешів і підпису. Пакет — це технічний запис, а не юридичний висновок.
Чого результат не говорить#
- Запланований слот не є записом ефіру. Передавач міг запуститися пізно, зупинитися рано або не працювати зовсім; «пропущений» тест може бути тестом, який не передавав, а затримка відлічується від запланованого початку.
- «Чиста» епоха — це «поза запланованими слотами», а не «доведено, що без завад».
- Виявлення моніторами вимірювальної області нічого не говорить про виявлення малопотужного когерентного спуфера.
- Жоден зовнішній оракул не називає істинного часу в ефірі, тому тут нічого немає VALIDATED.
Прогін набору даних 2024 (попередньо зареєстрований)#
xval/jammertest-score/PREREGISTRATION.md зафіксував вибірку, визначення та пороги до першого оціненого прогону; xval/jammertest-score/RESULTS.md фіксує цей прогін. Результат: зареєстроване правило мінімуму даних не виконано (4 придатні до оцінювання вікна глушіння з 4 із 12 тек .ubx: 5 тек відкинуто за правилом базового рівня, а 3 журнали UBX вказують свій початок лише як тиждень і секунду тижня GPS), тому жоден поріг не можна оцінити. Нічого не послаблювали і не запускали повторно. v2 (PREREGISTRATION-v2.md, закомічено окремо до свого прогону; лише обробка даних, ті самі пороги й правило мінімуму даних) розмістила журнали лише з часом GPS за датою теки, оцінила 12 тек лише з CSV і використала сеанс рухомої платформи для рухомих роверів. Результат (RESULTS-v2.md): збережено 14 із 24 тек, але лише 7 придатних до оцінювання вікон глушіння, тож правило мінімуму даних знову не виконано і жоден поріг не можна оцінити. Результат v1 не змінився. Лише описово: 3 із 7 вікон глушіння дали тривогу протягом 10 с, 4 пізніше, жодного не пропущено; медіанна затримка 18 с; частота хибних тривог на чистому 0,089. Визначальне обмеження тепер — правило базового рівня, яке відкидає 10 тек; подальша реєстрація потребувала б іншого правила для ранніх вікон. Набір даних (JammerTest 2024, Zenodo 15911589, GPL-3.0-or-later) завантажується через xval/oracles/setup.sh і ніколи не вбудовується до репозиторію; тест tests/jammertest_score_2024.rs закріплює записаний прогін, коли KSHANA_JAMMERTEST_DIR вказує на розпакований набір даних.
Набір даних SimulaMet NMEA 2025#
Набір даних SimulaMet Jammertest 2025, отриманий з NMEA (IEEE DataPort, DOI 10.21227/a7v4-xw11), у 0,38 не адаптовано. Його сторінка не вказує ліцензії і стверджує: «This dataset requires an IEEE DataPort Subscription to access» (цей набір даних потребує підписки IEEE DataPort для доступу): умови чітко не дозволяють повторного розповсюдження чи автоматичного завантаження, тому адаптера чи скрипта завантаження не писали. Його використання потребує рішення власника і, в ідеалі, письмової згоди авторів.
Поверхні#
CLI, Rust (kshana::jammertest), Python (jammertest_import, jammertest_score), WebAssembly (ті самі назви), інструменти MCP з тими самими назвами, а також команда /kshana-jammertest і навичка jammertest. Підписаний пакет доступний лише з командного рядка (потрібен ключ підпису). Див. docs/SURFACES.md.