Контекст для ИИ-агента¶
Точка входа для агента, работающего с этим репозиторием. Читать первым, до любых правок. Остальные страницы — по ссылкам, содержимое здесь не дублируется.
Правила работы¶
Корень работы — каталог этого репозитория. Не читать и не изменять ничего за его пределами: родительские каталоги, домашний каталог, системные пути. Исключение — временные файлы в каталоге scratchpad. Пути в коде, командах и документации — относительно корня репозитория.
Документация правится вместе с кодом. Изменили поведение — правьте
соответствующую страницу docs/ в том же наборе коммитов. Соответствие
«что сделали → что править» — в
6. Обновить документацию.
Коммиты делает только человек. Агент правит рабочее дерево и предлагает
текст сообщений, но не вызывает git commit, git push, git rebase и прочие
команды, меняющие историю. Готовые изменения агент оставляет незакоммиченными и
показывает предлагаемое разбиение на коммиты.
Каждый коммит подписан. git commit -s, заголовок в повелительном
наклонении не длиннее 50 символов. Без трейлера Signed-off-by: CI блокирует
слияние. См. Как вносить изменения.
Что это за проект¶
Форк satnogs-flowgraphs (ветка soniks) — флоуграфы GNU Radio для наземных
станций сети Соникс плюс Python-запускатор. soniks-client-new вызывает один
бинарник flowgraph_dispatcher --mode <MODE>, тот выбирает флоуграф, поднимает
его и три ZMQ-подписчика, пишущих кадры, аудио и IQ.
Фork добавил декодеры Geoscan и USP (Спутникс). Полная картина — Обзор, сквозной путь данных — Архитектура.
Карта репозитория¶
Путь |
Что |
Когда трогать |
|---|---|---|
|
11 флоуграфов общего назначения |
новая модуляция или общий протокол |
|
9 декодеров под спутники, включая Geoscan и USP |
новый спутник |
|
генераторы сигнала, вне сборки |
отладка без эфира |
|
раскладка общего фронтенда из |
любая правка приёмного тракта |
|
инварианты |
вместе с любой правкой кода |
|
таблицы режимов, разбор аргументов, управление процессами |
новый режим или аргумент |
|
запись кадров, IQ, аудио |
формат выходных файлов |
|
общие разборщики, сигналы, метки времени |
общая логика подписчиков |
|
явные списки собираемых файлов |
добавление или удаление |
|
метаданные пакета |
изменение зависимостей |
|
эта документация |
вместе с любым изменением поведения |
Чего в проекте нет: Python-упаковки (setup.py, pyproject.toml), генерации
API-доков, сборки пакета в CI.
Инварианты¶
Нарушение любого из них ломает сборку или проходит незаметно и ломает наблюдение.
.grc— источник правды.generic/*.pyиsatellites/*.pyгенерируетgrccпри сборке; они в.gitignoreи никогда не коммитятся. Правка сгенерированного.pyисчезнет при следующей сборке.Имя параметра в
.grc= имя аргумента вclient_argument_parser()(дефисы против подчёркиваний — единственное расхождение). Диспетчер передаёт всё как--ключ=значениевслепую, аgrccгенерируетparse_args(), поэтому лишний аргумент завершает флоуграф с кодом 2. Проверяетtests/test_dispatcher.py.Списки в
CMakeLists.txtявные, не по маске. Новый.grc, не внесённый вset(flowgraphs …), молча не соберётся.Порты ZMQ выводятся из одного числа. В диспетчере это
--zmq-base-port(по умолчанию 16887), во флоуграфе — параметрzmq_base_port. Кадры наbase, IQ наbase + 1, аудио наbase + 2. Литеральных адресовtcp://127.0.0.1:1688xв.grcбыть не должно — это проверяетtests/test_flowgraphs.py.Новый режим = две записи в
SATNOGS_FLOWGRAPH_SCRIPTSиSATNOGS_FLOWGRAPH_MODES, плюс строка в CMake. Одной недостаточно.Подписчики стартуют раньше флоуграфа. ZMQ pub/sub не буферизует для неподключённых подписчиков — порядок в
run()менять нельзя.Аудио-тракт обязан выдавать ровно 48000 Гц моно. Подписчик пишет OGG с этой частотой жёстко и рассогласование не обнаруживает.
decoded_data_file_path,file_path,iq_file_path,enable_iq_dumpво флоуграфах ни к чему не подключены — запись файлов живёт в подписчиках. Не «чинить» их внутри.grc.doppler_correction_per_secснят 2026-09-12, диспетчер его обнуляет.Децимация не меньше 4. Дальше по тракту есть
decimation // 2иdecimation // sps; без нижней границы получается ноль.Приёмный тракт до демодулятора — один на все графы, источник правды
generic/fm.grc. Править фронтенд (soapy_source, доплер-компенсация, водопад, IQ ZMQ, UDP) в другом файле бессмысленно:tools/sync_frontend.pyперепишет его по золотому, аtest_frontend_matches_goldenне пропустит расхождение. У каждого графа свои толькоout_samp_rate/samp_rateводопада иcompensateуiq_receiver.dev_argsс 2026-09-12 живой:--dev-argsдоезжает доsoapy_source.
Частые задачи¶
Задача |
Куда |
|---|---|
Добавить декодер или режим |
|
Понять, что делает режим |
|
Разобраться в конкретном |
Соглашения в .grc + страница семейства |
Изменить формат выходных данных |
Выходные данные, правки в |
Диагностировать отсутствие кадров |
|
Понять «почему так странно сделано» |
|
Решить, брать ли правку из апстрима |
Ловушки¶
Проверенные расхождения между тем, как код выглядит, и тем, как он работает, собраны в Известные расхождения. Самые дорогие по времени:
иерархические блоки — мёртвый код, правка не меняет поведение декодеров;
у PHASMA нет аудиоветки — OGG будет пустым, подписчик предупреждает;
частота дискретизации IQ нигде не записана — без параметров наблюдения файл бесполезен;
аудио жёстко пишется на 48000 Гц — тракт обязан выдавать ровно эту частоту.
Проверка изменений¶
Минимум перед коммитом:
python3 tests/test_flowgraphs.py # инварианты .grc, без GNU Radio
python3 tests/test_dispatcher.py # контракт аргументов, без GNU Radio
flake8 flowgraph_dispatcher tests
python3 tests/e2e_check.py # дерево процессов, без SDR; не в CI
cd build && cmake .. && make # все .grc проходят grcc
grcc satellites/my_decoder.grc -o /tmp && python3 /tmp/satnogs_my_decoder.py --help
make -C docs html # документация собирается с -W
Первые три команды не требуют GNU Radio. В CI идут они плюс сборка через
grcc (джоба flowgraphs, образ станции) и документация; e2e_check.py — нет.
Прогон целиком без эфира — раздел «Собрать и проверить» в Добавление флоуграфа и режима.