O.G.A.S. English

Коды ошибок

Все коды отказов платформы: чей код и когда он приходит. Человек видит тот же отказ словами в окне; здесь — его код, чтобы найти причину.

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