Repository navigation
feat(genclient): генерация зеркальных констант web/game.js из Go (итер. 41) - #40
Merged
Merged
Conversation
…р. 41) Клиент больше не зеркалит константы провода/геометрии вручную — это дрейфило (напр. сломанный разбор MsgMatchState в итер. 23). Теперь источник истины — Go, а cmd/genclient переносит значения в web/game.js. Формат провода НЕ менялся (codec.go/protocol.go не тронуты) — чистый рефактор зеркала. Механизм: - protocol.ClientWire() + game.ClientSim() — read-only поверхности, читают реальные значения констант в своём пакете (в т.ч. на iota и неэкспортированные); срезы копируются (как Obstacles(), итер. 28). - cmd/genclient рендерит JS-блок и вписывает в web/game.js между // GENERATED-BEGIN / // GENERATED-END (путь через runtime.Caller, идемпотентно). - golden-тест cmd/genclient ловит дрейф Go→клиент в make check; регенерация — make gen (//go:generate go run .). Покрыто: PROTO (коды 0x01..0x1a, enum'ы matchPhase/pickup/weapon, биты Btn/Field, WeaponSelectShift/Mask, ActDash), MATCH_*_MODE, COORD_SCALE, INPUT_RATE, INV_SQRT2, SIM (движение/рывок + hill/dom/ctf-геометрия), WALLS, PICKUP_SPOTS. Значения совпали со старым ручным зеркалом байт-в-байт (INV_SQRT2 → точный float32 0.70710677, клиент, вне Checksum). Клиент ссылается на сгенерированное: weaponKeyMap/WEAPON_NAMES → PROTO.Weapon*, маска → PROTO.WeaponSelectMask, PREDICT.dt → 1/INPUT_RATE. Вне маркеров остаётся ручной рендер/UX и INTERP.tickRate (рантайм-конфиг, не const). Стражи (concurrency/determinism/protocol) — чисто: новых горутин/каналов нет, значения симуляции не менялись, Step/Checksum не тронуты, protocol не тянет игровое, zero-alloc/fuzz зелёные, вердикт protocol-guardian «СИНХРОНИЗИРОВАНО» (байт-в-байт включая раскладку MsgMatchState). Отложено (finding 1): codegen байтовых РАСКЛАДОК сообщений — другой механизм, смещения в декодере остаются ручными (задокументировано в docs/protocol.md). Тестирование: make check зелёный (вкл. golden-тест), node --check web/game.js, негативный drift-тест (падает при расхождении, проходит после make gen), идемпотентность.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что
Итерация 41 — codegen клиентских констант.
web/game.jsбольше не зеркалит константыпровода/геометрии вручную: единственный источник истины — Go, а
cmd/genclientгенерирует блок в клиенте между
// GENERATED-BEGIN/// GENERATED-END.internal/protocol/clientgen.go—ClientWire(): коды сообщений,Btn*,weaponSelectShift/Mask,ActDash, маски полей дельты,matchFlag*,CoordScale.internal/game/clientgen.go—ClientSim(): движение/рывок,InputRate, геометрия(
walls/pickupSpots/domPoints/flagBases/hill), enum'ы matchPhase/pickup/weapon.cmd/genclient— рендер +spliceBlockмежду маркерами (путь черезruntime.Caller),//go:generate go run ., golden-тест на дрейф.web/game.js— сгенерированный блок; клиент ссылается на него (weaponKeyMap/WEAPON_NAMES→PROTO.Weapon*, маска→PROTO.WeaponSelectMask,PREDICT.dt→1/INPUT_RATE).Makefile—make gen. Docs: README RU/EN,docs/protocol.md.Зачем
Ручное зеркалирование дрейфило (сломанный разбор
MsgMatchStateв итер. 23). Golden-тестcmd/genclientвmake checkтеперь ловит любое расхождение Go↔клиент.Как
codec.go/protocol.goне тронуты, это рефактор зеркала.iota/неэкспортированные);срезы копируются (как
Obstacles(), итер. 28) — на симуляцию/Checksum/горутины не влияют.INV_SQRT20.70710678→0.70710677, точный float32 серверногоinvSqrt2; клиент, вне Checksum).make gen/go generateперезаписывают только межмаркерный блок.INTERP.tickRate(рантайм-конфиг).Стражи (/audit)
Все три чисты:
модель «одна комната = одна горутина» не задета;
-race+vetзелёные.Step/состояние/Checksumне тронуты, новый код вне горячего пути, серверныйinvSqrt2неизменен.
MsgMatchState(критичное ребро итер. 23 чисто);
protocolне тянет игровое/сетевое; zero-alloc/fuzz зелёные.Находки-не-дефекты закрыты в итерации тем же конвейером (коды оружия,
weaponSelectMask).Отложено (finding 1): codegen байтовых РАСКЛАДОК сообщений — другой механизм; смещения
в декодере остаются ручными (задокументировано в
docs/protocol.md).Тестирование
make check— зелёный (включая golden-тестcmd/genclient).node --check web/game.js— OK; генератор идемпотентен (повторный прогон — «already up to date»).make gen→ проходит.BENCHMARKS.mdне трогался — горячего пути нет.