Этот файл фиксирует правила разработки и внесения изменений. Правила устанавливаются только здесь, без CI-guard.
- Все ограничения и договорённости фиксируются исключительно в
AGENTS.md. - Добавление CI-проверок (CI-guard) для принудительного контроля этих правил запрещено.
- Проект таргетит актуальную установленную версию Zig, доступную как
zig. - Поддержка старых Zig toolchain не является обязательной целью, если это мешает чистому использованию текущих Zig API.
- Для Zig-facing интерфейсов запрещены libc fallbacks как способ обойти изменения Zig stdlib:
нельзя использовать
fopen/fread/argv-хаки через libc вместо штатных Zig API. - Если текущий Zig предоставляет нативный интерфейс (
std.process.Init,std.fs,std.Ioи т.п.), агент обязан использовать его напрямую.
- Запрещён
matchпо имени файла/скрипта/чанка и диапазонам строк: любые проверки видаsource_name,endsWith("coroutine.lua"),line_defined in [x..y],line-rangeдля смены семантики выполнения. - Запрещены любые
*_probe,synthetic_*,special_case_*,*_workaroundрежимы, которые активируют альтернативное поведение VM/IR только для конкретного теста/сценария. - Запрещены runtime-hotfix по отладочным именам:
нельзя менять семантику по
local_names,upvalue_names,function.name,debug.getinfo-полям, тексту сообщения ошибки, имени переменной в тесте. - Запрещены костыли в тестовой обвязке/harness для скрытия расхождений:
нормализация вывода, удаляющая семантические различия; подмена поведения через флаги
вида
--engine=refдля прохождения failing-кейсов; изменение upstream-тестов как способ фикса. - Запрещено добавлять новые replay-ветки и replay-поля для реализации coroutine-семантики.
- Запрещены "временные" фиксы без плана удаления: если добавлен compatibility-слой, в том же PR должен быть TODO с критерием удаления и сроком.
- Разрешены только архитектурные и семантические фиксы на уровне parser/codegen/IR/VM/runtime.
- Разрешены изменения stdlib-реализаций, если они приближают поведение к PUC Lua.
- Разрешены диагностические логи/трейсы только если:
- отключены по умолчанию,
- не влияют на поведение исполнения,
- не участвуют в ветвлении семантики.
- По умолчанию агент обязан выбирать путь, максимально близкий к референсной реализации PUC Lua (семантика, модель данных, инварианты runtime), даже если это требует более крупных архитектурных изменений.
- Если есть выбор между быстрым локальным оптимизационным костылём и PUC-подобным архитектурным решением, приоритет у PUC-подобного решения.
- Отступление от PUC-first допустимо только при явных признаках, что прямое копирование подхода PUC в нашей архитектуре ведёт к заведомо худшему решению (по корректности, сопровождаемости, сложности или perf).
- В случае отступления агент обязан явно зафиксировать в описании шага:
- почему PUC-путь хуже в данном контексте,
- какую альтернативу выбрали,
- как эта альтернатива сохраняет/улучшает parity с PUC Lua.
- "PUC-first" означает архитектурную близость: структура алгоритмов, инварианты runtime, модель данных, семантика codegen/IR/VM должны следовать PUC Lua.
- При этом языковые инструменты реализации должны быть максимально родными для Zig (хост-языка), а не для C (языка-источника архитектуры). Компилятор Zig лучше оптимизирует идиоматичный Zig-код.
- Например: вместо C-style
tagged union(enum + union с ручным switch) использовать Zigtagged union; вместо ручного управления памятью через указатели — Zig-аллокаторы и slices; вместо#defineконстант —constиcomptime. - Цель: архитектурная parity с PUC Lua + максимальная нативность для Zig toolchain.
- При выборе между быстрым локальным оптимизационным выигрышем (fast-path patch, guard, workaround) и PUC-faithful архитектурным решением, приоритет — у архитектурного решения, даже если это требует больше времени и больших переработок.
- Быстрый выигрыш допустим только как временная мера с явным TODO и планом замены на архитектурное решение в том же PR.
- Запрещено оставлять fast-path patch как финальное решение, если существует PUC-faithful альтернатива.
- Каждый шаг должен либо:
- убрать один костыль, либо
- закрыть один реальный блокер parity.
- После шага обязателен прогон релевантных suite и явный список: что улучшилось, какие регрессии появились.
- Регрессии допустимы только как временная цена архитектурного шага, но не маскируются тестовыми обходами/нормализаторами.
- После каждой фазы работ агент обязан обновлять
README.md. - В обновлении
README.mdобязательно фиксируются:- какие шаги выполнены,
- какие шаги закрыты,
- какие шаги остаются открытыми (если применимо).
- Пропуск обновления
README.mdпосле завершения фазы считается нарушением процесса.
- Каждая итерация разработки должна закрывать минимум один пункт (чекбокс) в
README.md. - Итерация без закрытого пункта в
README.mdсчитается незавершённой. - Перед переходом к следующей итерации агент обязан явно отметить, какой именно пункт закрыт.
- Запрещено в той же итерации добавлять новый пункт и тут же закрывать его как способ формального прогресса.
- В каждой итерации количество открытых чекбоксов в
README.mdдолжно уменьшаться минимум на 1. - В конце каждой итерации обязательно необходимо выполнять регрессионное тестирование:
- Запускать python3 tools/testes_matrix.py -- регрессий быть не должно
Запуск необходимо выполнять без
_softи_port - запускать все тесты в tests/smoke/ -- они все должны выполняться
- Для правильного сравнения перед тестированием необходимо проводить компиляцию в режиме ReleaseFast
- Запускать python3 tools/testes_matrix.py -- регрессий быть не должно
Запуск необходимо выполнять без
- При написании кода агент обязан стремиться к наглядности: итоговый код должен быть хорошо структурированным и понятным, как в учебнике по программированию.
- Требование наглядности не должно ухудшать производительность: запрещены рефакторинги "для красоты", если они делают runtime/IR/VM заметно медленнее.
- По возможности функции должны сопровождаться избыточными и понятными комментариями, объясняющими не только "что", но и "почему" сделано именно так.