6.2 KiB
6.2 KiB
Правила общности движка + Go-ответы по больным местам (12)
Короткий норматив для бэкенд-сессий (24.07.2026). Только неочевидное/больное — общий Go-стиль сессии и так соблюдают, его тут нет. Источники Go-части: Google Go Style Guide (guide/decisions/best-practices) + Effective Go + Go Wiki CodeReviewComments.
§0. Общность движка (директива владельца 24.07 — жёсткая)
- Движок language/book-agnostic. Go-ЛОГИКА не ветвится по паре языков или книге. Пара-специфичное — ДАННЫМИ:
internal/lang+configs/langpacks/<пара>/(fail-loud loader, байты вpack.Version()→ снапшот). Книго-специфичное — данными КНИГИ: сид-глоссарий / brief / book.yaml. Книжный канон в общем пар-слое = утечка (прецедент: 古月 в surnames-compound.txt). - Пар-скоупнутые модули (checkers_zh_ru и т.п.) легитимны как код за pair-гейтом, но их ДАННЫЕ (словники, руны, таблицы) подлежат выносу в langpack.
- Тест-данные пары легитимны: zh/ru-строки в
*_test.go/golden упражняют общую логику. Не путать с логикой. - Промпты — pair-keyed файлы (
prompts: {<пара>: файл}, fail-loud на чужую пару); конвенции пары (меры, стихи, дискурс) живут в теле промпта СВОЕЙ пары — это данные. Дальний план — извлечение в структурированный пакет конвенций пары (10-prompt-architecture, гейтится формой пакета). - Ревью-вопрос по умолчанию: «заработает ли это на паре, которой в репо ещё НЕТ, без правки Go?» Если нет — данные наружу.
- Контент-свойства — тем же правилом (владелец 25.07, D39.25): движок НЕ ветвится по типу контента (18+/архаика/жанр). Механизм generic: content-label книги/глав = данные книги · capability провайдера = данные models.yaml · сопоставление и политика цепочки = движок/конфиг. «adult» — значение данных, не Go-идентификатор. Refusal-обработка причино-агностична (D12: детектим ФАКТ отказа; причина — операторская диагностика). Ревью-вопрос: «добавится ли второй лейбл (archaic-register) без правки Go?»
§1. Go-ответы (только то, о чём реально спорим)
- Язык кода (владелец 20.07): английский — комменты, логи, операторские дашборды/error-msg, detail-флаги. Русским (target-языком) ОСТАЮТСЯ и не трогаются: wire/инъекц-промпты, которые читает модель (
glossaryBlockHeader, маркер⟨проверить⟩, gender-аннотации; ⚠ снятие маркера с провода — санкционированная правка строкой 134 по D39.104, двигает RequestHash; правило неперевода остальных wire-строк в силе); lang-data таблицы гейтов; тест-данные перевода. Почему: перевод wire-строки = тихая смена инструкций модели → сдвиг вердиктов +--resnapshot(переоплата, D30.9); перевод lang-data ломает чекеры (матчат литералом). Проверка нейтральности правки: golden байт-идентичен по content_hash/final_hash. _test.goрядом с кодом — не бардак, а требование тулчейна:go testсобирает тесты только из каталога пакета; отдельныхtests/-деревьев в Go не существует.- Число/размер файлов — НЕ критерий сплита (Google: «maintainers can move code between files without affecting callers»; эталон — stdlib
bytes). Легитимный триггер — концептуально отдельная подсистема со своим узким API. Этот тест прогнан против фактуры (пак-14, прил. A: связность измерена) — его проходят miner/checks/membank/chunk → сплит РАТИФИЦИРОВАН (D39.23, пак-15): сначала хойст общего субстрата (internal/text+ value-типы), затем подсистемы; драйвер остаётся композит-корнемinternal/pipeline. Дробление «ради размера» по-прежнему запрещено (util-пакеты, течь деталей в API); crush-масштаб (~71 пакет) не эмулируем — сплит только по измеренному узкому API. - Никаких пакетов
util/common/helpers/types— имя пакета обязано нести домен (Decisions/CodeReviewComments). - «Least mechanism» (Guide): сперва slice/map/struct, потом stdlib, только потом своё/зависимость; это же — мера сдержанности к дженерикам и абстракциям «на вырост».
- Интерфейс объявляет потребитель, не реализация; не заводить интерфейсы заранее «для моков» (CodeReviewComments) — наш
BuildClient/адаптеры уже так устроены, держать линию.