A Windows checkout with core.autocrlf enabled handed buf a CRLF schema, so
an empty comment line reached the codegen plugin as a carriage return rather
than an empty string. The plugin pads non-empty lines with a space, and the
committed output kept a trailing space that an LF checkout never emits,
breaking the generated-code sync check.
proto/noitu/v1/game.proto is the single source of truth for every WebSocket
message. buf generates Go types into server/gen and JavaScript types into
web/src/lib/proto; both trees are committed so building needs no codegen
toolchain.
The Go suite emits binary fixtures into proto/testdata and the JavaScript suite
decodes the same bytes, so the two generated clients are checked against one
artifact rather than against each other's assumptions. CI lints the schema,
rejects breaking changes against main, and fails when the committed generated
trees drift from the schema.
game.NumRejectReasons and game.NumEndReasons let the mapping tests prove every
engine reason has a wire value without guessing where the enum ends.