Коды ошибок
Все коды отказов платформы: чей код и когда он приходит. Человек видит тот же отказ словами в окне; здесь — его код, чтобы найти причину.
1 Коды ошибок
Документ — часть договора Обмен с ядром: коды отказов платформы и ответственные за них части. Вид ошибки в сообщении — Обмен с ядром, раздел 3.
У предметной ошибки поле data содержит: error_code, category, message_key, параметры для текста, если текст их принимает, retryable (допустимость повтора), подробности, допустимые к показу, и trace_id — трассу вызова, на который отказ отвечает: названную в параметрах вызова или трассу прогона, чей это шаг (context.trace_id). Отказ, назвавший свою трассу, сохраняет её. message_key по умолчанию — error.<код>; отказ может назвать свой ключ, когда у одного кода несколько причин и у каждой свои слова, и перечислить в names то, о чём его слова говорят, — узлы, переменные, рёбра. Окно говорит слова ключа и после них названное. Так отказывает process.group.detach (Методы графа, раздел 1).
Категории: protocol, config, runtime, graph, module, document, ui. Категорию даёт хозяин кода. Код части — категории части: функция графа — graph, функция модулей и отказы модулей — module, функция настроек — config, мастерская и пульт — ui, остальные — runtime. Общий код и код договора — той категории, что объявил их хозяин рядом с кодами (core/protocol/src/codes.rs, сами категории — константы договора в core/protocol/src/constants.rs): обмен — protocol, документы и пути — document, значения настроек — config, коды договора функции модулей — module; эту категорию код сохраняет, какая бы часть его ни выдала. Коды ядра делятся так же — обмен, описания и реестр (config), документы, остальное (runtime) — и объявлены в core/kernel/src/codes.rs.
Каждый код объявлен один раз — в файле codes.rs своего хозяина; коды, которые выдают несколько частей, — в общем коде протокола (core/protocol/src/codes.rs); код договора хозяина, который выдаёт и зависимая часть, — в разделе договора хозяина core/protocol/src/contracts/<хозяин>/codes.rs, текст у хозяина. Текст для человека хранится в словаре хозяина под ключом error.<код>; у общих кодов хозяин — ядро. Проверка в make ci не проходит, если код есть в коде, но не записан здесь, записан здесь, но не объявлен, или у него нет текста на обоих языках.
Общие — core/protocol/src/codes.rs, тексты у ядра:
Таблица 1 — Общие коды ошибок
| Код | Когда |
|---|---|
invalid_request |
запрос или ответ не по форме: нет обязательного поля, не тот тип |
method_not_found |
такого метода нет ни у ядра, ни у одной функции |
rpc_timeout |
ответа нет дольше, чем спрашивающий готов ждать |
peer_closed |
соединение с ядром оборвалось, пока ждали ответа |
function_lost |
хозяин метода отключился или отказал, не ответив |
function_unavailable |
функция, которой адресован вызов, сейчас не работает. По нему и по method_not_found (метода не объявил никто) вызывающий узнаёт, что необязательной зависимости нет |
transport_write_failed |
сообщение не удалось записать в канал |
document_invalid |
документ не того вида: не JSON, неизвестный или более новый format, нет обязательной части |
document_not_found |
документа по этому пути нет |
document_write_failed |
документ не удалось записать на диск |
path_outside_root |
путь ведёт за пределы папки данных или установки |
process_spawn_failed |
OS-процесс не удалось запустить |
settings_type |
значение настройки не того типа |
settings_range |
число вне допустимых границ |
settings_choice |
значение не из закрытого набора |
Ядро — core/kernel/src/codes.rs:
Таблица 2 — Коды ошибок ядра
| Код | Когда |
|---|---|
backpressure |
очередь просьб одной части полна (core.rpc_queue) |
capability_denied |
у функции нет права, которого требует метод, или реестр его не даёт |
command_conflict |
при знакомстве функция объявила метод, который уже принадлежит другой |
command_id_conflict |
тот же command_id пришёл с другими параметрами |
contract_incompatible |
функция не поддерживает версию договора ядра |
document_list_failed |
папку в данных не удалось прочитать или это не папка |
document_remove_failed |
файл или папку не удалось удалить |
document_remove_refused |
путь слишком широкий: одним вызовом целый раздел не удаляется |
document_too_large |
документ больше core.document_max_bytes |
function_dependency_unavailable |
функция не запущена: недоступна та, от которой она зависит |
function_description_invalid |
описание функции functions/<id>/function.json не читается: файла нет, не JSON, чужой формат, описана другая функция. Такую функцию ядро не запускает, остальные работают |
function_exited |
OS-процесс функции завершился |
function_handshake_timeout |
запущенная функция не познакомилась с ядром за core.function_start_timeout_ms |
function_not_expected |
знакомится функция, которой нет в реестре |
function_registry_invalid |
реестр функций не читается: не JSON, чужой формат, повтор id, цикл зависимостей, глагол cli не по правилам Форматы файлов, раздел 3 |
function_restart_exhausted |
попытки перезапустить упавшую функцию кончились |
handshake_required |
первым сообщением пришло не знакомство |
health_timeout |
функция не ответила на проверку здоровья вовремя |
instance_stopping |
экземпляр останавливается и новых запусков не принимает |
invalid_environment |
в окружение модуля пытаются передать переменные связи с ядром |
invalid_function_command |
функция объявила метод с префиксом core. |
invalid_launch_token |
токен запуска не тот |
line_not_framed |
строка для stdin модуля без перевода строки в конце |
line_too_long |
строка длиннее предела JSON Lines |
peer_mismatch |
на другом конце сокета не тот пользователь или не тот OS-процесс |
process_limits_unavailable |
OS-процесс просит пределы памяти или процессора, а systemd пользователя в Linux не отвечает; запуск без пределов не делается |
process_not_found |
OS-процесса модуля с таким process_handle нет |
process_owner_mismatch |
process_handle принадлежит другой функции |
space_budget_exceeded |
новое не помещается в место, которое человек дал платформе (core.disk_budget_gib) |
space_disk_full |
новое заняло бы место на диске, оставленное свободным (core.disk_free_min_gib) |
process_stdin_failed |
в stdin модуля не удалось записать: программа закрылась |
accept_failed |
ядро не смогло принять соединение (запись журнала ядра) |
connection_limit |
соединений с ядром уже core.connections_max: новое не принято (запись журнала ядра, одна, пока предел держится) |
Граф — functions/graph/src/codes.rs:
Таблица 3 — Коды ошибок функции графа
| Код | Когда |
|---|---|
graph_invalid |
схема процесса не проходит проверку: связи, порты, типы, сквозные объекты, параметры узлов; или данные в прогоне не подходят узлу: поля, которое берёт take, нет в пакете, значение не того типа, что переменная, в которую его пишут |
graph_cycle_invalid |
обратная связь идёт мимо узла цикла |
graph_face_port_used |
с лица группы снимают порт, через который ребро пересекает её границу (process.group.face); сначала убирают ребро |
graph_node_not_supported |
вид узла неизвестен |
graph_no_entry |
у процесса нет точки входа или она указывает на несуществующий узел |
graph_condition_type |
условие сравнивает как число значение, которое числом не является |
graph_iteration_limit |
цикл превысил graph.max_iterations или graph.max_loop_ms |
graph_queue_overflow |
у входа узла скопилось больше graph.queue_depth данных |
generation_incomplete |
документы процесса записаны не одним поколением: запись оборвалась |
file_invalid |
файл, который дают процессу, не принят: часть пропущена или пришла дважды, файл больше graph.file_max_bytes, имя не годится или запуск, которому его дают, не идёт (Форматы файлов, 16.4) |
file_not_found |
файла, который называет ссылка, у процесса нет |
process_running |
процесс сейчас идёт: сохранять его нельзя до конца прогона |
process_in_use |
программу просят удалить, а другая программа её вызывает |
process_changed |
процесс сохранили после контрольной точки: продолжить прогон на другой версии нельзя |
program_off |
программа выключена: прогон начинается только у включённой |
ask_closed |
вопрос уже закрыт: на него ответили или прогон кончился |
run_not_found |
прогона с таким run_id нет; у события нет упавшего прогона, который повторил бы process.run.retry, — этот отказ говорится своими словами (message_key — graph.retry.none): повторять нечего, остановленный прогон продолжают или начинают заново |
resume_not_allowed |
этот прогон продолжать нельзя |
run_active |
прогон с таким run_id идёт сейчас: продолжать нечего, второй раз рядом с собой он не начинается |
module_non_idempotent_unknown |
итог шага модуля неизвестен, а повтор не безобиден: нужно подтверждение человека |
Модули — functions/modules/src/codes.rs:
Таблица 4 — Коды ошибок функции модулей
| Код | Когда |
|---|---|
module_invalid |
манифест модуля не читается или не проходит проверку; в экспорте ссылка внутри модуля |
secret_invalid |
имя секрета модуля — не заглавные буквы, цифры и _, или значение не в одну строку |
module_file_refused |
путь файла модуля выходит из его папки, ведёт к секретам или окружению, файл не читается как текст или слишком велик |
module_exists |
модуль с таким id уже есть |
module_needs_environment |
модулю нужно окружение Python процесса, а его нет |
module_environment_conflict |
модули процесса просят разные версии одной зависимости |
module_python_not_found |
ни одна программа из modules.python_candidates не запускается: нечем создать окружение или запустить модуль на Python |
module_uv_not_found |
программы uv, названной настройкой modules.uv, нет: нечем создать окружение процесса |
module_install_failed |
окружение Python процесса не удалось создать или наполнить: uv venv или uv pip install завершились с ошибкой |
module_files_failed |
файлы модуля или окружения не удалось прочитать или записать на диске: нет места, нет прав |
module_gpu_full |
видеопамять, которая нужна модулю, держат модули, занятые шагом, и за срок шага она не освободилась |
module_state_in_use |
память узла просят сбросить, пока её узел обслуживает поднятый модуль: он сохранил бы поверх то, что держит |
module_in_use |
модуль просят удалить, а его держит программа или он поднят сейчас |
module_not_found |
модуля с таким id среди установленных нет |
module_model_missing |
нейросети, которую выбрал параметр узла или умолчание манифеста, нет в папке нейросетей: шаг до модуля не доходит, служба не поднимается; data.names — недостающие, <вид>/<имя> |
model_in_use |
нейросеть просят удалить, а её берёт по умолчанию установленный модуль; data.names — модули |
model_not_found |
нейросети такого вида и имени в папке нейросетей нет |
module_failed |
шаг не удался в работе самого модуля: модуль сам сообщил об отказе или в его коде случилась ошибка; манифест при этом в порядке. Причина, которую модуль назвал своим кодом, — в data.module_error_code (Методы модулей, 1.2) |
module_not_ready |
модулю прислали шаг раньше, чем он ответил на init, — нарушен порядок протокола |
transport_overflow |
модуль пишет в stdout больше, чем помещается: слишком длинная строка или лишние ответы |
artifact_invalid |
артефакт в ответе модуля описан не по форме или лежит вне рабочей папки |
artifact_missing |
файла, названного артефактом, нет |
artifact_too_large |
артефакт больше modules.artifact_max_bytes |
Договор функции модулей — core/protocol/src/contracts/modules/codes.rs, тексты у функции модулей; эти коды выдаёт или читает и функция графа: когда процесс находит записанный модуль другим, когда остановка застаёт шаг, который ещё ждал начала, и когда по коду отказа она решает, известен ли исход шага:
Таблица 5 — Коды ошибок договора функции модулей
| Код | Когда |
|---|---|
module_changed |
файлы модуля не совпали с отпечатком, записанным в процессе или экспорте |
module_missing |
модуля, на котором стоит процесс, нет среди установленных |
module_version_mismatch |
установлена не та версия модуля, что записана в процессе |
module_cancelled |
шаг модуля отменён: прогон или группу остановили, пока шаг шёл или ещё ждал начала |
module_timeout |
шаг не уложился в timeout_ms манифеста; исход шага неизвестен |
module_process_lost |
программа модуля закрылась или ответила не по протоколу посреди шага; исход шага неизвестен |
module_memory_limit |
программа модуля вывела модули за предел памяти, который дал человек, и Linux её остановил посреди шага; исход шага неизвестен |
model_exists |
нейросеть ставят в папку нейросетей под именем, которое в её виде уже занято; существующая не заменяется; функция источников говорит это до начала загрузки |
Настройки — functions/settings/src/codes.rs:
Таблица 6 — Коды ошибок функции настроек
| Код | Когда |
|---|---|
settings_unknown_key |
такого ключа нет ни в одной схеме |
settings_invalid |
схема хозяина не проходит проверку или файл уровня испорчен |
settings_invalid_level |
уровень назван неверно или для него не хватает process_id |
settings_invalid_owner |
схема принадлежит не тому хозяину, который её регистрирует |
settings_secret_rejected |
в имени ключа есть слово, похожее на секрет |
settings_value_invalid |
значение в файле уровня не проходит схему и не используется (событие) |
Пульт — functions/canvas/src/codes.rs:
Таблица 7 — Коды ошибок функции пульта
| Код | Когда |
|---|---|
canvas_invalid |
документ пульта не проходит проверку |
canvas_image_invalid |
файл не принят рисунком пульта: имя, вид, содержимое или размер (Форматы файлов, 7.2) |
canvas_image_not_found |
рисунка с таким именем в папке пульта нет |
canvas_files_failed |
файлы пульта не удалось прочитать, записать или скопировать |
canvas_look_invalid |
вид элемента не принят: документ ogas.look/1, рисунки или размер (Форматы файлов, 7.2) |
canvas_look_not_found |
вида с таким именем у пульта нет |
canvas_piece_not_found |
заготовки интерфейса с таким именем в библиотеке нет |
Наблюдение — functions/observe/src/codes.rs:
Таблица 8 — Коды ошибок функции наблюдения
| Код | Когда |
|---|---|
observe_unknown_problem |
проблемы с таким id нет |
Языки — functions/i18n/src/codes.rs:
Таблица 9 — Коды ошибок функции языков
| Код | Когда |
|---|---|
i18n_key_missing |
для ключа нет текста в словарях (событие) |
Источники — functions/sources/src/codes.rs:
Таблица 10 — Коды ошибок функции источников
| Код | Когда |
|---|---|
source_unknown |
источника с таким именем нет в настройках |
source_unreachable |
источник не ответил: нет сети, сайт не отвечает, сертификат не проверяется или ответ не пришёл за sources.answer_s |
source_answer_bad |
источник ответил не то: не JSON, витрина другого формата, вещь без обязательного поля, файл без размера или контрольной суммы |
source_item_unknown |
у источника нет такой вещи |
source_gated |
источник отдаёт вещь только после входа или согласия с условиями на его сайте; платформа ключей не хранит |
source_too_big |
загрузка больше sources.max_gib |
source_no_room |
на диске меньше места, чем весит загрузка |
source_file_bad |
имя или путь файла из источника выходит из папки вещи, скрыт или не назван у вещи |
source_hash_mismatch |
контрольная сумма скачанного файла не та, что назвал источник; файл удалён |
source_download_failed |
файл не скачался: обрыв, ответ с ошибкой, файл больше объявленного или загрузка стояла дольше sources.stall_s |
source_signature_bad |
витрина ogas.space без подписи ключом сайта или подпись не сходится; из неё ничего не показывается |
download_not_found |
нет идущей загрузки с таким id |
Мастерская — functions/ui/src/codes.rs:
Таблица 11 — Коды ошибок функции мастерской
| Код | Когда |
|---|---|
method_not_allowed |
окно вызывает метод, закрытый для него |
ui_font_unavailable |
файл шрифта не читается, не того вида или больше предела |
ui_window_unauthorized |
окно не представилось токеном сессии |
ui_window_disconnected |
программа окна не на связи с платформой: соединение не установлено или закрыто; выдаёт сама программа окна |
ui_window_no_answer |
платформа не ответила программе окна в срок; выдаёт сама программа окна |
ui_window_open_refused |
программа окна не открывает файл процесса программой Windows: такой вид файла запускается, а не показывается, — программа, сценарий, ярлык; выдаёт программа окна, и файл можно показать в папке (Защита, 3.13) |
ui_window_file_failed |
программа окна не смогла взять файл процесса у функции графа, положить его копию или передать Windows: имя не простое, файл больше, чем окно копирует, нет места или Проводник не запустился |
ui_window_path_unknown |
Linux не достаёт до файла по пути Windows, который назвали окно выбора или Проводник |
ui_window_shortcut_failed |
программа окна не смогла сделать или убрать ярлык Windows |
ui_window_wsl_config_failed |
программа окна не смогла записать .wslconfig |
Вход для программ — functions/gate/src/codes.rs:
Таблица 12 — Коды ошибок функции входа
| Код | Когда |
|---|---|
gate_unauthorized |
первое сообщение соединения — не gate.hello с ключом входа |
gate_busy |
вошло уже столько программ, сколько пускает gate.clients |
gate_not_allowed |
программа зовёт метод, который через вход звать нельзя |
gate_no_key |
ключа входа нет, и создать его не вышло |
Помощник — functions/assistant/src/codes.rs:
Таблица 13 — Коды ошибок функции помощника
| Код | Когда |
|---|---|
assistant_no_network |
сеть помощника не выбрана |
assistant_not_a_network |
модуль, названный сетью, не сеть помощника |
assistant_task_not_found |
нет задачи с таким id |
assistant_task_busy |
задача работает, а её просят о новом |
Профиль — functions/profile/src/codes.rs:
Таблица 14 — Коды ошибок функции профиля
| Код | Когда |
|---|---|
profile_none |
профиля на этом компьютере нет |
profile_exists |
профиль на этом компьютере уже есть |
key_code_bad |
код не сходится или это ключ другого профиля; ни кода, ни файла ключа не дано |
key_password_bad |
пароль не открывает файл ключа |
key_file_bad |
файл не ogas.key/1, не читается или не записывается |
site_unreachable |
сайт не ответил или ответил ошибкой |
site_signature_bad |
файл сайта без подписи ключом сайта, подпись не сходится или файл не того формата; из него ничего не берётся |
parcel_refused |
сайт не принял посылку; его код — в подробностях |
parcel_bad |
поля посылки не те, что её вид называет |
parcel_too_large |
посылка или её вещи больше пределов |
parcel_not_found |
нет такой неотправленной посылки |
thing_not_found |
нет программы, модуля или заготовки, которую предлагают |
thing_binary |
в вещи файл не текст и не картинка |
thing_no_lock |
у модуля не на Python нет Cargo.lock |