The community TS validators re-implement the engine's payload shapes by
hand, and drifted repeatedly (fixed_values entries-vs-values, wildcard
is_null omitted) -- each drift surfaced as a publish failure for a user.
This makes the engine the single source of truth.
- scripts/dump_engine_shapes.py: builds one sample payload per module
subtype, validates each against that subtype's own engine
Handler.validate_payload (raises if not engine-valid), and writes the
engine-row shape to src/validators/fixtures/engine-parity/*.json. Run
it whenever an engine module shape changes; commit the regenerated
fixtures.
- src/validators/__tests__/engine-parity.test.ts: asserts the STRICT
community validator accepts every engine-dumped fixture. 5/5 pass.
Now drift fails CI on either side: a sample that no longer matches its
handler fails the generator; a validator that rejects the real shape
fails the parity test. CLAUDE.md schema section documents the loop.