Журнал изменений
Здесь документированы все значимые изменения Kshana.
Формат основан на Keep a Changelog, а проект следует семантическому версионированию. Пока проект находится до версии 1.0, публичная схема сценариев и результатов может меняться; несовместимые изменения оговариваются явно.
Не выпущено#
[0.40.0] - 2026-10-29#
0,40 добавляет нить миссии класса Artemis и её лунный сегмент, метку доказательств у каждого показателя и таблицы, которые записывает прогон, приём и подгонку измеренных часов, проверку заявок партнёров по данным, оценку области излучателя по сообщениям ADS-B или AIS, повторную кампанию бенчмарка 0,40, а также командную строку, отчёты и Studio на семнадцати языках наряду с английским (машинные документы остаются на английском). Матрица верификации растёт с 388 до 401 строк: 176 VALIDATED (без изменений), 221 MODELLED (было 208) и 4 PARTNER. Ни одна строка не была повышена до VALIDATED. Виды сценариев растут с 87 до 92. Каждый порог, который не достигло заранее зарегистрированное сравнение, назван ниже и остаётся зафиксированным; ни один не был ослаблен. Консультативное заявление не изменилось: Kshana — программное обеспечение консультативного характера, не навигационное оборудование с утверждённым типом и не сертификация; ответственность остаётся на операторе.
Известные ограничения#
- Запуски на языках, отличных от английского, занимают примерно вдвое больше времени, потому что сценарий выполняется дважды (один раз на английском для машинных файлов, один раз на выбранном языке для человека).
- Некоторые предложения Studio собираются из фрагментов и могут быть грамматически неточны в языках с грамматическим родом.
- Переводы являются машинными и не проверены носителями языка; эталоном служит английская версия.
Добавлено#
- Семнадцать языков наряду с английским для текста движка, предназначенного человеку, а также для сайта и Studio: nl, pl, pt-BR, pt-PT, fi, sv, da, nb, cs, uk, ru, de, fr, es, et, ja, zh-Hans (
--lang,KSHANA_LANG, переменные локали;langв вызовах библиотеки, Python, WebAssembly и MCP). Сообщения и ошибки командной строки, сводки прогонов, текст графиков,report.html, описания видов и консультативные заявления переведены; машинные документы (JSON, CSV, коды ошибок, матрица верификации) остаются на английском, а прогон не на английском выполняет сценарий один раз на английском для машинных файлов и один раз на выбранном языке для человека (docs/i18n.md). Переводы являются машинными, не проверенными носителями языка; эталоном служит английская версия;REVIEW.mdкаждого языка перечисляет, что рецензенту следует проверить в первую очередь, а страницы сайта несут уведомление об этом. Слова вердиктов, уровни доказательств и границы консультативного заявления («не оборудование с утверждённым типом», «не сертификация», «ответственность остаётся на операторе») сохранены на каждом языке. kshana interference-map locate: оценка области излучателя по сообщениям ADS-B или AIS. Апостериорное распределение того, где может находиться источник ухудшения сообщений о положении (радиопрямая видимость на радиусе Земли 4/3, высота антенны излучателя и мощность маргинализированы, затронутые воздушные суда смещают оценку к себе, а незатронутые воздушные суда с прямой видимостью отталкивают её), записанное как области на уровнях 50, 90 и 95%, центроид с эллипсом неопределённости (никогда не одна точка), сеансы во времени (начало, конец, длительность, затронутая площадь, число различных воздушных судов выше минимума для публикации), суточный профиль и часы в сутки, с необязательным объединением с определением TDOA изgeolocation. Выходные данные: GeoJSON, сводка JSON, CSV сеансов и рисунок SVG; каждый несёт лицензию, указание авторства, идентификатор метода, допущения, ограничения и свою метку доказательств. Библиотекаinterference_map::api::emitter_regions_from_*, Python и WebAssemblyinterference_emitter_regions. MODELLED (строка реестраVM-bc70cb57; в матрице теперь 401 строк, 176 VALIDATED, 221 MODELLED, 4 PARTNER); калибровано только на синтетических данных, а сравнение с площадками передатчиков Jammertest 2025 зарегистрировано заранее и выполнено один раз: для ADS-B и AIS оба NOT ASSESSABLE (в открытых данных слишком мало запланированных сеансов), поэтому строка остаётся MODELLED (docs/emitter-region/RESULTS.md). Нейтральные формулировки, только агрегаты; публикация областей излучателей в публичной обсерватории остаётся отключённой. Синтетический пример находится вexamples/emitter-region/(docs/INTERFERENCE-MAP.md).- Журналы измеренных часов.
src/clock_log.rsчитает журнал измеренных часов в один ряд фазы: восемь форматов (RINEX clock, TimeLab, TICC, linuxptpptp4l,phc2sysиts2phc, слежение и статистика chrony), каждый — документированное подмножество; всё, что вне него, отклоняется с ошибкой, называющей найденное. Он используется видомtelecom-timing([series.clock_log]) и видом clock ([clock_log], который добавляет блокmeasuredс SHA-256 журнала и перекрывающимися ADEV, TDEV и MTIE), с поставляемым сценариемclock-measured-log(docs/CLOCK-LOG-FORMATS.md). В сравнении с allantools на реальных открытых данных по заранее зарегистрированным порогам первый прогон не достиг B1 (5 из 11 случаев, все отметки времени TICC хранились какf64), B2, B3 (7 из 24 случаев) и B4 (версия заголовка не проверялась); после исправлений B1, B3 и B4 достигнуты, а B2 достигнут, кроме одной пары MTIE, которая зафиксирована и не является дефектом движка (allantools 2024,6 убирает среднюю частоту до интегрирования; по его MTIE в режиме фазы движок согласуется в пределах 1e-10). Строка остаётся MODELLED (tests/fixtures/clock_log_real/RESULTS.md). - Holdover, управляемый подогнанным измеренным рядом:
[clock_fit]вида clock подгоняет шум измеренного ряда и по нему управляет holdover (src/clock_fit.rs, поставляемый сценарийclock-fitted-log). Заранее зарегистрированное сравнение: F1(b), F3 и F4 достигнуты; F1(a) (восстановление зарегистрированного случайного блуждания FM) NOT MET на записях C3 (неидентифицируемо по построению) и на двух из трёх записей C4 (случайное блуждание FM поглощено фликкер-FM и дрейфом); F2 (идентификация шума по allantools) достигнут на одиннадцати из двенадцати записей, а D3 достигнут и NOT MET на D2 в том виде, как зарегистрирован (достигнут при сопоставимых условиях). Все промахи зафиксированы (tests/clock_fit_known_noise.rs); блокfittedи управляемый им holdover остаются MODELLED (tests/fixtures/clock_fit/RESULTS.md). - Повторная кампания бенчмарка 0,40, зарегистрированная заранее с утверждением владельца до любого прогона: A3 (EXPLORATORY, AUC с бутстрепом по кластерам папок для
agc_k_sigma, квантиль 2,5 % равен 0,8502 против 0,80), D3 (EXPLORATORY, три из пяти детекторов превышают разрыв оптимизма 0,05 при масштабе 0,25), R3 (AUC 1,0) и R4 (P_fa 0,0, P_d 1,0): все MET, все MODELLED. A2, D1 и R1 не затронуты и остаются NOT MET; ничто здесь их не закрывает (xval/bench/RESULTS-0.40.md, Bench). kshana partner check <submission.toml>: проверяет формат и метаданные заявки партнёра по данным (kshana.partner-submission/1: устройство, файл данных и SHA-256, как они получены, строки MODELLED, для которых они предлагаются, лицензия, заявления) и читает данные собственными средствами чтения журналов часов или IMU движка. Он ничего не оценивает и ничего не подтверждает независимо. Синтетический пример находится вexamples/partner-submission/.docs/PARTNER-DATA.md: какие строки реестра MODELLED могут быть повышены измеренными данными, какие форматы принимаются, как заявка проверяется, оценивается по заранее зарегистрированному порогу и засчитывается, а также что означают PARTNER и VALIDATED; черновик письма владельцу для связи с партнёрами находится вdocs/drafts/PARTNER-OUTREACH.md(ничего не отправляется).- Вторые кампании для порогов
gnss-ssvиlunar-infrastructure, которые не были достигнуты, выполнены как зарегистрировано заранее (xval/gnss-ssv/PREREGISTRATION-v2.md,xval/lunar-infra/PREREGISTRATION-v2.md; утверждены до любого прогона). Каждый исходный промах остаётся NOT MET и зафиксирован.gnss-ssv: контрольный прогон воспроизводит прогон 1 ячейка в ячейку; пять абляций с одним показанием вводят 2 из 78 не достигших порога ячеек в допуск (EXPLORATORY, без порога); новый порог S7b (форма передачи со спадом и полом, подогнанная на панелях Classic IIR) NOT MET на панелях IIR-M при 3,83–3,95 дБ против 3 дБ; кампания по опубликованному приёму с отложенными данными не выполнялась (источник не закреплён) (xval/gnss-ssv/RESULTS-v2.md).lunar-infrastructure: новые пороги C3a, C3b (предел обнаружения около 3e-9 м/с2), Q3a, Q3b (точная функция распределения нормального закона убирает разность 1.7e-6) и G3'' достигнуты как собственные пороги, а G3' с иллюстративными априорными распределениями достигнут и помечен EXPLORATORY (xval/lunar-infra/RESULTS-v2.md). Всё остаётся MODELLED. Новые открытые элементы:kshana::lambda::{erfc_accurate, normal_cdf_accurate, bootstrap_success_rate_accurate}. - Метка доказательств у каждого показателя и таблицы, которые записывает прогон. В JSON результата есть ключ
evidence, в SVG графика — элемент метаданных и строка под графиком, а в таблице CSV — строки комментариев# evidence:: уровень (VALIDATED,MODELLEDилиPARTNER, наименьший из уровней строк) и идентификаторы строк матрицы верификации, на которых основан прогон. Строки и статусы считываются из матрицы, а не вводятся вручную; идентификаторы стабильны (VM-и восемь шестнадцатеричных цифр, новый столбецIDвdocs/VERIFICATION-MATRIX.md, замороженный список вtests/fixtures/evidence_ids.txt). Также у receiver-trust,jammertest score,iq acquire/sweep/track/monitor, отчёта об экспозиции маршрута и внутри подписанногоconfig.jsonу каждого пакета доказательств (config_version1,1;kshana evidence verifyсообщает уровень; пакеты, созданные до 0,40, проверяются без изменений).tests/evidence_labels_doc_sync.rsзавершается ошибкой, если у показателя нет метки, метка расходится с матрицей или новый писатель файлов не помечен и не внесён в список с указанием причины. Выходные данные, не несущие метки, перечислены вdocs/SURFACES.md. Три демонстрационных графика README были построены заново с меткой (если её убрать, возвращаются прежние байты;docs/revisions/STUDIO15-evidence-label-0.40.md). Ни одно утверждение не изменилось. - Вид сценариев
mission-thread(scenarios/mission-thread-artemis-class.toml,docs/MISSION-THREAD.md): бюджет ошибок навигации и синхронизации времени цепочки фаз от запуска до входа в атмосферу, каждое число MODELLED и каждый вход задан. Восемь видов фаз:launch-ascent,leo-rendezvous(относительная ковариация Клохесси–Уилтшира по участкам датчиков, окно стыковки),tli-and-cruise(распространение по Коуэллу с матрицей перехода состояния, полученной конечными разностями, ошибка импульса, определенияgnss-ssvи обновления наземного слежения, Луна из необязательного среза ядра DE440),entry(сигма угла наклона траектории, вероятность коридора, пиковое замедление на границах коридора, пятно посадки) и четыре лунных вида. Правила передачи (carry,inflate,reacquire), преобразования систем координат и шкал времени отдельными строками бюджета, необязательное наложение наземной сети, задающее скважность слежения каждой фазы, запас относительно заданных требований и самое слабое звено. Пример следует последовательности из открытой презентации концепции операций NASA с числами ILLUSTRATIVE: сквозной пример класса Artemis из 11 фаз, земной и лунный сегменты. Цислунное распространение сравнивалось с открытой траекторией Artemis I на дуге 72 ч по порогу, зафиксированному вxval/mission-thread/PREREGISTRATION.mdдо прогона: NOT MET (45,3 км и 0,25 м/с против 5 км и 0,05 м/с). Диагностика относит промах к пяти малым импульсным событиям в эталоне; между ними модель сил воспроизводит часовые состояния с медианой 0,4 м. Строка остаётся MODELLED (xval/mission-thread/RESULTS.md). - Лунный сегмент нити миссии класса Artemis: четыре вида сценариев, каждый также является видом фазы интерфейса
mission-thread(src/mission_thread/lunar/), и каждый MODELLED.lunar-orbit-rendezvous: относительная навигация до стыковки на круговой полярной орбите высотой 100 км или на эллиптической полярной орбите 100 км на 3000 км (scenarios/lunar-orbit-rendezvous.toml,...-elfo.toml). Пакетная оценка Гаусса–Ньютона по дуге объединяет абсолютное определение для каждого аппарата по иллюстративному набору ретрансляторов класса LCNS, устойчивую ошибку сигнала в пространстве (общую для обоих аппаратов и независимую) и дальность межспутниковой линии при лунной модели сил крейта. Она сообщает относительное положение и скорость в локальных осях цели, доступность определений, среднюю нормированную квадратичную ошибку оценки в сравнении с ожидаемым значением, цену пренебрежения гармониками гравитации, модели конечных относительных датчиков рядом с показателем только по сигналам и передаваемую ковариацию 6x6.lunar-descent: бюджет рассеяния посадки в южно-полярной точке (scenarios/lunar-descent.toml;lunar-descent-lola.tomlчитает ЦМР LOLA из рабочей копии): пятисостоянная инерциальная модель ошибок по осям, определение AFS (автономное или дифференциальное, с использованием остатка линии коррекции изlunar-differential-pnt), определение по рельефу (сопоставительterrain-navна его синтетическом рельефе или граница Крамера–Рао для сопоставления с ЦМР LOLA) и лунное время через часы аппарата (lunar-time-offset). Она сообщает эллипс посадки 3 сигма, каждое сочетание средств и калибровку эллипса по методу Монте-Карло.lunar-surface: доступность позиционирования и синхронизации времени по точке и сезону (scenarios/lunar-surface.toml;lunar-surface-terrain.tomlдобавляет горизонт LOLA, полученный трассировкой лучей): показатель позиционирования для одной точки равен показателюmoonlight-service-volumeдо бита; с сезоном меняется видимость Земли и Солнца по аналитическим эфемеридам.lunar-ascent: подъём на орбиту сближения и ковариация положения и скорости, возвращаемая на орбиту (scenarios/lunar-ascent.toml), с разбросом при отсечке двигателя, сообщаемым рядом с ней.docs/MISSION-THREAD-LUNAR.md; предварительная регистрация, её поправки и каждый результат, включая промахи, находятся вxval/mission-thread-lunar/.
Доказательства#
- Зарегистрировано заранее в
xval/mission-thread-lunar/PREREGISTRATION.mdдо любого прогона, с шестью датированными поправками (каждая внесена до получения данных, кроме поправки 6, которая исправляет арифметическую ошибку в числе состояний после получения данных и до любого результата A2; каждая поправка раскрыта в файле). Ни один порог не был ослаблен. - A1 (пропагатор в сравнении с восстановленной траекторией LRO из JPL Horizons, 24 ч): MET, максимальная 3-D разность 33 м при пороге 500 м и радиальная СКО 2,4 м при 60 м.
- A2 (тот же пропагатор в сравнении с NRHO CAPSTONE за один оборот длительностью 6.5 суток): NOT MET, разность конечных положений 136,8 км при пороге 25 км и разность радиусов оскулирующего перицентра 28,4 км против 10 км. Строка остаётся MODELLED, а промах зафиксирован в
tests/mission_thread_lunar_oracles.rs. - B1 (согласованность оценки сближения с её собственной моделью) MET на четвёртой конструкции оценивателя, среднее NEES от 5,85 до 5,93 при полосе [5,2, 6,8]; три более ранние конструкции, расширенный фильтр Калмана в трёх вариантах, её не достигли. Пятое изменение, сделанное после того, как оказалось, что поставляемый 2-часовой сценарий отправляет 4 из 50 испытаний в локальный минимум (среднее NEES 1e9), запускает подгонку Гаусса–Ньютона на растущей дуге с делением шага; B1 от него не меняется, а поставляемые сценарии дают 6,51 и 6,33. История находится в
xval/mission-thread-lunar/RESULTS.md. - Ничто здесь не VALIDATED: строки с оракулами проверяют общий пропагатор, а не навигационный фильтр, сигнал или бюджет.
[0.39.0] - 2026-10-22#
Новых возможностей нет: одно исправление командной строки, обновления зависимостей в инструментарии перекрёстной проверки и документация. Результаты движка не изменились по сравнению с 0.38.0.
Исправлено#
- Командная строка тихо завершается со статусом 141, когда её стандартный вывод закрывается (
kshana kinds | head), вместо аварийного завершения с сообщением "failed printing to stdout: Broken pipe". 141 — это 128 плюс SIGPIPE, статус, который оболочка сообщает дляyes | head. Обрабатывается только закрытый канал: переполненный диск или любая другая ошибка записи по-прежнему сообщает о себе, а живой поток, пишущий в закрытый сокет, по-прежнему получает свою ошибку записи.tests/cli_closed_pipe.rsзакрывает читающую сторону до запуска программы, поэтому первая запись завершается ошибкой при каждом запуске.
Безопасность#
Одно обновление зависимости в поставляемой библиотеке (первая запись), остальные — в инструментарии перекрёстной проверки (xval/).
p256,p384иp521с 0,13 до 0,14 (сelliptic-curve0.14.3,ecdsa0.17.0 иcrypto-bigintс 0.5.5 до 0.7.10; также прямая зависимостьcrypto-bigint, теперь 0,7) устраняют RUSTSEC-2026-0387, вариативность времени выполнения вcrypto-bigint0.5.5. Kshana использует эти крейты только для проверки открытых подписей (корневой ключ Galileo OSNMA и токены меток времени RFC 3161) и подписывает только в тестах одноразовыми ключами, поэтому практическая подверженность была нулевой; обновление снимает уведомление без записи об игнорировании. Файлы блокировки библиотеки и MCP обновляются оба; ни один результат проверки не меняется (тесты векторов OSNMA и меток времени проходят без изменений).- Минимальная поддерживаемая версия Rust теперь 1,88 (требуется исправлением RUSTSEC-2026-0387).
memmap2с 0.9.10 до 0.9.11 (RUSTSEC-2026-0186) в файлах блокировки перекрёстной проверки ANISE (xval/anise-lunar-od,xval/anise-mars-od); файлы блокировки также заново синхронизируют зависимость по путиkshanaвнутри репозитория.pillowс 12.3.0 до 13.0.0 иcertifiс 2026.7.22 до 2026.10.19 в закреплённых версиях среды оракулов (xval/oracles/requirements.lock,requirements.frozen.txt): исправленные выпуски для восьми уведомлений об уязвимостях pillow и одного уведомления о certifi.
Документация#
docs/BENCH.md, README и этот файл перечисляют каждый порог kshana-bench, который NOT MET, как записано вxval/bench/RESULTS-v2.md: A2 (agc_k_sigmaAUC 0,766 при требуемом не менее 0,80 на тестовой выборке), D1 (наибольший разрыв 0,0301) и задача (b) R1 (перенесено, не перезапускалось). Ни один порог не ослаблен.- Проход по полноте README: оглавление; виды сценариев, разложенные по семействам, у каждого своя страница в
docs/kinds/by-kind/(описание и поля от движка, входные и выходные данные примера прогона, строки реестра и оракулы, ограничения, указанные в отчёте прогона, и график, который строит движок), сводный лист по каждому семейству, всё с указателем вdocs/KINDS.md; каждая команда вdocs/COMMANDS.md; каждая поверхность, команда плагина, навык и страница Studio вdocs/ALL-SURFACES.md; каждая область возможностей вdocs/CAPABILITY-DOMAINS.md; встроенные диаграммы Mermaid (обзор системы, поверхности, внутренний цикл, доверие к приёмнику, круговой обмен с лабораторией, Studio, процесс тестирования и выпуска, карта модулей, распространение). Создано с помощьюtools/gen_kinds_index.py,tools/gen_readme_blocks.pyиtools/gen_figures_038.py; провереноtools/readme_audit.py; охраняетсяtests/readme_completeness_doc_sync.rs, который также закрепляет описание и поля каждой записи за движком. tools/render-diagram-chromium.sh: преобразует диаграмму Mermaid в SVG и PNG в Linux и обновляет запись о преобразовании.- README: рисунки по космическим пользователям и Луне использовали пути относительно
docs/, поэтому не загружались из README; одна ссылка указывала на../../docs/JAMMERTEST.md. - Удалены два устаревших файла графиков, скопированных вручную (
docs/assets/clock-ensemble-band.svg,sweep-clock-stability.svg), которые не использовала ни одна страница и которые больше не соответствовали движку; актуальные графики приводитdocs/KINDS.md.
[0.38.0] - 2026-10-19#
Добавлено#
- GNSS за пределами орбитальной группировки (
gnss-ssv). Новый вид сценариев для космических аппаратов выше, вокруг и за орбитами GNSS (docs/SSV.md): доступность одного и четырёх сигналов, длительности перерывов, C/N0, DOP и связи по главному лепестку в сравнении с боковыми для GPS, ГЛОНАСС, Galileo, BDS, QZSS и NavIC на оболочке или вдоль траекторий LEO, MEO, GEO, HEO и перелёта к Луне; передающие диаграммы направленности из буклета, параметрические или заданные пользователем; модель ионосферы, плазмосферы и атмосферы по лучу у лимба; конструкция приёмника слабых сигналов; бортовой расширенный фильтр Калмана GNSS для HEO и перелёта к Луне; и относительная навигация в построении. Сравнение с буклетом ICG по зоне космического обслуживания при предварительной регистрации, зафиксированной до прогона: константы минимальной излучаемой мощности и лунный порог согласуются, остальные пороги не выполнены при предварительно зарегистрированном прочтении (почти все — из-за противоречивого угла луча ГЛОНАСС в буклете), а параметрическая замена боковых лепестков не воспроизводит измеренные диаграммы панелей GPS. Всё остаётся MODELLED (xval/gnss-ssv/RESULTS.md). - Лунная орбита и поверхность как навигационная и геодезическая инфраструктура (
lunar-infrastructure). Новый вид сценариев с пятью исследованиями, выбираемыми параметромstudy(docs/LUNAR-INFRASTRUCTURE.md): согласованность бортового определения орбиты по Земле и GNSS на почти прямолинейной гало-орбите с независимым наземным определением по дальности и скорости изменения дальности; совместная двойная разностная фаза несущей поверхностной станции и орбитального аппарата с целочисленной фиксацией LAMBDA; информация Фишера семипараметрического лунного геодезического репера с дальностями от орбитального аппарата до поверхности и без них; межтехнологические смещения GNSS, VLBI и лазерной локации относительно локальной привязки; и чувствительность к h2, k2, l2 и физической либрации. MODELLED, с ILLUSTRATIVE входными данными: численные методы проверены независимыми программами на numpy и scipy, а ни одна лунная величина не сравнивалась с измерением. Пороги зафиксированы вxval/lunar-infra/PREREGISTRATION.mdи двух раскрытых поправках. Три NOT MET, и каждый закреплён тестом, который подтверждает промах: C3 (введённая ошибка силы не обнаруживается с предварительно зарегистрированной частотой), Q3 (частота успехов по бутстрепу отличается от оракула numpy на 1.7e-6 при пороге 1e-9 из-за аппроксимации нормального распределения в LAMBDA) и половина G3 по следу (добавление семейства дальностей не всегда уменьшает след псевдообратной матрицы). Остальные выполнены (xval/lunar-infra/RESULTS.md). - Шестая статья в таблице исследований. «Цислунная навигация — задача наблюдаемости: пороги длины дуги, обусловленность грамиана и рычаг Доплера» («Cislunar navigation is an observability problem: arc-length thresholds, Gramian conditioning, and the Doppler lever») (arXiv:2610,23871, eess.SP) показывает, что геометрический фактор DOP не определён для цислунного слежения только по дальности, и вместо него использует грамиан наблюдаемости на четырёх плоских дальних ретроградных орбитах: только по дальности ранг равен 2 из 4 в один момент и требует дуги примерно 2,09 ч, скорость изменения дальности (Доплер) сразу даёт ранг 4, а совместное оценивание станции с состояниями спутников и часами остаётся с дефицитом ранга на единицу без внешней интерферометрической наблюдаемой. Её числа заново получает вид
cislunar-observability(kshana scenarios/cislunar-observability.toml);cislunar-arc-recoveryпроверяет порог независимым оценивателем. Карточка исследований в README, README крейтов, npm и PyPI и генератор содержат её. - Нейтральный арбитр, ставший измеримым.
kshana jammertest importчитает опубликованный каталог NPRA Jammertest и план передач как заданную истину (идентификаторы каталога сохраняются), аkshana jammertest scoreоценивает по ней журнал приёмника для каждого испытания (задержка обнаружения, пропущенные тревоги, ложные тревоги, время восстановления), по выбору в виде подписанного пакета доказательств (docs/JAMMERTEST.md). Пороги оценки предварительно зарегистрированы до любого оцениваемого прогона (xval/jammertest-score/). На наборе данных JammerTest 2024 (загружается, не включается в репозиторий) предварительно зарегистрированное правило минимума данных не выполнилось ни в первом прогоне, ни в версии с изменённой обработкой данных, поэтому ни один порог оценить нельзя и ничего не утверждается; оба прогона записаны и закреплены. MODELLED: расписание — это зарегистрированные в наборе данных окна, а не записанное время передач в эфире. Набор NMEA SimulaMet за 2025 год не адаптирован (на его странице лицензия не указана). - Собственные флаги приёмника рядом с флагами Kshana. UBX-NAV-STATUS
spoofDetStateи UBX-SEC-SIG читаются вself_reportна каждую эпоху, а сравнениеreceiver_self_reportв результате сопоставляет их с мониторами Kshana (оба, только приёмник, только Kshana, ни один); оно не поднимает тревогу и не меняет ни одной оценки. К ним добавляются читатель Septentrio SBF (PVTGeodetic, MeasEpoch, RFStatus, только чтение, на крейтеsbf-toolsпод лицензией MIT) иreceiver-trust live --serial(последовательный или USB-поток NMEA, только чтение; ничего не записывает в приёмник). - Синхронизация времени и безопасность оборудования (
docs/TIMING-HIL.md,docs/HARDWARE-SAFETY.md). Вид сценариевholdover-testоценивает испытание системы синхронизации времени в режиме holdover (GNSS отключён оператором, holdover, восстановление) по измеренной записи ошибки времени относительно масок ITU-T из общедоступных таблиц.clock_logчитает журналы linuxptp (ptp4l,phc2sys,ts2phc) и chrony (tracking,statistics).iq scene --format sdrxзаписывает метаданные ION GNSS SDR, аiq monitor --followследит за записью SigMF, пока она растёт (только приём).compliance-reportполучает Foundational PNT Profile NIST IR 8323r1 (15 строк в пересказе, подкрепляет доказательствами). Пакет доказательств может записатьlab-attestationоператора в свой подписанный манифест, но не проверяет его; этапы оборудования от 0 до 4 и юридические примечания находятся вHARDWARE-SAFETY.md(ожидают юридической проверки). Тракта передачи нет ни в каком виде. - kshana-bench v1 (
kshana bench,bench/SPEC.md,docs/BENCH.md): фиксированные задачи, выборки и метрики для обнаружения помех ГНСС по журналам приёмника (JammerTest 2024) и по IQ, прогноза holdover времени (часы IGS) и разрыва оптимизма при выходе за пределы распределения; манифесты выборок с закреплёнными хешами и скриптами загрузки (данные не включаются), запечатанная отложенная выборка с фиксацией и раскрытием по коммиту, схема файла результатов и статическая страница таблицы лидеров. Базовые методы при порогах, предварительно зарегистрированных вxval/bench/PREREGISTRATION.md: пороги оценщика выполнены, C1–C3 выполнены, D2 выполнен; A2 NOT MET (agc_k_sigmaAUC 0,766 при требуемом не менее 0,80 на тестовой выборке), D1 NOT MET (наибольший разрыв 0,0301) и задача (b) R1 NOT MET (перенесено, не перезапускалось), каждый закреплён (xval/bench/RESULTS-v2.md). Каждая оценка MODELLED. Pythonbench_score,bench_leaderboard; WebAssembly так же; MCPscore_benchmark,render_leaderboard. - Обсерватория помех (
kshana interference-map daily,sensitivity,docs/observatory/METHOD.md): воспроизводимые ежедневные GeoJSON, PNG и отчёт об инцидентах в JSON с тремя состояниями (ухудшено, не ухудшено, не наблюдалось), минимальной задержкой 24 ч, ячейками 0,5 градуса или крупнее, без указания причины и с отказом принимать данные OpenSky; исследование чувствительности предварительно зарегистрированных параметров; 30-дневный балтийский архив из adsb.lol. - Машинные и сенсорные входные данные для
receiver-trust(docs/MACHINE-INPUTS.md). Новые значения[log] format, все только для чтения, MODELLED, с самостоятельно написанными тестовыми данными и без включения данных в репозиторий:rtklib-pos(файлы решений RTKLIB.pos),novatel(OEM7 в ASCII и двоичном видеBESTPOS,RANGEC/No иRXSTATUS; флаг подавления приёмника становитсяself_reportэпохи и сопоставляется с тревогами Kshana сравнениемreceiver-self-report),rtcm3(C/N0 MSM4 и MSM7 для GPS, ГЛОНАСС, Galileo, SBAS, QZSS, BeiDou и NavIC; структуры из таблиц pyrtcm под лицензией BSD, уведомление о которой находится вNOTICE, а не из стандарта RTCM) иgnss-sdr(сообщения GNSS-SDR Monitor и PVT-monitor в виде строк JSON, передаваемые черезintegrations/gnss-sdr/relay.py). - Журналы IMU как второй датчик.
[log.imu](csvилиeuroc) интегрирует скорость рыскания гироскопа в курс, который читает мониторheading-course; встроено на каждой поверхности и переносится через пакеты доказательств.kshana imu-fit(Pythonimu_fit, WebAssemblyimu_fit, MCPfit_imu_log, плагин/kshana-fit-imu, действие JetBrains) подбирает параметры акселерометра и гироскопа сценариевhybridиfusionпо неподвижному журналу методом девиации Аллана и выводит таблицу[accel_classical]с SHA-256 журнала в происхождении данных. - Интеграции: пакет ROS 2 (
integrations/ros2/kshana_trust: NavSatFix иublox_ubx_msgsна входе, темы доверия на выходе; его мост без ROS проверен на реальном движке, а сам узел не запускался в работающем графе ROS), мостgnss_lib_py(integrations/gnss_lib_py, зависимость под лицензией MIT, необязательная) и ретранслятор GNSS-SDR. - Экспортёр Home Assistant по MQTT для телеметрии доверия:
kshana trust-telemetry --print-mqttи--mqtt-tcp <host:port>(сообщения обнаружения и документ состояния в JSON; только публикация, без учётных данных и TLS), а такжеformat = "mqtt"как текст в Python, WebAssembly и MCP. - Семь строк реестра MODELLED для перечисленного выше. Ничего здесь не VALIDATED: запись реального приёмника, базовой станции, IMU, прогона GNSS-SDR, графа ROS или брокера MQTT не читалась.
- Запас оптической линии связи во времени. Вид
optical-atmosphereпринимает необязательную таблицу[timeseries](duration_h,step_s,seed) и тогда также записывает для каждого пункта одну реализацию заданной модели пункта во времени с начальным значением: эпизоды облачности, водозапас в жидкой фазе на эпизод, одну гамма-гамма выборку сцинтилляции на шаг, а по ним — запас линии связи, замирания из-за облаков и сцинтилляции и флаг работоспособности линии, с достигнутыми доступностью, долей облачности, числом перерывов и самым длинным перерывом. MODELLED (одна выборка из модели, а не климат; внешнего оракула нет). Без таблицы результат — документ 0,37. Два входящих в поставку оптических сценария содержат таблицу (336 ч, 600 с, начальное значение 37). Пороги предварительно зарегистрированы вxval/optical-atmosphere/PREREGISTRATION-timeseries.mdдо первого прогона. - Спецификация условий испытаний и круговой обмен с лабораторией.
kshana.test-conditions/1опубликована какdocs/spec/TEST-CONDITIONS.mdсо схемой JSON Schema и получаетrecording.kind = "receiver-log".kshana bench-exportтакже записывает<base>.conditions.json.kshana evidence round-tripстроит подписанный пакет, связывающий хеш сценария, хеш заявленных условий, хеш журнала приёмника и оценку по заявленным событиям, и отвергает условия, расходящиеся с событиями оценки. Рабочий пример с gps-sdr-sim, который только записывает файл; воспроизведение остаётся на ответственности оператора и никогда не автоматизируется. Pythonevidence_round_trip, MCPcreate_round_trip_pack, плагин/kshana-evidence-pack. - Пакеты стандартов (
kshana standards-pack,standards/): профили испытаний основы DHS Resilient PNT для уровней от 1 до 4, уровни точности и оценка целостности IMO MSC.1/Circ.1575 и обнаружение, оценка и смягчение по ICAO Doc 9849, приложение F, каждый — набор сценариев, оцениваемых по порогам, заданным до прогона, со строками compliance-report, которые они подкрепляют доказательствами. Промахи записаны и закреплены: DHS L4-T1 и четыре испытания точности IMO. Сам Doc 9849 не читался (платный); пакет ICAO следует презентации ICAO по плану смягчения радиочастотных помех.compliance-reportполучает раздел пакета стандартов. Всё MODELLED. - Дополненный прямой сигнал LunaNet (
docs/LUNANET-AFS.md): коды Голда AFS-I и коды Вейля AFS-Q для PRN от 1 до 210, сигналыlunanet-afs-iиlunanet-afs-qвkshana iq, код БЧХ SB1, CRC-24Q и перемежитель, а такжеkshana lunanet-afs-check(spec,symbols,generate), привязанные к LNIS V5 Applicable Document 1 Volume A (LSIS-AFS V1.0, 29 января 2025 года). Коды VALIDATED по печатным таблицам документа (которые он помечает как TBC); один печатный третичный столбец (PRN 147), вероятно, является опечаткой, и этот промах закреплён. LDPC-кодирование подкадров от 2 до 4 не реализовано. - Учебные ноутбуки курса (
notebooks/course/): jamming, спуфинг, holdover, целостность, OSNMA и карта помех, каждый с упражнениями. - Исследование максимального URA для этапа 3 ARAIM рабочей группы C ЕС и США (
xval/araim-m3/,src/bin/gen_araim_m3_study.rs), заменяющее отозванный план «Table A-3»; MODELLED с заявленными отклонениями. - Черновики на утверждение владельцем в
docs/drafts/: статья для JOSS, поправка к уставу TSC, процесс реестра оракулов и предложение о разделенииLICENSES/. Ничто из этого не принято. - Представления Studio для функций 0,38 (kshana.dev/studio/). Воспроизведение моста (два синтетических прогона на одних часах: трек, оценка доверия, спутники, которые слышит журнал, и вердикт, с собственными флагами приёмника рядом с тревогами Kshana); оптический PNT (два сценария
optical-atmosphere, с необязательной воспроизводимой реализацией[timeseries]со случайным начальным значением, MODELLED); тест holdover (результатholdover-test, измеренный относительно масок ITU-T и построенный по собственномуrecord.seriesрезультата); просмотрщик обсерватории помех, который открывает созданные вами файлы и не поставляет своих; на странице «Инструменты» — оценка Jammertest, подгонка IMU и MQTT как формат телеметрии; в разделе «Доверие» — выбор формата журнала (RTKLIB.pos, NovAtel OEM7, RTCM 3, GNSS-SDR, Septentrio SBF) с необязательным файлом IMU. Каждое представление читает файлы в браузере и ничего не загружает; каждый показатель сохраняет метку, которую реестр (ledger) хранит для него, и каждый сопровождается консультативным заявлением. Страница сайта/benchmarkпоказывает фрагментkshana bench leaderboard.
Исправлено#
- Задача №36: побайтово точные слои эталонов. Побайтово точные слои эталонов выполняются только на хосте, объявленном базовым (
KSHANA_EXACT_PINS=1, задаётсяscripts/gate.sh), а не на каждом Mac на Apple silicon, поскольку математическая библиотека Apple различается между выпусками macOS; переносимый слой выполняется везде, аtests/exact_pin_gate_guard.rsне даёт снова привязать побайтово точный слой только к платформе. Сами сравнения с оракулами на macOS проходят. Ни одно литеральное значение не снималось заново, и ни один допуск не менялся.scripts/oracle-triage.shиdocs/LOCAL-ORACLE-TESTS.mdописывают, как разбирать расхождение;.github/workflows/oracle-macos.yml— это ручная и еженедельная диагностика, а не барьер. - CodeQL: неякорный шаблон во вспомогательной функции trust-open в Studio теперь сопоставляется со всем заголовком (
web/studio/lib/trust-open.mjs). - CI: диск исполнителя. Задача
checkсобирает профили dev и test без отладочной информации, поэтому компоновка больше не заполняет диск. - Охранные проверки исходников. Каждый исходный файл, содержащий тестовые фикстуры с эталонами, объявляет область своих эталонов, а тесты, записывающие временные файлы, используют уникальный путь при каждом вызове, поэтому параллельные запуски не могут столкнуться.
docs/SCENARIOS.mdзаново сгенерирован для необязательного поляtimeseriesоптической атмосферы.- Плагин JetBrains: никакого использования устаревшего или планируемого к удалению API платформы. IntelliJ Plugin Verifier (
verifyPlugin) для сборки IntelliJ IDEA 263 (2026,3: 263.6800.24 и 263.7031.23) нашёл один устаревший вызов,FileEditorManager.openFile, в Insert Example; теперь новый файл открывается черезOpenFileDescriptor. Плагин совместим с 2024,3 (since-build, без изменений) и обеими сборками 263 и не даёт замечаний. Теперь CI запускаетverifyPluginи завершается с ошибкой при проблемах совместимости и при любом использовании API, планируемого к удалению.
[0.37.0] - 2026-10-17#
Добавлено#
- Оптический PNT через атмосферу (вид сценария
optical-atmosphere,docs/OPTICAL-ATMOSPHERE.md, проектная запискаdocs/design/optical-atmosphere-0.37.md). Для оптической линии и набора наземных пунктов он выдаёт потери в чистом воздухе в зависимости от длины волны и угла места, состояние турбулентности по модели Хафнагеля–Валли (дисперсия Рытова, индекс мерцаний, замирания gamma-gamma, усреднение по апертуре), доступность относительно запаса линии при заданном облачном климате, запас, необходимый для целевой доступности, и потолок, который никакой запас не поднимает, распределение длительностей перерывов, ошибку синхронизации и дальнометрии при каждом перерыве через модель holdover часов, корреляцию пунктов по расстоянию (разнесение пунктов) и сценарии «что если» для смены длины волны, большей апертуры, снижения мерцаний адаптивной оптикой и дополнительного запаса.optical_linkbudgetполучает бюджет с учётом атмосферы; без него её выход побитово совпадает с 0,36 (порог A5). Два встроенных сценария содержат ILLUSTRATIVE облачные климаты. MODELLED: три строки реестра (ledger). Численные методы выполняют пороги A1–A6, предварительно зарегистрированные вxval/optical-atmosphere/PREREGISTRATION.md, относительно независимой программы на mpmath; это проверяет реализацию заявленных формул, а не атмосферу, и ни одна измеренная запись доступности не сравнивалась, поэтому ни одна строка не VALIDATED. Порог A4 сначала был не выполнен на 3e-9, потому что используемая нормальная функция распределения была приближением с погрешностью 1.5e-7; функцию заменили, а порог оставили таким, как зарегистрирован. Нативная сборка и сборка WebAssembly возвращают побайтово идентичные документы для обоих встроенных сценариев (A7, запуск на интеграционном коммите 0.37.0).
[0.36.0] - 2026-10-16#
Добавлено#
ROC обнаружения для мониторов IQ (PRO-32,
docs/design/DETECTION-ROC.md). Кампания с мониторами сохраняет максимум статистики каждого теста в окнах заданных событий (положительные) и в окнах-плитках вне событий (отрицательные,roc_window_s). Отчёт объединяет их по виду тревоги в ROC с его AUC и рабочей точкой при заданном пороге, в видеroc.jsonи раздела отчёта. На синтетических кампаниях проверка на уровне случайного выбора выполнена (met). Порог AUC для C/N0 (0,95) не выполнен (0,79), потому что отрицательные окна сразу после события наследуют от обнаружения спад CUSUM; это записано. MODELLED.Мониторы IQ в кампании лабораторного воспроизведения (PRO-31,
docs/design/MONITORS-IN-CAMPAIGN.md). Необязательная таблица[monitors]в файле кампании запускает мониторы IQ за один проход исполнителя: мощность и спектр после каждой цепочки входного тракта, а также C/N0, SQM и захват по каждому отслеживаемому каналу. Их тревоги оцениваются по заданным событиям: обнаружено или пропущено, время до обнаружения и ложные тревоги на час экспозиции. Для каждого теста указана замкнутая формула вероятности ложной тревоги, включая новую двустороннюю гауссову формулу для тестов SQM (2Q(k)). Без таблицы ничего не меняется. На синтетических кампаниях пороги ложных тревог для мощности и SQM и порог ложных тревог для C/N0 выполнены; обнаружено 18 из 18 ослаблений, но граница времени до обнаружения, по построению меньшая одного отсчёта детектора, не выполнена, и это записано. MODELLED; строка реестра (ledger) «IQ monitors scored in lab-replay campaigns».Подгонка лаборатории по кампаниям IQ, продолжение (
tests/iq_labfit_followup.rs, задача CIlabfit-iq-followup). Проверяются две гипотезы, оставленные открытыми в §13,6 документаdocs/design/LABFIT-FROM-IQ.md, по порогам, предварительно зарегистрированным в 1e532f84. Добавлены две синтетические кампании: S со ступенчатым J/S (seed 2026_1014) и R — новая рампа (seed 2026_1015). Результаты приведены вdocs/design/evidence/labfit-followup/RESULTS.md.- S1 met: при каждом удерживаемом уровне J/S
δ_effвосстанавливается в пределах +0,185 дБ. Ошибка −1,1 дБ в кампаниях с рампой вызвана запаздыванием оценивателя. - S2 not met, зафиксировано тестом, утверждающим промах: (d) в записанном виде на ступенчатой кампании выполняется для модели петли слежения (0,45 дБ), но не для эмпирической (6,42 дБ).
- R1 met: на новой кампании с рампой (d) с подогнанными временами выдержки при падении плюс скорость рампы каждого события укладывается в 1 дБ для обеих моделей.
- Промахи (a′) и (d) воспроизводятся на R.
- Теперь кампания может задавать свой J/S как профиль
stepв тестовой оснастке. - Ни один вердикт §13 не меняется, и строка реестра (ledger) остаётся MODELLED.
- S1 met: при каждом удерживаемом уровне J/S
Ограниченный по времени pull-in FLL, по выбору (DS-LOOP-05): новый ключ проекта петли
[design.carrier] fll_pull_in_max_s(с), в RustLoopConfig::fll_pull_in_max_s. Приfll_assist = "pull-in"он принудительно передаёт управление от FLL к PLL по истечении этого времени, независимо от PLI. По умолчанию не задан, и тогда не входит в хеш проекта; проект по умолчанию и его хеш не изменились.- Проверено по порогам, предварительно зарегистрированным в 58789af0, на внедрённой истине. Контроль выполнен (met): по умолчанию передачи управления не происходит в 9 из 10 прогонов с разными seed при 33 дБ-Гц.
- Not met: при ограничении 1,0 с 16 из 20 прогонов удерживают захват при 33 дБ-Гц и 8 из 20 при 31 дБ-Гц; остальные циклически переходят между принудительной передачей управления и возвратом к FLL. Фазовое дрожание в 1,8 раза больше, чем у одного PLL при 33 дБ-Гц.
- Порог pull-in около 35 дБ-Гц остаётся документированным пределом конструкции по умолчанию.
- MODELLED; строка реестра (ledger) «Capped FLL pull-in below the default design's FLL-to-PLL hand-over floor (opt-in)».
Гистерезис захвата и квантователь входного тракта в виде jamming (CAP-06c): две необязательные секции для сценария
jamming.[acquisition]:acquisition_threshold_dbhz(дБ-Гц, на уровне порога слежения или выше) иreacquisition_delay_s(с, по умолчанию 0). Спутник считается захваченным при уровне не ниже порога захвата, если он был незахваченным в течение времени задержки. Он удерживается, пока уровень не ниже порога слежения. Выходные данные:epochs[].sats[].acquired(true/false),epochs[].acquired(счётчик) иfom.availability_acquired(1).[front_end]:adc_bits(от 1 до 16) иbandwidth_mhz(МГц, по умолчанию вдвое больше скорости чипов). Выдаёт блокfront_end:agc_gain_reduction_db(дБ,10·log10(1 + J/N)),quantiser_loss_db(дБ, вычитается из эффективного C/N0 каждой линии) иloss_model. Потери соответствуют гауссову входу, и отмечено, что они недействительны для CW, узкополосных и перестраиваемых источников подавления.- Без этих секций каждый выход побайтово идентичен.
- Проверено по порогам, предварительно зарегистрированным в 70c72fcc. Потери квантователя отличаются от независимого Монте-Карло не более чем на 0,0007 дБ, а показание AGC — не более чем на 0,012 дБ от петли AGC слоя IQ.
- Зарегистрированные прогоны гистерезиса оказались неинформативными (все линии потеряны), поэтому этот порог NOT MET. Дополнительный набор прогонов, зарегистрированный в 37793290, его выполняет: каждый флаг равен независимому пересчёту, и у 732 из 1824 линий виден гистерезис.
- Вывод: при CW-источнике подавления 1-битный АЦП теряет примерно на 5 дБ больше, чем даёт гауссова оценка.
- MODELLED; строка реестра (ledger) «Acquisition hysteresis and the front-end quantiser in the jamming kind against independent recomputations».
Экранирование источника подавления рельефом в виде jamming (CAP-06b): необязательная секция
[terrain]в сценарииjammingс источником подавления. Поля:dem_hgt: тайл SRTM.hgtотносительно рабочего каталога;samples_per_side,ll_lat_degиll_lon_deg(град): размер и угол тайла;geoid_undulation_m(м, по умолчанию 0),k_factor(по умолчанию 4/3) иprofile_step_m(м, по умолчанию 30).
Движок дискретизирует профиль рельефа по дуге большого круга между источником подавления и приёмником и находит доминирующее препятствие типа «лезвие ножа». Принимаемая мощность источника подавления, а с ней и каждое J/S, уменьшается на потери от одиночного препятствия типа «лезвие ножа» по ITU-R P.526-15 §4,1.
- Результат получает блок
jammer_terrain:nu_max(1),diffraction_loss_db(дБ),obstacle_distance_m(м),obstacle_terrain_m(м),path_length_m(м) иprofile_points(счётчик). - Без этой секции каждый выход побайтово идентичен.
- Проверено по порогам и десяти позициям, предварительно зарегистрированным в 92cd2bfd, на закоммиченном реальном тайле SRTM Долины Смерти, относительно независимого пересчёта на numpy. Всё met: наибольшее расхождение 1.6e-10 по
νи по потерям (порог 1e-9), потери монотонны по высоте источника подавления, и потери доходят ровно до J/S. - MODELLED; строка реестра (ledger) «Terrain shadowing of the jammer in the jamming kind against an independent numpy recomputation on a real SRTM tile».
Коэффициенты усиления антенны CRPA в виде jamming (CAP-06a): необязательная секция
[crpa]в сценарииjamming. Поля:elements_enu_m(положения элементов в локальной системе восток–север–вверх, м),weighting("null-steering"или"mvdr") иbandwidth_mhz(шумовая полоса MVDR, МГц, по умолчанию вдвое больше скорости чипов).- Каждый канал формирует луч без искажений в сторону своего спутника. Шум линии масштабируется на
‖w‖², а источник подавления — на|wᴴa_j|²перед существующим уравнением C/N0 с защитой от подавления. - Каждая линия получает блок
crpa:array_noise_gain_db(дБ) иjammer_gain_db(дБ). - Без этой секции каждый выход побайтово идентичен.
- Недопустимая секция (пустой список элементов, неизвестное взвешивание, неположительная полоса) — это ошибка, как через
kshanaиapi::run_toml, так и черезjamming::run_jamming. - Проверено по порогам, предварительно зарегистрированным в 08d83b4d. Met: аддитивность (после исправления: первая сборка добавляла новые единицы в таблицу единиц каждого прогона jamming); один элемент не образует решётку; усиление шума и эффективное C/N0 относительно независимого пересчёта на numpy в пределах 1e-9 дБ; MVDR стремится к нулю при высоком JNR.
- Not met: усиление источника подавления MVDR на 194 из 456 линий на переносимой математике 0,36 (202 на математике хоста;
docs/revisions/STUDIO15-batch4-rebaseline.md) (наихудшее 1.7e-6 дБ). Остатки от −100 до −188 дБ лежат ниже разрешения float64 при этом пороге, и numpy расходится сам с собой примерно на тот же порядок. - MODELLED; строка реестра (ledger) «CRPA antenna gains in the jamming kind against an independent numpy recomputation».
- Каждый канал формирует луч без искажений в сторону своего спутника. Шум линии масштабируется на
Движок слежения IQ в сравнении с GNSS-SDR 0.0.19 (PRO-33):
kshana iq trackи GNSS-SDR отслеживают одни и те же независимые записи numpy сигнала GPS L1 C/A при 30–45 дБ-Гц.- Пороги предварительно зарегистрированы в 48edd4a5. Зарегистрированная калибровка не прошла из-за неверной передачи управления в GNSS-SDR (F3), поэтому Поправка 1 (1e4288c4) добавляет в оба приёмника FLL только для pull-in, закоммиченный до любой тестовой записи.
- Met: джиттер несущей и кода и Доплер согласуются в пределах 5 % при каждом C/N0.
- Not met: C/N0 по NWPR у движка на 2,3–7,1 дБ ниже SNV у GNSS-SDR (F4, известный предел оценивателя; M2M4 в пределах 0,06 дБ от истины); индикаторы захвата различаются по определению (F5); одно расхождение по срыву при 30 дБ-Гц (F6).
- MODELLED; строка реестра (ledger) «IQ tracking engine against GNSS-SDR 0.0.19 on independent recordings».
Две строки VALIDATED для кодов слоя IQ (DS-GIQ-06b, PRO-39).
- BeiDou B1I. Все 63 первичных кодов B1I совпадают чип в чип с независимым генератором GNSS-SDR v0.0.19 (порог предварительно зарегистрирован в 911106d1). Закоммичен только вывод этой программы: коды PRN B1I, определённые в открытом ICD, в виде префикса и хеша.
- GPS L1C. Все 126 кодов L1CP/L1CD и 63 наложений L1CO совпадают с контрольными столбцами, напечатанными в IS-GPS-800J, а вычисленная последовательность Лежандра совпадает с её Таблицей 6.2-1 (пороги предварительно зарегистрированы в fe372e26).
- Строки: «BeiDou B1I primary ranging codes against an independent generator» и «GPS L1C ranging and overlay codes against the IS-GPS-800J printed check columns».
Диапазоны ГЛОНАСС, BeiDou и Galileo E6 в модели спектра (CAP-12, сигналы): новые названия диапазонов
glonass-l1ofиglonass-l2of(любой канал FDMA какglonass-l1of-k<K>, K = −7…6),beidou-b1i,beidou-b1c,beidou-b2a,beidou-b3iиgalileo-e6. Каждый несёт несущую, модуляцию и минимальную принимаемую мощность по ICD. Они включаются только по имени: набор диапазонов по умолчанию и все существующие выходы не изменились.- Проверено по порогам, предварительно зарегистрированным в 5806f28b: значения ICD, нули, составной сигнал B1C и тракт C/N0 выполнены (met).
- Два порога не выполнены. Порог единичной площади был недостижим в записанном виде (F1). Формы сигналов B1I и B1C слоя IQ совпадают с моделью только в усреднении по полосе из-за неравномерных линейчатых спектров их кодов (F2).
- MODELLED; строка реестра (ledger) «Spectrum model: GLONASS, BeiDou and Galileo E6 bands (opt-in)».
Вариант CFAR с усреднением по ячейкам при захвате в слое IQ (PRO-37):
iq::acq::ca_cfarиca_cfar_cellsпринимают решение по сетке захвата, сравнивая каждую ячейку со средним по опорным ячейкам в её строке Доплера. Порог берётся из замкнутой формулы вероятности ложной тревоги CA-CFAR дляMнекогерентных блоков (ca_cfar_pfa,ca_cfar_alpha), поэтому решение не зависит от нормировки мощности отсчётов. Включается по выбору; детектор по умолчанию и все существующие выходы не изменились.- Проверено по порогам, предварительно зарегистрированным в 3724aefa: замкнутая формула против Монте-Карло (18 из 18 случаев) и проектная доля 1 %, измеренная как 0,97–1,01 % на гауссовом и 2-битном квантованном шуме.
- Один порог не выполнен: на 2-битном сигнале без шума 1,28 % ячеек вне пика превышают порог, на боковых лепестках корреляции кода (вывод F1).
- MODELLED; строка реестра (ledger) «Cell-averaging CFAR option in IQ acquisition».
Модель мерцаний в сравнении с измеренными данными (PRO-34): корнеллская модель мерцаний канала IQ сравнивалась с измеренными интенсивностью и фазой GPS L1 с частотой 50 Гц за экваториальную ночь мерцаний (запись Zenodo 16941224, INGV, Малинди, CC BY 4,0) по порогам, предварительно зарегистрированным в b6ccb499. Met: распределение интенсивности и фазовые мерцания, связанные с S4. Not met: модель даёт замирания глубже −10 дБ в 2,4 раза чаще и в 3,5 раза длительнее (вывод F1). Зарегистрированная обработка читает свёрнутую фазу модели (вывод F2); результат по фазе сохраняется и при развёрнутой фазе.
scripts/fetch_scint_malindi.shзагружает данные. Строка остаётся MODELLED: «IQ ionospheric scintillation channel (Cornell model) against measured 50 Hz GPS L1 scintillation».Исправленный читатель отсчётов LuGRE (MR-09):
realdata::lugre::parse_iqs_sdrxчитает пакет IQ LuGRE с I в старшем полубайте и уровнями mid-rise2v + 1(SdrLayout::mid_rise), что убирает среднее −½, которое несут голые целые в дополнительном коде на I и Q.run_acq.py --correctedподаёт GNSS-SDR то же чтение. Общий читатель ION и все существующие выходы не изменились: 149 результатов сценариев и исследование побайтово идентичны до и после, а закреплённые выводы LuGRE читаются так, как зарегистрированы (xval/lugre-reader/RESULTS.md). Ни одна строка реестра (ledger) не меняется.Слежение за BOC(1 1) по выбору (CAP-07 (a)):
LoopConfig::bocмасштабирует дискриминаторы DLL под главный пик синусного BOC(1 1) и добавляет монитор скачков на горбы (очень ранний и очень поздний коррелятор на ±0,5 чипа, счётчики вверх/вниз,N = 8), который сдвигает NCO кода с бокового пика;Channel::bump_jumpsперечисляет скачки. По умолчанию выключено, и все существующие выходы не изменились. Проверено по порогам, предварительно зарегистрированным в 6b68f6cc, на синтетическом сигнале BeiDou B1C: старт на боковом пике, остающийся без этой опции в 0,55 чипа от главного, с ней переводится на главный пик одним скачком при 0,08 с, и ложных скачков с главного пика замечено не было. Один порог не выполнен: сетка модульного теста для масштабирования выходит за линейный диапазон дискриминаторов (вывод F1 вdocs/design/evidence/boc-bump-jump/RESULTS.md). MODELLED; строка реестра (ledger) «BOC(1 1) tracking: DLL scaling and bump-jump ambiguity resolution (opt-in)».Подгонка лаборатории по кампаниям IQ (B7.1,
docs/design/LABFIT-FROM-IQ.md). Раздел[input] campaign = "<out-dir>"сценария labfit подгоняет выходную папкуkshana iq campaignв CLI (kshana iq labfit), в Python (kshana.iq_labfit) и в инструменте labfit сервера MCP (только папки внутри его рабочего каталога). Он подгоняет одну единицу на сигнал, проект петли, цепочку входного тракта и тип источника подавления:- модель C/N0 относительно заданного J/S, с цензурированием;
- порог слежения, напрямую и в замкнутой форме;
- модели захвата петли слежения и эмпирическую, связанные через модель C/N0, с их временами выдержки;
- кластерный бутстреп с начальным значением (seed) по записям, 90-процентные интервалы предсказания и отложенные выборки с исключением одной записи;
- предварительно зарегистрированную таблицу
[validation]с хешем и PASS/FAIL по каждому порогу.
Отчёт —
kshana.labfit-iq/1в формате JSON, CSV и Markdown, с блоком единиц.Q_effне определяется по данным C/N0 без независимого измерения мощности. Оно задаётся, но никогда не подгоняется, а подгоняемый параметр —delta_eff = delta - 10 log10 Q(поправка к проекту 2026-10-12). Неизвестный тип источника подавления принимает наиболее вредное из заданных значенийQ(cw, 1). На синтетических кампаниях из собственных сцен Kshana порог покрытия на отложенной выборке (c) проходит. Порогиdelta_eff(a') и (b') (покрыто 0 из 50 кампаний) и порог замкнутого порога слежения (d) не выполнены: они записаны вместе со своими значениями. MODELLED; строка реестра (ledger) «Calibration of the open receiver's C/N0 and lock models to IQ campaign results, with stated prediction error». Путь labfit по журналам приёмника и его выходы не изменились.solar-systemна ядре JPL (CAP-31):planetary_kernel_pathберёт каждое тело, которое содержит SPK (для de440s: Меркурий, Венера, Земля, Луна), из ядра, с меткойKERNEL, и добавляет блокkernelтолько при заданном значении. Новая строка, VALIDATED относительно SPICE (предварительно зарегистрировано f8e946ea; наихудшее 3.3e-5 м, 1.0e-11 м/с). Отчёт по умолчанию не изменился.Porkchop на эфемеридах DE440 (CAP-20b):
maneuver::porkchop_kernelперебирает C3 и V∞ прибытия по гелиоцентрическим состояниям из SPK DE440. Новая строка, VALIDATED относительно состояний SPICE- pykep 3.0.1 (предварительно зарегистрировано 2d857fb1; Земля–Марс 2026–2028, 304 ячейки, наихудшее 2.6e-14, та же ячейка с минимальным C3).
Негравитационная макромодель LRO: NOT MET (DS-LRO-10, предварительно зарегистрировано e82047e2).
lunar_od::LunarMacroModel(по выбору черезLunarForceModel::macro_model): плоские пластины с прямым солнечным излучением и тенью Луны, солнечная батарея с ориентацией на Солнце, лунное альбедо и тепловое ИК;LunarMacroModel::lro_generic— помеченное как обобщённое приближение LRO по опубликованным сведениям (без пластин корпуса: таблицу пластин получить не удалось). На 4-часовой дуге LRO она оставляет RMS редуцированно-динамического решения на 6,668 м, а динамического — на 11,94 м, с неправдоподобным коэффициентом излучения (около +21 / −22), поэтому все три порога не выполнены. Вывод закреплён тестом, и ни один выход по умолчанию не меняется (docs/design/evidence/ds-lro-10-macro-model/RESULTS.md). Лунное SRP по модели пушечного ядра, включаемое по выбору, теперь использует коническую тень Луны вместо земной (forces::conical_shadow_body).Лунное определение орбиты: необязательный твёрдый прилив k2 и селеноцентрическая релятивистика (DS-LRO-11), по умолчанию выключены (
LunarForceModel::lunar_tide,::relativity); переключательKSHANA_LRO_DEGREEдля перекрёстной проверки ANISE (DS-LRO-04); фикстура 24-часовой дуги LRO и информационная подгонка по длинной дуге (DS-LRO-09). Информационные прогоны записаны вdocs/design/evidence/ds-lro-09-11-longer-arc/RESULTS.md; ни одно опубликованное число не меняется.NRHO CR3BP 9:2 относительно CAPSTONE (CAP-29d): новая строка MODELLED, сравнивающая круговую ограниченную NRHO движка с реальной орбитой CAPSTONE (JPL Horizons, март 2023; предварительно зарегистрировано 4e868170): период 1,07 %, апоселений 0,05 %, периселений 4,1 % от средних значений CAPSTONE, в пределах зарегистрированных порогов 3 / 5 / 20 %. Это измерение, а не валидация.
Вращающиеся состояния CR3BP в селеноцентрической ICRF (RM-34, FUT-06):
cr3bp::to_moon_centred_icrf/from_moon_centred_icrf/to_moon_centred_icrf_de440отображают безразмерное вращающееся состояние Земля–Луна на мгновенную линию Земля–Луна по DE440, включая внеплоскостную скорость системы отсчёта. Новая строка, VALIDATED относительно двухвекторной системы SPICE (предварительно зарегистрировано 2313eb1b, исправлено до любого прогона d5ef79b3; 72 случая, наихудшее 1.8e-7 м и 1.2e-9 м/с).Члены семейств CR3BP в сравнении с API периодических орбит трёх тел JPL: NOT MET (RM-35, предварительно зарегистрировано a9074f65).
cr3bp_family(коррекция гало-орбит, NRHO и DRO, индекс устойчивости по монодромии, продолжение по псевдодлине дуги) совпадает с 54 из 58 членов API по каждому порогу (состояние, период и интеграл Якоби в пределах 1e-10 везде). Один индекс устойчивости гало-орбиты L1 (9.5e-2) и три замыкания малых DRO (1.5e-8–3.3e-8 против 1e-8) не проходят, поэтому модуль помечен#[doc(hidden)], и ни одна строка его не заявляет. Результаты:docs/design/evidence/cr3bp-families/RESULTS.md.Ориентация и окружение Луны по DE440, по выбору (FUT-05, DS-LRO-08; значения по умолчанию не изменены):
lunar_frame::try_icrf_to_moon_pa_de440,lunar::try_mci_to_mcmf_de440/try_mcmf_to_mci_de440(привязка к эпохе, главные оси DE440) иlunar_od::De440LunarEnvironment(встроенная ориентация DE440 PA плюс геоцентрические Солнце и Луна из заданного пользователем SPK DE440). В сравнении с ANISE (предварительно зарегистрировано ea537710): ориентация в пределах 3.5e-7 рад, а подгонки LRO в пределах 1 мм, но звено эфемерид не выполнило свой порог (Солнце 30,7 м, Луна 1,1 м, сдвиг по времени около 1 мс на стороне ANISE), поэтому это не проверенная (validated) строка. Результаты:docs/design/evidence/fut05-de440-lunar-env/RESULTS.md.Репер лунной системы отсчёта по кампании, порог NumPy с учётом обусловленности: NOT MET (предварительно зарегистрировано b887eb05; остаётся MODELLED). Шаг 0 исключает откат к псевдообратной матрице как причину расхождения 0,30 в оценённых станциях; NumPy согласуется в пределах порога в шести из восьми сценариев, но stations_estimated его не выполняет (6.8e-6 против 5.9e-7), а на новой дате 2026-12-01 ненаблюдаемый маяк у южного полюса делает информационную матрицу маяка дефектной по рангу, чего неизменённый оракул оценить не может. Результаты:
docs/design/evidence/mr05-lunar-datum-cond/RESULTS.md.Репер лунной системы отсчёта по реальной наблюдательной кампании (аналитическая Луна) VALIDATED на новых нормальных точках EDC 2025 (предварительно зарегистрировано 31f5283 до того, как какая-либо была получена): неизменённый оракул SPICE и NumPy согласуется по учёту, рангам и нулевой связи, а по сигмам — в пределах 1.11e-3 (порог 1e-2), по обусловленности — 8.95e-4 и по отношениям поперёк/вдоль — 1.79e-3 (порог 2e-2). Это проверка только вычисления ковариации, уровня Library; пороги не различают модели Луны. Результаты:
docs/design/evidence/mr06-llr-analytic-fresh/RESULTS.md.Ориентация по IAU и GM четырнадцати добавленных тел Солнечной системы выделены из строки «Physical constants of every solar-system body» в строку VALIDATED (предварительно зарегистрировано 154bc54):
Body::iau_rotation_etсогласуется с SPICEpxformпо pck00011 в пределах 1e-9 рад на 574 матрицах на исходных эпохах и на 574 на 41 новых эпохах, ранее никогда не сравнивавшихся (наихудший случай Фобос 1.38e-10 рад), аBody::muравно gm_de440 для всех четырнадцати тел. Остальная часть исходной строки (J2, средний радиус, отчёт) остаётся MODELLED. Результаты:docs/design/evidence/mr08-body-orientation/RESULTS.md.Многовитковая задача Ламберта (
maneuver::lambert_multirev): каждое решение с числом витков до трёх, обе ветви. Новая строка реестра (ledger), VALIDATED относительно pykep 3.0.1 (предварительно зарегистрировано a75de851; 382 случая, 1058 решений, наибольшая разность скоростей 1.6e-13 против 1e-8). Внутренняя защита посадки по Кеплеру выявила одно ограничениеmaneuver::kepler_universalна дуге с e = 0,994; оно записано вdocs/design/evidence/lambert-multirev/RESULTS.md.Давление солнечного излучения по моделям «коробка с крыльями» и ECOM2 (DS-PA-14), по выбору.
srp_boxwing: модель «коробка с крыльями» из плоских пластин с таблицами Galileo FOC/IOV из метаданных спутников GSC, при номинальном управлении рысканием ГНСС, с коэффициентом излучения и частными производными по панелям, а также эмпирическая модель ECOM2 с её частными производными. Выбирается черезForceModel::box_wing_srp/PreciseForceModel::box_wing_srp(поляsrp_boxwing, по умолчаниюNone: путь модели пушечного ядра и все эталонные значения не изменены); при заданной модели «коробка с крыльями»cr— её коэффициент излучения. Сравнено с Orekit 12,2 по предварительной регистрации (xval/srp-boxwing-orekit/): все пороги выполнены (met), около 1e-15 относительно; VALIDATED как вычисление модели, а предсказание SRP для Galileo остаётся MODELLED.Тень для SRP с учётом сжатия Земли и потемнение солнечного лимба к краю (FUT-09, RM-11). Новый модуль
srp_shadow:oblate_conical_shadow(затеняющий эллипсоид WGS-84),limb_darkened_shadow(закон Эддингтона) иShadowModel, выбираются черезForceModel::srp_shadow(по умолчанию: существующая сферическая коническая тень, без изменений);forces::srp_accel_with_lit_fraction. Тень сжатой Земли согласуется с коэффициентом освещённости Orekit 12,2 в пределах 7.4e-9 на 2400 геометриях (VALIDATED,xval/srp-oblate-shadow-orekit/); у потемнения лимба нет внешнего оракула (MODELLED).Термосфера NRLMSISE-00 (FUT-08, RM-10, DS-PA-13).
nrlmsise00: переносgtd7иgtd7d(переключатели, режимы суточного Ap и 3-часового массива ap) из общедоступной версии на C кода NRL на Fortran. Он побитово идентичен этому переносу на C и отличается от pymsis 0.13.0 (NRL Fortran, одинарная точность) не более чем на 1.9e-6 относительно на сетке из 720 точек, и воспроизводит 17 опубликованных тестовых случаев (VALIDATED;xval/nrlmsise00-pymsis/). Это проверяет перенос, а не точность модели относительно измеренной плотности.Уровень плотности для сопротивления по NRLMSISE-00, по выбору.
forces::DensityModel::{Exponential, Nrlmsise00 { f107a, f107, ap }},forces::drag_accel_with_density,density_atиpropagator::ForceModel::drag_density. Статическая экспоненциальная модель остаётся моделью по умолчанию, бит в бит. Космическая погода постоянна для каждой модели. VALIDATED на уровне орбиты относительно собственного сопротивления NRLMSISE-00 в Orekit 12,2 на 24 ч (наихудшее 0,03 м при смещении от сопротивления до 142 км;xval/drag-tier-orekit/).Солнце и Луна по DE440 в пропагаторе Коуэлла, по выбору (RM-33, FUT-10).
propagator::ForceModel::with_ephemerisпринимает любойEphemerisProvider(например,KernelEphemerisDE440) для членов третьего тела и SRP; он отказывает провайдеру, который не может обслужить эпоху, считает откаты к аналитическому ряду и по умолчанию выключен.EphemerisProvider::relative_position_jd2сохраняет двухчастную точность. В сравнении с Orekit 12,2 на его собственном читателе DE440 орбиты на 24 ч совпадают до 0,017 м; предварительно зарегистрированный порог положения Солнца и Луны не выполнен (6,4 м / 0,24 м; SPICE показывает тот же разрыв), поэтому MODELLED (xval/propagator-de440-orekit/).Атмосферный прилив S1, по выбору (DS-PA-03).
tides::atmospheric_tide_s1иs1_air_tide_acceleration(Biancale & Bode 2006, GFZ STR06/01, Таблица 1, модель N1, степени 2–6) включаются черезair_tide_s1()наpropagator::ForceModelиprecise_od::PreciseForceModel; по умолчанию выключены. MODELLED (коэффициенты перепроверены по опубликованной таблице; внешнего оракула для эффекта силы нет).Пакетное определение орбиты по скорости изменения дальности и азимуту/углу места с маской угла места (RM-36, FUT-13).
orbit_determination::determine_orbit_batch_tracking,simulate_tracking,predict_tracking,propagate_with_stm(вариационная STM с аналитическими частными производными для двух тел и J2),is_visible,measurement_with_partials;batch_ls::gauss_newton_analytic. Путь только по дальности не изменён. В сравнении с пакетным методом наименьших квадратов Orekit 12,2 по 8 предварительно зарегистрированным сценариям: все пороги выполнены, кроме согласия состояний без шума (≤ 1 см), не выполненного в 2 из 4 сценариев на 1,46 и 1,74 см при том, что kshana в пределах 1e-8 м от истины; записано, MODELLED.Взвешивание по точности SP3 (DS-PA-06).
sp3::parse_sp3_accuracyиSp3Accuracy::position_sigma_mсопоставляют кодам точности в заголовке и в каждой записи сигмы наблюдений; вариант подгонки Galileo с весами SP3 (3D RMS уровня Tier-2 0,035 м против 0,070 м без весов) добавлен рядом с неизменёнными записанными прогонами. MODELLED.Задача запуска полной дуги Swarm-A (DS-PA-08) в
.github/workflows/agency-od-validation.yml.Гравитация планет по таблицам SHADR из PDS (CAP-30, часть CAP-31).
SphericalHarmonicField::from_shadr(src/gravity_pds.rs) читает Mars GMM-3 (степень/порядок 120) и GRAIL GL0660B (степень/порядок 660);Body::with_gravity_fieldприсоединяет любое загруженное поле (значения по умолчанию не изменены). Обрезки до степени 20 входят в поставку (NASA PDS, общественное достояние;tests/fixtures/planetary_gravity/NOTICE.md); полные файлы загружаетxval/planetary-gravity-pyshtools/fetch_data.sh. VALIDATED относительно pyshtools 4.14.1 (в пределах 4e-15 от полной гравитации при степени/порядке 120 по всей сфере, 5e-14 при степени/порядке 660 для |широты| ≤ 60°); привязка к системе координат тела остаётся MODELLED (собственная система каждого поля не совпадает с используемой системой IAU).Гравитация высокой степени до степени 2190 (RM-14, FUT-07).
SphericalHarmonicField::acceleration_hf/potential_hf(модифицированный прямой по столбцам метод Холмса–Фезерстоуна, без потери значимости, без полярной сингулярности),prepare_high_degree, потоковый загрузчик ICGEMfrom_gfc_file/from_gfc_reader(проверки нормировки и максимальной степени, система приливов записана, зависящие от времени члены отвергаются) иscripts/fetch_egm2008.sh(полная EGM2008, закреплена по SHA-256, не входит в поставку; тесты привязаны кKSHANA_EGM2008_GFC).propagator::FieldEvaluatorвыбирает его вGeopotential, включаемой по выбору. Согласуется с Orekit 12,2 до 7.3e-17 м/с² до степени 2190, а орбита 200×200 на 24 ч согласуется до 0,13 м. MODELLED: pyshtools не выполнил предварительно зарегистрированный порог вблизи полюса (причина прослежена до pyshtools), и контроль чувствительности орбиты к степени 70 не выполнен (0,73 м < 1 м); оба результата записаны вxval/.Интегратор DOP853 (FUT-11).
integrator::integrate_dop853,integrate_dop853_checked,integrate_dop853_dense(плотный выход 7-го порядка),dop853_step,dop853_initial_step, с защитой шага, закрывающейся при ошибке;propagator::Integrator::Dop853,propagate_dop853,propagate_dop853_checked. Драйвер по умолчанию не изменён. VALIDATED относительноsolve_ivp(method="DOP853")в SciPy 1.18.1: одиночные шаги в пределах 5.6e-15, последовательности шагов совпадают, конечные состояния в пределах 1.6e-12 (xval/dop853-scipy/).Устойчивый решатель уравнения Кеплера (FUT-12). Новый модуль
kepler:solve_kepler_markley(начальное приближение Маркли 1995, невязка без потери значимости при вычитании) для всех 0 ≤ e < 1, обёрнутый вpropagator::solve_kepler_robust. VALIDATED относительно корней mpmath с 50 знаками до 0,9 ε·|E| вплоть до e = 0,999999 (xval/kepler-mpmath/).Тессеральная гравитация Земли в пропагаторе Коуэлла, по выбору (RM-09).
propagator::ForceModelполучаетgeopotential: Option<Geopotential>(with_geopotential,with_egm2008(nmax)). Он вычисляетSphericalHarmonicField(встроенная EGM2008 до степени/порядка 70 или любой.gfcICGEM) в системе, связанной с Землёй, которой достигают через угол вращения Земли (EarthFixedFrame::Era) или цепочку CIO GCRS–ITRS (EarthFixedFrame::Cio). По умолчаниюNone: ни один существующий выход не меняется. VALIDATED относительно Holmes–Featherstone в Orekit 12,2 на 24 ч (6 случаев, наихудшее 0,036 м) с порогами, предварительно зарегистрированными вxval/cowell-tesseral-orekit/PREREGISTRATION.md.Двухчастные юлианские даты в вращении Земли на орбитальном пути:
jd2::gmst82,cio::gcrs_to_itrs_matrix_jd2,frames::teme_to_itrf_jd2/itrf_to_teme_jd2,orbit::Propagator::position_in_frame_jd2иown_jd2_utc, преобразованияFromмеждуjd2::Jd2иtimescales::TwoPartJd, а также включаемый по выборуtwo_part_jd = trueдля сценарияephemeris(ECEF, трасса на поверхности и вид со станции; по умолчанию выключено и без изменений, а ключ при выключении не входит в хеш сценария). Новая строка реестра (ledger), VALIDATED относительно pyerfagmst82/c2t06a(предварительно зарегистрировано b10475ee; 40 дат: GMST побитово идентичен, матрица в пределах 2.7e-14, вращение на шагах 1 мкс в пределах 1.1e-14 рад, чего путь с однимf64не достигает). Эпоха модели сил Коуэлла остаётся с однимf64; причина указана в её документации.Прогноз EOP за пределами таблицы (
EopSeries::with_ls_ar_prediction,EopSeries::last_mjd): включаемое по выбору продолжение ряда ориентации Земли IERS предиктором LS+AR, выданным в его последней строке, так что аргументы системы отсчёта более поздней эпохи следуют прогнозу, а не фиксируются на последней строке. Ответы внутри таблицы побитово идентичны (проверено тестом); ряд по-прежнему фиксируется на последней строке, пока это не вызвано. Точность прогноза остаётся прежним выводом LS+AR относительно Bulletin A (MODELLED).Смещения небесного полюса dX, dY в цепочке CIO (
cio::gcrs_to_cirs_matrix_with_offsets), а также прямые проверки векторов ERFA дляprecession_matrix,teme_to_gcrs_matrixи новой функции. Новая строка реестра (ledger), VALIDATED относительно pyerfa (предварительно зарегистрировано 979c1e39; 40 эпох 1950–2100: прецессия и CIO побитово идентичны, TEME→GCRS в пределах 1.1e-10 рад, что соответствует предсказанному эффекту двучленного ряда уравнения равноденствий). Существующие функции не изменены.UTC до 1972 года на двухчастном временном пути (
timescales::tai_minus_utc_on_date, а такжеJd2::from_utc_calendar,jd2::utc_to_taiиjd2::tai_to_utcс 1960-01-01): эпоха дрейфующей скорости («резиновой секунды»), с таблицей дрейфа SOFA, дробными шагами в конце суток и масштабированием доли суток из UTC в SI. Новая строка реестра (ledger), VALIDATED относительно pyerfadtf2d/utctai/taiutc(предварительно зарегистрировано 23c40661; 117 моментов 1960–1971, наихудшее 2.9e-11 с при пороге 1 мкс). Каждый результат за 1972 год и позже побитово идентичен (контрольная сумма закреплена до изменения). До 1960 года TAI − UTC равно 0, как в SOFA.timescales::tai_minus_utcс однимf64не изменено.Бортовые часы спутника ГЛОНАСС по широковещательным данным (
GlonassEphemeris::sv_clock_bias_s):−τn + γn·(t − tb)из записи RINEX, на момент, прочитанный по часам спутника (две итерации с фиксированной точкой, соглашение RTKLIB). Разобранные−τnиγnранее не использовались. Новая строка реестра (ledger) «GLONASS broadcast satellite clock and broadcast-orbit propagation», VALIDATED относительно RTKLIB 2.4.2-p13geph2clk/geph2pos(предварительно зарегистрировано e099c42a; 292 случая на реальном широковещательном файле 2013 года: разность часов 0 с, наихудшее положение 1,1 мм при пороге 1 см). Библиотечная функция; ни один выход сценария не меняется. Преобразование PZ-90.11 → ITRF не применяется, и модуль об этом говорит.Решение времени по PPP относительно часов станции IGS (0,36, FUT-19): часы приёмника плавающего фильтра PPP на WTZR согласуются с итоговыми комбинированными часами IGS для этой станции до 0,075 нс (стандартное отклонение) с постоянным смещением −0,66 нс за сошедшиеся два часа. Пороги были предварительно зарегистрированы в
xval/ppp-time/. VALIDATED (новая строка реестра (ledger)). Новая фикстураigs_2025055_WTZR_05m_0006.clk— записи часов станций из итогового файла часов IGS, уже используемого для часов спутников.Паритет PPP с gLAB (0,36, WP-07, RM-31): gLAB 6.0.0 запускался на тех же входных данных WTZR как отдельный инструмент (ядро Apache-2.0; контрольная сумма загрузки сверена с опубликованным списком), с командной строкой процедурной поправки, закоммиченной до запуска. В первом зарегистрированном прогоне плавающий PPP Kshana и gLAB согласуются в пределах 0,05 м в 240 из 240 эпох и до 5,0 мм в последней. Порог SPP не выполнен (медиана 1,187 м против 0,50 м) и записан как вывод: собственные решения SPP у gLAB и RTKLIB различаются между собой на 0,852 м. Поэтому зарегистрированное правило оставляет оба звена обоих инструментов в целом not met, хотя паритет PPP выполняется.
Чтение навигационных данных RINEX 4 (0,36, WP-07, PRO-41):
rinex::parse_navчитает навигационные файлы RINEX 4.00–4.02 (> EPHGPS LNAV, Galileo I/NAV и F/NAV, BeiDou D1/D2, QZSS LNAV; прочие записи пропускаются до следующего заголовка записи), аparse_nav_withпринимает параметры. VALIDATED относительно сводного файла IGS RINEX 3 того же дня: каждое декодированное поле идентично и 0 м по положению. Чтение RINEX 2/3 не изменено.Широковещательные положения GEO BeiDou (по выбору):
NavParseOptions::include_beidou_geoиRinexEphemeris::sv_position_ecef_bds_geo(BDS ICD, наклон −5 град).parse_navпо-прежнему пропускает GEO. MODELLED: предварительно зарегистрированное сравнение с точной орбитой зависит от данных и ещё не выполнено.Файлы наблюдений RINEX 4: реальный файл наблюдений MGEX в формате RINEX 4,00 читается в тестах (MODELLED, соответствие формату).
RTK с LAMBDA на реальном RINEX (0,36, WP-07 ★):
rtk_real::run_rtk, двойные разности короткой базовой линии по двухчастотным кодовым и фазовым измерениям GPS с плавающим фильтром Калмана и фиксацией целых по LAMBDA (проверка отношения). VALIDATED на станциях IGS WTZR и WTZZ (на расстоянии 1,4 м) относительно их базовой линии в ITRF2020 по предварительно зарегистрированным порогам: фиксация в каждую эпоху после первых десяти минут, медиана ошибки базовой линии 4,5 мм и 95-й процентиль 5,5 мм.Паритет PPP по реальным данным с RTKLIB (RM-31):
xval/ppp-parity/run.shиtests/ppp_parity_glab_rtklib.rsс предварительно зарегистрированными порогами. PPP RTKLIB v2.4.2-p13 на тех же входных данных WTZR согласуется с Kshana в пределах 5 см в каждую эпоху последних двух часов (9,7 мм в конце) в третьей регистрации; первые два прогона, записанные как выводы, имели выключенный твёрдый прилив и антенну приёмника в базовом слоте RTKLIB. Порог паритета по одиночной точке не выполнен (медиана 1,09 м против 0,5 м). Звено gLAB не запускалось (зависит от данных).Кодировщики навигационных сообщений помимо LNAV (0,36, WP-07, PRO-40):
gnss_navmsgкодирует GPS CNAV (типы сообщений 10, 11, 30; CRC-24Q; непрерывное кодирование со скоростью 1/2, K=7), Galileo I/NAV (слова типов 1–5 в чётных/нечётных номинальных страницах; перемежитель 30x8; синхронизация0101100000) и Galileo F/NAV (страницы типов 1–4; перемежитель 61x8; синхронизация101101110000), с тестовыми декодерами. MODELLED: прямые и обратные преобразования и известные ответы ICD; предварительно зарегистрированная проверка того, что широковещательные эфемериды Galileo лежат на сетке младшего разряда кодировщика, выполнена (наихудшее 3.6e-3 младшего разряда), но порог по числу спутников не выполнен (15 из 20), это записано. Кодировщики — библиотечные функции; подключение к сценам не входит в это изменение.Читатель файлов IONEX (0,36, WP-07):
ionex::parse_ionex_fileсIonexFile,IonexHeader,IonexEpoch,IonexFileMapиIonexTimeInterp: строгий читатель IONEX 1,0 с фиксированными столбцами, эпохами, считаемыми от дня первой карты,9999как пропуском, картами RMS и временными интерполяциями формата: ближайшей, последовательной и по повёрнутым картам; наклонный TEC на высоте оболочки из заголовка. Проверено на закоммиченной синтетической карте и, с зависимостью от данных (загружается во время теста с закреплённым SHA-256, не включается в поставку), на фрагменте реального CODE GIM: каждый узел точен; интерполяция совпадает с эталоном по формуле до 4e-13 TECU.iontecиз RTKLIB согласуется до 3.6e-13 TECU в 6885 точках (предварительно зарегистрировано B6). VALIDATED на доказательствах, зависящих от данных (решение владельца, 2026-10-13): тест падает на любой карте, кроме закреплённой по SHA.Сглаживание по несущей Хэтча (0,36, WP-07):
hatch::HatchFilterиpvt::assemble_epoch_precise_smoothed, не расходящаяся (свободная от ионосферы) форма в точной сборке по одной точке. MODELLED с записанным выводом: на станции IGS WTZR оно снижает медиану ошибки по одной точке с 1,55 м до 1,12 м и 95-й процентиль с 3,47 м до 3,21 м, не достигая предварительно зарегистрированного снижения на 40 % (остаточная ошибка носит характер смещения, а не шума).Плавающий PPP на реальном RINEX (0,36, WP-07):
ppp_real::run_ppp, статический плавающий фильтр точного абсолютного позиционирования по реальным двухчастотным кодовым и фазовым измерениям GPS с итоговыми продуктами IGS (смещения и вариации антенн, твёрдый прилив Земли, фазовая закрутка, задержка Шапиро, оцениваемая влажная задержка, обнаружение срывов циклов), сparse_antex_receiver. VALIDATED на отложенной станции IGS WTZR относительно её координат в ITRF2020 по предварительно зарегистрированным порогам: через 6 ч ошибка составляет 1,5 мм по горизонтали и 2,9 см по вертикали, и каждая эпоха последних двух часов в пределах 10 см.Интерполяция точных часов SP3 (0,36, WP-07):
Sp3File::clock_sиclock_nodesлинейно интерполируют табличные часы спутников SP3 между двумя охватывающими допустимыми узлами (признак плохих часов пропускается), аClockRinex::from_sp3подаёт их вPreciseProducts, так что точная цепочка работает по одному SP3. VALIDATED относительно итоговых часов IGS с шагом 30 с за 2025-02-24 по предварительно зарегистрированным порогам: 32 спутника GPS, RMS в средней точке 0,121 нс (порог 0,15 нс), 95-й процентиль 0,265 нс (порог 0,30 нс).RAIM рядом с показателями качества holdover часов (CAP-05b): включаемая по выбору секция
[integrity]для вида clock выдаёт отдельный блокintegrity_fom(моментальный RAIM на заданном небе из заданного пункта: вердикт и уровни защиты по каждой эпохе, доступность; недоступен, пока GNSS отказан, никогда не экстраполируется). Показатели holdover не изменены; без секции выход побайтово идентичен. MODELLED.Пороги доверия к приёмнику, откалиброванные по JammerTest 2024 (CAP-13): предварительно зарегистрированная калибровка мониторов падения C/N0, AGC и индикатора подавления на общедоступном наборе JammerTest 2024 (загружается во время выполнения, не включается в поставку;
examples/jammertest_trust_calibration.rs), поставляемая только как включаемый по выбору профиль[monitors] profile = "jammertest-2024-calibrated"(1,5 дБ, 3,5 сигмы, 29). На отложенной выборке пороги AGC, индикатора подавления и объединения проходят; порог ложных тревог по C/N0 не выполнен (0,023 против 0,02), поэтому строка MODELLED (xval/jammertest-trust/RESULTS.md). Значения по умолчанию и выходы без этого профиля не изменены.Гипотезы отказов ARAIM для нескольких спутников (CAP-05a): правило подмножеств ADD v4.2, обобщённое за пределы пар (
add_v42_subset_plan,add_v42_protection_levels_to_order; порядок 2 — в точности существующий путь, проверенный MAAST) и включаемый по выбору продвинутый RAIM по этим гипотезам (araim_subset_raim), который при обнаружении отказа сообщает подмножество наибольшего разделения. Априорные вероятности, требующие более глубоких подмножеств, отклоняются, никогда не усекаются. MODELLED.Линия горизонта в доверии к приёмнику (FUT-01): сессия доверия к приёмнику может задать
[skyline]; спутники за ней теряются для неба (sky-blocked,behind_skyline,open_fraction), и их потери относятся к классуgeometry, а неenvironment; без неё запасной вариант по азимутальному разрыву и все выходы прежние. Генератор тренировок экипажа получает событиеnatural-degradation(заблокированное небо, а не помехи) и сценарийscenarios/training/fjord-natural-degradation.toml. Монте-Карло UERE x DOP получает две геометрии с маскированной линией горизонта из проектной записки, зарегистрированные заранее отдельно: все 26 проверок проходят.Проверка меток времени по RFC 3161 (CAP-14):
kshana::evidence::tsa::verify_tokenпроверяет подпись токена метки времени (RSA PKCS#1 v1.5, RSA-PSS, ECDSA P-256 и P-384), привязку его сертификата подписи ESS, назначение подписанта timeStamping и его цепочку до доверенного якоря на момент genTime токена, без сети;kshana evidence verify --tsa-ca <anchors.pem>применяет её кtimestamp.tsrпакета (по выбору; без этого отчёт не меняется). VALIDATED, в узком смысле: все 27 самосгенерированных случаев согласуются с OpenSSL 3.0.13 по вердикту и genTime, при сравнении, предварительно зарегистрированном до написания верификатора. Отзыв сертификатов не проверяется.Уровни проверки по каждому показателю для каждого вида (RM-04): результат каждого вида сценария теперь заканчивается блоком
figure_tiers, называющим его главные показатели, строку матрицы верификации, которой принадлежит каждый из них, и уровень, прочитанный из этой строки (показатели, не принадлежащие ни одной строке, перечислены как не получившие уровня). Блок добавляется после прогона и сворачивается обратно к прежнему документу байт в байт (api::without_figure_tiers). Уlunar-station-coverageнетfigure_tiers, пока новый датированный прогноз не заменит замороженный; уleo-ppp,solar-system,sweepиsweep-ndнет скалярного главного показателя, аlunar-attack-surfaceпишет компактный JSON. Члены кампании сохраняют свои документы без уровней.Квантовая заготовка
quantum-cai-coast(CAP-08c): встроенный инерциальный сценарий, в котором акселерометр на интерферометре холодных атомов, заданный физикой интерферометра ([accel_quantum.cai]с заданным уровнем вибрации платформы), движется по инерции наряду с кварцевым акселерометром навигационного класса во время перерыва GNSS длительностью 110 минут. MODELLED.Точные эквивалентные степени свободы по Greenhall (CAP-03):
allan::edf_greenhall, полный алгоритм Greenhall и Riley (2003) (порядки разностей от 1 до 3, показатели шума от +2 до -4, перекрывающиеся и неперекрывающиеся, модифицированные и немодифицированные, с таблицами для больших J), с обёртками ADEV, MDEV и HDEV. VALIDATED по предварительно зарегистрированному сравнению с allantools 2024,6: 4 876 точек сетки в пределах 6.0e-13 относительно; allantools не справляется ещё в 32 точках, которые записаны без значения оракула. Доверительные интервалыassurance::uncertaintyне изменились ни на бит.Члены ошибки интерферометра холодных атомов (RM-26/27/28): фазовый шум рамановского лазера (с членом задержки обратного отражения), смещение из-за кривизны волнового фронта теплового облака (чистая расфокусировка, с радиусом детектирования) и разрешение неоднозначности полос (с классической помощью и при двух временах опроса) в виде библиотечных функций в
src/inertial/cai_error_terms.rs, каждая замкнутая формула проверена квадратурой или Монте-Карло. MODELLED; пока недоступны из вида сценария (docs/QUANTUM-MODELS.md).Форматы журналов часов (RM-03):
src/clock_log.rsчитает файлы часов RINEX, фазовые или частотные журналы ASCII в стиле TimeLab и журналы счётчика TAPR TICC в один нормализованный фазовый ряд (tau0 задан или найден, пропуски посчитаны, политика обработки пропусков). По выбору: ряд телекоммуникационной синхронизации может указывать журнал ([series.clock_log]), а таблица[clock_log]сценария clock добавляет блокmeasured(ADEV, TDEV, MTIE). Без таблицы оба вида побайтово идентичны (docs/CLOCK-LOG-FORMATS.md). Предварительно зарегистрированное сравнение на трёх синтетических журналах выполнило пороги по фазе и по подключению; оценки согласуются с allantools в пределах 2.5e-14 везде, где он вычисляет, а точку MTIE по всей записи он не вычисляет (записано). MODELLED.Маски блуждания для частотной синхронизации (RM-01): вид
telecom-timingполучает семь масок генерации блуждания MTIE и TDEV при постоянной температуре: ITU-T G.811 PRC, G.812 типов I–III, G.8262 EEC, варианты 1 и 2, и G.8262.1 eEEC, со степенными участками, как их пишут таблицы, и эталонный сценарийscenarios/telecom-synce-eec.toml(свободно работающий OCXO против масок EEC: он не проходит при 1 000 с, где работу должна выполнять петля). Каждая строка перечитана по тексту itu.int; G.812 (06/2004) заменена предварительно опубликованной редакцией 08/2026, которую прочитать не удалось. MODELLED (транскрипция); существующие маски и выходы не изменены.Рекомендации по априорному фильтру для вида
gnss-ins(0,36, WP-09, вывод RM-21): априорный фильтр пакета по умолчанию подходит для IMU тактического класса. С IMU навигационного класса настройка по умолчанию может ухудшить объединённый выбег по сравнению со свободной INS: 52 м против 11 м на профиле самолёта 70 м/с. Задайте[imu_*.filter_prior]в соответствии с классом датчика, как это делают новые морской, железнодорожный и авиационный пакеты. Ни один встроенный сценарий не сочетает IMU навигационного класса с априорным значением по умолчанию: каждый, где используется значение по умолчанию, имеет остаточные смещения акселерометров не менее 0,015 м/с². Только документация; выходы не меняются.Экспорт для испытательного стенда, проверенный собственными читателями симулятора (0,36, WP-09, CAP-16): файлы движения
kshana bench-exportдля 8 встроенных сценариев были прочитаны обратно читателями NMEA, широты/долготы/высоты и движения в системе, связанной с Землёй, из gps-sdr-sim (MIT, коммит 28ca29a6, используется как отдельный инструмент черезxval/testbench-gpssdrsim/; ни одна сигнальная функция не вызывается). Они возвращают экспортированную траекторию с точностью до 1,2 мм, 0,15 мм и точно. ВЫВОД: читатель симулятора для системы, связанной с Землёй, не может принять CSV полной ширины, потому что его буфер строки в 100 символов разрезает каждую строку. Теперьdocs/TEST-BENCH.mdуказывает, где резать столбцы, и предел симулятора в 300 с. VALIDATED (новая строка реестра (ledger)); байты экспорта не изменены.GNSS/INS на наборе данных KF-GINS (0,36, WP-09, FUT-17): загрузчики
fusion::kfginsи исполнитель, а также модель измерения с плечом рычага в замкнутом EKF. На демонстрационном наборе данных KF-GINS (загружается во время теста, не включается в поставку) горизонтальное RMS Kshana относительно эталонной траектории составляет 1,09 см против собственных 1,11 см KF-GINS, и каждый предварительно зарегистрированный порог выдержан. VALIDATED на доказательствах, зависящих от данных (решение владельца, 2026-10-13): набор данных загружается с закреплёнными SHA-256, а путь воспроизведения указан вxval/kfgins/PREREGISTRATION.md.Связанный фильтр PNT в пакете fusion (0,36, WP-09, FUT-16): вид
fusionпринимает необязательную таблицу[coupled], которая запускает один составной фильтр по псевдодальностям с состоянием смещения акселерометра (fusion::coupled::CoupledPntBiasFilter), аfusion::coupled::CoupledPnt3d— его 3D-версия с 8 состояниями. Новый входящий в поставку сценарийfusion-pnt-coupled: при смещённых акселерометрах связанный режим удерживает положение квантового набора в пределах 18,7 м (95-й процентиль) при полной целостности, тогда как несвязанные фильтры достигают 430 м. Без таблицыfusionиhybridне изменены (закреплено);hybridтаблицу отвергает. MODELLED.Пакеты GNSS/INS для морского, железнодорожного и авиационного применения (0,36, WP-09, RM-21): встроенные сценарии
gnss-ins-maritime,gnss-ins-railиgnss-ins-aviationна библиотеке траекторий и необязательная таблица[tight]для видаgnss-ins, объединяющая псевдодальности от группировки Уолкера по SGP4 (все спутники при номинальной работе, несколько самых высоких при деградации). В железнодорожном пакете тесная связь удерживает решение навигационного класса на 5,3 м в выемке и туннеле против 12,9 м при слабой связи. Без[tight]пакет не изменён (закреплено). MODELLED.Тесная связь по фазе несущей (0,36, WP-09, RM-25 / FUT-17):
fusion::carrier_tc, EKF по вектору ошибок с явной двухсостоянной моделью часов приёмника и вещественными неоднозначностями несущей, управляемый орбитальной группировкой Уокера на SGP4 с поправками Клобучара и Саастамойнена в контуре измерений, обнаружением срывов по разности несущей во времени и повторной инициализацией неоднозначностей, а также прогон только по коду на тех же измерениях для сравнения. MODELLED: при движении по траектории figure-8 решение по несущей даёт 2,5 см против 47 см только по коду, а NIS/NEES согласованы по начальным значениям.Библиотека траекторий GNSS/INS (0,36, WP-09, RM-24): вид
gnss-insпринимает необязательную таблицу[trajectory]сprofile = "straight" | "figure8" | "stop_go" | "aircraft" | "uas" | "csv". Профили задают скорости Эйлера и продольное ускорение по истинному состоянию и выводят истинный IMU из кинематики твёрдого тела (координированные развороты, набор высоты, Кориолис);csvимпортирует истинную траекторию (t, lat, lon, alt, vn, ve, vd, roll, pitch, yaw) и решает, какой IMU её воспроизводит. Без таблицы пакет выполняет свой исторический проезд бит в бит (закреплено). MODELLED.Тайлы DEM по широте и долготе для лунного горизонта:
[terrain] dem_tile_pathчитает текстовый тайлrealdata::lola_dem(высоты над средней сферой на сетке широты и долготы) вместо полярной стереографическойdem_path, как дляlunar-station-coverage, так и дляmoonlight-service-volume; отчёт повторяет тайл (terrain.dem_tile, с его SHA-256).realdata::lola_demтеперь подключён к трассировке лучей до горизонта. Тайл, передискретизированный из поставляемой вырезки, даёт станции горизонт вырезки с точностью до 0,22 град. MODELLED.Рельеф в пункте экспорта объёма обслуживания: при наличии секции
terrainкаждая строка экспорта геометрии по спутникамmoonlight-service-volumeсодержитclears_terrain(спутник выходит за плоскую маску и за горизонт пункта экспорта по его азимуту), отчёт содержит горизонт пункта (export_site_terrain), а CSV времени выполнения получает этот столбец. Без рельефа экспорт не изменяется. MODELLED.Главные поля от движка (0,36, STUDIO-06):
kshana::api::HEADLINE_FIELDS,field_importance_json()иfield_importance()в WebAssembly указывают для двенадцати видов, какие поля сценария отвечают на его вопрос, лучшие первыми, в виде путей с точками (jammers[].eirp_dbw). Studio читает их перед собственным ранжированием. Только метаданные для показа: движок их никогда не читает, ни одному файлу сценария они не нужны, ни один результат от них не зависит.tests/field_importance.rsпадает, если вид нельзя запустить или путь не найден ни в одном из встроенных сценариев этого вида (он поймал два пути, которые плоские идентификаторы Studio записали без скобок массива).Таблица соответствия видов и модулей от движка (0,36, STUDIO-05):
kshana::api::KIND_MODULES,kind_modules_json()иkind_modules()в WebAssembly для каждого вида сценария, строки матрицы верификации которого называют иной модуль, чем собственный, выдают названия модулей. Карта возможностей Studio использовала собственную копию, написанную вручную;tests/kind_modules.rsпадает, если вид из таблицы нельзя запустить или модуль не встречается ни в одной строке матрицы. Выходы не изменились.Короткий прогон IQ в браузерной сборке (0,36):
iq_signals()иiq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed)в модуле WebAssembly строят синтетическую сцену, захватывают каждый спутник и отслеживают захваченные, всё в памяти, с ограничением 0,25 с, 1 000 000 отсчётов и 8 спутников. Построитель сцены и поиск сигнала по имени вынесены из доступного только в нативной сборкеiq::cli(вiq::scene::syntheticиiq::signals::by_name), чтобы обе сборки делили их; выход командной строки не изменился. Нативный тест иweb/smoke.mjsсравнивают один и тот же запрос с одним эталонным значением (tests/fixtures/iq_short_golden.json) байт в байт: после перехода на переносимую математику (STUDIO-15, ниже) браузерная и нативная сборки дают одни и те же биты.Типизированные API для Python и TypeScript (CAP-34):
kshana.pyiтипизирует закрытые словари (ScenarioKind, каждое имя вида;ErrorKind;ProvenanceClass) и словариKindMetaиFieldUnit;scenario_kinds()иerror_kind()возвращают их. Пакет WebAssembly добавляетrun_typed(один прогон как типизированный объектRunOutputс разобранным документом вdata) иscenario_kinds(разобранныйKindMeta[]), а егоkshana.d.tsнесёт тот же словарь;error_kindтипизирован какErrorKind | "".tests/typed_api_sync.rsследит, чтобы оба списка совпадали со списками движка.Единицы для каждого столбца
sweep-nd(FUT-28): результатsweep-ndтеперь несётkey_unitsиmetric_units— единицу каждого перебираемого ключа и каждой записанной метрики, прочитанную из собственной таблицы единиц перебираемого пакета. Ось может объявитьunitдля ключа, который пакет не повторяет; объявленная единица, противоречащая единице пакета, отклоняется, а единица, которой нет ни у одного из них, —null, и никогда не угадывается.points[].coords[]иpoints[].metrics[]описаны, поэтому каждый из 76 видов теперь полностью охвачен проверкой единиц полей (потолок непокрытых видов 1 -> 0).Массивы NumPy из
RunOutput(FUT-26):RunOutputна Python получаетarray(path),columns(path)иseries(), которые возвращаютnumpy.ndarrayдля числового списка, числовых столбцов списка записей или каждого ряда записей в документе. Каждый массив равенnumpy.asarrayтех же значений изdata()(dtype и биты). NumPy импортируется только при вызове одной из них и не входит в требования среды выполнения. Типизировано вkshana.pyiи проверено stubtest.Оптимизатор кампаний (CAP-32): новая необязательная секция
[optimize]видаcampaignищет от одного до трёх ключей сценария в заданных границах для наилучшего значения одной метрики: минимизировать, максимизировать или попасть в целевое значение. Она ищет исчерпывающе на сетке или детерминированным ограниченным симплексом Нелдера–Мида. Каждая оценка — настоящий прогон названного вида и перечислена вtraceрезультата. Пример:scenarios/campaign-optimize-link-budget.toml. Пороги были предварительно зарегистрированы (docs/design/evidence/cap32-optimize/):- функция Розенброка met (f* = 1.7e-20);
- решение целевой задачи 1-D в замкнутом виде выполнено (6e-15 относительно);
- сетка побитово равна независимому полному перебору;
- симплекс справляется не хуже сетки 41 × 41 за 177 прогонов.
Порог 1-D раунда 1 записан как NOT MET, поскольку предварительно зарегистрированная область исключала решение. MODELLED; строка реестра «Ограниченная оптимизация одной метрики по параметрам кампании». Аддитивно: кампании без этой секции не изменяются.
Ансамбли калибровки (CAP-10): три проверки с одним seed, повторённые на 200 независимых seed по предварительно зарегистрированным порогам, в
docs/CALIBRATION-ENSEMBLES.md(сгенерированоgen_calibration_ensembles; значения по каждому seed вdocs/data/calibration-ensembles.csv).- 95-процентный интервал бутстрепа Монте-Карло кампании накрывает истинное среднее в 192 из 200 ансамблей, а его проверка по хи-квадрат проходит в 196.
- Допуск по процентилю для одного seed проходит лишь в 183 из 200: NOT MET, как и предсказывалось. Это порог примерно в 2 сигмы, он записан и не ослаблен.
- Калибровки ADEV для белого частотного шума (white-FM) проходят на каждом seed, а наихудшая ошибка далеко внутри допуска.
MODELLED.
Встроенные виды через трейт
Scenario(FUT-27, в работе): трейтBuiltinKind(api::BuiltinKind, с хуком уровня по показателю иappend_figure_tiers) и первые виды, перенесённые на него (inertial,spoof,passes,link-budget,jamming). Выход не изменился: манифест всего каталога с SHA-256 каждого выхода идентичен до и после (tests/scenario_output_manifest.rs).Проверка отсутствия загрузок в Playground (RM-07):
tests/playground_no_fetch.rsпроверяет три вещи:- каждый сценарий библиотеки Studio входит в пакет для браузера;
- пакет побайтово идентичен
scenarios/; - каждый сценарий браузера запускается из пустого рабочего каталога.
Карты Alt-PNT: реальное гравитационное поле, Монте-Карло ошибок карты, SRTM полного разрешения (0,36, WP-10). Вид
gravity-mapпринимает необязательное[reference]: гравитационную аномалию, синтезированную по встроенным коэффициентам EGM2008 (или по файлу ICGEM.gfcчерезgfc_path, только нативные сборки). Этот синтез совпадает со службой расчётов ICGEM примерно до 1e-8 мГал в 794 узлах в двух регионах при предварительно зарегистрированных порогах 0,005 мГал RMS и 0,02 мГал максимум (VALIDATED; строка реестра (ledger) «Gravity-anomaly synthesis from a spherical-harmonic model»). Новый встроенный сценарийgps-denied-gravity-nav-egm2008запускает 60-минутный бенчмарк на этом реальном поле степени 70. Предварительно зарегистрированный исход: ошибка сопоставления 3106 м, поэтому порог < 500 м NOT MET, как и предсказывалось (степень 70 слишком гладкая), а десятикратное снижение дрейфа MET (MODELLED). Необязательная[map_error_mc]повторно запускает бенчмарк на ошибках карты с заданным seed и гауссовой корреляцией и сообщает распределение ошибки сопоставления (встроенный сценарийgravity-map-error-mc). Поисковое и не зарегистрированное заранее: при ошибке карты 2 мГал с корреляцией на 0,2 град (размер, который закладывает собственная сигма сопоставителя) 1 из 20 реализаций остаётся в пределах 500 м (медиана 2,9 км, p95 14,7 км) против 144 м при идеальной карте. Синтетическая оценка с точностью лучше 500 м предполагает, что карта точна. Без любой из этих опций документ побайтово идентичен предыдущим выпускам.combined-altpntпринимает необязательную[magnetic_grid](csv_path,column), которая читает магнитный канал из CSV формата EMAG2v3. EMAG2 не включён в поставку, поскольку его условия неясны:tools/fetch_emag2_tile.pyзагружает его с закреплённым SHA-256 и вырезает участок. Для реальной сетки EMAG2 навигационный результат не заявляется. Совместная оценка карты (SLAM по рельефу, RM-18):altpnt::sequential::run_sequential_trn_on_mapзапускает последовательный навигатор по рельефу на сохранённой карте, отличающейся от истины, либо доверяя ей, либо оценивая поправку карты по ячейкам фильтром Рао–Блэквелла в стиле FastSLAM. Предварительно зарегистрировано в сравнении с SITAN по известной карте при коррелированной ошибке карты 15 м на 20 seed: средний выигрыш 1,5 %, лучше в 10 из 20, поэтому оба порога улучшения NOT MET (10 % и 12 из 20), без ухудшения на идеальной карте (MET). Единственный проход без повторных посещений не позволяет изучить карту (xval/terrain-slam-rbpf/, MODELLED). Документыterrain-slamпобайтово идентичны. Тесты на реальном SRTM теперь выполняются в CI на двух закоммиченных вырезках полного разрешения; все предварительно зарегистрированные пороги выполнены, а ближайший узел равен GDAL 3.8.4 в 8 из 8 точек (xval/srtm-ungate/).Интероперабельность, WP-08 (0,36; каждый пункт предварительно зарегистрирован и закоммичен отдельно до запуска своего оракула, каждый — новая строка реестра (ledger) VALIDATED, кроме пункта о телеметрии, который расширяет существующую строку):
- Сообщения CCSDS с данными об орбите (
src/odm.rs): OPM 3.0/2.0, OMM 3.0/2.0 и OCM 3,0 (блоки TRAJ, PHYS, COV, MAN, USER) записываются и читаются в KVN и NDM/XML, а также полноточный OMM из набора элементов SGP4 (OmmMessage::from_omm_file); выходOmmFile::to_omm_kvnне изменён. В сравнении с Orekit 13.1.8 в обе стороны: 27 из 30 сообщений Kshana разбираются в Orekit, а Kshana читает каждое записанное Orekit, значения в пределах 1e-14 относительно, а эпохи в пределах 1e-9 с; закреплено четыре вывода (Orekit требуетELEMENT_SET_NO, отказываетCOMMENTв определяемых пользователем параметрах XML, не запишетBTERMбезBSTARи читает относительные эпохи OCM по TDB в секундах SI). Устаревший писатель OMM сMETA_STARTOrekit отклоняет (записано). Строка «CCSDS Orbit Data Messages (OPM, OMM, OCM)». - Сообщения CCSDS с данными об ориентации (
src/adm.rs,src/ndm_xml.rs): AEM 2.0/1.0 и APM 2,0 в KVN и XML в сравнении с Orekit 13.1.8, все пороги выполнены; писатель APM в Orekit отклоняет манёвр безMAN_DELTA_MASS(закреплено). Строка «CCSDS Attitude Data Messages (AEM, APM)». - Экспорт SPICE SPK (
src/spk_writer.rs): писатель и читатель SPK типов 9 и 13 и экспорт OEM в SPK; в сравнении с CSPICE N0067 ядра побайтово идентичны ядрам SPICE и вычисляются побитово идентично. Строка «SPICE SPK export (types 9 and 13)». - SPICE SPK типов 3 и 21 (
src/spk_writer.rs): сегменты типа 3 (Чебышёв) и типа 21 (расширенные линии разностей), записываемые из заданных записей и вычисляемые так, как это делает SPICE; в сравнении с CSPICE N0067 ядра побайтово идентичны ядрам SPICE, а каждое вычисление совпадает бит в бит в обе стороны. Строка «SPICE SPK types 3 and 21 (Chebyshev, extended difference lines)». - Расширения Space Packet (
src/space_packet.rs): вторичный заголовок с кодами времени CUC/CDS, контроль ошибок пакета, сегментация и проверки потока, в сравнении с ccsdspy 2.0.1, spacepackets-rs 0.18.0, spacepackets-py 0.32.0 иcrc_hqxиз CPython, ноль расхождений. Строка «CCSDS Space Packet secondary header, packet error control and segmentation». - Схема телеметрии 1,3 через реальных потребителей: экспозиция Prometheus и OTLP/HTTP JSON синтетического потока схемы 1.3, включая ряд геометрии и метку
class, точно читаются prometheus_client и протоколом OTLP, принимаются promtool 3.5.0check metricsбез замечаний линтера и без изменений проходят через OpenTelemetry Collector contrib 0.135.0 (зависит от данных: инструменты загружаются с закреплёнными SHA-256, выходы закоммичены).
- Сообщения CCSDS с данными об орбите (
Определение орбиты Марса, прогон 2 (0,36, WP-14, CAP-30):
mars_od::fit_dampedмасштабирует нормальную матрицу по её диагонали и демпфирует шаг (Левенберг–Марквардт), после того как зарегистрированная подгонка Гаусса–Ньютона не справилась с матрицей, чья исходная диагональ охватывает восемь порядков величины. Зарегистрировано отдельно (xval/mro-od/PREREGISTRATION-RUN2.md, та же дуга, пороги и редактирование). На оцениваемых пролётах MRO орбита находится в пределах 0,36 км RMS (0,53 км максимум) от навигационной реконструкции MRO, пороги выполнены. Доплер после подгонки составляет 48,6 мГц при пороге 30 мГц, не выполнен (вывод закреплён). Поправка только к оценке, R2-A1, раскрыта вdocs/revisions. Строка остаётся MODELLED.Модель 2-way доплеровского сдвига Марса с нарастающей частотой и определение орбиты (0,36, WP-14, часть CAP-30, этап 2):
mars_odпрогнозирует 2-way доплеровский сдвиг DSN в X-диапазоне с нарастающей частотой по таблицам нарастания ODF (время распространения света, Шапиро, тропосфера, время станции, станции DSN через цепочку CIO и IERS EOP) и подбирает орбитальный аппарат Марса (GMM-3, третьи тела, давление солнечного излучения, торможение).naif_kernelчитает SPK типа 1 (проверено по CSPICE), аgravity_sh::from_shadrчитает поля PDS SHADR. Предварительно зарегистрировано относительно навигационной реконструкции MRO на реальных пролётах MRO (по доступности данных,scripts/fetch_mro_od.sh, ежемесячный CI): прогнозируемый доплеровский сдвиг совпадает с наблюдениями до 12,5 мГц (порог 30 мГц, выполнен); зарегистрированный подбор орбиты не удался на оцениваемой дуге и орбиту не дал (результат закреплён). Строка остаётся MODELLED.Читатель файлов данных об орбите DSN (0,36, WP-14, часть CAP-30):
odf::parse_odfчитает ODF TRK-2-18. На реальном ODF Mars Reconnaissance Orbiter (NASA PDS, входит в поставку) читатель совпадает с числом записей, положениями групп, станциями и временами метки PDS, и все его типы данных известны. Таблица конца файла в метке на одну строку короче файла, это несоответствие метки записано как вывод. MODELLED. Определение орбиты по этим данным ещё не выполнено.Бюджет TWSTFT и стабильность передачи времени: вид
time-transfer-budget(0,36, WP-14, FUT-19).- Двустороннее уравнение:
twstft_budgetрешает его для T_A − T_B с задержками оборудования станций, асимметрией ионосферы Ku-диапазона на линиях вверх и вниз, разностью задержек транспондера и членами Саньяка и восстанавливает прямую модель до 1e-15 с. - Бюджет неопределённости: складывается квадратично, с TDEV линии в качестве члена типа A.
- Шум линии: двусторонний ряд получает пол фликкерного фазового шума, суточную невзаимность и постоянный остаток взаимности. Пакет
timetransferс белым джиттером не изменён. - Реальные ряды: стабильность предоставленных рядов BIPM Circular T, CSV
MJD,nsили часов станций IGS.
MODELLED. Новый встроенный сценарий
time-transfer-budget. Решение времени по PPP отдельно VALIDATED относительно часов станции IGS на ветви реальных данных GNSS.- Двустороннее уравнение:
Нагрев при входе, радиометрия ДЗЗ и потери на выведении (0,36, WP-14, CAP-28): три новых вида.
entry-heating: вход материальной точки с 3 степенями свободы над вращающейся Землёй или Марсом с нагревом в критической точке по Саттону–Грейвсу.eo-radiometry: ОСШ формирователя изображения, MTF на частоте Найквиста, относительный отклик на границе и NIIRS по GIQE 4.ascent-losses: многоступенчатое выведение с гравитационным разворотом, с потерями на гравитацию, сопротивление, управление и противодавление, проверенное точным тождеством «идеальная dv минус потери».
Пиковое замедление при входе было проверено по опубликованному номиналу Stardust по предварительно зарегистрированному порогу: 35,44 g против 33,4 g (+6,1 %, порог 10 %). Эта строка VALIDATED. Нагрев, радиометрия и выведение — MODELLED. Также новое:
reentry::us76_pressure, встроенные сценарииentry-heating-stardust,eo-radiometryиascent-lossesиdocs/ENTRY-EO-ASCENT.md.Управление ориентацией на силовых маховиках: вид
aocs(0,36, WP-14, CAP-21). Инерциальный разворот жёсткого корпуса с тремя или более сбалансированными силовыми маховиками при обратной связи по MRP, с моментами маховиков минимальной нормы, ограниченными пределом каждого двигателя (aocs). Он также может замкнуть контур на мультипликативном EKF по имитированному гироскопу и звёздному датчику (aocs_mekf). Контур истинного состояния сравнивался с Basilisk 2.9.1 на трёх случаях, предварительно зарегистрированных до появления кода (три ортогональных маховика, пирамида из четырёх маховиков, случай насыщения). Каждая компонента MRP, угловая скорость корпуса, скорость маховика и момент двигателя совпали в каждом отсчёте, наихудшее 2.4e-14 по сигме и 2.9e-11 рад/с по скорости маховика. Эта строка VALIDATED; MEKF — MODELLED (согласованность NEES). Новые встроенные сценарииaocs-slewиaocs-slew-mekfиdocs/AOCS.md.Планирование наземных сеансов связи и ACM DVB-S2 (0,36, WP-14, CAP-22/23): два новых вида сценариев.
acm-linkдля одного спутника над одной станцией выдаёт Es/N0 каждого пролёта и выбранный вдоль него MODCOD DVB-S2 (пороги ETSI EN 302 307-1, таблица 13, плюс запас). Он также выдаёт объём данных, который ACM передаёт сверх базового варианта с постоянным кодированием.contact-scheduleделает то же для нескольких спутников над несколькими станциями и строит бесконфликтный план сеансов (развороты антенн, одна станция на спутник, доставка с учётом приоритетов, ограниченная накопленным объёмом каждого). Он сообщает жадный план по предельной ценности, базовый план по принципу «первым пришёл» и точный оптимум на малых наборах, а также разрыв жадного плана до оптимума. Окна доступа получаются от VALIDATED предсказателя видимых пролётов. Новые входящие в поставку сценарииacm-linkиcontact-schedule(ИЛЛЮСТРАТИВНЫЕ входные данные) иdocs/CONTACT-SCHEDULING.md. MODELLED (две новые строки реестра).Доплеровское позиционирование по Starlink в сравнении с опубликованным экспериментом (0,36, WP-14, часть CAP-11, MODELLED). Это предварительно зарегистрированное заместительное сравнение доплеровского режима
leo-pvtс предустановкойstarlink-sopи процентилями набора данных 3 из «Unveiling Starlink for PNT» (NAVIGATION 72(1), 2025, doi:10.33012/navi.685). Модель использовала 3 спутника (маска 47 град., выбранная по фиксированному правилу), без помощи по высоте и с доплеровским сигма 30 Гц, при 200 начальных значений. Её 90-й процентиль 3D-ошибки равен 92,2 м при 20 с и 870 м при 8 с против опубликованных 2 м и 10 м, поэтому оба порога в два раза NOT MET. Модель пессимистична, а не оптимистична, как предсказывалось: три неподвижных спутника дают гораздо меньшее геометрическое разнообразие, чем 63 спутника эксперимента за 10 минут с переключением канала каждые 15 с. Оба промаха подтверждены тестом (tests/starlink_doppler_published_proxy.rs).Оптимизатор импульсных перелётов на DE440 (0,36, WP-14, CAP-20c/d):
maneuver::optimise_transfer_kernelнаходит даты отправления и прибытия однооборотного баллистического двухимпульсного перелёта, которые минимизируют C3 отправления или V-бесконечность прибытия в рамках типа I или типа II. Он ищет по сетке с шагом 2 суток, затем уточняет методом Нелдера–Мида 2-D по гелиоцентрическим состояниям из ядра DE440; он опирается наporkchop_kernel. Сравнение было предварительно зарегистрировано (bf0439e8) относительно независимого оптимизатора на SPICE + pykep 3.0.1 + SciPy 1.18.1 на возможности перелёта Земля — Марс 2026 года: все четыре оптимизации согласуются до 8.7e-13 относительно, с датами в пределах 1e-5 суток (VALIDATED, новая строка реестра). В качестве второго опубликованного эталона NASA/TM-2010-216764 (справочник по перелётам Земля — Марс на 2026–2045 годы) совпадает по минимальному C3 типа II (9,182 против 9,144) и по минимальной V-бесконечности прибытия типа II (2,564 против 2,565). Минимальное C3 типа I не совпадает: 10,535 против 11,11 (-5.18 %), при этом оракул из библиотеки согласуется с Kshana. Этот промах записан и подтверждён тестом.Исследование лунной опорной станции (0,36, вызвано опубликованными материалами о планируемой лунной опорной станции на южном полюсе; источники в
docs/LUNAR-REFERENCE-STATION.md): видlunar-station-coverage, перебор методом Монте-Карло модели лунного дифференциального PNT по южно-полярной сетке пользователей и суткам эпох, дающий для каждой точки и по региону процентили исправленной и неисправленной ошибки, доступность с причинами, покрытие относительно заданного порога, уровни защиты, радиус покрытия по азимутам и бюджет линии передачи поправок. В одной точке, одной эпохе и одном испытании он сводится ровно кlunar-differential-pnt; его арифметика пересчитана на numpy при предварительно зарегистрированном пороге (положения и процентили выполнены; поправки станции не уложились в свой порог из-за округления двойной точности, это записано). MODELLED; строка реестра «Покрытие и карта точности лунной опорной станции». Не связано с каким-либо ведомством и не одобрено им; никаких утверждений о характеристиках какой-либо реальной системы не делается.Предварительно зарегистрированный прогноз: покрытие лунной опорной станции (не валидация; MODELLED).
docs/predictions/lunar-reference-station.mdфиксирует в коммите c05dac1d результатыlunar-station-coverageпри публично заявленных допущениях, с хешами SHA-256 входных данных и результатов и протоколом оценки, зафиксированным сейчас (коэффициент 2 для точностей и уровней защиты, 10 процентных пунктов для доступности и покрытия; изменённое допущение получает новый датированный прогноз, но не правку; промах публикуется так же заметно, как попадание). Каждая величина определяется неопубликованным набором элементов орбитальной группировки из четырёх спутников, который ILLUSTRATIVE, и об этом сказано.tests/prediction_frozen.rsохраняет его;docs/VALIDATION.mdполучает раздел «Предварительно зарегистрированные прогнозы». Строки реестра нет.Расширения лунной опорной станции (0,36; ограничения 2 и 3 исследования станции и стиль решения источников), каждое включается по выбору в
lunar-station-coverageи по умолчанию отсутствует, поэтому каждый существующий документ, включая замороженный прогноз, не меняется:[receiver](многолучевостьa + b exp(-el / el0)у пользователя и у станции, при необходимости марковская по Гауссу по эпохам для станции, шум DLL по C/N0, межканальные смещения; значения ILLUSTRATIVE для Луны);orbit_err_growth_m_per_s(линейный рост ошибки орбиты в вещании за время задержки поправки, ILLUSTRATIVE);[solution](ограничение по высоте, минимум три спутника при нём, окно неподвижного пользователя по эпохам). Два дополнения к сравнению с опубликованными утверждениями, каждое предварительно зарегистрировано отдельно до своего прогона, лежат рядом с неизменённым записанным прогоном: K5 с ростом не выполняется при любой скорости; при стиле решения источников K1–K5 не выполняются, а K6 выполняется (1 из 6), при этом исправленная 3D-ошибка p95 для R300 падает с 280,6 м до 2,11 м. MODELLED; три строки реестра.Маски горизонта по лунному рельефу (0,36; первое ограничение исследования лунной опорной станции): необязательная секция
[terrain]вlunar-station-coverage(станция и каждая точка пользователя) иmoonlight-service-volume(каждая точка сетки) задаёт каждому пункту зависящий от азимута горизонт в формате таблицы линии горизонта 0,36 по заданному профилю с указанием источника (station_horizon,user_horizon) и/или трассировкой луча по полярной цифровой модели рельефа (dem_path) вдоль больших кругов лунной сферы с точным учётом кривизны. Включает фрагмент размером 0,98 МБ общедоступной южно-полярной цифровой модели LRO LOLALDEM_75S_240M, переданный методом усреднения блоков 5 x 5 до 1200 м (data/lunar-dem/, с её NOTICE, SHA-256 иscripts/make_lola_south_polar_crop.py), а также сценарийscenarios/lunar-station-coverage-terrain.toml, существующий только в репозитории. Проверено по горизонтам в замкнутой форме (голая сфера, кратер на плато, растровый конус); MODELLED, строка реестра «Маски горизонта по лунному рельефу по заданному профилю или полярной цифровой модели». Без этой секции каждый документ, включая блок единиц, побайтно идентичен.Доверие с учётом геометрии (проектная записка по геометрии 0,36, раздел 4). Каждая эпоха
receiver-trust, статическая или судовая, пакетная или в реальном времени, несёт свою спутниковую геометрию:good,degraded(причиныfew-satellites,high-pdop,high-hdopи информационнаяsky-blocked) илиunknown, если журнал не даёт спутниковой геометрии, с HDOP, PDOP, VDOP и числом используемых спутников. Она получается из углов места и азимутов, которые сообщает приёмник (NMEA GSV, UBX NAV-SAT), через существующее ядроorbit::dopили берётся из NMEA GSA. Каждая эпоха также несёт меткуgood,fairилиpoor, которая всегда сообщается и никогда не оценивается, и примечание словами с HDOP, PDOP, VDOP, числом спутников и потерей сигнала. Оценка судна получает мониторgeometry, который ничего не вычитает, пока геометрия не станет плохой (HDOP выше 4, PDOP выше 6 или используется менее 5 спутников), после чего вычет нарастает до предела 15 баллов; одна геометрия достигает самое большее диапазона degraded, но никогда диапазона ненадёжности (тревоги нет). Каждый вычет получает классgeometry,environmentилиinconsistency, чтобы плохое небо не читалось как атака.loss-of-lockполучает классgeometry, если все потерянные спутники при последнем сообщении были ниже 15 градусов; вычет за плохую геометрию получает классinconsistency, если HDOP, заявленный приёмником, расходится с его заявленным небом более чем на max(1,0, 25 % от полученного HDOP), так что поддельное плохое небо не может купить эту метку. Новая таблица[geometry]задаёт каждый порог с его происхождением (HDOP 4, PDOP 6, не менее 5 используемых, sigma_UERE 1,5 м, допуск по HDOP max(1,0, 25 % от полученного HDOP), где 25 % — репрезентативный выбор для приёмников с часами для каждой группировки или с решениями по подмножествам, 15 градусов; величины IEC 61108-1 и GPS SPS приведены как процитированные и подлежат сверке с текстом стандартов). Полная потеря сигнала не помечается как небо: когда спутники в зоне видимости не сопровождаются, а DOP спутников в зоне видимости хороший (и несопровождаемые не ограничены одной половиной горизонта), эпоха несётsignal_loss, а вычет за геометрию имеет классenvironment. Заявленный HDOP или PDOP 99 или более, качество GGA 0 и режим GSA 1 читаются как отсутствие решения, а не как DOP. Предел (cap_points15), конец нарастания (full_ratio1,5) и нижняя граница (floor, по умолчаниюdegraded_minоценки) находятся в[geometry], как и хорошие уровни метки (HDOP 2, PDOP 3, 6 спутников, репрезентативные); действующий предел равенmin(cap_points, 100 - floor), поэтому таблица[score], повышающаяdegraded_min(в том числе 0,35), понижает предел, а не отвергается, а нижняя граница нижеdegraded_minотвергается. MODELLED; программное обеспечение консультативного характера, не навигационное оборудование с утверждённым типом (IEC 61108, IEC 61162): ответственность за судовождение остаётся на операторе.Геометрия доходит до каждой поверхности: JSON результата (
epochs[].geometry,classна каждом вычете,geometry_model,geometry_summary), строки JSON в реальном времени (схема 1,3), привязки Python и WebAssemblyreceiver_trust,assess_vessel_logиreceiver_trust_replay, инструменты MCPassess_*, пакеты доказательств (epochs.json,config.json, дорожка геометрии на сводной странице) иtrust-telemetry(Prometheuskshana_trust_geometry*и меткаclassнаkshana_trust_reason_active, OTLPkshana.geometry.*, пользовательские поля CEFcs6(состояние геометрии и классы),cfp3(HDOP) иcfp4(PDOP), проверенные обоими оракулами-разборщиками CEF, и LEEFgeoStatus,geoHdop,geoClass). Метка геометрии тоже экспортируется, добавляется после каждой более ранней серии и поля и только для входных данных, которые её несут: Prometheuskshana_trust_geometry_label{label}иkshana_trust_geometry_vdop, OTLPkshana.geometry.labelиkshana.geometry.vdop, LEEFgeoLabel,geoPdop,geoVdop,geoUsed, а в CEF третье полеcs6(метка) иcn1(используемые спутники); VDOP в CEF нет (пользовательские поля с плавающей точкой заняты). Оба оракула-разборщика CEF читают случаи меток обратно так, как они записаны (поправка 5: 176 строк, 172 разобрано pycef, 176 — Logstash). HDOP, заявленный так, что заявленное небо его не объясняет, помечается в каждой эпохе и подсчитывается (geometry_summary.hdop_mismatch, строка на сводной странице пакета доказательств) и оценивается только тогда, когда геометрия плохая. Потеря сигнала экспортируется отдельно, поскольку состояние геометрии остаётсяdegraded, пока она длится: Prometheuskshana_trust_geometry_signal_loss, OTLPkshana.geometry.signal_loss, LEEFgeoSignalLoss=1; в CEF она отображается как классenvironmentвcs6.orbit::dop_cofactor: ковариационный множитель(HᵀH)⁻¹, стоящий заorbit::dop, выделенный из него с той же арифметикой.Строка реестра «Ошибка положения от геометрии: среднеквадратичная ошибка = sigma_UERE x DOP» (MODELLED, внутренняя согласованность): метод Монте-Карло с начальным значением для решения методом наименьших квадратов движка на 8 геометриях DOP, согласованных с gnss_lib_py, в сравнении с ковариационным множителем валидированного ядра DOP, с допусками, предварительно зарегистрированными до первого прогона, и двумя отрицательными контролями, которые не проходят, как и требуется; рядом более ранняя проверка на четырёх выбранных вручную небесах с доверительными интервалами хи-квадрат, сообщённая как выполненная до предварительной регистрации.
Азимутально-зависимые маски линии горизонта (
src/skyline.rs,docs/SKYLINE.md, пункт 1 проектной записки): отсечка по углу места, зависящая от азимута, поточечный максимум таблиц (каждая интерполируется отдельно, замыкание на 360°), уличный каньон в замкнутой форме (с необязательными открытыми концами), сектора с резкими краями и профиль рельефа с учётом кривизны Земли; эффективная отсечка равнаmax(mask_deg, skyline). Четыре REPRESENTATIVE предустановки с указанным происхождением (city-street,harbour-approach,fjord,container-terminal), переопределяемые по полям. Необязательная секция[skyline]в учебных файлахgnss-sim,jamming,leo-pvt(каждый режим, включая полярный перебор),leo-passиnmea-scenario, а также вorbitиintegrityчерез нового наземного пользователяuser_site = { lat_deg, lon_deg, height_m }(геодезические углы наблюдения на вращающейся Земле, с геодезической вертикалью для горизонтального и вертикального разделения ARAIM; каждая выборка — один абсолютный момент,epoch + t, к которому приводятся наборы элементов, вещаемые эфемериды и файлы SP3 от собственных эпох, датируемые от самой новой эпохи спутника, еслиepochне задана; орбитальныйuserлинию горизонта отвергает). Результаты получаютskyline { source, open_fraction, provenance }и для каждой выборкиmasked_by_skyline. Без этой секции каждый сценарий побайтно идентичен 0.35.0, что проверено по дайджестам коммита выпуска. Шесть входящих в поставку примеров:orbit-urban-canyon-skyline,integrity-harbour-approach,gnss-sim-container-terminal-skyline,jamming-harbour-approach-skyline,leo-pvt-fjord-skylineи кампанияleo-vertical-autonomous-vehicle-skyline(каньон для автономного транспортного средства как плоская отсечка и как улица; существующая кампания не изменена). MODELLED.Функции геометрии неба (
src/geometry.rs, пункт 2 проектной записки):sky_geometry(видимые и замаскированные спутники по пункту, времени и предустановкам группировок, двухстрочным наборам элементов (tle, не более 4 МиБ, распространяемым SGP4 движка до UTCepoch) или заданным спутникам;sky_sourceиsky_statementсообщают, является ли небо репрезентативным или небом, которое наборы элементов дают в эту эпоху, а не измерением;tle_skippedперечисляет каждую неиспользованную строку с причиной; ограничения на входе: 2000 спутников над горизонтом, проверяется до построения системной таблицы, и 16 часов приёмника; пять DOP; кофактор и ковариация в ENU с одними часами на систему или одними общими; горизонтальный эллипс ошибок при одной сигме и при заданной доверительной вероятности),sky_monte_carlo(ошибки метода наименьших квадратов с начальным значением, не более 5000),skyline_presets,skyline_profileиskyplot_svg.orbit::dop_covвыдаёт ковариацию, стоящую заorbit::dop, который теперь является её свёрткой (валидированные скаляры не изменились). Поверхности:kshana skyиkshana skyline, функции Python и WASM с теми же именами и инструмент MCPsky_geometry(40 инструментов), а также блокнотnotebooks/geometry.ipynb(с его копией.md; запускаетсяtests/python/test_notebooks.py). Каждый результат несёт метку MODELLED, заявление о модели ошибок и консультативное предупреждение.Реестр: пять строк по линии горизонта и геометрии неба. VALIDATED, каждая в сравнении, предварительно зарегистрированном до запуска её оракула: Азимутально-зависимая маска линии горизонта: видимое множество, азимут и угол места, а также DOP под маской относительно Orekit 12,2 (
TopocentricFrame,ElevationMask) и gnss_lib_py 1.0.4 (get_dop), наибольшие расхождения углов наблюдения и маски 1.1e-12° при пороге 1e-9°, видимые множества идентичны, DOP 3.3e-13 относительно (xval/orekit-skyline/); Горизонтальный эллипс ошибок и кофактор по системам из ковариации геометрии относительно numpylinalg.invиlinalg.eigh(стандартная P2), 270 случаев, оси 5.1e-13 относительно (xval/numpy-ellipse/). MODELLED: редукции каньона, сектора и рельефа; предустановки; композиция геометрии неба (предустановленное небо, облако Монте-Карло).С учётом строк по доверию к геометрии, линии горизонта и лунной опорной станции в реестре 274 строк: 134 Validated, 136 Modelled, 4 Partner.
Лунная опорная станция: лаборатория времени станции (MODELLED). Необязательный блок
[time_lab]вlunar-time-budget(src/lunar_time_lab.rs). Он моделирует часы станции (по умолчанию класса miniRAFS, любой именованный класс или карточка устройства, подогнанная по заданным точкам стабильности), подстраиваемые к LTC, а затем свободно идущие или подстраиваемые заново каждые N секунд. Он выдаёт кривую ошибки времени x(t), время до 1, 10 и 100 нс (бисекция рядом с замкнутой формой) и доминирующий член для каждого горизонта, всё с единицами. Остаток подстройки ILLUSTRATIVE. Скорость LTC не выводится заново и сохраняет собственную строку VALIDATED. Наносекундная цель из общедоступных материалов ICG WG-B по лунному PNT (июнь 2024) приводится как утверждение источника, а не как заявление. Упорядочение часов оптические < PHM < RAFS < miniRAFS выполняется от 1 с до 7e5 с, а тест закрепляет пересечение кривых PHM и RAFS около 7.5e5 с. Это пересечение — свойство моделей часов с одним типом шума (чистый фликкер-ЧМ против чистого белого ЧМ), а не физический результат. Без этого блока отчёт, его таблица и его сводка не изменяются. Пример:scenarios/lunar-station-time-lab.toml. Добавляет одну строку реестра с меткой MODELLED.Лунная опорная станция: геодезия станции (MODELLED). Необязательные входные данные
extra_reflectorsиextra_beaconsвlunar-llr-datumдобавляют блокstation_geodesy. Информация о системе отсчёта из пяти массивов из архивного среза лазерной локации объединяется с тем, что дали бы добавленный ретрорефлектор и добавленный маяк VLBI в заданных пунктах. Рефлектор опрашивается в архивные эпохи, когда он виден, с их архивными весами. Маяк использует сеть и расписаниеlunar-frame-campaign, со станциями, зафиксированными на месте. Блок выдаёт 1-сигму каждого параметра Гельмерта до и после и их отношение. Это границы Крамера–Рао для сокращённого набора параметров на ILLUSTRATIVE расписании и пункте. Отсутствующие или пустые входные данные оставляют отчёт побайтно идентичным. Примеры:scenarios/lunar-station-geodesy-baseline.tomlи-with-station.toml. Добавляет одну строку реестра с меткой MODELLED.Лунная опорная станция: сравнение с опубликованными утверждениями (MODELLED). Каждое числовое утверждение в пяти общедоступных источниках перечислено с точной формулировкой, страницей и заявленными допущениями и отнесено к сопоставимым, частично сопоставимым или несопоставимым (
tests/fixtures/lunar_station_published/CLAIMS.md; источники с URL, датой получения, SHA-256 и лицензией вtests/fixtures/lunar_station/SOURCES.md). Частично сопоставимые утверждения оценивались по шести односторонним порогам, предварительно зарегистрированным до прогона (PREREGISTRATION.md, редакция 2, 05bf9a19): 1 из 6 утверждений в пределах предварительно зарегистрированного порога (предварительно зарегистрировано 05bf9a19). Покрытие равно 0,00 при требуемом >= 0,95 на обеих южно-полярных окружностях, а исправленный p95 равен 280,6 м при требуемом <= 1,5 м. Причина — элементы орбит спутников, которые не публикует ни один источник: на ILLUSTRATIVE элементах из репозитория четыре спутника находятся в общей видимости в 8 % эпох при почти вырожденной геометрии. Прогон не воспроизводит утверждения на этих элементах и не является доказательством того, что утверждения неверны. Закреплено вtests/lunar_station_published_oracle.rs. Одна строка реестра с меткой MODELLED и с результатом.Лунная опорная станция: готовность данных файла часов.
realdata::clk::rinex_clock_seriesтеперь указывает систему времени своих эпох. Это значениеTIME SYSTEM IDили, если оно не объявлено, значение по умолчанию для спутниковой системы в заголовке. Результат также сообщает, была ли система объявлена. Функция отвергает неизвестную систему времени (например, лунную шкалу времени), необъявленный файл со смешанными системами и файлы, которые расходятся между собой, а не читает их как время GPS. Она поставляется с синтетическим тестовым файлом часов станции. Формат файла поправок не определён, потому что общедоступного не существует.
Изменено#
Документация модулей
fusion::ukf,fusion::tightly_coupledиfusion::gnss_ins_ekfбольше не называет 17-состоянный навигатор UKF, тесную связь с полной INS и явное состояние часов будущей работой; она ссылается наhybrid_ukf,tightly_coupled17иcarrier_tc.RINEX 4 больше не отвергается (0,36, WP-07): навигационный файл RINEX 4 раньше намеренно отвергался; теперь он читается (см. «Добавлено»). Для файлов наблюдений версии 4 и выше метки заголовка сопоставляются только в столбцах 61–80, чтобы новые записи со свободным текстом не могли сойти за метки.
ionex::parse_ionexчитает реальные файлы IONEX (0,36, WP-07): полная запись из 16 значений заполняет столбцы 61–80, которые читатель принимал за метку, поэтому на каждом реальном файле IONEX он возвращалNone. Теперь запись, поле метки которой числовое, он читает как значения. Ни один поставляемый результат её не использовал.Принимаемые мощности Galileo E1 и E5a по OS SIS ICD, выпуск 2,1 (редакция, 2026-10-14). Полосы спектра
galileo-e1иgalileo-e5aи подверженные помехам сигналы GNSS для LEO, которые берут из них мощность, теперь используют минимальные принимаемые мощности из таблицы 12 Galileo OS SIS ICD, выпуск 2,1: −157,25 дБВт (было −157,0) и −155,25 дБВт (было −155,0).- Меняются девять результатов сценариев: примеры спектра, кампания по спектру, три вертикали устойчивости LEO и три конструкции сигналов LEO. Эффективное C/N0 смещается на −0,25 дБ, а J/S на +0,25 дБ в этих полосах.
- Каждое изменившееся значение (1766, старое → новое) перечислено в
docs/revisions/CAP12-galileo-icd21-power-changes.mdи его CSV вместе с таблицами документации, которые изменились. Ни одна строка реестра не меняет статус. - Вторая часть, в тот же день: подверженные помехам сигналы LEO
galileo-e5b(−155,0 → −155,25 дБВт, таблица 12 E5b) иgalileo-e5-altboc(−152,0 → −152,24 дБВт). В ICD нет строки для полного диапазона E5, поэтому значение AltBOC — это сумма мощностей итогов E5a и E5b из таблицы 12, построенная так же, как старое значение. Меняются три результата конструкции сигналов LEO (64 значения: эти принимаемые мощности и ухудшение C/N0 от LEO к GNSS для двух подверженных помехам сигналов), перечисленные в той же редакции (§5) и в CSV. Больше ничего не меняется.
Исправление атмосферного прилива S2 (
tides::atmospheric_tide). Гармоники давления воздуха S2 у Рэя (2001) — это коэффициенты ненормированныхP_nmс косинусными фазовыми запаздываниями; их использовали как полностью нормированные, а запаздывание — как синусное опережение по IERS. Теперь они входят, будучи делёнными наN_nm, сε = 90° − ψ; новыйtides::s2_air_wavesвоспроизводит модель A2 из таблицы 5 GFZ STR06/01 для всех 21 волн (наихудшее 0,0005 см, 0,05°; VALIDATED). Меняются только выходные данные с включёнными приливами: подбор Galileo CI 0,132 → 0,133 м, компоненты Swarm-A на 1–2 мм (предварительно зарегистрировано вxval/s2-air-tide-fix/).Только документация:
propagator::solve_kepler_checked,orbit::solve_keplerиephem::solve_keplerописаны как унаследованные решатели, численно не изменённые, со ссылкой наkepler::solve_kepler_markley.Состояние раунда D9 3 (
utck_bound). BIPM Circular T 465 вышел 2026-10-12. Предварительно зарегистрированная проспективная оценка всё ещё не выполнена: в выпуске 465 около 285 тестовых значений, а правилу остановки нужно 1000, то есть примерно выпуски 465–468. Для прогона также нужны архивные файлы по лабораториям от 2026-09-30, поскольку BIPM с тех пор переписал 87 из 113. Строка реестра и заголовок теста сообщают об этом; тест, его пороги и его разбиение не изменились.Проход по достоверности документации (0,36). Дорожная карта, строки возможностей, строки статуса проектных документов и комментарии модулей приведены в соответствие с кодом; выходные данные не меняются. Пункты, уже построенные, но всё ещё значившиеся открытыми, теперь отмечены как выполненные: проверки по маскам ITU-T, сценарий holdover длительностью 24 ч и приём журнала часов (синхронизация времени для телекоммуникаций), краткие руководства на первую минуту, эффект Лензе–Тирринга и перекрёстная проверка распространителя Orekit, точная цепочка GCRS по ITRF, эталонные и межплатформенные хеши, происхождение данных, ARAIM с множественными отказами (ADD v4.2), FDE по одному спутнику, библиотека CRPA, предел неоднозначности интерференционной картины CAI, оценка размеров по принципу «улиц покрытия» и 3-D представление орбиты, динамика ориентации твёрдого тела, средство записи OMM и читатель ядер NAIF, лунная либрация DE440, предложение о смысле прогона на игровой площадке,
PositioningFom, навигатор с тесной связью на 17 состояний и вид карты гравитации. Строки также точно указывают, что всё ещё открыто (например, двухчастный JD вorbit::Propagator, читательsrc/ionex.rsна реальном продукте и исключение нескольких спутников вraim). Отсутствовавшийdocs/design/evidence/cn0-m2m4/RESULTS.mdнаписан по свежему прогону его тестов (M1–M4 проходят), а черновик валидации IQ для партнёров получил актуальные счётчики реестра.Коды памяти Galileo E1 больше не входят в поставку.
data/galileo-os-sis-icd/C7_E1B.txtиC8_E1C.txt(приложение C.7/C.8 к ICD) удалены из репозитория и пакетов. Условия ICD (процитированные вLICENSING.md) позволяют пользователю хранить коды с указанием источника и использовать их в продукте, но разрешают распространение только в некоммерческих целях, а Kshana предлагается также по коммерческой лицензии.galileo::e1b_table/e1c_tableтеперь возвращаютResultи читают собственную копию пользователя изKSHANA_GALILEO_E1B/KSHANA_GALILEO_E1Cили, в клоне исходного кода, изdata/galileo-os-sis-icd/, куда новый скриптscripts/fetch_galileo_e1_codes.shизвлекает их из PDF-файла ICD (с проверкой хеша).galileo::E1B_TABLE_TEXT/E1C_TABLE_TEXTудалены. Без таблиц сигналы Galileo E1 (galileo-e1b,galileo-e1c) возвращают ошибку с указанием, как их предоставить, а тесты E1 пропускаются с сообщением. При наличии таблиц все выходные данные E1 остаются прежними. Ни один сценарий, эталонный файл (golden) или выходной спектр не использует таблицы кодов. Тестовые наборы E5a для приложения C.3/C.4 (оракул LFSR вtests/iq_signals.rs) обрабатываются так же: загружаются тем же скриптом, исключены из git, а тест пропускается без них.Переносимая математика везде (0,36, STUDIO-15): все трансцендентные функции
f64в библиотеке, а также нормальный, гамма- и экспоненциальный генераторы выборокrand_distrтеперь вычисляются через библиотекуlibmна чистом Rust (portable_math::PortableFloat,portable_distr), поэтому нативная сборка и сборка WebAssembly возвращают побайтно идентичный JSON результата для всех 141 встроенных сценариев и для короткого прогона IQ. Цена этого: последние разряды результатов, вычисленных математической библиотекой хоста, сдвинулись: изменились 98 из 141 встроенных сценариев, 43 не изменились; в 5 из них наибольшее поле изменилось более чем на 1e-3, в остальных — меньше. Каждое сдвинувшееся значение приведено в виде «старое -> новое» вdocs/revisions/STUDIO15-portable-math-rebaseline.md(вместе с CSV всех 136 127 сдвинувшихся чисел); ни один порог, допуск или предельное значение не изменился. Опубликованные числа, которые изменились: доступностьeuropa-surface-pntпри дальности до Земли 0,719 -> 0,713 и среднеквадратичная ошибка 86,147 -> 86,499 м (одна эпоха на границе доступности теперь везде разрешается одинаково; на macOS arm64 печаталось 0,725 / 85,800 м); ошибка станцииlunar-joint-od-clock3,541350 -> 3,536885 м с VLBI и 2183,558 -> 2184,021 м без него;paper/crossover/inertial.json, восемь значенийvibration_psdна 3 единицы в последнем разряде (исправление ошибки в техническом отчёте); выпущенный документcislunar-observabilityв величинах на уровне шума округления (восемь значений за пределами шести значащих цифр, до 6.8e-5 относительно; ни один ранг и ни один порог не сдвинулись). Закреплённые хеши защитных проверок побайтной идентичности (skyline_scenarios,geometry_corpus_identity,geometry_trust_no_change) перенесены на именованную базовую версию «0,36 portable», а значения 0.35.0 сохранены как историческая запись; замороженный прогноз для лунной опорной станции не тронут, а его повторный переносимый прогон хранится рядом с ним (docs/predictions/*.portable-0.36.json).tests/lunar_joint_od_numpy_oracle.rs(проверенная строка совместного определения орбиты по Луне): тестовые наборы экспортированы заново, а сравнение с numpy повторено с numpy 2.4.6, зарегистрированной версией; скрипт и порог не изменились; все шесть сетей проходят проверку (docs/revisions/STUDIO15-lunar-joint-od-oracle-rerecord.md). Работа пакетов 2–3, влитая после STUDIO-15, тоже использует переносимую математику (457 мест вызова в 62 файлах); что она сдвинула, описано вdocs/revisions/STUDIO15-batch4-rebaseline.md: 12 встроенных сценариев (наибольшее относительное изменение 5.2e-8, ни одна печатаемая величина не сдвигается), 28 строк защитной проверки горизонта заново утверждены, дайджест M2M4 дляiq_campaign, прежние хеши истины дляgnss-ins, сигма датума ненаблюдаемого маяка (632,3769 -> 632,3772 м) и два зафиксированных вывода (замыкания DRO в CR3BP; CRPA A3, 194 из 456 линий). Точный edf Гринхолла сохраняет свой подтверждённый порог, а в его ядре используется логарифм с двойной точностью double-double (docs/revisions/STUDIO15-greenhall-edf-portable.md), и оракул тестового стенда gps-sdr-sim был повторно запущен на сдвинувшихся экспортах NMEA, при этом все пороги выполняются (docs/revisions/STUDIO15-testbench-gpssdrsim-rerun.md).README: строка о лунном наборе указывает уровень доказательств каждой части (раньше говорилось, что все части MODELLED).
realdata::clk::rinex_clock_seriesвозвращаетRinexClockSeries(ряд, журнал приведения к сетке, система времени, было ли она объявлено, тип записи) вместо кортежа(PhaseSeries, GriddingLog). Теперь при отсутствии записей спутника (AS) происходит переход к записям приёмника/станции (AR) с запрошенным именем.Оценки не меняются, если геометрия не плохая; метка сообщается всегда. При хорошей или удовлетворительной геометрии (включая открытое небо только с GPS из 8 спутников) или неизвестной геометрии (монитор не запускается) каждая оценка такая же, как в 0,35:
tests/geometry_trust_no_change.rsфиксирует выходные данные обоих примеров сеансов, аtests/geometry_corpus_identity.rs— каждый закоммиченный корпус NMEA судов (в том числе как открытое небо только с GPS) и сценарии обучения экипажа на уровне байтов 0.35.0 после удаления добавленных ключей; в двух обучающих сценариях, где подавление (jamming) делает геометрию плохой, плохие эпохи отличаются только вычетом за геометрию. Журнал с плохой геометрией теряет до 15 баллов, которых не терял в 0,35. Прочие намеренные изменения — только добавления: ключи выше в JSON результата и пакетах доказательств (score_model.weightsне изменился); схема живых JSON-строк меняется с 1,2 на 1,3 (geometryдобавляется,class— в каждом вычете); сводка выдержки получаетgeometry; телеметрия получает ряды геометрии, поля и меткуclassтолько для входных данных, которые их содержат, поэтому поток или результат 0,35 отображается байт в байт как прежде.geometry— 17-е имя монитора; оно указывается последним вmonitors_run, когда принимало решение (судно, журнал которого даёт геометрию; список 0,35 сохраняет порядок, а число мониторов в сводке увеличивается на единицу), и не имеет записи[score.weights](попытка задать её отклоняется: вычет задаётся в[geometry]).tests/fixtures/dop/NOTICEуказывал лицензию gnss_lib_py как Apache-2.0; выпуск 1.0.4 распространяется под MIT.Читатель NMEA теперь читает GSA (короткая GSA игнорируется и не считается пропущенной) и сохраняет углы места и азимуты GSV, в том числе для спутников, перечисленных без сигнала; читатель UBX сохраняет угол места и азимут NAV-SAT. C/N0 читается точно так же, как раньше.
Изменение результата: широкополосные и качающиеся по частоте источники подавления теперь используют Q = 2. Уравнение противодействия подавлению использует для этих источников стандартную учебниковую поправку расширения спектра Q, тогда как раньше использовалось 1. Q = 2 — белый шум в главном лепестке при нормированной мощности сигнала в полосе; в тестах оно закреплено по замкнутой формуле из
navsignal.- Без изменений: источники подавления CW и узкополосные (Q = 1), нераспознанный тип источника подавления (Q = 1, наиболее вредное значение) и
q_override. - Эффект: там, где действует широкополосный или качающийся по частоте источник подавления, эффективное C/N0 повышается до 3,0103 дБ, выведенные пороги J/S повышаются на 3,0103 дБ, а радиусы блокирования в свободном пространстве уменьшаются в 0,7071 раза.
- Изменённые встроенные сценарии: изменились 12 из 144, все — как было предварительно зарегистрировано (
xval/jammer-q/PREREGISTRATION.md, результаты вxval/jammer-q/RESULTS.md):jamming-demo: C/N0 +3,01 дБ;jamming-harbour-approach-skyline:min_tracking6 → 7;lunar-jamming: потеряно спутников 26 → 0, медиана запаса до потери захвата 27,4 → 19,4 км;tracking-loop: радиус блокирования по динамике петли 75,2 → 53,2 км;- а также кампании и перекрёстные проверки спектра, которые их содержат.
- Затронутые потребители: виды
jamming,lunar-jamming,tracking-loopиimpairment-eval,jamming_kind_cross_checkвидов спектра, эталонная кривая MODELLED кампании IQ и значение Q по умолчанию в labfit, а также экспорт сцены для интеропа.
- Без изменений: источники подавления CW и узкополосные (Q = 1), нераспознанный тип источника подавления (Q = 1, наиболее вредное значение) и
Плагин JetBrains: ни одного устаревшего API платформы и ни одного API, запланированного к удалению. Пять диалогов выбора используют небольшой
DialogWrapperс выпадающим списком вместо устаревшегоMessages.showChooseDialog; средства выбора одного файла используют конструкторFileChooserDescriptorвместо устаревшегоFileChooserDescriptorFactory.createSingleFileDescriptor(); анимация открывается черезBrowserUtil.browse(Path)вместоbrowse(File), который платформа 2026,3 планирует удалить. Since-build остаётся 243. IntelliJ Plugin Verifier сообщает Compatible без использования устаревшего API и API, запланированного к удалению, для 2024,3 (IC-243.21565.193), 2025,2 (IC-252.23892.409), 2026.2.3 (IU-262.10968.63) и 2026,3 EAP (IU-263.6259.32);verifyPluginпо умолчанию проверяет 2024,3 и любой список, заданный вKSHANA_VERIFY_IDES.gnss_sim::run_gnss_simиjamming::run_jammingвозвращаютResult: недопустимый раздел[skyline]при прямом вызове является ошибкой, как это уже было черезapi::run_toml, а не молчаливым возвратом к плоской маске. Несовместимое изменение для вызывающих эти две функции из Rust.
Исправлено#
Оценщик кампании: настоящий ложный захват трекера никогда не засчитывался (
iq::campaign). Проверка ложного захвата в трекере переводит канал из LOCKED в LOST в момент срабатывания. Оценщик отмечал вместо этого следующее обновление канала, которое уже было незахваченным и потому никогда не засчитывалось. Событиеfalse-lock, сообщённое из LOCKED, теперь считается одним эпизодом в своё время — в прогоне и в каждом заявленном событии, которое его содержит. Событие, обнаруженное во время вхождения в захват или повторённое каналом, уже находящимся в LOST, новым эпизодом не является. Новый тест воспроизводит настоящий ложный захват: легитимная несущая GPS L1 C/A, сдвигающаяся на 1/(2T) в состоянии захвата (tests/iq_campaign_false_lock.rs).- В эталонной кампании
tests/iq_campaign.rsменяется только PRN 11 из ramp/agc-3bit (эпизоды ложного захвата 0 → 1, 426 и 437 на час в захвате). - Его DIGEST ячеек закреплены заново.
- Предварительно зарегистрированный закреплённый хеш оценённых результатов остаётся действующим и по-прежнему воспроизводится точно: в его хеше только эти шесть полей, изменённых этим исправлением, сделанным после регистрации, отображаются обратно на значения до исправления. Исправленные значения закреплены отдельно.
- Ни один порог не изменён, и ни одна строка, величина или число на сайте со статусом VALIDATED не сдвинулись.
- В эталонной кампании
lunar-frame-campaign: маяк без наблюдений теперь отражается в отчёте (найдено в MR-05). Отчёт получает
unobserved_beaconsиwarningтолько тогда, когда у какого-либо маяка нет наблюдений, и тогда сигмы наблюдаемых маяков вычисляются из их собственной информации, а не все равны null. Датум не изменён, и ни один выход по умолчанию, встроенный или опубликованный не сдвигается (docs/revisions/BEACON-unobserved-cell-changes.md).Лунная система главных осей (
lunar_frame::icrf_to_moon_pa, используется вlunar_odи в подгонке LRO): смещение DE421 от среднего направления на Землю к главным осям изmoon_080317.tfприменялось в неверном направлении и с неверным порядком углов Эйлера, поэтому аналитическая система PA отстояла от PA примерно на 208″ вместо совпадения. Теперь она перенесена так, как её определяет документ SPICE Frames Required Reading, и согласуется с SPICEpxform('MOON_ME','MOON_PA')до 2.6e-16 рад; аналитическая система PA отстоит от PA по DE440 на 6″–8″ (предварительно зарегистрировано e1ead19b, перерегистрировано be33382e после того, как первое предложенное изменение не достигло порога 1e-12;docs/design/evidence/fut05b-me-pa-offset-sign/). Опубликованные числа, которые сдвигаются: подгонка LRO (tests/agency_lro.rs) — raw overlap 53,8 → 39,9 м, dynamic 12,6 → 12,05 м, reduced-dynamic 6,65 → 6,67 м (пороги не изменены). Аналитический стек теперь совпадает с перекрёстной проверкой уровня DE по ANISE (12,0 / 6,67 м) на обоих уровнях; прежний разрыв на динамическом уровне был вызван этой ошибкой.Сервер MCP отклоняет
[terrain] dem_hgt(продолжение CAP-06b). Путь к тайлу рельефа для вида jamming теперь входит вinline_only::FILE_SOURCE_KEYS. Встроенная (inline) поверхность отклоняет сценарий, который его называет, с сообщением, не содержащим ни пути, ни ошибки операционной системы. Тест защиты от файловых источников теперь также отмечает поля, оканчивающиеся на_hgt.Jd2::from_partsс дробной частью суток отбрасывал дробь в преобразованиях UTC, TAI, UT1 и вращения Земли (один час в части суток поворачивал Землю неверно на 15°); теперь часть суток нормализуется до целого числа. Ни один вызывающий код движка не пострадал: все передают целое число суток, и каждый выпущенный результат идентичен побитно.
Запланировано#
- Геометрия по заданному горизонту (пункт 1 версии 0,36, теперь в движке как
src/skyline.rs):sky-blockedиopen_fractionпо горизонту там, где входные данные его дают (азимутальный разрыв — как запасной вариант), событие естественной деградации (фьорд или терминал) вnmea-scenario, а также две маскированные геометрии из конструкторской записки в строке sigma_UERE x DOP, предварительно зарегистрированные как дополнение. - Геометрия для журналов RINEX с навигацией (по собственному решению движка) и журналов Android (по строкам
Status); сейчас оба читаются какunknown. Геометрия в$PKSHT(версия 1 не изменилась в 0,36) и интеграции с Signal K и OpenCPN. - Ранее существовавший пробел, не появившийся в 0,36: когда поле SNR каждого спутника пусто, не срабатывает ни вычет
loss-of-lock, ни вычет по C/N0; полная потеря сигнала видна только черезsignal_lossмонитора геометрии (классenvironment). Вычет за это запланирован. - Поток схемы 1,3 во внешних телеметрических оракулах (парсер текстового формата Prometheus и коллектор OTLP), которые сегодня охватывают только потоки 1,2.
- Двусторонняя преграда (каньон или узкий фьорд) читается как потеря сигнала, а не как закрытое небо, пока горизонт не будет интегрирован.
[0.35.0] - 2026-10-12#
Фрагмент с названиями сторонних ИИ-клиентов здесь опущен; он есть в CHANGELOG.md на GitHub.
Верификатор Galileo OSNMA#
- Новый модуль
kshana::osnmaиkshana osnma verify <input>: открытый верификатор Galileo OSNMA на стороне приёмника, написанный на чистом Rust. Он читает страницы I/NAV и сообщает для каждого спутника и эпохи, аутентифицированы ли навигационные данные, с указанием причины каждого сбоя или задержки: разбор HKROOT и MACK, пересборка DSM-KROOT и DSM-PKR, проверка открытого ключа по дереву Меркла, проверка цепочки ключей TESLA, проверка MACSEQ и тегов для ADKD 0, 4 и 12, включая перекрёстную аутентификацию, а также результат в форме$PKSOSдля монитора доверия к приёмнику. Выходные данные содержат консультативное уведомление о том, что этот статус не является службой целостности навигации.docs/OSNMA.mdуказывает, что проверяется, а что нет, требование ко времени и то, что Kshana не предоставляет никаких прав на ИС (IPR) ЕС по ICD OSNMA (пользователи полагаются на авторизацию из приложения E к ICD). Реализовано по SIS ICD, выпуск 1,1, и Receiver Guidelines, выпуск 1,3. Страницы проверяются по CRC, а поток байтов u-blox UBX-RXM-SFRBX можно читать напрямую (--format ubx). Тесты по умолчанию используют синтетические данные и опубликованные тесты известных ответов для примитивов; необязательный тест читает локально скачанную копию официальных векторов. После независимого рецензирования верификатор берёт своё время только из проверенных ключей TESLA (подложный подкадр из далёкого будущего больше не может стереть сбой), позволяет аутентификации истекать и следовать за используемым IODnav, учитывает проверенные сообщения об оповещении (чей лист дерева Меркла теперь включает случайное поле NPK) и статус NMA «не использовать», не допускает фиктивные теги в статус спутника, хранит цепочки по CID с отзывом и обновлением, проверяет хеш дополнения KROOT и ограничивает длины кадров UBX и объём работы по проверке TESLA. Спутник считается аутентифицированным, только пока самые новые передаваемые им эфемериды и данные часов бит в бит совпадают с аутентифицированными данными (а не просто имеют тот же IODnav); статус или отзыв из неаутентифицированного заголовка NMA учитывается, только когда два спутника согласны или его несёт проверенный KROOT; воспроизведённый старый KROOT не может заменить цепочку, а остановившийся поток ключей сообщается.
Добавлено (каналы сервера MCP)#
kshana-mcp --http <addr>, потоковый HTTP, на собственном хостинге. По умолчанию только loopback; нелоопбек-адрес требует--allow-remoteи bearer-токена вKSHANA_MCP_HTTP_TOKEN; ни один инструмент не читает и не записывает путь (инструменты файлов IQ отключены); ограничения на размер запроса, время и параллелизм; без заголовка CORS; проверки Host и Origin. Kshana не размещает ни одной конечной точки (docs/deploy/mcp-http.md, с шаблонами для Docker, Fly.io и Cloud Run).
Фрагмент с названиями сторонних ИИ-клиентов здесь опущен; он есть в CHANGELOG.md на GitHub.
Добавлено (поверхности)#
osnma_verifyв Python и WebAssembly. Верификатор, стоящий заkshana osnma verify, работает с байтами в памяти и возвращает JSON, который печатает--json(консультативное уведомление в его полеadvisory; только статус аутентификации, не служба целостности навигации). Те же отказы, что и в командной строке. Не в MCP: входные данные — длинный сырой поток приёмника, который лучше обрабатывать через CLI и Python. Об этом говорятdocs/SURFACES.mdиdocs/OSNMA.md.trust_telemetryв WebAssembly, Python и MCP, с командой плагина и действием JetBrains. Преобразует поток доверия или результатreceiver-trustв текст Prometheus, строки syslog CEF или LEEF либо полезную нагрузку OTLP JSON теми же кодировщиками, что используетkshana trust-telemetry(kshana::surface::trust_telemetry); без сокета и без часов. Плагин:/kshana-trust-telemetryи навыкtrust-telemetry. JetBrains: Render Trust Telemetry. Возможностиwasmиpythonи сервер MCP теперь также включаютotlp, что не добавляет ни одного крейта.Выравнивание по паритету. Действия JetBrains Validate Scenario, List Scenario Kinds и Assess Receiver Stream;
kshana --helpтеперь перечисляетreceiver-trust evidence,evidence,trust-telemetryиnmea-scenario; ноутбукcompliance-and-test-bench(сопоставление требований и экспорт для тестового стенда); и каждая оставшаяся вdocs/SURFACES.mdячейка JetBrains «только CLI» теперь содержит явное N/A с указанием причины.
Фрагмент с названиями сторонних ИИ-клиентов здесь опущен; он есть в CHANGELOG.md на GitHub.
Добавлено (пакеты доказательств)#
kshana receiver-trust evidenceиkshana evidence verify: подписанные проверяемые пакеты доказательств для события доверия к GNSS. Пакет объединяет срез сырого журнала и SHA-256 всего журнала, конфигурацию со всеми порогами, результаты и причины по эпохам, версию движка, манифест с хеш-цепочкой и самодостаточную сводку в HTML, подписанные Ed25519 (ключ изkshana evidence keygenили ваш собственный файл; ключи никогда не хранятся в пакете, а*.evidence-keyисключён из git).verifyпроверяет каждый хеш, цепочку и подпись и точно называет, что не проходит; с--pubkeyон закрепляет подписанта. Можно приложить токен RFC 3161: он читается и привязывается к манифесту (собственная подпись центра в этой сборке не проверяется; это делаетopenssl ts -verify). Срез журнала — это точные байты окна там, где читатель сообщает диапазоны источника (NMEA, UBX, RINEX 3, Android), иначе — весь журнал, и манифест указывает, какой случай имеет место. Создание и проверка — чистые публичные функции (kshana::evidence), собираемые дляwasm32. В пакетах указано, что они являются техническим документом, а не юридическим заключением. Новые зависимости — деревоed25519-dalek(BSD-3-Clause и Apache-2.0/MIT, минимальный набор возможностей) и прямая зависимостьzeroize(уже входящая в это дерево) для стирания ключевого материала. См.docs/EVIDENCE-PACKS.md.
Добавлено (телеметрия доверия)#
kshana trust-telemetry: доверие к GNSS как источник телеметрии безопасности. Читает поток доверия по эпохам (строки JSON: оценка 0–100, диапазон, причины) или пакетный результатreceiver-trustи передаёт его в конечную точку Prometheus/metrics(по умолчанию localhost), события syslog в CEF или LEEF в оболочке RFC 5424 (UDP или TCP) и, при выключенной по умолчанию возможностиotlp, экспорт OTLP/HTTP JSON. Доставка работает в рабочих потоках с ограничениями времени подключения и записи, ограниченной задержкой переподключения и счётчикомkshana_trust_syslog_send_failures_total, поэтому неработающий или зависший коллектор не может остановить живую оценку или заморозить/metrics; метки причин ограничены 64 рядами. Новых зависимостей нет. Образец дашборда Grafana находится вdeploy/grafana/. Имена метрик, метки и сопоставление полей CEF/LEEF описаны вdocs/TRUST-TELEMETRY.md. Формат потока изолирован вsrc/telemetry/sample.rs.
Добавлено#
- Морское доверие: живая оценка доверия 0–100 к решению движущегося судна по NMEA 0183, которое приёмник уже выдаёт, с включаемым по желанию шлюзом.
kshana receiver-trustпринимает таблицу[platform](kind = "static"или"vessel", максимальные скорость, ускорение и скорость поворота судна, высота антенны над ватерлинией и необязательный датчик курса; каждое значение по умолчанию документировано с причиной). Для судна статический монитор скачка положения, который измеряет расстояние от среднего калибровки и неверен для идущего судна, заменяется причинными мониторами движущейся платформы: кинематическая согласованность положения с заявленными скоростью и курсом и с ограничениями судна, курс по гирокомпасу относительно курса над грунтом, скорость по лагу относительно скорости над грунтом, высота антенны относительно заявленной высоты над ватерлинией, схлопывание разброса C/N0 и его одновременный рост относительно базового уровня калибровки, а также согласованность времени (в живом режиме — и с часами этого компьютера). Он также читает сообщаемый статус аутентификации, общий или по спутникам (только сообщаемый статус: без криптографии OSNMA). Каждый порог указывается в таблице[maritime]до запуска. Затем каждая эпоха получает оценку от 0 до 100 по детерминированному предварительно зарегистрированному отображению (без обучения, ничто не подгоняется под события; веса, границы диапазонов и доказательства содержатся в таблице[score]), отображаемую на существующие состояния доверия, с указанием мониторов, сделавших вычет, и их баллов. Статические сценарии не меняются и хешируются как прежде.kshana receiver-trust live <session.toml>читает stdin, дописываемый файл, TCP или UDP и записывает по одной строке JSON на эпоху и собственное предложение$PKSHT; с--gateон пропускает поток без изменений, пока решению доверяют, и помечает решение как недействительное (качество GGA 0, статус RMC и GLLV, режим GNS и VTGN), пока доверия нет. Шлюз выключен, пока его не запросят;--listen tcp:<port>раздаёт поток через шлюз любому числу клиентов TCP (по умолчанию только loopback; медленный клиент отключается, а не блокирует остальных). Это программное обеспечение консультативного характера, не навигационное оборудование с утверждённым типом (IEC 61108, IEC 61162); ответственность остаётся на операторе.examples/maritime-trust/— синтетический журнал Таллин–Хельсинки, записанный только как текст, с уводом положения в середине, во время которого приёмник продолжает сообщать действительное решение; ожидаемый результат закреплён тестом. Руководство:docs/MARITIME-TRUST.md. Эти проверки не могут обнаружить спуфер, чьё решение согласуется со всем, что есть на шине; руководство об этом говорит.
Карта помех#
kshana interference-mapиkshana route-exposure: публичная картина того, где самолёты и суда сообщали о недостоверных навигационных данных, и какую часть маршрута это затрагивает. Входные данные — локальные файлы CSV, подготовленные из открыто лицензированных данных ADS-B (adsb.lol, ODbL 1,0) и AIS (NOAA MarineCadastre, Kystverket по NLOD 2,0); каждый выходной файл — это один источник и одни сутки UTC в GeoJSON с указанием метода, его порогов, лицензии на данные, атрибуции и смещения охвата источника. Метод ADS-B агрегирует NIC и NACp на фиксированную сетку и признаёт ячейку деградировавшей по доле различных самолётов, с защитой от оборудования, которое никогда не сообщает точность, от малой высоты и от причин широкой зоны действия. Метод AIS запускает пять детекторов: положения на суше (относительно предоставленной пользователем береговой линии), круговые треки, неправдоподобные скачки, неправдоподобные скорости и много судов в одной точке. Пороги — предварительно зарегистрированные константы именованной версии метода. Только агрегаты: идентификаторы хешируются в памяти и никогда не записываются, а ячейки менее чем с 5 различными самолётами или судами не публикуются. Деградировавшая ячейка не является выводом о наличии помех. Команды по умолчанию не используют сеть; необязательный помощникfetch-land --allow-networkскачивает полигоны суши Natural Earth по адресу, закреплённому коммитом, и сохраняет файл, только если его SHA-256 совпадает. Входные данные ADS-B — это CSV или непосредственно файлы истории readsb adsb.lol (новая зависимость:flate2с её бэкендом на чистом Rust, для gzip). Оба метода имеют версию 2: вывод «деградировал» или «аномально» требует не менее 5 самолётов или судов (минимум для публикации), каждый счёт на ячейку ниже 5 скрывается какnull, а сутки, фон которых нельзя оценить, скрывают свои выводы. Выходные файлы называются<source>-<dataset>-<date>.geojsonи никогда не перезаписываются; входные данные читаются построчно потоком; экспозиция маршрута учитывает антимеридиан. Тесты используют только синтетические данные. См.docs/INTERFERENCE-MAP.mdи обзор лицензий вdocs/data/INTERFERENCE-DATA-SOURCES.md.
Добавлено (тренировочные потоки)#
kshana nmea-scenario: синтетический мостиковый NMEA 0183 для обучения экипажей распознаванию подавления (jamming) и спуфинга GNSS. По TOML сценария он записывает файл или передаёт поток по TCP или UDP (одноадресно или широковещательно; в реальном времени, ускоренно или как можно быстрее) полным мостиковым набором предложений GGA, RMC, VTG, GSV, GSA, GNS, ZDA, HDT и VBW для трека судна с ограничениями скорости поворота, ускорения и течения, с геометрией спутников из собственных номинальных орбитальных группировок движка. Сценарные события на временной шкале: подавление (jamming), увод положения (действительное решение, которое уходит в сторону), подмена времени и задержка воспроизведения, каждое с нарастанием и спадом. Журнал инструктора (JSON и текст) фиксирует, что и когда было внесено, с истинным треком в сравнении с сообщаемым. Библиотека вscenarios/training/(подавление в открытом море, увод у берега, подмена времени при заходе в порт, комбинированный сценарий) содержит заметки для тренера. Выходные данные имеют корректные контрольные суммы и детерминированы для каждого seed; тесты закрепляют эталонную выдержку (golden) для каждого сценария и читают каждое предложение читателем NMEAreceiver-trust. Только текст: никакого выхода RF, IQ или формы сигнала; потоки предназначены для обучения и испытаний и ни в коем случае не должны подаваться в действующие навигационные системы судна. См.docs/NMEA-TRAINING.md.
Морские интеграции (0.35.0, направление B)#
- Плагин Signal K (
integrations/signalk/, не опубликован в npm): запускаетkshana receiver-trust liveили подключается к нему (собственный вход NMEA сервера, пользовательские входные аргументы, канал JSON-строк по TCP или предложения$PKSHTпотока шлюза), публикует оценку доверия, диапазон, причины, тревоги и состояние шлюза вnavigation.gnss.kshana.*(включая сообщаемое приёмником положение как контекст, но никогда не вnavigation.position) и поднимает уведомление Signal K (warnпри деградации,alarmпри недоверии, с порогами удержания, снятия и устаревания, все в схеме конфигурации). Без зависимостей npm. Проверено на записанных синтетических выходных данных. - OpenCPN: NMEA в режиме шлюза передаётся напрямую через
kshana receiver-trust live --gate --listen tcp:10110(рекомендуется); ретранслятор TCP без зависимостей (integrations/opencpn/nmea-tcp-relay.mjs) — необязательная альтернатива. В обоих случаях OpenCPN видит недействительное решение, когда доверие рушится, и$PKSHTв своём окне отладки NMEA; тесты воспроизводят синтетический поток со шлюзом через настоящий сокет TCP и проверяют, что получает потребитель. Нативный плагин панели оценки (integrations/opencpn/plugin/, API плагинов 1,18, CMake) читает$PKSHTиз собственного потока NMEA OpenCPN и подаёт сигнал при диапазоне «недоверие»; он собирается, его логика покрыта модульными тестами, и он был запущен внутри OpenCPN 5.8.4 на виртуальном дисплее (доказательства и скрипт воспроизведения вintegrations/opencpn/evidence/); он не упакован для менеджера плагинов. - Эталонная сборка (
deploy/reference-build/): обобщённый перечень компонентов, настройка ОС, юниты systemd для консультативного монитора и включаемого по желанию шлюза (проверяютсяsystemd-analyze verifyчерезcheck-units.sh), вариант с контейнером, подключение Signal K. - Плагин Signal K принимает живую схему JSON 1,2 (ключ
position, затем ключadvisoryдобавляются в конец; неизвестные добавленные ключи игнорируются), проверено на реальном выводе 1,2 и на настоящем signalk-server. - Исправления по результатам рецензии: юниты systemd всегда перезапускаются и работают в песочнице (без оболочки, без сети там, где она не нужна), добавлен фрагмент logrotate,
check-units.shзавершается ошибкой при любой находке; контейнер запускает шлюз из переменных окружения с проверкой работоспособности и базовыми образами, закреплёнными по дайджесту; метаданные оценки Signal K, устаревшее уведомление заменяется при возобновлении данных, ошибки дочерних процессов сохраняются, а завершения эскалируются, небезопасныеinputArgsотклоняются, а уведомление находится вnotifications.navigation.gnss.kshana.trust; ретранслятор ограничивает удерживаемую неполную строку; парсеры$PKSHTотклоняют оценки вне диапазона от 0 до 100; проверка ссылок документации; рабочий процесс CI (marine-integrations.yml), запускающий всё это, включая настоящий исполняемый файл от начала до конца. docs/MARINE-INTEGRATIONS.md. Программное обеспечение консультативного характера, не оборудование с утверждённым типом; ответственность остаётся на операторе. Только программное обеспечение: ничего не передаётся, и никакие показатели обнаружения или ложной тревоги не заявляются.
Добавлено: сопоставление требований (compliance) и экспорт для тестового стенда#
docs/compliance/иkshana compliance-report. Сопоставление выходных данных Kshana с пятью рамками и стандартами устойчивости (US DHS Resilient PNT Conformance Framework v2.0, руководство IMO для судов, руководство EASA для авиации, NIS2, статья 21, EN 16803 — платный стандарт, цитируемый по частям и по немногим номерам пунктов, видимым в тексте каталога), по одной таблице на рамку: ссылка, что она требует в нашем пересказе, выходные данные, которые подкрепляют это доказательствами, и пробел. Версии источников, URL и то, что было и что не было прочитано, записаны.kshana compliance-report <result.json>...заполняет сопоставление по переданным прогонам и помечает каждую строку какevidenced,partly-evidenced,not-evidencedилиout-of-scopeв виде Markdown и JSON, сохраняя пробел в каждой строке. Формулировка — «подкрепляет доказательствами»; ничто не оценивается и не одобряется. Тесты используют синтетические прогоны и падают, когда закоммиченная таблица расходится с кодом.kshana bench-export <scenario.toml>. Записывает движение транспортного средства и события сценарияgnss-ins,jammingилиgnss-simдля лабораторного имитатора GNSS: CSV движения пользователя с документированными системами отсчёта и файлом метаданных, NMEA 0183GGA/RMC, текст путевых точек, а также события в виде CSV и блоковreceiver-trust[[events]](src/interop/testbench.rs). Только движение и события: никакой сигнал не записывается. Каждый файл читается обратно вtests/interop_testbench.rsи сравнивается в пределах заявленного допуска.docs/TEST-BENCH.mdописывает метод воспроизведения экспорта через имитатор и оценки журнала приёмника с помощьюkshana receiver-trust.- Что считается доказательством. Результат засчитывается для возможности только тогда, когда содержит поля, которые записывает его вид; одна метка вида не засчитывается. Неизвестные виды, результат, расходящийся с соседним сценарием, нешестнадцатеричные хеши и некорректные счётчики доверия к приёмнику перечисляются как не использованные, с указанием причины. Отчёт экранирует ячейки Markdown и не может аварийно завершиться на нестандартном ASCII-хеше.
compliance::run_from_textиassess_textsпринимают тексты, а не пути. - Экспорт для тестового стенда.
--epochпроверяется на диапазон (UtcEpoch::parse_iso); файл путевых точек проверяет каждый интервал, а команда сообщает причину, если интервал исключён; документация указывает, что курсgnss-ins— это рыскание корпуса, а не путевой угол, поля-заполнителиGGAи собственное изменение высоты сценария.bench-exportиcompliance-reportесть в тексте справки. fusion::pack::truth_trajectoryраскрывает историю истинного состояния профиля движенияgnss-ins(тот же шаг, что использует истина самого вида), аUtcEpochполучает поля даты и времени NMEA.
Проверка карты помех#
- Семантика декодирования и геометрия карты помех проверены по независимым реализациям на синтетических входных данных. Значения кодов NIC и NACp — по декодированию синтетических кадров ADS-B в pyModeS, значения «недоступно» AIS — по декодированию синтетических предложений AIVDM в pyais, назначение ячеек сетки — по shapely, длина маршрута по состоянию ячейки — по shapely и GeographicLib, а маскирование внутренних территорий — по shapely и pyproj, каждое с допуском, зафиксированным до первого сравнения (
tests/fixtures/interference_map_ref/PREREGISTRATION.md). Это подтверждает то, как читаются коды и значения полей, и геометрию, но не то, что помеченная ячейка является помехой. Читатель полигонов суши теперь замыкает кольцо, не повторяющее свою первую вершину, которое он раньше читал без последнего ребра. Документация указывает пороги низкой точности NACp и NIC как границу, которую обозначает каждый код (NACp 6 — граница EPU 556 м, NIC 5 — граница охвата 1 NM).
Добавлено (проверка форматов телеметрии и пакетов доказательств)#
- Внешние проверки криптографии пакетов доказательств, верификатора пакетов и проводных форматов телеметрии. Тестовые векторы Ed25519 из RFC 8032, раздел 7,1 (1, 2, 3 и 1024) и примеры SHA-256 из FIPS 180-4 прогоняются через собственные функции подписи, проверки и хеширования пакета до точного равенства. Верификатор, написанный на Python только по нормативному разделу
docs/EVIDENCE-PACKS.md(hashlib иcryptography), согласуется с верификатором на Rust на 71 целых и подделанных пакетах: вердикт, набор сбоев, вердикт подписи и обе головы цепочки. Наша экспозиция Prometheus читается парсером официального клиента Python, а наш OTLP JSON — официальным сообщениемopentelemetry-proto, строго, и оба согласуются с состоянием, из которого были созданы. У CEF и LEEF нет независимого открытого валидатора, и они остаются модельными.docs/EVIDENCE-PACKS.mdполучил нормативный формат пакета и процедуру проверки, по которым был написан верификатор в изолированной среде (clean-room);VerifyReportполучилsignature_valid. Оракулы и тестовые наборы:scripts/gen_ed25519_rfc8032_ref.py,scripts/gen_evidence_pack_ref.pyсscripts/evidence_verify_cleanroom.py,scripts/gen_telemetry_formats_ref.py; тестыevidence_crypto_reference,evidence_pack_referenceиtelemetry_formats_reference. CI не требует Python.
Добавлено (проверка событий CEF)#
- События CEF телеметрии корректно читаются обратно двумя независимыми парсерами с открытым исходным кодом.
pycef1,11 и кодек CEF для Logstash (logstash-codec-cef6.2.7 в Logstash 8.15.3) разбирают 157 строк CEF (каждое изменение диапазона и каждую эпоху закоммиченного потока телеметрии, а также состязательный текст, содержащий=, обратные косые черты, вертикальные черты, переводы строк, табуляции и многобайтовый текст) и восстанавливают каждое поле заголовка, уровень серьёзности, точный набор ключей расширения и каждое значение точно. Кодек Logstash также читает четыре строки, чей текст заголовка требует экранирования, чегоpycefне умеет. Порог был зарегистрирован до запуска любого из парсеров (tests/cef_reference.rs); тестовые наборы вtests/fixtures/cef/, скрипты оракуловscripts/gen_cef_ref.pyиscripts/gen_cef_logstash_ref.py; CI не требует ни Python, ни Logstash. У LEEF нет поддерживаемого открытого парсера, и он остаётся смоделированным. События CEF теперь несут оценку доверия и смещение эпохи в пользовательских полях CEF с плавающей точкой (cfp1,cfp2) вместо целочисленных полейcn1иcn2, которые не подходили ни для одного из значений; CEF появился в этом выпуске, поэтому ничто из выпущенного ранее не меняется.
Изменено#
- MCP:
assess_receiver_logпринимает журнал какtextилиbase64; входные данные инструмента ограничены 4 МиБ. - График подавления (jamming) тоже берёт цвета из палитры.
src/jamming.rsбыл единственным модулем, который пересмотр палитры Observatory оставил на собственных цветах, пока шла работа над Q для источников подавления; его*.chart.svg(сценарии видовjamming,maritime-strait-jammingи других видовjamming) теперь читаетsrc/palette.rs, а список разрешённых вtests/palette_sync.rsпуст. Только цвета и шрифт: графикиjamming-demoиmaritime-strait-jammingравны своим ранее записанным отрисовкам после нормализации цвета,font-familyи колонтитула с версией. Ни одно нанесённое на график значение не сдвинулось. Записанные копии Studio вweb/studio/recorded/были записаны заново при переносах 0.33.0 и 0.34.0 (только штамп версии): они по-прежнему несут старую окраску графика подавления и получат окраску палитры при следующем переносе.
Исправлено#
- Граница 3 сигма ансамбля часов теперь охватывает фликкерный пол, а проверка здоровья фильтра его видит. При
flicker_floorистинные часы несли фликкерный FM, а двухсостоянный фильтр, дающий границу целостности, — нет, поэтому охват 3 сигма встроенного сценарияclock-ensembleсоставлял 0,41 (классические) и 0,33 (квантовые), а проверка NIS/NEES, бравшая свою истину из модели фильтра, сообщала одинаковые значения с полом и без него. Теперь граница — это двухсостоянная дисперсия плюс точная дисперсия фликкерной фазы, накопленной с последней синхронизации, вычисленная по тому же банку, который использует истинный часовой процесс; проверка NIS/NEES берёт свою истину из расширенной модели с этим банком и запускает согласованный расширенный фильтр (а двухсостоянный фильтр против фликкерной истины сообщаетconsistent = false). Изменение вывода только для часов с ненулевымflicker_floor:integrityвclock-ensembleменяется с 0,40866 / 0,33026 на 0,99970 / 1,0 (классические / квантовые), а NIS/NEESfilter_healthтеперь включают фликкер; ошибка времени,holdover_sиtiming_p95_nsне изменились, а сценарии без пола идентичны побайтно.scenarios/orbit-gnss-challenged.toml(вид орбиты, seed 7, полы 1e-16 / 2e-11) также сдвигается:fom.integrityклассические с 0,7734 до 1,0 и квантовые с 0,9796 до 1,0, а NIS/NEESfilter_healthи их полосы меняются. Его квантовыйfilter_health.consistentпереключается сtrueнаfalse: это событие выборки ансамбля фликкера 16 seed на 60 шагов (NIS 0,8815 при полосе [0,9125, 1,0914]), а не дефект. Полоса — 95-процентная, поэтому примерно 5 % seed по построению помечают согласованный фильтр (для 40 новых seed этого сценария: квантовых помечено 1, классических — 2); при 64 на 200 тот же seed лежит внутри полосы для обоих часов (NIS 0,990 и 1,001). Известное продолжение: у вида fusion тот же пробел (классическая целостность 0,80 с полом); вид hybrid остаётся выше 0,99.
[0.34.1] - 2026-10-10#
Безопасность#
- Укреплён ввод сервера MCP. Инструменты сценариев сервера MCP теперь принимают только встроенное содержимое и отклоняют поля с файловыми источниками; размер ввода ограничен. Уведомление: GHSA-8wpf-hqg5-6xjr.
[0.34.0] - 2026-10-09#
Лабораторное воспроизведение: движок слежения, мониторы обнаружения и средство запуска кампаний для записей IQ GNSS, с сопутствующими конструкциями петель, оценщиками C/N0 и оценками. Класс доказательств: всё ниже имеет статус MODELLED или проверено на внутреннюю согласованность по замкнутым формам и сеяному моделированию; ничто из этого не добавляет строку VALIDATED, а реестр верификации (ledger) не изменился (251 строк: 124 Validated, 123 Modelled, 4 Partner). Это программный аналитический слой: ничто здесь не синтезирует сигнал источника подавления или спуфера, и ничто не передаётся.
Добавлено#
Лабораторное воспроизведение: условия испытаний, средство запуска кампаний и оценка (0.34.0).
kshana iq campaign <campaign.toml>воспроизводит записи × цепочки приёмного тракта × конструкции петель (kshana.loop-design/1) и оценивает каждую ячейку по файлу условий испытаний для каждой записи (kshana.test-conditions/1, TOML или JSON). Этот файл указывает, что лаборатория знает о записи: ожидаемые спутники и для каждого события — метку типа, начало и конец, затронутые спутники и заявленный профиль J/S или мощности источника подавления. Это только метаданные. Оценки по каждому спутнику, для всего прогона и по каждому событию:- доступность, время до потери захвата и заявленное J/S в момент потери;
- время повторного захвата — от конца события и от потери;
- измеренная деградация C/N0 по интервалам заявленного J/S;
- эпизоды ложного захвата на час в захвате (флаг трекера или Доплер относительно файла истины);
- дрожание дискриминаторов PLL и DLL.
Рядом с каждой измеренной кривой деградации рисуется аналитический эталон спектрального разделения (
jamming::effective_cn0_dbhzсQданного типа) с пометкой MODELLED везде, где он появляется.Ячейки выполняются параллельно через конечный автомат состояний захвата сеанса слежения, и каждая записывается атомарно под ключом хеша содержимого. Ключ охватывает SHA-256 записи, хеши условий, приёмного тракта, конструкции, прогона и оценки, обязательный
data_class(synthetic|client-confidential) и версию движка. При заданномrun.epochsпотокkshana.track-epoch/1каждой ячейки и события захвата тоже сохраняются под именем по ключу ячейки и хешируются в ячейку.cell_keyиreport::digestпубличны, поэтому потребитель может заново вывести каждый ключ и дайджест. Поэтому повторный запуск пропускает завершённые ячейки, а результаты никогда не зависят от числа рабочих потоков. Прогон записываетscorecard.csv/.json, самодостаточныйreport.htmlиDIGEST. Пороги pass/fail ([scoring.bars], переопределяемые для каждой записи) применяются при построении отчёта.[scoring] cn0_estimator = "m2m4" | "nwpr"(по умолчанию"m2m4", входит в хеш оценки) выбирает C/N0, лежащее в основе сообщаемого C/N0 и кривой деградации. Обе оценки всегда подсчитываются и сообщаются (медианы по всему прогону и по базовому уровню, а также по интервалам J/S), а ячейка и карточка результатов фиксируют оценщик. NWPR занижает примерно на 8 дБ × Bn·T при собственном дрожании петли; M2M4 — нет.
Также нового:
kshana iq campaign report <dir>заново строит карточки результатов, отчёт и дайджест из ячеек;kshana iq conditions <file>проверяет файл условий испытаний по его схеме;events_from_sigmf = trueимпортирует аннотацииkshana:test_eventзаписи SigMF как события;- в Python появляются
iq_test_conditions,iq_campaignиiq_campaign_report; - в
kshana-mcpпоявляютсяiq_campaign, который работает поэтапно и с возобновлением в рамках бюджета отсчётов на вызов, причём каждый файл ограничен рабочим каталогом, иiq_campaign_status.
Тесты:
tests/iq_campaign.rsвыполняет синтетическую кампанию из 3 записей × 2 приёмных трактов × 2 конструкций. Её сцены несут заявленные профили C/N0, и она охватывает:- каждую метрику, проверенную по внесённой истине;
- возобновление после частичного однопоточного прогона с повреждённой ячейкой, побайтно идентичное непрерывному прогону на четырёх потоках;
- файлы эпох для каждой ячейки;
- регрессию повторного захвата трёх спутников за 20 с: при включённом
reacquireкаждый канал возвращается в пределах 2 с после перерыва в 2 с; результат при выключенномreacquireзакреплён; - пороги, переоценённые без повторного запуска;
- CLI;
- игнорируемые по умолчанию проверки пропускной способности и памяти в режиме release, включая запись в 4 ГБ (5,45× реального времени, пиковая память на 2 МБ выше исходного RSS; измерения на одной машине, не пороги).
Только программное обеспечение: ничего не передаётся, и никакая форма сигнала помех или спуфинга не синтезируется. Записки о проекте и о построенной реализации:
docs/design/LAB-CAMPAIGN.md.Движок слежения для лабораторного воспроизведения (0.34.0: B3.1, B3.2, B3.3, B6.1).
Файлы конструкции петель: TOML
kshana.loop-design/1(docs/design/LOOP-DESIGN-TOML.md; парсерiq::track::design). Одна или несколько именованных конструкций задают каждое поле петли:- вид несущей (PLL, FLL или PLL с поддержкой FLL), порядки и полосы;
- дискриминаторы PLL/FLL/DLL и поддержка несущей;
- разнесение и интегрирование;
- пороги захвата и окна C/N0, а также битовая синхронизация;
- конечный автомат захвата;
- передаточный захват (
"auto"или явный).
Конструкции могут расширять (
extends) друг друга. Неизвестные ключи отклоняются. Каждая разрешённая конструкция имеет хеш SHA-256 по каноническому виду JSON (ключи отсортированы на каждом уровне, фиксированный формат чисел), поэтому хеш не зависит от порядка полей; каждый результат его фиксирует. Поверхности:kshana iq track --design <file> [--design-name], где явные флаги переопределяют конструкцию и записываются;kshana iq sweep --design <file>, который запускает каждую конструкцию из файла;- Python
iq_track(design=, design_name=, reacquire=),iq_loop_designs; - MCP
iq_trackdesign/design_name.
M2M4 C/N0 (
EpochOutput.cn0_m2m4_dbhz, столбец эпохи трекаcn0_m2m4_dbhzпослеcn0_beaulieu_dbhz; словари эпох Python). Оценка по второму и четвёртому моментам на тех же окнах, что и NWPR, только по мощности prompt: NWPR занижает при собственном дрожании несущей петли (около 8 дБ × Bn_PLL·T), а M2M4 — нет. На GPS L2C CM (20 мс, номинально 40 дБ-Гц, PLL от 1 до 10 Гц) он показывает 39,93 дБ-Гц при любой полосе, тогда как NWPR падает с 39,55 до 38,22; на L1 C/A при 45 дБ-Гц он показывает 45,34. NWPR и все остальные выходные данные не изменились (закрепление бит в бит). Бинарная запись остаётся в 184 байт (значение занимает зарезервированное число с плавающей точкой и бит флага 6).Дополнительные отводы коррелятора (мультикоррелятор / SQM).
[design.integration] extra_taps_chips = [..](смещения в чипах от prompt, положительные — в сторону early; не более 16, каждое в пределах ±2) коррелирует дополнительные реплики наряду с E/P/L и возвращает их какEpochOutput.extra((offset, value)в порядке конструкции). Петли их никогда не используют. Ключ исключается из канонического JSON, когда пуст, поэтому хеш конструкции по умолчанию и все выходные данные без отводов не изменяются (kshana.track-epoch/1сохраняется; CSV/JSONL/бинарный вывод без отводов идентичны побитно). С отводами: столбцы CSV/JSONL и бинарная запись в184 + 16 × tapsбайт, чей заголовок несётextra_taps_chips, так что старый читатель отклоняет файл, а не читает его неверно.--extra-taps(CLI),extra_taps(Python) иextra_taps_chips(MCPiq_track). Конструкции одного прогона должны совпадать по отводам.Параллельные каналы (
iq track/iq sweep --threads <N|auto>; RustTrackSession::with_threads). Каналы каждого фрагмента выполняются не более чем на N потоках (std::thread::scope;wasm32остаётся последовательным). Корреляция канала и его конечный автомат захвата затрагивают только этот канал; его эпохи и события буферизуются и записываются в приёмники в порядке каналов, поэтому выходные данные (CSV, JSONL, бинарные, события, сводка) побайтно идентичны последовательному прогону при любом N. По умолчанию остаётся 1 поток. Измерено на записи из 12 каналов, 4 с, 4,092 МГц на 4 ядрах: 19,5 с последовательно, 11,5 с на 2 потоках, 6,3 с на 4 (3,1×; начальный захват последовательный).Экспорт поверхности захвата (
kshana.acq-surface/1;iq::acq_surface,docs/design/ACQ-SURFACE.md).iq acquire --surface <path>(один PRN; CSV, JSON или бинарный), Pythoniq_acq_surfaceи MCPiq_acquiresurface_outзаписывают всю поверхность мощности корреляции Доплер × фаза кода, которую вычисляет поиск (её ячейки — это ячейкиacquireбит в бит), с пиком и двумя уточнениями тонкого Доплера: параболической оценкой и тонким поиском с шагом 1/16 интервала (≈5 Гц при когерентном накоплении 4 мс, против интервалов в 167 Гц). Самacquireи все значения по умолчанию не изменены.Потоковый вывод эпох (
kshana.track-epoch/1;iq::track::sink). Каждое обновление петли несёт:- корреляторы early/prompt/late;
- выходы всех трёх дискриминаторов;
- состояния NCO PLL/FLL/DLL и фазу несущей;
- флаги PLI и захвата;
- обе оценки C/N0 и биты;
- состояние захвата.
Он записывается по мере выполнения в виде CSV, JSON Lines или версионированной бинарной формы с читателями на Rust (
BinaryEpochReader) и Python (iq_read_epochs).iq trackполучает--epochs,--eventsи--summary(kshana.track-summary/1), аiq sweepполучает--epochsи--events. MCPiq_trackполучаетepochs_out/events_outи строит свой ответ из сводки с ограниченным объёмом памяти.- Куча прогона больше не растёт с длиной записи:
tests/iq_track_memory.rsизмеряет её счётным аллокатором (длина в 6 раз больше, тот же пик в пределах 64 КиБ), с контролем, показывающим, что путь в памяти растёт. - Потоковый вывод побитно идентичен воспроизведению в памяти.
Конечный автомат захвата (
iq::track::lock,TrackSession): вхождение в захват → захват → потеря → повторный захват → вхождение в захват, либо вывод из работы, если потеря длится дольшеreacq_window_s(по умолчанию 30 с). Неудачные поиски повторяются каждыеreacq_interval_s(0,1 с) через равные промежутки, поэтому расписание повторов добавляет к измеренному времени повторного захвата не более 0,1 с. Необязательное нарастание интервала (reacq_max_interval_sсверхreacq_interval_s) по умолчанию выключено, аmax_reacq_attempts— необязательный предел (0, то есть без предела, по умолчанию). Перерыв в 2 с на трёх PRN при 4,092 МВыб/с теперь заканчивается тем, что каждый канал повторно захвачен и находится в захвате. При бюджете в 3 попытки каждый канал выводился из работы в течение 0,2 с после потери.- Пороги (
loss_dwell_s,pull_in_max_s, доплеровское окно повторного захвата) берутся из конструкции. Каждый переход — это событие с указанием причины. - Проверка ложного захвата ищет отслеживаемый Доплер относительно его псевдонима FLL/PLL ±1/(2T). Она ловит ложный захват, измеренный в PR #38 (−2400 Гц отслеживается при смещении 500 Гц). При включённом повторном захвате канал заканчивает в захвате на внесённом Доплере.
- Перерыв сигнала в 0,8 с объявляется потерей и повторно захватывается в течение 0,3 с после возвращения сигнала.
--summaryfinal_state(и столбец таблицы) — это состояние после последнего перехода, поэтому канал, выведенный из работы после последнего обновления петли, читается какRETIRED.- Поддержка FLL только при вхождении в захват (
[design.carrier] fll_assist = "pull-in", по умолчанию;"always"сохраняет прежнее поведение бит в бит). FLL передаёт управление PLL, когда сглаженный PLI удерживается на уровнеfll_off_pli(0,8) или выше в течениеfll_gate_dwell_s(0,1 с), и возвращается, если он опускается нижеfll_on_pli(0,6). При оставленной включённой поддержке тракт FLL 10 Гц срывал фазовый захват ниже примерно 38 дБ-Гц на чистых сигналах: при 35 дБ-Гц доля фазового захвата составляла 10–16 % с истинной фазовой ошибкой 38–41°. При включении по условию значение по умолчанию держит 100 % при 35 дБ-Гц с 4,5°, как и один PLL. Вхождение в захват при ошибке передачи в 100 Гц не изменилось. Доказательства с предварительно зарегистрированными порогами:docs/design/evidence/carrier-lock/. Поэтому петли по умолчанию не совпадают бит в бит с прежними прогонами конструкции по умолчанию. Чтобы воспроизвести их, используйтеfll_assist = "always". Известный предел: при 35 дБ-Гц передача происходит через 1,9–2,6 с после начала трека, а при 33 дБ-Гц FLL 10 Гц удерживает PLI ниже порога передачи, так что вхождение в захват никогда не завершается. - Новые ключи конструкции петель и API, перечень:
[design.carrier]:fll_assist,fll_off_pli,fll_on_pli,fll_gate_dwell_s;[design.lock]:reacq_window_s,reacq_interval_s,reacq_max_interval_s, при этомmax_reacq_attemptsизменён со значения по умолчанию 3 на необязательный предел (по умолчанию 0);- Rust:
LoopConfig.fll_assist(FllAssist,FllGate),LoopCore::set_fll_enabled,EpochOutput.fll_active,ChannelSummary.final_state.
- Хеш конструкции берётся от канонического вида JSON, а хеш встроенной конструкции по умолчанию —
33261cd171a53803a6c262686e878e01f37d902a93d5918c20a44297b8ef8e80(закреплён тестом). - Замечания о совместимости выходных данных:
- в таблице
iq trackесть завершающий столбецfinal_state; - в CSV
iq sweepесть завершающий столбецdesign_hash, а в его JSON —design_hashиwarnings; mean_cn0_dbhzперебора теперь — среднее по всем обновлениям, у которых есть оценка NWPR (сводка с ограниченным объёмом памяти), а не по второй половине прогона.
- в таблице
- Повторный захват выключен во встроенной конструкции по умолчанию: конечный автомат только наблюдает, а петли работают бит в бит так же, как без него. (Сами петли по умолчанию, однако, изменились: см. выше поддержку FLL.) Включайте его для каждой конструкции (
[design.lock] reacquire = true), флагом--reacquireили черезreacquire=True. - Предупреждение
commensurate_sampling: когда fs отличается не более чем на 1e-6 от кратного половине частоты чипов (iq::track::commensurate_samples_per_chip),iq track/iq sweep(вывод,--summary, JSON перебора), ответ MCPiq_trackи результат Pythoniq_trackпредупреждают, что дрожание и смещение петли кода нерепрезентативны. Первопричина документирована с предварительно зарегистрированными порогами вdocs/design/evidence/dll-jitter/. Ровно при 2 отсчётах на чип с разнесением 0,5 чипа S-кривая DLL представляет собой одну ступень, и петля дрожит: ≈ 0,09 чипа СКО ошибки кода (≈ 26 м) при 45 дБ-Гц против ≈ 0,004 чипа при несоизмеримой частоте. Заниженное примерно на 2 дБ NWPR C/N0 при этой частоте имеет ту же причину. Ровно при 0 Гц Доплера кода и 4 отсчётах на чип код никогда не пересекает мёртвую зону ±0,21 чипа, поэтому смещение фазы кода до примерно 0,2 чипа может сохраняться, не проявляясь в дрожании (измерено: разнесение 0,5 чипа даёт 2,0× ошибки кода контроля при среднем +0,011 чипа; разнесение 0,25 чипа даёт +0,125 чипа); предупреждение охватывает эту частоту. - Известный предел: конструкция по умолчанию не передаёт управление FLL→PLL ниже примерно 35 дБ-Гц (нижняя граница вхождения в захват ~35 дБ-Гц; см. выше поддержку FLL и
docs/design/evidence/carrier-lock/). - Поиск ложного захвата или повторного захвата, который не может быть выполнен (частота без целого числа отсчётов на период кода), больше не останавливает слежение.
- Тесты:
tests/iq_track_engine.rs,tests/iq_cli.rs,iq::track::design::tests,tests/pythonи круговая проверка IQ через MCP.
- Пороги (
Профили C/N0 в синтетических сценах (0.34.0).
iq::channel::cn0_profileзадаёт изменяющийся во времени C/N0 для каждого спутника в собственных сценах Kshana в виде смещений в дБ относительно C/N0 сцены. Формы: ступень, линейное нарастание, кусочно-линейная форма и сеяные замирания Райса, подобные сцинтилляциям, с заданным S4 и временем декорреляции. Они применяются через существующий хук канала сцены (Cn0ProfileChannel, в сочетании с эффектами ионосферы, тропосферы, сцинтилляций и многолучевости), без изменения ядра сцены.cn0_dbhzв файле истины следует профилю.- Поверхности:
kshana iq scene … --cn0-profile <toml>иkshana.iq_scene(…, cn0_profile="<toml>"). - Для чего это нужно: петли, мониторы и оценку кампаний можно испытывать на стрессоустойчивость против известной истины. Меняется только мощность легитимных сигналов.
- Проверки (
tests/iq_cn0_profile.rs). Пороги: средняя интенсивность замираний в пределах 5 % от 1, S4 в пределах 8 % от цели (при S4 = 0,3, 0,7 и 1), корреляция интенсивности выше 0,9 при 0,05 τ и ниже 0,05 при 5 τ; истина — ровно заданный C/N0 плюс профиль; отслеженное падение NWPR C/N0 в пределах 0,7 дБ от ступени в 6 дБ. Измерено: S4 в пределах 1,3 % от цели и отслеженное падение 6,26 дБ.
- Поверхности:
Мониторы обнаружения в тракте IQ (0.34.0, «Lab replay»). Новый модуль
iq::monitor, командаkshana iq monitorи привязкаkshana.iq_monitor(path, ...). Они наблюдают запись и сообщают временные ряды и отмеченные события (время начала, тревоги и конца, пик, порог). Они только обнаруживают и измеряют; ничто здесь не генерирует сигнал.- Полная мощность / AGC: мощность блока и усиление, которое применила бы идеальная АРУ (AGC); отмечает подъёмы и спады.
- Спектр до корреляции: PSD Уэлча по блокам относительно изученного базового уровня. Порог превышения определяется целевой вероятностью ложной тревоги. Также комплексный эксцесс и детектор импульсов. Детектор импульсов считает отсчёты выше порога в каждом блоке и поднимает событие, когда точный верхний хвост биномиального распределения для этого числа ниже
pulse_pfa(по умолчанию 1e-4 на блок), а не когда z-оценка превышает предел: при малых ожидаемых счётах коротких блоков один отсчёт уже составляет несколько сигм. - C/N0 по каналам: два односторонних детектора изменений CUSUM (падение и рост), на которые подаются независимые оценки (шаг задаётся по окну C/N0 петли).
- SQM по корреляторам: разность
(I_E − I_L)/I_Pи отношение(I_E + I_L)/(2 I_P), а также тесты асимметрии по дополнительным корреляторам, когда канал их предоставляет. - Ряды индикаторов захвата: PLI и индикатор частотного захвата по последовательным prompt, как сырые сигналы. Решения о захвате и потере захвата остаются за конечным автоматом захвата движка слежения.
Один потоковый проход (
iq::monitor::run::run_monitors) выполняет всё, с файлом настроек TOML/JSON (MonitorConfig); средство запуска кампаний использует ту же точку входа. Всё имеет статус MODELLED. Каждая статистика проверяется по своей замкнутой форме сеяным моделированием (tests/iq_monitor.rs):- превышения мощности блока относительно гамма-хвоста;
- среднее эксцесса 2 и разброс
2/√N; - доля импульсов
e^{−t}; - длины серий CUSUM относительно приближения Зигмунда (измерено 330 и 8,46 отсчётов против 338 и 8,34);
- индикатор фазового захвата относительно среднего для фазы Райса;
- на отслеживаемом сигнале C/A разброс разности и отношения SQM около 6 % от замкнутых форм первого порядка (измерено 5,97 %; порог теста 12 %).
Формула ложной тревоги по спектральному избытку — приближение; измеренная частота составила 1,3× от формулы. От начала до конца мониторы отмечают:
- ступень C/N0 в 6 дБ (момент изменения в пределах одной оценки);
- отражённый путь, появившийся посреди записи (тест отношения);
- пропадание сигнала (PLI падает с 0,999 до −0,3, а FLI — с 0,93 до 0,03 на его протяжении);
- узкополосный тон и редкие отсчёты с большой амплитудой (спектральный тест, тест импульсов и эксцесса). Это универсальные тестовые входные данные ЦОС, а не модели помех.
Изменено#
iq track/iq sweepпередают поток через новый сеанс (см. «Добавлено»).--csvсохраняет свои столбцы 0,32, но теперь передаётся потоком, поэтому строки нескольких каналов чередуются в порядке времени, а не группируются по каналам.--jsonсохраняет свою форму 0,32 и по-прежнему держит все эпохи в памяти: для длинных записей используйте--epochs.iq sweepизмеряет дрожание по обновлениям во второй половине длительности прогона (раньше — по второй половине числа обновлений), а его CSV/JSON получают столбецdesign_hash.- Таблица трека получает столбец
final_state. - Текст справки больше не утверждает, что
iq trackпринимает флаги приёмного тракта; их применяет толькоiq acquire. - Параметры
acq_noncoherentиdoppler_maxв Pythoniq_trackтеперь по умолчанию равныNone(значения конструкции: 1 и 5000 Гц во встроенной конструкции). Его эпохи получают корреляторы early/late,carrier_phase_cycles,bit_edge,bitиstate, а результат получаетdesignиevents.
Исправлено#
Шаг захвата по умолчанию больше не передаёт слежению за Galileo E1 остаток, который FLL не может втянуть. Шаг
2 / (3 · N · T_code)оставляет при передаче ошибку Доплера до1 / (3 · N · T_code), но двухквадрантный FLL по умолчанию втягивает только1 / (4 T_track). Для каждого кода длительностью 4 мс или больше (N = 1), включая Galileo E1-B и E1-C, остаток (83,3 Гц при 4 мс) выходил за пределы втягивания в 62,5 Гц, и слежение ложно захватывалось на +125 Гц, а индикатор фазового захвата 0,97 это скрывал. Теперь шаг по умолчанию дополнительно ограничен значением0.2 / T_track(kshana::iq::acq::default_step_hz), то есть 0,8 от диапазона втягивания, так что передача остаётся внутри него, даже когда побеждает соседний интервал. (Сначала пробовали 0,4: он давал ложный захват в 1 прогоне из 42 на E1-B, а когерентный поиск GPS L1 C/A в 1 мс выбрал интервал со смещением 350 Гц и захватился на +500 Гц; 0,25 и 0,2 не давали ни одного в тех же прогонах.) Цена: у Galileo E1-B/E1-C интервалы меняются с 166,7 Гц на 50 Гц, 201 интервал в пределах ±5 кГц вместо 61; коды в 1 мс (166,7 Гц,N = 4) не изменились."auto"в конструкции петель означает именно это; явныйdoppler_step_hzили--doppler-stepиспользуется как задан, аiq acquire(без передачи слежению) сохраняет учебниковый шаг. Заголовок эпохи и--summaryтеперь фиксируют для каждого канала разрешённые шаг и полосы петель (resolved). Хеш конструкции по умолчанию не изменился. Изменение вывода: обнаружения на кодах длительностью 4 мс и более могут попадать в другие интервалы Доплера.GPS L2C CM (обновление петли 20 мс) удерживает захват при конструкции по умолчанию. PLL 15 Гц и FLL 10 Гц по умолчанию дают
Bn · T0,3 и 0,2 при T = 20 мс, и петля теряла захват даже при идеальном старте (PLI −0,08, M2M4 15,8 дБ-Гц). Новый ключ конструкцииcarrier.bn_t_max(по умолчанию 0,1) ограничивает шумовые полосы PLL и FLL значениемbn_t_max / T, когда время обновления петли превышает 4 мс (Design::loop_config_for): 5 Гц и 5 Гц при 20 мс, 10 Гц и 10 Гц при 10 мс у BeiDou B1C; коды в 1 мс и 4 мс сохраняют 15 и 10 Гц. Это относится и к явно заданным полосам;bn_t_max = 0отключает его. При значении по умолчанию ключ опускается в каноническом виде, так что хеш по умолчанию не меняется; конструкция с любым другим значением имеет другой хеш. При 45 дБ-Гц L2C CM теперь даёт PLI 0,996, ошибку Доплера 0,00 Гц и M2M4 42,71 дБ-Гц. Известный нерешённый вопрос: NWPR C/N0 там занижен на 1,76 дБ (и на 2,45 дБ у B1C при 10 мс), поэтому T5 матрицы для L2C остаётся игнорируемой находкой.docs/assets/clock-ensemble-band.svgсоздан заново: закоммиченный рисунок устарел относительно собственного сценария (изменение данных, а не перерисовка). График был нарисован 2026-06-02 поscenarios/clock-ensemble.toml; двумя днями позже 67fed19e задал в этом сценарии полы фликкерного FM (квантовыеflicker_floor = 1e-16, CSACflicker_floor = 2e-11), и рисунок так и не был перерисован. Он показывал прогон до введения полов: ось y от 0 до 47 нс, p95 перерыва CSAC по прогонам от 10,5 до 47,6 нс (среднее 25,2 нс), классический holdover 4050 с в среднем. Сценарий в поставляемом виде (как уже указано в руководстве и в сводке CLI) даёт ось y от 0 до 407 нс, p95 CSAC по прогонам от 40,8 до 374,0 нс (среднее 167,0 нс), классический holdover 844 с [от 220 до 2130 с]; линия спецификации 20 нс стоит на тех же 20 нс на оси примерно в девять раз выше. Движок не изменился: сегодняшний движок на файле сценария от июня точно воспроизводит ось старого рисунка. На этот рисунок нет ссылок из README и документации.
Известные ограничения#
- NWPR C/N0 занижается при высоком C/N0·T на prompt, а BOC(1 1) при 5 МВыб/с теряет около 1 дБ. NWPR не имеет смещения на идеальных prompt, но собственное дрожание PLL петли стоит около подогнанного 8 дБ × Bn·T (одна сцена, четыре точки: −0,24/−0,44/−0,77/−1,58 дБ при 1/2,5/5/10 Гц и 20 мс; около −1 дБ при
bn_t_max = 0.1по умолчанию); M2M4 нечувствителен. Данные BeiDou B1C при 5 МВыб/с также теряют около 1 дБ мощности prompt из-за ограничения полосы (используйте 10 МВыб/с или больше). Ни то ни другое не является дефектом оценщика; строки T5 матрицы сигналов для GPS L2C и BeiDou B1C остаются игнорируемыми находками с этими причинами.
[0.33.1] - 2026-10-08#
Безопасность#
- Укреплены текст графиков и приём графиков в Studio. Текст, который сценарий переносит в создаваемый график, теперь единообразно экранируется одной общей процедурой, а Studio принимает из графика только разметку рисунка. Параметры адреса Studio, поиск по ключу вида и загрузка сценариев ограничены известными значениями. Встроенные графики, записанные результаты и опубликованные числа не изменились. Обновление рекомендуется всем, кто открывает файлы сценариев из ненадёжных источников в Studio или встраивает создаваемые графики в веб-страницы. Уведомление: GHSA-h25h-cg9f-v2cg.
[0.33.0] - 2026-10-08#
Документация#
- Область помех и спуфинга в слое IQ, изложенная точно. Записи 0.31.0 и 0.32.0 ниже говорят, что слой IQ добавляет «никакого синтеза формы сигнала помех или спуфинга». Это верно для самого слоя IQ (
iq::sceneсоздаёт только легитимные сигналы GNSS), но читалось как утверждение обо всём движке, а это не так: начиная с 0.29.0 раздел[iq]видаspectrumзаписывает снимок SigMF своей аналитической модели с заданными источниками подавления (шумоподобные источники — по интервалам, тоны и чирпы — как формы сигнала), аspoof_captureсуммирует в памяти сигнал подлинной и спуферной реплик, чтобы проверить захват петлёй (составной сигнал никогда не записывается). Кроме того, начиная с 0.20.0 движок содержит программный приёмник GNSS (sdr: захват и слежение; начиная с 0.31.0 такжеiq::acqиiq::track). Ничто в Kshana не передаёт и не управляет радиооборудованием. Строка состояния в README,docs/POSITIONING.md,docs/SPECTRUM.mdи записки о проекте IQ теперь говорят об этом; выпущенные записи оставлены такими, какими были опубликованы. Поведение не меняется. - Известное ограничение: соизмеримая дискретизация. При частоте дискретизации, кратной частоте чипов на целое или полуцелое число, отсчёты приходятся на одни и те же фазы чипа в каждом чипе, и дискриминатор кода превращается в ступенчатую функцию. На синтетическом сигнале GPS L1 C/A при 45 дБ-Гц с разнесением 0,5 чипа 2,046 МГц (2 отсчёта/чип) даёт ≈ 0,09 чипа (≈ 26 м) СКО ошибки кода и смещение −0,09 чипа против ≈ 0,003 чипа при несоизмеримой частоте. NWPR C/N0 там занижен примерно на 2,4 дБ. При 4,092 МГц результат зависит от разнесения и доплера кода. При 0,5 чипа он безвреден при доплере 1500 Гц, но даёт 2× со смещением 0,011 чипа при 0 Гц, а при 0,25 или 0,1 чипа ошибка кода в 8–10× больше. На слежение за несущей это не влияет. Измерения приведены в
docs/design/iq-notes/receiver.md.
Добавлено#
Слой IQ GNSS на сервере MCP (фаза B.1).
kshana-mcpполучает шесть инструментов, управляющих слоемkshana iqсо стороны агента:iq_signals(допустимые имена сигналов и настройка IQ),iq_info(описание записи),iq_scene(создание сцены с заданным профилем или с эфемеридами вещания, с необязательным каналом на уровне сигнала),iq_acquire(БПФ-захват, при желании за каскадами приёмного тракта),iq_track(захват, затем банк DLL/PLL/FLL) иiq_frontend(полосовой фильтр, режекция, бланкирование, вырезание, АРУ, квантователь). Отсчёты IQ никогда не пересекают протокол: каждый инструмент принимает пути к файлам внутри одного рабочего каталога, заданного черезKSHANA_MCP_IQ_DIR(если не задан, файловые инструменты IQ выключены, а все остальные инструменты не затронуты), отклоняет пути, которые разрешаются за его пределами, и выходные файлы, которые уже существуют, если не заданoverwrite, до начала любой работы применяет бюджет отсчётов на вызов (KSHANA_MCP_IQ_MAX_SAMPLES, по умолчанию 50 000 000), отклоняет неизвестные аргументы и отвечает компактной сводкой JSON (обнаружения, C/N0, состояние захвата и каждый записанный файл с числом байтов). Выходные данные по эпохам идут только в файлы, названные вызывающим. Инструменты выполняют тот же путь кода, что и CLI, через новый публичный шовkshana::iq::cli::execute, который возвращает сообщение CLI вместо того, чтобы печатать его (stdout — это канал MCP JSON-RPC);iq::cli::build_codeиiq::cli::signal_namesтеперь тоже публичны. Только программное обеспечение и только дополнения: слой IQ не добавляет синтеза помех или спуфера, ничто никогда не передаётся, новых зависимостей нет.server.jsonобъявляет две переменные окружения. Круговые тесты вmcp/kshana-mcp/tests/iq_round_trip.rsсоздают короткую сцену из двух спутников и проверяют захват по файлу истины самой сцены, захват слежением и C/N0, приёмный тракт, вывод SigMF, бюджет, ограничение путей и выключенное состояние.Слой IQ GNSS в реестре верификации. Предварительно зарегистрированная перекрёстная проверка по gps-sdr-sim (независимому генератору GPS L1 C/A в основной полосе, MIT, коммит 28ca29a6) теперь входит в постоянно включённый набор тестов (
tests/iq_gpssdrsim_cross_generator.rs). Её закоммиченные эталонные данные (tests/fixtures/iq_gpssdrsim_cross_generator/: 20 мс собственных 8-битных I/Q gps-sdr-sim, перечень каналов и состояние каналов за ними из обвязки, скомпонованной с той же сборкой) пересоздаются скриптомscripts/gen_iq_gpssdrsim_ref.sh. Во время теста сеть и внешний инструмент не нужны. Добавлены две строки реестра (251 строк: 124 Validated, 123 Modelled, 4 Partner):- Геометрия сигнала сцены IQ GNSS относительно независимого генератора основной полосы: Validated. Истина сцены (видимый набор, псевдодальность, фаза кода, Доплер, углы обзора) для сцены с эфемеридами вещания совпадает с состоянием каналов gps-sdr-sim на всех 11 каналах: наихудшие 1,6 мм, 5.5e-6 чипа, 7.4e-5 Гц, 4e-9 градуса при порогах 0,05 м, 2e-4 чипа, 0,02 Гц и 1e-4 градуса, зафиксированных до прогона.
- Захват IQ GNSS на независимо созданных отсчётах I/Q: Modelled, с находкой.
iq::acqнаходит каждый смоделированный спутник в отсчётах gps-sdr-sim в пределах зарегистрированных порогов (фаза кода в пределах 0,195 чипа, Доплер в пределах 72 Гц). Зарегистрированный порог «никакой другой PRN не обнаружен», однако, не выполняется: на не содержащем шума выводе gps-sdr-sim порог для гауссова шума пересекается взаимной корреляцией других спутников для всех 21 отсутствующих PRN. Строгий тест сохранён, проигнорирован с этой находкой, а закреплённый тест её фиксирует. Код движка и публичный API не меняются. Отсчёты I/Q не сравниваются отсчёт за отсчётом: целочисленная таблица синусов gps-sdr-sim, коэффициенты усиления, нулевая начальная фаза несущей и усечённые поля LNAV — это не те величины, по которым приёмнику нужно согласовываться. Сравнение выполняется по наблюдаемым величинам, которые измеряет приёмник.
Изменено#
iq trackпо умолчанию передаёт управление после захвата длительностью ≈4 мс (изменение поведения). Захват, инициализирующий каждый канал слежения, теперь когерентно интегрируетceil(4 ms / T_code)периодов кода вместо одного, гдеT_code— полный период кода (произведение длин первичного и вторичного кодов для многоуровневого кода, единица, по которой интегрирует захват). Неуровневые коды в 1 мс (GPS L1 C/A, BeiDou B1I, GLONASS L1OF) теперь ищут по 4 периодам (4 мс), поэтому доплеровский шаг по умолчанию2 / (3 · N · T_code)составляет ~167 Гц вместо ~667 Гц. Каждый код, чей полный период уже 4 мс или больше, сохраняет 1 период: Galileo E1-B (4 мс), BeiDou B1C (10 мс) и многоуровневые GPS L5-I/L5-Q, Galileo E5a-I/E5a-Q и E1-C (от 10 до 100 мс с их накладываемыми кодами), а также GPS L2C. Поэтому каждый сигнал интегрирует не менее ~4 мс. Поиск по одному периоду мог передать канал со смещением до ~333 Гц, за пределами втягивания FLL, и тогда канал отслеживал ложный захват в ~500 Гц от истинного, сообщая о чистом треке. На сеяном переборе из 180 каналов GPS L1 C/A (Доплер в пределах ±5 кГц, от 38 до 47 дБ-Гц, у половины — навигационные данные;docs/design/evidence/iq-track-acq-default/, можно повторить) ложные захваты падают с 27 из 180 до 1 из 180, а пропущенные захваты — со 102 до 11 при ~40 мс дополнительного поиска на PRN в GPS L1 (11 → 52 мс). Единственный оставшийся ложный захват — при 38 дБ-Гц, со смещением 36 Гц. Все поверхности согласуются:kshana iq trackиkshana iq sweep(--acq-coherent), Pythonkshana.iq_track(acq_coherent=Noneтеперь автоматический; заглушка обновлена) и инструмент MCPiq_track. Пользователи, полагавшиеся на прежнее значение по умолчанию, могут передатьacq_coherent=1(--acq-coherent 1). Собственное значение--coherentпо умолчанию уkshana iq acquireостаётся 1. Новые публичныеiq::acq::auto_coherent_periodsиiq::acq::AUTO_COHERENT_S; регрессионный тестtests/iq_cli.rs::track_default_handoff_does_not_false_lock_where_one_period_did.- Каждая создаваемая графика теперь следует теме Observatory сайта: байты каждого графика меняются. Это намеренный пересмотр опубликованных рисунков, только цветов и шрифтов; ни одно нанесённое значение, координата или подпись не сдвинулись.
*.chart.svgкаждого сценария (а значит, экспорт графиков Studio и демонстрационные графики README), HTML-отчёт о прогоне (*.report.html), анимация временной шкалы (--animate), страницы результатов сценариев и исследований в HTML, сводка проверки, а также рисунки и схемы в документации использовали тёплую тёмную июльскую палитру (фон#0c0b08, золото#e0bd84) и тёплую бумажную тему отчёта. Теперь они берут каждый цвет и шрифт из одного модуля,src/palette.rs, который отражаетweb/theme.css: графики рисуются в приборно-тёмной гамме на фоне Observatory (#060A14) шрифтами Geist; отчёт, проигрыватель анимации и страницы результатов следуют светлой/тёмной настройке зрителя с светлыми и тёмными токенами Observatory. Шесть областей отказа сохраняют по одному цвету (помехи — коралловый, спуфинг — пурпурный, синхронизация времени — синий, орбиты — голубой, целостность — лаймовый, навигация — янтарный), а уровни доказательств читаются так: validated — лаймовый, modelled — янтарный, partner — пурпурный. Градиенты водопадов сохраняют свой перцептивный порядок (inferno), заново привязанный к новому фону.tests/palette_sync.rsудерживает модуль в соответствии сweb/theme.cssв обеих темах, проверяет актуальностьdocs/assets/palette.jsonиdocs/diagrams/mermaid-config.json(оба порождаются из модуля, для инструментов построения рисунков на Python и mermaid-cli) и завершается ошибкой, если вsrc/вне палитры встречается шестнадцатеричный литерал цвета.tests/published_figures_still_reproduce.rsполучает третий диагноз, «сдвинулись только цвета и шрифты», чтобы пересмотр палитры отличался от сдвига нанесённого значения. Каждый заново построенный график README проверен как равный своему предшественнику при этом нормализаторе.tools/gen_validation_figures.pyчитает палитру и теперь также создаёт три рисунка результатов README, у которых не было зафиксированного генератора (domain-coverage-map,scenario-fom,sgp4-regime-bars), с настоящими текстовыми элементами, изweb/capabilities.json, результатаclock-holdoverиtests/fixtures/sgp4_comparison.md.tools/gen_readme_assets.pyчитает ту же палитру, что исправляет его отклонение светлой темы от сайта. Значенияsgp4-regime-bars— это столбец наихудшего случаяkshana↔refэтого тестового набора (7.31e-9, 8.05e-9, 8.18e-9 и 4.12e-6 км), без изменений относительно рисунка Matplotlib, аtests/figures_doc_sync.rsтеперь завершается ошибкой, если зафиксированный рисунок и тестовый набор расходятся.
docs/assets/figures/domain-coverage-mapобновлён до текущих данных (изменение данных, а не перекраска). Рисунок указывал 28 возможностей в 8 областях (11 validated, 17 modelled), что устарело относительно его же заявленного источника; построенный теперь своим новым генератором изweb/capabilities.json, он показывает 46 возможностей в 8 областях (17 validated, 29 modelled).
Исправлено#
Q для CW/узкополосного источника помех теперь 1,0, а не 1,5. Значение из учебников для тона на несущей равно 1 (тон сохраняет спектральный пик сигнала,
κ = T_c,Q = 1/(R_c κ)); прежнее 1,5 делало тон менее вредным, чем широкополосный шум при равном J/S. Изменение выходных данных: примерно −1,8 дБ эффективного C/N0 при CW/узкополосных источниках помех и высоком J/S в видахjamming,lunar-jammingи interop (тон входящего в поставку примераspectrum: 17,98 дБ-Гц по таблице, было 19,74). Широкополосное Q остаётся 1,0 (консервативно, примерно на 3 дБ ниже учебникового ~2) до пересмотра в 0,34. Задайтеq_override, чтобы сохранить прежнее 1,5.Целочисленный вывод
kshana iq sceneиспользует целочисленный диапазон. При шуме единичной мощности и масштабе записи 1 сценыci8/ci16получались примерно как {-1, 0, 1}, а у 2-битных сцен пороги находились на 2,8 сигма. Целочисленные форматы теперь масштабируются так, чтобы ожидаемое среднеквадратичное значение по компоненте составляло четверть полной шкалы (31,75 LSB в ci8, 8191,75 в ci16) или 2 LSB в 2-битном. Масштаб и число обрезанных элементов выводятся и записываются в sidecar. Вывод с плавающей точкой не изменился.Восемь закреплённых тестовых данных в семи тестовых файлах больше не падают на macOS из-за различий в последнем бите (часть issue #36). Закрепления, проверяющие, что движок по-прежнему строит зафиксированные входные данные оракула (якобианы, таблицу состояний, азимуты пуска), сравнивались бит в бит и на macOS arm64 не проходили на 2 — несколько тысяч единиц в последнем разряде. Теперь они сравниваются в пределах 1e-12 от масштаба, взятого из тестового набора; целые числа, ключи и длины по-прежнему сравниваются точно, а тест мутаций показывает, что относительное изменение 1e-6 по-прежнему не проходит. Закрепление азимута пуска сравнивает
sin azи ветвь восходящая/нисходящая вместо самого азимута, потому чтоasinусиливает один ulp своего аргумента примерно до 3e-9 рад там, где наклонение равно дополнению широты пункта. Ни допуск оракула, ни предварительно зарегистрированный порог не изменились. Два теста (совместное определение орбиты на Луне, наблюдаемость на Луне) не охвачены: на macOS сами их предварительно зарегистрированные сравнения сдвигаются, и это оставлено на последующую работу.kshana iq trackиkshana iq sweepприменяют флаги входного тракта. Текст справки объявлял--bandpass/--notch/--blank/--excise/--agc/--bitsдляtrack, ноtrackиsweepникогда не строили цепочку: флаги молча игнорировались, а флаг без значения, такой как--notch, поглощал следующий за ним флаг. Обе команды теперь разбирают их так же, какiq acquire, и ставят новую цепочку входного тракта перед проходом захвата и проходом сопровождения. Вывод равен результату запуска команды на файле, которыйiq frontendзаписывает для тех же флагов.Данные сцены IQ размещаются для каждого сигнала отдельно.
kshana iq scene --data(иNavData::Seeded) помещали биты со скоростью 50 бит/с на каждый сигнал, включая пилотные, и со скоростью GPS LNAV на Galileo и BeiDou. Теперь данные следуют собственной символьной синхронизации каждого сигнала, заданной новымSpreadingCode::data_modulation()(DataModulation, задаётся каждым конструктором вiq::signals). Это 10 мс на L5-I5, 4 мс на E1-B, 2 мс на BeiDou B1I GEO (D2) и биты по 20 мс с меандром 10 мс на ГЛОНАСС L1OF. Данные отвергаются на пилотных сигналах, на GPS L2C как одном потоке CM/CL, аNavData::Lnav— на всём, кроме L1 C/A. Пользовательские коды по умолчанию сохраняют прежнюю синхронизацию 20 мс. ПрограммныйScene, запрашивавшийNavData::Lnavдля кода не L1 C/A илиNavData::Seededдля пилотного сигнала, раньше генерировал данные молча, а теперь возвращает ошибку при первом чтении.Каналы ГЛОНАСС L1OF захватываются и сопровождаются на собственной несущей FDMA.
iq::acq::acquireи каналы сопровождения переносили каждый код вниз только наif_hz. Поэтому в многоканальной записи ГЛОНАСС поиск канала +3 находил сигнал канала 0 (все каналы используют один дальномерный код) и никогда не смотрел на 1,6875 МГц выше. Теперь оба используютSampleSpec::baseband_hz(carrier) = if_hz + (carrier − center_hz). Член несущей равен нулю для любой записи с центром на собственной несущей сигнала и опускается, когда центр неизвестен, поэтому обработка CDMA не изменилась. Если вы обходили прежнее поведение, включаяcarrier − centerвif_hzsidecar, уберите этот член: смещение теперь применяется по несущей и центру, так что его сохранение применяет его дважды. Известное ограничение, здесь не изменённое: сцена ГЛОНАСС определяет каждый спутник по его частотному каналуk, а идентификатор спутникаu32оборачивает отрицательный канал. Sidecar истины записываетk = -7какsat_id4294967289 (k + 2^32). Читайте его обратно какkс приведением кi32.
[0.32.0] - 2026-10-05#
Добавлено#
- Слой IQ GNSS в командной строке и Python (0.32.0, этап A). Существующий модуль
iqтеперь можно использовать без написания кода на Rust. В группу обработки данных входят пять новых командkshana iq:sceneсоздаёт в файле длинную многоспутниковую сцену IQ с sidecar истины;acquireвыполняет FFT-захват одного или нескольких PRN по записи и сообщает каждое обнаружение (PRN, Доплер, фаза кода, статистика, порог);trackсначала захватывает, затем пропускает запись через набор DLL/PLL/FLL и выдаёт выходные данные сопровождения по эпохам (CSV/JSON) с настраиваемыми полосами контуров, временем интегрирования и разносом корреляторов;sweepвоспроизводит одну запись через несколько конструкций контуров и сообщает полученные метрики дрожания и захвата для каждой; аlabfitподгоняет модель потери захвата контура сопровождения к временно́й шкале receiver-trust. То же ядро доступно из Python (kshana.iq_scene,iq_acquire,iq_track,iq_labfit,iq_signals) и возвращает списки и словари, удобные для NumPy. Только программное обеспечение и аддитивно: без новых зависимостей, без передачи, без синтеза волновых форм помех или спуфинга; движок, захват, сопровождение и конструкции контуров принадлежат самому крейту, поэтому вызывающая сторона CLI или Python получает те же биты, что и тесты Rust. Новый модульiq::cli; собственный sidecar истины сцены служит независимым оракулом вtests/iq_cli.rs(захват восстанавливает каждую внесённую фазу кода и Доплер, сопровождение сходится к внесённому Доплеру). Ни опубликованное число видов сценариев, ни строки матрицы верификации не меняются. - Остальные возможности библиотеки IQ GNSS в CLI
iqи Python (0.32.0, этап A.2). Опирается на этап A и выводит остальную часть слояiqбез написания кода на Rust:- Канал распространения в
iq scene(и вiq_sceneна Python): ионосфера первого порядка (--iono-stec/--iono-vtecили--iono-klobuchar), тропосфера Саастамойнена/Ниэлла (--tropo), модель сцинтилляций Корнелла (--s4,--scint-tau0,--sigma-phi), зеркальная многолучевость от земли (--multipath-height/--multipath-ground), трёхсостоянный наземный подвижный канал (--land-mobile) и блок отсутствия прямой видимости (--nlos) применяются к каждому спутнику через новый внутренний мост крейта (iq::channel::SceneChannelAdapter), который преобразует абсолютные пути моделей канала в форму сцены «превышение над геометрией». - Вывод SigMF в
iq scene(--format sigmf): записывает отсчёты в виде пары.sigmf-data/.sigmf-metaс захватом и аннотациями по каждому спутнику;acquire/trackуже читают SigMF, так что сцена проходит круговой обмен. - ЦОС входного тракта: новая команда
iq frontend <in> <out>и те же флаги вacquire/track(--bandpass,--notch,--blank,--excise,--agc,--bits1/2/3/8/14) запускают стадииiq::frontend(полосовой КИХ-фильтр, адаптивный режектор, гашение импульсов, исключение в частотной области, АРУ, квантователь); в Python отражено какiq_frontend. - Сцены по вещаемым эфемеридам:
iq scene --nav <rinex_nav> --rx-pos lat,lon,alt(с--start/--window/--prn) помещает каждый исправный спутник GPS в его истинную вещаемую геометрию с помощью читателя RINEX движка, так что sidecar истины несёт настоящую дальность, Доплер и фазу кода для каждого спутника; в Python отражено какiq_scene_broadcast. Только программное обеспечение и аддитивно: без новых зависимостей, без передачи, без синтеза волновых форм помех или спуфинга (эффекты распространения в канале действуют только на легитимный сигнал). Каждое числовое утверждение проверено относительно независимого эталона (замкнутая форма или внесённая истина) в модульных тестах канала и входного тракта и вtests/iq_cli.rs.
- Канал распространения в
[0.31.0] - 2026-10-04#
Добавлено#
- Слой IQ GNSS: моделирование на уровне сигнала и обработка программным приёмником. Новый модуль
iqпереводит Kshana от односпутникового входного тракта L1 C/A с короткими блоками к полноценному слою уровня сигнала, доступному из группы командkshana iq. Он создаёт длинные многоспутниковые сцены сырого IQ с sidecar истины по эпохам (iq::scene); применяет распространение на уровне сигнала — ионосфера с расхождением кода и несущей, тропосфера, амплитудные и фазовые сцинтилляции (модель Корнелла), многолучевость Френеля и трёхсостоянный наземный подвижный канал, с отсутствием прямой видимости (iq::channel); выполняет захват и сопровождение с FFT-захватом и многоканальным набором DLL/PLL/FLL, пропуская одну запись через множество конструкций контуров (iq::acq,iq::track); моделирует входной тракт — КИХ/БИХ-фильтрация, квантование от 1 до 14 бит, АРУ, режекция, гашение импульсов и исключение в частотной области (iq::frontend); потоково обрабатывает большие записанные наборы данных в ограниченной памяти — форматы int8/int16/float32/упакованные 2-битные и реальные ПЧ, многофайловый SigMF, передискретизация, опись набора данных с SHA-256 для каждого файла и пакетный запуск (iq::io); добавляет расширяющие коды для GPS L5/L2C, Galileo E1 (CBOC, настоящие коды памяти из ICD) и E5a, BeiDou B1C/B1I и ГЛОНАСС L1OF, каждый проверен по своему документу управления интерфейсом (iq::signals); и подгоняет модель потери захвата контура сопровождения к наблюдаемому поведению реального приёмника в лабораторных прогонах, с ошибкой отложенной выборки по принципу «оставить один прогон» и экстраполяцией, помеченной как прогноз (iq::labfit). Каждое числовое утверждение проверено относительно независимого эталона (таблица ICD, замкнутая форма или независимый приёмник, восстанавливающий внесённую истину); физические модели канала и контуров остаются MODELLED. Это только программный слой: он записывает файлы IQ для программных приёмников и не синтезирует волновые формы помех или спуфинга и не управляет радиооборудованием. Ни опубликованное число видов сценариев, ни строки матрицы верификации не меняются. Проект:docs/design/GNSS-IQ-PLAN.md. - Доверие к приёмнику: оценка журнала реального приёмника GNSS.
kshana receiver-trust <scenario.toml>читает журнал u-blox UBX, RINEX 3 (с необязательным навигационным файлом вещания), Android GnssLogger или NMEA 0183 в одну временну́ю шкалу с метками времени и запускает над ней мониторы доверия: падение отношения несущая/шум (C/N0), потеря захвата, автоматическая регулировка усиления (АРУ), индикатор подавления u-blox, скачок положения и, при RINEX и навигации, собственное одноточечное решение движка с проверкой автономной целостности приёмника (RAIM) по чётности и монитор с помощью часов. Каждая эпоха признаётся номинальной (nominal), ухудшенной (degraded) или недоверенной (untrusted), и результат сообщает, когда и почему. События и прогнозируемые падения C/N0, заданные в сценарии, оцениваются по допускам, заданным в том же файле: обнаружено, с опозданием или пропущено, а также согласуется или расходится. Результат — JSON результата, CSV по эпохам и график; результат несёт SHA-256 журнала и каждый порог. Также доступно из Python (kshana.receiver_trust), пакета WebAssembly (receiver_trust, журналы встроены) и нового инструментаassess_receiver_logсервера Model Context Protocol (MCP). Руководство:docs/RECEIVER-TRUST.md; пример:examples/receiver-trust/. На журналах спуфинга JammerTest 2024 путь движка воспроизводит первую тревогу предварительно зарегистрированного конвейера оракула при каждом опубликованном начале (tests/receiver_trust_jammertest.rs). Мониторы остаются MODELLED; строки матрицы верификации не меняются.
0.30.0 - 2026-10-03#
Малый выпуск. Раунды валидации 2 и пакеты wave-1 переводят матрицу верификации с 223 строк (93 VALIDATED) в 0.29.3 до 249 строк (123 VALIDATED, 122 MODELLED, 4 PARTNER); каждое повышение проверено относительно независимого оракула при допуске, зафиксированном до прогона, а каждое расхождение опубликовано как результат. Новое: собственный читатель ядер NAIF и путь DE440, один валидированный путь распространения и времени от SGP4 к ITRS, библиотека измеренных часов, эталонный генератор LunaNet AFS, решатели повышенной точности и квадратно-корневые информационные решатели и реальная обработка лунного IQ на данных LuGRE. Опубликованные числа, которые изменились, перечислены ниже как редакции.
Двадцать семь строк матрицы верификации становятся VALIDATED после того, как независимый оракул согласился в пределах допуска, зафиксированного до первого сравнения (правило повышения в docs/VALIDATION.md): десять в первом раунде валидации и семнадцать во втором. Пятьдесят одна строка MODELLED была предъявлена внешнему оракулу в первом раунде, а остальные поддающиеся маршрутизации — во втором; каждое расхождение записано ниже как результат, а не подогнано. Три строки были разделены, чтобы валидированная часть не несла невалидированного остатка, что переводит матрицу с 223 на 226 строк; пакеты валидации, внесённые с тех пор, доводят её до 249. Числа считываются из сгенерированного docs/VERIFICATION-MATRIX.md.
| 0.29.0 | после раунда 1 | Не выпущено | |
|---|---|---|---|
| Строки матрицы верификации | 223 | 223 | 249 |
| из них VALIDATED относительно внешнего оракула | 83 | 93 | 123 |
| из них MODELLED | 136 | 126 | 122 |
| из них PARTNER | 4 | 4 | 4 |
Сокращения, используемые в этой записи
| Сокращение | Значение |
|---|---|
| ADD, ARAIM, MAAST | Airborne Design Document (для ARAIM); усовершенствованный мониторинг автономной целостности приёмника; средство моделирования доступности алгоритмов на Matlab (Matlab Algorithm Availability Simulation Tool) Стэнфордского университета |
| ADEV, VRW, ARW | девиация Аллана; случайное блуждание скорости; случайное блуждание угла |
| ANISE, SPICE, NAIF, PCK | инструментарий астродинамики с открытым исходным кодом (Nyx Space); инструментарий NASA Spacecraft, Planet, Instrument, C-matrix, Events из её Navigation and Ancillary Information Facility; ядро планетарных констант |
| BCRS, TDB, TT | Барицентрическая небесная система отсчёта; барицентрическое динамическое время; земное время |
| BIPM, UTC(k) | Международное бюро мер и весов; реализация всемирного координированного времени отдельной лабораторией |
| CCSDS, OEM, LTC, TCL | Консультативный комитет по космическим системам передачи данных; Orbit Ephemeris Message; лунные системы времени, записываемые в поле TIME_SYSTEM сообщения |
| CRLB | нижняя граница Крамера–Рао |
| CW | относительное движение Клохесси–Уилтшира |
| DE440 | Эфемериды разработки 440 Лаборатории реактивного движения |
| DOP, PDOP | геометрический фактор DOP (ухудшение точности); геометрический фактор DOP по положению |
| EKF, UKF, INS, GNSS, IMU | расширенный фильтр Калмана; фильтр Калмана с сигма-точками; инерциальная навигационная система; глобальная навигационная спутниковая система; инерциальный измерительный блок |
| EMT, VPL, HPL | эффективный порог монитора; вертикальный и горизонтальный уровень защиты |
| EOP, IERS, PCC, MAE | параметры ориентации Земли; Международная служба вращения Земли и референцных систем; Prediction Comparison Campaign; средняя абсолютная ошибка |
| ERFA, SOFA | Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy |
| GMAT | General Mission Analysis Tool от NASA |
| NTN, SSB | нетеррестриальная сеть (3GPP); блок сигналов синхронизации |
| IGS, ILRS, ITRF2020 | Международная служба GNSS; Международная служба лазерной локации; Международная земная система отсчёта 2020 |
| ILS, LAMBDA | целочисленный метод наименьших квадратов; Least-squares AMBiguity Decorrelation Adjustment |
| ISB | межсистемное смещение |
| LEO | низкая околоземная орбита |
| MHSS, PL, TPL | разделение решений по множественным гипотезам; уровень защиты; уровень защиты по времени |
| PSD, IQ, SigMF | спектральная плотность мощности; синфазные и квадратурные отсчёты; Signal Metadata Format |
| QPN | шум квантовой проекции |
| RAIM | автономный контроль целостности приёмника |
| SBAS, WAAS, DFMC, GEO | спутниковая система функционального дополнения; американская широкозонная система дополнения WAAS; двухчастотная многогруппировочная; геостационарный спутник SBAS |
| RMS, SISRE | среднеквадратичное значение; ошибка дальности сигнала в космосе |
| RTKLIB | библиотека позиционирования GNSS с открытым исходным кодом |
| TCXO | кварцевый генератор с температурной компенсацией |
| VLBI | радиоинтерферометрия со сверхдлинной базой |
Validated#
Каждая строка ниже называет вид своего оракула (Library: независимая сторонняя библиотека, вычисляющая однозначно определённую величину; Measured: реальные измеренные данные; P2: независимая численная библиотека, пересчитывающая величину линейной алгебры на зафиксированных входных данных), оракул, допуск, зафиксированный до прогона, и результат. Каждое повышение было повторно проведено вторым рецензентом, который побайтно воспроизвёл тестовый набор и показал, что намеренная мутация движка делает тест красным.
- Слияние датчиков GNSS/INS (Library) в рамках слабосвязанного EKF по вектору ошибок с 15 состояниями: NaveGo v1.4 (LGPL-3.0, запускался в GNU Octave) на собственном реальном проезде с IMU/GNSS Ekinox. Среднеквадратичные значения Kshana по горизонтали, вертикали и инновации положения составляют 0,912, 0,940 и 0,861 от значений NaveGo (порог 1,2), а её среднее нормированное нововведение равно 0,395 (порог 1,5). GNSS присутствует на всём проезде, поэтому перерыв не проверяется. Тесно связанный UKF и связанный фильтр часов остаются за пределами утверждения.
- Бюджет ошибки ориентации и наведения с 3 степенями свободы (Library), суженный до пика гравитационно-градиентного момента: Basilisk 2.9.1 GravityGradientEffector, 40 случаев, в пределах 1e-12 относительно (наихудшее 2.1e-15). Бюджет наведения RSS — сумма заданных вызывающей стороной чисел и остаётся вне его.
- Совместная геометрия лунной связи и навигации (Library), суженная до размещения пункта, азимута, угла места и дальности: ANISE 0.10.2, 768 выборок, в пределах 1e-6 град. и 1 мм (наихудшее 2.2e-12 град. и 5.6e-9 м). Параметр точности дальности — входной параметр проекта и остаётся вне утверждения.
- Динамика ориентации твёрдого тела без момента (Library): центральный блок космического аппарата Basilisk 2.9.1, 1e4 с на двух общих тензорах инерции, кватернион и скорости в пределах 1e-9 (наихудшее 3.3e-11 и 3.4e-12 рад/с).
- Разрешение целочисленных неоднозначностей фазы несущей GNSS (LAMBDA) (Library), суженное до решения ILS и двух его лучших норм: RTKLIB v2.4.2-p13
lambda(), 300 ковариаций, 0 целочисленных расхождений, нормы в пределах 1e-9 относительно (наихудшее 5.6e-13). Частота успехов по бутстрепу по-прежнему проверяется только внутренне. - Составной PL по времени, скалярный MHSS (P2): numpy 2.3.5 и scipy 1.18.1 на 300 зафиксированных входных данных, PL в пределах 1e-9 относительно (наихудшее 1.2e-10), определяющее подмножество идентично.
- Выбеливание общего режима в GLS и тождество Махаланобиса (P2): LAPACK из numpy 2.3.5 на 201 зафиксированных ковариациях, в пределах 1e-12 относительно (наихудшее 7.9e-16); числа обусловленности до 19,3.
- Поставщик ориентации лунных главных осей из DE440 (Library): SPICE
pxformна двоичном PCK в 2 000 эпохах вне узлов, в пределах 1.7e-5 рад (наихудшее 1.7e-6 рад, около 3 м на поверхности), после исправления, указанного в разделе «Исправлено». - Ввод и вывод записей SigMF и спектры Уэлча (Library), суженные до чтения и записи SigMF и
welch_psd: scipy 1.18.1signal.welchв пределах 1e-12 относительно на каждый бин (наихудшее 6.0e-14); записи sigmf-python 1.13.0 декодируются побитно идентично; метаданные крейта соответствуют схеме SigMF v1.2.6. Синтез IQ и его сравнения с моделью остаются вне этого утверждения. - Подгонка вещаемых эфемерид LEO и SISRE в зависимости от интервала подгонки (Measured), суженная до 16-параметрической кеплеровой подгонки и её SISRE только по орбите: точные орбиты TU Graz ITSG четырёх спутников против статистики Liu et al. 2025, компоненты в пределах 1.5x (0,804–1,087) и SISRE в пределах 1.5x (0,716–0,809).
Результаты#
Оракул не согласился с этими строками, поэтому они остаются MODELLED. Каждый результат также записан в текст оракула строки (и тем самым в docs/MODELLED-RATIONALE.md) вместе с тестом, который его закрепляет.
- Оценивание состояния бортовых часов: на отложенных часах IGS 11 спутников GPS Block IIF трёхсостоянный фильтр согласован на один шаг вперёд, но чрезмерно уверен через один час у 9 из 11 (периодические члены и члены фликкера в модель не входят).
- Обнаружение спуфинга: на JammerTest 2024 ни один монитор на уровне наблюдаемых не поднял тревогу в пределах 10 с ни от одного из 8 опубликованных начал, а три окна до начала содержали ложные тревоги.
- Уровень защиты по времени при спуфинге: измеренная необнаруженная ошибка времени превышает TPL при 3 из 8 обнаруженных начал (от 1.9x до 5.3x); калибровка часов за 60 с не покрывает блуждание TCXO приёмника.
- Окно пуска и геометрия набора высоты: относительно Orekit 12,2 геометрия согласуется до округления, но скорость пункта из-за вращения Земли не укладывается в 1e-6 относительно на широте 62,9 град. (1.12e-6, движение полюса, которое сферическая модель опускает). Раунд 2: скорость по истинному полюсу с эпохой согласуется, скорость по умолчанию без эпохи по-прежнему не укладывается (см. ниже).
- Коридор баллистического входа в атмосферу (Аллен–Эггерс): прогнозируемое пиковое замедление при входе Stardust равно 61,8 g против восстановленных 32,89 g (+88 %, допуск 15 %).
- Совместная ошибка UT1 и движения полюса: относительно формулы точности, напечатанной в 178 выпусках IERS Bulletin A, полюс согласуется в пределах 1.5x, а UT1 нет (0,48 при 10 сутках, 1,59 при 40 сутках). Заменено в раунде 2: строка теперь VALIDATED (см. ниже).
- Входные данные ориентации Земли по умолчанию (офлайн): astropy подтверждает перепись строк, но 12 строк, которые крейт называет предсказаниями Bulletin A, помечены как измеренные (I), а не предсказанные (P). Поэтому показатели согласия строки операционного предиктора относились к измеренным строкам. Заменено в раунде 2: движок классифицирует строки по флагу, и строка имеет статус VALIDATED.
- Ошибка предсказания ориентации Земли в операционном стиле: ошибка UT1 предиктора в 2.4–12.6 раза больше, чем у Bulletin A, при 1–10 сутках и составляет 5,32 мс при 10 сутках, что выходит за диапазон 0,36–3,13 мс по 2nd EOP PCC.
- Лунный геодезический VLBI: по сравнению со временами распространения света ANISE через DE440 ни одна задержка не укладывается в 1 пс; наибольшее расхождение составляет 24 мкс, в основном из-за аналитического центра Луны (около 200 км от DE440). Раунд 2: путь через ядро имеет статус VALIDATED в отдельной строке; этот аналитический путь остаётся MODELLED.
- Экспорт для лунной интероперабельности: Orekit 12,2 отвергает системы времени LTC и TCL, поэтому обмен лунными файлами OEM со вторым средством чтения не подтверждён.
- Относительное движение Клохесси — Уилтшира: по сравнению с нелинейным движением Orekit при 100 м расхождение составляет 1,2–6,3 мм, что выше 1 мм; оно растёт как отброшенный член второго порядка, поэтому заранее зарегистрированный допуск лежал ниже ошибки линеаризации. Заменено в раунде 2: поправка второго порядка имеет статус VALIDATED по тому же порогу.
- Рост ошибки инерциального выбега INS/TRN: по сравнению с инерциальным расчётом Монте-Карло NaveGo законы роста выполняются с точностью до 5 % до 600 с и завышают оценку за этим пределом (в 2.2–8 раз через час), потому что не учитывают обратную связь Шулера. Заменено в раунде 2: модель ошибок Шулера имеет статус VALIDATED.
- Лунный объём обслуживания по реальной геометрии орбитальной группировки: 4 из 12 опубликованных статистик доступности отличаются более чем на 2 процентных пункта (до 22,5).
- Гетерогенная верхняя оценка смещения прослеживаемости UTC(k): на 105 024 строках BIPM верхняя оценка превышена в 50,8 % строк; опубликованная неопределённость ограничивает измерение смещения в BIPM, а не само смещение.
- Классификация нуль-пространства лунной датумной привязки: на опубликованной геометрии из пяти отражателей корреляция составляет -0.78 против -0.97, а CRLB начала координат на 96–98 % ниже, чем в статье.
- Подложка геометрии датума LLR для Луны: по 192 нормальным точкам ILRS лунной дальнометрии за 2024 год среднеквадратичная односторонняя невязка составляла 96 м при прежней интерполяции ориентации и составляет 22,7 м после исправления, описанного ниже, что всё ещё выше порога 10 м (округлённые координаты станций, без движения полюса). Ряд ориентации молча ограничивается за пределами 2024–2025. Раунд 2: модель измеренной дальности имеет статус VALIDATED в отдельной строке (2,81 м); ряд теперь охватывает 2014–2030, а за его пределами выдаёт ошибку.
- Связь релятивистского хода часов с системой отсчёта: член собственного потенциала на 3.18e-4 выше опубликованного значения (допуск 1e-4); в статье вычисляется другой потенциал, поэтому опубликованного значения для этой замкнутой формы не существует. Заменено в раунде 2: экваториальный потенциал степени 2 имеет статус VALIDATED по той же статье.
- Физические константы каждого тела Солнечной системы: 12 из 84 констант добавленных тел отличаются от NAIF pck00011 и gm_de440 (более старые элементы спутников Марса; другие решения GM для Урана, Нептуна и Плутона). Раунд 2: константы теперь следуют NAIF (это переписывание, в счёт не идёт), а вычисленная ориентация согласуется со SPICE; строка остаётся MODELLED.
- Выбираемые модели эфемерид НОО: подгонка с 22 параметрами оставляет 1.71 и 1.86 опубликованной ошибки вдоль трассы на дугах по 20 мин, что выше 1.5. Заменено в раунде 2: модель с 22 параметрами и её подгонка имеют статус VALIDATED в отдельной строке.
- Совместное позиционирование по GNSS и НОО: межсистемное смещение согласуется с RTKLIB, но 93,2 % эпох укладываются в 3 м от ITRF2020 против 95 %; сам RTKLIB достигает на этих данных 88,2 % (93,6 % после исправления группового запаздывания в раунде 2).
- Слепота целостности к синфазным ошибкам и карты покрытия и DOP: оба сравнения пройдены, но отклонены при рецензировании, потому что заведомо неверный движок их тоже проходит (первое проверяет лишь внутреннее тождество; опубликованные нижние границы второго не замечают удвоенного PDOP). Раунд 2: слепота целостности к синфазным ошибкам имеет статус VALIDATED на входных данных с чётностью; карты покрытия остаются находкой (см. ниже).
Раунд валидации 2#
Второй раунд охватил каждую строку, которую первый раунд оставил пригодной для маршрутизации, со свежими предварительными регистрациями, зафиксированными до получения любого эталонного набора и запуска любого оракула, со вторым состязательным рецензентом, повторно выполнившим каждое сравнение, и с намеренной мутацией движка, которая должна окрашивать каждый тест в красный. Владелец принял исправленную формулировку строки об оценке вне Omega 2026-10-02, до её повышения (прежний текст противоречил коду).
Повышены до VALIDATED (17). Вид оракула указан в скобках; допуск зафиксирован до запуска.
- Связь релятивистского хода часов с системой отсчёта (Reference): L_m по Ashby и Patla 2024 в пределах 2.8e-6 (порог 1e-4) от экваториального потенциала степени 2 двух полей, на которые ссылается статья; гравитация pyshtools степени 350 для радиальной составляющей (8.3e-5); лунная скорость DE441 (2.5e-3).
- Входные данные ориентации Земли по умолчанию (офлайн) (Library): astropy 8.0.1 и IERS Bulletin A No. 039 подтверждают 30 финальных, 54 быстрых и 90 предсказанных строк заново нарезанной выборки.
- Совместная ошибка UT1 и движения полюса (Library): полные вращения astropy и pyerfa воспроизводят совместную таблицу (UT1 и полюс в пределах 6e-16, комбинация в пределах 1.9e-7); реализованные ошибки IERS Annual Report 2019 дают отношения 1,001–1,100.
- Полоса обзора и покрытие полезной нагрузки наблюдения Земли (Library): Orekit 12,2 и GeographicLib 2,1 по каждому заранее зарегистрированному порогу, причём вековая прецессия узла из-за J2 теперь учтена в расстоянии между узлами.
- Относительное движение Клохесси — Уилтшира (Library): с замкнутой поправкой второго порядка в пределах 1.2e-7 м от нелинейного движения Orekit против 1e-3 м; одна линейная матрица остаётся охарактеризованной (1,2–6,3 мм).
- Наведение по B-плоскости и гравитационный манёвр по методу сопряжённых конических сечений (Library): B-плоскость, асимптоты, C3 и гелиоцентрические элементы GMAT R2026a; sbpy 0.6.0 и Kasuga и Jewitt 2019 для параметра Тиссерана.
- Рост ошибки инерциального выбега INS/TRN (Library): девятисостоянная модель ошибок Шулера в пределах 5 % от скорректированных прогонов выбега NaveGo во всех 48 точках (худшее 3,70 %).
- Слепота целостности к синфазным ошибкам (P2): numpy
lstsqна 1464 входных данных с чётностью в пределах 1e-12 (худшее 1.06e-14). - Лунное совместное многотехнологичное определение орбиты и часов (P2): numpy пересчитывает каждый шаг Гаусса — Ньютона, сигму и ошибку станций на шести сетях (в пределах 2.4e-11) после исправления QR-решения.
- Ковариация координат станций лунного VLBI (Library): якобиан, построенный по SPICE, воспроизводит расписание, спектр, сигмы и нуль-пространство в пределах 1 % и 0,1 град; numpy до 2e-13.
- Необнаружимая синфазная граница для невязки вне Omega (P2, формулировка исправлена решением владельца): numpy LAPACK на 256 случаях в пределах 1e-12, шесть точных бесконечностей.
- Классификация нуль-пространства, инвариантная к базису (P2): пересечение подпространств в SciPy и NumPy на 72 построенных матрицах, целые числа точные, норма проектора в пределах 6.0e-15.
- Одночастотные ионосферные услуги и услуги UTC навигационного сообщения НОО (Library): GNSSTk 15.3.1 для Klobuchar, Az и дрейфа UTC; ERFA для трёх случаев високосной секунды.
- Граница позиционирования в нетерриториальных сетях 5G (P1): границы для одного SSB по Bachl, Lei и Nabeel 2026 в пределах половины печатного знака; numpy для ковариаций решений.
- Модель измеренной дальности LLR (Measured, новая строка, выделенная из подложки датума LLR): 192 нормальных точек ILRS лунной дальнометрии при 2,81 м СКО против порога 10 м, с барицентрическим временем распространения света по IERS 2010; компоненты ниже порога не разрешаются по отдельности, и строка прямо об этом говорит.
- Лунный геодезический VLBI, путь через ядро (Library, новая строка, выделенная из строки лунного VLBI): сошедшиеся времена распространения света SPICE в пределах 1 пс и частные производные в пределах 1e-6 на эпохах вблизи J2000; аналитический путь по умолчанию остаётся MODELLED.
- Модель эфемерид НОО Liu et al. 2025 с 22 параметрами и её подгонка (Measured, новая строка, выделенная из строки выбираемых моделей): реальные прецизионные орбиты в пределах 1.5 от опубликованной статистики на днях из статьи и на отложенных днях (0,683–1,186); соглашение о масштабе n_dot переписано и этим сравнением не валидируется, а правило останова — это правило сходимости параметров Kshana, а не правило изменения СКО из статьи. Полином ATOMIC и таблица пяти высот остаются MODELLED.
Существующие строки VALIDATED получили новое подкрепление (число не изменилось).
- Положения планет по элементам JPL Standish и время распространения света между телами Солнечной системы: заданные постфактум пороги в два номинала заменены заранее зарегистрированными сравнениями с JPL Horizons DE441 (СКО не более значения из Таблицы 8.10.1 Explanatory Supplement, худшее 0,778, с учётом разбиения Земли и вращения ICRF; времена распространения света в пределах 1e-6 с от Horizons на положениях DE441, худшее 6.7e-9 с). Их флаги «предел установлен после сравнения» сняты.
- Целостность (RAIM/ARAIM/SBAS): строка больше не опирается на проверки правдоподобия. Теперь в ней сказано: разделение решений ARAIM по множественным гипотезам из ADD v4.2 согласуется со Stanford MAAST для ARAIM 2 на 270 реальных случаях (худшая разница VPL 2.2e-3 м против 0,05 м); обнаружение и исключение в моментальном RAIM согласуются с RTKLIB
raim_fdeв 2016 из 2016 решений, а уровень защиты по наклону в пределах 2.7e-12 м; уровни защиты SBAS DO-229E L1 согласуются со Stanford MAAST на реальных вещаниях WAAS (2868 пар в пределах 1.6e-5 м). В ней прямо сказано, что функции с единой сигмойraim::araim_raimиraim::araim_dual_raimНЕ соответствуют ADD (расхождения при согласованных входах 0.75/4.04 м и 0.39/1.93 м по VPL/HPL, это находка), что сравнение DFMC L5 SBAS является находкой (308 пар без GEO в зоне видимости защищены Kshana, но не MAAST) и что уraim::solution_separation_raimнет внешнего сравнения. Её самоотметка снята. - Фиттер широковещательных эфемерид НОО: интегрированная истинная орбита добавлена к валидированной части (Orekit 12,2 в пределах 4,55 мм за 6 ч, порог 2 см); полиномы поправок, подгонка часов и компромисс по периоду обновления остаются смоделированными.
Находки и заблокированные строки (остаются MODELLED). Текст оракула каждой строки содержит находку и закреплённый за ней тест.
- Модуляция навигационных сигналов (Betz 2001, Hein 2006): спектры и корреляции согласуются; боковые лепестки 24 МГц и каждое смещение из-за многолучевости (занижено на 11–15 %) не согласуются, причина не установлена.
- Геолокация по TDOA/FDOA: границы совпадают с Ho и Chan и Ho и Xu, а также с кодом авторов до 3e-12; коэффициенты Ottawa, напечатанные по расчёту Монте-Карло, отличаются на 1,3 % и 4,4 %.
- Земной GNSS на лунном расстоянии: средние GENESIS в зените согласуются с Montenbruck et al. 2023 в 5 из 6 случаев; средние в надире выше на 1,0–2,4 спутника.
- Карты покрытия и DOP: земные конструкции согласуются с Orekit, gnss_lib_py и numpy по каждому порогу; лунные и марсианские конструкции превышают 1e-9 только на почти вырожденных ячейках.
- Совместное позиционирование по GNSS: двухчастотное 79,9 % и прецизионные продукты 94,2 % в пределах 3 м против 95 % (RTKLIB 67,9 % и 94,1 %); разрыв ISB прецизионных продуктов вызван тем, что RTKLIB игнорирует смещения антенн.
- Петли слежения (GNSS-SDR 0.0.19): согласуются при 35–45 дБ-Гц; при 30 дБ-Гц PLL +21 %, DLL -32 %, пороги +1,5 дБ; времена срыва на 0,5–2 декады короче.
- Лунный объём обслуживания (Orekit и Hipparchus): 155 из 160 значений согласуются; требование для худшей выборки не выполняется на почти вырожденной геометрии LNCSS B.
- Квантовый инерциальный датчик: нижняя граница только по QPN на 21–31 % ниже измеренного шума Gauguet 2009 (порог 30 %, не достигнут на 0,5 пункта).
- Пресеты генераторов: измеренные образцы превышают пресеты рубидиевого holdover, цезиевой кратковременной стабильности и худшего образца CSAC; для пресета OCXO измеренной записи нет.
- Плотность по космической погоде: Jacchia 1971 отличается от плотностей по акселерометрам не более чем в 2 раза в максимуме солнечной активности, но примерно в 1.7 раза завышает плотность в минимуме 2008 года.
- Наклонное TEC без геометрии: 33 из 36 дуг в пределах 3 TECU от карты CODE (худшее 6,84).
- Обнаружение спуфинга и TPL по официальному журналу JammerTest 2024: 4 из 10 начал обнаружены вовремя; TPL превышен в 4 из 10.
- Фильтр часов на свежих часах IGS: два из 11 спутников не проходят критерий суммы инноваций.
- Предиктор EOP на основе наименьших квадратов и авторегрессии: UT1 в 1,73–2.11 раза больше, чем у Bulletin A, при 2–10 сутках.
- Верхняя оценка реализованного смещения UTC(k): объединённая частота превышений 0,0333 против 1e-2.
- Лунный датум системы отсчёта по кампании: ветвь SPICE согласуется; ветвь P2 с оценкой станций не достигает 1e-9 на задаче с числом обусловленности 2.1e8.
- Лунный датум системы отсчёта по реальной LLR: 15 из 16 показателей согласуются со SPICE; сигма z-смещения завышена на 1,03 % против 1 %.
- Вход в атмосферу (Allen–Eggers): решение для материальной точки согласуется с реконструкциями агентств (только перекрёстная проверка); сравнение по акселерометру заблокировано из-за отсутствия читаемого источника Hayabusa2.
- Маски ITU-T: напечатанные разобранные значения согласуются; для классовых пределов G.8273.2 их нет (заблокировано).
- Геометрия окна запуска: скорость площадки на истинном полюсе с эпохой согласуется с Orekit (4.9e-8); скорость по умолчанию без эпохи по-прежнему не укладывается (1.12e-6). Не повышено; продолжение ожидается.
- Физические константы каждого тела: теперь 0 из 84 отличаются от NAIF (переписывание), а вычисленная ориентация согласуется со SPICE до 1.4e-10 рад. Не повышено; продолжение ожидается.
- Заблокировано решением владельца о границах охвата, в каждом случае с зафиксированным согласующимся сравнением: наблюдаемость абсолютных положений лунных станций, DOP поверхностных маяков, экспорт вне оси, мощность обнаружения при кросс-модальности, статистика согласованности синфазных ошибок и покрытие полярными НОО.
- Заблокировано данными: составление бюджета ошибок передачи времени (требуется обработка реальных данных), JammerTest C/N0 (положение антенны и разделение мощности не задокументированы).
Изменения (опубликованные числа, которые сдвинулись, старое -> новое).
- Уровни защиты
snapshot_raimтеперь заданы в геодезической местной системе, а не в радиальной: до 0,31 м по HPL и 0,14 м по VPL на ABMF (16 град с. ш.); ни один golden-файл не изменился, но записанная сводка руководстваgnss-simменяется со среднего HPL 22,1 м / VPL 40,0 м на 22,2 м / 39,9 м (docs/tutorials/scenarios/gnss-sim.toml). - Значения по умолчанию для связи лунной системы отсчёта по скорости: d_alpha/d_scale 3.139807e-11 -> 3.138801e-11; d_alpha/d_radial 1.807187e-17 -> 1.806185e-17 на метр.
- Офлайн-прогон EOP по умолчанию (
realtime-frame-eop, ячейки перечислены вdocs/revisions/M035-default-eop-recut-cell-changes.md): predicted_rows 12 -> 90; нижняя граница полюса 0,06776 -> 0,05550 угл. мс; eop_term_m 14,01601 -> 14,01583; total_m 20,09759 -> 20,09746; total_time_ns 67,03834 -> 67,03790; строки Таблицы 2 изtests/golden/realtime-frame-eop.csv; согласие операционного предиктора 0.256/0.695/1.252/3.885 мс -> 0.133/0.421/0.839/2.786 мс. docs/LEO-NAVMSG.mdliu22 SISRE орбита/с часами: 60 с 0.011/0.046 -> 0.014/0.046 см; 300 с 0.068/0.139 -> 0.074/0.142 см; 600 с 0.269/0.299 -> 0.258/0.290 см.- Таблица высот Liu, Kshana (отношение): GRACE-A 5,40 (0,61) -> 4,25 (0,48); GRACE-C 4,12 (0,66) -> 2,87 (0,46); Sentinel-2A 2,95 (1,03) -> 2,20 (0,77); HY-2A 2,38 (1,13) -> 1,25 (0,59); Sentinel-6A 0,70 (0,94) -> 0,51 (0,67).
- Масштаб
nDotнавигационного сообщения НОО 2^-60 -> 2^-58 (заранее не зарегистрирован, раскрыт; вне сравнения подгонки); CRC опорного кадра liu22 0x62373A -> 0xDED99C. - Таблица верификации
docs/LEO-NAVMSG.md: строка Liu и ATOMIC разделена на строку VALIDATED с 22 параметрами и строку MODELLED для ATOMIC и пяти высот. - Текст строки ориентации главных осей Луны DE440: интервал 2024–2025 / 731 строк -> 2014–2030 / 6 209 строк; «молча ограничивается» -> ошибка за пределами интервала.
- Сценарий
eo-coverage: equatorial_ground_track_spacing_km 2756,37 -> 2752,17 км; новые поля inclination_deg (98,19) и nodal_period_min (98,893). constellation-multi-gnss-coverage(опорные часы TDOP/GDOP теперь берутся у орбитальной группировки с наименьшим номером в зоне видимости): глобальный максимум GDOP 2,2236 -> 2,1205, среднее 1,122 -> 1,131, медиана 1,115 -> 1,125, p90 1,255 -> 1,265, p95 1,305 -> 1,315, p99 1,41 -> 1,42 и покомпонентная карта GDOP; mean_visible_by_constellation суммируется как целые числа (около 1e-12 относительно, незаметно при 4 десятичных знаках).- Совместное одночастотное решение GNSS после исправления широковещательного группового запаздывания: 93,2 % -> 93,6 % в пределах 3 м; медиана ISB -0.351 -> -0.114 нс.
tracking-loopjitter_table log10_mean_time_to_cycle_slip_s (петля Костаса, ОСШ rho/4): на пороге 25,47 дБ-Гц 11,58 -> 2,10; при 25 дБ-Гц 9,55 -> 1,60; при 22 дБ-Гц 2,24 -> -0.14.ins-trn-coast: каждый выход смещается вместе с моделью ошибок Шулера; пик TRN поставляемого сценария 52,932679 -> 44,711834 м (tests/conflict_resilience_architecture_guard.rs).- Отчёт
lunar-vlbi: новый ключ geometry_path («analytic» при прогоне по умолчанию, ни одно числовое значение не изменилось); новые необязательные поля planetary_kernel_path, earth_orientation_kernel_path и moon_orientation_kernel_path, с epoch_partials на пути через ядро; описание вида переписано. Оракул пути через ядро в строке верификации — SPICE (0,06 пс); ANISE (0,12 пс) становится перекрёстной проверкой вычисления ядра. - Константы тел: GM Фобоса 7.087e5 -> 7.087546066894452e5; Деймоса 9.62e4 -> 9.615569648120313e4; Урана 5.7939506103e15 -> 5.793951256527211e15; Нептуна 6.83509997e15 -> 6.835103145462294e15; Плутона 8.69326e11 -> 8.696138177608748e11 (м^3/с^2); экваториальный радиус Фобоса 13,1 -> 13,0 км; полюс и нулевой меридиан Фобоса и Деймоса из pck00011; prime_meridian_deg Солнечной системы теперь включает квадратичные и периодические члены.
europa-surface-pnt(body-pntна Европе) по полной ориентации Европы из pck00011 (7cfd66b4; ориентация согласуется со SPICE pxform до 1.4e-10 рад), что смещает посадочный аппарат в инерциальном пространстве: доступность только через ретрансляторы / с дальностью до Земли 0,485 / 0,725 -> 0,480 / 0,719 (83 -> 82 из 171 эпох только через ретрансляторы), медианный PDOP 5,266 -> 5,360, СКО ошибки решения 129,516 / 100,983 м -> 112,742 / 86,147 м, медианная формальная сигма 5,266 / 4,272 м -> 5,360 / 4,239 м. Таблица вdocs/SOLAR-SYSTEM.mdи закрепление вmcp/kshana-mcp/tests/round_trip.rsследуют за этим;mars-orbit-pntне изменён.space-weather(f107 180, f107a 165, kp 4), калиброванный коэффициент заменён на Jacchia 1971: activity_density_kg_m3 на 300/400/500/600/800 км 2.602e-11 -> 3.608e-11, 4.176e-12 -> 6.929e-12, 8.136e-13 -> 1.618e-12, 1.769e-13 -> 4.189e-13, 1.544e-14 -> 3.781e-14; activity_factor 1.076/1.121/1.168/1.216/1.320 -> 1.492/1.860/2.322/2.881/3.232; reference_exospheric_temperature_k удалён, mean_exospheric_temperature_k добавлен (1186,7 К);tests/space_weather_reference.rs: размах солнечного цикла на 800 км теперь 10.4 раза (NRLMSISE-00 13.6 раза), а проверка по высоте следует за ростом NRLMSISE до 500 км и спадом на 800 км.ntn-5g-positioningtoa_median_sigma_3d_m: NR 5 МГц 2,0903959 -> 2,0903962 м; NB 200 кГц 25,938613 -> 25,938839 м (текст сводки не изменился: 2,09 / 25,94 м).lunar-joint-od-clock(QR-решение): with_vlbi.station_pos_err_m 3,541344 -> 3,541350 м; without_vlbi.station_pos_err_m 2183,119 -> 2183,558 м.docs/field-units-schema.jsonзаново сформирован для новых и удалённых полей, указанных выше.
Пакеты валидации#
D12, расширенная точность и решатель на квадратном корне (две новые строки VALIDATED: 226 -> 228 строк, 110 -> 112 валидированных).
Часть 1, оракул расширенной точности:
- Лунный датум системы отсчёта с оценкой станций: 50-значный оракул расширенной точности mpmath (предварительная регистрация 804662d5, пороги с учётом обусловленности по априорной формуле обратной ошибки) согласуется на новой дате кампании (2026-03-18) и на исходном сценарии 2024-01-01; новая строка VALIDATED в рамках P2. Это разрешает прежний спор о двойной точности: сигмы датума движка отклоняются до 9.7e-6, обратная матрица и собственные маршруты NumPy — до 6.2e-6, а маршруты Холецкого и QR — примерно на 1e-8. Движок укладывается в свою границу ошибки, но примерно в тысячу раз менее точен, чем путь через факторизацию.
- Окружение оракула: добавлен mpmath 1.3.0.
- Изменения: нет. Ни один golden-файл и ни одно опубликованное число не меняются; строка «Лунный датум системы отсчёта по кампании наблюдений» остаётся MODELLED (решение основателя 2026-10-02, вариант A: она не заимствует статус отдельной строки); текст её тестов ссылается на новый тест и его находку.
Часть 2, решатель датума в форме квадратного корня информационной матрицы:
- Новый необязательный решатель в форме квадратного корня информационной матрицы (
linalg_sr;solver = "srif"в сценарии lunar-frame-campaign): QR по Хаусхолдеру, маргинализация через треугольный множитель, SVD по Якоби для спектра и компенсированные произведения только из корректно округлённых операций. По 50-значному оракулу (предварительная регистрация b41908c9) его сигмы датума согласуются до 3e-13 на новой дате (2026-06-09); на входных данных 2026-03-18 и 2024-01-01 решатель по умолчанию отклоняется до 1e-5. Новая строка VALIDATED в рамках P2. Решатель по умолчанию и его выход не изменены. Заранее зарегистрированные пороги подтверждают ошибки лишь выше примерно 2e-7 относительно: они отклоняют решатель по умолчанию, но не перевёрнутый знак Хаусхолдера, некомпенсированное скалярное произведение или спектральную итоговую обратную матрицу, и строка прямо об этом говорит. - Необязательные пути в форме квадратного корня рядом с неизменёнными значениями по умолчанию:
fim::crlb_srif,batch_ls::gauss_newton_srif,orbit_determination::determine_orbit_batch_srif,lunar_combination::formal_covariance_srif,precise_od::fit_srifиcislunar_srif::srif_cross_validation_sqrt, на новыхlinalg_sr::weighted_lstsqиcovariance_from_sqrt_information. Каждый согласуется со своим вариантом по умолчанию там, где оба точны (внутренняя проверка, без строки; валидация для них не заявляется).precise_od::fitтеперь делегирует общей процедуре; её выход и выход по умолчанию каждого сценария не изменились. - Решения о ранге в кампании лунной системы отсчёта: заранее зарегистрированная проверка расширенной точности на 40 днях подтверждает каждое разрешимое решение по блоку станций и по полному рангу Гельмерта. Априорная граница не может подтвердить 20 дней Гельмерта с дефицитом ранга; в точной арифметике их дефект геометрический, а порог 1e-9 лежит внутри естественного диапазона отношений собственных значений кампании. Строки нет.
- Утверждение строки кампании расширенной точности сужено до «в пределах границы наихудшего случая», а её проверка слабейшего направления при фиксированных станциях теперь измеряет реальный угол (6.6e-16 рад; компаратор изменён с acos на хорду, порог не менялся).
- Изменения: нет. Ни один golden-файл и ни одно опубликованное число не меняются; строка «Лунный датум системы отсчёта по кампании наблюдений» не изменена и остаётся MODELLED (решение основателя 2026-10-02, вариант A).
D4, основа эфемерид из ядер JPL, фаза 1 (четыре новые строки VALIDATED: 228 -> 232 строк, 112 -> 116 валидированных).
- У читателя ядер NAIF есть собственная строка.
naif_kernel(контейнер DAF, SPK типа 2, двоичный PCK типа 2) согласуется с SPICE Toolkit (CSPICE N0067 через spiceypy 8.2.0) и с ANISE 0.10.6 на всех 600 состояниях DE440 и 200 вращениях лунной ориентации случайной сетки, выбранной по собственному хешу коммита предварительной регистрации (abcd9133), в пределах порогов, заранее выведенных из вычисления многочленов Чебышёва с двойной точностью (худшее — 0,6 % порога, 1.95e-3 м). Строка утверждает, что движок правильно читает ядра JPL, а не то, что DE440 или аналитический ряд точны (tests/naif_reader_spice_oracle.rs). ephem_provider::KernelEphemeris: положения DE440 (или любого SPK типа 2) через собственный читатель движка, с двухчастными эпохами TDB и SHA-256 ядра, сохраняемым для отчётов; он никогда не подставляет барицентр системы вместо планеты.LunisolarSourceпозволяет пути геометрии выбрать аналитический ряд (по умолчанию) или ядро.- Необязательная Луна из ядра для
lunar-llr-datumиlunar-vlbi-fim: ключplanetary_kernel_pathчитает геоцентрический центр Луны из ядра; больше ничего не меняется, а в отчёте появляется блокmoon_ephemerisс названием ядра и его SHA-256. Без этого ключа оба отчёта побайтово совпадают с прежними. - Ковариация точки лунной поверхности на пути через ядро (новая строка VALIDATED): при всех зафиксированных станциях и маяке на Луне DE440 ковариация маяка согласуется с якобианом времени распространения света SPICE (худшее — 1.7e-3 против порога 1 %) и с обратной матрицей NumPy (4e-14 против 1e-9), предварительная регистрация 4a51256 (
tests/lunar_vlbi_surface_point_spice_oracle.rs). Строка аналитического пути остаётся MODELLED: на аналитической Луне его наименьшая сигма маяка на 3,9 % ниже оракула. - Датум лунной системы отсчёта по реальной кампании, центр Луны из ядра (новая строка VALIDATED): на 447 невиданных нормальных точках 2019-Q2, с предварительной регистрацией 830d945a до получения любой из них, ковариация датума на пути через ядро согласуется с неизменённым оракулом SPICE и NumPy в пределах 7.6e-5 против порогов 1 % и 2 % (
tests/validate_llr_datum_kernel_moon_fresh.rs). Основатель решил, что эта строка повышается только на свежих точках; диагностика на уже виденных данных (c51f8b2) является находкой, а не доказательством. Порог не различает модели Луны: аналитическая Луна на том же срезе тоже проходит (худшее — 3.8e-3), запланированная мутация (Луна из ядра с опозданием на один час) не была обнаружена, а на сгибе центр Луны, ошибочный примерно на 4 650 км (Луна, взятая относительно барицентра Земля — Луна), тоже прошёл. Строка заявляет ковариацию на этом пути, а не центр Луны, и прямо об этом говорит. - Положения Солнца, Луны, Меркурия и Венеры по DE440 на эпохах UTC (новая строка VALIDATED):
KernelEphemeris::relative_position_utcсогласуется со Skyfield 1,54 на 600 положениях между 1973 и 2026 годами, худшее — 2,96 м, в пределах заранее зарегистрированного порога (0bfafe6d), заданного двучленным рядом TDB − TT (tests/kernel_ephemeris_skyfield_oracle.rs). Положения планет получают эту новую строку по ядру сейчас; строка Standish и строка спутников планет не изменены, а спутники ждут сценария, которому они нужны (решение основателя). - Находки: единственный промах сравнения датума LLR (сигма z-смещения 1,025 % против 1 %) падает до 0,049 %, когда из DE440 читается только центр Луны, на уже виденных данных (
tests/validate_llr_datum_kernel_moon.rs); на свежем срезе 2019 года аналитическая Луна тоже проходит, поэтому промах 2015 года был пограничным для геометрии того квартала. Аналитические строки «Датум лунной системы отсчёта по РЕАЛЬНОЙ кампании наблюдений» и «Ковариация координат точки лунной поверхности … отдельно от земной станции» остаются MODELLED; их тексты оракулов теперь указывают на строки пути через ядро. lunar_ephemerisбольше не говорит, что у движка нет читателя двоичных ядер; он указывает на строку читателя и объясняет, почему ядра космических аппаратов (типов 13 и 21) по-прежнему приходят через Horizons.- Изменения: нет. Ни один golden-файл, опубликованное число или существующее тестовое значение не меняются; аналитические отчёты
lunar-llr-datum,lunar-vlbi-fimиlunar-vlbi-fimсо всеми зафиксированными станциями побайтово совпадают с прежними (префиксы SHA-256 результатов 9927aac2, cf1d2671, 25c357e4).
D9, библиотека измеренных часов «Clock Atlas» (три новые строки, одна VALIDATED: 232 -> 235 строк, 116 -> 117 валидированных).
- Библиотека измеренных часов (
clock_library). Карты устройств (белая фаза, белая, фликкер- и случайно-блуждающая частотная модуляция, линейный дрейф частоты и, при необходимости, фазовые члены с одной–четырьмя на оборот), подогнанные к названной измеренной записи часов и оценённые на отложенных данных; Allan и Hadamard дисперсии с учётом пропусков; детектор кондиционирования, который регистрирует каждый пропуск, выброс фазы, скачок фазы, всплеск и скачок частоты и ничего не знает о границах файлов и суток; преобразование карты в модель шума слотовой синхронизации, расширенную калмановскую модель часов и уровни шума монитора спуфинга. Читатели файлов часов RINEX и IGS, файлов BIPM по лабораториям и раздела 1 Circular T (realdata::clk); объединённая иерархическая граница старения для UTC(k) (utck_bound, пока не оценена). - Идентификация шума по автокорреляции с лагом 1 (
allan::lag1_noise_id, Riley и Greenhall 2004), новая строка VALIDATED (Library): согласуется с allantools 2024,6autocorr_noise_idна 140 случаях, целые числа идентичны, худшая разница 9.6e-13 против порога 1e-9 (предварительная регистрация 2ec76864;tests/clock_library_lag1_noise_id_allantools.rs). - Измеренные карты устройств с предсказанием на отложенных данных, новая строка MODELLED (находка): подгонка на одной трети, предсказание девиации Аллана для остальных двух третей в пределах множителя 1,5 (предварительная регистрация 2ec76864). GPS Block IIF на свежем окне IGS (с 2026-03-01 по 14): 10 из 11; G27 оптимистична на двухчасовом масштабе (худший множитель 1,510). Цезий (в пределах, 1,070), OCXO (вне пределов, 2,348) и стронций (в пределах) приведены, но не вслепую. Карта приёмника JammerTest, а также карты мазера Galileo и Deep Space Atomic Clock заблокированы. Класс моделей TCXO приёмника ZED-F9P на 12 статических станциях Вроцлава (Zenodo 6488497) не проходит: 1 из 11 слепых станций в раскрытом исправленном повторном прогоне (
tests/clock_library_device_cards_oracle.rs,tests/clock_library_f9p_cards_oracle.rs). - Карты GPS Block IIF с членами на оборот, новая строка MODELLED (находка): на втором свежем окне (с 2026-04-01 по 14) 9 из 11 в пределах порога; G03 (1,947) и G25 (1,581) оптимистичны, потому что их отложенные записи шумнее, чем подгоночные трети; отбрасывание периодических членов не проходит ни для одной из 11 (предварительная регистрация fb475550;
tests/clock_library_periodic_cards_oracle.rs). - M002, оценка состояния бортовых часов, раунд 3 (находка, остаётся MODELLED): после замороженного детектора кондиционирования расширенный фильтр раунда 2 с неизменёнными настройкой и критериями впервые выполняет (a) и (c) на всех 11 спутниках; (b) не выполняется на G09 (0,894) и G26 (0,876) (предварительная регистрация fb475550;
tests/clock_state_ext_igs_conditioned_oracle.rs). - M010, обнаружение спуфинга, раунды с 3 по 4b (остаётся MODELLED): раунд 3 заблокирован (167 обучающих эпох из других сеансов устройства JammerTest против 3600); с картой класса моделей ZED-F9P (раунды 4 и 4b) монитор часов даёт ноль ложных тревог до начала на всех 10 зарегистрированных началах (раунд 2: 86), а 6 из 10 начал обнаруживаются в пределах 10 с (раунд 2: 4); те же четыре по-прежнему запаздывают (
tests/clock_library_tcxo_card_jammertest_oracle.rs). - M083, верхняя оценка UTC(k), раунд 3: проспективно зарегистрирована (fb475550) на выпусках Circular T начиная с 465, ещё не запущена (
tests/utck_bound_prospective_oracle.rs). - Окружение оракула: запись Вроцлава ZED-F9P ограничена доступом к данным в
$KSHANA_ORACLES/data/wroclaw_f9p(CC BY 4,0, около 1,5 ГБ); эталонные наборы часов IGS включены в поставку (продукты IGS, с указанием авторства). - Изменения: нет. Ни один golden-файл, опубликованное число или существующее тестовое значение не меняются; по M001 (переякорение holdover) действий не предпринимается, потому что ни один класс часов не был повышен.
D8, один валидированный путь распространения, системы отсчёта и времени (три новые строки VALIDATED и повышена M131: 235 -> 238 строк, валидированных 117 -> 121).
Виды земных орбит, которые несли собственные модели только двух тел, вековой J2 или только звёздного времени, теперь используют один общий путь: наборы элементов SGP4/SDP4 с двухчастными юлианскими датами, переводимые в GCRS и ITRS (Международная земная система отсчёта) через цепочку IAU (Международный астрономический союз) 2006/2000A, с необязательными параметрами ориентации Земли.
- Новые
sgp4::MeanElementSet,sgp4::SgpOrbit,sgp4::Eop,sgp4::teme_to_itrs_matrix[_eop]иsgp4::gcrs_to_itrs_matrix[_eop];Sgp4::new_atиSgp4::propagate_atпринимают двухчастные эпохи. Новыеjd2::Jd2::from_utc_calendar(соглашение SOFAdtf2dдля суток с високосной секундой),jd2::utc_to_tai,tai_to_utc,utc_to_ut1(через TAI, как SOFAutcut1),tai_to_ttи двухчастнаяjd2::earth_rotation_angle. - Полярный режим
leo-pvtраспространяет орбиту по SGP4 на 2026-01-01T00:00:00 UTC по цепочке IAU (leo_fusion::polar::latitude_sweep_atпринимает любую эпоху); генератор Walker для SGP4 переходит в земную систему координат через цепочку IAU. - Вид
passesзапускает новый предиктор видимых пролётов (passes::predict_passes_apparent,apparent_look_angles): SGP4 по цепочке IAU, рефракция ITU-R P.834-9 и время распространения света нисходящей линии (новые переключателиrefractionиlight_time, включены по умолчанию), параметры ориентации Земли (ut1_minus_utc_s,xp_arcsec,yp_arcsec, по умолчанию 0), пересечения, решаемые с точностью 1e-7 с, и кульминация поиском золотого сечения. Геометрическийpasses::predict_passesне изменён. tests/no_private_models.rsне позволяет ядрам геометрии, времени и распространения пакета нести частное кеплерово распространение, вековые скорости J2 или вращение только по звёздному времени; именованные быстрые ступени и физика, являющаяся предметом строки, считаются обоснованными исключениями.- Новая строка VALIDATED «Двухчастные юлианские даты и високосные секунды на пути времени земных орбит»: pyerfa 2.0.1.5
dtf2d/utctai/taiutcна 224 моментах вокруг всех 27 високосных секунд в пределах 1e-6 с (предварительная регистрация e947e69d); худшее — 1.9e-11 с. - Новая строка VALIDATED «Один путь земной орбиты»: положения TEME 232 наборов элементов против python-sgp4 2,24 (эталонный SGP4 Vallado) в пределах 6.1e-8 м (порог 1 см), а вращения GCRS -> ITRS и TEME -> ITRS против ERFA
c2t06a,pnm06aиee06aв пределах 2.9e-6 угл. мс и 0,41 угл. мс (пороги 0,1 и 2 угл. мс), с параметрами ориентации Земли (предварительная регистрация 72ea9eb0). Раскрыто: первый прогон не прошёл на 2016-12-31T23:59:59,5 на одну секунду вращения; UT1 бралась из квазиюлианской даты UTC в сутки с високосной секундой, теперь движок идёт через TAI, и второй прогон согласуется при неизменённых порогах. - M131 «Покрытие НОО и геометрический фактор DOP для полярных и арктических пользователей в сравнении с MEO GNSS» получает статус VALIDATED: Orekit 13.1.8 берёт состояния движка в GCRS, поворачивает их и вычисляет видимость и DOP (NumPy для групп с несколькими часами); положения в пределах 6.8e-5 м (порог 0,2 м), числа видимых спутников идентичны на 4040/4040 выборках, медианный DOP в пределах 2.3e-11 относительно.
- Новая строка VALIDATED «Предсказание видимых пролётов над наземной станцией с рефракцией и временем распространения света»: Orekit 13.1.8 распространяет те же наборы элементов в TEME, который он строит по заявленному определению, с рефракцией ITU-R P.834 и её измерительной моделью времени распространения света, на 60 случаях для станций на уровне моря: 1210 пролётов, пересечения в пределах 3.4e-6 с (порог 5 мс), максимальный угол места в пределах 5.5e-7 град, видимое направление в пределах 8.8e-7 град (порог 1e-4 град).
- Находки, остающиеся закреплёнными: первые сравнения полного утверждения с Orekit от начала до конца не прошли пороги по положению и направлению не из-за движка, а потому что SDP4 в Orekit 13.1.8 отклоняется от эталонного SGP4 для круговых (e = 0) орбит дальнего космоса (до 67 м), а его TEME по умолчанию построен на нутации IERS 1996 (IAU 1980), примерно на 72 миллисекунды дуги отличающейся от цепочки IAU 2006/2000A (2,7 м на НОО). Коэффициент ITU-R P.834 при h*theta0^2 в Orekit равен 0,011380, тогда как в Рекомендации напечатано 0,01380; сравнение выполняется на уровне моря, где этот член исчезает, а разница выше него закреплена.
- «Предсказание пролётов над наземной станцией (наземный сегмент)» остаётся VALIDATED, а его утверждение сужено до геометрического
passes::predict_passes; видpassesотносится к новой строке. - Окружение оракула: Orekit 13.1.8 с Hipparchus 4.0.3, pyerfa 2.0.1.5, python-sgp4 2,24 (
xval/d8-orekit13/setup.sh). - Изменения: встроенный
scenarios/passes.tomlобщий доступ 1675 с -> 1659 с (пять пролётов, как и раньше; лучший максимальный угол места 73,25 град -> 70,08 град), и каждый выходpassesсмещается вместе с новым путём (напечатанная строка вdocs/examples/multi-tool-pipeline.mdи записьpassesвdocs/CAPABILITY.mdтеперь об этом говорят); встроенныйpolar-arctic-leo-coverageVDOP GNSS на экваторе 1,19669 -> 1,19710, при 89,9 град 1,50645 -> 1,50590, слитый VDOP при 89,9 град 1,14388 -> 1,14250 (опубликованные двузначные значения 1,20, 1,51 и 1,14 не изменились). Ни один golden-файл не меняется. - Пока не переведены на новый путь:
leo_pass, режимы доплеровский, совместный и синхронизацииleo-pvtи истинная орбитаleo_navmsg(их модели находятся вleo_link::geometryиleo_fusion::geom), а также земные конструкции вconstellation-design(именованная быстрая ступень двух тел).
D6, эталонный генератор LunaNet AFS, LSIS V1.0 (четыре новые строки, две VALIDATED: 238 -> 242 строк, валидированных 121 -> 123).
- Эталонный генератор LunaNet Augmented Forward Signal (AFS) (
lunar_afs), привязанный к LunaNet Signal-In-Space Recommended Standard (LSIS) V1.0 от 29 января 2025 года, с указанием этой версии в каждом выходе: несущая 2492,028 МГц; канал данных AFS-I BPSK(1) со скоростью 500 символов в секунду и кодом Голда из 2046 элементов; пилот AFS-Q BPSK(5) с первичным кодом Вейля из 10230 элементов, вторичным из 4 элементов и третичным из 1500 элементов; кадр с идентификатором 0 (синхронизирующий образец, подкадр 1 с BCH (51, 8), CRC-24, подкадры 2–4 с LDPC со скоростью одна вторая, блочный перемежитель 60 на 98) с исчерпывающим декодером подкадра 1 и декодером LDPC min-sum, написанным только по матрице проверки чётности; и синтез IQ в основной полосе с метками истины, записываемый как запись SigMF. Коды порождаются из сдвиговых регистров стандарта и конструкций Лежандра/Вейля. Ничего, скопированного из стандарта, не распространяется (у него нет условий повторного использования): первичные индексы AFS-Q берутся из IS-GPS-800J, а то, что определено только во вложениях стандарта (задержки G2 AFS-I, третичные коды, подматрицы LDPC), читается во время выполнения из локального кэша, которыйxval/lunar-afs/fetch_lsis.shзаполняет из PDF на сервере NASA, причём каждый файл проверяется по закреплённому SHA-256 (lunar_afs::lsis). Модель является эталоном соответствия, а не моделью канала, распространения или бюджета линии. sigmf::meta_to_json_with_extensionsиsigmf::annotation_extension_fields: запись может нести поля расширений с пространствами имён, объявленные вcore:extensions.- Новая строка VALIDATED «Формирование основной полосы LunaNet AFS против независимого генератора при заданном состоянии его канала»: против LANS-AFS-SIM (BSD-2-Clause, коммит 480c6bf3, сборка для S-диапазона) ноль несовпадений элементов по кодам PRN с 1 по 210, ноль несовпадений символов по трём кадрам прогона и нормированная комплексная корреляция 0,999990 на 23,9 с его собственных отсчётов (худший блок 2 мс — 0,999948), в пределах порогов, зафиксированных до сравнения (предварительная регистрация 986ac280). Он управляет рендерером собственным состоянием канала симулятора и не охватывает разделение мощности по отношению несущая/шумовая плотность, а также запись SigMF и 8-битную запись.
- Новая строка VALIDATED «Канальное кодирование кадров LunaNet AFS, FID 0»: кадры из 6000 символов совпадают с кадрами LANS-AFS-SIM символ в символ (предварительная регистрация 986ac280); код подкадра 1 воспроизводит разобранный пример из Рисунка 8 LSIS, а CRC-24 — контрольное значение каталога CRC-24/LTE-A.
- Обе повышенные строки ограничены доступом к данным по кэшу LSIS: их тест оракула пропускается с уведомлением, пока не выполнен
xval/lunar-afs/fetch_lsis.sh. - Находка (новая строка MODELLED), «Порождение расширяющих кодов LunaNet AFS»: из 2 937 232 сгенерированных элементов и битов, сравнённых с таблицами стандарта и файлами Приложения 3, один отличается — «последние 24 элемента», которые Таблица E-5 печатает для третичного PRN 147, дублируют ячейку PRN 151, тогда как собственный файл Приложения 3 стандарта согласуется с генератором. Критерий нулевого несовпадения не выполнен.
- Находка (новая строка MODELLED), «Декодируемость LunaNet AFS в замкнутом контуре»: три предварительно зарегистрированных прогона против PocketSDR-AFS; третий полностью выполнил пороги слежения и декодирования, но не выполнил условие, что сборка приёмника только с печатью воспроизводит журнал закреплённой сборки, потому что два прогона неизменённого приёмника уже различаются в записях захвата.
- Исправлено: несущая по умолчанию у
lunar_service(export_antenna.carrier_hz),lunar_jammingиattack_surfaceбыла округлёнными 2,4 ГГц; теперь это несущая AFS из LSIS-020, 2492,028 МГц. При прежнем значении по умолчанию потери в свободном пространстве были занижены на 0,327 дБ. - Изменения: нет. Каждый встроенный сценарий называет свою несущую, а результаты всех 138 файлов сценариев побайтово совпадают с предыдущей main.
D7, реальные лунные IQ и GPS LNAV (семь новых строк, ни одной VALIDATED: 242 -> 249 строк, валидированных 123 без изменений).
portable_math::FftPlan: смешанно-основное быстрое преобразование Фурье (FFT), выход которого одинаков до бита на любой платформе; закреплённый SHA-256 преобразований на 8000 и 24000 точек проходит на x86_64 и на wasm32-wasip1 (запуск вxval/portable-fft-wasm/).acquisition: параллельный поиск кодовой фазы по отсчётам IQ (pcps_acquire,pcps_grid) с когерентным сворачиванием, некогерентным накоплением, порогом хи-квадрат для вероятности ложной тревоги по всему поиску и статистикой с усреднением по ячейкам для шума с ограниченной полосой;refine,prompt_seriesс кодовым доплером, а также оценки отношения несущая/шумовая плотность (C/N0) по M2M4 и по пику сетки.gps_lnav: кодер устаревшего навигационного сообщения (LNAV) IS-GPS-200 для подкадров 1–3 с чётностью по Таблице 20-XIV и декодером полей.realdata::ion_sdr: читатель ION GNSS SDR Metadata Standard (.sdrx) и его файлов отсчётов, сto_mid_riseдля уровней в дополнительном коде.realdata::lugre: заголовок пакета IQS LuGRE (Lunar GNSS Receiver Experiment), телеметрия RAW, ACQ и NAV, файлы CLK и проверка, перечисляющая, где метаданные.sdrxпротиворечат двоичному заголовку.antenna::GainPattern2Dи, вearth_gnss_lunar, связанная с рысканием система координат тела, азимут передачи и углы отклонения от надира, а такжеtransmit_side_dbдля относительного C/N0 с измеренными диаграммами.Кодирование навигационного сообщения GPS LNAV (новая строка, остаётся MODELLED после постверификации интегратором): на широковещательном файле IGS от 2 марта 2025 года, разобранном и декодированном RTKLIB v2.4.2-p13, все 960 слов проходят проверку чётности, все 96 подкадров декодируются и все 608 широковещательных целых равны значениям Kshana (
tests/gps_lnav_rtklib_integer_oracle.rs), но предварительная регистрация (d4d9eb9d) попала в публичную ветку на две секунды позже коммита с результатом, поэтому порядок «зарегистрировано до получения файла» показать нельзя, и строка не повышается.realdata::ion_sdrзаполняет слова начиная со старшего бита (I в старшей тетраде байта LuGRE; прежнее чтение давало сопряжённый сигнал), сохраняет прежнее чтение какSdrLayout::fill_lsb_firstи читает отсчёты шире слова.acquisition::refine_doppler_coherent: фазово-когерентное уточнение доплера (0,2 Гц СКО при 30 дБ-Гц за 200 мс в моделировании).GPS L1 C/A против gps-sdr-sim: элементы и бит чётности совпадают бит в бит; 230 из 1152 полей LNAV отличаются на единицу, потому что gps-sdr-sim усекает там, где для широковещательного целого нужно округление.
LNAV, декодированный RTKLIB: вся чётность и все подкадры проходят, и каждый параметр в пределах половины кванта; 41 масштабированных значений отличаются на несколько единиц последнего разряда из-за десятичной константы 2^-43 в RTKLIB, что выше зарегистрированного порога.
Захват LuGRE против GNSS-SDR 0.0.19: 266 из 266 решений согласуются, 250 найдены в одной и той же ячейке; большинство положительных результатов — артефакты среднего −0,5 в необработанных 4-битных уровнях; для ветви C/N0 не было одновременных лётных данных. Две пачки (OP5, OP12) были исключены по ошибке: их метаданные согласуются с заголовками, но читатель тогда не мог прочитать отсчёт шире слова.
Захват LuGRE против доплера, предсказанного по орбите: при решении по мощности отсчётов каждый поиск пересекается на шуме с ограниченной полосой; при решении с усреднением по ячейкам сильнейшие пары согласуются по величине с обратным знаком, что показывает: зарегистрированный порядок I/Q является сопряжённым к данным.
Слепой захват на пачках с лунной поверхности: четыре пачки захватывают по одному спутнику (предсказан как видимый, ложной тревоги при 1e-7 нет), ни одна не захватывает два, поэтому для порога по разности доплеров нет пары, которую можно оценить.
Относительный C/N0 на лунном расстоянии (M039 в новой формулировке): 15 записей Block IIR/IIR-M и одна пара — слишком мало для зарегистрированного порога.
Изменения: нет; ни одно опубликованное число, golden-файл или цифра в документации не изменились.
Строка M039 «Земной GNSS на лунном расстоянии» переформулирует своё утверждение на лунном расстоянии как относительный C/N0 между спутниками на одной эпохе плюс видимость (абсолютный C/N0 не заявляется); она остаётся MODELLED. Верхнеуровневый NOTICE содержит указание авторства LuGRE по CC BY 4,0.
Исправлено#
- Лунная ориентация по главным осям DE440 теперь интерполируется по геодезической между суточными узлами. Прежняя поэлементная интерполяция была ошибочна до 2.0e-4 рад (340 м на лунной поверхности) вблизи четвертных точек каждых суток, а не на «около 14 м», как говорилось в строке. Её потребители (геометрия лазерной дальнометрии Луны, лунный датум, наблюдаемость лунных разломов) получают исправленную ориентацию.
- Исправления движка раунда 2, каждое повторно прогнано против неизменённого заранее зарегистрированного допуска: версия IERS строки EOP читается по флагам I/P, а не из пустого блока Bulletin B;
snapshot_raimиспользует геодезический местный уровень; связь лунной системы отсчёта по скорости использует экваториальный радиус, J2 и вращение; подгонка liu22 начинается с нулевых поправок без априорных значений и использует скорость среднего движения из статьи; расстояние между узлами EO учитывает вековую прецессию узла из-за J2; время срыва цикла Костаса использует rho/4; совместное решение применяет широковещательное групповое запаздывание пары; лунное совместное решение использует шаг QR; граница NTN вычисляется в истинном положении; опорные часы конструкции орбитальной группировки берутся у группировки с наименьшим номером в зоне видимости; ряд ориентации DE440 охватывает 2014–2030 и за его пределами выдаёт ошибку вместо ограничения.
Добавлено#
leo_navmsg::truth::TruthOrbit::from_ecef_states, истинная орбита, построенная по табличным состояниям в земной системе координат, используется при сравнении фиттера реальных орбит.- Тестовые файлы и эталонные наборы приведённых выше сравнений, каждый с генератором и
NOTICE.md, указывающим источник, лицензию, дату получения и SHA-256. - Раунд 2:
araim_reference::add_v42_protection_levelsи_ecef(обнаружение отказов по ADD v4.2 по образцу Stanford MAAST для ARAIM 2, уведомление BSD-3 в исходном коде);raim::snapshot_raim_fde;cw_dynamics::second_order_correctionиpropagate_second_order; девятисостоянная модель ошибок INSinertial::coast::ErrorDynamics; частные производныеlunar_vlbi::KernelGeometryи входные данныеlunar-vlbiна пути через ядро;naif_kernel, читатель ядер SPK типа 2 и двоичных PCK;lunar_llr_geometry::llr_bcrs_one_way_mсо станциями ITRF2020; плотность Jacchia 1971;solar_system::link_onпо любому поставщику эфемерид;launch::site_rotation_speed_at;eo_payload::j2_nodal_periodиground_track_spacing_equator_j2;batch_ls::gauss_newton_qr;precise_products(читатели RINEX clock, ANTEX и DCB).
[0.29.3] - 2026-10-01#
Патч-релиз на основе 0.29.2. Kshana Studio перестроена вокруг двух представлений: простого, которое сначала даёт ответ и объясняет простыми словами, и расширенного с полной панелью. Вместе с ним вышли два небольших исправления на kshana.dev. Движок не меняется: каждый встроенный сценарий даёт результат, побайтово совпадающий с 0.29.2, кроме отметки версии.
Изменено#
- В Kshana Studio появилось простое представление. Именно оно открывается в Studio.
- Ответ идёт первым: сценарий открывается на своём результате, изложенном одним простым предложением. У каждого встроенного сценария своё предложение, написанное под то, что этот сценарий измеряет.
- Показано не более пяти параметров, тех, что сильнее всего меняют ответ. Остальные находятся в разделе «Расширенные параметры», свёрнутом, пока вы его не откроете.
- Раздел «Как это вычисляется» объясняет метод в нескольких строках, а раздел «Для исследователей» даёт собственные показатели движка, файл сценария и доказательства, стоящие за результатом.
- Полная панель — это расширенное представление. Здесь есть все панели, графики, экспорты и отчёты прежней Studio.
- Переключатель переносит между двумя представлениями и сохраняет ваше место. Сценарий, представление, в котором вы находились, и все изменённые вами параметры переносятся. Studio запоминает, каким представлением вы пользовались в последний раз. Ссылки с сайта и из документации открывают простое представление; ссылка с
view=advancedоткрывает расширенное представление, а любая прежняя ссылка на Studio по-прежнему открывает тот же сценарий и то же представление. - Более быстрое первое представление при медленном соединении. Записанный ответ для сценария отрисовывается до загрузки остальной Studio, поэтому при медленном мобильном соединении ответ появляется примерно за две секунды вместо примерно девяти.
- Улучшенный поиск. Теперь поиск сначала перечисляет сценарии, у которых область или название совпадают со словами запроса, а затем сценарии, где они лишь упомянуты в имени файла или тексте.
Исправлено#
- Глобус на главной странице больше не пустеет при включённом уменьшении анимации. При включённой системной настройке уменьшения анимации изменение размера окна могло оставить глобус в шапке пустым до прокрутки страницы. Теперь глобус перерисовывается в том же кадре, что и изменение размера.
- L-консоль на главной странице объясняет свою пустую полосу. В сценарии «Смотреть, как глушитель захватывает полосу» панель GPS L5 / Galileo E5a оставалась тёмной всю минуту, что выглядело как поломка. В этом сценарии в этой полосе не передаёт ни один глушитель, а сигналы спутников лежат ниже уровня шума, поэтому там ничто не поднимается над ним. Теперь тихая подпись говорит об этом на любом участке панели, где нет ничего выше уровня шума (панель L5 / E5a и панель L2C до включения её шумового глушителя), вместе с C/N0 и состоянием захвата каждой полосы из того же прогона. Она ставится только там, где нет ничего выше уровня шума, поэтому никогда не закрывает энергию глушителя.
0.29.2 - 2026-10-01#
Патч-релиз на основе 0.29.1. Он убирает дублированный код в модулях навигационного сообщения НОО, слияния и спектра, добавляет светлую тему на kshana.dev, переносит Kshana Studio на её собственный адрес, делает сайт читаемым для поисковых систем и ИИ-ассистентов, исправляет несколько мелочей в Studio и позволяет публиковать релизы npm без хранимого токена. Выход движка не меняется: каждый встроенный сценарий даёт результат, побайтово совпадающий с 0.29.1, кроме отметки версии.
Добавлено#
- Светлая тема для kshana.dev. Любую страницу можно читать в светлой или тёмной теме. Сайт следует системной настройке читателя и имеет переключатель для её смены.
- Поисковые системы и ИИ-ассистенты могут читать сайт. У каждой страницы теперь есть собственные заголовок, описание, канонический адрес, теги социальной карточки и структурированные данные schema.org, а также простой текст для разделов, которые рисует скрипт. Сайт публикует
robots.txt,sitemap.xmlс датой последнего изменения каждой страницы,llms.txtиllms-full.txt(краткое и полное текстовое руководство для ИИ-ассистентов) и ключ IndexNow, чтобы при развёртывании можно было сообщить поисковым системам, что изменилось. - Релизы npm можно публиковать без хранимого токена. Задание npm теперь работает на Node 24 и npm 11.5.1 или новее, которые поддерживают доверенную публикацию npm: npm обменивает идентификацию GitHub задания релиза на краткосрочное удостоверение. Секрет
NPM_TOKENпо-прежнему работает и используется, пока задан, поэтому ничто не меняется, пока для пакета на npmjs.com не включена доверенная публикация. Шаги перечислены вdocs/RELEASING.md.
Изменено#
Заголовок главной страницы читается поверх глобуса. Теперь за заголовком и его текстом лежит мягкая тень, приглушающая линии орбит и точки спутников анимированного глобуса там, где они его пересекают.
У Kshana Studio появился собственный адрес: https://kshana.dev/studio/. Все ссылки на сайте и в документации указывают туда. Старый адрес
/playground/по-прежнему работает и перенаправляет на новый, сохраняя в ссылке сценарий, представление и другие параметры.Исправления Studio. Файл движка скачивается один раз вместо двух. Пока он скачивается, Studio сразу показывает записанный результат сценария с пометкой, что он записан, вместо пустого экрана. На телефоне шапка занимает одну компактную строку. Ключевые показатели переносятся по два в строке, поэтому ни один не уходит за край экрана. Подписи полей используют слова самого сценария, а рядом указано имя поля, и поиск находит поля по любому из них.
Меньше дублированного кода. Таблица единиц навигационного сообщения НОО писала одни и те же десять строк статистики SISRE для четырёх сводок подгонки. Теперь макрос пишет их один раз. Два спектральных водопадных графика используют общую ось времени, цветовую шкалу и панель шкалы C/N0. Понижение разрешения основной сетки использует
downsample_grid, а интеграл Симпсона используетnavsignal::simpson. Две точки входа вида пролёта НОО используют общий шаг настройки.leo_link::geometryимпортирует векторные вспомогательные функцииleo_fusion::geomвместо их копирования. Расширенный отчёт импортирует экранирование HTML из отчёта API вместо его копирования. Каждый из 139 файлов сценариев вscenarios/был прогнан на 0.29.1 и на этом коде, и каждый выходной файл побайтово совпадает.У таблиц единиц leo-navmsg и leo-pvt теперь собственные файлы. Они вынесены из модулей, где есть и логика, в
src/leo_navmsg/units.rsиsrc/leo_fusion/pvt_units.rs.PVT_UNITSсохраняет свой публичный путь. Только эти два файла таблиц добавлены к исключениям из обнаружения копипаста для декларативных каталогов вsonar-project.properties, которые проверяетtests/sonar_cpd_exclusions_are_justified.rs.
Исправлено#
- Значок CI в README показывает результат отправок в main. Значок учитывал запуски по каждому событию в main, поэтому мог показывать «сбой», когда каждый запуск по отправке был зелёным; теперь он запрашивает только запуски по отправке (
event=push).
0.29.1 - 2026-10-01#
Патч-релиз на основе 0.29.0: измеренный показатель покрытия, строка с названием проекта на kshana.dev, более быстрое задание покрытия и обновлённый README. Выход движка не меняется: каждый сценарий даёт тот же результат, что и в 0.29.0.
Изменения опубликованных чисел#
- Покрытие строк: ~96 % → ~95 %. Задание покрытия заново измерило код выпущенной версии 0.29.0 (коммит
db796dd, запуск CI 36809850252, 2026-10-01): 95.35 %, 55 970 из 58 697 строк вsrc/. Опубликованное значение составляло 95,63 % (37 697 из 39 419 строк), измеренное наb1d350dдо 0.28.0; оно округлялось до ~96 %. Новое значение округляется до ~95 %, поэтому вместе меняются все поверхности, которые закрепляетtests/coverage_figure_doc_sync.rs:docs/COVERAGE.md, значок README, строка Evidence и таблица CI, значки crates.io, PyPI и npm, технический отчёт и страница покрытия на kshana.dev. Нижний порог 85 % не изменился.
Добавлено#
- Строка с названием на kshana.dev. «Kshana · क्षण · the precise instant» теперь открывает главный экран Home и стоит под маркой в подвале каждой страницы. kshana.dev по-прежнему не делает запросов к другим узлам: деванагари — это собственный подмножественный шрифт Noto Sans Devanagari из трёх букв क्षण (1 692 байт,
web/fonts/, с текстом SIL Open Font License и его SHA-256 вweb/fonts/FONTS.json).web/tools/fetch_third_party.pyнаучился сохранять подмножество Google Fontstext=под адресуемым по содержимому именем файла.
Изменено#
- Ссылки сайта приводят туда, куда указывают, по чистым адресам. Ссылка на раздел теперь ставит этот раздел сразу под шапкой, на телефоне и на компьютере: ссылка на сектор в Missions открывает этот сектор с его панелью вверху; ссылки на Capabilities и Editions удерживают своё место, пока рисуются графики над ними; Editions больше не добавляет второй отступ шапки; а ссылка внутрь свёрнутой части страницы документации раскрывает её. Каждая страница связана по чистому адресу (
/evidence#research,/docs/changelog,/для Home), и канонические ссылки, карта сайта и перенаправления со старых адресов называют те же адреса; адреса.htmlпо-прежнему работают. У Research теперь собственная ссылка в шапке, между Evidence и Developers, и в подвале. Документация больше не показывает дорожную карту (ROADMAP.mdостаётся в репозитории): группа Project — это Changelog, Licensing, Security, Contributing, Governance и Code of conduct, а Glossary перенесён в Get started. - Задание покрытия стало быстрее. На 0.29.0 оно заняло 143 минут против нормальных 91 до
- Фаззер
tests/property.rs, причина в прошлый раз, занимал 4 из них. Встроенный корпус вырос с 74 до 139 сценариев, и три тестовых бинарника обходили его целиком по одному файлу (determinismдважды,advanced_reportиanimationпо разу): вместе 37 минут под инструментированием покрытия против 3 на 0.27.2. Теперь они используют общийtests/support/corpus.rs, который выполняет работу по каждому сценарию на всех ядрах и возвращает результаты в отсортированном порядке; каждый сценарий и каждое утверждение остаются. На ноутбуке arm64, отладочная сборка:determinismзанимает 143 с на 14 ядрах против 612 с приKSHANA_CORPUS_THREADS=1(прежний последовательный обход).
- Фаззер
- README обновлён. Он открывается той же строкой с названием, что и сайт; снимки экрана Studio сделаны заново с Studio 0.29.1, с новым снимком Studio на телефоне и её нижней панелью шагов; новая полоса «The site» показывает три страницы kshana.dev из сборки 0.29.1 (
tools/capture_site_shots.mjs, составленаtools/readme_shots.pyи записана вdocs/assets/readme/site/SHOTS.json); показатель покрытия читается как ~95 %; а альтернативный текст рисунка об исследованиях, повторявший текст рисунка архитектуры, теперь описывает статьи. Значки в шапке стали меньше и короче (18 px в высоту; «~95%», «83/223», «quality», «AGPL-3.0», «zenodo.20528627»), так что все одиннадцать помещаются в две строки; каждая ссылка и альтернативный текст сохраняют полный смысл. - Заданию образа контейнера отведено 90 минут. В v0.29.0 эмулируемая сборка образа
kshana-mcpпод linux/arm64 упёрлась в прежний предел в 45 минут при компиляции последнего крейта, поэтому образ, запись реестра MCP и проверка канала не были опубликованы. Теперь предел составляет 90 минут; образ не изменился. - Восемь литералов с плавающей запятой сгруппированы заново в
src/ephem.rsиsrc/sgp4.rs(0.323_273_64→0.323_273_640): SonarQube Cloud принимал последнюю группу_64или_32за отсутствующий суффиксf64илиf32(правило S7454). Значения — те же числа, поэтому каждый результат не изменился.
0.29.0 - 2026-10-01#
Двенадцать новых видов сценариев и три новых способа прочитать прогон. Теперь движок охватывает радиоспектр, всю Солнечную систему, орбитальные группировки вокруг любого тела, кампании, объединяющие сценарии в одну миссию, и позиционирование, навигацию и время (PNT) с низкой околоземной орбиты (НОО) от сигнала до решения. Любой прогон также можно записать как анимацию, полный отчёт и набор файлов совместимости для других инструментов.
Вокруг движка: перепроектированный kshana.dev (многостраничный сайт и новая панель Kshana Studio, запускающая в браузере любую возможность), переписанный README, четырнадцать инструментов на сервере Model Context Protocol (MCP), браузерная сборка, дающая те же числа, что и нативная, и публичная страница Kshana Pro.
| 0.28.0 | 0.29.0 | |
|---|---|---|
| Виды сценариев | 63 | 75 |
| Файлы сценариев (плюс один манифест набора) | 77 | 138, из которых 132 входят в поставку для kshana example |
| Строки матрицы верификации | 174 | 223 |
| из них VALIDATED относительно внешнего оракула | 66 | 83 |
| из них MODELLED (заявленная модель, проверенная на внутреннюю согласованность) | 104 | 136 |
| из них PARTNER (нужны оборудование или данные партнёра) | 4 | 4 |
Откуда берётся рост:
| Область | Виды | Файлы сценариев | Строки матрицы (validated + modelled) |
|---|---|---|---|
| Спектр | 1 | 1 | 3 (1 + 2) |
| Солнечная система и позиционирование вокруг любого тела | 2 | 3 | 6 (2 + 4) |
| Проектирование орбитальной группировки | 1 | 3 | 3 (2 + 1) |
| Кампании | 1 | 5 | 3 (0 + 3) |
| Морские, дорожные и железнодорожные сценарии | 0 | 5 | 0 |
| Анимация, отчёты, экспорты совместимости | 0 | 0 | 0 |
| Конструкции сигналов НОО и многополосный спектр | 1 | 4 | 4 (2 + 2) |
| Пролёт LEO и бюджет линии | 1 | 6 | 9 (6 + 3) |
| Навигационное сообщение LEO | 1 | 5 | 9 (3 + 6) |
| Позиционирование, синхронизация и слияние для НОО | 3 | 8 | 8 (1 + 7) |
| Сквозная цепочка НОО | 1 | 3 | 1 (0 + 1) |
| Сценарии устойчивости НОО, целевых областей и конечных пользователей | 0 | 18 | 3 (0 + 3) |
| Всего добавлено | 12 | 61 | 49 (17 + 32) |
Возможность НОО не привязана к системе: она работает на общих заданных параметрах и не требует именованной системы. Именованные системы — необязательные пресеты, каждый в своём файле с публичным источником. Один пресет, Celeste IOD (демонстрация на орбите), использует показатели, представленные на семинаре ESA NAVISP LEO-PNT, 2026 (ESA — Европейское космическое агентство; NAVISP — его Программа инноваций и поддержки в области навигации); он находится в одном файле, src/celeste_iod.rs, вместе со своими пятью сценариями только для репозитория, поэтому его можно не включать без правки исходного кода, и ни один показатель семинара не повторяется в этом журнале изменений.
Прочтите «Изменения опубликованных чисел» перед обновлением. Меняется один выход движка (столбцы инерциальной системы координат вида ephemeris после исправления знака в матрице нутации), а аудит документации исправил значения, напечатанные в прежних документах.
Сокращения, используемые в этой записи
Статусы: VALIDATED означает проверку по независимому внешнему оракулу (опубликованной таблице, программе другой группы или измеренным данным); MODELLED означает заявленную модель, проверенную только на внутреннюю согласованность; PARTNER означает, что для проверки нужны оборудование или данные партнёра.
| Сокращение | Значение |
|---|---|
| 3GPP, 5G, NTN | 3rd Generation Partnership Project (Проект партнёрства третьего поколения); мобильная сеть пятого поколения; нетеррестриальная сеть |
| AD, BC | календарные эры (от Рождества Христова, до Рождества Христова) |
| AIAA | Американский институт аэронавтики и астронавтики |
| AltBOC, BOC, BPSK, MBOC | альтернативная бинарная смещённая несущая; бинарная смещённая несущая; двоичная фазовая манипуляция; мультиплексированная бинарная смещённая несущая (модуляции сигналов) |
| ATOMIC | Autonomous Time and Orbit Determination for Microsatellite Constellations (опубликованная модель эфемерид НОО) |
| C/A, L1, L2, L2C, L5 | код грубого захвата (coarse/acquisition), а также названия несущих и гражданских сигналов Global Positioning System |
| C/N0 | отношение несущей к спектральной плотности шума |
| CIO | Celestial Intermediate Origin (небесное промежуточное начало) |
| CLI | интерфейс командной строки |
| CRC-24Q | 24-битная циклическая проверка избыточности (полином Qualcomm) |
| CSAC | атомные часы микроскопического масштаба (chip-scale) |
| CSS, HTML, SVG, XML | каскадные таблицы стилей; язык гипертекстовой разметки; масштабируемая векторная графика; расширяемый язык разметки |
| CSV, JSON, PDF, TOML, URL | значения, разделённые запятыми; запись объектов JavaScript; переносимый формат документов; Tom's Obvious Minimal Language; единый указатель ресурса |
| CW | непрерывная волна |
| CZML, KML, GeoJSON | Cesium Language; Keyhole Markup Language; Geographic JSON (форматы карт и глобусов) |
| DE441 | Development Ephemeris 441 Лаборатории реактивного движения |
| DOI | идентификатор цифрового объекта |
| DOP, GDOP, PDOP, HDOP, VDOP | геометрический фактор (ухудшение точности): геометрический, по положению, горизонтальный, вертикальный |
| E1, E5, E5a, E5b | названия сигналов Galileo |
| E3F | название слота в таблице орбитальной группировки Global Positioning System |
| ECEF | земная система координат с центром в центре масс Земли |
| EE | уравнение равноденствий |
| EGM2008 | Earth Gravitational Model 2008 |
| EIRP | эквивалентная изотропно излучаемая мощность |
| ERFA, SOFA | Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy (библиотеки опорной астрономии) |
| ESA, NAVISP | Европейское космическое агентство; его Программа инноваций и поддержки в области навигации |
| FDMA | множественный доступ с частотным разделением |
| GCRF, GCRS | Геоцентрическая небесная система отсчёта (Geocentric Celestial Reference Frame); Геоцентрическая небесная система координат (Geocentric Celestial Reference System) |
| GLONASS | Глобальная навигационная спутниковая система России |
| GNSS, GPS | глобальная навигационная спутниковая система; Global Positioning System |
| IAU | Международный астрономический союз |
| ICD, OS SIS ICD, OS SDD | документ по управлению интерфейсом; Galileo Open Service Signal-In-Space Interface Control Document; Galileo Open Service Service Definition Document |
| ICRF | Международная небесная система отсчёта |
| IMO | Международная морская организация |
| INS, MEMS | инерциальная навигационная система; микроэлектромеханическая система |
| IOD | демонстрация на орбите |
| IQ | синфазная и квадратурная составляющие |
| IS-GPS-200 | спецификация интерфейса Global Positioning System |
| ISS | Международная космическая станция |
| ITRF, ITRS, PEF, TEME | Международная земная система отсчёта (International Terrestrial Reference Frame); Международная земная система координат (International Terrestrial Reference System); псевдоземная (pseudo-Earth-fixed); истинный экватор, средний equinox (системы отсчёта) |
| ITU, ITU-R | Международный союз электросвязи; его Сектор радиосвязи |
| J/S | отношение мощности помехи к мощности сигнала |
| J2–J6, J2000 | зональные гармоники поля тяжести; эпоха 2000-01-01 12:00 |
| JPL | Лаборатория реактивного движения |
| LEO, MEO | низкая околоземная орбита; средняя околоземная орбита |
| MBSE | системная инженерия на основе моделей |
| NEES | нормированный квадрат ошибки оценивания |
| NeQuick-G | ионосферная модель Galileo |
| OEM, SP3, TLE | Orbit Ephemeris Message; Standard Product 3 (прецизионные орбиты); двухстрочный набор элементов |
| PNT, PPP | позиционирование, навигация и время; прецизионное точечное позиционирование |
| PSD, SSC | спектральная плотность мощности; коэффициент спектрального разделения |
| RAIM, SQM | автономный контроль целостности приёмника; контроль качества сигнала |
| RINEX, RTCM | Receiver Independent Exchange Format; Radio Technical Commission for Maritime Services |
| RMS | среднеквадратичное значение |
| RTKLIB | библиотека позиционирования по GNSS с открытым исходным кодом, используемая здесь как оракул |
| SGP4 | Simplified General Perturbations 4 (модель орбиты двухстрочных наборов элементов) |
| SHA-256 | Secure Hash Algorithm, 256-битный |
| SigMF | Signal Metadata Format |
| SISRE | ошибка дальности сигнала в пространстве |
| SPS PS | Standard Positioning Service Performance Standard |
| SRTM | Shuttle Radar Topography Mission |
| STK | Systems Tool Kit (его формат файла эфемерид .e) |
| STL | Satellite Time and Location |
| SVID | идентификатор космического аппарата |
| T/P/F | общее число спутников, плоскостей и фазирование группировки Walker |
| TEC | полное электронное содержание |
| UHF | ультравысокая частота |
| UTC | всемирное координированное время |
| WGS 84 | World Geodetic System 1984 |
| X1, X5 | названия сигналов системы Xona Pulsar |
Изменения опубликованных чисел#
Изменение опубликованного числа является пересмотром и фиксируется, а не исправляется молча. Этот релиз содержит один пересмотр выхода движка и несколько пересмотров значений, напечатанных в документации.
Выход движка
- Приведение TEME→GCRS поворачивало на 2·Δψ: в матрице нутации был перевёрнут знак Δψ.
nutation::numatстроилRx(−(ε̄+Δε))·Rz(Δψ)·Rx(ε̄), там гдеiauNumatиз SOFA строитRx(−(ε̄+Δε))·Rz(−Δψ)·Rx(ε̄), поэтомуnutation_matrix,nutation_matrix_2000a,teme_to_gcrsиgcrs_to_temeповорачивали на удвоенную нутацию по долготе, около 25 угловых секунд. Каждая проверка цепочки была свойственным тестом (собственное вращение, обратимость, ненулевой вклад нутации), который проходит при ошибке знака; сквозной тест Vallado охватывал TEME→PEF, TEME→ITRF и GCRS→ITRS, но не TEME→GCRS. На примере Vallado (AIAA 2006-6753, 2004-04-06) цепочка расходилась с опубликованным GCRF на 1 145 м; теперь она оказывается в 0,11 м от него, а матрица совпадает сnumatиз ERFA до 1e-14.tests/frame_reference_vectors.rs::teme_to_gcrs_matches_vallado_gcrfиnutation::tests::nutation_matrix_matches_erfa_numatоба не проходят при старом знаке. Тест согласованности CIO (Celestial Intermediate Origin) вsrc/cio.rsотносил получавшееся расхождение ~130 м на счёт «≈ 2·EE»; теперь остаток составляет 5 см, а его граница сужена с 250 м до 1 м. Это сдвигает опубликованные числа, что здесь записано как пересмотр: столбцыgcrs_r_mиgcrs_v_m_sвидаephemeris(около 0,8–1,0 км для встроенного сценария ISS (Международная космическая станция); его столбцы TEME, земной системы, трассы на поверхности, углов места и доплера не меняются), а такжеPropagator::position_in_frame/state_gcrsдля систем GCRS и ITRS. Ни одна сводная строка, график или golden-хеш встроенного сценария не читает эти столбцы. Новые экспорты совместимости используют исправленную цепочку: положение CZML первого спутникаorbit-sgp4-gpsсогласуется с приведением ERFA того же TLE (распространённого пакетом Pythonsgp4) до 2,3 см. - Вид
leo-navmsg, нативно и в браузерной сборке. Теперь вид вычисляет каждую трансцендентную функцию через одну переносимую математическую библиотеку, поэтому его кадр состоит из тех же байтов на любой платформе и в любой сборке (при Fixed). Вместе с этим смещается каждый показательleo-navmsgи этапnavmsgвleo-pnt-chain. Вид появился в этом релизе, поэтому ничего из прежнего релиза не смещается, но показатели, напечатанные до исправления, смещаются: контрольное значениеdocs/LEO-NAVMSG.mdдля сценария кодирования и декодирования было0x110315и стало0x19105F, а SISRE декодированного сообщения составляет 0,129 см. На kshana.dev карточка Missions дляleo-navmsg-fit-interval-tradeпоказывала наихудшую ошибку дальности 1,6 мм при подгонке на 60 с и 40,3 мм при подгонке на 900 с; теперь сайт собран из движка этого релиза и показывает 1,8 мм и 46,6 мм. - Карта зоны подавления на kshana.dev (Missions). Каждая из её 875 ячеек — один прогон
maritime-strait-jamming, в котором изменено только положение приёмника. Теперь ячейки вычисляются по тем же трёхзнаковым координатам, которые ссылка ячейки «открыть этот прогон» передаёт Kshana Studio, поэтому ячейка показывает ровно то, что воспроизводит её ссылка. Среднее отношение мощности помехи к мощности сигнала (J/S) в 30 ячейках смещается на 0,1 дБ вверх или вниз; доступность слежения не меняется ни в одной ячейке. Движок даёт одинаковые результаты для каждой ячейки в 0.28.0 и 0.29.0. - Повторная выборка с начальным значением в пакете WebAssembly (WASM). Сборка для браузера брала другие индексы бутстрепа и перемешивания, чем нативная сборка, из того же начального значения (в разделе «Исправлено»). Интервал
quantum-anomaly-detectплощади под кривой в браузере был[0.9901265, 0.9938305], а теперь равен нативному[0.99035875, 0.993861]. Ни одно нативное число не меняется.
Величины, напечатанные в документации
Документация была проверена слово за словом по прогонам движка этого выпуска. Если напечатанная величина не совпадала с прогоном, документ исправляли, и каждое исправление перечислено здесь, старое → новое. Во всех приведённых ниже случаях выходные данные движка не менялись; документ был прочитан неверно, неверно округлён или устарел.
- Аудит документации страниц о спектре, орбитальной группировке, кампании, анимации, отчёте и совместимости и новый
docs/SOLAR-SYSTEM.md. Каждая величина была заново получена этим движком. Меняются два опубликованных числа:docs/CONSTELLATION-DESIGN.mdдавал тест покрытия 5 000 спутников как «около 0,13 с в отладочной сборке»; это не воспроизвелось (1,24 с на загруженном ноутбуке), поэтому страница теперь приводит долю предфильтра, которую печатает тест (9,9 % из 19 440 000 проверок пар), и 0,14 с выпускного двоичного файла для входящего в поставкуleo-pnt-mega-shell. Та же страница давала пересечение E3F как «отклонение 0,050 град.»; ни один тест не печатает эту величину, поэтому страница теперь указывает только порог 0,06 град., который тест обеспечивает, и стоящий за ним вывод 7,30 против 7,36 град. Выходные данные движка не меняются. - Документы по LEO-PNT: пересмотренные опубликованные величины (заново получены на движке этого выпуска).
Компромисс по диапазону в
docs/LEO-SIGNAL.md: ионосферная задержка первого порядка дляgeneric-sравна 3,24 м (напечатано 3,25 м), а дляgeneric-c-wide0,77 м (было 0,78 м). Кодирование и декодирование вdocs/LEO-NAVMSG.md: SISRE декодированного сообщения было напечатано как 0,119 см, тогда как прогон дал 0,122 см; теперь страница печатает 0,129 см, то есть величину после исправления независимости от платформы в разделе «Исправлено» ниже. Пролёт LEO против GNSS вdocs/LEO-PASS.md: на 32 дБ меньше потерь в свободном пространстве в пике пролёта (было «от 26 до 32 дБ»). Для величин по сигналам и пролётам выходные данные движка не менялись; документы были прочитаны неверно или неверно округлены. - Учебные руководства, рабочий пример конвейера и команда
/kshana-run, проверенные по движку этого выпуска. Поправки к опубликованным величинам, старое → новое: видов, которые записывают<scenario>.table.csv, шесть, а не четыре (leo-navmsgиtelecom-timingотсутствовали;docs/tutorials/README.md,commands/kshana-run.md); пересечение ½bT² для холодных атомов в руководстве 3 равно 18 443 с, а не 18 440 с; ошибка кругового обменаoem-interopвdocs/examples/multi-tool-pipeline.mdравна измеренным 4.88e-7 км, а не «~1e-7 км»; полоса holdover CSAC в руководстве 2 равна 2000–3200 с, как утверждает тест, а не «~2600–4400 с»; руководство 1 приводит строки SP3 и блок геометрии с той точностью, с какой их записывает движок. Выходные данные движка не менялись. - Страницы о валидации, квантовой части, SGP4, анимации, утверждениях и целостности.
docs/VALIDATION.md: обеспечиваемый порог для смоделированной односекундной девиации Аллана часов с белым частотным шумом равен 20 % (было напечатано 25 %; порог 25 % — тот, что на кривой при 1, 10 и 100 с); строка случайного блуждания скорости теперь указывает свой обеспечиваемый порог 20 % рядом с наблюдаемыми около 12 %; а доступность атомных часов чип-масштаба вorbit-gnss-challengedравна около 0,73 (было напечатано около 0,83).docs/QUANTUM.md: шум на выстрел, ограниченный вибрацией, в рабочем примере с холодными атомами на странице составляет около 46 от своего дробового предела (было «~45×»; пересчитано 46,49), а диапазон «1–50 мкг/√Гц» для полевых устройств, противоречивший устройству, которое цитирует сама страница, заменён опубликованными величинами двух процитированных устройств.docs/SGP4-VALIDATION.md: наибольшее расхождение положения равно 4,12 мм (было «≈ 4 мм»), со спутником, названным по имени.docs/ANIMATION.md: пример видеокодера читал кадры 24 кадров в секунду как 12; теперь он использует 24, скорость, указанную в манифесте кадров.docs/CLAIMS-VS-REALITY.md: у модели подавления 10 тестов (было 8), а «2,97 м против 48,8 м» для связанного фильтра заменено тем, что утверждает его тест (ошибка положения связанного фильтра ниже 0,6 от ошибки несвязанного, с выигрышем не менее чем в 90 из 100 испытаний).docs/INTEGRITY.md: отметка «Сегодня» читалась как v0.22.0; теперь она называет этот выпуск, а две возможности, построенные с тех пор (режим отказа всей группировки и вспомогательное сообщение о целостности), исключены из списка пробелов.
Добавлено#
Спектр
- Вид сценариев
spectrum: модель спектра L-диапазона и водопад (src/spectrum.rs,src/sigmf.rs,docs/SPECTRUM.md). Весь L-диапазон GNSS как одна спектральная плотность мощности (PSD): GPS L1 грубый/захватный (C/A) и L2 гражданский (L2C) (BPSK(1)), Galileo E1 (мультиплексированная двоичная офсетная несущая, MBOC(6,1,1/11), или BOC(1 1)), GPS L5 и Galileo E5a (BPSK(10)), шумовой порог kT с коэффициентом шума приёмника и источники помех в виде непрерывной волны (CW), узкополосные, чирп и согласованный шум по заданной временной шкале. Каждый источник помех оценивается по каждой полосе его коэффициентом спектрального разделения (SSC), что даёт отношение помеха/сигнал (J/S) и эффективное отношение несущая/шум (C/N0) для каждой полосы и каждой строки. График — это SVG-водопад со столбцами C/N0; result.json содержит сетку, усреднённую блоками по мощности. Необязательная секция[iq]рисует модель как отсчёты IQ, записывает и читает запись Signal Metadata Format (SigMF) (cf32_le,ci16_le) и сравнивает оценку Уэлча с моделью; необязательная секция[recording]оценивает реальный файл SigMF. Входящий в поставку примерscenarios/l-band-waterfall-jamming.toml: чирп забирает L1 C/A и E1 на 10 с, тон CW на несущей L1 удерживает C/A на 17,98 дБ-Гц после остановки чирпа, тогда как E1, у которого в спектре здесь нуль, восстанавливается; L5 и E5a не затрагиваются.- Новая строка VALIDATED: PSD сигналов и SSC относительно главного лепестка BPSK(n) шириной 2n x 1,023 МГц, лепестков BOC(1 1) с центрами при +/-1.023 МГц, замкнутых форм Парсеваля, стоящих за опубликованными SSC -61.8 / -64.8 / -67.8 дБ/Гц, и учебникового Q = 1 (CW) и 1,5 (согласованный). Максимум PSD BOC(1 1) находится при +/-0.759 МГц, а не в центре лепестка; тест закрепляет и то и другое.
- Две новые строки MODELLED: водопад и временная шкала C/N0, которые сводятся ровно к цепочке вида
jamming(перекрёстно проверяется в каждом отчёте), и кодек SigMF с оценивателем Уэлча. Записи третьих сторон в репозитории нет. navsignal: вариант MBOC иspectral_separation_coeff_offset.- Отчёт печатает C/N0, которое дала бы репрезентативная таблица Q вида
jamming, рядом с полученным по спектру; для тона CW на несущей C/A они различаются на 1,8 дБ. Три новые строки матрицы: одна validated (спектры сигналов и коэффициенты спектрального разделения) и две modelled.
Солнечная система
- Эфемериды Солнечной системы и позиционирование вокруг любого тела. Два новых вида сценариев.
solar-system: Солнце, восемь планет, Плутон, Луна, Фобос, Деймос, Ио, Европа, Ганимед, Каллисто и Титан в одну эпоху: гелиоцентрические положение и скорость в Международной небесной системе отсчёта (ICRF), гравитационный параметр, радиусы, J2 (вторая зональная гармоника), где она опубликована, сидерическое вращение, полюс и нулевой меридиан по Международному астрономическому союзу (IAU), трек орбиты за один оборот, а также время распространения света, односторонняя и двусторонняя дальность, солнечная задержка Шапиро и угловое расстояние до Солнца от тела-наблюдателя и для любой дополнительной линии. Планеты берутся из кеплеровых элементов Лаборатории реактивного движения (JPL) по Стэндишу и Уильямсу (таблица 1, от 1800 н. э. до 2050 н. э.; таблицы 2a/2b, от 3000 до н. э. до 3000 н. э.); спутники — из средних элементов JPL с синхронной скоростью вращения по IAU, а Титан — из модели вращения IAU. Пример:scenarios/solar-system-tour.toml.body-pnt: орбитальный аппарат или посадочный модуль на поверхности любого из этих тел, навигирующий по псевдодальностям от группировки Уокера вокруг тела и по безчасовой двусторонней дальности от Земли; геометрический фактор DOP, формальная неопределённость и решения методом наименьших квадратов с начальным значением с линией до Земли и без неё. Примеры:scenarios/mars-orbit-pnt.toml,scenarios/europa-surface-pnt.toml.Bodyполучает Меркурий, Венеру, Юпитер, Сатурн, Уран, Нептун, Плутон и семь спутников, поиск по имени и физическую запись;AnalyticSolarSystemдаёт любое тело относительно любого другого через существующий шовEphemerisProvider.- VALIDATED относительно JPL Horizons (эфемериды разработки DE441; тестовые данные и запросы в
tests/fixtures/solar_system/): от Меркурия до Сатурна и Земля по таблице 1 в пределах удвоенной заявленной номинальной ошибки (наихудшее 1,87 раза), все восемь планет по таблицам 2a/2b (наихудшее 1,71 раза) и время распространения света от Земли до Марса и Юпитера. MODELLED: Уран и Нептун по таблице 1, которые превышают заявленную ошибку относительно DE441 (в 2,0 и 5,2 раза), Плутон, спутники, константы тел и результатыbody-pnt. - Результат: лунный ряд Монтенбрука и Гилла в
src/ephem.rsуже приведён к равноденствию J2000 собственным членом прецессии (0,05 градуса от Horizons), поэтому он используется без дополнительного поворота прецессии. Шесть новых строк матрицы: две validated (положения планет, время распространения света) и четыре modelled.
Орбитальные группировки вокруг любого тела
- Проектирование орбитальных группировок в масштабе (вид
constellation-design,src/constellation.rs). Схемы Уокера дельта и Уокера звезда (T/P/F), явные списки элементов и многооболочечные проекты, несколько группировок за прогон, вокруг Земли, Луны, Марса или любой другой планеты, Плутона или крупного спутника по константам тел, добавленным видомsolar-system. Предустановки по опубликованным номинальным элементам: базовая и расширяемая 24-слотовая группировка Global Positioning System (GPS) (Standard Positioning Service Performance Standard, SPS PS, 2020), Galileo Walker 24/3/1 (Open Service Service Definition Document, выпуск 1,1), BeiDou с орбитами средней высоты Walker 24/3/1 плюс геостационарные и наклонные геосинхронные спутники (Open Service Performance Standard 3,0) и ГЛОНАСС 24/3/1 (Interface Control Document 5,1). Покрытие и геометрический фактор DOP по сетке широт и долгот: спутники в зоне видимости, GDOP, PDOP, HDOP и VDOP (геометрический, по положению, горизонтальный, вертикальный) и доступность по ячейкам, глобально и в наихудшем пункте, с одними часами приёмника на группировку. Префильтр видимости (половина угла покрытия плюс полоса широт подспутниковой точки, точный на сферическом теле) обрабатывает 5 000 спутников на сетке 10 град. примерно за 0,13 с в отладочной сборке.- VALIDATED: генератор Уокера воспроизводит таблицу 23 Galileo OS SDD и формулу слотов ГЛОНАСС ICD; предустановка GPS воспроизводит столбец пересечений экватора SPS PS (35 из 36 пунктов в пределах 0,0108 град.; E3F в пределах 0,06 град., причём собственная строка таблицы противоречива); глобальное распределение HDOP базовой группировки GPS совпадает с приложением B к SPS PS (медиана 0,940 против 0,94, 95 % — 1,255 против 1,25, среднее 0,965 против 0,96; порог 0,03).
- MODELLED: произвольные проекты, другие тела, фаза BeiDou и узлы наклонных геосинхронных орбит, двухтельные орбиты с необязательным J2, только геометрия.
- Сценарии:
constellation-multi-gnss-coverage(102 спутника, доступность 100 %, медианный PDOP 0,95, 31,0 в зоне видимости выше 10 град.),leo-pnt-mega-shell(5 000 спутников, доступность 99,22 % при PDOP 3 или менее выше 20 град., 0 % на полярных шапках, префильтр оставляет 11,5 % проверок пар),lunar-relay-constellation(14 спутников вокруг Луны, общая доступность 21,33 % и наибольшая над южным полярным районом). Все три входят в поставку дляkshana example. Примечания:docs/CONSTELLATION-DESIGN.md. Три новые строки матрицы: две validated (генератор Уокера и предустановки GNSS, глобальный DOP GPS) и одна modelled.
- Кампания, управляемая моделью спектра, и орбитальные группировки вокруг любого тела.
scenarios/campaign-spectrum-holdover-integrity.tomlсвязывает видspectrumс holdover часов и монитором целостности (чирп забирает L1 C/A и E1; затем тон CW удерживает C/A подавленным, пока E1 восстанавливается и приёмник переходит на небо только Galileo), и закреплена относительно отдельного примера водопада вtests/campaign_composition_reference.rs.constellation-designтеперь определяет своё центральное тело черезBody::by_name, так что группировку можно разместить вокруг любой планеты, Плутона или крупного спутника с константами, которые использует видsolar-system.
Кампании
- Кампании: множество сценариев, объединённых в один прогон. Новый вид
campaign(src/campaign.rs, описан вdocs/CAMPAIGNS.md) запускает участников существующих видов через ту же диспетчеризацию, что и командная строка, и считывает числа из их результатов. Четыре секции, в любом сочетании:[[phases]]: цепочечная миссия на одной временно́й шкале. Предустановки по видам считывают ошибку времени часов относительно её защитного предела, среднее эффективное отношение несущая/шум (C/N0) относительно порога сопровождения, вертикальный уровень защиты относительно предела тревоги, ошибку положения, число сопровождаемых спутников и флаги тревог, удерживаемые на общей сетке с границами фаз и событиями. Состояние передаётся черезcarry,handoffиend_at.[sweep]: от одного до трёх ключей с точками из любого вида, по выбору с ансамблем с начальным значением в каждом узле.[monte_carlo]: реализация k при базовом начальном значении + k, со средним, разбросом, процентилями и бутстрепным доверительным интервалом 95% с фиксированным начальным значением.[compose]: общие значения, привязанные к нескольким участникам, с объединённой сводкой лучшего и худшего. Каждый результат несёт хеш кампании и дайджест по результатам всех участников. Четыре входящих в поставку сценария:campaign-jam-spoof-holdover-integrity(номинальный режим, подавление, спуфинг, прекращённый при обнаружении монитором часов на 370 с, holdover с поддержанием 37,0 нс подменённого смещения при инерциальном блоке на выбеге, тревога целостности, восстановление),campaign-sweep-jammer-power,campaign-shared-jammer-sea-roadиcampaign-monte-carlo-clock-holdover.tests/campaign_composition_reference.rsзакрепляет тождества композиции: кампания из одной фазы воспроизводит отдельный прогон бит в бит на трёх видах, ансамбль с фиксированным начальным значением побайтно стабилен, а у часов с белым частотным шумом среднее ансамбля лежит внутри указанного интервала с разбросом внутри интервала хи-квадрат для sqrt(q_wf * tau) = 16,459 нс. Три новые строки матрицы modelled.
Анимация
- Экспорт анимации (
--animate svg|html|frames|all,src/animation.rs,docs/ANIMATION.md). Любой прогон, результат которого несёт временной ряд, теперь можно записать как анимированный файл Scalable Vector Graphics (SVG) (ключевые кадры Cascading Style Sheets, без скриптов: линии прорисовываются за движущимся временны́м курсором), как один самодостаточный проигрыватель HyperText Markup Language (HTML) (воспроизведение и пауза, перемотка, скорость, каждая панель на одном синхронизированном курсоре, маркеры событий, переходящие по щелчку; без внешних ресурсов) или как пронумерованную последовательность кадров SVG сmanifest.json, указывающим кадры в секунду, длительность и времена кадров для видеокодера. Кампания проигрывается по своим фазам с отмеченными тревогами; прогон спектра анимирует водопад строка за строкой. Проигрыватель следуетprefers-color-scheme, а приprefers-reduced-motionи SVG, и проигрыватель показывают готовую картинку вместо движения.--animate-fpsи--animate-durationзадают воспроизведение;kshana::api::animate_tomlиkshana::animation::animate_result— точки входа библиотеки, аresult.jsonполучает блокanimationтолько когда выполняется--animate. Вывод является чистой функцией результата и параметров, побайтно идентичен при повторном прогоне и без метки времени. Вид без выборочной временно́й оси отвергается с сообщением «no time series to animate», и ничего не записывается. Экспортёр рисует собственные выборки прогона и не добавляет ни одного числа, поэтому он MODELLED (внутренняя согласованность) и не несёт строки матрицы верификации; опубликованные числа не меняются. Тесты:tests/animation.rs(детерминизм, число кадров, отсутствие внешнего адреса, корректность XML, путь сокращённого движения и анимация каждого входящего в поставку сценария с временны́м рядом).
Отчёты
- Расширенные отчёты о прогонах (
src/advanced_report.rs, docs/REPORTS.md). Каждый прогон интерфейса командной строки (CLI) теперь записывает<scenario>.report.html, печатный отчёт HyperText Markup Language (HTML), и<scenario>.report.json, то же содержимое в виде машиночитаемого документа JavaScript Object Notation (JSON). Разделы: краткая сводка; каждый входной параметр сценария с его единицей, считанной из схемы единиц полей (блокunitsрезультата), иначе из суффикса имени поля, иначе с указанием, что она не указана; результаты с графиком прогона, каждым скаляром и сводкой по каждому числовому столбцу; для кампании — таблица узлов перебора, среднее Монте-Карло, стандартное отклонение, 5-й / 50-й / 95-й процентили и бутстрепный доверительный интервал с гистограммой для каждой метрики, таблица фаз цепочки или участники композиции и объединённая сводка (и сетка прогонаsweepилиsweep-nd); временна́я шкала событий; метка VALIDATED / MODELLED / PARTNER, оракул и тестовые свидетельства каждой строки матрицы верификации, которую задействуют виды прогона, считанные из матрицы через таблицу соответствия вида и строки (строка, оценивающая один входной путь, например путь Simplified General Perturbations 4 (SGP4) вorbitили путь измеренной записи вslot-timing, перечисляется только когда прогон шёл по этому пути, а строка читателя Shuttle Radar Topography Mission (SRTM) не перечисляется ни для одного вида, так как ни одно поле сценария не читает тайл SRTM); утверждения о том, что не моделируется, и допущения, каждое с цитатой из источника; и запись воспроизводимости (версия движка, коммит исходного кода, когда сборка задаётKSHANA_GIT_COMMIT, дайджесты Secure Hash Algorithm 256-bit (SHA-256) файла сценария и документа результата, начальное значение, платформа и точная команда). Отчёт не читает часы: один и тот же сценарий, начальное значение и сборка движка дают побайтно идентичный отчёт, а единственная метка времени, которую он может показать, — та, которую уже записывает--study-name. Таблица стилей печати вписывается в A4 и US Letter, повторяет заголовки таблиц и сохраняет строки и рисунки целыми на страницах; файл Portable Document Format (PDF) создаётся командой браузера «Сохранить как PDF». Параметра--report pdfнет, потому что для отрисовки графиков в PDF понадобилась бы новая тяжёлая зависимость. Тесты:tests/advanced_report.rsформирует отчёт для каждого входящего в поставку сценария (без пустых разделов, без текста-заглушек, метки равны матрице, дайджест сценария равен дайджесту файла, побайтно идентично при повторном прогоне), аtests/advanced_report_cli.rsповторно запускает записанную команду в чистом каталоге и требует побайтно идентичногоresult.json. Опубликованные числа не меняются, а числа видов, файлов сценариев и строк матрицы не изменились. - Отчёт, анимация и экспорт работают вместе. Расширенный отчёт получает раздел «Анимация и экспорт»: анимированный рисунок прогона, встроенный как неактивное изображение (или причина его отсутствия), ссылки на файлы анимации и экспорта, записанные рядом, и каждый формат совместимости с указанием, применим ли он, почему нет, и его спецификацией;
report.jsonнесёт тот же блокcompanions. Проигрыватель анимации HTML перечисляет файлы экспорта, записанные рядом с ним. Интерфейс командной строки (CLI) теперь формирует экспорт до записи отчёта, чтобы оба могли указывать файлы по имени.
Экспорт для совместимости
- Экспорт и импорт для совместимости (
--export,src/interop/, docs/INTEROP.md).kshana <scenario.toml> --export <format>записывает геометрию сценария как CZML (Cesium Language), KML (Keyhole Markup Language 2,2, стандарт Open Geospatial Consortium, с трекамиgx:Trackс метками времени), GeoJSON (Internet Engineering Task Force Request for Comments 7946) и эфемериды Ansys STK (Systems Tool Kit).e(EphemerisTimePosVel, метры, один файл на движущийся объект), а синтезированный снимок IQ (синфазные и квадратурные отсчёты) видаspectrum— как пару SigMF (Signal Metadata Format) через существующийsrc/sigmf.rs.--export allзаписывает каждый применимый формат и сообщает, почему остальные не применимы;--export listсообщает без запуска. Движущиеся объекты записываются в Геоцентрической небесной системе отсчёта (CZMLINERTIAL, STKICRF) и как долгота, широта и высота в связанной с Землёй системе WGS 84 (World Geodetic System 1984) (KML, GeoJSON); неподвижные пункты в CZML —FIXED. Видjammingдобавляет две зоны воздействия источников помех из собственных уравнений линий связи.--import-route <file.geojson>записываетLineStringGeoJSON во входные данные трековterrain-nav,terrain-slam,gravity-mapиcombined-altpnt. Экспорт побайтно детерминирован и не несёт метки времени.tests/interop_formats.rsпроверяет каждый экспорт по его опубликованной спецификации, сравнивает экспортированные состояния спутников с собственными состояниями движка до 1 мм и пропускает каждый входящий в поставку сценарий через каждый формат, причём каждый либо экспортируется, либо сообщает, почему нет (таблица в docs/INTEROP.md). Опубликованные числа не меняются: синтез IQ видаspectrumперенесён в одну общую функцию, а его документ результата побайтно идентичен, иPassesScenarioполучаетpropagator()иepoch_calendar(), используемые собственным прогоном. Числа видов, файлов сценариев и строк матрицы верификации не изменились. Сценарий орбиты или целостности безepochдатируется собственными данными его спутников:t = 0— самая ранняя эпоха TLE (двухстрочный набор элементов), вещаемых эфемерид или SP3 (Standard Product 3), и каждый такой спутник поворачивается в системы GCRS и связанную с Землёй в собственный момент; 2000-01-01T00:00:00Z используется только тогда, когда ни один спутник не несёт эпохи. Экспорт SP3 и OEM (Orbit Ephemeris Message) сохраняет свою метку 2000-01-01. Для этого добавленыSgp4::epoch_jd_utc,Sp3Interpolator::jd_ut1иPropagator::own_jd_utc; ничего из существовавшего их не читает.
Навигация на низкой околоземной орбите: сигнал
- Конструкции сигналов LEO-PNT и многодиапазонный спектр. Новый вид
leo-signalи видspectrum, выходящий за пределы диапазона L: один вид, четыре файла сценариев (три входят в комплект; файл Celeste IOD есть только в репозитории) и четыре строки матрицы (две VALIDATED, две MODELLED).leo-signal: параметризованные конструкции сигналов позиционирования, навигации и времени (PNT) на низкой околоземной орбите (LEO) для любой системы (диапазон, ширина полосы передачи, распределение ITU; компоненты захвата, данных и пилот-сигнала со спектрами BPSK(n), BOC(m,n), MBOC или плоскими, доли мощности, поднесущие FDMA, длины кодов и скорости передачи данных) — из встроенных в сборку открытых файлов предустановок в каталогеdata/leo-signals/(Xona Pulsar X1/X5, Iridium STL, сигнал оказии Starlink, CentiSpace, характерная конструкция для диапазона C и характерные конструкции для UHF/L/S/C/широкого C, каждая со ссылкой на URL источника) или заданные непосредственно в сценарии. Для каждого сигнала: ограниченная по полосе спектральная плотность мощности (PSD) и доли мощности в полосе, ширина полосы по Габору, ограниченное по полосе дрожание слежения за кодом по схеме «опережение — запаздывание» в зависимости от C/N0 и разнесения (Betz & Kolodziejski 2009) и точность измерения дальности, пространство поиска при захвате, вероятность обнаружения и среднее время последовательного и кодово-параллельного захвата, SSC в направлении GPS L1 C/A, Galileo E1, GPS L5, Galileo E5a, E5b и AltBOC и из них, с потерей C/N0, допуски по J/S для CW, широкополосной и согласованной помехи по коду SSC вида «спектр», диапазонный компромисс (ионосферная задержка, потери в свободном пространстве, измерение дальности при равных C/N0 и равной EIRP, устойчивость к постановщику помех) и необязательные проверки формы относительно описанного измерения. Примеры:scenarios/leo-band-trade.toml,scenarios/xona-pulsar-signals.toml,scenarios/celeste-iod-classical-pilot-signals.toml(диапазоны и конфигурация сигнала Celeste IOD, представленные на семинаре ESA NAVISP по LEO-PNT, 2026; исключены вместе с предустановкой Celeste IOD, см. «LEO-PNT от начала до конца» ниже). Заметки вdocs/LEO-SIGNAL.md.spectrum: диапазоны теперь могут быть предустановленной конструкцией сигнала (каждая компонента отрисована, ограничена по полосе, а C/N0 и J/S отнесены к отслеживаемой компоненте) или произвольной несущей с модуляцией;[[panels]]добавляют водопады по другим частотным диапазонам на одной временно́й шкале; к четырём формам сигнала добавлен постановщик помехwideband(заградительный). В отчёте появляютсяbands[].tracked_power_dbw,bands[].designиpanels, а также одна записьnot_modelled. Обычные диапазоны дают те же числа, что и раньше. Пример:scenarios/multi-band-jamming-waterfall.toml.- В
navsignalдобавлены замкнутые формы интегрального синуса, мощности BPSK в полосе и габоровской ширины полосы с ограничением полосы, джиттер опережающего–запаздывающего канала с ограничением полосы для любого спектра и его оценка по Габору, замкнутая форма SSC для BPSK со смещением, спектр Galileo E5 AltBOC(15 10) и разборщик обозначений модуляции;Modulation::labelвыводит BPSK(1/3) в виде дроби. - Четыре строки матрицы: VALIDATED замкнутые формы с ограничением полосы (90,3 % мощности BPSK в главном лепестке, джиттер, сводящийся к когерентной форме Kaplan & Hegarty — 0,0039564 чипа при 45 дБ-Гц, B_L 1 Гц, d 1 чип, T 20 мс — и к своей оценке по Габору, а также собственная SSC для BPSK 2/(3 R_c); замкнутая форма Габора и SSC со смещением в сравнении с формой через равенство Парсеваля указаны как внутренние перекрёстные проверки); VALIDATED максимальный доплеровский сдвиг LEO (Xona X1 33,2 кГц внутри опубликованного диапазона от 32 до 34 кГц, Iridium в пределах 0,5 кГц от 36 кГц); MODELLED
leo-signal; MODELLED многодиапазонный спектр.
Навигация на низких околоземных орбитах: радиолиния
- Проход LEO-PNT и бюджет радиолинии по диапазонам: вид
leo-pass. LEO-PNT — это позиционирование, навигация и время (PNT) по спутникам на низкой околоземной орбите (LEO). Пользователь (наземный, морской, воздушный или в помещении, неподвижный или движущийся) и один или несколько спутников LEO: из спроектированного прохода, из явных элементов, из двухстрочного набора элементов (TLE) через SGP4 или из орбитальной группировки Walker по кодуconstellation-design. Для каждого спутника, диапазона и эпохи: углы визирования, дальность, замкнутые формы скорости и ускорения изменения дальности (в каждом прогоне проверяются по центральным разностям), доплеровский сдвиг и скорость его изменения, потери в свободном пространстве, ЭИИМ (эквивалентная изотропно излучаемая мощность) при изопотоковой, гауссовой или плоской диаграмме спутника, патч-антенна пользователя, ослабление в газах по ITU-R P.676, ослабление в дожде по ITU-R P.838/P.618, тропосферные сцинтилляции по P.618, потери при проникновении в здание по ITU-R P.2109 для пользователя в помещении, рассогласование поляризации, шумовая температура системы и C/N0 (отношение несущей к спектральной плотности шума); ионосферная задержка первого порядка по каждому диапазону по наклонному TEC (полному электронному содержанию) под спутником из модели Klobuchar или вертикального TEC и безионосферные пары диапазонов с усилением шума. Спутники Galileo или GPS оцениваются тем же приёмником по мощностям приёма из документов управления интерфейсом, поэтому колоколообразный проход LEO и плоские несущие MEO (средняя околоземная орбита) показаны на одном графике. Раздел[iot]даёт время до первого определения, энергию на одно определение и срок работы батареи в зависимости от скважности (MODELLED).- Независимость от системы: движку не нужен ни один пресет. Необязательные пресеты, каждый в своём файле и с пометкой «PUBLIC» (с URL), «REPRESENTATIVE» или «WORKSHOP»: типовой многодиапазонный (UHF, L, S, C), типовой C-диапазон, Xona Pulsar X1/X5 (arXiv 2509,19551), Iridium STL, Starlink как сигнал оказии только для доплеровских измерений, CentiSpace и Celeste IOD (демонстрация на орбите), параметры сигнала которой были представлены на семинаре ESA NAVISP по LEO-PNT, 2026, и находятся в
src/celeste_iod.rs, чтобы их можно было исключить (см. «LEO-PNT от начала до конца» ниже). - Открытые строительные блоки в
src/leo_link/(геометрия, антенна, itu, iono, energy, presets), которые могут вызывать другие модули. - Сценарии:
leo-pass-vs-gnss-cn0,leo-indoor-uhf,leo-iot-energy,leo-pass-xona-pulsar,leo-pass-iridium,leo-pass-celeste-iod-multiband. - Девять строк матрицы. VALIDATED (6): коэффициенты ITU-R P.838-3 по его таблице 5; ослабление в дожде и сцинтилляции по P.618-14 по примерам проверки Исследовательской комиссии ITU-R 3; потери при проникновении в здание по P.2109 по рабочей книге Исследовательской комиссии 3; ионосферное масштабирование первого порядка по отношению групповых задержек из IS-GPS-200 вместе с потерями в свободном пространстве; максимальный доплеровский сдвиг неподвижного пользователя на круговой орбите по таблице 1 из arXiv 2509,19551. MODELLED (3): проход и бюджет радиолинии, пресеты и бюджет определения с малым энергопотреблением. Один вид и шесть файлов сценариев. Примечания в
docs/LEO-PASS.md.
- Независимость от системы: движку не нужен ни один пресет. Необязательные пресеты, каждый в своём файле и с пометкой «PUBLIC» (с URL), «REPRESENTATIVE» или «WORKSHOP»: типовой многодиапазонный (UHF, L, S, C), типовой C-диапазон, Xona Pulsar X1/X5 (arXiv 2509,19551), Iridium STL, Starlink как сигнал оказии только для доплеровских измерений, CentiSpace и Celeste IOD (демонстрация на орбите), параметры сигнала которой были представлены на семинаре ESA NAVISP по LEO-PNT, 2026, и находятся в
Навигация на низких околоземных орбитах: навигационное сообщение
- Навигационное сообщение LEO (вид
leo-navmsg,src/leo_navmsg/). Передаваемое сообщение с эфемеридами и поправками часов спутника позиционирования, навигации и времени (PNT) на низкой околоземной орбите (LEO) для любой орбиты, несущей и модели; именованные пресеты — необязательные данные, и все возможности работают без них. Один вид, пять файлов сценариев и девять строк матрицы (три VALIDATED, шесть MODELLED). См.docs/LEO-NAVMSG.md.- Содержимое сообщения: SVID, номер выпуска данных, диапазон и исправность сигнала; неделя, время недели и полином часов второго порядка; эфемериды в одной из четырёх моделей — 16-параметрический кеплеровский набор из Galileo OS SIS ICD, тот же набор с полиномами поправок вдоль трассы, поперёк трассы и по радиусу, 22-параметрическая модель Liu et al. 2025 (doi 10.3390/rs17162894) или полином ECEF с нулевыми часами ATOMIC — а также набор Klobuchar, коэффициенты NeQuick-G с эффективным уровнем ионизации и параметры перехода от системного времени к UTC с учётом случаев високосной секунды из ICD.
- Аппроксимация: эталонная орбита, проинтегрированная с зональной гравитацией J2–J6 или EGM2008 и сопротивлением атмосферы, часы с начальным значением (seed) — свободные или управляемые, подгонка методом Левенберга–Марквардта по неособым элементам, затем линейные полиномы поправок по методу наименьших квадратов и часы, подогнанные за вычетом релятивистского члена пользователя.
- Четыре анализа и сценария:
leo-navmsg-fit-interval-trade(ошибка дальности сигнала в пространстве (SISRE) в зависимости от интервала аппроксимации и периода обновления),leo-navmsg-model-comparison(четыре модели, биты и 22-параметрическая аппроксимация Kshana на высотах из Liu et al. рядом с опубликованными значениями, MODELLED),leo-navmsg-midpass-update(непрерывность при каждой смене сообщения в проходе) иleo-navmsg-encode-decode(собственный документированный двоичный кадр Kshana с CRC-24Q и бюджетом квантования, блок в стиле RINEX 4 с пометкой расширения Kshana и таблица CSV). - VALIDATED: глобально усреднённые веса SISRE по опубликованной таблице Montenbruck et al. 2018 для средних и геостационарных орбит; пользовательский алгоритм Galileo по RTKLIB на четырёх реальных передаваемых эфемеридах Galileo (
tests/leo_navmsg_reference.rs); CRC-24Q по контрольному значению из каталога и по примеру кадра RTCM 10403 1005. - Пресеты, по одному файлу с источниками: Xona Pulsar и Pulsar-0, Iridium, Starlink, CentiSpace, типовая система C-диапазона, ATOMIC и Celeste IOD (единственный пресет, использующий материалы, представленные на семинаре ESA NAVISP по LEO-PNT, 2026; он хранится в
src/celeste_iod.rsвместе со своими сценариями, чтобы его можно было исключить).
Навигация на низких околоземных орбитах: объединение данных
- Объединённые позиционирование, навигация и время по MEO + LEO:
leo-pvt,leo-pppиntn-positioning. Три новых вида сценариев вsrc/leo_fusion/, не зависящих от системы: каждая орбитальная группировка — это оболочки Walker, наборы элементов или пресет ГНСС, каждый сигнал — несущая, скорость чипов и огибающая отношения несущей к спектральной плотности шума (C/N0), каждый бюджет ошибок — явная одна сигма, а именованные системы на низкой околоземной орбите (LEO) — необязательные пресеты, по одному файлу, с источниками, помеченными как публичные, семинарские или производные (Xona Pulsar X1/X5, Iridium Satellite Time and Location (STL), сигналы оказии Starlink, CentiSpace, типовая система C-диапазона, модель эфемерид с нулевыми часами ATOMIC и один пресет ESA Celeste для демонстрации на орбите, параметры которого, полученные на семинаре, хранятся вsrc/celeste_iod.rs, чтобы их можно было исключить).- У
leo-pvtчетыре режима: доплеровское позиционирование (пакетный метод наименьших квадратов по скорости изменения дальности с состояниями дрейфа часов и скорости, режим сигналов оказии только по Доплеру, точность вдоль и поперёк трассы за один проход и огибающая доплеровского сдвига, его скорости и рывка); совместный взвешенный метод наименьших квадратов ГНСС + LEO с одними часами на систему (межсистемное смещение) или с известным смещением, с сигмами отдельных измерений на входе и DOP в зависимости от числа спутников LEO; полярное и арктическое покрытие в зависимости от широты; и передача времени LEO в шкалу всемирного координированного времени (UTC) в зависимости от C/N0 и генератора приёмника с выражением перехода от системного времени к UTC из IS-GPS-200. leo-ppp: расширенный фильтр Калмана для плавающего прецизионного абсолютного позиционирования (PPP) по безионосферным кодовым и фазовым измерениям, только по ГНСС и с дополнением LEO, со временем сходимости и проверкой согласованности по NEES (нормированной квадратичной ошибке оценивания) методом Монте-Карло. Входящий в поставку сценарий даёт 7,4 мин с четырьмя системами MEO и 4,8, 3,2, 2,7 и 2,3 мин при 60, 96, 192 и 288 спутниках LEO, рядом с 9,6, 7,0, 3,2, 2,1 и 1,3 мин у Li et al. (J. Geod. 93:749, 2019) как сравнение тенденции, MODELLED.ntn-positioning: позиционирование в нетерриториальной сети 5G (NTN) в диапазоне S подвижной спутниковой службы n256 стандарта 3GPP по границе Крамера–Рао для времени прихода и доплеровского сдвига.- Сценарии:
leo-doppler-positioning,starlink-sop-doppler-positioning,meo-leo-fused-pvt,leo-ppp-convergence,ntn-5g-positioning,polar-arctic-leo-coverage,leo-timing-utc(входят в поставку) иceleste-iod-fused-pvt(только в репозитории, исключается вместе с пресетом Celeste IOD). - Восемь строк матрицы: огибающая доплеровского сдвига LEO VALIDATED по опубликованным значениям Iridium (±36 кГц: 35,9 кГц, в пределах 5 %) и Xona Pulsar X1 (от 32 до 34 кГц: 33,6 кГц для оболочки 97 град, без расширения) (
tests/leo_doppler_reference.rs); доплеровское позиционирование, совместное позиционирование по псевдодальностям, сходимость PPP, границы NTN, время LEO, полярное покрытие и пресеты — MODELLED. Три вида и восемь файлов сценариев. Документация:docs/LEO-PNT-FUSION.md.
- У
- LEO-PNT от начала до конца: вид
leo-pnt-chainи соединённые вместе этапы LEO. Одна система позиционирования, навигации и времени (PNT) на низкой околоземной орбите (LEO) прослеживается от проектирования сигнала до положения пользователя; каждый этап — собственный вид движка со своей таблицей сценария, значения передаются дальше в коде (docs/LEO-PNT.md):- В диапазонах
leo-passможно указать проектleo-signal(signal = "xona-x5"): диапазон принимает центр, ширину передаваемой полосы и скорость чипов отслеживаемой компоненты из проекта, делит свою ЭИИМ (эквивалентную изотропно излучаемую мощность) между компонентами проекта и сообщает для каждой эпохи C/N0 (отношение несущей к спектральной плотности шума) отслеживаемой компоненты и джиттер кодового слежения с ограничением полосы (ошибка измерения дальности; шум парыiono_freeтакже его использует). Диапазон без проекта даёт тот же результат, что и раньше. leo-pnt-chainвыполняет цепочку: сигнал -> проход -> навигационное сообщение -> объединённое совместное определениеleo-pvt-> необязательныйleo-ppp. Каждая система LEO на этапе позиционирования, у которой эти значения не заданы, берёт линию C/N0 по sin(угла места), подогнанную к проходу, ошибку дальности сигнала в пространстве сообщения (SISRE: его ошибку представления на орбите спутника прохода с заданным членом определения орбитыod_sisre_mв корне из суммы квадратов), а также несущую и скорость чипов проекта; случаи прецизионного абсолютного позиционирования (PPP) берут SISRE. Каждая передача перечислена со значением и единицей, аtests/leo_pnt_chain.rsпроверяет, что каждое значение равно выходу предыдущего этапа и что изменения предыдущих этапов сдвигают показатели последующих.LeoNavmsgScenario::broadcast_sisre— новая точка входа для сообщения.- Сценарии:
leo-pnt-end-to-end(типовая группировка на 1080 км и репрезентативный сигналgeneric-l),xona-pulsar-end-to-end(публичный сигнал X5), оба входят в поставку, и необязательный, только в репозитории,celeste-iod-end-to-end. - Пресеты Celeste IOD (демонстрация на орбите) для областей прохода, сообщения и объединённого позиционирования теперь находятся в одном файле,
src/celeste_iod.rs, которыйbuild.rsкомпилирует только при его наличии (флаг конфигурацииkshana_celeste). Его пять сценариев (scenarios/*celeste-iod*.toml) есть только в репозитории, поэтому удаление этого файла и этих сценариев исключает все числа, представленные на семинаре ESA NAVISP по LEO-PNT, 2026, без правки исходного кода;tests/workshop_preset_isolation.rsпроверяет, какие файлы могут называть пресет или содержать числа его частотного плана. - Каждый вид LEO в перекрёстной таблице расширенного отчёта, со строками для конкретного пути, перечисляемыми, только если прогон пошёл этим путём (интенсивность дождя, здание, выполненный анализ или режим). Доплеровские окна
leo-pvtполучаютt_s, а случаиleo-pppполучаютt_min, поэтому оба анимируются;leo-passиleo-pnt-chainэкспортируют эфемериды CZML, KML, GeoJSON и STK, а остальные виды LEO сообщают, почему формат неприменим.
- В диапазонах
Навигация на низких околоземных орбитах: устойчивость, направления работ и сценарии для конечных пользователей
- Устойчивость LEO-PNT, по одному сценарию на каждое направление экспериментов и на каждую отрасль конечных пользователей, и
docs/LEO-PNT.mdкак обзор всех видов и сценариев LEO. Каждый сценарий выполняется без каких-либо данных Celeste и входит в поставку.leo-passполучает раздел[spoofer]: спуфер подделывает, согласованно по дальности и скорости изменения дальности, сигналы заявленного положения, которое после начала воздействия скачком и/или постепенно смещается от истинного (по каждому диапазону LEO и по сигналу ГНСС на MEO), с учётом ионосферы или без неё. Два монитора работают при заданной вероятности ложной тревоги: согласованность доплеровского сдвига и геометрии прохода (измеренные скорости изменения дальности в сравнении с предсказанными по орбитам и независимому априорному положению и скорости; обобщённый хи-квадрат по методу наименьших квадратов в окне, по каналам ГНСС, LEO и по всем каналам, шум петли автоподстройки частоты по C/N0) и междиапазонная согласованность (скачок геометрически независимой комбинации каждой пары диапазонов LEO с поправкой по модели). Результат содержит статистики по эпохам (поэтому анимируется), по каждой паре и момент обнаружения каждым монитором. Строительные блоки вleo_link::spoof. Если раздела нет, результат не меняется.- Каждая пара диапазонов
leo-passтакже сообщает наклонное полное электронное содержание (TEC), которое восстанавливает её геометрически независимая комбинация в пике прохода, и сигму кодового шума этой оценки (зондирование ионосферы). Это добавляет два поля к каждому многодиапазонному результатуleo-pass; ни одно существующее число не меняется. - Режим времени
leo-pvtпринимаетtrace = true: тогда каждая строка сообщает свою ошибку времени и предсказанную сигму в каждую эпоху при тех же выборках, поэтому статистики строк не меняются, а прогон анимируется и встраивается в цепочку кампании. - Кампания теперь экспортирует каждый входящий в неё сценарий с геометрией (прогоны по фазам, базовые сценарии перебора и Монте-Карло, составные члены со связанными общими значениями) отдельным набором файлов, с меткой члена в имени файла; раньше кампания ничего не экспортировала. Таблица совместимости в
docs/INTEROP.mdменяется соответствующим образом. - Ключ перебора кампании может индексировать по позиции массив таблиц (
system.2.sisre_m). - Сценарии устойчивости:
leo-resilience-multiband-diversity(заградительная помеха в диапазоне L5 шириной 50 МГц с перебором по мощности: все сигналы диапазона L пропадают, сигналы LEO в диапазонах UHF, S и C сохраняют свой C/N0),leo-resilience-js-margin(запас J/S по мощности приёма: GPS L5, Galileo E5a и Xona X5 теряются при -105, -100 и -95 дБВт, типовой сигнал LEO с -135 дБВт всё ещё отслеживается при -90 дБВт),leo-resilience-spoof-doppler(скачок на 30 м, пропущенный доплеровской проверкой только по ГНСС и обнаруженный проверкой по всем каналам через 105 с после начала),leo-resilience-spoof-monitors(четыре спуфера против обоих мониторов) иleo-resilience-gnss-jammed-leo-carries(ГНСС подавлена, слой LEO в диапазонах S и C отслеживается, автономный контроль целостности приёмником только по слою LEO даёт тревогу в 2 из 30 эпох). - Сценарии направлений:
leo-focus-ppp-altitude,leo-focus-ntn-bandwidth,leo-focus-iot-eirp,leo-focus-science-iono-sounding,leo-focus-data-services,leo-focus-indoor-uhf,leo-focus-fused-pnt-sisre(устойчивость в диапазонах L, S и C — этоleo-resilience-multiband-diversity). - Отраслевые кампании, каждая с анимацией и экспортом своих проходов LEO:
leo-vertical-autonomous-vehicle,leo-vertical-rail-maritime(входящие в поставку морской и железнодорожный сценарии плюс LEO),leo-vertical-critical-infrastructure-timing,leo-vertical-polar-arctic,leo-vertical-5g-network-timing,leo-vertical-asset-tracking-iot. Результаты в одну строку вdocs/LEO-PNT.md. - Три строки матрицы MODELLED: монитор спуфинга по доплеровскому сдвигу и геометрии прохода, междиапазонный монитор спуфинга и зондирование ионосферы.
tests/leo_resilience_verticals.rsпроверяет мониторы (молчат до начала воздействия, доплеровская статистика квадратична по скачку, ионосферный скачок у наземного спуфера и его отсутствие у спуфера, учитывающего ионосферу), тождество зондирования, трассу времени в сравнении со статистиками строк и то, что экспорт кампании равен собственному экспорту каждого её члена. - Страница
leo-passперенесена вdocs/LEO-PASS.md;docs/LEO-PNT.md— обзор.
Морские, дорожные и железнодорожные сценарии
- Морские, дорожные и железнодорожные сценарии. Пять входящих в поставку примеров на существующих видах, чтобы у судов, дорожных транспортных средств и поездов был свой разобранный случай. Все показатели MODELLED; ни один не проверен по измеренным данным.
scenarios/maritime-strait-jamming.toml(jamming): широкополосный источник помех мощностью 50 Вт на мачте высотой 30 м в 30 км от судна над открытой водой. Среднее отношение помехи к сигналу (J/S) около 48 дБ, доступность падает с 1,00 до 0,00.scenarios/maritime-port-approach-coast.toml(ins-trn-coast): инерциальная навигационная система (ИНС) навигационного класса при 12 узлах с потерянной ГНСС и без коррекции. Она набирает 10 м через 281 с и 100 м через 833 с — это значения для захода в гавань и для океанских вод из резолюции A.1046(27) Международной морской организации (IMO), используемые здесь как бюджеты.scenarios/maritime-spoof-position-push.toml(spoof-detect): спуфер с превышением +2 дБ, без привязки к фазе несущей, смещающий четыре спутника, чтобы увести судно на 500 м. Объединённый монитор обнаруживает его (оценка 0,70 при пороге 0,50) по автономному контролю целостности приёмником (RAIM) и контролю качества сигнала (SQM); контроль одной лишь мощности его пропускает.scenarios/automotive-urban-canyon.toml(gnss-ins): автомобиль, проезжающий под путепроводом 15 с и попадающий в 60-секундный перерыв из-за придорожного источника помех, при бюджете в половину полосы движения 1,5 м. Среднеквадратичная (RMS) ошибка объединённого решения на перерыве составляет 1,9 м для блока автомобильного класса на микроэлектромеханической системе (MEMS) и 0,7 м для эталона тактического класса; в свободном режиме блок MEMS уходит на 850,8 м.scenarios/rail-tunnel-coast.toml(ins-trn-coast): ИНС тактического класса на поезде со скоростью 160 км/ч в тоннеле. Она набирает 2 м (различение путей) через 35,8 с, примерно в 1,6 км от входа, и 20 м через 107,3 с. Это только ИНС: в движке нет модели одометра, поэтому это пессимистичная граница. Число файлов сценариев в README растёт с 77 до 82. Все пять входят в поставку дляkshana exampleи перечислены в браузерной песочнице.
Сервер Model Context Protocol
Сервер Model Context Protocol (MCP) даёт доступ к каждому виду и каждому представлению прогона: семь новых инструментов, всего четырнадцать.
run_scenarioуже обслуживал все виды; агенту не хватало способа получить корректный сценарий нужного вида и три выходных файла, которые командная строка записывает рядом с результатом. Новые инструменты:list_example_scenariosиget_example_scenarioотдают входящие в поставку эталонные сценарии (таблицаkshana example), каждый с его видом и первым предложением собственного заголовка, байт в байт как файл вscenarios/. Сценарий, который есть в репозитории, но не входит в поставку, отклоняется с указанием причины. У каждого вида, кромеlunar-llr-datum(срез данных которого поставляется только с репозиторием), есть хотя бы один пример.report_scenarioвозвращает отчёт о прогоне в виде JSON (JavaScript Object Notation) или в виде печатной страницы HTML (HyperText Markup Language) (docs/REPORTS.md).animate_scenarioвозвращает временные ряды прогона в виде анимированного рисунка SVG (Scalable Vector Graphics), проигрывателя HTML или пронумерованных кадров, после сводки в JSON о том, что было нарисовано (docs/ANIMATION.md). В одном ответе не более 120 кадров; командная строка записывает любую длину.list_export_formats,export_interopиimport_routeотдают экспорт для совместимости и импорт маршрута из GeoJSON (docs/INTEROP.md): CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, эфемериды STK (Systems Tool Kit).eи SigMF (Signal Metadata Format), с индексом файлов в JSON (суффикс, размер и SHA-256, 256-битный дайджест Secure Hash Algorithm) и двоичным файлом отсчётов SigMF в base64.
В библиотеке появилась отключённая по умолчанию функция
bundled-scenarios, которая открывает таблицу эталонных сценариев какkshana::bundled_scenarios; её включает только сервер MCP, поэтому колесо Python и модуль WebAssembly по-прежнему не содержат текст сценариев. Наборы исследований (--study) остаются только в командной строке, потому что набор называет файлы на диске, а сервер не читает ни одного. Тесты полного цикла запускают каждый новый инструмент на входящих в поставку сценариях и проверяют числа движка: спектр, Солнечную систему, орбитальные группировки вокруг Луны и Европы, перебор кампании, а также виды сигнала на низкой околоземной орбите (LEO), прохода, навигационного сообщения, объединённого позиционирования, прецизионного абсолютного позиционирования, нетерриториальной сети и сквозной вид. Каждая поверхность, которая указывает число инструментов MCP или перечисляет их, теперь говорит «четырнадцать», кроме страницы песочницы вweb/, которая заменяется сайтом.
kshana.dev, Kshana Studio и README
- Новый kshana.dev. Единая страница песочницы заменена многостраничным сайтом: Главная, Миссии, Возможности, Доказательства, Разработчикам, Редакции и Документация, а Kshana Studio — в одном щелчке. Каждый график, карта и число на нём — записанный прогон движка этого выпуска, со сценарием и ссылкой, которая открывает тот же прогон в Studio; сборка сайта отвергает запись, сделанную другим коммитом движка. Страницы документации генерируются из
docs/репозитория, а варианты установки — из его каналов. Шрифты и библиотеки скриптов отдаются с самого kshana.dev, поэтому ни одна страница ничего не запрашивает у сторонних узлов. Старые адреса (/#playground,/#ledger, ссылки/#s=<scenario>, ссылки для встраивания/?embed=1&…и остальные) перенаправляют на новое место, а неизвестный адрес получает страницу 404. - Kshana Studio, панель для каждой возможности. Studio открывается стартовым экраном с плитками областей и удачными первыми прогонами, затем ведёт прогон через пять пронумерованных шагов: выбрать сценарий, задать его параметры, запустить движок локально в браузере, прочитать результаты (сначала ключевые показатели, каждый с отметкой PASS или FAIL там, где прогон задаёт порог, затем панели) и поделиться или экспортировать. Одно поле поиска находит сценарии, области и поля в них и переходит к элементу управления; прогоны можно закреплять и сравнивать; строка навигации показывает, где вы находитесь; на телефоне шаги превращаются в полосу шагов. У каждого вида сценария есть своё представление, включая водопад спектра, Солнечную систему, покрытие орбитальной группировкой, кампании, анимацию, отчёт о прогоне, экспорт для совместимости и цепочку на низкой околоземной орбите. Глубокая ссылка (
?scenario=…&tab=…) открывает тот же прогон на указанной панели. - Исследования и цитирование. Страница «Доказательства» перечисляет пять статей Kshana на arXiv (2606,22054, 2606,24210, 2607,02566, 2607,05415 и 2607,06212), каждая со сводкой, рисунком, вычисленным этим движком, командой для его воспроизведения, ссылкой на Studio и BibTeX, а также со сведениями о цитировании программного обеспечения. В README появился такой же раздел «Исследования».
- Публичная страница для Kshana Pro.
docs/PRO.mdи страница «Редакции» сайта сообщают, что проприетарная надстройка Pro добавляет к тому же движку (оптимизатор проекта, неопределённость и чувствительность, досье миссии, наблюдение за кампанией, сосуществование спектров, локальная служба заданий, прослеживаемость требований), что каждая из этих возможностей выдаёт и чего не делает. Каждое число Pro, которое показывает сайт, указано на этой публичной странице. Pro не добавляет никакой физической модели, а открытый движок остаётся цельным и свободным. - Переписанный README. Короткие разделы, по одному изображению на раздел, знак Kshana, два ряда значков, сгенерированные изображения архитектуры, потока сценариев, цепочки на низкой околоземной орбите и верификации (
tools/gen_readme_assets.py, который завершается ошибкой при устаревшем изображении) и снимки экрана Studio, сделанные в работающем Studio с помощьюtools/capture_studio_shots.mjs. README для crates.io, PyPI, npm и сервера MCP следуют тому же оформлению. Длинные справочные материалы свёрнуты или перенесены вdocs/.
Изменено#
<scenario>.report.htmlтеперь — расширенный отчёт о прогоне, описанный в разделе «Добавлено», и строкаwrote …в CLI называет также<scenario>.report.json. Одностраничная сводная карта, которую он заменил, осталась без изменений какRunOutput::html_report(), и привязки к Python и WebAssembly по-прежнему возвращают именно её.OracleKind::modelled_reason()предоставляет предложение, котороеdocs/MODELLED-RATIONALE.mdвыводит для каждой строки MODELLED; этот документ не изменился.- В README сказано, на чём строится Kshana Pro. Раздел «Редакции» и строка Kshana Pro в разделе «Support & professional services» теперь сообщают, что делают инструменты Pro для системной инженерии на основе моделей (MBSE) и для программ и какие из опубликованных выходных данных открытого движка они читают (
result.jsonиreport.jsonкаждого прогона, файл сценария, схему единиц полей и метки матрицы верификации), а также на чём в открытом движке основаны цифровые двойники часов, торговые исследования и пакеты доказательств. Изменены только формулировки: ни один выход движка и ни одно опубликованное число не меняются. - Совместимость. В открытое перечисление
navsignal::Modulationдобавлен вариантMboc; для вызывающего кода, который сопоставляет его исчерпывающе, это ломающее изменение. Столбцыgcrs_r_mиgcrs_v_m_sвидаephemerisменяются (см. «Пересмотр опубликованных чисел»). Прогон по-прежнему воспроизводится той версией движка, которая его выполнила.
Исправлено#
export_table_csvна сервере MCP называл четыре вида как единственные с таблицей CSV (значения, разделённые запятыми); таблицу публикуют шесть. Инструмент всегда возвращал таблицу дляtelecom-timingи дляleo-navmsg(его анализencode-decodeна модели сообщенияkepler16илиkepler-rac), но его описание, сообщение об отказе и документы со списком видов обоих пропускали, поэтому агенту говорилось не запрашивать их. Теперь они названы, и тест полного цикла получает обе таблицы.Кадр навигационного сообщения на низкой околоземной орбите (LEO) состоял не из одних и тех же байтов на всех платформах и даже в разных сборках одной платформы.
scenarios/leo-navmsg-encode-decode.tomlкодировал кадр с циклическим избыточным кодом0x110315в релизной сборке на aarch64 macOS,0x898BD8в отладочной сборке того же исходного кода на той же машине и0x6A82D9в сборке WebAssembly (WASM);leo-navmsg-celeste-iod.tomlдавал0x6EDB2Dв нативной сборке против0xC6E4F0в браузере. Три причины, каждая прослежена до первого расходящегося значения:- Между платформами. Эталонная орбита совпадала на обеих побитно; начальная точка подгонки — нет.
truth::state_to_elementsберёт соприкасающийся наклон изacos, а аргумент перигея изatan2, и две математические библиотеки округляют их по-разному в последнем разряде (на 20 000 аргументах они расходятся для 781 синусов, 858 косинусов, 1 931 экспонент и 1 899 двухаргументных арктангенсов). - Между профилями сборки. Оптимизированная сборка на macOS объединяет синус и косинус одного аргумента в один вызов комбинированной системной процедуры, и её синус не совпадает с синусом отдельного
sinдля 379 из 200 000 аргументов; неоптимизированная сборка делает два вызова. Этот вид берёт синус и косинус вместе в тринадцати местах. - В часах. Нормальный генератор выборок из
rand_distrвызывает хостовыеexpиlnв двух своих редких ветвях: из четырёх миллионов выборок с заданным начальным значением (seed) три отличались в последнем бите между нативной сборкой и сборкой WASM.
Подгонка методом Левенберга–Марквардта, которая на этой дуге останавливается на пределе в 80 итераций, а не в минимуме, переносит одну единицу последнего разряда в разные квантованные поля. Теперь этот вид вычисляет каждую трансцендентную функцию через новый
src/portable_math.rs, который вызывает крейтlibmна чистом Rust (уже входящий в дерево зависимостей, теперь названный вCargo.toml), компилируемый из одного исходного кода для каждой целевой платформы, а не вызов библиотеки, который оптимизатор переписывает:leo_navmsg::{truth, fit, elements, codec, sisre, services}и код сценария. Целые степени на этом пути записаны как возведение в квадрат с умножением, потому что уf64::powiточность не определена, а нормальные отклонения истинных часов берутся изportable_math::standard_normal(полярный метод Марсальи по сырому выходу генератора). Общие процедуры, через которые интегрируется эталонная орбита, написаны один раз, обобщённо по математической библиотеке, с внутрикрейтовой точкой входа_portableрядом с существующей: ускорение по сферическим гармоникам, зональные ускорения и ускорения от сопротивления, вековые скорости J2 и задержка Klobuchar. Существующие точки входа не меняются вплоть до последнего бита, поэтому числа других видов не сдвигаются.leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platformзакрепляет весь 171-байтовый кадр и по одному контрольному значению на каждую модель эфемерид, в обычном (неоптимизированном) тестовом профиле, на каждой платформе и без условия на базовый хост;the_kind_never_calls_the_host_mathematics_libraryчитает исходные коды вида с диска и завершается ошибкой при встроенном вызове трансцендентной функции, при генераторе выборокrand_distrили при вызове в непросмотренный модуль. После изменения отладочная сборка, релизная сборка и сборка WASM дают побайтно идентичные документы результата для всех пяти сценариевleo-navmsg. Это сдвигает числа, что записано здесь как пересмотр. Видleo-navmsgпоявился в этом выпуске, поэтому ничего из опубликованного в более ранних выпусках не сдвигается, но каждое числоleo-navmsgсдвигается, и в нативной сборке, и в сборке WASM, а вместе с ним и этапnavmsgвleo-pnt-chain: числа орбиты — потому что подгонка теперь начинается с переносимых элементов, числа часов — потому что истинные часы теперь другая реализация того же процесса.docs/LEO-NAVMSG.mdзаново сгенерирован по новым результатам; его опубликованное контрольное значение для сценария кодирования и декодирования было0x110315, а стало0x19105F(положение в пределах 1,126 мм от точного сообщения, где было 0,665 мм, часы в пределах 0,185 мм, где было 0,451 мм). Размер изменений в субмиллиметровых числах — это чувствительность подгонки, а не ошибка ни в одном из наборов: подгонка не изменилась и по-прежнему останавливается на пределе итераций.- Между платформами. Эталонная орбита совпадала на обеих побитно; начальная точка подгонки — нет.
Повторная выборка с заданным начальным значением (seed) выбирала другие индексы на 32-разрядной платформе.
Rng::gen_rangeпоusizeберёт 64 бита из генератора на 64-разрядном хосте и 32 бита на 32-разрядном, поэтому одно и то же начальное значение (seed) давало другие индексы и оставляло поток в другом месте в сборке WASM. Так выбирали в трёх местах: процентильные бутстрепы вeval_stats(bootstrap_ci,bootstrap_auc_ci), перемешивание перед каждым проходом обучения вimpairment_mlи перестановочный критерий вimpairment_study. Теперь они выбирают черезportable_math::uniform_index, который всегда выбирает какu64: ровно то, что делал 64-разрядный хост, поэтому ни одно нативное число не сдвигается. Это сдвигает опубликованные числа пакета WASM, что записано здесь как пересмотр: бутстреп-интервалquantum-anomaly-detectдля площади под кривой (quantum_auc_ci,trade.foms[0].ci95) в браузере был[0.9901265, 0.9938305], а теперь стал нативным[0.99035875, 0.993861].Имена файлов эфемерид STK из идентификаторов движущихся объектов. Идентификатор движущегося объекта, содержащий
/или пробел (оболочка орбитальной группировки и спутник,Pulsar inclined/S1-0163), вызывал аварийное завершение CLI на--export stk; теперь каждый идентификатор проходит через безопасную часть имени файла (буквы, цифры,-,_).Знак нутации TEME→GCRS, описанный выше в разделе «Пересмотр опубликованных чисел», поскольку он сдвигает опубликованный результат.
0.28.0 - 2026-09-26#
Добавлено#
- Вид сценария
slot-timing(src/slot_timing.rs): секунды до выхода свободных часов из защитного интервала слота маршрутизации или постановки задач, индексированного по времени, каждый вклад в этот момент с названием преобладающего, оставшееся время с последней коррекции и наибольший интервал между коррекциями, при котором часы остаются внутри, за вычетом задержки коррекции. Часы берутся из умолчания для класса, из пресета паспортных данных telecom-timing, из встроенных паспортных данных (максимумы девиации Аллана, старение, температурный коэффициент) или из измеренной записи фазы. Нарушение за пределами наибольшего времени усреднения, которое поддерживает источник, помечается как экстраполированное. Входящий в поставку пример:slot-timing-ocxo-leo. См.docs/SLOT-TIMING.md. - Измеренный уровень красного шума. Перекрывающаяся девиация Аллана записи фазы подгоняется взвешенным методом наименьших квадратов в базисе белой фазы и частотной модуляции по IEEE Std 1139 (
slot_timing::fit_weighted), каждая точка взвешивается по эквивалентному числу степеней свободы, так что ответ по holdover может опираться на собственный уровень шума часов, а не на допущение для класса. Невзвешенная подгонка давала ложный уровень фликкер-шума на тестовой записи белого шума и сокращала нарушение на 2 000 с на 30 %. - Проверка на отложенной выборке инверсии holdover на реальных часах (
tests/slot_timing_cs5071a_holdout.rs): при подгонке по первой трети записи цезиевых часов 5071A относительно водородного мазера предсказанные нарушения на одну сигму при шести порогах от 0,5 до 2,5 нс попадают в диапазон от 0,84 до 1,03 от нарушений, измеренных на остальных двух третях, при пороге 1,5, зафиксированном до первого запуска теста. Контроль (девиация Аллана за одну секунду, прочитанная как белый шум) промахивается примерно в 1 000 раз и порог не выполняет. Новая строка реестра (ledger) VALIDATED; рабочий процессrealdata-clockтеперь её запускает. - То же предсказание на реальном кварцевом генераторе (
tests/slot_timing_ocxo_holdout.rs,scripts/fetch_ocxo.sh): на измеренном термостатированном кварцевом генераторе предсказание на отложенной выборке консервативно — от 0,59 до 0,70 измеренного нарушения и никогда не позже — и в основном вне порога 1,5, потому что уровень шума этого генератора за 5,5-часовую запись уменьшился вдвое; при подгонке по самой выборке оно попадает в диапазон от 0,98 до 1,17. Случай кварцевого генератора не проверен и остаётся MODELLED. Прогон также выявил недостающий член: частота кварцевого генератора блуждает, поэтому модель теперь учитывает неопределённость частоты, известной в момент коррекции (fix_frequency_sigma); без неё предсказание было оптимистичным вплоть до 2,5×. - То же предсказание на атомных часах на орбите (
tests/slot_timing_igs_holdout.rs,scripts/fetch_igs_clocks.sh): 14 суток окончательных данных часов Международной службы ГНСС для спутников GPS Block IIF, с протоколом, записанным до загрузки данных. Восемь из десяти спутников попадают в порог 1,5; G25 и G30 предсказывают нарушения примерно вдвое более поздние, чем измеренные. Протокол требует, чтобы прошёл каждый спутник, поэтому орбитальный случай не проверен и остаётся MODELLED; исход закреплён. - Классы часов: кварцевый генератор с температурной компенсацией (TCXO), термостатированный кварцевый генератор (OCXO) и рубидиевый стандарт частоты (RAFS) (
ClockClass::Tcxo,Ocxo,Rafs) — компоненты, которые летают на коммерческой шине малого спутника или стоят на наземном шлюзе, каждый со ссылкой на один публичный паспорт (ClockClass::source). ДобавленыClockClass::ALL,idиfrom_id.baseline_clock_classвquantum-tradeпринимает три новых идентификатора. Добавление вариантов в открытое перечисление — ломающее изменение для вызывающего кода, который сопоставляет его исчерпывающе. - Уровень защиты времени для приёмника на орбите (
src/orbital_timing.rs, необязательный разделspoofingвидаslot-timing): как долго наземный спуфер может достигать спутника на низкой околоземной орбите за проход, какое смещение накапливает спуфер с заданной максимальной скоростью нарастания, пока спутник не выйдет из его зоны досягаемости или не будет выполнена независимая проверка, и независима ли каждая проверка при контакте с Землёй или по межспутниковой линии от этого спуфера. Точно сводится кtpl::timing_protection_level_nsдля часов без фликкер-шума, шума белой фазы или шума случайного блуждания. MODELLED. - Три заметки:
docs/SLOT-TIMING.md(в том числе о том, по какой метрике блуждания следует принимать слот: по максимальной абсолютной ошибке времени, а не по максимальной ошибке временного интервала или девиации времени, и почему),docs/DECEIVED-TIME.md(подписанная команда, применённая в обманутое время, всё равно направляет неверно) иdocs/DEPLOYMENT-TARGETS.md(где работает Kshana; полётное ядроno_stdне предлагается).
0.27.4 - 2026-09-26#
Выпуск v0.27.3 дошёл до crates.io (kshana и kshana-mcp) и PyPI, затем остановился на npm, поэтому npm, образ MCP на ghcr.io, реестр MCP, JetBrains Marketplace и kshana.dev его не получили. 0.27.4 несёт тот же движок с приведённым ниже исправлением выпуска во все каналы.
Исправлено#
- Шаг публикации в npm называет архив явным путём. npm читает голое
npm-dist/kshana-0.27.3.tgzкак сокращение GitHubowner/repo, поэтому задание npm выпуска v0.27.3 пыталось клонироватьgithub.com/npm-dist/kshana-0.27.3.tgzи завершилось ошибкой «Permission denied (publickey)». Сам архив был собран и заверен. Теперь шаг публикует./npm-dist/*.tgz. Всё, что идёт после npm в порядке выпуска (образ MCP, плагин JetBrains, проверка равенства каналов и сайт), было пропущено, как и задумано.
Изменено#
- Каталоги единиц telecom-timing и
gnss-insисключены из обнаружения копирования и вставки по той же политике и проверке обоснования, что и другие каталоги. Проверка качества SonarCloud стала красной из-за дублирования в новом коде (4,0 % против 3 %), и каждый дублированный блок был строкой единиц или записью маски ITU-T.
0.27.3 - 2026-09-25#
Добавлено#
scenarios/small-uas-jammed-nav.toml: как долго держится навигация малого дрона после подавления ГНСС. Сценарий запускает инерциальный блок на микроэлектромеханической системе (MEMS) класса полётного контроллера, Bosch BMI088, против блока тактического класса. Сигнал ГНСС (глобальной навигационной спутниковой системы) номинален 100 с, затем подавлен 60 с (jamming-demo.tomlпоказывает, почему так делает находящийся рядом источник помех). Смещения BMI088 — остатки после калибровки при запуске, взятые из температурных коэффициентов в его паспорте (BST-BMI088-DS000-19 ред. 1,9): 0,015 °/с на К для гироскопа и < 0,2 µg на К для акселерометра. В файле отмечены два допущения: прогрев на 10 К после калибровки и дальнейший прогрев на 1 К в минуту в полёте. Дрейф в полёте — это ошибка, которую фильтр не успевает выучить до начала подавления, и именно она прекращает движение по инерции. Все числа получены по модели; для проверки нужны журналы полётов из среды с подавлением.kshana example small-uas-jammed-navвыводит его.Каждый датчик
gnss-insможет задать собственное априорное значение фильтра ([imu_quantum.filter_prior]или[imu_classical.filter_prior], сsigma_accel_biasиsigma_gyro_bias). Значение по умолчанию не меняется, поэтому каждый существующий сценарий даёт тот же результат. Остаточное смещение гироскопа блока потребительского класса лежит примерно в 26 сигмах за пределами умолчания тактического класса, где фильтр никогда бы его не выучил. Априорное значение, не являющееся конечным и положительным, отклоняется, а результат повторяет априорное значение, когда оно задано.kshana example [<name>]даёт пользователю реестра сценарий для запуска. У пользователяcargo install kshanaесть исполняемый файл, но нет каталогаscenarios/, поэтому первая команда каждого краткого руководства у него не работала. Интерфейс командной строки (CLI) теперь содержит 75 эталонных сценариев, которые запускаются сами по себе, байт в байт, скомпилированных изscenarios/(src/bundled_scenarios.rs; таблица находится в двоичном файле CLI, поэтому колесо Python и модуль WebAssembly не увеличиваются).kshana exampleперечисляет их;kshana example clock-holdover > clock-holdover.tomlзаписывает один. Два других файла есть только в репозитории:lunar-llr-datumчитает архивные данные лазерной локации Луны, которые поставляются только с репозиторием, аquantum-pnt-demonstrator.suite— манифест исследования, запускающий три соседних файла с--study. Запрос любого из них объясняет причину и завершается с кодом 2 вместо вывода того, что не может работать само по себе.tests/cli_first_run.rsудерживает таблицу в соответствии с каталогом в обе стороны, поэтому новый файл сценария, который не входит в поставку и не назван только для репозитория, приводит к ошибке.Каждый показатель качества в результате для часов, орбиты, гибридного режима или объединения данных теперь сообщает в самом результате, VALIDATED он или MODELLED. В документе результата появляется блок
figure_tiers, всегда последний ключ. Он перечисляет каждый сообщаемый показатель (например,quantum.fom.timing_p95_ns) с его уровнем — VALIDATED означает проверку по независимому внешнему оракулу, MODELLED означает модель из первых принципов, проверенную внутренне, — и строку матрицы верификации, из которой уровень считывается. Уровень берётся изsrc/verification.rsчерезsrc/fom_label.rs, поэтому второй таблицы, которая могла бы разойтись, нет. Прежде слова «validated» и «modelled» не встречались ни разу в результате holdover часов, и читатель сырого JSON (JavaScript Object Notation) не мог отличить их друг от друга. У позиционных показателейhybridиfusionнет владеющей строки матрицы, поэтому они перечислены вuntiered, а уровень им не присвоен. Блок не содержит чисел. Его аддитивность доказана, а не предполагается: удаление блока возвращает документ до изменения байт в байт для всех пяти видов (тест движка), и оба эталонных набора (tests/registry_golden.rs,tests/cross_platform_golden.rs) теперь вырезают именно этот ключ, и только если он последний, а затем хешируют остальное и сравнивают с их неизменёнными замороженными константами. Список в каждом наборе закрепляет, какие сценарии должны содержать блок, поэтому исключение не может незаметно расшириться.Вид
telecom-timingотвечает в единицах инженера по синхронизации: ошибка времени, максимальная ошибка временного интервала (MTIE) и девиация времени (TDEV), каждая с PASS или FAIL и запасом относительно масок Сектора стандартизации электросвязи Международного союза электросвязи (ITU-T). Маски переписаны из действующих редакций: G.8272 (07/2025) для классов A и B первичных эталонных часов времени (PRTC), G.8272.1 (2024) Amd. 1 (07/2025) для улучшенных PRTC в режиме захвата и в holdover (включая огибающую ошибки времени, которая растёт от 30 нс до 100 нс за период holdover, определяемый тем, как долго часы были захвачены), G.8273.2 (2023) Amd. 2 (11/2025) для граничных телекоммуникационных часов и подчинённых часов времени, классы от A до D, и G.8271.1 (2022) Amd. 3 (05/2025) для сетевых пределов в контрольной точке C. Каждая запись, которую эти Рекомендации оставляют «для дальнейшего изучения», отсутствует, а не оценена, иdocs/TELECOM-TIMING.mdперечисляет каждое число с его таблицей или пунктом и каждую пропущенную позицию. Отчёт также сообщает время превышения каждого бюджета ошибки времени: по умолчанию значение holdover для ePRTC 100 нс, выделенный сетевой holdover 400 нс, предел в точке C 1 100 нс и сквозное требование класса 4 — 1,5 мкс.Входные данные — либо синтетический holdover, либо ваша собственная серия. Синтетический использует один из четырёх пресетов генератора (термостатированный кварцевый генератор, рубидиевый стандарт, цезиевый стандарт и чип-масштабные атомные часы), каждый из которых несёт значения стабильности, старения и температуры из паспорта конкретного изделия Microchip. Как эти значения превращаются в белый, фликкерный и случайно-блуждающий частотный шум, старение и температурный член, указано в каждом отчёте с пометкой MODELLED. Собственная серия — это пары
[time_s, time_error_ns], встроенные (так это работает в браузере) или, в нативных сборках, из файла со значениями, разделёнными запятыми. Таблица MTIE/TDEV с пределом каждой выбранной маски рядом записывается как артефакт CSV прогона.scenarios/telecom-prtc-holdover-24h.toml— 24-часовой holdover рубидия со старением, фликкер-шумом и суточным температурным циклом: его наибольшая ошибка времени составляет 603,2 нс, она пересекает 100 нс через 8 206 с после потери и весь день остаётся в пределах 1,5 мкс, и он не проходит огибающую holdover улучшенного PRTC, как и должны часы, не относящиеся к цезиевому классу.scenarios/telecom-tie-ingest.tomlпоказывает встроенный ввод. MTIE и TDEV, которые сообщает этот вид, проверены по пакету allantools на зафиксированной серии holdover из 2 048 отсчётов, точно для MTIE и до 1.1e-15 для TDEV, поэтому матрица получает одну строку VALIDATED и две MODELLED (переписанные маски и пресеты) и теперь насчитывает 171 строку — 65 VALIDATED, 102 MODELLED, 4 PARTNER. Покрытие единицами полей растёт с 60 из 61 видов до 61 из 62 и с 1 742 до 1 788 описанных полей. Вид новый и аддитивный: ни один существующий сценарий, закрепление или опубликованное число не сдвигается.Песочница запускает движок в фоновом Web Worker, поэтому медленный сценарий больше не замораживает страницу.
web/engine-worker.mjsразмещает движок WebAssembly, аweb/engine.mjsпередаёт ему каждое выполнение сценария — прогоны, перебор параметров и экспорт SP3 / OMM / OEM / CSV. Прогон, длящийся дольше 150 мс, показывает состояние занятости (Run отключена, «Running… N s») и кнопку Cancel, которая завершает и заново запускает worker; браузер, не способный запустить worker-модуль, возвращается к прежнему пути в основном потоке.cislunar-arc-recovery, исключённый из каталога, потому что замораживал страницу, вернулся в него с пометкой о медленной работе: он занимает около 13 с в Chrome (четыре вызова движка по примерно 3 с), и всё это время страница остаётся отзывчивой.Каждая сообщаемая величина
cislunar-observabilityтеперь несёт единицу, класс происхождения и определение — это предпоследний вид в общекрейтовом списке исключений. Все 41 числовое поле документа RELEASED описаны, поэтому покрытие единицами полей растёт с 59 из 61 видов до 60 из 61 и с 1 698 до 1 742 описанных полей, а отставание по полям без определений остаётся прежним — 239.Это блокировалось закреплением, замораживающим выпущенный документ, которое называло
unitsключом, который документ не должен приобретать никогда. Добавление ключа потребовало бы удалить это утверждение и заново зафиксировать три хеша в трёх файлах — форма, неотличимая от сокрытия регрессии. Вместо этого два закрепления, измеряющие этот документ, теперь доказывают, что добавление аддитивно: каждое снова вырезает блокunitsи пересчитывает хеш относительно константы, замороженной до появления блока, и обе константы не изменены. Мутация подтверждает, что гарантия реальна: сдвиньте выпущенное значение и заново зафиксируйте хеш всего документа, как сделало бы небрежное исправление, — вырезание с пересчётом всё равно завершится ошибкой. Третье закрепление, в общем наборе эталонов реестра, зафиксировано заново наравне с шестью соседними, которые были зафиксированы заново ровно по этой причине, а его литералexpect_summary, содержащий значения, не сдвигается.realtime-frame-eopсообщает, относительно какой истины оценивалась каждая строка ориентации Земли и как часто срабатывал запасной вариант.table3_joint_eop[].{ut1, polar_motion,combined}получаютtruth_sourceиtruth_fallback_rows. Нижний уровеньfinalоценивается по окончательному Бюллетеню B и может использовать только эпохи, для которых он опубликован; каждая строкаdNоценивается поtruth_pm()/truth_ut1(), которые возвращаются к быстрому значению Бюллетеня A. В поставляемой выборке за 2026 это 12 из 31 отсчётов при одних сутках против 0 на нижнем уровне — поэтому строка нижнего уровня и строки предсказания рядом с ней опираются на заметно разную истину, что отчёт теперь указывает, а не оставляет угадывать по числу отсчётов, которое растёт там, где вложенные горизонты этого не допускают.moonlight-service-volumeвыдаёт кеплеровский базовый уровень, подобранный по размеру.ephemeris_comparison.keplerian_matchedзаново запускает иллюстративную орбитальную группировку при числе спутников самого ИЗВЛЕЧЁННОГО набора, только когда числа различаются. Число входит в геометрию этого проекта — RAAN и средняя аномалия распределены как360k/n— поэтому без него набор из пяти извлечённых спутников оценивался против иллюстративного из восьми, и проект смешивался с размером. Для эталонного набора LANS из пяти спутников 8,68 из 14,24 пункта разрыва покрытия приходится на три недостающих спутника и лишь 5,56 пункта — на проект; для четырёх аппаратов, действительно находящихся на окололунной орбите, специально построенный набор из четырёх спутников достигает 4,86 % там, где они достигают 0 %. Тест закрепляет, что подобранная строка — это пересобранная орбитальная группировка, а не заданная, переименованная иначе, как она была написана сначала и что прогон потом сообщал.Девять карточек возможностей на публичном сайте, покрывающих 22 строки матрицы верификации, которые поставлялись без карточки уровня продукта. У движка выросло семейство возможностей — проверка ARAIM по опубликованным эталонным векторам Рабочей группы C, реальная извлечённая геометрия окололунной орбитальной группировки, контур отказа на Луне с измеренной полосой C/N₀, шаг от расписания VLBI к ковариации станции, оптическая и радиопередача управления с внесением неисправностей между модальностями, предсказание ориентации Земли в реальном времени по архивному Бюллетеню A, совместное использование апертуры навигацией и связью, движение ИНС/TRN по инерции и покрытие единицами и происхождением — у каждой есть строка матрицы и входящий в поставку сценарий, и ни одна не названа на kshana.dev. Покрытие карточками строк растёт с 72 из 168 строк до 94.
В каталог песочницы добавлено восемь сценариев. Кнопка Run на карточке возможности появляется, только если
web/app.jsтоже содержит этот файл; шесть карточек называли сценарий, которого там не было, поэтому они отображались без возможности запуска — одна из них, с данными реальной лазерной локации, находилась в таком состоянии с момента выпуска. Теперьtests/scenario_examples_doc_sync.rsпроверяет этот инвариант в обеих частях: цельrunкарточки должна быть включена в поставку вscenarios/и предложена каталогом. Проверено мутационным тестированием на оба вида отказа.moonlight-service-volumeвыдаёт геометрию по спутникам как<scenario>.table.csv, когда настроена площадка экспорта (G11). Это самый большой массив, который публикует крейт — 2304 строки в выпущенной совместной таблице связи и навигации, — и он доходил до потребителей только внутри JSON, в той форме, которая обрезала кривую соседнего сценария из 57 точек до 23 точек под столбцом, заявлявшим все. Одна строка на линию, число строк в строке заголовка, столбцы антенны — только если антенна настроена. Прогон без площадки экспорта не меняется ни на байт и не записывает файл.Теперь SBOM описывает то, что поставляется: 60 компонентов стали 66.
scripts/gen-sbom.shперечислял каждый пакет в разрешении зависимостей с функциями по умолчанию, включая зависимости для разработки. Из-за этого в перечне материалов оказалисьsgp4иchrono— крейты только для тестов, не вошедшие ни в один артефакт, — а цепочка--features python, которую компонует колесо PyPI (pyo3,pyo3-ffi,pyo3-macros,pyo3-macros-backend,pyo3-build-config,portable-atomic,target-lexicon,heck), то есть граница внешних функций этого колеса, была пропущена. Теперь скрипт обходит граф зависимостей от пакета kshana только по обычным рёбрам и рёбрам сборки, по объединению наборов функций по умолчанию,pythonиwasm(пакет npm несёт тот же SBOM), для каждой целевой платформы. Закреплённый вердикт соответствия CycloneDX заново зафиксирован через его зафиксированный генератор: 60 → 66 компонентов, 53 → 60 составных лицензионных выражений, и по-прежнему ноль ошибок схемы, когда они приведены к стандартной формеexpression.Таблица воспроизводимости в формате CSV теперь доступна через все точки входа, а не только через CLI и колесо Python. Сервер MCP получает седьмой инструмент,
export_table_csv, который запускает сценарий и возвращает побайтово стабильную таблицу, записываемую CLI как<scenario>.table.csv, либо ошибку с перечнем видов, публикующих такую таблицу (realtime-frame-eop,lunar-time-budget,lunar-jammingиmoonlight-service-volumeтолько при заданныхexport_site_lat_degиexport_site_lon_deg). Модуль WebAssembly получаетtable_csv, возвращающий тот же текст илиundefined. Тест полного цикла MCP и тесты привязок Python теперь побайтово сверяют возвращаемый CSV сtests/golden/realtime-frame-eop.csvи проверяют, чтоRunOutput.write_csvвозвращает число записанных байт, а для вида без таблицы — 0 без создания файла. Все места, где указано число инструментов MCP или перечислены инструменты, теперь говорят о семи.run_allв модуле WebAssembly: один прогон движка для каждого вывода.run,chart_svg,summaryиtable_csvкаждый выполняют сценарий с нуля, поэтому песочница расплачивалась четырьмя полными прогонами за один щелчок — около 12 с вместо 3 с дляcislunar-arc-recoveryв браузере.run_allвозвращает{json, svg, summary, csv}из одного прогона, и теперь песочница использует его. Он совпадает с четырьмя отдельными вызовами байт в байт.
Исправлено#
ИСПРАВЛЕНИЕ: связь смещения гироскопа в фильтре GNSS/INS имела неверный знак, поэтому показатели для
gnss-insпри потере сигнала меняются. Расширенный фильтр Калмана (EKF) по вектору ошибок хранит оба инерциальных смещения как невязки (истинное значение минус текущая оценка, вводятся сложением). Столбец акселерометра формировал ошибку скорости с+C_b^n b_a, а столбец гироскопа формировал ошибку ориентации с−C_b^n b_g. Остаточное смещение гироскопа на самом деле поворачивает вычисленную ориентацию на+C_b^n b_g, поэтому каждая оценка смещения гироскопа вела не в ту сторону. Пакет оставался устойчивым только потому, что априорное значение смещения гироскопа по умолчанию (1e-4 рад/с, 1 сигма) было достаточно жёстким, чтобы удерживать эти состояния на месте. При более широком априорном значении фильтр расходился, даже когда истинное смещение гироскопа было нулевым: ошибка объединённого решения при потере сигнала в 93 м превращалась в 4,3 км. Опубликованные показатели дляscenarios/gnss-ins.tomlменяются следующим образом:gnss-ins.tomlдо (≤ 0.27.2) после ИНС на холодных атомах, среднеквадратичная ошибка объединённого решения на перерыве 96,1 м 1,9 м ИНС на холодных атомах, движение по инерции в допуске (50 м) 30 с 60 с (весь перерыв) тактическая ИНС, среднеквадратичная ошибка объединённого решения на перерыве 62,5 м 3,1 м тактическая ИНС, движение по инерции в допуске (50 м) 37 с 60 с (весь перерыв) Числа для свободного режима (130,7 м и 314,3 м) не меняются; они никогда не использовали фильтр. Прежний вывод набора о том, что объединённое движение по инерции ограничено нижним уровнем ориентации при передаче управления и потому не улучшается с лучшим датчиком, был артефактом этой ошибки и отозван. При постоянных смещениях без шума фильтр теперь выучивает их, пока ГНСС доступна, поэтому объединённое движение по инерции — наилучший случай. Внешний эталон filterpy (
tests/gnss_ins_sensor_fusion_reference.rs) проверяет только обновления по измерениям, поэтому он никогда не видел распространения. Теперь два теста проверяют знак напрямую, и оба падают на старом. Первый, вclosed_loop.rs, подаёт известное остаточное смещение гироскопа через бесплатформенную систему и требует, чтобы фильтр предсказал получившуюся ошибку ориентации с точностью до 2 %. Второй требует, чтобы широкое априорное значение выучило смещение гироскопа 1e-3 рад/с и осталось в пределах 6 м. Кроссплатформенный эталонgnss-insзафиксирован заново по этой причине и ни по какой другой.Каждое краткое руководство для реестров теперь запускается как написано на чистой машине. Замеры до этого изменения показали, что примеры для crates.io и PyPI (Python Package Index) читали
scenarios/clock-holdover.toml, которого при установке из реестра нет, а пример для npm аварийно завершался в Node.js сTypeError: fetch failed, потому чтоinit()пакета загружает свой двоичный файл WebAssembly, аfetchв Node не может прочитать локальный файл. Теперь:README.crates.mdиREADME.pypi.mdнесут этот сценарий встроенным, как это уже делалREADME.npm.md. Блок кода на Rust — целая программа со своейmain, поскольку скрытая для rustdoc строка# Ok::<…>, которой он заканчивался, на crates.io показывалась и при вставке не компилировалась.tests/readme_code_fences_doc_sync.rsпо-прежнему компилирует его байт в байт, а теперь ещё и отвергает скрытую строку в блоке.README.npm.mdразделяет браузер и Node.js и даёт рецепт для Node, который читает двоичный файл с диска и передаёт его вinitSync. Тест синхронизации документации принимаетinitSyncкак загрузчик, который генерирует wasm-bindgen.- Во всех трёх сценарий встроен с несокращёнными строками происхождения, поэтому хеш сценария на каждой поверхности —
5ba83a232b94. Пример для npm раньше их сокращал, из-за чего хеш отличался от хеша CLI. - Воспроизведено локальными сборками этого дерева: новый проект
cargo newс зависимостью по пути на упакованный крейт собрал и запустил пример на Rust; колесо, собранное maturin из упакованных исходных кодов и установленное в новое виртуальное окружение, запустило пример на Python; а пакетwasm-pack --target web, упакованный и установленный через npm, запустил рецепт для Node. Все три вывели одну и ту же итоговую строку.
cargo run -- <scenario.toml>работает из клона.Cargo.tomlзадаётdefault-run = "kshana". Без этого cargo отказывался с сообщением «could not determine which binary to run», на которое натыкалась каждая строкаcargo run --в документации.Ошибки CLI в первую минуту работы подсказывают, что делать дальше. Несуществующий путь к сценарию теперь добавляет подсказку со ссылкой на
kshana example, а второй позиционный аргумент выводит текст справки по использованию, а не только называет аргумент.--help,--version, ошибка неизвестной опции (код выхода 2) и однострочноеok:у--validateпри успехе уже были в main. Теперьtests/cli_first_run.rsохватывает все эти случаи, поскольку раньше ни один тест не запускал двоичный файл ни для одного из них.list_kinds()в Python описан как возвращающий одну строку JSON, а не список. Он возвращает те же метаданные, что иscenario_kinds(), сериализованные, поэтому перебор проходит по символам. Он сохраняет строковый возврат, чтобы существующие вызывающие не сломались.kshana.pyi, комментарий к документации привязки,docs/PYTHON_API.mdиREADME.pypi.mdтеперь говорят об этом и отсылают кscenario_kinds().Три README для реестров расшифровывают каждую аббревиатуру при первом употреблении. PNT теперь расшифровано в слогане, где оно появляется впервые, а CLI, TOML, JSON, SVG, CSV, CSAC, HTML, URL и API расшифрованы в файлах, которые их используют. Заголовок таблицы оракула больше не говорит «CI-gated» до определения CI.
Исправлено опубликованное число: доступность двухорбитальной группировки ARAIM по включённым в состав TLE Celestrak для GPS + Galileo.
docs/CAPABILITY.mdутверждал, что добавление Galileo повышает доступность с 0,21 до 0,67 при VAL 12 м и что режим, устойчивый к отказу орбитальной группировки, ограничен при наличии лишь двух группировок. Это следовало изtests/araim_dual_real_data.rs, где каждый спутник распространялся от собственной эпохи TLE (parse_propagatorsотбрасывает эпоху), а эпохи в этих файлах охватывают 70,6 ч (GPS) и 335,7 ч (Galileo), так что спутники относились к взаимно несогласованным моментам времени. Теперь тест сохраняет каждую эпоху (parse_tle) и оценивает все спутники на один общий момент UTC — последнюю эпоху TLE в наборе (2026-06-07T07:21:04). Измеренная доступность на той же сетке из 289 отсчётов за 24 ч становится равной 0,993 только для GPS (было 0,208), 1,000 для объединённой группировки (было 0,671) и 0,990 для двойного режима, устойчивого к отказу орбитальной группировки (было 0,031); на пределе APV-I двойной режим переходит от 0,180 к 1,000. Вывод меняется на противоположный: при согласованном небе две орбитальные группировки обеспечивают гипотезу отказа орбитальной группировки при VAL 12 м. Те же значения получаются и при выборе в качестве опорной самой ранней эпохи TLE. Самопроверка в тесте привязывает его цикл по доступности отсчёт за отсчётом кaraim_dual_constellation_availability, так что единственное различие — выравнивание по времени.docs/CAPABILITY.mdиdocs/REAL_TLE_GUIDE.md, § 3, содержат новые числа; запись 0.13.0 ниже оставлена в том виде, в каком она вышла.Публичные поверхности больше не объявляют RINEX 4 проверенным. Теперь движок отказывается от навигационного файла RINEX 4 по имени, а не декодирует его неверно, но сетка стандартов всё ещё показывала карточку «RINEX 3 / 4» с отметкой validated, привязанной к свидетельствам RINEX 3 навигационного разборщика. Теперь карточка называется «RINEX 3», а README,
docs/CAPABILITY.md,docs/STANDARDS.md,ROADMAP.mdи сводка возможностей сообщают то, что верно: файлы наблюдений RINEX 3.0x разбираются, раскладка наблюдений 4,00 ожидаемо тоже, но ни один файл 4,00 через код не прочитан, а навигационные файлы RINEX 4 отклоняются.--validateсообщает, когда «ok» означает, что проверять было нечего. Около двух третей каталога не публикуют ни одного обязательного поля — эти наборы запускают свою эталонную конфигурацию из пустого тела, — поэтому проверка могла выводить для них только «ok», теми же словами, что и после проверки шести полей. Теперь строка успеха указывает число найденных обязательных полей либо что вид не требует ни одного.scripts/gate.shотклоняет нечисловыеREPEATилиTEST_THREADS. В bash 3,2 значениеREPEAT=noвызывало ошибку числового сравнения, которая оценивалась как ложь, поэтому проверка объявляла «repeatability loop SKIPPED (REPEAT=0)» для значения, не равного 0, и всё же записывала квитанцию. Теперь обе настройки завершаются с кодом 2, если они не являются обычными целыми числами.MSRV указан как 1,85 везде, где его читает человек.
Cargo.tomlперешёл на 1,85 в прошлом выпуске; значок в README, текст об установке и устранении неполадок,codemeta.jsonи собственное обоснование крейта MCP всё ещё говорили 1,75.RunOutput.__repr__в привязке Python сообщает байты, а не «chars». Он выводилlen()строк UTF-8, а это число байтов: 710 «chars» для таблицы из 708 символов.README больше не описывает
--study --study-nameвместе.--study-name— флаг одного сценария, игнорируемый при--study(двоичный файл предупреждает). Два примера для копирования в README.md и README.crates.md теперь показывают только команду исследования.Свидетельство стабильности часов на сайте указывает оба наблюдённых допуска. Серия цезиевых часов 5071A воспроизводится с точностью ≤ 3e-5, а PHASE.DAT — ≤ 5e-5; в абзаце было 3e-5 для обоих.
Два файла выходных данных движка больше не отслеживаются.
scenarios/quantum-pnt-demonstrator.study.{json,html}были проставлены движком 0.20.0 с пустыми показателями качества, а собственная команда исследования из README перезаписывала их, загрязняя дерево и блокируя проверку перед отправкой.*.study.json/*.study.htmlтеперь игнорируются, как и остальные четыре выходных файла движка.Перебор seed в песочнице больше не падает при каждом запуске. Перебор шёл по целочисленному параметру
seedлинейно (1, 10,9, 20,8, …), а движок, читая его какu64, отклонял каждое дробное значение. Теперь целочисленные параметры перебирают различные целые числа.Каждая загрузка из песочницы сообщает, какой движок и какие входные данные её создали. Несколько видов (например,
realtime-frame-eop) не выдаютengine_versionилиscenario_hash, поэтому их загрузки назывались простоkshana-csv.csv. Теперь имя использует версию загруженного движка и 12-шестнадцатеричный отпечаток FNV-1a-64 текста сценария.
Изменено#
Опубликованный крейт меньше прежнего размера более чем вдвое, а
cargo install kshanaсобирает только CLI. Раньше пакет включал статьи, пакеты их подачи, артефакты рисунков статей, блокноты,docs/, скрипты сопровождающих и примеры программ. Ничто из этого не компилируется ни библиотекой, ни CLI. Он также включал три внутренних генератора вsrc/bin/(crossover_study,gen_validation_artifacts,validation_report), поэтому установка из реестра компилировала и устанавливала четыре исполняемых файла, три из которых полезны только внутри рабочей копии. Эти деревья и исходные коды трёх генераторов теперь исключены. Cargo перечисляет двоичные файлы пакета по содержащимся в нём файлам, поэтому опубликованный манифест называет толькоkshana. В клоне генераторы по-прежнему находятся автоматически, поэтомуcargo run --bin <name>и задание выпуска, запускающееvalidation_report, не меняются. По замерамcargo package: до — 763 файлов, 16,7 МиБ, 6,8 МиБ в сжатом виде; после — 591 файлов, 10,5 МиБ, 3,0 МиБ в сжатом виде. Его проверочная сборка, которая компилирует только упакованные файлы, проходит.cargo install --pathдля упакованного крейта установил один исполняемый файл,kshana.Вывод, который может прочитать инженер по синхронизации: больше нет
p95 0.0ns, больше нетsecurity 0.000без атаки и числа площадок совпадают с README. Это пересмотр отображения. Ни одно опубликованное число не меняется; значения JSON идентичны, что доказывают приведённые выше эталонные хеши.- Однострочная сводка выводила 95-й процентиль (p95) ошибки времени оптических часов как
0.0ns, тогда как таблица рядом показывала 1.20e-4 нс. Ненулевое значение времени, слишком малое для одного знака после запятой, теперь выводится с тремя значащими цифрами (p95 1.20e-4ns); точный нуль по-прежнему выводится как0.0. Отчёт HTML (HyperText Markup Language), таблица сравнения исследования и загружаемый отчёт песочницы используют то же правило, поэтому ни одно ненулевое значение не выводится как0.000. security— аналитическая граница обнаружимости спуфинга, имеющая смысл только при настроенной атаке. Видыclock,orbit,hybridиfusionне настраивают ни одной, поэтому их сводка теперь выводитsecurity n/a (no attack)вместо числа вроде0.000, которое читается как неудачное обнаружение. Значение остаётся вfom.securityс пометкойapplicable: falseи причиной вfigure_tiers, а таблицы отчёта показывают «not applicable». Видspoofпо-прежнему оценивает обнаружение.- Две сводные закрепления в
tests/registry_golden.rsсдвинулись ровно по этим двум причинам и никаким другим:golden_clock(квантовый p95 и оба значенияsecurity) иgolden_orbit(оба значенияsecurity; его значения p95 в точности нулевые). Хеши их документов целиком не сдвинулись. Ожидаемые сводки в README, трёх учебных руководствах и их учебных сценариях обновлены соответственно, аtests/tutorials.rsпроверяет учебные копии по движку. - Управляемый тур по песочнице больше не открывается при первой загрузке. Его модальное окно перехватывало первые щелчки, а подсветка прокручивала страницу прочь от того места, куда попал посетитель. Он запускается кнопкой «Take the 60-second tour» или плавающей кнопкой Tour.
- Страница больше не прокручивается вбок на телефоне. При 390 px строка с маркой и кнопка GitHub занимали около 410 px содержимого, то есть переполнение на 4 px; теперь шапка помещается начиная с 320 px, а таблица показателей качества прокручивается внутри собственного блока, а не расширяет страницу.
- Обозреватель возможностей начинался с собственного числа карточек («46 карточек возможностей … 17 подкреплены внешним оракулом») рядом с README, где сказано 64 из 168. Теперь он начинается с матрицы верификации, считываемой из сгенерированного
web/data/verification-matrix.json(той самой матрицы, к которой привязаны числа в README), а карточки называет после неё как сводный слой, которым они и являются.web/counts.test.mjs, новый шаг рабочего процесса непрерывной интеграции (CI), проверяет арифметику и сверяет README.md и описания на странице;tests/web_validation_counts_doc_sync.rsзакрепляет связку со стороны Rust.
- Однострочная сводка выводила 95-й процентиль (p95) ошибки времени оптических часов как
Публичное описание теперь начинается с синхронизации времени и holdover, наиболее проверенной области. Начало README и
docs/POSITIONING.mdпредставляют Kshana как открытый, воспроизводимый, помечающий происхождение движок доказательств устойчивости PNT: сначала синхронизация времени и holdover для критической инфраструктуры (оценки Аллана, модифицированной Аллана, девиации времени и максимальной ошибки временного интервала и инверсия дисперсии движения по инерции в holdover — это строки VALIDATED, на которых они держатся), затем квантовая как нейтральный метод сравнения квантового и классического, результаты которого помечены MODELLED, и лунная / цислунная навигация и навигация в дальнем космосе как поддерживаемые возможности, а не главный заголовок. Обе страницы теперь говорят, чем Kshana не является — это не имитатор радиочастотных сигналов и не стенд с аппаратурой в контуре, не замена MATLAB/Simulink, STK или Orekit — и указывают на новый видtelecom-timingиdocs/TELECOM-TIMING.md. Прежняя фраза «хорошего открытого инструмента нет» убрана: поиск, ничего не нашедший, не доказывает, что ничего нет.ROADMAP.mdполучает порядок приоритетов без дат (сначала синхронизация времени, вторым квантовое сравнение, лунная — поддерживается) и теряет три устаревших пункта (систематические эффекты Кориолиса и светового сдвига, начальные условия NRHO и лунный сценарий, всё это уже выпущено); строка README «Coriolis and light-shift remain roadmap» исправлена так же.docs/CAPABILITY.mdперестал преуменьшать. Строка о системах отсчёта, связанных с Землёй, говорила «none», тогда как матрица оценивает GCRS→ITRS как VALIDATED; теперь там «full», а строка основных систем отсчёта фиксирует перекрёстную проверку ANISE как выполненную. Управляемый режим числился в дорожной карте; в песочнице уже есть управляемые ползунки и управляемый тур. Сверка сsrc/verification.rsисправила ещё пять строк, которые были написаны раньше своих проверок: модель сил Cowell и пакетное/последовательное определение орбиты по Orekit 12,2, прохождения над наземной станцией по детектору возвышения Orekit, ядро геометрического фактора DOP по gnss_lib_py и импорт OEM по независимому разборщикуoem; строка верификации и валидации теперь называет защиты, проверяющие, что каждый упомянутый тест существует.Глоссарий объясняет, что говорит файл результата.
docs/GLOSSARY.mdполучает простые по языку статьи для выходных терминов (holdover, p95, целостность, оценка безопасности, PDOP,sigma_y,q_wf), терминов синхронизации телекоммуникаций (ошибка времени, max|TE|, cTE, dTE, MTIE, TDEV, PRTC, ePRTC, T-BC, T-TSC, OCXO, CSAC) и трёх уровней доказательств (VALIDATED, MODELLED, PARTNER).Аббревиатуры расшифрованы при первом употреблении в каждом написанном вручную публичном документе. В README и 24 файлах в
docs/несколько сотен аббревиатур использовались до своей расшифровки или без неё; теперь каждая расшифрована там, где впервые появляется в данном файле. Три сгенерированных файла (docs/VERIFICATION-MATRIX.md,docs/MODELLED-RATIONALE.md,docs/SCENARIOS.md) оставлены как есть: они пишутся изsrc/verification.rsиapi::list_scenario_kinds(), поэтому их формулировки нужно менять в источнике.У покрытия строк есть учётное измерение.
docs/COVERAGE.mdфиксирует 95,63 % (37 697 из 39 419 строк) по заданию CIcoverageнаb1d350d, аtests/coverage_figure_doc_sync.rsпривязывает к нему пять публичных поверхностей «~96 %» — единственное главное число, которое поддерживалось вручную и уже один раз незаметно сдвинулось.Новые проверки синхронизации документации для поверхностей, которые никто не читал.
tests/readme_code_fences_doc_sync.rsпроверяет каждыйimport { … } from "kshana"в блоке JavaScript по экспортам WebAssembly и закрепляет пример на Rust из README.crates.md побайтово относительно копии, которую компилирует двоичный файл теста.tests/security_md_doc_sync.rsпадает, еслиsrc/lib.rsтеряет#![forbid(unsafe_code)]или SECURITY.md перестаёт это утверждать.tests/no_overclaims.rsтеперь сканирует такжеweb/README.mdи три README для реестров, а каждый стандарт на сайте должен прямо указывать своёproof.Две проверки часов на реальной аппаратуре запускаются на раннере.
realdata-clock.yml(ежемесячно и по запросу) загружает серии 5071A и PHASE.DAT и запускает оба теста сKSHANA_REQUIRE_REALDATA=1, так что отсутствие входных данных приводит к ошибке, а не к пропуску. Оба скрипта загрузки закреплены на одном коммите allantools и проверяют SHA-256.Заглушка типов Python проверяется по собранному колесу (
mypy.stubtestв задании привязок), и именно такcsv/write_csvоказались выпущены без заглушки.Глоссарий определяет URE, EOP, FoM, CTI и TIB, которые README и реестр (ledger) использовали без пояснения.
Опубликованный контракт полей каждого вида теперь верен, и тест удерживает его таким. Изменились пять из 61 видов. Виды с непустым
required_fieldsпереходят с 21 на 22:ephemerisтеперь требуетtle|orbit+epoch(голоеkind = "ephemeris"раньше проходило--validate, а затем прогон падал), аquantum-tradeдобавляетcandidate_adev_taus+candidate_adev_values|candidate_clock_class, который его прогон и так требовал. Обязательная запись может использовать|(одно из перечисленного) и+(всё перечисленное вместе);--validateпонимает оба.lunar-joint-od-clock,pvtиearth-gnss-lunarпубликуют 9 реальных необязательных полей, которые они пропустили.docs/SCENARIOS.mdтеперь говорит, чтоkindобязателен для каждого вида, кромеclock.tests/required_fields_are_true.rsпроверяет каждый вид по его поставляемому сценарию: удаление любой обязательной записи должно приводить к сбою прогона, а документ, содержащий только обязательные поля, должен запускаться.Заметки для JetBrains Marketplace проходят проверку.
scripts/check-version-sync.shтеперь завершается ошибкой, если самая новая запись<change-notes>вplugin.xmlне называет выпускаемую версию; семь опубликованных версий выходили с неизменными заметками 0.22.0.Показатель покрытия в техническом отчёте — измеренный. В
paper/kshana-technical-report.mdбыло написано «около 97 %»; теперь там написано около 96 % (95,63 % измерено,docs/COVERAGE.md), и это шестое место, которое закрепляется тестом покрытия.Клиент движка вне основного потока протестирован (
web/engine.test.mjs, в CI): список разрешённых вызовов, отмена и перезапуск, три маршрута отката в основной поток и восстановление после сбоя — на имитации рабочего потока.Ничего не публикуется, пока помеченный коммит не прошёл свои тесты, и выпуск не считается завершённым, пока его не отдаёт каждый реестр. Теперь порядок такой: тег, проверка, публикация, сверка, сайт — в одном запуске
release.yml(docs/RELEASING.md).- Публикация ждёт вердикта.
publish.yml,mcp-publish.ymlиjetbrains-plugin.ymlбольше не запускаются при отправке тега;release.ymlвызывает их из заданий сneeds: verify. Раньше они опережали проверку: на v0.27.2 crates.io, npm и Python Package Index (PyPI) опубликовали версию в течение 4,5 мин после тега, аverifyвернулось через 84 мин; на v0.27.0 npm и PyPI опубликовали версию, а задание crates.io завершилось ошибкой. Ручной повторный запуск на теге удерживается новымscripts/check-release-verdict.sh, который требует зелёного результатаverifyдля именно этого коммита из интерфейса Actions и при любом ином результате завершается отказом (fail closed). - Всё собирается до того, как что-либо выгружается, а crates.io, шаг упаковки в котором был тем, что дал сбой посреди выпуска, публикуется первым.
- Отсутствие токена реестра приводит к сбою задания, а не к пропуску выгрузки с отчётом об успехе.
- Проверка паритета после публикации.
scripts/check_channel_parity.pyопрашивает crates.io (kshanaиkshana-mcp), npm, PyPI (исходный дистрибутив и все шесть платформенных колёс) и ghcr.io, пока каждый не отдаст версию, либо завершает запуск ошибкой; docs.rs и реестр Model Context Protocol (MCP) отражаются в отчёте, но не обязательны. При запуске на прошлых выпусках находит, что 0.22.0 отсутствует в npm и PyPI, 0.23.0 — в PyPI, а 0.27.0 — в crates.io. - Готовые двоичные файлы командной строки для macOS (Apple silicon и Intel) и Windows x86-64, названные по целевой платформе (
kshana-aarch64-apple-darwinи так далее), рядом с Linux-файломkshana, имя которого не изменилось. ФайлSHA256SUMSохватывает все ресурсы, аverify-releaseпроверяет его и запускает двоичные файлы macOS и Windows в их собственных системах. - kshana.dev показывает выпуск, а не
main. Раньше он заново развёртывался при каждой отправке вmain, тогда как его страницы называли последний выпуск. Теперьpages.ymlсобирает только тег выпуска: выпуск запускает его один раз, когда каждый канал отдаёт версию, а ручной запуск заново развёртывает последний выпуск (или указанный). - Один источник колёс. Скопированная вручную матрица из шести целей в
publish.ymlудалена; теперь вызываетсяwheels.yml, поэтому проверка тегов auditwheel и проверка побайтовой воспроизводимости оценивают именно те колёса, которые получает PyPI, а сбой любой из них останавливает выпуск. - Закреплённые инструменты сборки. Каждый рабочий процесс запрашивает Rust 1.93.0 (задание msrv — собственную версию);
publish.ymlиpages.ymlзапрашивали@stable, а журнал v0.27.2 показывает, что rustup устанавливал 1.98.1, а затем компилировал с 1.93.0 лишь потому, чтоrust-toolchain.tomlимеет приоритет. wasm-pack закреплён на 0.13.1 (версия, собравшая v0.27.2, которую выбирал незакреплённый установочный скрипт) с проверкой контрольной суммы, а mcp-publisher — на 1.8.1 с опубликованным SHA-256.scripts/check-toolchain.shтеперь завершается ошибкой, если рабочий процесс запрашивает другой компилятор или передаёт загруженный скрипт в оболочку. Ни одно задание проверки, закреплённое эталонное значение (golden pin) и ни один локальный скрипт контроля не были удалены или ослаблены.
- Публикация ждёт вердикта.
Безопасность#
Каждое стороннее действие GitHub Action закреплено по SHA коммита — 93 ссылки в 15 рабочих процессах, 92 из них новые — а тег остаётся в завершающем комментарии, чтобы Dependabot мог его обновлять. Исключение составляет
dtolnay/rust-toolchain, тег которого служит селектором набора инструментов.Базовые слои образа сервера MCP закреплены по мультиархитектурному дайджесту, а Dependabot теперь следит за Dockerfile в
mcp/kshana-mcp, поэтому слои ОС по-прежнему получают обновления безопасности — через проверенный PR.Проверка соответствия тега и манифеста выполняется в двух рабочих процессах публикации, которые выпускают версию тега.
mcp-publish.yml(образ ghcr, реестр MCP) иjetbrains-plugin.yml(Marketplace) опережаютpublish.yml, а не ждут его, поэтому ошибочно созданный тег проверялся только в родственном процессе. Теперь оба запускаютscripts/check-version-sync.shперед сборкой.Исправлены четыре уведомления, которые Dependabot поднял в день включения оповещений. Сервер MCP переходит с
rmcp1,7 на 2,2: три уведомления противrmcp< 2,1 (утечка таблицы сеансов Streamable-HTTP, отсутствие проверки защищённого ресурса OAuth, передача пользовательских заголовков при кросс-доменном перенаправлении) — ни одно здесь не достижимо, так как сервер работает только по stdio, но публикуемый крейт не должен закреплять уязвимый SDK. Макросамrmcp2 нужен Rust 1,88, поэтому теперь толькоkshana-mcpобъявляетrust-version = "1.88"; библиотекаkshanaостаётся на 1,85. Единственное изменение API (Content→ContentBlock) применено, тесты полного цикла проходят. Действие сканирования SonarQube переходит с v5 на v6, что устраняет уведомление об инъекции аргументов (≥ 4,0, < 6,0).
0.27.2 - 2026-09-22#
Добавлено#
Каждый элемент Rust, на который ссылается строка матрицы верификации, теперь сопоставляется с крейтом. Прежняя проверка охватывала ссылки в форме путей к файлам; 63 из 164 строк без партнёра называют свои доказательства как элемент внутри крейта —
navsignal::code_tests,integrity::tpl_scalar::tests,api::tests::tracking_loop_kind_round_trips_through_the_dispatch— а токен без суффикса.rsсканер путей не видел. Такие строки могли называть переименованный модуль, опустошённый тестовый модуль или несуществующую функцию, и все проверки остались бы зелёными.tests/verification_rows_name_a_test_that_exists.rsразрешает все 339 таких ссылок через дерево модулей, требует, чтобы каждая строка без партнёра называла хотя бы один тест, который действительно несёт#[test], и требует, чтобы строки партнёра не называли ни одного. Для оценки использовались четыре мутации: переименование упомянутого модуля, перенаправление единственной ссылки на тест в строке на нетестовую функцию, переименование настоящегоmod testsи удаление из него атрибутов#[test]— каждая приводит к красному результату на проверке, которой она подлежит.Одна строка уже была неверной: Alternative / complementary PNT ссылалась на
tests/*, то есть на шаблон, который не является ссылкой. Теперь она называетtests/alternative_complementary_pnt_reference.rsи три внутрикрейтовых тестовых модуля, стоящих за ней.Опубликованные показатели при каждой сборке заново сверяются с движком (
tests/published_figures_still_reproduce.rs). Три демонстрационных графика README — это собственный выводchart.svgдвижка, и ничто не перезапускало сценарий; два исследования пересечения в статье были созданы один раз и зафиксированы; а README излагает четыре показателя качества прозой рядом сscenario-fom.png. Теперь все три привязаны к живому выводу движка.Сверка дала полезный результат: демонстрационные графики были построены на движке 0.22.0, а JSON пересечения из статьи — на 0.20.0, и на 0.27.1 каждое построенное значение во всех пяти артефактах идентично — три SVG-графика отличаются от свежего запуска ровно двумя символами каждый, отметкой версии в нижнем колонтитуле. Графики перерисованы, так что нижний колонтитул теперь верен. JSON из статьи намеренно оставлен с отметкой 0.20.0: это запись запуска, чей рисунок встроен в опубликованную статью, а повторная отметка заявила бы происхождение, которого у PDF нет. Вместо этого проверка утверждает более сильное свойство: текущий движок по-прежнему воспроизводит каждое опубликованное значение.
Исправлено#
Анализы SonarCloud записывались как
VERSION=not provided, поэтому период нового кодаprevious_versionтак и не сдвинулся: он по-прежнему был привязан к анализу от 2026-07-02, оценивал восемьдесят два дня работы как одно изменение и измерял 7877 «новых» дублированных строк при пороге в 3 %. Теперь сканирование передаёт версию крейта. Лежащее в основе дублирование реально и этим не скрывается: оно сосредоточено в декларативных реестрахFieldUnit, повторяющихся вensemble,hybrid,fusion,inertialиreport, и в таблице верификации из 168 строк, и здесь оно названо работой, которую предстоит сделать, а не исключено из измерения.У
scripts/gate.shне было блокировки единственного писателя, и каждый запуск писал в один и тот же журнал. Это не вопрос аккуратности:integration_binaries,tests_passedиtests_ignoredквитанции считываются ИЗ этого журнала, а хук перед отправкой доверяет квитанции. Шлюз, который был прерван, но чей тестовый двоичный файл ещё работал, продолжал писать в файл, который следующий запуск только что обрезал, — так что счётчики одного запуска могли быть засвидетельствованы как счётчики другого, разрешая отправку на основании набора тестов, который на отправляемом дереве не выполнялся. Теперь действует один шлюз на каждую рабочую копию (отказ с кодом выхода 75 при наличии работающего, снятие устаревшей блокировки, чей pid исчез) и один журнал на каждый запуск, причёмtarget/gate-run.logпри выходе обновляется из завершающегося запуска. Проверены оба направления: живой pid вызывает отказ, мёртвый — снимается.src/verification.rsутверждал, что его тесты «не доказывают, что строки названных тестов и оракулов разрешаются в живой код». Теперь два контроля делают именно это, так что документация модуля говорила обратное истине; теперь в ней сказано, что проверяется машиной, а что оставлено на человеческое суждение. Устаревшая ссылка наverification::gen— модуль называетсяartifacts— исправлена в собственной документации соседнего контроля.
Изменено#
mainбыла переписана 2026-09-22 и отправлена принудительно. Десять коммитов превратились в четыре. При переписывании каждый коммит, оставлявший проверку красной, был влит в коммит, который её исправил, так что теперь у каждого коммита вmainдерево проходит проверки, и удалены отменённые запуски, которые групповая блокировка параллелизма на всю ветку оставляла на каждом замещённом коммите.Ничего не отброшено. Коммиты до переписывания остаются достижимыми по указывающим на них тегам, а итоговое дерево побайтово идентично дереву, с которого началось переписывание, —
git diffмежду старой и новой верхушкой пуст, если не считать трёх файлов рабочих процессов, которые изменяет этот выпуск.Замещённые SHA — для тех, у кого есть ссылка на один из них:
старый тема 9733177docs(changelog): disclose the authorship rewrite and the two dangling crate sha1s 5d16ea8fix(docs): the engine-flow diagram said 6 figures of merit; the engine scores 7 148d31dfix(test): two more cross-platform pins, and two wrong assumptions of my own a3a2667feat(web): surface the lunar cluster on the site — seven capability cards 1e8bec6docs(lunar): document 42 public fields and ratchet the ceiling down to 985 7bba514chore(release): v0.27.0 3154548test(docs): guard the distribution diagram, the last unguarded one 7864142chore(release): v0.27.1 Теги v0.27.0 и v0.27.1 намеренно НЕ были перемещены. Они по-прежнему указывают на
7bba514и7864142— именно те коммиты, чьи деревья дали артефакты, ныне находящиеся на crates.io, npm, PyPI, ghcr.io и в реестре MCP. Файл.cargo_vcs_info.jsonкрейта записывает sha1, из которого он упакован, реестры неизменяемы, а аттестация происхождения сборки SLSA на ресурсах выпуска v0.27.1 привязана к этому коммиту. Перемещение тегов оставило бы каждый из этих опубликованных артефактов указывающим на коммит, которого больше нет. Если оставить их, старые коммиты остаются достижимыми, а все опубликованные цепочки происхождения продолжают разрешаться — ценой двух тегов, которые больше не являются предкамиmain, и именно поэтому существует этот выпуск: v0.27.2 даётmainсобственный тег, упакованный из коммита, который в ней находится.Это второе раскрытое переписывание этой истории; первое, 2026-09-21, приводило авторство к каноническому виду и записано в заметках 0.27.0 вместе с двумя его висячими sha1 крейта. Переписывание раскрывается здесь каждый раз, потому что репозиторий, который продаёт проверяемое происхождение, не может тихо сдвигать почву под опубликованным артефактом.
0.27.1 - 2026-09-22#
Исправлено#
Опубликованный крейт не компилировался. В
src/lunar_orientation.rsестьinclude_str!верхнего уровня дляtests/fixtures/llr_geometry/de440_moon_pa.csv, а манифест исключает/tests/fixturesиз пакета, поэтому в архиве, который получает crates.io, не было файла, встраиваемого самой библиотекой. По этой причине публикация v0.27.0 не прошла проверочную сборку, и 0.27.0 не попала на crates.io; npm и PyPI, чьи задания от неё не зависят, опубликовали версию нормально. Теперь исключение содержит оговорку для этого единственного каталога.Любое другое
include_str!фикстуры вsrc/находится внутри модуля#[cfg(test)]и поэтому никогда не попадает в упакованную библиотеку. Только верхнего уровня.Ничто в CI не запускало
cargo package, поэтому архив, который не компилируется, был впервые обнаружен заданием публикации, когда два других реестра уже выпустили версию. Теперь заданиеpackageпри каждой отправке собирает и компилирует именно этот архив.
Изменено#
- Эталонные значения излучения lunar-frame-realisation больше не сдвигаются при смене версии. Нижний колонтитул SVG содержит версию движка, поэтому каждый выпуск пересоздавал три хеша — дважды за один день, — а эталон, пересоздаваемый по рутине, перестаёт читаться. Перед хешированием строка версии нормализуется до заполнителя, а излучение отдельно проверяется на указание работающей версии, так что этот факт проверяется точнее, чем его когда-либо проверял хеш.
0.27.0 - 2026-09-22#
Добавлено#
lunar-llr-datum— датум лунной системы отсчёта по реальной кампании наблюдений.lunar-frame-campaignзаменил внедрённое преобразование Гельмерта имитированной кампанией и прямо об этом сказал: сеть станций, расписание и сигма на одно наблюдение в ней — иллюстративные входные данные. Этот сценарий убирает имитацию из двух мест, где расписание и модель ошибок влияют на ответ. Эпохи — это моменты передачи 337 архивных нормальных точек лазерной локации Луны ILRS (2015-04-08 .. 2015-06-27, Grasse MeO 7845 и Matera MLRO 7941, все пять массивов отражателей), а вес каждого наблюдения — собственная архивная точность этой нормальной точки,bin_rms / sqrt(n_raw)— медиана 5,13 мм односторонней дальности, взятая из файла, а не выбранная здесь. Координаты станций берутся из IERS ITRF2020, а координаты отражателей — из таблицы 7 JPL DE430; каждая фикстура записывает URL, дату получения и SHA-256 и воспроизводится из своего источника зафиксированным генератором, который проверяет источник и прерывается, а не выдаёт число. В отчёте названо, какие звенья измерены, а какие остаются смоделированными, и смоделированные измерены: разность «наблюдённое минус вычисленное» односторонней дальности по реальным данным составляет 156 494 м СКО, что тот же набор тестов подтверждает по JPL Horizons на том же интервале (195 655 м СКО вектора, худшая эпоха 0,054° — в пределах ~0,3°, на которые претендует встроенный аналитический ряд для Луны). Аддитивно: новый вид, новый ридер (realdata::llr_crd) и новый модуль (lunar_llr); существующие пакеты лунной системы отсчёта закреплены бит в бит.sigma_ure_mкак параметр сценария вlunar-integrityиmoonlight-service-volume. Точность измерения дальности по сигналу в пространстве была константой времени компиляции (LUNAR_SIGMA_URE_M), поэтому перебор по объёму обслуживания мог дать лишь ответ «прошёл/не прошёл» при одном фиксированном значении. Уровни защиты точно линейны по ней, поэтому её вынесение превращает перебор в требование к точности измерения дальности по всему объёму. Значение по умолчанию воспроизводит прежнее поведение бит в бит.Экспорт геометрии по спутникам в
moonlight-service-volume:export_site_lat_degиexport_site_lon_degдобавляют массивper_sat_geometry, дающий азимут, угол места и наклонную дальность до каждого спутника в каждую эпоху для одной названной селенографической точки, а также признак видимости. Сводка покрытия намеренно сворачивает геометрию по спутникам, но наклонная дальность — именно то, что потребляет бюджет линии связи, поэтому совместный анализ связи и навигации по одной лишь сводке выполнить было нельзя. Выключено, если не заданы обе координаты; сугубо аддитивно.lunar_service::topocentric, публичная вспомогательная функция углов наблюдения, лежащая в основе экспорта.Строка матрицы верификации для новой возможности геометрии.
Реальная диаграмма направленности антенны в экспорте геометрии. Движок с P1 содержит диаграмму круглой апертуры с равномерным освещением (
antenna::pattern_gain_dbi, форма Эйри[2·J₁(x)/x]²), и за пределамиantenna.rsеё никто не использовал — вместо этого работу выполняла пара из усиления по оси и эмпирического правила «усиление — ширина луча». Необязательная таблицаexport_antennaвmoonlight-service-volume(читается только при заданной точке экспорта) теперь даёт каждой экспортируемой строке угол от оси на спутнике и усиление передачи в сторону точки по этой диаграмме и добавляет блокantenna_pattern, который сообщает число спутников в луче по реальной диаграмме рядом с числом в луче по симметричному приближению (θ₃dB[deg] = √(31000/G_lin)), а разницу — как именованную поправку. Выдаются оба числа; ни одно не заменяет другое. При измерении на собственной характерной лунной апертуре движка (антенна 1 м, 2,4 ГГц, η = 0,60) над южнополярной точкой и иллюстративной оболочкой класса LCNS эти два числа расходятся более чем на один спутник: реальная диаграмма помещает 0 из 76 видимых линий в луч по половинной мощности, приближение утверждает 28 — поправка −2,33 спутника на эпоху, в худшую единичную эпоху 3. У приближения есть собственная эффективность апертуры (0,641 против правила70·λ/Dградусов, с которым его обычно приводят, и 0,920 против равномерной круглой апертуры), так что на антенне с η = 0,60 оно даёт луч в 1,238× шире; блок выдаёт обе подразумеваемые эффективности, а не оставляет их на домысел. Сугубо аддитивно: на документированной рабочей точке 597 ранее существовавших листьев, 0 изменено, 0 удалено, 494 добавлено.antenna::symmetric_beamwidth_rad,antenna::symmetric_relation_implied_efficiency,antenna::within_half_power_beam,antenna::HALF_POWER_DROP_DB,antenna::SYMMETRIC_GAIN_BEAMWIDTH_CONST_DEG2,antenna::UNIFORM_APERTURE_HPBW_COEFFиlunar_service::nadir_off_boresight_rad— общедоступные элементы, стоящие за этим. Диаграмма теперь также привязана к опубликованным константам Эйри, а не только к самой себе: пересечение уровня половинной мощности находится методом бисекции и сравнивается сx = 1.61634, что делает точную ширину по половинной мощности равной1.02899·λ/Dи честно фиксирует, что общепринятый коэффициент1.02даёт дляpattern_gain_dbiзначение −2,955 дБ, а не −3,010 дБ.Длинная форма таблицы воспроизводимости для
lunar-time-budget. Выходные массивы сценария — сетка времён усреднения, семь кривыхx(τ)по слагаемым и их итог в виде корня из суммы квадратов — доходили до потребителей только как массивы JSON. Одна выпущенная таблица была усечена на 400 символах и публиковала 23 из своих 57 времён усреднения под столбцом, который заявлял о всех, а рукопись восстанавливала кривые по слагаемым из замкнутых форм, потому что движок их никогда не выдавал. Теперь обычный запуск дополнительно записывает<scenario>.table.csvс одной строкой на каждую тройку (индекс сетки, время усреднения, слагаемое), которую нельзя усечь так, чтобы она всё ещё выглядела целой. Индекс сетки — точный ключ соединения;τзаписывается с 13 значащими цифрами, а каждоеx— с 7, так что байты не расходятся между сборками одного и того же источника. Сугубо аддитивно: JSON отчёта побайтово идентичен.Отчёт
hybrid-optical-rfтеперь описывает сам себя. Блокlink_configurationповторяет разрешённые входные данные линии — длину волны несущей, апертуру передачи и приёма, дальность, длительность импульса, время интегрирования, эффективности и потери — с применёнными значениями по умолчанию, так что статья указывает конфигурацию, на которой она выполнена, а не цитирует значение по умолчанию, считанное из исходного кода. Блокunitsдаёт единицу и класс происхождения каждой величины, которую статья, вероятно, процитирует. Причина его появления — следы ковариации передачи: они выдавались как голоеvariance, и рукопись выводила квадратные метры из внутренней проверки согласованности. Вывод оказался верным, и именно поэтому это был дефект: ничто не заметило бы, будь он неверным. Сугубо аддитивно: при измерении на четырёх конфигурациях 456 ранее существовавших полей, 0 изменено, 0 удалено, 196 добавлено.Строка матрицы верификации для таблицы воспроизводимости бюджета времени, честно отмеченная как
InternalConsistency/ MODELLED — итог сверяется с корнем из суммы квадратов слагаемых в том же файле, который использует собственные определения слагаемых движка и потому не является независимым оракулом. Вместе они добавляют три строки. Текущий итог для этого невыпущенного раздела: 168 строк — 64 VALIDATED, 100 MODELLED, 4 PARTNER.
Изменено#
Авторство коммитов во всей истории теперь соответствует единой учётной записи, а два опубликованных крейта указывают на коммит, которого больше нет. 2026-09-21 история git была переписана так, что автором и коммиттером каждого коммита человека является
ashfordeOU <236818772+ashfordeOU@users.noreply.github.com>. Ранее она содержала три написания одного человека — 688 коммитов какashfordeOU <contact@ashforde.org>, 34 какChakshu Baweja <contact@ashforde.org>и 94 уже в каноническом виде. Единственный коммитdependabot[bot]намеренно оставлен со своим автором: смена подписи у обновления зависимости, сделанного ботом, заявила бы авторство работы, которую здесь никто не выполнял.Содержимое не менялось. Переписывание затронуло только заголовки автора и коммиттера, и это поддаётся проверке, а не просто утверждается: дерево каждого тега и каждой ветки бит в бит совпадает с прежним.
v0.26.0по-прежнему разрешается в дерево92284e9420605568f1bfabb78cd95d383b40f3e2, точно как раньше.Чего это стоило. Имя коммита — это хеш от его дерева, его родителей и заголовков автора, поэтому изменение предка переименовывает каждого потомка. Коммит выпуска
v0.26.0былdce2dbf7700788cf6de46260c14673c0e5347360, а теперь сталd4921f3025569e00e425e1747d0acfc261e96e18. Два артефакта записали старое имя при публикации и не могут быть исправлены, потому что опубликованная версия в реестре по замыслу неизменяема:kshana0.26.0 на crates.io —.cargo_vcs_info.jsonзаписываетdce2dbf…kshana-mcp0.26.0 на crates.io — тот же sha1,path_in_vcs: mcp/kshana-mcp
Больше ничто не затронуто. Пакет npm не записывает
gitHead, а дистрибутив PyPI вообще не записывает коммит; оба случая проверены, а не предположены.Нет исправления, которое заставило бы
dce2dbf…называть переписанный коммит: эта строка и есть старая родословная, а единственный способ её разрешить — оставить опубликованной историю до переписывания, что вернуло бы авторство, которое переписывание убрало. Поэтому происхождение 0.26.0 прослеживается через тег, а не через записанный sha1, — и тег даёт те же самые байты, из которых был собран крейт. Следующий выпуск записывает действительный коммит без каких-либо действий.
Исправлено#
realtime-frame-eopпо умолчанию использовал файл EOP без строк прогноза (G12). Сценарий встраивал пятистрочную выдержкуfinals2000Aтолько с окончательными данными (final-only) как автономное значение по умолчанию, поэтому обычный запуск сообщалpredicted_rows.n = 0, а таблица по горизонтам опиралась на 5, 4, 3 и 2 пар. Движок всегда умел читать строку прогноза — во входных данных их просто не было. Теперь по умолчанию используется дословная выдержка IERS 2026 (tools/finals2000A_2026.txt, MJD 61173–61204): 20 окончательных значений Bulletin B и 12 строк Bulletin A, содержащих только прогноз, так что обычный запуск без аргумента файла и без сети сообщаетpredicted_rows.n = 12и таблицу по горизонтам при n = 20 / 31 / 30 / 29, а также заполняются сравнение с оперативным предсказателем и согласие с собственными опубликованными прогнозами продукта. Выдержка на 45 строк с длинным интервалом была измерена как альтернатива и отвергнута: она тоже содержит только окончательные данные и оставила быpredicted_rows.nравным 0. Это сдвигает опубликованные числа по правилу R4 и с разрешения основателя: десять из 22 ячеек выпущенногоp4_frame_eop.csvи 24 из 42 заполненных ячеекtests/golden/realtime-frame-eop.csv. Измеренный нижний порог полюса «оперативное минус окончательное» становится 0,0678 мсд (было 0,0769 мсд), что совпадает со значением, которое таблица движения полюса статьи P4 уже публикует при n = 20 — теперь они согласуются, а не расходятся на 13,5 %. Любой другой показатель, который P4 печатает по этой таблице, при печатаемой точности не изменился. Полный перечень «было → стало», включая поля, которые не сдвинулись, приведён вdocs/revisions/G12-default-eop-cell-changes.md. Выдержка только с окончательными данными по-прежнему поставляется, закреплена побайтово и используется: нулевое число строк прогноза на ней — свойство самого файла, и тест это по-прежнему доказывает.Устаревшее ограничение числа спутников в
moonlight-service-volume. Сценарий ограничивалn_satsзначением 12, хотя его собственный построитель орбитальной группировки поддерживает 24, а тест проверяет именно 24; поэтому любое запрошенное число свыше 12 молча уменьшалось, и перебор по числу спутников возвращал одинаковые значения выше 12 — их нельзя было отличить от настоящего геометрического насыщения. Теперь ограничение установлено на пределе построителя. Это изменение поведения только дляn_sats > 12.То же устаревшее ограничение в
lunar-differential-pnt.lunar_dpntограничивалn_satsзначением 12 с теми же последствиями, и здесь это дошло до опубликованной таблицы: вdpnt_nsats_sweep.csvстрокаn = 16побайтово совпадает со строкойn = 12, потому что движок возвращал результат для двенадцати спутников под меткой шестнадцати. Теперь ограничение установлено на пределе построителя, равном 24, а новый тест закрепляет это: каждая большая орбитальная группировка должна и сообщать собственное число спутников, и строго улучшать уровень защиты, чтобы ограничение не вернулось незамеченным. Это меняет опубликованные числа: уровень защиты дляn = 16меняется с 16,92 м на 14,57 м. При переборе до 24 кривая строго монотонна (11,94 м при 24 спутниках, на 29,5 % лучше, чем при 12), то есть насыщения на 12 нет — кажущееся плато создавало ограничение. Изменение поведения только дляn_sats > 12.
0.26.0 - 2026-09-18#
Релиз документации, прозрачности и playground. Поведение движка не менялось: матрица верификации содержит 102 строки — 56 VALIDATED, 42 MODELLED, 4 PARTNER, как и в 0.25.0.
Добавлено#
- Rustdoc на уровне крейта (
//!вlib.rs): точки входа, модель честности и уровней доказательств, воспроизводимость, так что docs.rs открывается на настоящей стартовой странице, а не на голом списке модулей. docs/SCENARIOS.md— справочник по каждому из 50 видов сценариев; создаётся изapi::list_scenario_kinds()(единственного источника истины) с помощьюgen_validation_artifactsи защищён тестомtests/scenarios_reference_doc_sync.rs, поэтому не может разойтись с диспетчером.- Документация модулей для 11 ранее недокументированных публичных модулей (
allan,estimator,fom,hybrid,inertial,models,report,run,scenario,timetransfer,types). - Литературные источники для пяти модулей с формулами, в которых было записано уравнение, но не указан источник:
batch_ls(Tapley/Schutz/Born; Bjorck),cr3bp(Szebehely; Koon et al.),detection(Kay),attitude_budget(Wertz; Sidi),reentry(Allen-Eggers, NACA TR-1381). - Опубликованный
security.txtна kshana.dev для скоординированного раскрытия уязвимостей. - Уровень доказательств для каждого прогона в playground. Таблица показателей качества для одиночного прогона теперь содержит для каждого показателя метку VALIDATED/MODELLED, считываемую из той же таблицы
fomTier(), что используется в загружаемом отчёте (она повторяетsrc/fom_label.rs, а та, в свою очередь, выводится из матрицы верификации), так что уровень, показанный рядом с числом в реальном прогоне, никогда не разойдётся с реестром. lunar-attack-surfaceв меню playground — все 50 доступных для запуска видов теперь в один щелчок (было 49/50).- Ещё пять запускаемых карточек возможностей (космическая погода, оценка РЧ-искажений, устойчивость, совместимость с CCSDS OEM, KIF); число запускаемых карточек выросло с 11 до 16. Карточки, существующие только как API или библиотека, сохраняют честную ссылку на документацию вместо поддельной кнопки запуска.
Изменено#
- Покрытие документацией теперь закрепляется по принципу «храповика» в CI.
check-doc-coverage.shкомпилирует библиотеку сmissing_docs, подсчитывает предупреждения и завершается ошибкой, только если их число превышает зафиксированный потолок (986). Жёсткий#![warn(missing_docs)]при-D warningsпревратил бы ~1000 существующих недокументированных публичных элементов в поломку сборки за одну ночь; при таком подходе новые недокументированные публичные элементы приводят к сбою сборки, а накопленный задел сокращается последовательно.
Исправлено#
- Строка инструмента MCP
list_scenario_kindsзаявляла «~17 встроенных видов сценариев», тогда какapi::list_scenario_kinds()уже давно предоставлял 50 — документация для агентов занижала реальные возможности втрое. Приведено к фактическому числу. - Заново создан оракул соответствия для CycloneDX SBOM по обновлённому графу зависимостей (60 компонентов). Вердикт соответствия не изменился: ноль нормализованных ошибок схемы, и каждый атомарный идентификатор лицензии по-прежнему входит в официальный перечень SPDX.
0.25.0 - 2026-07-15#
Добавлено#
- Пять возможностей переведены на уровень внешнего VALIDATED; каждая теперь перекрёстно проверена по независимой стороннему реализации той же однозначно определённой величины (без циклической зависимости, с фикстурами, воспроизводимыми офлайн):
- преобразование степенного шума IEEE-1139 в девиацию Аллана по замкнутым формулам
allantoolsдля всех пяти типов шума (tests/powerlaw_oadev_reference.rs); - веса формирователя диаграммы CRPA MVDR / нулеобразования с минимальной нормой по LAPACK из numpy/scipy (
tests/crpa_reference.rs); - определение ориентации по Вахбе / TRIAD / QUEST по сравнению с SVD-функцией SciPy
Rotation.align_vectorsна наблюдениях без шума (tests/wahba_reference.rs); - обмен блоками ковариации CCSDS 502,0 OEM, пропущенный в обе стороны через разборщик независимой библиотеки
oem(tests/ccsds_oem_covariance_reference.rs); - ядро статистик обнаружения при захвате с квадратичным детектором (обобщённая функция Маркума Q / P_d / P_fa / порог) по сравнению с SciPy
ncx2/chi2(tests/acquisition_reference.rs). Проверяемая машиной матрица валидации теперь содержит 56 VALIDATED · 42 MODELLED · 4 PARTNER в 102 строках (было 51 · 47 · 4). Оговорки об области применимости сохранены честно — например, повышение уровня для захвата охватывает только ядро статистик обнаружения; потери CFAR/straddling остаются на уровне MODELLED.
- преобразование степенного шума IEEE-1139 в девиацию Аллана по замкнутым формулам
- Показатели качества в области положения (
fom::positioning_performance): точные CEP, SEP и 2DRMS по 3-D ковариации положения ENU навигационного решения и горизонтальному уровню защиты. CEP/SEP — это точные медианы радиальной ошибки (а не линейное правило0.589·(σ₁+σ₂)), перепроверенные по квантилям рэлеевского и максвелловского распределений изscipy.statsи независимой медиане Монте-Карло на NumPy (tests/positioning_fom_reference.rs). Заменяет прежнюю честную заглушку «не реализовано» — сигнатура функции изменилась с(), возвращавшей ошибку, на(cov_enu, hpl_m), возвращающуюPositioningFom. - Эквивалентное число степеней свободы (EDF) доверительных интервалов доведено до конца для всех оценок семейства Аллана (
assurance::uncertainty::edf): EDF для модифицированной девиации Аллана, Адамара и полной дисперсии теперь использует комбинированный алгоритм EDF Greenhall и Riley и форму TOTVAR из таблицы 7 NIST SP 1065 (раньше был реализован только EDF для перекрывающейся девиации Аллана, а остальные молча использовали его же), с перекрёстной проверкой поallantoolsedf_greenhall/edf_totdev(tests/uncertainty_edf_reference.rs). - Независимые внешние перекрёстные проверки для геометрии лунной системы PNT, DOP, EOP, DRO и РЧ-определения дальности (
tests/validate_p*.rs, с фикстурами и генераторами оракулов вtests/fixtures/{p1_footprint,lunar_service,eop_prediction,rf_ranging_precision,dro_family_jpl,p2_independent_dop}/). Каждая проверка прогоняет уже поставляемую модельную возможность против оракула, полученного другой реализацией, так что согласие свободно от циклической зависимости: орбитальный след передачи/захвата — противscipy.special.j1(Cephes — действительно иная реализация функции Бесселя J1); DOP геометрии поверхностных маяков — против независимого решения на NumPy по(HᵀH)⁻¹; рост ошибки предсказания персистентности UT1/EOP — против отдельного повторного разбора на NumPy тех же дословных строк IERSfinals2000A; плоское семейство дальних ретроградных орбит — против базы данных периодических орбит задачи трёх тел NASA/JPL; а бюджет точности РЧ-определения дальности — против эталона, построенного из первых принципов. Это дополнительные регрессионные доказательства для существующих модулей; добавление этих перекрёстных тестов само по себе не меняет статус ни одной возможности (пять повышений выше — отдельные изменения статуса на основе оракулов вsrc/verification.rs). - Сценарий
lunar-attack-surface(src/attack_surface.rs,kind = "lunar-attack-surface"): составной, доступный через бинарный файл (CLI / Python / MCP / wasm черезrun_toml) прогон безопасности лунного сигнала P1, который объединяет дефицит мощности в бюджете линии связи и его полосу чувствительности 12–18 дБ, требуемую мощность передачи для подавления или спуфинга в зависимости от дистанции, орбитальный след захвата при реальной диаграмме антенны, исход втягивания в захват при спуфинге в петлях слежения, дальность горизонта на безатмосферном теле и бюджет аутентификации OSNMA/TESLA. Пустое тело воспроизводит базовый уровень P1. - Полоса чувствительности дефицита мощности (
linkbudget::deficit_sensitivity_band,deficit_power_factor): настоящий многоосный перебор (эталон × EIRP × наклонная дальность), построенный наsweep::SweepAxisи вычисляемый черезreceived_signal_power_dbw; воспроизводит полосу P1 12–18 дБ и согласует линейные коэффициенты 32× (округлённый) и 36× (неокруглённый). - Трёхмерный куб захвата при спуфинге (
spoof_capture::capture_cube): добавляет к карте захвата ось смещения несущей/Доплера (J/S × смещение кода × смещение несущей, время захвата для каждой ячейки); срез при нулевом смещении несущей в точности сводится к 2-Dcapture_map.
Изменено#
- Обнаружение разреженной сетью мониторов (
monitor_network) теперь объединяет физическую статистику AGC изspoof_monitorsи сетку селенографической видимости изlunar_service, чтобы получать статистику обнаружения и геометрию каждой станции вместо свободных параметров и произвольного перекрытия по большому кругу; вероятности обнаружения для отдельного монитора и сети по-прежнему задаются замкнутыми формулами хи-квадрат/Маркума Q изdetection. ПоляSurfaceMonitor/SpoofEventизменились и теперь выражены физическими величинами (широта/долгота/высота/мощность).
Исправлено#
- Оценка накладных расходов аутентификации OSNMA/TESLA (
nma_budget): доли полей OSNMA на страницу (8 бит HKROOT + 32 бита MACK на страницу в 2 с) были ошибочно помечены как итоги на подкадр, из-за чего накладные расходы занижались в 15 раз (1,33 бит/с). Исправлено на опубликованные в SIS-ICD итоги на подкадр в 30 с (HKROOT 120 + MACK 480 бит ⇒ 20 бит/с). Следствие теперь изложено честно: при скорости навигационного сообщения AFS 50 бит/с накладные расходы аутентификации составляют затраты первого порядка, ≈40 %, а не пренебрежимые несколько процентов; полеauth_latencyописано как задержка раскрытия ключа (нижняя граница сквозного времени до первого аутентифицированного решения).
0.24.0 - 2026-07-09#
Широкий релиз возможностей. В нём появляются два полностью внешне проверенных набора анализа — полное семейство многокритериального анализа решений (MCDA) и оценки блуждания Аллана и стабильности часов при больших τ — и открывается новый запускаемый слой сценариев бюджета лунного времени, системы отсчёта и EOP в реальном времени, оптико-РЧ-гибрида, наблюдаемости в цислунном пространстве и устойчивости многослойной PNT к конфликтам поверх базовой основы, а также основа возможностей для поверхностных маяков на Луне и безопасности сигнала. Проверяемая машиной матрица валидации растёт до 51 VALIDATED · 47 MODELLED · 4 PARTNER в 102 строках (было 40 · 47 · 4 в 91): все одиннадцать новых строк — это валидации по внешним оракулам для методов анализа решений и оценок времени, проверенные по независимым библиотекам (SciPy, pymcdm, pyDecision, allantools) с жёстким допуском, тогда как новая область возможностей PNT честно показана как MODELLED. Как и всегда, ни одно числовое утверждение модели не повышается в статусе без внешнего набора данных.
Добавлено#
Запускаемые сценарии — каждый является зарегистрированным сценарием kind, диспетчеризуется через движок и сквозным образом подтверждается в CI тестом tests/determinism.rs (он запускает все поставляемые scenarios/*.toml и завершается ошибкой при любой незапускаемой фикстуре):
- Устойчивость многослойной PNT к конфликтам (
conflict-resilience,src/conflict_resilience.rs) — движок устойчивости Монте-Карло с начальным значением (seed) для многослойной архитектуры PNT, с моделью выживания при плавной деградации по векторам угроз (§4,2; четыре именованных вектора угроз, замкнутая форма выживания пригодной PNT, к которой сходится Монте-Карло для каждого слоя, выводится в JSON результата) и документированным, защищённым от дрейфа происхождением параметров угроз (src/conflict_threat_params.rs). Архитектуры уровня MODELLED; сходимость Монте-Карло выживания к замкнутой форме — это ядро, проверенное по внешнему эталону. - Наблюдаемость в цислунном пространстве (
cislunar-observability,src/cislunar_observability.rs) — собственный спектр грамиана наблюдаемости на дуге, генератор начальных условий для дальней ретроградной орбиты (DRO) с дифференциальной коррекцией и независимая перекрёстная проверка корневым информационным фильтром, апостериорная ковариация которого становится конечной ровно при полном ранге наблюдаемости. Орбитальная группировка уровня MODELLED; инварианты ранга, грамиана, STM и SRIF — это ядро, проверенное по внешнему эталону. - Неоднородная оптико-РЧ-гибридная непрерывность и целостность (
hybrid-optical-rf,src/hybrid_integrity.rs,src/optical_availability.rs,src/optical_linkbudget.rs,src/cross_raim.rs) — междоменные доступность и целостность при совместном использовании оптической и РЧ PNT. MODELLED. - Эндогенный бюджет лунного времени (
lunar-time-budget,src/lunar_time_budget.rs) и бюджет системы отсчёта / EOP в реальном времени (realtime-frame-eop,src/realtime_frame_eop.rs,src/frame_eop.rs) — бюджеты лунного времени и ориентации Земли P3/P4, выводимые эндогенно из цепочки синхронизации, а не задаваемые. MODELLED.
Внешне проверенные наборы анализа — библиотечные возможности, каждая из которых входит в матрицу новыми строками VALIDATED (проверенными по независимому внешнему оракулу, а не самопроверкой):
- Полный набор многокритериального анализа решений (MCDA) (
src/mcda/) — четыре семейства методов: агрегирование значений (WSM, WPM, WASPAS), система отношений (MOORA) и пропорциональный (COPRAS), расстояние до идеала (TOPSIS), компромиссное программирование (VIKOR) и превосходство (PROMETHEE II с шестью формами обобщённого критерия, ELECTRE I с согласием/несогласием) — а также веса приоритета AHP по собственному вектору Перрона с проверкой коэффициента согласованности Саати (CR < 0,10), полезность MAUT, выделение фронта Парето и анализ чувствительности к весам. Девять агрегаторов воспроизводят pymcdm / pyDecision, а собственный вектор AHP совпадает с SciPy/LAPACK — всё с точностью < 1e-9 (tests/mcda_*_reference.rs). Торнадо-диаграмма чувствительности также выводится внутри сценария устойчивости к конфликтам. - Оценки блуждания Аллана и стабильности часов при больших τ (
src/allan.rs) — MTIE (статистика размаха блуждания ошибки времени по ITU-T G.810/G.823/G.8261, на которой строятся маски синхронизации), временные оценки блуждания MDEV и TDEV и оценки расширенного диапазона Theo1 / TOTVAR. VALIDATED по allantools на рядах NIST SP 1065; гибридная оценка ThéoH с устранением смещения, построенная на TOTVAR, честно остаётся на уровне MODELLED. - Каркас обеспечения достоверности / внешних оракулов (
src/assurance/) — каркас оракулов, напрямую подключённый к проверке честности в CI, запись происхождения W3C-PROV с детерминированным корнем Меркла, а также эквивалентное число степеней свободы по Greenhall и доверительные интервалы хи-квадрат для оценок стабильности. - Шов расширения PackRegistry / ExternalPack (
src/registry.rs,src/api.rs) — шов диспетчеризации, через который пакеты возможностей маршрутизируются через единый реестр (встроенная диспетчеризация находится на горячем пути CLI; внешние пакеты подключаются заExternalPack::register_intoсо значением по умолчанию), защищённый эталонным набором проверки побайтового тождества и отдельными CI-проверками standalone / wasm32.
Основа возможностей, полученных моделированием — новые библиотечные модули, питающие описанные выше сценарии и будущие (пока не отдельный сценарий kind):
- DOP для поверхностных маяков на Луне (
src/lunar_beacon.rs) с бюджетом реализованной точности, перебором по числу спутников и картой GDOP, а также возмущённые лунные эфемериды (src/lunar_perturbed.rs) и геометрия безатмосферного горизонта / обратная задача мощности спуфинга / полоса дефицита AFS (src/jamming.rs,src/linkbudget.rs). Использует ядро DOP, проверенное по gnss_lib_py. - Приём DEM в формате LOLA и прямая видимость над рельефом (
src/realdata/lola_dem.rs). - Трёхслойная защита безопасности сигнала — захват при спуфинге, перекрёстная целостность по датчикам и размер сети мониторов (
src/spoof_capture.rs,src/cross_sensor_integrity.rs,src/monitor_network.rs) с диаграммой орбитального луча антенны и бюджетом аутентификации OSNMA (src/antenna.rs,src/nma_budget.rs). MODELLED.
Изменено#
- Матрица валидации и все производные артефакты заново созданы из единого источника истины (
src/verification.rs): реестр на сайте, диаграммы карты модулей и происхождения валидации, а также строки со счётчиками в README и на каждой поверхности теперь показывают 51 / 47 / 4 из 102 (было 40 / 47 / 4 из 91); проверка честности счётчиков теперь просматривает всю историю git, а рисунки README приведены к единой тёмной фирменной палитре. - Один общий адаптивный интегрирующий драйвер теперь обслуживает и
integrate, иintegrate_dopri(src/integrator.rs), что убирает дублирование шаговой процедуры. - В CI добавлен статический анализ SonarQube Cloud (Rust и импортированное покрытие), а в README — значки оценок безопасности, сопровождаемости и надёжности.
- Дисциплина выпуска и упаковки: CI регистрирует среду развёртывания для каждой публикации пакета в реестре, а целевое публичное автономное задание больше не зависит от медленных проверочных бинарных файлов.
- Защитная проверка отсутствия атрибуции теперь ограничена только маркерами авторства, так что упоминание хоста интеграции или продукта больше не приводит к сбою сборки.
- Документация: раздел README Citing теперь перечисляет четыре опубликованных препринта arXiv, а возможность DOP для поверхностных маяков описана в лунной строке.
Фрагмент с названиями сторонних ИИ-клиентов здесь опущен; он есть в CHANGELOG.md на GitHub.
Исправлено#
- Целочисленные счётчики циклов для циклов, управляемых числами с плавающей запятой (Sonar S2193).
- Точная обратная функция хи-квадрат при малом числе степеней свободы за счёт уточнения методом Ньютона в тракте доверительных интервалов обеспечения достоверности.
- kshana.dev: раздел стандартов теперь открыт по умолчанию, исправлен резервный счётчик реестра; устаревшие строки README и сайта вокруг слоя наблюдаемости приведены в соответствие.
0.23.0 - 2026-06-29#
Релиз возможностей, добавляющий общий слой информации Фишера / наблюдаемости по Крамеру — Рао и оптимального планирования эксперимента, а также релиз, на котором основана работа о наблюдаемости лунной PNT. Проверяемая машиной матрица валидации растёт до 40 VALIDATED · 47 MODELLED · 4 PARTNER в 91 строках (было 39 · 46 · 4 в 89): новый движок оценивания проверен по внешнему оракулу и имеет уровень VALIDATED; его лунное применение честно имеет уровень MODELLED. Как и всегда, ни одно числовое утверждение модели не повышается в статусе без внешнего набора данных.
Добавлено#
src/fim.rs— информация Фишера, границы Крамера — Рао и оптимальное планирование эксперимента. Общий переиспользуемый движок теории оценивания: информационная матрица ФишераM = HᵀWHпо якобиану измерений и весам; симметричный решатель собственных значений (циклический метод Якоби); нижняя граница Крамера — Рао через обратную матрицу либо через псевдообратную матрицу Мура — Пенроуза плюс базис нуль-пространства, когда информация имеет неполный ранг (случай свободной сети / дефекта датума); и метрики оптимального планирования эксперимента D-, A-, E- и T-типа с селекторомbest_designпо кандидатным геометриям. VALIDATED по NumPy (eigh/inv) и опубликованным замкнутым границам Kay (1993) с точностью 1e-9 (tests/fim_observability_reference.rs), поэтому входит в матрицу строкой по внешнему оракулу, а не самопроверкой.- Наблюдаемость совместного определения орбиты на Луне (
lunar_observabilityвsrc/lunar_combination.rs, выводится в отчёте по лунной комбинации): применяет движок FIM/CRLB к совместному решению орбиты и часов, чтобы показать дефект датума абсолютных станций, восстановление ранга по мере добавления станций с земными базами, достигнутую границу CRLB для положения станций и E-оптимальную обусловленность. Честно MODELLED — движок оценивания проверен извне, но лунная сеть, к которой он применён, — это репрезентативная симуляция, и никакой имеющийся набор данных не может превратить эту геометрию в измерение. - Репрезентативная геометрия эллиптической лунной замороженной орбиты (ELFO) для сценария лунной комбинации (
orbit_ecc,orbit_inc_deg,orbit_argp_deg,orbit_planes; круговое размещение остаётся по умолчанию) и поле наблюдаемости без VLBI в отчёте, чтобы можно было показать, что результат о дефекте датума не зависит от геометрии. Та же лестница 3→1→0 и порог в три станции сохраняются на ELFO семейства Moonlight/LCNS, а при трёх земных базах VLBI абсолютное положение станции наблюдаемо с субметровой границей — это закреплено тестомelfo_geometry_confirms_the_observability_structure. По-прежнему MODELLED.
Изменено#
- Матрица валидации и все созданные артефакты доказательств заново получены из единого источника истины (
src/verification.rs): реестр (web/data/verification-matrix.json),docs/VERIFICATION-MATRIX.md,docs/MODELLED-RATIONALE.md, рисунки разбивки валидации и видов оракулов, а также строки со счётчиками в README на всех поверхностях распространения теперь показывают 40 / 47 / 4 из 91.
0.22.1 - 2026-06-29#
Релиз-патч только для упаковки. Никаких изменений движка, сценариев или результатов; матрица валидации не изменилась и содержит 39 VALIDATED · 46 MODELLED · 4 PARTNER в 89 строках.
Исправлено#
- Публикация в npm: пакет
repository.url, полученный из манифеста крейта, использовал владельца GitHub с неправильным регистром (AshfordeOU), из-за чего не прошла проверка происхождения sigstore в npm (она сравнивает владельца с учётом регистра). Теперь в манифестеrepositoryуказан канонический нижний регистрashfordeOU, поэтому созданныйpackage.jsonсовпадает с субъектом происхождения, и выпуск npm публикуется.
Изменено#
- Сборка wheel фиксирует
codegen-units = 1, чтобы wheel для manylinux был побайтово воспроизводим при пересборках (проверка воспроизводимости пересборкой и сравнением).
0.22.0 - 2026-06-29#
Релиз консолидации, посвящённый дисциплине доказательств, происхождения и распространения. Проверяемая машиной матрица валидации растёт до 39 VALIDATED · 46 MODELLED · 4 PARTNER в 89 строках (было 15 · 42 · 4 в 61) благодаря перекрёстной проверке моделируемых возможностей по независимым внешним оракулам. Каждый распространяемый артефакт теперь несёт криптографическую аттестацию происхождения сборки SLSA, поставляется с CycloneDX SBOM и публикуется синхронно на всех поверхностях. Ни одно числовое утверждение модели не повышается в статусе без внешнего набора данных; новые возможности по-прежнему честно имеют уровень MODELLED.
Добавлено#
- Динамика ориентации (
src/attitude_dynamics.rs, MODELLED) — свободные от моментов уравнения Эйлера для твёрдого тела и кинематика кватернионов (RK4), с самопроверками законов сохранения (норма кватерниона, кинетическая энергия, |Iω|, прецессия симметричного волчка). - Перекрёстная проверка моделируемых возможностей по независимым внешним оракулам, доводящая матрицу валидации до 39 строк VALIDATED, каждая из которых опирается на внешний набор данных (проверка честности в CI запрещает статус VALIDATED без него). Новейшие валидации по внешним оракулам: измеренная кривая стабильности оптических часов (подгонка ADEV-кривой в
quantum_tradeвоспроизводит опубликованную σ_y(τ) оптических часов на решётке ⁸⁸Sr из работы Norcia et al., Science 366:93 (2019), Zenodo 10.5281/zenodo.3382347, CC-BY-4.0, включена вtests/fixtures/optical_clock_adev/); генерация дальномерного кода GPS L1 C/A (LFSR G1/G2 вsrc/sdr.rsвоспроизводит восьмеричные фазы кода из таблицы 3-Ia IS-GPS-200 для PRN 1–9); и считыватель цифровой модели рельефа SRTM на реальной местности (src/altpnt/terrain.rsчитает включённый в репозиторий тайл NASA/USGS SRTM v3 в общественном достоянии, N36W117 / Долина Смерти, и помещает бассейн Бэдуотер в пределы его документированного диапазона съёмки). - Новые возможности уровня MODELLED, каждая из которых внутренне перепроверена по замкнутой форме или соседнему пути кода: динамика относительного движения Клохесси — Уилтшира / Хилла, пассивная геолокация излучателей по TDOA/FDOA, определение ориентации по Вахбе/TRIAD/QUEST, разрешение целочисленной неоднозначности фазы несущей ГНСС (LAMBDA), прицеливание по B-плоскости и гравитационный манёвр в приближении сопряжённых конических сечений, формирование диаграммы антенной решётки CRPA для защиты от подавления, статистики захвата ГНСС с квадратичным детектором, неоднозначность интерференционных полос / динамический диапазон квантового инерциального датчика, степенной шум часов IEEE-1139 с порогом фликкер-ЧМ и обмен блоками ковариации CCSDS-OEM.
- Реестр доказательств из единого источника с автоматически создаваемой документацией по верификации и защитой от расхождений; просматриваемый реестр валидации на kshana.dev с прямыми ссылками на доказательства для каждой карточки.
- Машиночитаемые метаданные для цитирования —
codemeta.json(CodeMeta 2,0) и.zenodo.json, привязанные к манифесту Cargo тестомtests/citation_metadata_doc_sync.rs. - Происхождение цепочки поставок — аттестация происхождения сборки SLSA для архива крейта, wheel, sdist и архива npm; доверенная публикация PyPI через OIDC; CycloneDX SBOM внутри wheel и пакета npm; сравнение воспроизводимой сборки и проверка после выпуска.
- Обнаруживаемость —
robots.txt,sitemap.xmlи метаданные Open Graph / JSON-LD на kshana.dev; автоматически создаваемый рисунокvalidation-breakdown, получаемый из матрицы. - README для каждой поверхности для crates.io / PyPI / npm с проверкой честности счётчиков.
Изменено#
- Оракул передачи времени с учётом эффекта Саньяка повышен до ExternalDataset — поправка Саньяка при экваториальном кругосветном обходе теперь проверяется по опубликованному значению Ashby 207,4 нс (Living Reviews in Relativity 6:1, 2003, ур. 1,29; воспроизведено с точностью < 0,05 нс). Составная возможность передачи времени честно остаётся на уровне MODELLED.
- Документация, диаграммы и рисунки обновлены по актуальной матрице (39/46/4/89): диаграмма происхождения валидации, рисунок
oracle-kind-stacked(теперь создаётся из матрицы с защитой от расхождений в CI), VALIDATION/PROVENANCE/CAPABILITY/QUANTUM-MODELS/WHEEL_TAGS, документы по архитектуре и руководства, а также итог реестра на kshana.dev. - Исходное дерево переформатировано зафиксированным rustfmt (набор инструментов 1.93.0) — только стиль, поведение не изменилось.
- Синхронное версионирование. Каждая поверхность распространения (крейт, PyPI, npm, крейт MCP и образ OCI, плагин JetBrains) теперь версионируется синхронно с движком, что обеспечивается
scripts/check-version-sync.shв CI. - Плагин JetBrains перелицензирован на AGPL-3.0-only (опубликованная версия 0.1.1 всё ещё указывала Apache-2.0) и теперь получает версию для Marketplace из тега выпуска.
- Повышение надёжности — вызовы
unwrapвне тестов удалены или обоснованы;clippy::unwrap_usedприменяется к коду вне тестов. - Переработка kshana.dev по принципу «сначала доказательство»: доминирующий главный экран, диаграммы архитектуры и рисунки результатов, i18n, сворачиваемые и адаптивные разделы реестра и стандартов.
Исправлено#
- Точные эфемериды SP3 — применение поправки IGS за вращение Земли для узлов при интерполяции.
- Изображения в реестрах — README для PyPI/crates.io/npm используют абсолютные URL изображений; относительные пути к изображениям в основном README отображались как повреждённые на странице PyPI 0.21.0. Проверка в CI (
tests/surface_readme_image_urls_doc_sync.rs) предотвращает повторение. - CI —
fmtиclippyпроходят без замечаний; прекращена компиляция с опорой на реальные данные, исключённые из git.
Тесты#
- Ковариация часов фильтра Калмана остаётся положительно полуопределённой и симметричной (тест свойств,
tests/property.rs). - Защита синхронизации документации: каждая публичная строка со счётчиками валидации, метаданные для цитирования, автоматически создаваемый рисунок и URL изображений в README поверхностей привязаны к своему источнику истины.
0.21.0 - 2026-06-26#
Этот релиз добавляет в открытый движок два прикладных набора уровня MODELLED — демонстратор квантовой PNT (доверенная квантовая передача времени, квантовая навигация без ГНСС, квантовое обнаружение отказов и аномалий) и набор лунной / цислунной PNT (лунное координатное время, лунный VLBI, совместное определение орбиты и часов, реализация системы отсчёта, зона обслуживания, дифференциальная PNT, экспорт для интероперабельности) — каждый запускается из одного kind, каждый выдаёт честную запись TradeEvidence и реестр репрезентативности и пробелов до полёта. Он также вносит шесть новых валидаций по внешним оракулам, доводя проверяемую машиной матрицу валидации до 15 VALIDATED · 42 MODELLED · 4 PARTNER в 61 строках. Новые прикладные числа получены на уровне MODELLED по иллюстративным параметрам из открытых источников — без TRL, лётного наследия, сертификации или одобрения агентства — а переиспользуемые ими проверенные ядра помечены соответственно.
Добавлено#
- Набор демонстраторов квантовой PNT (
quantum-time-transfer,quantum-gnss-free-nav,quantum-anomaly-detect). Три запускаемые прикладные области уровня MODELLED за движком, каждая выдаётTradeEvidenceи запись о репрезентативности и пробелах до полёта:- Доверенная квантовая передача времени (
src/timetransfer_chain.rs) — бюджет двусторонней передачи: оптические часы на решётке и фотонный канал в сравнении с CSAC и РЧ-каналом, с повторным использованием уровня защиты времени, показателем качества безопасности при атаке задержкой/повтором (1 − P_md) и обнаружением аномалий часов + задержкой CUSUM. - Квантовая навигация без ГНСС (
src/quantum_nav_od.rs) — инерциальный выбег на холодноатомном интерферометре в сравнении с INS навигационного класса при пропадании ГНСС, с честным указанием, что без внешней коррекции смещение акселерометра остаётся ненаблюдаемым, поэтому ошибка всё равно растёт. - Квантовое обнаружение отказов и аномалий (
src/quantum_faults.rs) — размеченный каталог отказов с ROC AUC и доверительным интервалом по бутстрепу и минимальным обнаруживаемым отказом при фиксированной частоте ложных тревог. - Общая библиотека моделей ошибок квантовых устройств (
src/quantum_devices.rs) и единый стенд сравнения квантового и классического подходов (src/qtrade.rs) лежат в основе всех трёх.
- Доверенная квантовая передача времени (
- Набор лунной / цислунной PNT. Семь запускаемых
kindуровня MODELLED поверх ядра CR3BP: лунное координатное время (вековой ход LTC/TCL − TT,src/lunar_time.rs), геодезическая наблюдаемая задержки лунного VLBI (src/lunar_vlbi.rs), пакетная оценка совместного многотехнологичного определения орбиты и часов (src/lunar_combination.rs), реализация системы отсчёта (7-параметрическое преобразование Гельмерта и привязка IAU 2015 WGCCRE,src/lunar_frame_realise.rs), анализ зоны обслуживания класса Moonlight / LCNS (src/lunar_service.rs), лунная дифференциальная PNT (src/lunar_dpnt.rs) и экспорт интероперабельности в духе LunaNet / IOAG (CCSDS-OEM и лунная шкала времени в оболочке KIF,src/lunar_interop.rs). Всё получено на уровне MODELLED по иллюстративным параметрам из открытых источников; не проверено по реальным данным VLBI / слежения за Gateway; никакой принадлежности к агентствам или их одобрения нет. - Шесть новых валидаций по внешним оракулам (матрица валидации теперь содержит 15 проверенных):
- ADEV / HDEV на реальных цезиевых часах 5071A — проверены по декадным опорным значениям Stable32 (
tests/cs5071a_reference.rs). - OADEV / MDEV / TDEV на эталоне Stable32
PHASE.DAT— проверены по опубликованным таблицам Stable32 (tests/phasedat_reference.rs). - ROC AUC обнаружения аномалий на реальной телеметрии ESA OPS-SAT — проверен по scikit-learn (
tests/opssat_ad_reference.rs). - Синтез функционалов гравитационного поля ICGEM — проверен по стандарту нормальной силы тяжести GRS80 (γ по Сомильяне с точностью 3.5e-12; карта возмущений EGM2008,
tests/icgem_gravity_reference.rs). - Вещательная ионосферная модель Клобучара — проверена по RTKLIB (
tests/klobuchar_reference.rs). - Ядро обнаружения RAIM (171 случай,
tests/raim_reference.rs) и уровень защиты SBAS DO-229E на реальных данных EGNOS (ответвление RTKLIB SBAS-PL,tests/sbas_reference.rs) — оба проверены по своим внешним оракулам.
- ADEV / HDEV на реальных цезиевых часах 5071A — проверены по декадным опорным значениям Stable32 (
- Реестр репрезентативности и пробелов до полёта (
src/representativeness.rs). Структурированная запись, которую выдаёт каждый демонстратор: что репрезентативно, что упрощено и что отделяет модель от полёта — честное дополнение к каждому сравнению уровня MODELLED. - Агрегирование исследований и удобство CLI. Манифест набора сценариев с агрегированием исследования одной командой, стабильные по хешу метаданные исследования +
--study-name, проверка сценариев с--validateи вывод уровня валидации для каждого показателя качества в отчётах исследований.
Изменено#
- kshana.dev переработан вокруг общего предметного каркаса — возможности и валидация объединены в один предметный обозреватель с общим словарём, показаны новые проверенные области, анимированный инструмент «Земля» с точным контуром суши и кнопка заявки на исследование, а также брендинг и ссылки Ashforde OÜ.
- README и ARCHITECTURE проверены на полноту и честность — исправлены устаревшие числа проверенных возможностей (теперь 15 внешних оракулов), расширены диаграммы, а также процитированы препринты об условном уровне защиты времени (arXiv:2606,24210) и разрыве оптимизма при РЧ-искажениях (arXiv:2606,22054).
- Исходники
paper/и конвейер черновика JOSS хранятся в публичном репозитории.
0.20.0 - 2026-06-22#
Этот релиз добавляет в открытый движок четыре возможности исследования — условный уровень защиты времени, оценку устойчивости PNT по согласованной методике, оценку разрыва оптимизма при РЧ-искажениях и front end программно-определяемого приёмника / реальных данных — каждая воспроизводима одной командой и записывает побайтово детерминированный артефакт. Все исследования имеют уровень MODELLED (синтетическая калибровка или калибровка по общедоступным наборам данных), несут честные сведения о происхождении (версия движка, начальные значения (seed), хеш конфигурации) и метки валидации и не являются сертификацией.
Добавлено#
- Условный уровень защиты времени (
tpl). Ограниченная holdover граница необнаруженной ошибки времени при спуфинге ГНСС с нижним порогом монитора на k сигм, дисперсией выбега по ван Лоану за время задержки обнаружения и временем до тревоги по CUSUM. Откалиброван на реальной записанной атаке (JammerTest 2024, сценарий 2.1.1) черезcargo run --release --example tpl_jammertest, воспроизводящий свою эталонную таблицу по скалярам, восстановленным из публичной записи (исходный набор данных не распространяется). - Оценка устойчивости PNT по согласованной методике и исследование нестабильности решений (
resilience). Модель архитектуры, оценка по RPCF, симплекс взвешивания Дирихле, нестабильность по тау Кендалла и доле смены лидера (top-1), а также схлопывание разнообразия при общей причине (Hill-N2), сcargo run --release --example resilience_report -- paper-artifacts/resilience-study.json. Соответствие методикам — вdocs/RESILIENCE-CROSSWALK.md. - Исследование разрыва оптимизма при РЧ-искажениях (
impairment_study,impairment_ml,eval_stats). Панель из 13 детекторов на синтетическом корпусе с обоснованными параметрами, разрыв оптимизма между данными из распределения и вне его, тренды закона масштабирования с перестановочной нулевой моделью и предиктор деградации по схеме «исключение одного», черезcargo run --release --example optimism_study -- paper-artifacts/optimism-study.json. - Front end программно-определяемого приёмника (
sdr) и адаптеры реальных данных (realdata/). Необработанные IQ/IF до отводов коррелятора и SQM, а также адаптеры загрузки (RINEX, u-blox UBX, GnssLogger, JammerTest, Yunnan, SatGrid) и примеры зондирования. Они читают записи, которые пользователь предоставляет локально; никакие записи не включены в репозиторий. - Зафиксированные артефакты исследований. Побайтово детерминированные
optimism-study.jsonиresilience-study.jsonтеперь отслеживаются вpaper-artifacts/, так что числа исследований можно проверить без пересборки; их по-прежнему можно воссоздать генераторами выше. Исходные наборы данных остаются вне репозитория (/realdata-cache/).
Изменено#
- Версия повышена до 0.20.0 в
Cargo.toml,CITATION.cffиREADME; артефакты исследований пересечения воссозданы, чтобы их метка соответствовала выпущенной версии.
0.19.0 - 2026-06-18#
Изменено#
- Лицензия изменена с Apache-2.0 на GNU AGPL-3.0-only; коммерческая лицензия доступна у Ashforde OÜ (двойное лицензирование). Открытый движок остаётся полностью открытым и публично проверяемым; сетевой копилефт AGPL (§13) означает, что закрытое или размещённое как сервис производное изделие должно вернуться в открытый исходный код — или получить коммерческую лицензию. Это защищает проверенное ядро от «форка с закрытием», сохраняя доверие к публичному, запускаемому и поддающемуся аудиту движку. См.
LICENSE(AGPL) и новыйLICENSING.md(что охватывает каждая лицензия и когда она применяется).LICENSEтеперь содержит текст AGPL-3.0; заголовки SPDX во всех исходниках обновлены доAGPL-3.0-only;NOTICE,README,GOVERNANCE,GLOSSARY, сайт и метаданные крейта и пакетов (Cargo.toml,pyproject.toml,CITATION.cff, крейт MCP и образ) обновлены соответственно.- Условия для участников (
CONTRIBUTING.md) теперь лицензируют входящий вклад по AGPL и предоставляют Ashforde OÜ право включать вклад в коммерчески лицензируемую редакцию, чтобы двойное лицензирование продолжало работать. - Политика зависимостей не изменилась, но обоснована заново (
deny.toml,GOVERNANCE): зависимости остаются с разрешительными лицензиями (Apache/MIT/BSD/ISC). AGPL допускается только для собственного крейта kshana — зависимость с копилефтом заразила бы коммерческую редакцию и сделала бы двойное лицензирование невозможным. - Примечание для нижестоящих пользователей: это смена лицензии на копилефт. Пользователи, полагавшиеся на разрешительные условия Apache-2.0, могут продолжать пользоваться последним выпуском под Apache-2.0 (
v0.18.0и более ранние, как опубликовано); начиная сv0.19.0действует AGPL-3.0 / коммерческая лицензия.
Безопасность#
- Обновление
pyo3с 0,24 до 0,29 для устранения RUSTSEC-2026-0176 / RUSTSEC-2026-0177 (GHSA-36hh-v3qg-5jq4 / GHSA-chgr-c6px-7xpp) во внешних сканированиях OSV и зависимостей. Обе записи относятся к уровню функций, и затронутые функции (BoundList/TupleIterator::nth/nth_back,PyCFunction::new_closure) Kshana никогда не вызывает, аpyo3— необязательная зависимость (функцияpython), так что реальная уязвимость была нулевой, но обновление сохраняет чистый результат сканирования для нижестоящих аудиторов.src/python.rsпереведён на API pyo3 0,29 (возвращаемый тип Bound дляscenario_kinds; явныйskip_from_py_objectдля pyclassRunOutput). Все 11 тестов привязок Python проходят на пересобранном расширении.
0.18.0 - 2026-06-17#
Добавлено#
Одиннадцать новых запускаемых видов сценариев — демонстраторы для двух тендеров, мост совместимости CCSDS и набор первого порядка для анализа миссии и среды (все MODELLED, аддитивные; существующие эталонные результаты воспроизводимости не изменились). Каждый можно запускать через CLI / Python / WASM / MCP, он поставляется с
scenarios/<kind>.tomlи несёт явную метку MODELLED в JSON результата и однострочной сводке (тест для каждого вида вtests/dominance_demonstrators.rsпроверяет, что метка присутствует и что вывод никогда не содержит строкуVALIDATED):impairment-eval(src/impairment_eval.rs) — стенд оценки машинного обучения для обнаружения РЧ-искажений: размеченный синтетический корпус, не зависящий от детектора стенд ROC/AUC и отчёт о разрыве оптимизма между данными из распределения и вне его (только рабочие характеристики — никогда не полевые данные или данные IQ).quantum-trade(src/quantum_trade.rs) — сравнение квантовой и классической PNT с загрузкой измеренного ADEV и огибающей устойчивости при отказе ГНСС.space-weather(src/space_weather.rs) — солнечные и геомагнитные индексы (таблица IAGA Kp↔ap, суточный Ap, центрированный 81-дневный F10.7a), экзосферная температура Jacchia-71 и связь термосферной плотности с активностью поверх статической атмосферы (НЕ модель абсолютной плотности NRLMSISE).oem-interop(src/oem.rs) — мост импорта и обратного преобразования CCSDS 502,0 OEM для эфемерид GMAT / Orekit / STK (читательparse_oem, точная инверсия записывающей части).launch-window(src/launch.rs) — азимут запуска в задаче двух тел (sin Az = cos i/cos lat), Δv смены плоскости, выигрыш от вращения площадки и геометрия суточных возможностей.reentry(src/reentry.rs) — баллистический коридор входа в атмосферу по Аллену — Эггерсу: пиковое замедление, скорости пикового g и пикового нагрева, высота пикового g.eo-coverage(src/eo_payload.rs) — геометрия полосы обзора / GSD / доступа / повторного прохода для наблюдения Земли (пространственный треугольник SMAD).space-packet(src/space_packet.rs) — кодирование и декодирование первичного заголовка космического пакета CCSDS 133.0-B с побитово точным обратным преобразованием.attitude-budget(src/attitude_budget.rs) — момент гравитационного градиента с 3 степенями свободы и бюджет ошибки наведения по RSS (скалярный бюджет до появления аппаратуры, не контур управления).passes(src/passes.rs) — предсказание проходов восхода/захода для наземной станции (AOS/TCA/LOS, максимальный угол места, доступ).link-budget(src/linkbudget.rs) — односторонний расчёт линии связи по CCSDS-401 / DSN-810-005 (C/N₀ = EIRP − FSPL − L_other + G/T − k, FSPL / Eb·N₀ / запас / замыкание).
17-state гибридный квантово-классический тесно связанный UKF — вынесен как запускаемый сценарий (MODELLED). Новый вид сценария
hybrid-ukf(src/fusion/hybrid_ukf.rs,scenarios/hybrid-ukf.toml), который превращает прежде доступный только через API 17-state тесно связанный сигма-точечный фильтр ГНСС/INS (src/fusion/tightly_coupled17.rs) в сценарий, который могут запускать привязки CLI/Python/WASM/MCP. 17-state вектор ошибки состоит из 15 состояний ошибки INS (положение, скорость, несоосность ориентации, смещения акселерометров и гироскопов), дополненных поправкой смещения акселерометра по данным CAI — холодноатомный интерферометр (src/inertial/quantum_imu.rs) задаёт нижний предел случайного блуждания скоростиq_va, так что долговременный дрейф при выбеге определяется квантовым датчиком, — и 2-state часами с фазой и частотой, шум процесса которых берётся из движка q-параметров часов (clock_state::q_from_allan, переводит профиль девиации Аллана часов в СПМq_wf/q_rw, приведённые к единицам дальности). Платформа до выбега поддерживается ГНСС (фильтр оценивает смещения, скорость и часы), затем идёт на выбеге через пропадание ГНСС только на IMU CAI и часах, так что прогон демонстрирует гибридизацию: классическая IMU на коротких интервалах + квантовая на длинных. Показатель качества — самосогласованность фильтра: усреднённая NEES (нормированная квадратичная ошибка оценивания, по оцениваемому подмножеству положения/скорости/часов) и NIS на белизну инноваций (нормированный квадрат инноваций) по ансамблю Монте-Карло, проверяемые по их 95%-м полосам χ² (Bar-Shalom §5,4). Согласованный фильтр попадает в полосы; умышленно рассогласованный фильтр (параметрыq_factor/r_factor) отмечается — это объективно проверяемый различающий критерий, а не формальная печать. Проверка NEES/белизны инноваций — это СТАТИСТИЧЕСКИЙ ОРАКУЛ: утверждение о самосогласованности (заявленная ковариация фильтра честно соответствует разбросу его собственных ошибок при смоделированном шуме), а НЕ гарантия точности в реальных условиях. Честная область применимости: всё здесь — модель / симуляция: входы CAI и часов — это ограниченные интервалом значения, типичные для литературы, а не измеренное оборудование; аппаратура CAI и её Key-Person остаются на стороне партнёра; ничто здесь не означает TRL > 3, лётного наследия или внешней валидации (JSON результата и однострочная сводка несут эти метки явно). Единственная траектория с постоянной скоростью на одном уровне делает состояния ориентации и смещений IMU наблюдаемыми лишь слабо, поэтому NEES оценивается по 8 оцениваемым состояниям; манёвренная траектория для полной наблюдаемости 17 состояний — в планах. Также добавленыUkf::update_stats(возвращает NIS для каждого обновления) и инструментарий согласованностиTightlyCoupled17::{update_gnss_nis, nees, nees_subset}. Все существующие сценарии не затронуты (аддитивно; эталонные результаты воспроизводимости не изменились).Последовательная (рекурсивная) навигация по рельефу — SITAN как работающий фильтр. Новый вид сценария
terrain-slam(src/altpnt/sequential.rs,scenarios/terrain-slam.toml), который прогоняет существующую модель измерений «высотомер против DEM» эпоха за эпохой через движок SIRparticle_filter, а не пакетным поиском от грубого к точному, которыйterrain-navиспользует для восстановления единственного постоянного смещения INS. В каждой путевой точке облако продвигается на приращение, сообщённое INS (само искажённое ростом дрейфа на каждом шаге), перевзвешивается по совпадению с рельефом и пересэмплируется при вырождении — так что изменяющийся во времени дрейф INS отслеживается вдоль трассы, чего подгонка постоянного смещения принципиально не может. На синтетической DEM рекурсивная оценка остаётся ограниченной и повторно сходится (итог ≈ 70 м), тогда как решение только по инерциальным данным неограниченно расходится до ≈ 5 км; ошибка в каждую эпоху следует за выразительностью рельефа (на плоских седловинах она идёт на выбеге по смещённой INS, а над выразительным рельефом захватывается заново), а монитор эффективного объёма выборки подтверждает здоровое облако. Честная область применимости: карта известна и неизменна — это рекурсивная локализация по сохранённой DEM (локализационная половина SLAM по рельефу), а не совместное оценивание карты; по построению свободно от циклической зависимости (внесённая линейно растущая составляющая дрейфа — независимая истина). Все существующие сценарии не затронуты (аддитивно; эталонные результаты воспроизводимости не изменились).Основа устойчивости при отказе ГНСС и срезы демонстратора FutureNAV (
src/holdover.rsи основы огибающей устойчивости вsrc/impairment_eval.rs,src/quantum_trade.rs,src/navsignal.rs,src/inertial/quantum_imu.rs, со срезами верификации FutureNAV вsrc/verification.rs). Объединяет строительные блоки альтернативной PNT — holdover часов, слежение за сигналом, инерциальный выбег, рельеф — в единый сюжет устойчивости при пропадании ГНСС. MODELLED; аддитивно.Kshana Interchange Format (KIF) — версионируемая самоописывающаяся оболочка артефакта (
src/interchange.rs). Обёртка с тегом схемы вокруг результатов сценария, чтобы сохранённый артефакт нёс с собой свой вид, версию схемы и метки MODELLED/VALIDATED, а более старые оболочки оставались читаемыми с прямой совместимостью. Аддитивно; существующий JSON результата не изменился.Модуляция / слежение за навигационным сигналом и дифференциальный корректор гало/NRHO в CR3BP (
src/navsignal.rs,src/cr3bp.rs). Модель модуляции и слежения за навигационным сигналом первого порядка и дифференциальный корректор в ограниченной круговой задаче трёх тел для гало-орбит и околопрямолинейных гало-орбит, выведенные на существующую ось возможностей дальнего космоса. MODELLED.Режим оценки сдвига распределения и параметр масштаба тяжести корпуса для
impairment-eval(src/impairment_eval.rs). Добавляет явное разделение на данные из распределения и вне его и настраиваемый масштаб тяжести корпуса в стенд разрыва оптимизма ROC/AUC (только рабочие характеристики — никогда не полевые данные или данные IQ).Отдача на затраты в пересчёте на покрытие и отображение пропусков обнаружения на влияние на целостность (
src/frugal.rs,src/integrity_impact.rs). Взгляд на экономную инженерию через окупаемость (затраты на единицу покрытия) и отображение частоты пропусков обнаружения на влияние на целостность. MODELLED; аддитивно.Лист параметров модели ошибок холодноатомного интерферометра (CAI) со ссылками на источники (
src/inertial/quantum_imu.rs). Лист параметров инерциальной модели CAI со ссылками на литературу и границами значений — входы взяты из источников, а не измерены на оборудовании (без заявлений о TRL и лётной эксплуатации); он питает нижний предел случайного блуждания скорости дляhybrid-ukf.Управление проектом.
GOVERNANCE.md, описывающий модель принятия решений и границу между открытым и закрытым; строка карты возможностей о сообществе и управлении переходит сnone → partial, отражая это.
Исправлено#
Уровень защиты целостности ARAIM — теперь применяются номинальное смещение (
b_nom) и σ_URA. Уровень защиты MHSS теперь вычитает одностороннюю проекцию номинального смещенияb_k = Σ_i |s_i|·b_nomдля каждого режима отказа и использует сигму целостности σ_URA (отличную от сигмы точности σ_URE), передаваемую в Integrity Support Message. Это делает уровень защиты более консервативным и соответствующим стандартам и потому меняет значения PL, сообщаемые существующими сценариями целостности. ISM/сценарий получает поля#[serde(default)]sigma_ura_m/b_nom_m, поэтому входные данные, в которых они не заданы, сохраняют прежнее поведение. См.docs/ARAIM_REFERENCE.mdо восстановленной формулеb_kи честное примечание по реализации.Согласованность χ² монитора спуфинга.
parity_raim_testтеперь использует общий путь обратной функции χ² изraim::chi2_quantile, что убирает вторую расходящуюся реализацию χ², так что RAIM и монитор спуфинга по паритету согласуются в своих порогах.gravity-map-navподключён к диспетчеру CLI. Раньше сценарий был доступен только через API; теперь он запускается какkind=, как и любой другой сценарий.Точность документации и счётчиков. Числа видов сценариев в README теперь привязаны к
api::list_scenario_kinds().len()тестомscenario_count_doc_sync, так что документированное число больше не может расходиться с диспетчером.
0.17.0 - 2026-06-14#
Добавлено#
- PNT в дальнем космосе и на Марсе — открытый движок радиометрической навигации и имитация наземного сегмента (GSE). Новая, полностью аддитивная ось возможностей поверх проверенного на Земле ядра (каждый существующий земной сценарий побайтово идентичен — эталоны воспроизводимости проходят без изменений и без пересоздания). Добавлено: ядро динамики для нескольких тел (
Body{mu, re, zonals, gravity, rotation, IAU-pole}с тессеральной гравитацией Марса GMM-3, связанной с телом системой Марса по IAU, подключаемым стыкомEphemerisProvider, юлианскими датами из двух частей с субмикросекундной точностью и TT↔TDB); радиометрические наблюдаемые (итеративная световая задержка и задержка Шапиро, двух-, одно- и трёхсторонний Доплер и дальность по двухплечевому решению Мойера, когерентный разворот транспондера, регенеративная/PN-дальнометрия по CCSDS 414, Δ-DOR по CCSDS 506, среды: солнечная плазма, тропосфера, ионосфера); разбор и выдача CCSDS-TDM (503); фильтр квадратного корня информации с редуцированной динамикой, эмпирическими ускорениями RTN, трёхкомпонентными бортовыми часами и моделью торможения Марса; совместный оценщик с односторонними и двусторонними данными; поверхность сценариевmars-pnt(ретрансляционная орбитальная группировка, а также LMO/перелёт/поверхность) в CLI, Python, WASM, MCP и песочнице; и сквозной имитатор характеристик GSE (геометрия → бюджет линии → наблюдаемые → SRIF → ковариация). Уровень валидации — подтверждено имитацией: синтетическое определение орбиты с замкнутым контуром (Mars-LMO ≈ 0,2 м) и аналитическая самосогласованность, причём центральная по Солнцу динамика Марса независимо сверена с JPL DE440 (xval/anise-mars-od, при наличии ядра: 137 м на дуге в 1 сутки — честный остаток немоделируемых n тел). Приводимые точности для дальнего космоса — это имитационные / ковариационные показатели качества, а не результаты реальных миссий; проверка по реальным данным слежения DSN/ESTRACK остаётся в дорожной карте. ANISE (MPL-2.0, издание 2024) ограничен крейтом перекрёстной проверки, исключённым из рабочего пространства, поэтому лицензионная проверкаcargo denyи задание MSRV-1.75 не затронуты. - Трассы на поверхности с точностью уровня агентств по реальной ориентации Земли IERS. Сценарий
ephemerisпринимает необязательное полеeop_finals2000a— встроенное тело реального файла IERSfinals2000A— и приводит трассу через UT1−UTC и движение полюса по каждой эпохе, интерполированные из него (тот жеEopSeries, что используетprecise_od), заменяя номинальные скалярыdut1_s/xp_arcsec/yp_arcsec. Данные передаются внутри сценария, так что запуск остаётся воспроизводимым и не требует файловой системы (он работает в песочнице WASM). Флагkshana --eop <finals2000A>вносит реальный файл в сценарий из CLI. Устраняет асимметрию, при которой реальные данные об ориентации Земли использовал толькоprecise_od.
Исправлено#
- Согласованность систем отсчёта для скорости изменения дальности. Наземная станция теперь переводится в инерциальную систему точным обратным преобразованием приведения спутника (
frames::itrf_to_teme, снимающим движение полюса и звёздное вращение), а не вращением GMST без учёта движения полюса, так что оба конца используют одну систему. Влияние на сообщаемый Доплер ниже порога валидации, но это устраняет реальное несоответствие систем и завышенное утверждение «точно» в исходном коде. carrier_hzпроверяется. Нулевая или нечисловая несущая частота теперь возвращает ошибку, а не молча даёт нулевой Доплер (она делала λ = c/несущая бесконечной), в соответствии с уже существующей защитойstep_s.
0.16.0 - 2026-06-11#
Добавлено#
- Проверка модели сил подгонкой эфемерид, перекрёстно проверенная по реальным продуктам агентств. Новый пакетный оценщик по методу наименьших квадратов (
src/precise_od.rs) с вариационной матрицей перехода состояния и редактированием выбросов, управляемый полной моделью сил (PreciseForceModel: геопотенциал EGM2008, третьи тела, твёрдые, океанские и атмосферные приливы, а также эмпирические ускорения CPR/2 на оборот), питаемый разборщиком реальной ориентации Земли IERSfinals2000A. Проверено по опубликованным эталонным орбитам: Galileo MEO до 13 см после подгонки, Swarm-A LEO ESA и LRO для Луны (селеноцентрическая, гравитация GRAIL, система тела IAU-2015 — редуцированная динамика 6,6 м, честно выше цели в 5 м на открытом пути; путь уровня DE через ANISE/DE440, который её достигает, — крейт, исключённый из рабочего пространства). - Сценарий
spoof-detect— интегрированный многоуровневый детектор спуфинга, объединяющий паритет RAIM по эпохам, мониторы AGC и качества сигнала (SQM) и объединённое решение, проверенный по опубликованным параметрам сценариев TEXBAT (Humphreys et al., ION GNSS 2012), включая трудный случай с выравниванием по несущей. - Сценарий
ephemeris— состояние, системы отсчёта, трасса на поверхности и Доплер. Распространяет один спутник (TLE→SGP4 или аналитическая орбита) и на каждом шаге выдаёт инерциальное состояние TEME и GCRS (положение и скорость), положение в земной системе ITRF/ECEF, трассу на поверхности подспутниковой точки по WGS-84 (широта / долгота / высота), а также топоцентрические азимут / угол места / дальность со скоростью изменения дальности и Доплером от наземной станции. Доступно из CLI, Python, WASM и сервера MCP и поставляется как предустановка «Ground track» в веб-песочнице, где трасса рисуется поверх реальной карты мира (береговые линии Natural Earth 1:110m, встроенные — без сети и внешних зависимостей). - Экспорт CCSDS OEM (
--export-oem/export_oem = true) — сообщение об эфемеридах орбиты со скоростью, которое используют GMAT / Orekit / STK, на уровне существующих экспортёров SP3 и OMM. - Твёрдые, океанские (FES2004) и атмосферные (Ray 2001 S2) земные приливы на геопотенциале (IERS Conventions, гл. 6), подключённые к модели сил.
- Колёса ARM64 — сборка PyPI теперь также выпускает колёса Linux aarch64 (manylinux_2_28), macOS arm64 и Windows arm64.
- Расширенный технический отчёт (препринт) со ссылкой из README, а статья для JOSS приведена к виду, пригодному для подачи (ORCID автора, компиляция в PDF в CI при каждом изменении).
Изменено#
- Системы отсчёта проверены с точностью до миллиметра по опубликованным векторам Vallado. Приведение TEME→PEF/ITRF, полная цепочка CIO IAU 2006/2000A GCRS→ITRS и преобразование ECEF→геодезические координаты WGS-84 теперь привязаны к разобранному примеру из Vallado et al. (AIAA 2006-6753) с его IERS EOP, а не только к внутренней самосогласованности.
- Независимые перекрёстные проверки шкал времени. ERA и шкалы UTC/TAI/TT согласуются с
hifitimeдо < 1 мкс, а планетные эфемериды DE440 согласуются с JPL Horizons (геоцентрические положения Луны и Солнца) — обе проверки служат постоянно включёнными контролями CI. - Веб-песочница скрывает вкладку показателей качества, когда результат не содержит строк показателей качества, поэтому пакеты только с графиком (эфемериды, RAIM, спуфинг) открываются на своём графике — для эфемерид это трасса на поверхности, — а не на пустой таблице.
- Ползунки пошагового режима и перебор параметров в песочнице теперь работают для сценария эфемерид / трассы на поверхности: его настройки (широта и долгота станции, шаг по времени, длительность, UT1−UTC) можно менять, а перебор может строить геометрию пролёта (максимальный угол места, пиковый Доплер, высота, скорость) в зависимости от любой из них — например, максимальный угол места от широты станции. Вкладка перебора теперь показывается, только когда сценарий действительно допускает перебор, так что ни один пакет не предлагает элемент управления, который ничего не строит.
- Задокументировано приближение SGP4
DUT1 ≈ 0в месте вызова GMST (ошибка поворота не более ~13″, что намного меньше собственной ошибки модели SGP4) и обновлёнCAPABILITY.md.
0.15.1 - 2026-06-09#
Добавлено#
- Плагин JetBrains Kshana — PNT simulator теперь опубликован и одобрен в JetBrains Marketplace. README,
kshana.devи документация по распространению ссылаются на него напрямую.
Исправлено#
- Публикация в реестр MCP теперь проходит:
server.jsondescriptionпревышало ограничение реестра в 100 символов (HTTP 422). Оно сокращено, а имя сервера (и метка владельца образа) приведены к каноническому пространству имёнio.github.ashfordeOU/kshana-mcp. - Публикация в JetBrains Marketplace теперь проходит: CI повторно загружал ту же версию плагина, которая была внесена вручную, а Marketplace такое отклоняет. Версия плагина повышена до
0.1.1, а защита идемпотентности теперь также трактует ответ «already contains version» как успешное отсутствие действия. - Сброс кэша для
kshana.dev: строки запросаstyle.css/app.jsс отметкой версии следуют за выпуском, так что возвращающиеся посетители всегда получают текущую сборку.
0.15.0 - 2026-06-08#
Добавлено#
kshana-mcp— Kshana как сервер Model Context Protocol (MCP) (mcp/kshana-mcp/). Отдельный крейт, исключённый из рабочего пространства (SDKrmcpиспользует издание 2024), который предоставляет проверенный движок ИИ-агентам и ассистентам — Cursor, JetBrains AI Assistant / Junie и любому клиенту MCP — по stdio. Инструменты:run_scenario,list_scenario_kinds,validate_scenario,export_sp3,export_omm, каждый — тонкая обёртка надkshana::api.- Плагин для IDE JetBrains (
ide/jetbrains/). Щёлкните правой кнопкой по.tomlсценария → Run Kshana Scenario; показатели качества и JSON результата выводятся потоком в окно инструментов Kshana. Плагин на Kotlin, использующий только платформу, совместим со всеми IDE JetBrains 2024,3+. - Публичное распространение и автоматическая публикация при каждом выпуске для обоих:
kshana-mcpв crates.io (cargo install kshana-mcp) черезpublish.yml.kshana-mcpкак мультиархитектурный образ OCI наghcr.io(docker run ghcr.io/ashfordeou/kshana-mcp) через новыйmcp-publish.yml.kshana-mcpв официальный реестр MCP через GitHub OIDC (без секретов); запись реестра (server.json) использует тип пакета OCI с владельцем, проверяемым по метке.- плагин для IDE в JetBrains Marketplace через
publishPlugin(с токеном, с необязательной подписью разработчика) при каждом теге выпуска.
0.14.1 - 2026-06-08#
Добавлено#
- Независимая перекрёстная проверка систем отсчёта ANISE/SPICE (
xval/anise-frames/). Отдельный крейт, исключённый из рабочего пространства, сверяет приведение IAU 2006/2000A CIO вkshana(kshana::cio::gcrs_to_itrs_matrix, GCRS→ITRS) с ANISE (реализация NAIF/SPICE на чистом Rust), вращающим GCRF→ITRF93 поearth_latest_high_prec.bpcот JPL, причём одни и те же параметры ориентации Земли IERSfinals2000Aподаются на обе стороны, на восьми ежеквартальных эпохах 2020–2023. Две независимые реализации системы отсчёта согласуются с максимальным относительным поворотом 0,028″ — ≤ 0,86 м на земле, ≤ 0,93 м на LEO, ≤ 3,6 м на орбите ГНСС, что выполняет давнюю проверку систем отсчёта из ROADMAP «< 10 м» с большим запасом (она дополняет, но не заменяет существующие побитовые опорные точки SOFA/ERFA). Крейт изолирован, потому чтоaniseиhifitimeимеют лицензию MPL-2.0 / издание 2024 и не должны попадать в граф зависимостей публикуемогоkshana, егоCargo.lock, лицензионную проверкуcargo denyили сборку MSRV; ANISE закреплён сdefault-features = false. Включает двоичный файлframe-xval(загружает BPC размером ~5 МБ, печатает таблицу, записываетreport.{json,md}), тестовый контроль, который сам пропускается при отсутствии ядра или сети, и необязательное задание CI только поworkflow_dispatch(никогда не блокируетmain). Описано вdocs/VALIDATION.md(строка CIO) иROADMAP.md.
Исправлено#
- Песочница, удобная на мобильных устройствах. Исправлено горизонтальное переполнение
.panelпесочницы на телефонах (элемент сетки CSS со значением по умолчаниюmin-width: autoоказывался шире окна примерно на 100 px) с помощьюmin-width: 0и элементов управления с ограничением ширины; проверено без дефектов на 360 / 390 / 414 / 768 px. Выровнены кнопки действий «Pin to compare» / «Download report» (равные поля в строке flex). Кнопки запуска, ползунки, списки выбора и ссылки навигации увеличены до минимального размера цели касания ~44 px по WCAG 2.5.5 / Apple HIG на телефонах и сенсорных устройствах, размеры на настольных устройствах не изменились.
0.14.0 - 2026-06-08#
Исправлено#
- Повышение надёжности по итогам состязательной проверки на прочность. (1)
sbas_protection_levelтеперь отвергает нечисловые угол места / азимут / дисперсию и отрицательные или нечисловые диагонали ковариации (почти вырожденная геометрия, масштабированная малым σ, ранее могла проскочить контроль абсолютного опорного элемента и вернуть NaN VPL / абсурдный HPL как допустимоеSome— тихий отказ целостности). (2) Численный пропагатор (propagate/propagate_dopri) завершается безопасным отказом на нечисловом начальном состоянии, а не вращает адаптивный регулятор бесконечно. (3) Вспомогательная функция ячейки DEM больше не вызывает панику на сетке из одного отсчёта (1×N). (4) Азимутlunar_look_angleстрого удерживается в[0, 360). (5)SphericalHarmonicField::from_gfcотвергает нефизичные (NaN / неположительные)GM/радиус.
Добавлено#
- Двоичный файл
validation_reportи артефакт выпуска: генератор без зависимостей, выдающий одностраничную, готовую к печати сводку проверок в HTML, где каждая проверка, обеспечиваемая CI (SGP4 666/666, EGM2008, побитовые системы отсчёта, NIST Allan, спецификации IMU, ARAIM/SBAS, воспроизводимость на 3 ОС, покрытие), сопоставлена своему тесту и внешнему оракулу. Рабочий процесс выпуска генерируетkshana-validation-summary.htmlи прикладывает его (с происхождением SLSA) к каждому выпуску с тегом. - pytest для взаимодействия с numpy и усиление колёс:
tests/python/test_numpy_interop.py(запускается в CI), а также закреплённый контейнер manylinux и шаг проверкиauditwheel showв сборке колёс. - Учебные материалы и образование:
docs/tutorials/(три разобранных учебных примера, аннотированные сценарии по областям, упражнения уровней 1/2/3), гдеtests/tutorials.rsпривязывает каждое приведённое число к живому выводу движка. - Артефакты для внешней подачи (
paper/,notebooks/,submissions/): черновик статьи для JOSS, ноутбук «квантовое против классического» и готовые комплекты для awesome-gnss / ESA Navipedia / NASA ASCL / ESA ESSR / ION/IAC, а такжеFUNDING.yml— подготовка внешних шагов подачи. - Навигация по рельефу и комбинированная альтернативная PNT (модуль
altpnt): навигатор по сопоставлению рельефа TERCOM/SITAN на основе DEM (загрузчик.hgtи генератор синтетических фикстур) и комбинированный навигатор для условий без GPS по гравитации, магнитному полю (IGRF) и рельефу, доступные как виды сценариевterrain-navиcombined-altpnt. Проверено сходимостью сопоставления рельефа (известное введённое смещение восстанавливается) и ограниченной ошибкой комбинированного фильтра на интервале без GPS. - Геометрия LunaNet LANS (
lunar): названные точки лунной поверхности (Apollo 11/15/16, кромка Shackleton) с авторитетными селенографическими координатами, углы наблюдения с поверхности (азимут / угол места / дальность), видимость и покрытие, а также DOP точки; проверено по радиусу Луны, опубликованным координатам точек и тождеству угла места 90° при радиальном положении над точкой. - Пошаговая браузерная песочница: ползунки пошагового режима, панель вывода с вкладками, вводная экскурсия при первом запуске, режимы перебора параметров и наложения нескольких прогонов, 3D-вид орбиты на canvas/SVG без зависимостей (пакет орбиты теперь выдаёт дополнительный
eci_track), режим встраивания / iframe и загрузка в виде отчёта HTML — каждое с модульными тестами node в CI. - Модель ошибок IMU, проверенная по спецификациям (
tests/imu_allan_spec.rs): ARW/VRW/нестабильность смещения для ADIS16465/16488/16460 восстанавливаются из синтезированной девиации Аллана и сверяются с техническими данными изготовителя (идентификация по NIST SP1065 / IEEE 952). - Проверка оценивателей Аллана по NIST SP1065 (
tests/allan_nist_sp1065_1000point.rs): четыре оценивателя воспроизводят опубликованные эталонные девиации по 1000 точкам и доверительные границы из таблицы 32. - Уровни защиты SBAS / DO-229E, безионосферная комбинация L1/L5 и карта соответствия DO-316 (модуль
sbas).sbas_protection_levelформирует взвешенную матрицу геометрии по углу места и азимуту каждого спутника и бюджету ошибок UDRE/GIVE/бортовых/тропосферы, обращает нормальную матрицу (общаяorbit::invert4) и проецирует дисперсии в HPL/VPL через K-факторы DO-229E (PA 6.0/5.33, NPA 6,18).iono_free_l1l5добавляет безионосферную псевдодальность GPS L1/L5 (IS-GPS-705,γ₁₅ = 1.79327), проверенную на то, что она сокращает независимую ионосферную задержку первого порядка в движке.do316_compliance_mapпрослеживает требования DO-316/DO-229E до реализующих функций. Проверено по замкнутым определениям K-факторов, по эталонной геометрииinv(GᵀG)в numpy и по тождеству ковариации двух маршрутов; перекрёстная проверка на соответствие опубликованным PL по RTKLIB/gLAB задокументирована как ожидающая рассмотрения вdocs/COMPLIANCE.md. - Полная тессеральная гравитация по сферическим гармоникам — поле EGM2008 до степени/порядка 70. Новый
gravity_sh::SphericalHarmonicFieldвычисляет геопотенциал и его ускорение в земной системе по полностью нормированным коэффициентамC̄_nm, S̄_nm, используя устойчивую нормированную рекуррентную формулу Лежандра Холмса–Фезерстоуна (денормирование при такой степени вызвало бы переполнение). Поставляемые коэффициенты — продукт NGA EGM2008 (общественное достояние, через ICGEM), встроенный вegm2008_data.rsи воспроизводимый бит в битtools/gen_egm2008.pyиз зафиксированногоtools/egm2008_to70.gfc; любая модель ICGEM.gfcзагружается черезfrom_gfc. Проверено тремя независимыми оракулами: сведением к точечной массе (толькоC̄00=−μr/|r|³), чисто зональным полем, воспроизводящим существующееforces::zonal_accelс точностью ~1e-9, и аналитическим ускорением, совпадающим с градиентом конечных разностей непосредственно просуммированного потенциала с точностью <1e-6. - Ускорение Лензе — Тирринга по общей теории относительности (увлечение систем отсчёта) (
forces::lense_thirring_accel, IERS 2010, ур. 10,12), гравитомагнитное слагаемое сверх существующей поправки Шварцшильда, подключённое к численному пропагатору новым флагомForceModel::lense_thirring(). Проверено: оно линейно по угловому моменту Земли и на 1–2 порядка меньше слагаемого Шварцшильда, что соответствует режиму измерений LAGEOS / Gravity Probe B. - Типаж
Propagator, объединяющий аналитические и численные пропагаторы орбит. Численный пропагатор Коуэлла с моделью сил теперь равноправен SGP4: новый типNumericalPropagator(начальное состояние +ForceModel+Tolerance+ выборIntegratorс удвоением шага или Дормана — Принса) иSgp4оба реализуютpropagator::Propagator, чей методstate_at(t_seconds) -> StateVectorвозвращает инерциальное состояние TEME в единицах СИ (м, м/с), так что они взаимозаменяемы заBox<dyn Propagator>. Реализация SGP4 — это точное преобразование км/мин→СИ собственного метода (проверено тестом на равенство); численная реализация проходит через типаж тот же субметровый контроль по точной кеплеровой орбите, два адаптивных драйвера согласуются, аPropagatorErrorвыводит наружу исходный код SGP4.
0.13.0 - 2026-06-08#
Этот выпуск закрывает самый крупный пробел в корректности движка: приведение ориентации Земли и систем отсчёта теперь выполнено на уровне эталонной реализации (проверено бит в бит по ERFA/SOFA), стек целостности получает двухгруппировочный ARAIM на реальных TLE GPS и Galileo, а слои распространения, квантовых датчиков, Луны и цислунного пространства и геомагнитного поля становятся глубже — вместе с типизированным API Python, более богатой браузерной песочницей и матрицей воспроизводимости на трёх ОС. Главное:
- Системы отсчёта, бит в бит. Полные нутации IAU 2000A и 2000B, прецессия IAU 2006, приведение GCRS↔ITRS по IAU 2006/2000A на основе CIO (X, Y, s), движение полюса IERS и выходные системы TEME→GCRS/ITRS — каждое проверено бит в бит по эталонным процедурам ERFA/SOFA.
- Двухгруппировочный ARAIM (GPS + Galileo) на реальных TLE с HPL/VPL, выводом диаграммы Стэнфорда и открытым
docs/ARAIM_REFERENCE.md. - Цислунный PNT: пропагатор CR3BP для системы Земля–Луна, системы MCI↔MCMF, селенографические координаты и запускаемый сценарий целостности LunaNet для Луны.
- Квантовые измерения: систематические эффекты Кориолиса и AC-Старка для интерферометра на холодных атомах, перебор по дрейфу и проверка по бюджету Freier (2016).
- Модель основного геомагнитного поля IGRF-14, автономная и проверенная.
- Типизированный API Python (PyO3
RunOutput/ScenarioMeta,.data(),scenario_kinds,validate_toml, заглушки типов) со сборкой колёс в CI, а также полноценный выход пропагатора в GCRS/ITRS и экспорт CCSDS OMM. - Достоверность и воспроизводимость: прямое сравнение точности SGP4 с независимым крейтом
sgp4, контроль покрытия в CI (~97 % строк вsrc/) и матрица воспроизводимости на трёх ОС (ubuntu/macos/windows).
Изменено#
- Каждый график песочницы теперь соответствует теме сайта. Все двенадцать генераторов SVG-графиков — график результата / holdover (
src/report.rs+src/chart.rs), график девиации Аллана (web/app.js) и каждый сценарный график (src/hybrid.rs,jamming.rs,timetransfer.rs,spoof.rs,raim.rsСтэнфорд + доступность,lunar.rs,ensemble.rs,sweep.rs,gnss_sim.rs,fusion/pack.rs,inertial/mod.rs) — использовали холодные тёмно-синие панели (#0e131b), холодно-серые оси и текст и диссонирующую красно-сине-фиолетовую палитру рядов. Теперь везде используется тёплая графитовая палитра: панели--bg, тёплая сетка--line, подписи--fg, с единым назначением рядов — квантовый = медово-золотой (--accent-bright), классический = тёплый янтарный (--partial), спецификация/предел =--crit. Представления с кодировкой безопасности сохраняют своё значение: диаграмма Стэнфорда RAIM остаётся зелёной (доступно) / янтарной (вводящее в заблуждение) / красной (опасное) / приглушённо-стальной (недоступно), а HPL/VPL читаются как золотой/бронзовый. - Графики теперь самоописывающиеся при сохранении и загрузке. Оба графика вшивают заголовок в SVG (заголовок графика Аллана и подзаголовок «чем ниже, тем лучше» раньше были лишь HTML вокруг изображения, поэтому у сохранённого изображения не было подписи), и оба несут нижний колонтитул происхождения —
Kshana v<version> · <scenario-hash> · kshana.dev— так что загруженный график самодостаточен и остаётся воспроизводимым. - Теперь каждый график несёт нижний колонтитул происхождения. Колонтитул —
Kshana v<version> · scenario <hash> · kshana.dev— проставляется централизованно для всех видов сценариев вapi::run_toml(раньше он был только на графиках holdover и Аллана), так что любое сохранённое или загруженное изображение — из песочницы, из экспорта.chart.svgв CLI или из HTML-карты результатов — указывает свою версию, отпечаток сценария и источник. Хеш подписанscenarioдля ясности и берётся изscenario_hashрезультата, где он есть, с запасным хешем источника для отчётов по целостности и Луне. Что такое отпечаток и зачем он нужен, описано в разделе README «Output» и вdocs/PROVENANCE.md.
Исправлено#
raim::chi2_quantileи генератор шума для диаграммы Стэнфорда RAIM теперь не вызывают паники при выходящих за диапазон / нечисловых входных данных (результат фаззинга, зависящий от порядкаread_dir, на новых сценариях ARAIM).chi2_quantileтеперь защищаетp/k, как иnormal_quantile(возвращая граничное значение, а не паникуя черезassert!), а шум диаграммы Стэнфорда для доступностиNormalограничивает σ строго положительным значением — так что стек целостности/ARAIM никогда не паникует на изменённых или неверно настроенных сценариях.
Добавлено#
- Матрица CI для кроссплатформенной воспроизводимости. Новое задание
reproducibility-matrixпри каждой отправке запускает тесты воспроизводимости на ubuntu-latest, macos-latest и windows-latest. Поскольку полный JSON результата не идентичен побайтово на разных ОС (расхождение libm в последнем ULP), задание точно проверяет платформенно-инвариантную проекцию — отпечаток входных данных плюс форму выходных, закреплённые для каждого сценария как эталоны SHA-256 вtests/golden/новымtests/cross_platform_golden.rs— наряду с числовыми закреплениями (golden.rs, с точностью 1e-6), состояниями SGP4 (sgp4_verification.rs, с точностью 2e-5 км) и детерминизмом в пределах процесса (determinism.rs). Вместе они доказывают кроссплатформенную воспроизводимость на трёх ОС без хрупкости точного побайтового хеширования полного вывода.docs/REPRODUCIBILITY.mdописывает это разделение. - Контроль покрытия кода в CI. Новое задание
coverageзапускаетcargo-tarpaulinс движком на основе исходного кода LLVM, публикует отчёт lcov как артефакт сборки и обеспечивает нижнюю границу покрытия строк дляsrc/(сгенерированные таблицы данных, точка входа CLI, тесты и веб-ресурсы исключены). Измеренное покрытие строк составляет ~97 % дляsrc/(SGP4 и модули часов ≥95 %); контроль установлен на 85 % — выше цели ≥80 % и с запасом относительно измеренного значения, так что он ловит регрессии без ложных срабатываний. В README опубликован значок покрытия. - Прямое сравнение SGP4/SDP4 с независимым крейтом
sgp4. Новый тест (tests/sgp4_crate_comparison.rs) перекрёстно проверяет пропагатор Kshana по самой распространённой библиотеке SGP4 на Rust (neuromorphicsystems/sgp4, добавлена как зависимость только для тестов) на тех же 666 векторах AIAA 2006-6753. Когда обе работают на модели гравитации WGS72, которую используют векторы, две независимые реализации согласуются до субмикрона на околоземных и резонансных орбитах и до 4,12 мм в худшем случае по всем режимам, обе воспроизводят эталонную таблицуtcppver.out. Зафиксированная таблица сравнения (tests/fixtures/sgp4_comparison.md, пересоздаётся черезKSHANA_REGEN_FIXTURES=1) раскладывает результат по режимам (LEO/MEO, дальний космос, резонансы ½ суток и 1 сутки) и отмечает четыре намеренно патологических случая, которые крейт отвергает при построении. Живые проверки удерживают обе реализации в пределах 2e-5 км от эталона и в согласии друг с другом в пределах 4e-5 км — это защита от регрессий, а не разовая проверка. Это конкурентная родословная: правильность относительно независимой кодовой базы, а не просто статической таблицы. (Значение по умолчаниюfrom_elementsв этом крейте использует WGS84 и потому отличается от эталона WGS72 примерно на километры — это честно указано в тексте таблицы.) - Экспорт CCSDS OMM теперь доступен от начала до конца. У записывающего модуля OMM (
src/omm.rs) раньше не было пути через CLI/API; средние элементы сценарияorbitтеперь можно опубликовать как каталог CCSDS 502.0-B-2 OMM — одно сообщение OMM KVN на каждый заданный через TLE спутник — черезkshana <orbit.toml> --export-omm out.omm, либоexport_omm = trueв сценарии автоматически записывает<scenario>.omm(по аналогии с существующим--export-sp3). Каждое сообщение несёт реальные номер каталога NORAD спутника, международное обозначение COSPAR (YYYY-NNNP) и эпоху (в форме CCSDS «день года»), разобранные из строки 1 TLE новой функциейtle::parse_tle_identity; строка с именем становитсяOBJECT_NAME(иначеOBJECT <id>).CREATION_DATE— эпоха сценария, а не системные часы, так что вывод воспроизводим. Новый API:api::export_omm/api::auto_export_omm,OmmFile::from_tle_block,OrbitClockScenario::to_omm_string. Синтетический сценарий Уокера или RINEX (без средних элементов TLE) завершается ошибкой, а не выдаёт пустой файл. Проверено по встроенному снимку из 30 спутниковgps-ops(tests/sp3_export_roundtrip.rs). - Интерактивные подсказки при наведении на графики песочницы. При перемещении курсора над графиком перекрестие привязывается к ближайшему отсчёту и показывается подсказка со значением (
web/hover.mjs, подключено вweb/app.js). На графике Аллана она показывает τ и σ_y(τ) каждых часов; на временны́х графиках сценариев (holdover часов, счисление пути, передача времени, гибридный PNT, GNSS/INS) — время и значение каждого набора в собственных единицах графика (нс / м / пс / использование), разобранное из результата, так что показания совпадают с кривой. Специализированные диаграммы (RAIM, спуфинг, перебор) наложения не получают. Графики остаются самоописывающимися blob<img>— наложение представляет собой прозрачное перекрестие и подсказку поверх них, так что загрузка, сравнение и экспорт не затрагиваются. Координатная математика (ближайший отсчёт, курсор→доля области построения, разбор ломаной) покрыта модульными тестами (web/hover.test.mjs, запускаются в CI). - Режим сравнения A/B в песочнице. Закрепите любой прогон как базовый A, запустите второй сценарий — и они показываются рядом с таблицей разностей показателей качества (holdover, RMS/p95 синхронизации времени, доступность), которая выделяет цветом победителя по каждой метрике (
web/compare.mjs, подключено вweb/app.js; логика разностей покрыта модульными тестами вweb/compare.test.mjs, запускаются в CI). Все значения вставляются как текст, а все графики — через blob<img>, так что ничто из строки сценария никогда не вставляется как разметка. - Кнопки загрузки графиков (SVG + PNG). У каждого графика песочницы теперь есть панель «Download SVG / PNG» в стиле темы (
web/chartdl.mjs, подключено вweb/app.js). SVG возвращает точный масштабируемый оригинал; PNG растрирует то же самоописывающееся изображение в 2x для слайдов и документов. Файлы называются с указанием происхождения —kshana-<chart>-v<version>-<scenario-hash>.<ext>— а логика имени и размера покрыта модульными тестами (web/chartdl.test.mjs, запускаются в CI). - Модель основного геомагнитного поля IGRF-14 (
src/igrf.rs). Стандартное сферическое гармоническое поле IAGA (степень/порядок 13, эпоха 2025,0 + вековая вариация 2025–2030; коэффициенты машинным образом сгенерированы из официальногоigrf14coeffs.txtс помощьюtools/gen_igrf.pyвsrc/igrf_data.rs, воспроизводимы бит в бит). Синтез с нормировкой Шмидта возвращает вектор поля (север/восток/вниз) и производные элементы (склонение, наклонение, горизонтальная/полная интенсивность) в любой геодезической точке на любую дату, а также геомагнитный полюс и силу диполя — магнитный аналог средства сопоставления карт гравитации для альтернативной навигации PNT. Проверено автономно: синтез совпадает с точным замкнутым выражением наклонённого диполя, полное аналитическое поле степени 13 совпадает с конечной разностью скалярного потенциала, ось диполя воспроизводит известный геомагнитный полюс (~80,7° с. ш., −72,7° в. д.) и силу ~29,7 мкТл, а глобальное поле физически осмысленно. - Типизированные привязки Python (
src/python.rs). Помимоrun/run_fullсо входом и выходом в виде строк, модуль теперь предоставляет типизированный классRunOutput(.json,.svg,.summaryи метод доступа.data(), возвращающий результат, разобранный в собственный словарь Python, — без повторного разбора JSON, пригоден для обёртывания в NumPy), а такжеrun_typed,scenario_kinds()(разобранный список словарей метаданных) иvalidate_toml()(список сообщений об ошибках без возбуждения исключений). Поставляется заглушка типов PEP 561 (kshana.pyi+py.typed) для mypy/pyright/редакторов и краткое руководствоdocs/PYTHON_API.md. Существующие функции не изменены. - Полноценные выходные системы отсчёта для пропагаторов (перечисление
src/orbit.rsFrame+position_in_frame+state_gcrs). ЛюбойPropagator(Kepler, SGP4, RINEX, GLONASS, SP3) теперь может выдавать своё положение в TEME, GCRS (≈ J2000) или ITRS (связанной с Землёй) — TEME штатно, GCRS через проверенное приведение TEME→GCRS, ITRS цепочкой этого же приведения с поворотом IAU 2006/2000A CIOgcrs_to_itrs— а полное состояние в GCRS (положение + скорость) черезstate_gcrs. Выход в инерциальной системе на дату больше не ограничен TEME. - Приведение небесной системы к земной по IAU 2006/2000A на основе CIO (
src/cio.rs). Современная цепочка GCRS↔CIRS↔ITRS без равноденствия: координаты CIPX, Y, считываемые из матрицы смещения-прецессии-нутации IAU 2006/2000A (с повторным использованием проверенной прецессии FW и нутации 2000A с поправкой P03 поeraNut06a), 66-членный ряд локатора CIOs(eraS06, машинным образом сгенерирован из эталона ERFA с помощьюtools/gen_s06.pyвsrc/cio_s06_data.rs, воспроизводим бит в бит), матрица GCRS→CIRS (eraC2ixys), угол вращения Земли (eraEra00) и полный поворот GCRS→ITRS (eraC2tcio, составленный с существующим движением полюса IERS). Проверено бит в бит по опубликованным тестовым векторамeraXys06a(X=0.5791308482835292617e-3, Y=0.4020580099454020310e-4, s=-0.1220032294164579896e-7 при JD_TT 2453736,5),eraC2ixysиeraEra00. Показано, что цепочка CIO и унаследованное приведение TEME по равноденствию/GMST-1982 согласуются с точностью до документированного различия соглашений о звёздном времени ≈2·(уравнение равноденствий). Это строгое приведение, которое путь по равноденствию/GMST лишь приближал. - Полный ряд нутации IAU 2000A (
src/nutation.rsnutation_iau2000a,nutation_matrix_2000a). Полная модель MHB2000 — 678 лунно-солнечных + 687 планетных членов — с точностью < 0,1 мсд, рядом с существующим усечением 2000B из 77 членов. Таблицы сгенерированы машинным образом из эталона IAU SOFA / ERFAnut00aс помощьюtools/gen_nut00a.pyвsrc/nutation_iau2000a_data.rs(генератор воспроизводит зафиксированный файл бит в бит), а весь ряд — оба набора фундаментальных аргументов IERS-2003 и MHB2000 и планетные долготы — проверен бит в бит по опубликованному тестовому векторуeraNut00a(Δψ = −0.9630909107115518e-5, Δε = 0.4063239174001679e-4 при JD_TT 2453736,5, с точностью 1e-13 рад). Приведение TEME→GCRS по умолчанию сохраняет ряд 2000B (~1 мсд, ниже упрощения вращения системы скоростей в цепочке);nutation_matrix_2000aпредоставляет матрицу на дату с точностью < 0,1 мсд для вызывающих, которым она нужна. - Запускаемый сценарий целостности на Луне (
kind = "lunar-integrity",scenarios/lunanet-araim.toml). Подключает проход с уровнем защиты у южного полюса Луны (src/lunar.rsLunarScenario→south_pole_hpl_pass) к исполнителю сценариев с JSON-отчётомLunarReportи SVG-графиком HPL от времени, так что случай целостности в цислунном пространстве доступен прямо из CLI. Он честно показывает разрыв: при σ_URE LANS 30 м HPL у южного полюса (≈ 260–450 м) превышает предел оповещения 50 м (0 % доступности) — целостность лунного PNT пока не обеспечена. - Доступность двухгруппировочного ARAIM на реальных TLE GPS и Galileo и подключение к исполнителю сценариев (
src/raim.rs,src/orbit.rs,scenarios/araim-gps-galileo.toml). Добавляетaraim_dual_constellation_availability(продвинутый движок ARAIM — отказы одного спутника и всей орбитальной группировки — на временно́й сетке) иvisible_positions_labeledи подключает его к исполнителюIntegrityScenarioфлагомaraim_dual, так что исследование ARAIM для нескольких ГНСС доступно прямо из TOML. Тест на реальных данных (tests/araim_dual_real_data.rs) на встроенных снимках GPS и Galileo из Celestrak от 2026-06-07 показывает, что добавление Galileo повышает доступность ARAIM с 0,21 до 0,67 при жёстком VAL 12 м (10,5→21,8 спутника в зоне видимости), тогда как режим, устойчивый к отказу орбитальной группировки, принципиально ограничен при наличии лишь двух орбитальных группировок — это количественная причина того, почему устойчивая целостность с двумя группировками требует третьей группировки или SBAS. Честный остаток: численно точное воспроизведение таблицы A-3 из EU ARAIM TN на одной зафиксированной по версии эпохе и запись фикстуры в Zenodo. - Ограниченная круговая задача трёх тел (CR3BP) для системы Земля–Луна (
src/cr3bp.rs). Новое ядро цислунной динамики, которого не могут дать двухтельные пропагаторы и SGP4: уравнения движения во вращающейся системе (cr3bp_accel), пропагатор RK4 (propagate_cr3bp), интеграл постоянной Якоби (jacobi_constant) и пять точек Лагранжа (lagrange_points). Проверено по замкнутым / опубликованным опорным значениям: коллинеарные точки Земля–Луна (L1 ≈ 0,83692, L2 ≈ 1,15568, L3 ≈ −1,00506), точные равносторонние L4/L5 = (½−μ, ±√3/2, 0), все пять подтверждены как равновесия поля, постоянная Якоби сохраняется с точностью интегратора при распространении, и возвращающая сила вне плоскости, делающая возможными орбиты типа гало/NRHO. Это основа для представления реальной NRHO. Честный остаток: периодические начальные условия NRHO 9:2 с дифференциальной коррекцией, эксцентрическая/эфемеридная модель (DE) и денормированное преобразование в селеноцентрические системы изsrc/lunar.rs. - Движение полюса IERS и приведение TEME→ITRF (
src/frames.rs). Добавляетpolar_motion_matrix(SOFAiauPom00:W = Rx(−y_p)·Ry(−x_p)·Rz(s′)с локатором TIOs′),pef_to_itrf/itrf_to_pefиteme_to_itrf— поворот TEME→PEF по GMST с последующим движением полюса — завершая положение в земной системе с точностью ITRF поверхteme_to_ecefтолько по GMST (движение полюса на радиусе орбиты — эффект в десятки метров).x_p/y_p— наблюдаемые величины IERS, которые задаёт вызывающий. Честный остаток: полностью основанная на CIO цепочка (X, Y, s) и численная перекрёстная проверка ANISE/SPICE с порогом <10 м остаются на будущее. - Систематические эффекты интерферометра на холодных атомах, перебор по дрейфу и проверка по опубликованному прибору (
src/inertial/quantum_imu.rs,docs/QUANTUM.md). Расширяет акселерометр CAI из первых принципов двумя ведущими детерминированными систематическими эффектами: фазой Кориолиса / вращенияΦ_cor = 2·k_eff·v_⊥·Ω·T²(coriolis_phase, с эквивалентным смещением ускорения2·Ω×vчерезcoriolis_accel_bias) и фазой светового сдвига AC-СтаркаΦ_LS = (δ_LS,1 − δ_LS,3)/Ω_eff(ac_stark_phase, которая при постоянном сдвиге сокращается благодаря симметрии π/2–π–π/2). Добавляетcai_drift_sweep(дрейф положения при счислении в зависимости от времени цикла — ядро сравнения квантового и классического) и проверочный тест по мобильному гравиметру Freier et al. 2016 (arXiv:1512,05660): смоделированный нижний предел квантового проекционного шума лежит ниже опубликованного кратковременного шума 96 нм/с²/√Гц и в пределах ~2 порядков от него.docs/QUANTUM.mdобновлён. Честный остаток: систематические эффекты волнового фронта и наведения пучка, разрешение неоднозначности полос, точное воспроизведение лётных испытаний CARIOQA-PMP / Boeing-AOSense (требуются опубликованные PSD платформ) и предустановка для песочницы на JS. - Приведение цислунных систем отсчёта и проход целостности у южного полюса Луны (
src/lunar.rs). Расширяет лунный движок ARAIM поворотом MCI↔MCMF (селеноцентрическая инерциальная ↔ связанная с Луной) (mci_to_mcmf/mcmf_to_mci, упрощённая модель среднего вращения со звёздной скоростью Луны), селенографическими широтой/долготой/высотой (mcmf_to_selenographic/selenographic_to_mcmf) иsouth_pole_hpl_pass— севший приёмник в районе Artemis относительно репрезентативного набора ретрансляторов LunaNet на проходе в 24 ч, который честно количественно оценивает разрыв целостности: при номинальном σ_URE LANS 30 м уровень защиты конечен, но превышает предел оповещения 50 м для работ на поверхности. Честный остаток: точная эфемерида NRHO для LANS (цислунная орбита в задаче 3 тел), физическая либрация / прецессирующий лунный полюс (DE421/SPICE) и сценарий LunaNet в TOML остаются на будущее. - Сообщение поддержки целостности ARAIM, SVG диаграммы Стэнфорда и открытый эталон ARAIM (
src/raim.rs,docs/ARAIM_REFERENCE.md). Добавляет явноеIntegritySupportMessage(σ_URA / σ_URE / b_nom / P_sat / P_const, с эталонными значениями WG-C для GPS+Galileo и преобразователями.fault_priors()/.dual_fault_priors()в движкиaraim_raimодиночного отказа иaraim_dual_raimотказа всей орбитальной группировки), автономный построительstanford_svgдиаграммы целостности Стэнфорда (четыре зоны, границаPL = error, направляющие предела оповещения, по одному цветовому маркеру на эпоху) иdocs/ARAIM_REFERENCE.md, описывающий алгоритм, ISM, гипотезы отказов, контракт уровня защиты и выгоду от двух орбитальных группировок. Тесты демонстрируют выигрыш по геометрии/избыточности (добавление второй орбитальной группировки уменьшает HPL при одиночном отказе) и устойчивость к отказу орбитальной группировки (пользователь с двумя группировками переживает потерю целой группировки; пользователь с одной — нет). Честный остаток: численное воспроизведение таблицы A-3 из EU ARAIM TN / показателя доступности 15–25 % на зафиксированном по версии реальном снимке TLE, запись фикстуры в Zenodo и подключениеaraim_dual_raimк исполнителю файлов сценариев. - Нутация IAU 2000B и полное инерциальное приведение TEME→GCRS/J2000 (
src/nutation.rs). Добавляет второй и третий элементы настоящего приведения инерциальной системы поверх поставляемой прецессии IAU 2006: 77-членный лунно-солнечный ряд нутации MHB2000 (nutation_iau2000b, стандартное усечение IAU 2000B с точностью ~1 мсд) с фундаментальными аргументами Делоне и матрицей нутации SOFAiauNumat, а также цепочку Vallado AIAA-2006-6980 TEME→TOD (уравнение равноденствий) → TOD→MOD (нутация) → MOD→GCRS (смещение-прецессия), доступную какteme_to_gcrs(r, v, jd_tt)/gcrs_to_teme. Ряд, аргументы и единицы констант переписаны из эталона IAU SOFA / ERFAnut00bи проверены бит в бит по опубликованному тестовому векторуeraNut00b(Δψ, Δε с точностью 1e-13 рад). Честный остаток: полный 678-членный ряд IAU 2000A (<0,1 мсд), численная перекрёстная проверка ANISE/SPICE с порогом <10 м и движение полюса остаются на будущее (см.ROADMAP.md).
0.12.0 - 2026-06-06#
Этот выпуск вводит первый в Kshana неаналитический пропагатор орбит — интегратор Коуэлла с иерархической моделью сил из шести возмущений (двух тел + зональные J2–J6 + третье тело Солнца/Луны, управляемое эпохой, + давление солнечного излучения с коническими тенью и полутенью + атмосферное торможение + постньютоновская релятивистская поправка Шварцшильда), управляемый выбором из двух адаптивных интеграторов (RK4 с удвоением шага и вложенная пара Дормана — Принса RK5(4)), — рядом со слоем манёвров / проектирования траектории (импульсные и конечные импульсы, решатель Ламберта по Изцо и перебор porkchop), слоем альтернативного PNT по сопоставлению карт гравитации, который восстанавливает 60-минутную траекторию без GPS с точностью лучше 500 м, конвейером определения орбиты пакетным и последовательным и полным 17-компонентным жёстко связанным UKF GNSS/INS с квантовым счислением по CAI. Каждая численная возможность закреплена по аналитической истине или по выведенному вручную замкнутому выражению; возмущения, отключённые по умолчанию, не затрагивают выпущенные эталоны.
Добавлено#
- Постньютоновская релятивистская поправка (Шварцшильда) (
forces::relativistic_accel+propagator::ForceModel::relativity). Добавляет доминирующее возмущение по общей теории относительности на околоземной орбите — главный фактор релятивистского смещения перигея — в форме IERS / Montenbruck–Gillβ = γ = 1a = (μ/c²r³)·{[4μ/r − v²]·r + 4(r·v)·v}. Как и атмосферное торможение, она зависит от скорости, поэтому входит в правую часть интегратора(r, v)через [accel_rv], включается по желанию и по умолчанию выключена. Проверено автономно: на круговой орбите она сводится к замкнутому выражению3μ²/(c²r³)·r̂(чисто радиальное и направленное наружу, внеосевые компоненты строго равны нулю); её отношение к двухтельному ускорению на LEO — хрестоматийное≈1.9·10⁻⁹(признакμ/(c²r)); случай с радиальной скоростью совпадает с упрощённым вручнуюμ(4μ + 3v²r)/(c²r³); а в пропагаторе она возмущает орбиту, не рассеивая её — большая полуось сохраняется с точностью заметно лучше метра в сутки, что структурно противоположно монотонному затуханию при торможении. Поскольку она по умолчанию выключена, эталоны для двух тел / J2 / зональных гармоник не затронуты. Настройка параметров PPN (β,γ) и слагаемое увлечения систем отсчёта Лензе — Тирринга остаются на будущее. - Модель конической тени и полутени (
forces::conical_shadow), теперь используемая давлением солнечного излучения. Заменяет бинарное затмение в цилиндре полной тени гладким коэффициентомν ∈ [0,1]: Солнце и Земля моделируются как диски с видимыми угловыми радиусамиa = asin(R☉/d☉),b = asin(Rₑ/|r|)и видимым расстоянием между центрамиc, аν— единица минус доля диска Солнца, закрытая диском Земли (площадь линзы пересечения двух кругов): полный свет приc ≥ a+b, полная тень приc ≤ b−a, кольцеобразное затмение приc ≤ a−bи непрерывная полутень между ними.srp_accelтеперь использует её, так что сила солнечного давления плавно спадает при затмении, а не включается и выключается. Добавляет номинальное значение IAUforces::SOLAR_RADIUS. Проверено автономно:ν = 1при полном свете иν = 0глубоко в тени (точно), гладкая монотонная полутень (νрастёт от 0 до ~½ приc = bи до 1 по всей полосе[b−a, b+a]), а коническая полутень выходит за пределы цилиндра полной тени (точка, которую бинарный цилиндр считает полностью освещённой, для конуса имеет0 < ν < 1). Более простаяcylindrical_shadowостаётся доступной; потемнение солнечного края и тень сплюснутой Земли остаются на будущее. - Вложенный интегратор Дормана — Принса RK5(4) (
integrator::dopri54_step/integrator::integrate_dopri+propagator::propagate_dopri). Добавляет стандартную вложенную пару Дормана — Принса (1980) на таблице Бутчера рядом с существующим драйвером RK4 с удвоением шага: семь стадий FSAL дают решение 5-го порядка и оценку ошибки 4-го порядка из одного набора вычислений (7 против 11 вызовов функции на шаг) — более дешёвую оценку локальной ошибки. Адаптивный драйвер использует ту же норму СКО ошибки и регулятор шага0.9·(1/err)^(1/5), так что это взаимозаменяемая альтернатива;propagator::propagate_dopriделает его доступным в модели сил орбиты. Проверено автономно: вложенная оценка ошибки — O(h⁵) (уменьшение шага вдвое снижает её в ~32 раза); DP5(4) интегрируетy' = yдоeи гармонический осциллятор на 50 периодах с сохранением энергии лучше <1e-6; он достигает той же конечной точки при том же допуске за меньшее число вычислений функции, чем удвоение шага (без потери точности); аpropagate_dopriпроходит тот же контроль по аналитической истине, что и путь RK4, — субметровое согласие с точным решением Кеплера в универсальных переменных на орбите LEO за 24 ч — при этом два драйвера согласуются в пределах <1 м на орбите J2..J6 (замкнутого выражения нет). Более высокие вложенные пары (RKF7(8) / DOP853) остаются на будущее. - Атмосферное торможение, подключённое к пропагатору как его первая сила, зависящая от скорости (
forces::atmospheric_density+forces::drag_accel+propagator::ForceModel::drag). Добавляет кусочно-экспоненциальную атмосферу по таблице 8-4 Valladoρ = ρ0·exp(−(h−h0)/H)(28 слоёв от уровня моря за пределы 1000 км, с ограничением ниже поверхности) и квадратичное торможениеa = −½ · ρ(h) · (C_D·A/m) · |v_rel| · v_relотносительно вращающейся вместе с Землёй атмосферыv_rel = v − ωₑ ẑ × r(forces::EARTH_ROTATION_RATE = 7.2921151467e-5). Поскольку торможение зависит от скорости,ForceModelполучает новыйaccel_rv(t, r, v), а правая часть интегратора теперь передаёт скорость (f(t,[r;v]) = [v; a(t,r,v)]); зависящий только от положенияaccel_atне изменён, так что консервативные слагаемые и эталоны не затронуты. Проверено автономно: плотность привязана к значению 1,225 кг/м³ на уровне моря, ограничена ниже поверхности, монотонно убывает в пределах LEO, лежит в полосе ~1e-12 кг/м³ для среднего Солнца на 400 км, а её восстановленная местная шкальная высота (≈ 58 км на 400 км) физически осмысленна; торможение направлено против относительной скорости во вращающейся атмосфере по величине ~2e-6 м/с², характерной для LEO, приC_D·A/m = 0.02 m²/kg; и — главный признак — торможение диссипативно: орбита на 300 км монотонно теряет удельную энергию, а её большая полуось убывает ограниченно, ~км/сутки, тогда как базовый вариант в вакууме сохраняет энергию с точностью лучше <1e-9. Плотность термосферы NRLMSISE-00 (положение о плотности для торможения < 5 %) остаётся на будущее. - Давление солнечного излучения, подключённое к модели сил пропагатора по эпохе (
forces::srp_accel+propagator::ForceModel::solar_radiation). Добавляет модель SRP «пушечного ядра»a = ν · P☉ · cᵣ · (A/m) · (AU/d)² · d̂с коэффициентом затмения в цилиндрической тени (forces::cylindrical_shadow, ν ∈ {0 1}): давление излученияP☉ = Φ☉/cпо современному значению полной солнечной освещённости 1361 Вт/м² (≈ 4,5398·10⁻⁶ Н/м²), спад потока по закону обратных квадратов(AU/d)²и радиальный толчок от Солнца. Оно входит в ту же правую часть, управляемую эпохой, что и третье тело, однократно опрашивая Солнцеephemна продвинутой эпохеepoch_jd_tt + t/86400, общей для третьего тела Солнца и SRP. Составляется:with_zonals_j2_j6().third_body(true, true, epoch).solar_radiation(1.5, 0.02). Проверено автономно по выведенным вручную признакам: давление излучения на 1 а. е. совпадает с хрестоматийным ≈ 4,5398·10⁻⁶ Н/м²; SRP полностью освещённого спутника LEO бит в бит совпадает с формулой «пушечного ядра», направлено от Солнца и лежит в полосе ~1,36·10⁻⁷ м/с² при cᵣ = 1,5, A/m = 0,02 м²/кг; удвоение расстояния до Солнца уменьшает величину вчетверо (обратные квадраты); цилиндрическая тень затмевает только цилиндр полной тени (в антисолнечной стороне и в пределах одного радиуса Земли от линии Земля–Солнце) и даёт ровно нулевое SRP в затмении; а в пропагаторе SRP возмущает орбиту LEO на малую ограниченную величину, приблизительно линейно зависящую от A/m, — тогда как модель без возмущений остаётся бит в бит независимой от времени, не затрагивая эталоны для двух тел / J2 / зональных гармоник. Коническая тень и полутень (гладкое ν ∈ [0 1]), атмосферное торможение и внешняя перекрёстная проверка GMAT/Orekit остаются на будущее. - Третье тело Солнца/Луны по эпохе в изменяющейся во времени правой части пропагатора (
propagator::ForceModel::third_body/accel_at). Возмущение третьего тела больше не является отдельным слагаемым силы — теперь пропагатор Коуэлла интегрирует его как по-настоящему изменяющуюся во времени силу: каждое вычисление правой части опрашивает положения Солнца/Луныephemна продвинутой эпохеepoch_jd_tt + t/86400(используяprecession::julian_centuries_ttдля перевода сутки↔столетия), так что возмущающие тела движутся по своим орбитам во время интегрирования, а не заморожены на начало. Составляется с любой моделью гравитации (ForceModel::with_zonals_j2_j6().third_body(true, true, epoch)). Проверено автономно: слагаемое Солнца в правой части бит в бит совпадает сthird_body_accel, вычисленным в положении эфемериды на этот момент приt = 0иt = 1 day(что точно доказывает привязку 86400 с ↔ 1 сутки ↔ 1/36525 столетия), возмущающее тело продвигается на ~2,6·10⁹ м/сутки между отсчётами (не заморожено), мгновенные приливные величины на LEO попадают в хрестоматийные полосы ~5·10⁻⁷ м/с² (Солнце) и ~1,1·10⁻⁶ м/с² (Луна, ≈ 2× от Солнца), каждое тело заметно возмущает суточную траекторию, оставаясь ограниченным, а то же начальное состояние, распространённое на эпохах с разницей в четверть года, даёт другую траекторию (приливная ось поворачивается на 90°) — тогда как модель без обоих тел бит в бит не зависит от времени, не затрагивая эталоны для двух тел / J2 / зональных гармоник. Точность эфемерид уровня DE и внешняя перекрёстная проверка GMAT/Orekit остаются на будущее. - Эфемериды Луны низкой точности (
ephem::moon_position), дополняющие пару возмущающих тел Солнце/Луна. Добавлен низкоточный лунный аналитический ряд Монтенбрюка и Гилла (§3.3.2) наряду с моделью Солнца, так что не зависящую от тела функциюforces::third_body_accelтеперь можно запускать с любым из двух светил, без внешнего ядра DE/SPK. Самодостаточная валидация по выведенным вручную лунным признакам: геоцентрическое расстояние в течение месяца остаётся в пределах реального диапазона от перигея до апогея (~356 500–406 700 км), а его среднемесячное значение восстанавливает большую полуось ~384 400 км; эклиптическая широта никогда не превышает наклонения лунной орбиты ~5,3° (проверено проецированием на полюс эклиптики в экваториальных координатах, что одновременно проверяет ряд широты и поворот на наклон эклиптики); направление на Луну возвращается с точностью до 1° после одного сидерического месяца (27,3217 сут), а суточное смещение остаётся в физическом диапазоне 12–15°/сут; возмущение от Луны как третьего тела для спутника на низкой околоземной орбите (LEO) имеет учебниковую величину ~1,1·10⁻⁶ м/с² (≈ вдвое больше, чем от Солнца). Позиционная точность уровня DE, атмосферное сопротивление и давление солнечного излучения (SRP) остаются задачами следующих этапов. - Гравитация третьего тела (Солнца) со встроенными эфемеридами низкой точности (
forces::third_body_accel,ephem::sun_position). В модель сил добавлено возмущение от третьего тела:a = GM₃·((s−r)/|s−r|³ − s/|s|³)(прямое притяжение минус косвенный член, который в геоцентрической системе необходимо вычесть), причём положение Солнца задаёт новый модульephemс низкоточным аналитическим рядом Монтенбрюка и Гилла — внешнее ядро DE/SPK для низкоточного прогона не требуется. Самодостаточная валидация: ускорение совпадает с точным градиентом собственного возмущающего потенциала (third_body_potential), возмущение обращается в нуль в геоцентре и имеет учебниковую величину ~5·10⁻⁷ м/с² для спутника на LEO, а эфемериды Солнца попадают в выведенные вручную опорные значения J2000: перигелийное расстояние ≈ 1,471·10¹¹ м, склонение ≈ −23° около декабрьского солнцестояния, видимое движение ≈ 1°/сут (≈ 90° за четверть года) и расстояние, остающееся в пределах диапазона 0,983–1,017 а. е. орбиты Земли в течение полного года. Это вносит вклад третьего тела в шаг модели сил этапа численного пропагатора (Луна реализована в сопутствующей записи выше); позиционная точность уровня DE, атмосферное сопротивление и SRP остаются задачами следующих этапов. - Модель сил на основе зональных гармоник J2–J6 (
forces::zonal_accel/zonal_potential). Расширяет модель сил пропагатора Коуэлла за пределы J2 до полного зонального поля Земли до степени 6 (стандартные опубликованные ненормированныеJ2..J6по EGM-96), подключённого к пропагатору какForceModel::with_zonals_j2_j6(). Ускорение есть точный аналитический градиент зонального возмущающего потенциалаR(r) = −(μ/r)·Σ Jₙ(Re/r)ⁿPₙ(z/r)(полиномы Лежандра по восходящей рекуррентной формуле), проверенный тремя независимыми способами: оно сводится с машинной точностью кj2_accel, прошедшему валидацию по 666 векторам, при ограничении до[J2]; оно совпадает с численным градиентом собственного потенциала по всему полю J2..J6 (эталонная проверка консервативного поля); а нечётный членJ3и чётные членыJ2/J4..J6демонстрируют характерную северно-южную (анти)симметрию приz → −z— асимметрию грушевидной формы. Пропагированная орбита J2..J6 сохраняет полную энергию (кинетическую + центральную + зональный потенциал) с точностью ~1e-8 за сутки и отличается от орбиты только с J2 на малую ненулевую величину. Это реализует шаг 2 («зональные гармоники J2–J6») этапа численного пропагатора; поле тессеральных гармоник EGM высокой степени, сопротивление, SRP, третьи тела и внешняя перекрёстная проверка с GMAT/Orekit остаются задачами следующих этапов. - Численный (Коуэлла) пропагатор орбиты (
src/propagator.rs). Первый неаналитический пропагатор Kshana (остальная часть орбитального стека аналитическая: SGP4/SDP4): он подключает модель сил «двух тел + J2» (src/forces.rs) к адаптивному драйверу RK4 с удвоением шага (src/integrator.rs) какf(t,[r;v]) = [v; a(r)]с переключателемForceModel. Проверка выполнена по аналитическому эталону, который строже численной перекрёстной проверки между инструментами: невозмущённая орбита воспроизводит точное решение Кеплера в универсальных переменных с погрешностью менее метра на 24-часовой орбите LEO (более жёсткий критерий, чем «относительно численного эталона < 10 м», как это сформулировано в этапе), удельная энергия и момент импульса сохраняются с относительной точностью ~1e-9, а нодальная прецессия от J2 воспроизводит замкнутую формулуj2_secular_ratesв рамках теории первого порядка (в пределах 2 %, остаток порядка O(J2²)). Также добавленsolve_kepler_checked— метод Ньютона для уравнения Кеплера, который возвращаетErrвместо молча неверного ответа, если не сходится за ограниченное число итераций (случайe = 0.999вблизи перигея). Честные границы: модель сил — только «два тела + J2»; поле тессеральных гармоник EGM высокой степени (200×200 + загрузчик), сопротивление (NRLMSISE-00), SRP, силы третьих тел и внешняя перекрёстная проверка с GMAT/Orekit остаются задачами следующих этапов. - 60-минутное согласование по карте гравитации без GPS с точностью < 500 м (
run_gps_denied_gravity_nav). Углубляет слой альтернативного PNT до проверочной цели ESA NAVISP Quantum Wayfarer: аппарат проходит трассу ~700 км при полном часовом отсутствии ГНСС — его инерциальное решение дрейфует до ≈ 70 км — а холодноатомный гравиметр и иерархический метод от грубого к точному (частицы/сетка) восстанавливают постоянный дрейф ИНС до ≈ 145 м (< 500 м), то есть уменьшение более чем в 480 раз. Реальный уровень белого шума гравиметра вносится как детерминированная последовательность с фиксированным начальным значением, поэтому алгоритм сопоставления не получает бесшумную истину, но прогон точно воспроизводим (проверено побитовое совпадение и устойчивость в пределах нескольких метров при разных реализациях шума). Регрессионный тест показывает, что уточнение необходимо: единственная грубая сетка застревает на ~2 км, и лишь трёхступенчатое уточнение преодолевает барьер 500 м. Добавлен новый зафиксированный сценарийscenarios/gps-denied-gravity-nav.toml. Строкаdocs/CAPABILITY.mdпо-прежнему честно остаётся частичной (встроенной карты EGM2008 по-прежнему нет), а её доказательства обновлены результатом 60 мин < 500 м. Честные границы прежние: низкостепенное сферически-гармоническое поле + синтетические масконы; Монте-Карло по реализациям ошибки представления карты — задача следующего этапа. - Реестр завышенных заявлений + регрессионная защита (
docs/CLAIMS-VS-REALITY.md,tests/no_overclaims.rs). Завершает направление по честности и снятию завышенных заявлений: четырнадцать завышенных заявлений, выявленных ранее проведённым аудитом (OC-0…OC-13), теперь все GREEN — сильные заявления (OC-0связанный фильтр Калмана часов и положения,OC-2подавление J/S→C/N₀→потеря синхронизации,OC-7физика CAI по Маху–Цендеру,OC-8ARAIM HPL/VPL) заменены реализованными и протестированными возможностями, а не смягчёнными формулировками, а остальные строки приведены в соответствие с кодом. Новый тест CI сканирует действующие публичные поверхности (README,CAPABILITY,GLOSSARY,web/) и завершается ошибкой, если какая-либо снятая прямая формулировка завышенного заявления вновь появляется без оговорок, так что GREEN строка не может незаметно регрессировать. Показатель качества «целостность» в каждом прогоне по-прежнему честно обозначен как самосогласованность фильтра (а не авиационная целостность); настоящие ARAIM HPL/VPL выводятся отдельно, чтобы их никогда не путали. - Навигация по сопоставлению с картой гравитации (альтернативное PNT без GPS). Новый
src/gravimeter.rsдобавляет слой возможностей альтернативного PNT, которого требуют исследования ESA NAVISP Quantum Wayfarer / QT-CCI по сопоставлению с картой гравитации: модель измерений холодноатомного гравиметра, уровень белого шума которой выведен из ASD акселерометра CAI (σ = ASD/√τ); низкостепенное полностью нормированное сферически-гармоническое поле аномалий гравитации (проверено по замкнутым функциям ЛежандраP̄₁₁=√3·cosφ,P̄₂₀=(√5/2)(3sin²φ−1),P̄₂₂=(√15/2)cos²φи выведенной вручную аномалии одного члена 1,897 мГал) плюс синтетические масконы для локальных особенностей высокой степени; и фильтр частиц для сопоставления с картой гравитации (объединяющийmapmatch+particle_filter), который восстанавливает трек без GPS по последовательности аномалий на его пути. Зафиксированный эталонный тест NAVISP (scenarios/gravity-map-nav.toml) уменьшает свободный инерциальный дрейф ~73 км до нескольких км. Честные границы: Kshana не включает полный набор коэффициентов EGM2008 степени 2190° — поле низкостепенное + масконы, а не реальная карта высокого разрешения; загрузчик EGM/EIGEN, магнитная карта, SLAM с опорой на рельеф и подключениеkind=к движку сценариев с SVG-графиком дрейфа остаются задачами следующих этапов.docs/CAPABILITY.md«Навигация по карте гравитации / альтернативное PNT» → частично. - Моделирование манёвров и плацдарм проектирования траекторий. Новый
src/maneuver.rsдобавляет первый слой проектирования траекторий над SGP4: импульсные узлы ΔV, применяющие разрыв скорости и переносящие вперёд ковариацию 6×6 (детерминированное включение двигателя ⇒ единичная матрица перехода состояния; ковариация ошибки исполнения поворачивается из системы координат включения — ECI или LVLH — в блок скорости), интегрирование конечного включения (постоянная тяга на дуге включения, масса как переменная состояния), достигнутое ΔV которого проверяется по замкнутому уравнению ракеты Циолковского с точностью лучше 0,01 %, решатель Ламберта (Иццо, 2015) для одного витка (r1,r2, время полёта ⇒v1,v2), точный пропагатор Кеплера в универсальных переменных (истина для двух тел) и перебор porkchop, отображающий сетку «эпоха старта × эпоха прибытия» в C3 отлёта и V∞ прибытия, выдаваемый как 2D-массив JSON для построения контуров в браузере. Валидация самодостаточна и строже учебного вывода: каждый результат Ламберта проходит круговую проверку через пропагатор Кеплера (он должен вернуться вr2), а минимум porkchop сверяется с аналитическим нижним пределом C3 перелёта Гомана для двух компланарных круговых орбит. Kshana позиционирует это как слой моделирования характеристик над GMAT/Orekit, а не как замену (многовитковые ветви и реальные планетные эфемериды остаются вне охвата). Десять тестов. - Полный 17-мерный тесно связанный UKF для GNSS/ИНС с счислением пути по квантовому CAI. Новый
src/fusion/tightly_coupled17.rsнесёт полное инерциально-навигационное состояние, которое оценивает тесно связанный фильтр, —[position, velocity, attitude-error, accelerometer bias, gyro bias, clock bias, clock drift](17 состояний), — пропагируемое через бесплатформенную механизацию, управляемую измеренной удельной силой и угловой скоростью, с малоугловым поворотомC ≈ I + [ψ×]из связанной системы в инерциальную, так что ошибка ориентации влияет на горизонтальное ускорение (стандартная связь наклона ИНС). Во время пропадания GNSS фильтр движется по одним лишь данным IMU; шум процесса случайного блуждания скорости — это выведенныйq_vaакселерометра на холодноатомном интерферометре (crate::inertial::quantum_imu), так что дрейф счисления пути определяется пределом квантового датчика: 120-секундное пропадание остаётся ограниченным несколькими сотнями метров против километров, которые накопила бы свободная ИНС навигационного класса. Обновление по псевдодальности/скорости изменения дальности выполняется через общий несентированный фильтр (с α = 1 для хорошо обусловленных весов при таком размере состояния). Пять тестов: тождество модели измерений, интегрирование постоянной скорости с идеальным IMU, помощь GNSS, оценка смещения акселерометра и эталонный тест 120-секундного пропадания с ограничением по CAI.
0.11.0 - 2026-06-05#
Изменено#
- Честная формулировка о квантовом позиционировании. Основное описание теперь везде звучит как «симулятор устойчивости PNT с моделями характеристик квантовых датчиков»: в слогане README, строке цитирования,
CITATION.cff(название + аннотация) и в баннере, — заменяя более вольную маркетинговую формулировку «гибридный квантово-классический симулятор PNT». Раздел README Что это / чем не является получил явное заявление о границах «Это не (пока)» (не физический движок атомной интерферометрии из первых принципов, не приёмник GNSS/решатель PVT, не инструмент проектирования миссий), а новый верхнеуровневыйROADMAP.mdотносит слой квантовой физики к пункту P2 (фаза CAI по Маху–Цендеру, проекционный шум, тензор вибрации), чтобы читатели знали: физика из первых принципов запланирована и готовится, а не заброшена. Изменений поведения или API нет.
Добавлено#
- Исследование компромиссов при проектировании орбитальной группировки: перебор конструкций Уокера с фронтом Парето, JSON времени повторного обзора и субкилометровая проверка формулы Уокера.
src/walker.rsполучаетwalker_design_sweep, запускающую сеткуplanes × sats_per_plane(например, компромисс 3×3) при фиксированном наклонении и сводящую для каждой конструкции в таблицу долю покрытия, наихудший PDOP и максимальный/средний интервал повторного обзора;pareto_frontотмечает недоминируемые конструкции (меньше спутников, больше покрытие, ниже PDOP, короче повторный обзор), аWalkerDesignReport::to_jsonсериализует ячейки и фронт Парето, включая поля времени повторного обзора, в JSON. Новая проверка привязывает генератор к формуле Уокераi:T/P/F: спутники одной позиции в соседних плоскостях, как показано, отображаются друг в друга точным поворотомR_z(2π/P)с точностью менее 1 км на полных 24 ч пропагации SGP4 (короткопериодическое «дыхание» J2 является синфазным и сокращается), а позиции внутри плоскости, как подтверждено, разнесены на2π/Sв среднем. Опирается на зафиксированный реальный снимок Celestrakgps-opsот 2021-07-28 (scenarios/orbit-sgp4-gps.toml, используемый в тестах покрытия сценариев и круговой проверки SP3). - Передача времени и частоты, расширенная: TWSTFT, общий вид GNSS, PPP, оптическая, аппроксимация степенным законом IEEE-1139 и ансамбль часов. Новый
src/timetransfer_adv.rsстроит рабочие методы передачи на основе реализованных замкнутых форм Саньяка/общего вида и инструментов стабильности Аллана.twstft_sagnacдаёт поправку Саньяка для двусторонней спутниковой передачи времени и частоты (TWSTFT) как сумму по контуру из трёх участков, в точности равную замкнутой форме BIPMΔt = 2·A·ω_E/c²(перекрёстно проверено независимойtwstft_sagnac_bipm);run_twstftвыдаёт суточный рядT_A − T_Bи его TDEV.gnss_common_view_seriesберёт одинарные разности двух синтетических наземных станций, так что часы спутника сокращаются.iono_free_combination+ppp_receiver_clock— это безионосферная комбинация PPP и решение для часов приёмника относительно (синтетической) истины класса SP3, с точным сокращением ионосферы первого порядка.rytov_variance,fried_parameterи логнормальные замиранияlognormal_fadingс единичным средним моделируют вызванные турбулентностью сцинтилляции оптической линии в свободном пространстве.fit_power_law_psd— полная аппроксимация по методу наименьших квадратов кривой дисперсии Аллана пятью коэффициентамиh_αпо IEEE-1139 (сразу все пять канонических шумовых процессов) с указанием доминирующего процесса для каждой декады τ.ensemble_timescaleформирует бумажную шкалу времени с взвешиванием по обратной дисперсии, девиация Аллана которой строго ниже, чем у лучших из вносящих вклад часов. 31 модульный тест; цели валидации — замкнутые формы и синтетическая истина; приём реальных данных BIPM Circular-T / IGS SP3 остаётся задачей. - Карты ионосферы IONEX: разбор файла, интерполяция по времени и отображение наклонной косекансной функции.
src/ionex.rsполучаетparse_ionex, читающую формат файлов IONEX (определение сетки в заголовке + блокиSTART/END OF TEC MAP) в последовательностьIonexMap— с нормализацией порядка широт файла с севера на юг вTecGridс положительным шагом и масштабированием значений на10^EXPONENT.interpolate_tec_in_timeсмешивает две последовательные карты на запрашиваемую эпоху, аobliquity_factor/slant_tecотображают вертикальный TEC на наклонный луч через тонкооболочечный однослойный множительM(z) = 1/cos z′(sin z′ = (Rₑ/(Rₑ+H))·sin z). Вместе с реализованной сеточной моделью это превращает измеренную глобальную карту ионосферы IGS в пригодную для использования наклонную задержку. - Проектирование орбитальной группировки: оценка размера по полосам покрытия + сравнение нескольких группировок.
src/walker.rsполучаетmin_satellites_streets_of_coverage— идеализированный решатель минимального числа спутников по полосам покрытия: по реализованному половинному углу покрытияλи половине ширины полосыcон определяет размер околополярной группировки для непрерывного однократного глобального покрытия какp = ⌈π/(2c)⌉плоскостей (например, 4-спутниковой плоскости на высоте GPS нужны 2 плоскости, 8 спутников) и возвращаетNone, если спутники слишком редки для образования непрерывной полосы.compare_constellations— инструмент сравнения нескольких группировок: он оценивает каждую названную конструкцию Уокера для одной и той же станции/окна черезpdop_sweepи возвращает их покрытие / PDOP / размер рядом. Честные границы: точная по шву поправка Райдера на границе встречно вращающихся плоскостей и 3D-глобус покрытия остаются задачами следующих этапов. - Многоуровневое обнаружение спуфинга: детектор паритета на основе согласованности RAIM + слияние уровней.
src/spoof_monitors.rsполучает третий и последний уровень обнаружения и стадию слияния:parity_raim_testметодом наименьших квадратов подгоняет решение положения/часов к избыточному набору псевдодальностей и проверяет оставшуюся взвешенную сумму квадратов невязок по порогу χ²(m−4)— отмечая смещённое подмножество спутников и правильно оставляя синфазное смещение (поглощаемое часами приёмника) невидимым для RAIM, а не затушёвывая его.fuse_spoof_layersобъединяет уровни паритета, AGC и SQM в одно взвешенное решение, фиксирующее, какие уровни сработали. Монте-Карло характеризует детектор: эмпирическая P_fa ≈ 0,068 при расчётной точке 0,05, пропуск обнаружения снижается с 0,885 при смещении спуфинга 2σ до 0,16 при 8σ. Честные границы: перекрёстная проверка по конкретным опубликованным тестовым векторам спуфинга (Spirent / ION GNSS+) требует этих внешних наборов данных и остаётся задачей следующего этапа. - Ансамбль валидации связанного и несвязанного фильтра Калмана. 100-кратный Монте-Карло в
src/fusion/coupled.rsоценивает пользу от переноса взаимной ковариации положение↔часы: точный встроенный несвязанный базовый вариант (побитово проверенный по реализованномуCoupledPntFilter) обрабатывает те же данные с обнулёнными перекрёстными блоками, и после почти вырожденных псевдодальностей и фиксации только по часам связанный фильтр восстанавливает положение с 2,97 м СКО против 48,8 м у несвязанного, выигрывая в 97 из 100 испытаний — фиксация часов уточняет положение лишь через корреляцию, которую несвязанный набор отбрасывает. Это завершает набор проверок корректности фильтра Калмана (форма Джозефа, безопасность PSD, согласованность NEES/NIS и теперь ансамбль связанного фильтра). - Конвейер определения орбиты (пакетный + последовательный). Новый
src/orbit_determination.rsвосстанавливает орбитальное состояние спутника[r, v]по дальномерным измерениям наземных станций, объединяя три реализованных элемента: модель сил «два тела + J2» (src/forces.rs) и интегратор RK4 (src/integrator.rs) пропагируют состояние-кандидат по дуге, модель измерения дальности предсказывает дальность до каждой станции, а пакетный корректор Гаусса–Ньютона (src/batch_ls.rs) приводит кандидата к наилучшему состоянию (determine_orbit_batch). Те же динамика и модель дальности управляют также последовательным рекурсивным определением на реализованном несентированном фильтре (determine_orbit_sequential). Проверяют его четыре теста: предсказание дальности по дуге; пакетное восстановление до субметровой точности / мм·с⁻¹ по бесшумным дальностям; пакетное восстановление до ~2 м с остаточной невязкой после подгонки на уровне шумового порога 5 м (признак согласованной подгонки по методу наименьших квадратов); и последовательное восстановление с точностью до десятков метров. Честные границы: измерения скорости изменения дальности/Доплера и углов, аналитическая матрица перехода состояния для J2 и маскирование видимости станций остаются задачами следующих этапов. - Тесно связанный навигатор UKF для GNSS/ИНС. Новый
src/fusion/tightly_coupled.rsподключает реализованное ядро несентированного фильтра Калмана (src/fusion/ukf.rs) в рабочий тесно связанный навигатор с восьмимерным состоянием[px,py,pz,vx,vy,vz,b,d](положение/скорость в ECEF плюс смещение и дрейф часов приёмника в единицах дальности). Он принимает необработанные спутниковые измерения —pseudorange(ρ = |p − sᵢ| + b) иrange_rate/Доплер (ρ̇ = (p − sᵢ)·(v − ṡᵢ)/|p − sᵢ| + d) — а не заранее сформированное определение положения, поэтомуTightlyCoupled(сpropagate/propagate_orbital/update_gnss) продолжает коррекцию при менее чем четырёх спутниках и проходит пропадания GNSS по своей пропагируемой динамике. Пять тестов проверяют его от начала до конца, включая приёмочные сценарии этапа: геометрию псевдодальности/Доплера по ручным значениям; бесшумную сходимость до субметровой точности на пяти спутниках; случай трёх спутников, сходящийся с ~212 м до ~13 м, где мгновенное PVT-решение вообще невозможно сформировать; 120-секундное пропадание при постоянной скорости в пределах 50 м; и — главный приёмочный критерий — 30-минутный проход по искривлённой траектории на LEO (реальная орбита «два тела + J2») со 120-секундным пропаданием GNSS, удержанный на уровне 0,77 м СКО за проход и 2,9 м в наихудшем случае за пропадание. Это орбитальное счисление объединяет реализованную гравитационную модель сил (src/forces.rs) и интегратор RK4 (src/integrator.rs) в модель процесса UKF (propagate_orbital), так что фильтр следует кривизне орбиты, чего не может счисление при постоянной скорости (одна лишь кривизна составляет ~58 км за 120 с на LEO). Честные границы: орбитальное счисление использует модель сил «два тела + J2», а не необработанную удельную силу IMU (для неактивной орбитальной платформы они совпадают); добавление бесплатформенного состояния ошибок IMU и коррекций ионосферы/тропосферы в контуре остаётся задачей следующих этапов. - Модель измерений сопоставления с картой (навигация по рельефу / гравитации). Новый
src/mapmatch.rsпоставляет модель измерений, превращающую реализованный фильтр частиц с последовательной значимой передискретизацией (src/particle_filter.rs) в рабочий навигатор без GPS:field_likelihood(гауссово правдоподобие совпадения поля) иmap_match_likelihood, который выбирает значения любого геопривязанного опорного поля — высоты рельефа (TRN) или аномалии гравитации — в положении частицы и взвешивает её по согласию с измеренным значением аппарата. Поле — это любой сэмплерFn(lat, lon) -> value, поэтому он сочетается с билинейной сеткой изsrc/ionex.rsили замыканием. Два теста закрепляют это: правдоподобие достигает максимума (=1) при идеальном совпадении и падает доe^(−½)на одном сигма, а фильтр частиц на характерном участке синтетического рельефа восстанавливает истинное положение с точностью до 0,1. Честные границы: реальные опорные карты (высоты SRTM, аномалия гравитации EGM/EIGEN) и их загрузчики остаются задачами следующих этапов. - Целостность PNT в пространстве Земля–Луна (лунный ARAIM). Новый
src/lunar.rsприменяет наземный движок ARAIM MHSS к навигационной службе лунного типа LunaNet с лунными параметрами (σ_URE ≈ 30 mпротив 0,6 м у GPS,P_sat ≈ 1e-4): лунные константы, селеноцентрический базис «восток/север/вверх» и вспомогательная функция геометрии неба, а такжеlunar_araim(HPL/VPL). Три теста закрепляют это — ортонормированный селеноцентрический базис, геометрию наклонной дальности и точное линейное масштабирование уровня защиты сσ_URE(лунные 30 м дают уровень защиты в 50 раз больший, чем та же геометрия при 0,6 м у GPS, — количественная причина, по которой целостность лунного PNT трудно обеспечить). Честные границы: точные эфемериды LANS NRHO, бюджет ошибок сигнала в пространстве и приведение систем MCI↔MCMF остаются задачами следующих этапов. - Двухчастные (высокоточные) юлианские даты. Новый
src/jd2.rsдобавляетJd2— юлианскую дату, разделённую на целую частьdayи дробнуюfracв[0,1)(соглашение SOFA/hifitime), сnew/from_parts/add_seconds/diff_seconds/total. Разности близких эпох остаются точными вплоть до порогаf64, тогда как одинарная юлианская датаf64теряет ~50 мкс около J2000. Четыре теста закрепляют это: круговое преобразование, нормализацию дроби, точное восстановление микросекунд (с демонстрацией отказа одинарнойf64рядом) и аддитивную, обратимую арифметику секунд. - Запись CCSDS OMM (сообщение о средних элементах орбиты). Новый
src/omm.rsдополняет запись эфемеридoemсообщением о средних элементах:OmmFile::from_tleотображает средние элементы SGP4/TLE в единицы OMM (среднее движение в об/сут, углы в градусах, плюсBSTAR), аto_omm_kvnсериализует форму KVN стандарта CCSDS 502.0-B-2 (стандартный трек), так что орбиту Kshana может принять любой инструмент, понимающий OMM, а не специальный TLE. Два теста закрепляют преобразование единиц TLE→OMM (≈ 15,5 об/сут, наклонение 51,6° и т. д.) и наличие обязательных ключевых слов KVN. Честные границы: форма KVN и отображение TLE поставляются здесь; XML-представление (ndm/omm) и круговая проверка с эталонным разборщиком остаются задачами следующих этапов. - Фильтр частиц с последовательной значимой передискретизацией. Новый
src/particle_filter.rsдобавляет нелинейный негауссов оценщик, лежащий в основе навигации без GPS с картой (по рельефу или сопоставлением с картой гравитации):predict(пропагация частиц через динамику + гауссов шум процесса),update(перевзвешивание по правдоподобию измерения для каждой частицы), систематическуюresample, монитор вырожденияeffective_sample_sizeи оценку взвешенного среднего. Шесть тестов точно закрепляют детерминированное ядро — ESS в диапазоне 1…N, систематическая передискретизация, выбирающая индексы пропорционально весу, выпуклая комбинация взвешенного среднего, гауссово правдоподобие, притягивающее оценку к измерению, поведение «передискретизация к равномерному» и детерминизм predict с начальным значением. Честные границы: движок поставляется здесь; опорные карты (высоты SRTM, аномалия гравитации EGM) и модель измерений по карте остаются задачами следующих этапов (сеточный билинейный сэмплерionexодинаково подошёл бы для карты гравитации или рельефа). - Карты ионосферы TEC в стиле IONEX. Новый
src/ionex.rsдобавляет измеренную ионосферу как альтернативу транслируемой модели Клобучара:TecGrid(регулярная сетка вертикального TEC по широте/долготе, глобальная карта ионосферы IGS) с билинейной интерполяцией в точке прокола (vtec_at, с ограничением за пределами сетки) и задержкой первого порядкаΔ = 40.3·TEC/f²(vtec_to_delay_m,delay_at). Четыре теста закрепляют это:1 TECU ≈ 0.162 mна L1 с масштабированием1/f², точную интерполяцию в узлах, билинейные средние точки, усредняющие углы, и запросы за пределами сетки с ограничением по краю. Честные границы: сетка и интерполяция поставляются здесь; разбор формата файла IONEX, интерполяция по времени между картами и функция наклонного отображения остаются задачами следующих этапов. - Геометрические поправки передачи времени (Саньяк + общий вид GNSS). Новый
src/timegeo.rsдобавляет два детерминированных эффекта, которые необходимо учитывать при реальном сравнении часов, дополняя стохастическую двустороннюю модель вtimetransfer:sagnac_correction(Δt = (ω_E/c²)·(x₁y₂ − x₂y₁), задержка из-за вращения Земли — десятки нс для континентальных баз) иcommon_view_offset— одинарную разность общего вида GNSS, которая точно сокращает ошибку часов спутника и восстанавливает смещение между станциями. Три теста закрепляют их на точных эталонах: эффект Саньяка ≈ 33 нс для четверти оборота по экватору, антисимметрию и нулевые радиальные/полярные случаи и точное сокращение часов спутника. Честные границы: полный бюджет задержек транспондера/аппаратуры TWSTFT и решение передачи времени PPP с безионосферной комбинацией остаются задачами следующих этапов. - Орбитальная модель сил (два тела + J2). Новый
src/forces.rsдобавляет модель ускорений, которую интегрирует численный пропагатор:two_body_accel(−μ·r/|r|³), возмущение сжатиемj2_accel(замкнутая форма в ECI) иgravity_accel, суммирующую их, — используйте её сsrc/integrator.rsкакf(t,[r;v]) = [v; a(r)]. Он также предоставляет аналитические вековые скорости J2 (j2_secular_rates): регрессию узлаΩ̇, вращение апсидω̇и дрейф средней аномалииṀ. Шесть тестов закрепляют физику на точных эталонах:μ/r²для члена двух тел, замкнутую форму J2 на экваторе (~10⁻³ от величины члена двух тел), критическое наклонение (63,4349°), замораживающее перигей (ω̇ = 0), нодальную регрессию МКС (Ω̇ ≈ −5°/day) и восточный дрейф ретроградной солнечно-синхронной орбиты. Честные границы: только два тела + J2; J3–J6, сопротивление, SRP и третьи тела остаются задачами следующих этапов. - Постоянные ссылки на сценарии для обмена. Новый
src/permalink.rsдобавляет кодек Base64 по RFC 4648 без зависимостей (стандартный алфавит+/с заполнением и URL-безопасный алфавит-_без заполнения) и обёрткиencode_scenario/decode_scenario, так что TOML песочницы можно закодировать в параметр запроса?s=и передавать как URL. Для браузера доступен как привязки wasmencode_permalink/decode_permalink. Четыре теста закрепляют его на канонических векторах RFC 4648 ("foobar"→"Zm9vYmFy"и т. д.), круговом преобразовании сценария в URL-безопасной форме (без+///=, которые пришлось бы экранировать), отклонении недопустимого символа и круговом преобразовании всех 256 значений байта. Честные границы: кодек и привязки поставляются здесь; интерфейс кнопки «Поделиться» песочницы, многорядный график Plotly/D3 и режим сравнения A/B остаются задачами следующих этапов. - Пакетный метод наименьших квадратов Гаусса–Ньютона (пакетный дифференциальный корректор). Новый
src/batch_ls.rsдобавляет ядро оценивания, на котором держится пакетное определение орбиты (или любая подгонка параметров):gauss_newtonлинеаризует заданную пользователем модельh(x)якобианом на центральных конечных разностях, формирует и решает взвешенные нормальные уравнения(HᵀWH)·Δx = HᵀW·(z − h(x))(с повторным использованием проверенной обратной матрицы) и итерирует до сходимости с весами для каждого измерения. Четыре теста закрепляют это: линейная подгонка прямой, достигающая точного решения взвешенным методом наименьших квадратов, нелинейная подгонкаa·exp(b·t), восстанавливающая истинные параметры, 3D-многопозиционное определение по дальностям, восстанавливающее известное положение по бесшумным дальностям (вариант определения орбиты), и отклонение недоопределённых/несогласованных входных данных. Честные границы: это универсальный движок корректора; специфичная для орбиты модель измерений дальности/скорости изменения дальности/азимута–возвышения, аналитическая матрица перехода состояния для J2 и валидация по опубликованным случаям остаются задачами следующих этапов. - Мониторы спуфинга на радиочастотном уровне (мощность AGC и SQM). Новый
src/spoof_monitors.rsдобавляет два независимых детектора спуфинга во входном тракте приёмника, дополняющих монитор спуфинга времени с опорой на часы вspoof: монитор мощности AGC (combine_power_dbmнекогерентная сумма мощностей +AgcMonitor), отмечающий избыточную принимаемую мощность, которую добавляет передатчик спуфинга сверх настраиваемого запаса в дБ, и монитор качества сигнала (bpsk_autocorrтреугольная автокорреляция кода +SqmMonitor), отмечающий дисбаланс коррелятора «раннего минус позднего», вносимый многолучевостью/meaconing/повтором. Четыре теста закрепляют точные замкнутые формы (3,01 дБ при удвоении мощности, агрегат10·log10(N), треугольнаяR(τ)=1−|τ|и порог оповещения Early/Late 10 %). Честные границы: полный паритетный детектор спуфинга на основе согласованности RAIM, многоуровневое слияние выходов мониторов и валидация по опубликованным векторам спуфинга Spirent/ION GNSS+ остаются задачами следующих этапов. - Адаптивный численный интегратор ОДУ. Новый
src/integrator.rsдобавляет первую часть численного пропагатора (остальное распространение орбит в Kshana — аналитическое SGP4/SDP4): общий шаг Рунге–Кутты четвёртого порядка (rk4_step) для любой системы первого порядкаy' = f(t, y)и адаптивный драйвер (integrate), контролирующий локальную ошибку удвоением шага (экстраполяция Ричардсона) со стандартным регулятором шага0.9·(tol/err)^(1/5)и логикой принятия/отклонения. Шесть тестов закрепляют это на точных решениях: экспонентаy' = y → eс точностью< 1e-9, уменьшение ошибки в ~16 раз при каждом делении шага пополам, доказывающее сходимость четвёртого порядка, сохранение энергии/возврат гармонического осциллятора за полный период и адаптивный драйвер, выдерживающий жёсткий допуск с переменными шагами. Честные границы: это ядро интегратора и его контроль ошибки; вложенные таблицы Дорманда–Принса RK5(4)/RKF7(8) и иерархическая орбитальная модель сил (два тела + J2–J6 + сопротивление + SRP + третьи тела), превращающие его вNumericalPropagator, остаются задачами следующих этапов. - Фильтр Калмана с несценированным преобразованием (по сигма-точкам). Новый
src/fusion/ukf.rsдобавляет масштабированный несценированный фильтр Калмана (Julier & Uhlmann; Wan & van der Merwe) как универсальный оценщик сnсостояниями по заданным пользователем функциям процесса и измерения — оценщик по сигма-точкам, который применяет жёстко связанный навигатор GNSS/INS, когда модель псевдодальности/Доплера сильно нелинейна и якобиан EKF ухудшается. Он включает вспомогательную плотную линейную алгебру (множитель Холецкого для разброса сигма-точек, обращение по Гауссу — Жордану для ковариации инновации) и обновлениеP⁺ = P⁻ − K S Kᵀбез формы Джозефа. Шесть тестов закрепляют его, причём ключевые используют точное свойство: для линейной модели несценированное преобразование воспроизводит фильтр Калмана с численной точностью (предсказание, обновление и полный цикл «предсказание + обновление» сопоставлены с линейным KF, прогнанным вручную, плюс аналитическая 1-D проверка байесовского апостериорного распределения и тождества Холецкого/обращения). Честные границы: это движок оценивания; 17-компонентный жёстко связанный навигатор GNSS/INS, модель измерений псевдодальности/Доплера и сценарий проверки на потере сигнала остаются на будущее. - Уровни защиты ARAIM для двух орбитальных группировок. Новый
araim_dual_raimрасширяет одиночно-отказный Advanced RAIM (araim_raim) режимом отказа всей орбитальной группировки по EU ARAIM / DO-316: наряду с гипотезами отсутствия отказа и отказа отдельного спутника, каждая орбитальная группировка (помечается для каждого спутника) вносит одну гипотезу, которая разом удаляет все её спутники, с априорной вероятностьюP_const(новыйDualFaultPriors { p_sat, p_const }). Каждая гипотеза добавляет член в ту же сумму целостности MHSS, так что VPL/HPL — наименьшие границы, при которых суммарнаяP_HMIукладывается в бюджет по отсутствию отказа + отказу одного КА + отказам группировок (разделение ложной тревоги по Бонферрони выполняется по всемN + Cгипотезам). ПриP_const = 0результат побитово совпадает сaraim_raim; пользователь с одной группировкой получаетNoneпри отказе собственной группировки (её нельзя исключить) — именно поэтому так важно покрытие двумя группировками. Четыре теста охватывают эквивалентность, расширение уровней защиты, недоступность для одной группировки и проверку входных данных, повторно используя существующий механизм подрешений разделения решений. - Прецессия IAU 2006 (углы Фукусимы–Уильямса и матрица смещения-прецессии). Новый
src/precession.rsреализует прецессию IAU 2006 (P03; Капитен, Уоллес и Шапрон 2003): четыре угла Фукусимы–Уильямса(γ̄, φ̄, ψ̄, ε̄_A)как полиномы по юлианским столетиям TT (fw_angles) и матрицу поворота смещения-прецессии из GCRS в среднюю на дату, построенную по ним конструкцией SOFAiauFw2m(precession_matrix, со вспомогательнымиgcrs_to_mod/mod_to_gcrs). Это первая часть инерциальной системы поверх существующей редукцииframesна основе GMST. Восемь тестов проверяют её по замкнутым опорным значениям — средний наклон эклиптики J2000ε̄ = 84381.406″ = 23.4392794°, опубликованные постоянные члены углов, накопление общей прецессииψ̄ ≈ 5039.998″за столетие, ортонормированность матрицы иdet = +1, почти единичное значение (только смещение системы отсчёта) на J2000 и чистый угол поворота≈ 1.40°/столетие. Честные границы (ROADMAP.md): только прецессия — нутация IAU 2000A из 678 членов, полная цепочка TEME→GCRS и численная перекрёстная проверка с SOFA/ANISE с точностью мкс дуги/<10 м остаются задачами следующих этапов. - Физика акселерометра на холодноатомном интерферометре (CAI) из первых принципов.
src/inertial/quantum_imu.rsмоделирует трёхимпульсный атомный интерферометр Маха — Цандера из первых принципов, а не по спецификации: эффективный волновой векторk_eff = 4π/λ, фаза интерферометраΦ = k_eff·a·T², квантовый проекционный (дробовой) шумσ_Φ = 1/(C·√N), чувствительность к ускорению за один отсчёт, спад контрастаC(t) = C₀·e^(−t/τ)и — это главное —CaiAccelerometer::q_va(), который выводит белую спектральную плотность ускорения, уже потребляемую классическойAccelModel, из числа атомов, времени опроса и контраста. Модель теперь охватывает и связь с вибрациями — доминирующее слагаемое в реальных приборах: передаточную функцию интерферометра «ускорение→фаза»|H(ω)| = (4/ω²)sin²(ωT/2)(accel_transfer_function), дисперсию фазы для белой PSDσ_Φ² = k_eff²·S_a·T³/3(vibration_phase_variance_white, с численной проверкой интегрированием по полосеvibration_phase_variance_band), ранг-1 проекцию вдоль лучаbeam_axis_projection, а такжеCaiAccelerometer::vibration_phase_noise/vibration_limited_accel(последняя сводится к нижнему пределу√(S_a/(3T)), не зависящему отk_eff). Одиннадцать тестов проверяют физику вручную (Rb-87k_eff ≈ 1.61×10⁷,Φ(1 g) ≈ 1.58×10⁴ rad, нижний предел дробового шумаσ_a ≈ 0.13 µgза отсчёт против нижнего предела вибраций ≈ 5,9 µg, законы масштабирования1/T²,1/√NиT³). Честные границы вdocs/QUANTUM.md: это охватывает нижний предел проекционного шума и выше него режим, ограниченный вибрациями; шум фазы лазера, систематические эффекты Кориолиса и светового сдвига и проверочные сценарии PHARAO/CARIOQA остаются на будущее. - Квантовый акселерометр CAI, подключённый к инерциальному сценарию. Акселерометр в сценарии инерциального счисления пути теперь приводится к новому
ImuKind—Classical(существующий датчик с коэффициентами по паспорту) илиQuantumCai, если он несёт необязательный блок[cai](CaiCfg: длина волны, разнесение импульсов, число атомов, контраст, время цикла и необязательныйvibration_psdплатформы). Спектр случайного блуждания скорости датчикаquantum_cai—q_va— выводится из физики интерферометра — порог дробового шума плюс, если задан спектр вибрации, вклад, ограниченный вибрацией, в квадратуре — вместо заданного коэффициента, и происхождение прогона фиксирует, что шум выведен из физики. Полеcaiимеет значениеskip_serializing_if = "Option::is_none", поэтому существующие сценарии его опускают и сериализуются побайтово идентично (хеш сценария не меняется). Пять тестов охватывают вывод, квадратурную сумму вибрации, выборClassical/QuantumCai, стабильную по хешу сериализацию и сквозной прогон на основе CAI. - Оптимизатор проектирования орбитальной группировки и геометрия полос покрытия.
src/walker.rsполучаетoptimize_walker_design— безградиентный сеточный оптимизатор, который ищет в пространстве конструкций{planes × sats × inclination}и возвращает лучшую конструкцию Уокера для выбранногоDesignObjective—MinSatellitesForCoverage,MaxCoverageилиMinWorstPdop— по уже проверенному перебору PDOP (тест подтверждает, что он возвращает победителя полного перебора). Кроме того, аналитические замкнутые формы полос покрытияcoverage_half_angle_rad(λ = arccos(Re/r·cos ε) − ε) иstreet_half_width_rad(cos c = cos λ / cos(π/s), Райдер/Бесте), проверенные вручную по учебниковой геометрии и обнаруживающие разрыв при недостаточной населённости. Полный решатель Райдера для минимального числа спутников при глобальном покрытии, 3D-глобус песочницы и внешняя перекрёстная проверка DOP остаются задачами следующих этапов. - Экспорт точных эфемерид SP3 из CLI. Сценарий пропагируемой орбиты/группировки теперь можно записать в файл SP3-c:
kshana <orbit.toml> --export-sp3 out.sp3либоexport_sp3 = trueв сценарии автоматически записывает<scenario>.sp3(api::export_sp3/auto_export_sp3,OrbitClockScenario::to_sp3_string, необязательныйepoch). Тест круговой проверки (tests/sp3_export_roundtrip.rs) пропагирует реальный снимок Celestrakgps-ops, экспортирует его, повторно разбирает и подтверждает, что восстановленные положения ECEF совпадают с истиной SGP4 на 24 ч с точностью < 0,5 м (с большим запасом в пределах допуска 10 м класса TLE). README описывает роль интероперабельности (RINEX → RTKLIB/gLAB, SP3 → продукты Ginan/точных орбит). - Связанный фильтр Калмана часов и положения (перекрёстная ковариация блоков).
src/fusion/coupled.rsCoupledPntFilter— единый составной фильтр[pos, vel, phase, freq](обновления в форме Джозефа), чьё измерение псевдодальностиρ = g·pos + c·phase + noiseпо-настоящему связывает блоки положения и часов — в отличие от двух независимых двухмерных фильтров прежнего пакета слияния, у которых перекрёстная ковариация блоков в точности равна нулю. Проверено: общая псевдодальность делаетP[pos,phase]ненулевой; две различные геометрии совместно разрешают внесённые смещения положения и часов, которые одна дальность разделить не может; фиксация только по часам уточняет положение через перекрёстную ковариацию (выигрыш, которого несвязанные фильтры дать не могут); а NEES по Монте-Карло согласуется с χ²(4). Это реализация с 1 степенью свободы (размерность пакета слияния); 3D-расширение до 8 состояний и подключение к запускаемому пакету отслеживаются как задачи следующих этапов. - Мониторинг состояния согласованности фильтра Калмана (NIS/NEES). Обновление ковариации двухмерного фильтра часов теперь выполняется в стабилизированной форме Джозефа `P⁺ = (I−KH)P(I−KH)ᵀ
- KRKᵀ
, which stays positive-semidefinite under extreme Q/R ratios (Cholesky-checked in CI atR=1e-26 / Q≈1e-30). A newsrc/filter_health.rsruns a Monte-Carlo consistency assessment (Bar-Shalom §5.4): pooled **NIS** (normalised innovation², target 1) and **NEES** (normalised estimation error², target 2) against 95% χ² bands, surfaced as afilter_health { nis_mean, nis_chi2_lower_95, nis_chi2_upper_95, nees_mean, nees_chi2_lower_95, nees_chi2_upper_95, consistent }block in the clock result JSON and as a green/amber card in the playground. A Q/R-mismatch sweep test proves the monitor flips to inconsistent when the process noise is mistuned by ×0.1–×10. Adds a general χ² quantile (detection::chi2_inv_cdf`, Вильсона–Хилферти, сверено с таблицами).
- KRKᵀ
docs/PROVENANCE.md— единая цитируемая таблица происхождения. Сводит воедино каждый параметр датчика (часы, инерциальные, передача времени), физическую/алгоритмическую модель (орбита, системы времени, системы отсчёта, ионосфера/тропосфера, целостность, обнаружение, подавление, Аллан) и набор данных для валидации (AIAA 2006-6753, Celestrakgps-ops) с опубликованным источником — паспорт, статья, ICD или стандарт — и честной меткой зрелости (квалифицировано для полёта / наземная лаборатория / космическая цель на наземном оборудовании). Есть ссылка из введения README и таблицы документации; дополняет строкиprovenanceдля каждого прогона, которые уже передаются в JSON результата.- Типизированный API сценариев. Диспетчеризация теперь идёт по типизированному перечислению
ScenarioKind, а не по сопоставлению сырой строкиkind(ScenarioKind::classify+ исчерпывающая диспетчеризация), так что добавление пакета проверяется при компиляции. Новые типизированные интерфейсы наряду с неизменнымrun_toml, возвращающим строку:run_scenario(src) -> Result<RunOutput, KshanaError>со структурированной таксономией ошибок (InvalidInput/NonConvergence/Unsupported/IoError, у каждой стабильныйkind_tag()); трейтScenarioи точка расширенияExternalPack(пакетjammingподключён через неё как рабочий пример); и интроспекцияlist_scenario_kinds()(имя, описание, обязательные/необязательные поля для каждого вида). Привязки Python и WebAssembly получаютlist_kinds()иerror_kind(). Описано вdocs/ARCHITECTURE.md. - Реальная группировка GPS + охват рабочих режимов.
scenarios/orbit-sgp4-gps.tomlтеперь включает реальный снимок Celestrakgps-ops(2021-07-28, 30 спутников) вместо синтетических TLE Уокера, сstrict_checksum = true, так что он загружается только при верных контрольных суммах всех TLE;scripts/fetch_tles.shописывает воспроизводимое обновление, а README указывает источник открытых данных. Новыйtests/scenario_coverage.rsпроверяет каждый пакет на ≥5 вариантах рабочих режимов, утверждая конечный/ограниченный выход, подтверждает, что порог фликкер-ЧМ ощутимо ухудшает выбег часов при включении (теперь задан в трёх поставляемых сценариях), и подтверждает, что фильтр слияния сходится при реалистичном ненулевом смещении акселерометра (в пределах 3× от случая с нулевыми смещениями), закрывая разрыв в реализме «слияние работает только при нулевых смещениях».docs/VALIDATION.mdполучает таблицу рабочего режима. - Моделирование GNSS в области измерений (вид
gnss-sim). Прямая модель на уровне псевдодальностей: для каждого видимого спутника она синтезируетρ = geometric range + c·δt_rx − c·δt_sv + I + T + noise + multipathи Доплер на L1 с одночастотной ионосферой Клобучара (IS-GPS-200 §20.3.3.5.2.5) и зенитной тропосферой Саастамойнена, спроецированной функцией отображения Нилла (1996) — предоставляется как блоки TOML[iono]и[tropo]. Невязки подаются в мгновенный RAIM для HPL/VPL на каждую эпоху, а массив JSONgnss_measurements[]несёт псевдодальность, Доплер, C/N₀ и поправки ионосферы/тропосферы каждого КА. Бесшумный прогон воспроизводит геометрию + поправки с субмиллиметровой точностью (тест CI). Новыеsrc/gnss_sim.rsиscenarios/gnss-sim-raim.toml. - Стохастический детектор спуфинга времени (вид
spoof). Пакет спуфинга теперь запускает настоящий детектор вместо детерминированного сравнения «линейный рост против границы»: четыре формы внедрения (linear_ramp,step_jump,meaconing,replay), двусторонний энергетический тест χ²₁ / Неймана–Пирсона по статистике монитора с опорой на часы с порогом, заданным по целевому бюджету ложных тревогtarget_pfa, и вероятность пропуска обнаруженияP_md, приводимая и в замкнутой форме, и по Монте-Карло (mc_runsиспытаний на гипотезу — они совпадают с точностью до нескольких ×1/√N). Показатель качества безопасности теперь —1 − P_mdпри операционно вредной (по спецификации) величине. Новыеsrc/detection.rs(гауссовы хвостовые функции, тест NP/энергетический, Монте-Карло P_fa/P_md) иscenarios/spoof-meaconing.toml. Обратная совместимость: простой[attack] rate_ns_per_sпо-прежнему принимается как линейный рост.
Изменено#
- Определение показателя качества безопасности (вид
spoof): от аналитической границы обнаруживаемости1 − min_detectable/thresholdк1 − P_mdстохастического детектора. Полеsecurityпакета часов остаётся более быстрым аналитическим приближением.
Добавлено (продолжение)#
- Модель радиоподавления (вид
jamming). Модель помех на основе бюджета линии, превращающая мощность и геометрию источника подавления в потерю захвата по каждому спутнику: отношение подавитель/сигнал по потерям в свободном пространстве и коэффициенту усиления приёмной антенны по направлениям, эффективное C/N₀ по стандартному уравнению помехоустойчивости (выигрыш обработки при сжатии спектра × коэффициент спектрального разделенияQ; Каплан и Хегарти §9,4) и настраиваемый порог слежения, оцениваемые по группировке Уокера как показатель качестваavailability_under_jamming. Новыеsrc/jamming.rsиscenarios/jamming-demo.toml. Честные границы (без многолучевости, затенения рельефом, AGC и адаптивного подавления) описаны вdocs/CAPABILITY.md/docs/VALIDATION.md. - Универсальный N-мерный перебор параметров для любого вида сценария (
sweep-nd). Прежний N-мерный перебор работал только с пакетом часов.sweep-ndварьирует ключи TOML с точками в сценарии[base]по декартову произведению его осей, повторно диспетчеризует каждый узел сетки по обычному пути запуска и считывает одну или несколько метрик из результата по пути JSON с точками — поэтому он работает для каждого пакета (инерциальный, gnss-ins, целостность, спуфинг, …) без привязки к типу Rust каждого пакета. Узлы сетки вычисляются параллельно по потокам ОС на нативных целевых платформах (без добавления зависимостей); wasm переходит на последовательное выполнение. Детерминирован и упорядочен по строкам независимо от числа потоков. Новый примерscenarios/sweep-nd-inertial.toml. - Детерминированная модель ошибок IMU, настраиваемая через TOML, в пакете
gnss-ins. Трёхосная цепочка ошибок бесплатформенной системы (масштабный коэффициент, неортогональность, g-чувствительность, квантование, линейное нарастание скорости; IEEE Std 952-1997 §A.2, Groves 2013 §4,3) теперь доступна для каждого датчика из файла сценария через необязательный блок[imu_*.error_model], накладываемый поверх постоянных смещений при включении. Если блок опущен, каждый датчик остаётся источником с чисто постоянным смещением, так что существующие прогоныgnss-insне меняются. Это подключает ранее существовавшую только в библиотеке модель ошибок к запускаемому пакету и показателю качества.
0.10.0 - 2026-06-04#
Изменено#
- Валидация на реальных данных. Разборщик навигационных файлов RINEX для нескольких ГНСС, пропагатор ГЛОНАСС на RK4 и считыватель SP3 теперь проверяются на подлинных файлах IGS/DLR (реальный смешанный навигационный файл вещания RINEX 3 и орбитальный продукт IGS SP3-c), а не только на самостоятельно составленных образцах — с утверждением непустых наборов спутников и конечных, физически разумных по размеру положений ECEF. Образцы используются только в тестах (исключены из опубликованного пакета); см.
tests/fixtures/igs/NOTICE. - RAIM на геометрии реальной эталонной орбиты. Ядра мгновенного RAIM, разделения решений (MHSS) и уровней защиты ARAIM теперь проверены на геометрии реальных точных орбит IGS (SP3), а не только на синтетических группировках: геометрия линии визирования строится по первой эпохе SP3 на реальной наземной станции, а тесты утверждают метровые уровни защиты, доступные для APV-I, что смещение псевдодальности 60 м срабатывает на мониторе χ², что разделение решений идентифицирует отказавший спутник и что уровни ARAIM укладываются в выделенную
P_HMI. Закрывает разрыв «проверено только на синтетической геометрии» (паритет с gLAB в области приёмника на полной дуге RINEX остаётся пунктом дорожной карты — для него нужно решение по псевдодальностям).
Добавлено#
- Доверительные интервалы для каждого узла N-мерного перебора параметров (
sweep::nd_sweep_ensemble). Каждый узел сетки N-мерного перебора по декартову произведению теперь может вычисляться как ансамбль Монте-Карло по начальным значениям, сообщая для метрики среднее, процентили и процентильный бутстреп-ДИ 95 % для каждого узла (для обоих часов) — статистически честный перебор, а не один розыгрыш на узел. Повторно использует механизм ансамбля/бутстрепа (metric_stat); детерминирован;runs = 1в точности сводится к одиночномуnd_sweepс одним начальным значением. (Обобщение перебора на все пакеты, связанное с рефакторингом типизированного Scenario, и параллельное выполнение остаются.) - Перекрёстная проверка конвейера шумов IMU по NaveGo (
tests/navego_imu_crossval.rs). Внешняя перекрёстная проверка по NaveGo (набор инструментов INS/GNSS с открытым кодом от R. Gonzalez): воспроизводит синтетический циклnavego_example_allan.mна его опубликованном эталонном профиле Microstrain 3DM-GX3-35, подтверждая, что наш оцениватель перекрывающейся ADEV восстанавливает коэффициенты случайного блуждания скорости и угла у NaveGo (ADEV(1 s) = σ·√dt) с точностью лучше 5 % с ожидаемым наклоном белого шума −1/2. (Записанный журнал STIM300.matразмером 40 МБ не принимается — зависит от двоичного формата.) - Жёстко связанное (по псевдодальности) обновление GNSS/INS.
GnssInsEkf::update_tightly_coupled(и обёрткаClosedLoopInsGnss::fuse_tightly_coupled) реализуют ранее заглушённое измерение в области дальностей: инновация — это разность между предсказанной дальностью от положения INS до каждого спутника и измеренной псевдодальностью, с якобианом по линии визирования для ошибки положения. Поскольку каждый спутник — скалярное измерение, фильтр продолжает коррекцию при менее чем четырёх спутниках, когда слабосвязанного решения PVT не существует. Пять тестов охватывают обнуление при четырёх спутниках, коррекцию при двух спутниках (PVT невозможно), наблюдаемость вдоль линии визирования при одном спутнике и проверку входных данных. Только псевдодальность; фаза несущей и явное состояние часов приёмника остаются в дорожной карте. Неиспользуемая функция cargotight_coupling(которая закрывала прежнюю заглушку ошибки) удалена. - Пакет сценария со слабосвязанным GNSS/INS (
kind = "gnss-ins",src/fusion/pack.rs). Подключает трёхосный бесплатформенный навигатор и EKF по вектору ошибок с 15 состояниями (closed_loop/gnss_ins_ekf) к запускаемому сценарию с показателем качества: EKF дисциплинирует механизацию по зашумлённым измерениям ГНСС, пока есть покрытие, а затем идёт по инерции через перерыв, заменяя сброс по истине в прежнем скалярном пакете 1-DOF настоящим объединением. Результат содержит ряд объединённой горизонтальной ошибки, оцениваемый позиционный показатель качества (доступность / СКО при перерыве / holdover) и СКО свободной INS без обратной связи для сравнения; пара квантовой и классической IMU различается только истинным смещением. Передаётся из точки входа CLI/Python/wasm с примеромscenarios/gnss-ins.toml. Честная постановка: только слабая связь, одна детерминированная траектория, а объединённая ошибка при перерыве ограничена снизу ошибкой ориентации при передаче (поэтому не утверждается, что она масштабируется со смещением) — устойчивые выводы таковы: объединение превосходит автономное счисление для смещённого датчика, а датчик с меньшим смещением лучше идёт по инерции без поддержки. - Проектирование орбитальной группировки на проверенном ядре SGP4 (
src/walker.rs). Новый модульwalkerвыдаёт спроектированную схему Уокера-дельта (i: T/P/F) как средние элементы SGP4, так что синтетическая орбитальная группировка распространяется по тому же пути SGP4, проверенному до 4,12 мм по векторам AIAA 2006-6753, а не через аналитический кеплеров генератор. Поверх него:pdop_sweepсводит в таблицу покрытие и медианное/худшее PDOP по сетке проектных вариантов{planes × sats × inclination}, аcoverage_revisitсообщает долю покрытия и разрывы повторного обзора (худший/средний) в наземной точке. Проверено физическими монотонностями, которым должен подчиняться компромисс (больше спутников ⇒ выше покрытие, ниже PDOP, короче интервал повторного обзора). Отдельно в качестве фикстуры только для тестов добавлен подлинный снимок TLE Celestrakgps-ops(2021-07-28, 30 действующих спутников GPS) и по нему проверен путь «реальный TLE → SGP4 → геометрия ECEF» (вся оболочка MEO в пределах 1 %, все девять спутников в зоне видимости при PDOP 1,64) рядом с существующими путями реальных данных SP3 и RINEX. - Эффективное число степеней свободы, зависящее от типа шума, для доверительных интервалов Аллана.
allan::edf_overlapping_adevреализует замкнутые формы из таблицы 5 NIST SP 1065 (простой набор Stable32) для всех пяти канонических степенных типов шума — белый/фликкер PM, белый/фликкер FM, случайное блуждание FM — заменяя консервативный счёт неперекрывающихся отсчётов в качестве числа степеней свободы χ². Новое перечислениеPowerLawNoiseиclassify_power_lawопределяют преобладающий тип по наклону модифицированной девиации Аллана записи (MDEV отличает белый PM от фликкер-PM там, где ADEV не может), аoverlapping_adev_curveтеперь прикрепляет определённый тип шума, его edf и 95-процентную доверительную полосу к каждой точке экспортируемой кривой ADEV (AdevPointполучаетnoise/edf/ci_lo/ci_hi, аддитивно, со значениями serde по умолчанию). Проверено двумя способами: пять формул совпадают со значениями, вычисленными вручную, с точностью 1e-12, а ансамбль Монте-Карло белого FM из 4 000 записей подтверждает, что формула предсказывает фактическое edf хи-квадрат оценивателя с точностью 20 % (и что она заметно лучше консервативного счёта). Восемь новых тестов. - Стохастическая модель двусторонней передачи времени.
timetransfer::TwoWayLinkзаменяет сэмплер только с белым шумом физически обоснованной моделью: взаимная (общая для обоих направлений) задержка на трассе сокращается в оценке(m_AB - m_BA)/2(two_way_offset_estimate, так что два независимых односторонних измерения усредняются до1/sqrt(2)), а остаток — это невзаимная разностная задержка, смоделированная как цветной процесс белого FM плюс случайного блуждания FM (проверенныйClockModel), что придаёт ряду ошибки синхронизации реалистичную сигнатуру Аллана (sigma_y^2(tau) = q_rw*tau/3) вместо плоского белого шума.LinkCfgполучаетq_wf_s/q_rw_s(значение serde по умолчанию 0 ⇒ прежнее поведение только с белым шумом, бит в бит), показатель качества линии сообщаетadev_tau0(девиацию Аллана модели на базовом шаге), а сценарий/CLItimetransferих показывает. Эталонный показатель качества закреплён заново. Шесть выведенных вручную тестов (сокращение общей составляющей, двусторонний выигрыш в sqrt(2), закон RWFMtau/3через собственныйstep()линии, эквивалентность прежнему поведению приq=0, детерминизм и сквозная выдача показателя качества). - Численное соответствие Stable32 для оценивателей семейства Аллана (NBS14).
tests/allan_reference.rsпроверяет оценивателей перекрывающейся ADEV, модифицированной ADEV, девиации времени и перекрывающегося Адамара по эталонным девиациям Stable32 для канонического набора данных NBS14 (W. J. Riley, Handbook of Frequency Stability Analysis, NIST SP 1065, ~с. 107) при tau = 1, 2 с относительным допуском 1e-4 — фактическое согласие ~1e-6. Это закрепляет математику оценивателей по фактическому эталонному реализатору, а не только по собственной аналитической самосогласованности оценивателей. Используются только публичные эталонные числа; код третьих сторон не применяется. - Вертикальная диаграмма целостности Стэнфорда, экспортируемая сценарием
integrity. Запускаемый вид сценарияintegrityтеперь экспортирует вертикальную диаграмму Стэнфорда (-ESA) рядом с картой доступности HPL/VPL: для каждой защищаемой эпохи воспроизводимая выборка ошибки дальности без отказа с начальным значением через геометрию отображается в фактическую вертикальную ошибку положения и классифицируется относительно VPL и вертикального предела оповещения (Available / System-Unavailable / Misleading / Hazardously-Misleading). Диаграмма (точки по эпохам + счётчики областей) содержится в JSON результата, а число событий целостности / HMI — в сводке CLI, так что классификатор Стэнфорда, ранее доступный только в библиотеке, теперь доступен от начала до конца.IntegrityScenarioполучает полеseed(по умолчанию 0), управляющее реализацией ошибки; сама карта доступности остаётся только геометрической и не зависит от начального значения. - Бюджет риска нарушения целостности ARAIM (P_HMI) для уровней защиты.
raim::araim_raimвыводит горизонтальный и вертикальный уровни защиты из явного бюджета риска целостности, а не из фиксированного множителяK_md: для решения по всем видимым спутникам и каждого подрешения с исключением одного спутника она строит для каждой оси(prior, detection threshold, σ)по режимам, после чегоaraim_protection_levelнаходит наименьший PL, при котором суммарная вероятность опасно вводящей в заблуждение информации (araim_integrity_risk,P_HMI = Σ_k p_fault,k · Q((PL − T_k)/σ_k), Blanch et al. Baseline ARAIM) укладывается в выделенноеP_HMI. Результат сообщает риск целостности, который уровни действительно достигают, так что пользователь может явно менять целостность на предел оповещения. Шесть выведенных вручную тестов (замкнутые формы для одного режима без отказа и с порогом, суммирование/монотонность по нескольким режимам, сквозная защита без отказа, где более жёсткий в 10⁵× бюджет повышает PL, обнаружение/идентификация отказа и нижний порог избыточности для шести спутников). Одиночный отказ MHSS — базовый вариант ARAIM; одновременные отказы подмножеств из нескольких SV, режим отказа всей орбитальной группировки и проверка по эталонному набору данных gLAB описаны как расширения. - Двухскоростная компенсация конусного движения и скуллинга для бесплатформенной механизации.
inertial::mechanization::coning_sculling_compensateизвлекает высокочастотные члены конусного движения (ориентация) и вращения плюс скуллинга (скорость) из упорядоченных приращений IMU по подынтервалам грубого обновления, так чтоNavState::step_incrementsумеренной частоты воспроизводит выпрямленное вибрацией движение, которое грубый шаг по необработанным суммам упускает. Проверочный тест воспроизводит среду конусного движения и скуллинга на 10 Гц в течение 60 с и сравнивает точную высокочастотную истину, наивное грубое интегрирование и грубое интегрирование со свёрнутыми членами: свёртка снижает ошибку положения в ~18× (с метров наивного дрейфа до субдециметра), подтверждая, что члены конусного движения и скуллинга несут нагрузку. Псевдоним типаScalarErrorBudgetназывает прежнюю 1-DOFAccelModelтем, что она есть, в отличие от трёхосного навигатораNavState. - Разборщик файла наблюдений RINEX. Новый модуль
rinex_obsчитает файл наблюдений RINEX 3.0x / 4,00 — фактические измерения приёмника — дополняя пару RINEX рядом с существующим разборщиком навигационных сообщений.parse_obsдекодирует заголовок (версия/тип, спискиSYS / # / OBS TYPESпо системам с продолжением строк, приближённое положение, интервал, время первого наблюдения) и записи по каждому спутнику на каждую эпоху: псевдодальность, фазу несущей, Доплер и уровень сигнала, с ключом — кодом наблюдения RINEX 3 (C1C,L1C, …), с флагами потери захвата (LLI) и уровня сигнала (SSI); пустое поле сохраняется как отсутствующее, а не как ноль. Честные границы: это приём данных в стандартном формате (на входе настоящий журнал наблюдений RTKLIB/gLAB/станции IGS, на выходе типизированные измерения), а не движок позиционирования — здесь нет ни решения по псевдодальности, ни PPP, ни RTK. - Запись CCSDS OEM (сообщение об эфемеридах орбиты). Новый модуль
oemэкспортирует распространённую орбитальную группировку как корректное сообщение CCSDS 502.0-B OEM 2,0 — формат эфемерид KVN, который принимают GMAT, Orekit, STK и большинство средств лётной динамики.OemFile::from_propagatorsопрашивает инерциальное состояние (TEME) каждого спутника — положение и скорость, взятые прямо из пропагатора без вращения в земную систему, в отличие от экспорта SP3 — на временно́й сетке, аOemFile::to_oem_stringсериализует заголовокCCSDS_OEM_VERS/CREATION_DATE/ORIGINATORи по одному сегментуMETA_START … META_STOPна спутник (OBJECT_NAME/OBJECT_ID/CENTER_NAME/REF_FRAME = TEME/TIME_SYSTEM = GPS/START_TIME/STOP_TIME), за которым следуют строкиepoch X Y Z X_DOT Y_DOT Z_DOT(км, км/с).CREATION_DATEзадаётся вызывающим, а не берётся с системных часов, так что вывод побайтово идентичен от запуска к запуску (контракт воспроизводимости). Это аналог экспорта SP3 для ГНСС в области эфемерид космических аппаратов: орбиту Kshana теперь можно передать средству лётной динамики в стандартном формате. - Точные эфемериды SP3 как источник распространения.
Sp3File::interpolatorстроит для каждого спутникаSp3Interpolator, который заполняет положение между табличными эпохами SP3 полиномом Лагранжа 9-го порядка (стандартная практика IGS) и поворачивает его в общую систему TEME, доступную какPropagator::Sp3Precise. Файл точных орбит IGS / аналитического центра теперь может управлять тем же конвейером геометрии/видимости/целостности, что и широковещательные и аналитические пропагаторы. Проверено циклом записи и чтения: орбита Кеплера, записанная в SP3 и считанная заново через интерполятор, совпадает с исходной с субметровой точностью в узлах и < 100 м в середине интервала. Интерполяция часов — следующий шаг. - Широковещательные эфемериды ГЛОНАСС (завершают разбор навигации RINEX для нескольких ГНСС). Новый модуль
glonass: ГЛОНАСС передаёт не кеплеровы элементы, а вектор состояния в связанной с Землёй системе ПЗ-90 (положение, скорость, лунно-солнечное ускорение).parse_glonass_navчитает записи RINEX 3R, а положение спутника в любой момент получается интегрированием методом Рунге — Кутты 4-го порядка уравнений движения из ICD ГЛОНАСС (центральная гравитация +J2+ члены Кориолиса и центробежные члены вращения Земли + передаваемое ускорение). Доступно какPropagator::Glonass, так что спутники ГЛОНАСС проходят через конвейер орбитальной группировки / видимости / целостности наряду с кеплеровыми системами; один блок орбитальной группировкиrinexтеперь может смешивать GPS, Galileo, QZSS, BeiDou и ГЛОНАСС. - Навигационные данные RINEX для нескольких GNSS (GPS, Galileo, QZSS, BeiDou). Парсер навигационных файлов RINEX 3 теперь декодирует записи Galileo (
E), QZSS (J) и BeiDou (C, MEO/IGSO) наряду с GPS (G): у них общая кеплеровская структура и общий пользовательский алгоритм, и каждая система вычисляется со своей гравитационной постоянной и своей скоростью вращения Земли (μ для Galileo и BeiDou, Ω̇ₑ для BeiDou). Файл со смешанными орбитальными группировками даёт все они, и они проходят через конвейер орбитальной группировки, видимости и целостности какPropagator::Rinex. Геостационарные спутники BeiDou используют другое преобразование координат, поэтому пропускаются, пока нет эталонного набора данных для проверки. Обход записей использует число строк для каждой системы, что исправляет скрытую ошибку: четырёхстрочные записи GLONASS/SBAS пропускались как восьмистрочные. Следующей будет GLONASS (модель вектора состояния). - Чтение и запись прецизионных эфемерид SP3-c/d. Новый модуль
sp3разбирает файлы прецизионных орбит SP3 от IGS и аналитических центров (parse_sp3) — постобработанный продукт положения и хода часов в ECEF, который движки PPP (Ginan, RTKLIB, gLAB) считают эталонным — в структурированныйSp3File(заголовок, сетка эпох, положение каждого спутника км→м, ход часов мкс и скорость дм/с→м/с для продуктовV) с сохранением признаков недопустимых значений SP3. Обратное направление тоже реализовано:Sp3File::from_propagatorsстроит SP3 по распространённой орбитальной группировке (TEME→ECEF для каждой эпохи), аto_sp3_stringсериализует его, так что орбиты Kshana можно экспортировать в формате, который принимают внешние инструменты PPP, — цикл чтения и записи в обе стороны. Интерполяция по эпохам и источник SP3 для пропагатора будут следующими. - Широковещательные эфемериды RINEX как запускаемый источник орбитальной группировки. Орбитальная группировка теперь принимает встроенный блок
rinex(навигационный текст RINEX 3 для GPS) наряду с существующей опциейtle, так что реальный широковещательный файл целиком управляет сценарием из CLI, Python или встроенной в браузер песочницы: на входе RINEX, на выходе геометрия PNT. Новыйscenarios/orbit-rinex.tomlдемонстрирует доступность GNSS и DOP для восьми спутников GPS, построенных непосредственно по широковещательным записям. (Только GPS LNAV; несколько GNSS и SP3 будут следующими.) - Широковещательные эфемериды RINEX как источник распространения орбиты. Разобранный
RinexEphemerisтеперь преобразуется вorbit::Propagator(Propagator::Rinex): положение — это широковещательная орбита по IS-GPS-200, повёрнутая из ECEF в общую инерциальную систему TEME (sv_position_teme, с корректным учётом високосных секунд при переходе от времени GPS к UT1), скорость получена центральной конечной разностью, а также вычисляется кеплеровский период обращения. Реальные широковещательные данные GPS теперь могут управлять тем же конвейером геометрии, видимости и целостности (RAIM), что и аналитические пропагаторы SGP4/Кеплера. (Пока не открыто как вид сценария на основе файла RINEX — это, а также несколько GNSS и SP3 будут следующими.)
0.9.2 - 2026-06-03#
Добавлено#
- Архивный DOI. Релизы теперь депонируются в Zenodo, и им присваивается DOI, на который можно ссылаться.
0.9.1 - 2026-06-03#
Изменено#
- Документация. README доведён до институционального уровня: обзор возможностей полного стека v0.9.0, раздел «Версии и релизы», аккуратный заголовок с новым знаком и краткая строка состояния. Движок не изменялся.
0.9.0 - 2026-06-03#
Этот релиз добавляет три существенные области возможностей поверх основы SGP4 версии 0.8.0: настоящую трёхосную бесплатформенную INS, слабосвязанный EKF GNSS/INS по вектору ошибок с замкнутой обратной связью, настоящий RAIM по моментальному снимку и по разделению решений (в стиле ARAIM) с HPL/VPL и запускаемым сценарием integrity, а также первый шаг к совместимости форматов GNSS (приём эфемерид GPS в формате RINEX-3).
Добавлено#
- Парсер навигационных сообщений GPS в формате RINEX 3 (
src/rinex.rs). Первый шаг к совместимости форматов GNSS:parse_navчитает навигационный файл RINEX 3.x и декодирует каждую запись широковещательных эфемерид GPS (G) — восьмистрочный блок SV/эпоха +BROADCAST ORBIT— вRinexEphemerisс кеплеровскими элементами и поправками часов; имена полей и единицы соответствуют IS-GPS-200. Обрабатывает формат чисел Fortran с экспонентойD(parse_d) и расположение по столбцам фиксированной ширины; записи не-GPS-систем пропускаются, а не отклоняются, так что файл со смешанным содержимым всё равно даёт свои эфемериды GPS. Четыре теста: разбор числа с экспонентойD(включая пробелы и ошибки), полностью декодированная запись, проверенная по известным значениям полей, с проверкой правдоподобия большой полуоси GPS (√A² ≈ 26 560 км), пропуск не-GPS и случай пустого файла. - Широковещательные эфемериды GPS → положение в ECEF (
src/rinex.rs).RinexEphemeris::sv_position_ecef(t_tow)вычисляет положение спутника в Земной системе координат по разобранным эфемеридам с помощью пользовательского алгоритма IS-GPS-200 §20.3.3.4.3.1: решение уравнения Кеплера методом Ньютона для эксцентрической аномалии, поправки второй гармоники к аргументу широты, радиусу и наклонению и поворот в ECEF с учётом вращения Земли с опорной эпохи (сμиΩ̇ₑдля GPS, предписанными спецификацией, и сворачиваниемtkпри переходе через границу недели). Три теста: геоцентрический радиус остаётся в пределах диапазона GPS (≈ 26 560 км), скорость в Земной системе координат составляет около 3,9 км/с, а вычисление на ровно неделю вперёд воспроизводит то же положение. - Смещение часов спутника GPS с релятивистской поправкой (
src/rinex.rs).RinexEphemeris::sv_clock_bias_s(t_tow)вычисляет широковещательный полином часовaf0 + af1·Δt + af2·Δt²относительноTocплюс релятивистский эксцентриситетный членF·e·√A·sin Ek(IS-GPS-200 §20.3.3.3.3.1). НовыйEpochUtc::gps_time_of_weekпереводит календарную эпоху записи во время недели GPS через арифметику юлианских дней от эпохи GPS (1980-01-06), а решение уравнения Кеплера используется совместно с вычислением положения. Тесты: время недели GPS для воскресенья, вторника и субботы (границы недель) и смещение часов, в котором преобладает af0, при наличии ограниченного релятивистского члена. Групповая задержка L1TGDдоступна, но намеренно не учитывается. Честные границы применимости: источникPropagator, Galileo/BeiDou/GLONASS и SP3 остаются следующими шагами. (docs/CAPABILITY.mdобновлён соответственно.) - Запускаемый пользователем вид сценария
integrity(scenarios/integrity-raim.toml). Возможность оценки доступности RAIM теперь доступна из CLI/TOML, как и любой другой пакет:kind = "integrity"разбираетIntegrityScenario(орбита пользователя, одна или несколько орбитальных группировок GNSS, маска возвышения и конфигурация целостности(sigma, P_fa, P_md, AL_H, AL_V)), запускаетconstellation_raim_availabilityи выдаёт карту доступности HPL/VPL по эпохам в JSON, а также самодостаточный SVG — уровни защиты во времени относительно пределов тревоги с зелёной и красной полосой доступности.kshana scenarios/integrity-raim.tomlзаписывает JSON, диаграмму и отчёт в HTML. Встроенный сценарий (24 спутника Уокера, двухчастотные измерения дальности с погрешностью 1 м, пределы APV-I) показывает доступность около 95 %; в нём указано, что одночастотный RAIM не выполняет вертикальный предел APV-I на одной орбитальной группировке, поэтому для вертикального наведения применяются SBAS, двухчастотные измерения и ARAIM. Тесты охватывают диспетчеризацию, JSON карты доступности и SVG. - Запускаемая оценка доступности RAIM для орбитальной группировки (
src/raim.rs). У модуля целостности не было вызывающего кода —constellation_raim_availabilityделает его настоящей сквозной точкой входа: в каждую эпоху на временной сетке он распространяет видимые спутники (теми же пропагаторамиPropagatorSGP4/Кеплера, которые использует движок), вычисляет уровни защиты для безотказного режима и оценивает доступность относительно горизонтального и вертикального пределов тревоги, возвращаяRaimAvailabilityReport, сериализуемый черезserde(для каждой эпохиn_visible/HPL/VPL/availableплюс доля доступности).RaimConfigобъединяет(sigma, P_fa, P_md, AL_H, AL_V), а покомпонентная функцияraim_availability_epochоткрыта для вызывающих, которые сами определяют геометрию. Три теста: эпоха, признанная доступной по пределам APV-I на геометрии из десяти спутников; она же, признанная недоступной при заведомо слишком жёстком пределе; уровниNoneпри числе спутников менее пяти; и сквозной прогон по орбитальной группировке Уокера из 24 спутников, который даёт конечную карту доступности и сериализуется. (Шесть спутников — нижний предел избыточности для остаточного RAIM — честно говоря, не удовлетворяют APV-I даже при погрешности дальности 1 м; для доступности APV-I нужна более плотная геометрия, которую использует тест.) - Накопитель диаграммы целостности Стэнфорда (-ESA) (
src/raim.rs). Стандартный способ обобщить работу монитора целостности по многим эпохам: он отображает фактическую ошибку положения (x) относительно уровня защиты (y) и классифицирует каждую эпоху по диагоналиy = xи пределу тревоги какAvailable(PL ограничивает ошибку, в пределах AL),SystemUnavailable(PL ограничивает ошибку, но превышает AL — безопасно, но непригодно),MisleadingInformation(PL < ошибка ≤ AL) илиHazardouslyMisleadingInformation(PL < ошибка и ошибка > AL — опасный отказ).classify_stanford— чистый классификатор;StanfordDiagramнакапливает точки(error, PL)относительно фиксированного предела тревоги, предоставляя счётчики областей, доступность, итоги событий целостности и точки, сериализуемые черезserde, для построения графиков и экспорта в JSON. Четыре теста: каждая область (включая граничный случай ограниченияerror == PL), накопление счётчиков и доступности и прохождение JSON туда и обратно. Это поверхность отчётности для уровней защиты RAIM; подключение к сценарию орбитальной группировки и проверка по общедоступному набору данных остаются пунктами дорожной карты. - RAIM по разделению решений (в стиле ARAIM) (
src/raim.rs). Монитор целостности по множеству гипотез наряду с существующим остаточным (паритетным) тестом хи-квадратsnapshot_raim. Для решения по всем спутникам в зоне видимости методом наименьших квадратов и для каждого частного решения с исключением одного спутника он формирует разность решенийΔ_k = x_k − x₀— гауссову с нулевым средним при отсутствии отказа, с ковариациейCov(x_k) − Cov(x₀)(тождество вложенных оценок, справедливое, поскольку решение по всем спутникам в зоне видимости является BLUE) — и поэтому как обнаруживает отказ, так и определяет отказавший спутник (тот, исключение которого даёт наибольшую нормированную разность). Горизонтальные и вертикальные уровни защиты следуют стандартному распределению MHSSPL = max(K_md·σ₀, max_k[K_fa·σ_ss,k + K_md·σ_k]), гдеK_fa = Φ⁻¹(1−P_fa/2),K_md = Φ⁻¹(1−P_md). Новая функцияnormal_cdf/normal_quantileбез зависимостей построена на уже имеющейся в модуле регуляризованной неполной гамма-функции (erf(x) = P(½,x²)). Четыре теста с выводом вручную: нормальная функция распределения и квантиль по справочным значениям (Φ(1,95996)=0,975, хвост 1e-7 = 5,1993, симметрия); геометрия без отказов, которая не вызывает тревоги и даёт конечные положительные HPL/VPL; смещение одного спутника на 60 σ, которое обнаруживается и верно определяется (excluded_sv == 2); и нижний предел избыточности для шести спутников. Закрывает на стороне алгоритма пробел P0 аудита «тавтологическая целостность — нет настоящих RAIM/HPL/VPL»; проверка по набору данных gLAB и накопитель диаграммы Стэнфорда остаются пунктами дорожной карты. - Интеграция GNSS/INS с замкнутой обратной связью (
src/fusion/closed_loop.rs).ClosedLoopInsGnssсвязывает ядро EKF по вектору ошибок с трёхосной бесплатформенной механизацией: каждый отсчёт IMU корректируется текущими оценками смещений, механизируется вперёд, а ковариация EKF продвигается во времени с соответствующим навигационным контекстом; каждая фиксация положения и скорости по GNSS формирует инновацию INS−GNSS и возвращает оценённые положение, скорость, ошибку ориентации (ψ, как поворот кватерниона) и смещения акселерометров и гироскопов в решение, сбрасывая среднее значение вектора ошибок. Обратная связь по ориентации (а не только по смещениям) необходима для устойчивости: наклон и смещение акселерометра образуют связанную пару, так что коррекция одного без другого приводит к расходимости. INS и GNSS сравниваются в локальной касательной плоскости в системе NED с использованием собственных радиусов кривизны механизации (новаяmechanization::radii_of_curvature; открытыNavState::omega_ie_n/omega_en_n). Это честная замена сбросу по истинному значению в гибридном пакете. Три теста: замкнутый контур, сводящий введённую ошибку положения 8 м / −5 м к значению менее 0,1 м; решение с коррекцией, остающееся в пределах метров (менее 6 м) на траектории движения автомобиля, тогда как свободно работающая INS расходится более чем на 100 м; и контрольный тест: среднеквадратичное положение объединённого решения по Монте-Карло на 60-секундном перерыве GNSS лучше, чем у некорректируемого разомкнутого счисления пути, более чем в 2 раза (≈4 раза по разным начальным значениям). Честное ограничение, описанное в модуле: в слабосвязанном режиме смещение акселерометра и наклон разделяются лишь слабо (оба связаны через силу тяжести), поэтому полезный результат — ограниченное, скорректированное состояние и чистый вход в перерыв, а не точная инерциальная калибровка; более сложная динамика и тесносвязанное расширение остаются пунктами дорожной карты. - Ядро слабосвязанного EKF GNSS/INS по вектору ошибок (
src/fusion/gnss_ins_ekf.rs). Расширенный фильтр Калмана по вектору ошибок с 15 состояниями —δx = [δp, δv, ψ, b_a, b_g]— с динамикой ошибок бесплатформенной системы по Groves 2013 §14,2 (связь удельной силы и наклона, Кориолис, проекция смещений из связанной системы в навигационную, модели смещений Гаусса–Маркова), дискретным переходом первого порядкаΦ = I + F·dtи слабосвязанным обновлением по положению и скорости (H = [I₃ 0 0 0 0; 0 I₃ 0 0 0]) в форме Джозефа. Плотная линейная алгебра без зависимостей (обращение по Гауссу–Жордану, обновление ковариации по Джозефу). Функция cargotight_couplingзакрывает документированное, но ещё не реализованное обновление по псевдодальности и Доплеру. 7 тестов с ожидаемыми значениями, выведенными вручную: тождество косого и векторного произведения, проверенное обращение матрицы 3×3, ковариация, остающаяся симметричной и положительно полуопределённой при предсказании (и рост неопределённости положения без коррекции), фиксация положения, уменьшающая ковариацию положения, точное восстановление известной ошибки положения при аналитическом коэффициенте усиления КалманаP/(P+R)и меньшие поправки при большем шуме измерений. Это ядро, которое заменит разомкнутый сброс по истинному значению в гибридном пакете замкнутой обратной связью (подключение пакета и проверка по NaveGo последуют). - Детерминированная модель ошибок IMU для 3-осевого бесплатформенного навигатора (
src/inertial/imu_errors.rs).ImuErrorModelискажает истинную пару(ω, f)в связанной системе до измеренной через пять систематических категорий (IEEE Std 952-1997 §A.2; Groves 2013 §4,3, таблица 4,1): масштабный коэффициент (ошибка усиления по каждой оси в ppm), неточность установки / перекрёстная связь (неортогональность триады вне диагонали), чувствительность к ускорению (смещение скорости гироскопа, пропорциональное удельной силе), квантование (округление до младшего разряда выхода) и линейный дрейф скорости (дрейф, линейный по времени, — третья область Аллана), а также постоянное смещение при включении. Каждый член по умолчанию равен нулю, поэтомуImuErrorModel::ideal()— прозрачный сквозной проход, и существующие сценарии не затрагиваются. Для каждого источника ошибки есть изолирующий тест (линейность масштаба с точностью до 0,01%, перекрёстная ось неточности установки выше уровня VRW, смещение от чувствительности к ускорению, сетка младшего разряда, линейный дрейф), а сквозной тест вызывает навигационную ошибку в механизации от искажённого IMU. Не моделируются: ошибка выпрямления вибраций, дрейф от градиента температуры. (Поставляемый пакет сценариевinertialпо-прежнему использует прежний скалярный бюджет 1-DOF; эта модель питает 3-осевую библиотеку.) - Компенсация конусного и скуллинг-движения для бесплатформенного интегратора. В тракт ориентации добавляется двухотсчётное приращение
coning_increment(½ Δθ_prev × Δθ_cur); интегрирование конусного движения на частоте 5 Гц с грубой частотой 30 Гц (5 отсчётов на цикл) по проверке следует за точным эталоном с частой выборкой лучше как минимум в 3 раза с поправкой, чем при наивном суммировании приращений. В тракт скорости добавляетсяsculling_increment(½ Δθ × Δv, уравнение Groves 5,82), а приращение скорости в связанной системе разрешается с помощью нового обновления по приращениямNavState::step_incrementsс использованием вращения относительно корпусаΔθ_rel = Δθ_b − C_n^b ζ, так что платформа, неподвижная относительно Земли, не получает ложного скуллинга, а реальная вибрация вызывает полный член. - Полная трёхосная бесплатформенная механизация в системе NED (
src/inertial/mechanization.rs).NavState { q, v_ned, p_llh }продвигается с помощьюstep(gyro_b, accel_f_b, dt)по стандартным уравнениям NED в земной системе координат (Groves §5,4): ориентация из связанной системы в NED, скорректированная на угловую скорость системы навигации относительно инерциальнойω_in = ω_ie + ω_en(вращение Земли + транспортная скорость); удельная сила, разрешённая из связанной системы в NED через DCM; скорость, интегрирующаяv̇ = f_n − (2 ω_ie + ω_en) × v + g_n(Кориолис, транспортная скорость и сила тяжести); и геодезическое положение через меридианный и поперечный радиусы кривизны. Сила тяжести — это замкнутая формула Сомильяны WGS-84 для нормальной силы тяжести (отвеса) с поправкой NIMA на высоту в свободном воздухе — никогда не жёстко заданная константа. Это настоящий трёхосный навигатор, заменяющий скалярный путь 1-DOF бюджета ошибок. Проверено по физическим инвариантам: платформа, жёстко закреплённая на вращающейся Земле на 45° с. ш. (воспринимает скорость вращения Земли + 1 g), остаётся в пределах 1 мм за 60 с; горизонтальная удельная сила в северном направлении даётv_N ≈ a·tи смещение½ a t²; нормальная сила тяжести соответствует известным значениям на поверхности на экваторе, полюсе и 45° и градиенту в свободном воздухе. - Представление трёхосной ориентации для бесплатформенной INS (
src/inertial/attitude.rs). Тип единичного кватернионаQuaternion(скаляр первым, соглашение Гамильтона), несущий поворот из связанной системы в навигационную, с представлением DCM (to_dcm/from_dcmпо методу Шепперда), произведением Гамильтона, конструкторами по оси и углу и по вектору поворота (точное экспоненциальное отображение) и кинематикой кватерниона — как с обновлением скорости вращения методом РК первого порядка (q̇ = ½ q ⊗ ω), так и с обновлением вектора поворота с поправкой на конусное движение. Двухотсчётное приращениеconing_increment(Savage / Bryan–Lewantowski,½ Δθ_prev × Δθ_cur) даёт член перекрёстной связи скоростей вращения, которого нет в скалярном счислении пути. Это основа ориентации для полной 3-осевой механизации, заменяющей прежний путь 1-DOF бюджета ошибок. Проверено по замкнутым формулам поворотов: распространение с постоянной скоростью совпадает с кватернионом «ось—угол» с точностью до 1e-6, DCM ортонормированы с единичным определителем, а конусное движение исчезает при движении по одной оси. (src/inertial.rsтеперь — каталог модуляsrc/inertial/; публичный путьcrate::inertialне изменился.) - Геодезически корректная видимость наземной станции (
src/frames.rs).elevation,is_visibleиvisible_countвычисляют возвышение спутника над горизонтом наземной станции относительно нормали к эллипсоиду WGS-84 (истинной местной вертикали), а не геоцентрического радиуса: они различаются на геодезическое отклонение до ~0,19°, чего достаточно, чтобы спутники у горизонта попадали под маску возвышения или выпадали из неё. Проверено сквозным образом (орбитальная группировка Уокера распространена, повёрнута из TEME в ECEF и подсчитана с геодезической точки) и по геоцентрическому приближению.
Изменено#
- Надёжность CI. Задание
test-python-bindingsтеперь собирает wheel с помощьюPyO3/maturin-action(контейнер manylinux) вместо обычногоmaturin buildна хосте, что устраняет периодический конфликт rustuprustfmt-preview/cargo-fmtна образе раннера. Заданиеdenyустанавливаетcargo-denyкак готовый двоичный файл черезtaiki-e/install-actionвместоcargo-deny-actionна основе Docker, что устраняет тайм-аут загрузки из реестра Docker Hub. Ни одно из изменений не влияет на выполняемые проверки.
0.8.0 - 2026-06-02#
Добавлено#
Инерциальная скорость теперь доступна нижестоящим компонентам.
Propagator::velocity_eciиPropagator::state_eci(возвращаетStateEci { r_m, v_m_s }) передают вызывающему коду в м/с аналитическую скорость TEME, которую SGP4 уже вычисляет, но которая прежде отбрасывалась;Orbit::velocity_eciдаёт кеплеровскому пути согласованную скорость. Тест проверки AIAA 2006-6753 теперь проверяет и скорость для каждой опорной строки (наибольшая ошибка скорости 1.85e-9 км/с по всем 666 состояниям) и фиксирует число сравниваемых строк ровно на 666.Более строгий разбор TLE без паник. Строки обязаны быть в ASCII и нарезаются безопасно (больше нет паник из-за индекса байтов при многобайтовом вводе); элементы проверяются по диапазонам (наклонение, эксцентриситет, среднее движение); контрольную сумму в столбце 69 можно принудительно проверять через
ParseOpts { strict_checksum }/parse_propagators_optsи новый флагstrict_checksumвConstellationCfg(по умолчанию проверка мягкая).Кривая девиации Аллана в выходных данных. Каждый прогон часов теперь сообщает
adev_curve([{tau_s, adev, n_samples}]), а браузерная песочница строит двойной логарифмический график «Стабильность часов (ADEV)».Проверка входной временной сетки.
TimeCfg::validateотклоняет нечисловую, нулевую, отрицательную или слишком большую временную сетку (шаг больше длительности или болееMAX_TIME_STEPSотсчётов) до какого-либо выделения памяти, так что некорректный сценарий возвращает ошибку, а не вызывает панику или исчерпание памяти.Ансамбли Монте-Карло для инерциального пакета.
runs = Nдля инерциального сценария запускает N начальных значений и сообщает для каждой метрики среднее, стандартное отклонение, процентили и доверительный интервал 95% по процентильному бутстрэпу (ensemble). Каждый инерциальный прогон теперь несёт флагmonte_carlo, чтобы показатель качества по одной реализации не принимали за распределение. (CEP/2DRMS намеренно не сообщаются — для них требуется 3-осевая модель из дорожной карты.)Пошаговый режим песочницы. Браузерная песочница больше не бросает вас в сплошной TOML: полоса «Начните здесь» с карточками сценариев в один щелчок загружает и запускает готовый пример, ползунки открывают универсальные параметры (начальное значение seed, порог синхронизации времени) без правки TOML, пояснение «Как читать результат» объясняет результат, а полный TOML сворачивается и разворачивается одним щелчком. Каждым прогоном можно поделиться — Копировать ссылку для обмена кодирует весь сценарий во фрагмент URL (ничего не загружается), так что ссылка воспроизводит точно такой же прогон при открытии. Кодек покрыт модульными тестами (
web/share.test.mjs, выполняются в CI).N-мерные переборы параметров (
src/sweep.rs).nd_sweepвычисляет метрику по полному декартову произведению нескольких диапазоновSweepAxis(исследование компромиссов по нескольким параметрам) в порядке по строкам, детерминированно. Это дополнение — существующий API 1-D перебора не изменился. Доверительные интервалы бутстрэпа для каждого узла и обобщение за пределы пакета часов остаются в дорожной карте.Настоящий RAIM по моментальному снимку (
src/raim.rs). Подлинный автономный контроль целостности приёмника в области положения: он строит геометрию линий визирования на видимые спутники, формирует решение методом наименьших квадратов и остатки, выполняет тест обнаружения отказа по остаткам χ² (точный порог из неполной гамма-функции χ² и нецентрального χ² без зависимостей) и вычисляет горизонтальный и вертикальный уровни защиты (HPL/VPL) на основе наклона со смещением пропуска обнаружения, выведенным для заданных P_fa/P_md. Он отличается от показателя целостности, основанного на самосогласованности фильтра в конвейере сценариев, и пока не подключён к нему; исключение отказов, бюджетирование предела тревоги и P_HMI и ARAIM остаются в дорожной карте.Набор показателей стабильности частоты: MDEV, TDEV, HDEV + доверительные интервалы (
src/allan.rs). Наряду с перекрывающейся ADEV: модифицированная девиация Аллана (разделяет белый и фликкерный фазовые шумы), девиация времени (TDEV = tau/sqrt(3) * MDEV) и девиация Адамара (точно подавляет линейный дрейф частоты и сходится для расходящихся типов красного шума). Доверительные интервалы на основе χ² (deviation_ci) используют пару квантилей нормального распределения и χ² без зависимостей (Acklam + Wilson-Hilferty) с консервативным неперекрывающимся edf; edf для конкретных типов шума и числовое соответствие Stable32 остаются в дорожной карте.Приведение систем отсчёта (
src/frames.rs). Поворот TEME↔ECEF на основе GMST (с тем же звёздным временем IAU-1982, что и в пропагаторе), точное преобразование геодезических координат WGS-84 в ECEF и обратно с итерационным обратным преобразованием с начальным приближением Боуринга (машинная точность на всех высотах, включая MEO/GEO) и геодезический наблюдатель на наземной станции, возвращающий азимут, возвышение и дальность в местной системе «восток—север—вверх». Движение полюса и субугловосекундная нутация не применяются (только GMST, субкилометровая погрешность на трассе подспутниковой точки); точная цепочка CIO для ITRF есть в дорожной карте.Основа шкал времени (
src/timescales.rs). API юлианских дат без зависимостей (григорианский календарь ↔ JD, MJD), полная история целых високосных секунд IERS (UTC↔TAI, 10 с в 1972 году и 37 с с 2017 года), определённое смещение TAI→TT, поправка UT1 через заданную DUT1 и угол вращения Земли по IAU-2000. Это временная основа, на которой строится приведение к земной системе координат (запланировано). Моменты времени — юлианские даты одинарной точностиf64(разрешение ~50 мкс вблизи текущей эпохи; двухчастная JD есть в дорожной карте), а эпоха «резиновой секунды» до 1972 года не моделируется — оба ограничения описаны в модуле.Воспроизводимость и происхождение. Детерминированный генератор CycloneDX SBOM (
scripts/gen-sbom.sh) и аттестация происхождения сборки SLSA для двоичного файла релиза и SBOM; набор инструментов релиза зафиксирован в соответствии с CI. Гарантии детерминированности, оговорка оlibmдля разных платформ и подход с фиксацией эталонных значений описаны вdocs/REPRODUCIBILITY.md.Тесты на основе свойств и фаззинг-тесты (
tests/property.rs). Детерминированные рандомизированные тесты (без новых зависимостей) проверяют инварианты на тысячах входных данных: парсеры TLE и сценариев никогда не паникуют на мусоре, не-ASCII, изменённых или усечённых данных;TimeCfg::validateникогда не паникует на сетках с NaN/inf/отрицательными значениями; контрольная сумма TLE согласована и охватывает только столбец 69; преобразования геодезических координат ↔ ECEF обратимы, а поворот TEME→ECEF сохраняет норму по всему земному шару и в широком диапазоне высот.
Изменено#
- Эталонные тесты теперь фиксируют показатели качества поле за полем для четырёх опорных сценариев (с допуском, поглощающим межплатформенный разброс
libm), заменяя прежние проверки только неравенств, так что тихая численная регрессия обнаруживается сразу. schema_versionв артефактах результатов повышен с0.1до0.7(он был заморожен, пока движок развивался).cargo-denyтеперь отклоняет (а не предупреждает о) снятые с публикации (yanked) зависимости.- Новые документы:
CAPABILITY.md(карта границ применимости),SCHEMA.md(справочник полей результата),INTEGRITY.md,QUANTUM-MODELS.md,REAL_TLE_GUIDE.md. Защита в CI завершается ошибкой, если версия на значке в README расходится сCargo.toml.
0.7.0 - 2026-06-02#
Добавлено#
- Распространение орбит SGP4/SDP4. Полная реализация стандартного пропагатора упрощённых возмущений без зависимостей — SGP4 для околоземных орбит вместе с расширением SDP4 для дальнего космоса (лунно-солнечные вековые и периодические возмущения и геопотенциальный резонанс 12 ч / 24 ч). Она проверена по официальным проверочным векторам AIAA 2006-6753 («Revisiting Spacetrack Report #3»): все 666 опорных состояний для околоземного, дальнего космоса, резонансного случаев и случаев кодов ошибок совпадают с наихудшей ошибкой положения около 4 мм. Именно относительно этой модели определяются двухстрочные наборы элементов, поэтому она представляет реальные орбитальные группировки — прежде всего орбиты GNSS с периодом около 12 ч, которые относятся к дальнему космосу и резонансны и которые прежняя модель двух тел с вековым J2 описать не может.
- Орбитальная группировка, заданная полными двухстрочными наборами элементов (строка 1 + строка 2), теперь распространяется с SGP4/SDP4; орбитальная группировка, заданная элементами только из строки 2, сохраняет аналитическое кеплеровское распространение двух тел без изменений. Обе формы можно смешивать в одном блоке. Новый опорный сценарий
orbit-sgp4-gps.toml(орбитальная группировка MEO типа GPS в реальном двухстрочном формате, распространяемая с SGP4) — подставьте актуальный набор «gps-ops» с Celestrak, чтобы изучать действующую орбитальную группировку.
0.6.0 - 2026-06-02#
Добавлено#
- Демонстратор активной атаки спуфинга. Новый вид сценария
spoofвводит нарастающий ложный сдвиг времени (спуфинг) и запускает для каждых часов монитор целостности с поддержкой часов, сообщая, обнаружен ли спуфинг и когда, и достигает ли он эксплуатационной спецификации необнаруженным, — превращая показатель качества «Безопасность» в конкретную демонстрацию атаки и защиты. Новый опорный сценарийspoof-attack.toml. - Доступность для нескольких орбитальных группировок. Сценарий орбиты может объединять несколько орбитальных группировок (список
[[constellations]]наряду с основной[constellation]) для расчёта доступности нескольких GNSS и геометрического фактора DOP (ухудшение точности) — например, GPS плюс Galileo. Новый опорный сценарийorbit-multignss.toml.
0.5.0 - 2026-06-02#
Добавлено#
- Отчёт-карточка в HTML. Каждый прогон теперь дополнительно создаёт самодостаточную фирменную карточку результатов в HTML — однострочное резюме, диаграмму (встроенную как неактивное изображение data-URI) и полный JSON, — которую CLI записывает рядом с JSON и SVG. Передаваемый из рук в руки одиночный файл для результата исследования или приложения.
- Совместный оценщик слияния датчиков. Новый вид сценария
fusionзапускает один рекурсивный фильтр Калмана как навигационное решение — объединяя состояние часов[phase, frequency]и состояние положения[position, velocity], поддерживаемый GNSS (оценивая смещение частоты и скорость) и дополняемый оптической передачей времени во время перерыва, — вместо составления независимых предсказателей. Он сообщает объединённое удержание времени и положения (holdover) и целостность по совместной ковариации. Новый опорный сценарийfusion-pnt.toml. - Более полная модель шума IMU. Акселерометр теперь моделирует остальные члены дисперсии Аллана помимо постоянного смещения и случайного блуждания скорости: нестабильность смещения (фликкерный уровень 1/f при стандартном коэффициенте нестабильности смещения по Аллану, с повторным использованием синтеза фликкерного шума часов) и случайное блуждание ускорения. Новые необязательные поля инерциального сценария
bias_instabilityиq_aa; повторная фиксация по GNSS перекалибровывает остаточный дрейф смещения. - Реальная геометрия орбитальной группировки по TLE. Орбитальную группировку можно задать блоком двухстрочных наборов элементов (стандартный формат NORAD/Celestrak) через поле
tle, так что доступность и геометрический фактор DOP (ухудшение точности) используют опубликованную геометрию реальной орбитальной группировки вместо синтетической схемы Уокера. Движок читает средние кеплеровские элементы каждого TLE и распространяет их как задачу двух тел, а не SGP4, что корректно для исследования моментального снимка от общей эпохи. Новый опорный сценарийorbit-real-tle.toml.
0.4.0 - 2026-06-02#
Добавлено#
- Перебор параметров для исследования компромиссов. Новый вид сценария
sweepизменяет один параметр (threshold_ns,duration_s,quantum_q_wfилиclassical_q_wf) в линейном или логарифмическом диапазоне и записывает выбранный показатель качества в каждой точке для обоих часов, получая сравнительную диаграмму «как holdover зависит от стабильности часов?», необходимую для проектного компромисса. Новый опорный сценарийsweep-clock-stability.toml. - Доверительные полосы Монте-Карло. Сценарий удержания времени часами (holdover) может выполнять много реализаций (новое необязательное поле
runs): тогда каждый показатель качества сообщается как среднее с разбросом между 5-м и 95-м процентилями, а диаграмма затеняет огибающую ошибки 5–95% вокруг медианы для каждых часов. По умолчанию остаётся один прогон. Новый опорный сценарийclock-ensemble.toml. - Эллиптические орбиты и дрейф J2. Тип орбиты теперь — полная кеплеровская орбита (большая полуось, эксцентриситет, наклонение, RAAN, аргумент перигея, средняя аномалия), распространяемая решением уравнения Кеплера, с необязательными вековой прецессией узла и апсид из-за J2. Новые необязательные поля сценария
eccentricity,argp_degиj2и опорный сценарийorbit-molniya.toml(пользователь на сильно вытянутой орбите с критическим наклонением и периодом 12 ч). Круговые орбиты сохраняют исходный путь по замкнутой формуле с побитовой точностью. - Гибридный пакет (комбинированный PNT) теперь сообщает целостность и безопасность, так что все четыре пакета охватывают полный набор эксплуатационных показателей качества. Целостность — это удержание ошибки в защитных границах канала времени от оценщика Калмана, подстраиваемого под истинное значение, пока GNSS в норме, и вновь привязываемого (менее жёстко) при каждой оптической повторной синхронизации; его граница включает шумовой уровень измерений линии связи, так что часы, намного лучшие, чем линия связи, оцениваются по реальному шуму выданного решения. Безопасность — это оценка обнаружения спуфинга с поддержкой часов относительно спецификации времени.
Изменено#
- Примечания к релизу теперь формируются из подготовленного раздела CHANGELOG для тега (
scripts/changelog-extract.sh), так что каждый релиз на GitHub выделяет, что изменилось, вместо перечня необработанных коммитов.
0.3.0 - 2026-06-02#
Добавлено#
- Показатель качества «Безопасность» (ранее не заполнявшийся): оценка обнаружения спуфинга с поддержкой часов для пакетов удержания времени часами и орбит. Он моделирует монитор целостности, который сверяет время, полученное по GNSS, с собственным предсказанием часов в режиме удержания за когерентное окно; порог обнаружения объединяет усреднённый шум измерений и неопределённость удержания часов, так что более тихие часы обнаруживают меньшие и более медленные подмены времени. Оценка выдаётся в
[0, 1]относительно спецификации времени, завершая шесть эксплуатационных показателей качества. - Точность положения на основе геометрии для орбитального пакета: по геометрии линий визирования на видимые спутники он формирует матрицу плана и её ковариационный множитель
Q = (HᵀH)⁻¹, получая коэффициенты геометрического фактора DOP (GDOP/PDOP/HDOP/VDOP/TDOP). Точность положения — это DOP положения, умноженный на настраиваемую эквивалентную пользовательскую ошибку дальности (новое необязательное поле сценарияsigma_uere_m). Результат орбиты теперь содержит сводку по геометрии (доля отсчётов с решением, наилучший и медианный PDOP и сигма положения). - Песочница в браузере (
web/), которая выполняет движок на стороне клиента как WebAssembly: выберите опорный сценарий или отредактируйте TOML, запустите его и смотрите сводку, диаграмму и полный JSON, ничего не загружая. Рабочий процессpagesсобирает и публикует её на GitHub Pages, а новый экспорт WebAssemblysummaryобеспечивает вывод показаний. - Подписанные оси y на диаграммах SVG: линии сетки, числовые подписи делений и заголовок оси с единицами (через общий вспомогательный
chart), чтобы величины читались. - Рабочий процесс публикации пакетов (
publish) для crates.io, PyPI и npm, каждый из которых зависит от токена своего реестра и запускается опубликованным релизом.
0.2.0 - 2026-06-02#
Добавлено#
- Фликкерный (1/f) FM-уровень для модели ошибок часов, синтезируемый как сумма процессов Орнштейна–Уленбека с логарифмически разнесёнными параметрами и откалиброванный так, чтобы плоский уровень девиации Аллана находился на настраиваемом значении. По умолчанию выключен; включается для каждых часов необязательным полем сценария
flicker_floor. - Канал гироскопа для инерциальной модели: остаточное смещение гироскопа и угловое случайное блуждание создают ошибку ориентации (наклона), которая передаёт силу тяжести в горизонтальную ошибку удельной силы, — главный механизм роста ошибки бесплатформенной системы. По умолчанию выключен; включается для каждого датчика необязательными полями
gyro_biasиq_arw. - Двухсостояниевый (фаза, частота) оценщик часов на основе фильтра Калмана с точной дискретизацией шума процесса по ван Лоану. Движение по инерции из известного состояния в точности воспроизводит аналитический рост ошибки удержания времени (
q_wf*T + q_rw*T^3/3), а фильтр дополнительно даёт онлайновую границу неопределённости 1 сигма. - Прогон часов теперь сообщает показатель качества «Целостность» (ранее не заполнявшийся): долю отсчётов перерыва, в которых ошибка остаётся внутри защитной границы 3 сигма фильтра; показатель выводится в результате JSON и в сводке CLI.
- Доступность GNSS на основе геометрии: распространение круговых орбит, генератор орбитальной группировки Уокера-дельта и видимость по линии визирования (затенение Землёй плюс маска возвышения) дают временную шкалу доступности по реальной орбитальной геометрии. Новый вид сценария
orbitи опорный сценарийorbit-gnss-challenged.toml(космический аппарат внутри оболочки GNSS с прерывистым покрытием). - Необязательное расширение для Python (PyO3, abi3), предоставляющее
run,run_fullиversion, упакованное с maturin (pyproject.toml) и собираемое для Linux, macOS и Windows рабочим процессомwheelsпо тегу релиза. Привязка — необязательная зависимость, включаемая функцией: сборка по умолчанию, тесты и проверка зависимостей не затрагиваются. - Необязательный модуль WebAssembly (wasm-bindgen), предоставляющий
run,chart_svgиversion, собираемый wasm-pack с функциейwasm;getrandomпривязан к целевой платформе, чтобы использовать источник энтропии браузера наwasm32. - Общая диспетчеризация
api::run_toml, которую используют CLI и обе привязки, так что командная строка и привязки не могут разойтись.
Изменено#
- Оценка удержания времени (holdover) теперь учитывает сегменты: временные шкалы перерывов разбиваются на непрерывные сегменты при повторном захвате GNSS, а сообщаемое удержание — это наихудший (кратчайший) выбег среди них. Сценарии с одним перерывом не изменились. Относится к оценщикам для часов, инерциальных и гибридных пакетов.
- Сообщаемое для инерциальной модели значение
kindтеперь равноinertial(былоaccelerometer), что отражает объединённые каналы акселерометра и гироскопа.
0.1.0 - 2026-06-01#
Первый релиз.
Добавлено#
- Детерминированный движок моделирования для гибридного квантового/классического PNT: общий интерфейс моделей ошибок, декларативные сценарии доступности GNSS, оценщики удержания времени (holdover) и счисления пути, а также оценка показателей качества по стандартным эксплуатационным критериям PNT. Результаты воспроизводимы по
scenario + seed + engine version(версионируемый самоописывающийся JSON с хешем сценария) и выводятся как диаграммы SVG. CLI диспетчеризует сценарии поkind. - Четыре пакета датчиков, каждый откалиброван по опубликованным данным и проверен по стандартному соотношению:
- Holdover часов — белый частотный шум (white FM), случайное блуждание частоты (random-walk FM) и линейное старение; проверено по перекрывающейся девиации Аллана (Riley, NIST SP 1065). Чип-масштабные атомные часы и оптические часы на решётке стронция.
- Инерциальное счисление пути — остаточное смещение и случайное блуждание скорости, дважды интегрируемые в ошибку положения; проверено по соотношениям роста ошибки Гроувза. Холодноатомный акселерометр и акселерометр навигационного класса.
- Передача времени — фазовое дрожание хода оптической и радиочастотной линий → прецизионность синхронизации → односторонние измерения дальности.
- Гибридное объединение данных (итоговый сценарий) — комбинированный комплекс PNT, который должен удерживать и время, и положение, с необязательной коррекцией часов по оптической передаче времени между спутниками.
- Один эталонный сценарий со ссылками на источники для каждого пакета в
scenarios/; каждый числовой параметр сопровождается рецензируемым указанием источника (provenance). - Защитные проверки воспроизводимости и чистоты репозитория; CI (формат, clippy, тесты, защитные проверки, MSRV) и конвейер выпуска, запускаемый по тегу, который заново выполняет все проверки.
- Документация: README со схемами архитектуры, отчёт о статусе валидации, руководство для участников, политика безопасности и кодекс поведения; лицензия Apache-2.0; шаблоны задач и запросов на слияние и конфигурация Dependabot.
- Везде без привязки к поставщикам; рецензируемые научные и метрологические ссылки сохранены.
- Чистота лицензирования Apache-2.0: заголовки SPDX во всех исходных файлах, файл
NOTICEс уведомлением о товарных знаках, подтверждение Developer Certificate of Origin (DCO) для вкладов и контроль лицензий и предупреждений безопасности зависимостей в CI средствамиcargo-deny. - Позиционирование open-core (README): бесплатный движок под Apache-2.0 плюс доступные коммерческая поддержка, интеграция и проприетарные расширения от Ashforde OÜ — деятельность поддерживается услугами, а не лицензионными платежами.
CITATION.cff, чтобы программное обеспечение можно было цитировать.