Jammertest-poängsättning: den publicerade planen som schemalagd referens
kshana jammertest import läser Jammertests testkatalog och sändningsplan och gör om ett testområdes tidsluckor till receiver-trust [[events]]. kshana jammertest score kör en mottagarlogg genom förtroendemonitorerna och poängsätter den mot det schemat, test för test. Varje resultat är MODELLED: schemat anger när ett test var planerat, inte när en sändare var på.
Rådgivande programvara, inte typgodkänd navigationsutrustning (IEC 61108, IEC 61162): operatören är fortsatt ansvarig för fartygets navigering. Inget här stöds av Norwegian Public Roads Administration, Nkom eller evenemangets arrangörer; inget avtal med dem görs gällande.
Planen och katalogen#
Källa: Norwegian Public Roads Administrations repository NPRA/jammertest-plan (https://github.com/NPRA/jammertest-plan), MIT-licens (copyright 2024 Norwegian Public Roads Administration; licenstexten kontrolleras i xval/jammertest-plan/MANIFEST.tsv). Filerna hämtas, aldrig inkluderade i källkoden:
xval/jammertest-plan/fetch.sh <dest-dir-outside-the-repo>
Den hämtar katalogerna och planfilerna för 2025 vid den fastlåsta incheckningen 75c0b2ceea10e470c3799d14a8ef18842d8375a7 och avvisar varje fil vars SHA-256 skiljer sig från xval/jammertest-plan/MANIFEST.tsv.
Ett katalogtest har ett punktseparerat id, type.group.test (till exempel 1.2.5: typ 1 jamming, grupp 2, test 5). Planen listar, per testområde och tidslucka, vilket id som är schemalagt. Typerna 1 (jamming), 2 (spoofing) och 3 (meaconing) sänder; typ 0 (genomgångar, karenstid, bokade och ad hoc-luckor) sänder inte och hoppas över. Plantider är lokal väggklocktid; --local-offset-h (standardvärde 2, CEST) anger hur långt de ligger från UTC. Planfilerna har ett testkontaktfält med en persons namn: det läses aldrig, och inget som härleds från det skrivs.
Import#
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> ersätter --log/--format när loggen inte anger sin start. Utdata är TOML [[events]] att lägga till i ett receiver-trust-scenario; varje etikett börjar med scheduled truth: och innehåller utgåveåret, katalogid och området, och huvudet registrerar SHA-256 för varje källfil. --attack-log <scenario.json> läser i stället händelsereferensen för en mapp i JammerTest-datamängden för 2024 (dess attack_log, tidsstämplar förskjutna med --time-shift-h, standardvärde -2: de säger Z men är lokal tid).
Poängsättning#
kshana jammertest score session.toml --catalog testcatalog2025.json --plan plan-....json \
--location 1 [--json] [--key signer.key --out pack/]
session.toml är ett receiver-trust-scenario ([log] format/path, valfritt [monitors], [compare]). Dess egna [[events]] ersätts av det importerade schemat. Per schemalagt test:
| fält | betydelse |
|---|---|
outcome |
detected (ett larm inom compare.detect_tol_s, standardvärde 10 s, från planerad start), late (senare, inom luckan), missed (inget), not-evaluable |
latency_s |
första larmet minus planerad start |
time_to_recover_s |
luckans slut till starten av den första sträckan på minst --recover-hold-s (10 s) utan larm, före nästa test |
Ett test kan poängsättas bara om det startar minst calibration_s + guard_s efter att loggen började; en logg med ett tidigare test flaggas baseline_contaminated (baslinjen kan ha bildats under störning). Falsklarm är larmande epoker efter kalibreringen utanför varje lucka utvidgad med --guard-s (60 s) före och efter (eller efter återhämtningspunkten), räknade som epoker och som körningar, med körningar per timme ren tid. Med --key och --out skrivs körningen som ett signerat bevispaket (docs/EVIDENCE-PACKS.md): resultatkortet och det importerade schemat ligger i config.json, alltså inom hashkedjan och signaturen. Ett paket är en teknisk journal, inte ett juridiskt utlåtande.
Vad ett resultat inte säger#
- En planerad lucka är inte en sändningslogg. En sändare kan ha startat sent, stoppat tidigt eller aldrig körts; ett "missat" test kan vara ett test som inte sände, och en tidsfördröjning räknas från planerad start.
- En "ren" epok är "utanför de planerade luckorna", inte "bevisat störningsfri".
- Detektion med monitorer i mätdomänen säger ingenting om detektion av en spoofer med låg effekt och koherens.
- Ingen extern oberoende referens anger de verkliga sändningstiderna, så inget här är VALIDATED.
Körningen på datamängden för 2024 (förhandsregistrerad)#
xval/jammertest-score/PREREGISTRATION.md fastställde populationen, definitionerna och trösklarna före den första poängsatta körningen; xval/jammertest-score/RESULTS.md registrerar den körningen. Resultat: den registrerade regeln om minsta datamängd misslyckades (4 poängsättningsbara jamming-fönster från 4 av de 12 .ubx-mapparna: 5 mappar föll bort på grund av baslinjeregeln och 3 UBX-loggar anger sin start bara som GPS-veckotid), så ingen tröskel kan bedömas. Inget lättades på eller kördes om. v2 (PREREGISTRATION-v2.md, incheckad ensam före sin körning; enbart datahantering, samma trösklar och samma regel om minsta datamängd) placerade loggarna med enbart GPS-tid utifrån mappens datum, poängsatte de 12 mapparna med enbart CSV och använde en session för rörlig plattform för de rörliga rovrarna. Resultat (RESULTS-v2.md): 14 av 24 mappar behölls men bara 7 poängsättningsbara jamming-fönster, så regeln om minsta datamängd misslyckades igen och ingen tröskel kan bedömas. Resultatet för v1 är oförändrat. Endast beskrivande: 3 av 7 jamming-fönster gav larm inom 10 s, 4 senare, inga missade; mediantid till detektion 18 s; larmfrekvens vid ren signal 0,089. Den bindande begränsningen är nu baslinjeregeln, som tar bort 10 mappar; en ytterligare registrering skulle kräva en annan regel för tidiga fönster. Datamängden (JammerTest 2024, Zenodo 15911589, GPL-3.0-or-later) hämtas av xval/oracles/setup.sh och inkluderas aldrig i källkoden; testet tests/jammertest_score_2024.rs fäster den registrerade körningen när KSHANA_JAMMERTEST_DIR pekar på den uppackade datamängden.
NMEA-datamängden från SimulaMet för 2025#
NMEA-härledda datamängden från SimulaMet Jammertest 2025 (IEEE DataPort, DOI 10.21227/a7v4-xw11) är inte anpassad i 0,38. Dess sida anger ingen licens och säger "This dataset requires an IEEE DataPort Subscription to access" (datamängden kräver en IEEE DataPort-prenumeration för åtkomst): villkoren tillåter inte tydligt vidaredistribution eller automatisk hämtning, så ingen adapter eller hämtningsskript skrevs. Att använda den kräver ägarens beslut och helst författarnas skriftliga medgivande.
Ytor#
CLI, Rust (kshana::jammertest), Python (jammertest_import, jammertest_score), WebAssembly (samma namn), MCP-verktyg med samma namn samt kommandot /kshana-jammertest och färdigheten jammertest. Det signerade paketet finns bara på kommandoraden (det kräver en signeringsnyckel). Se docs/SURFACES.md.