dist/protocol.schema.json is gitignored and never committed, so the trailing
`git diff --exit-code` guard in protocol:check exited 0 unconditionally. The
Swift and Kotlin halves work because those files are tracked; the JSON half read
as verification while it could not fail, leaving schema drift to the slow QA-lab
scenario. scripts/prepush-ci.sh carried the same dead guard: its before/after
diff covered only the untracked artifact and a file that protocol:check:swift
never writes.
The artifact is a build output with no committed baseline, so it gets a contract
check instead of a diff. scripts/lib/protocol-schema-document.mts owns the
published document; protocol-gen builds through it, asserts required frame
definitions, frame ordering, discriminator mapping, and a non-empty method
catalog before writing through the shared generated-output helper. The QA-lab
verifier drops its duplicate envelope copy and compares the packed tarball
against that same owner.
The generated artifact is byte-identical to before.