{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Grid dictation source v1","type":"object","required":["id","title","description","path","difficulty","ages","themes","origin"],"properties":{"id":{"type":"string","pattern":"^[a-z0-9-]{1,64}$"},"title":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string"},"path":{"type":"array","minItems":2,"maxItems":301,"items":{"type":"object","required":["x","y"],"properties":{"x":{"type":"integer","minimum":1,"maximum":24},"y":{"type":"integer","minimum":1,"maximum":24},"pen":{"const":"up"}},"additionalProperties":false}},"difficulty":{"enum":["easy","medium","hard"]},"ages":{"type":"array","minItems":1,"items":{"type":"integer","minimum":5,"maximum":8}},"themes":{"type":"array","items":{"type":"string"}},"origin":{"type":"object","required":["kind","author","created"],"properties":{"kind":{"const":"original"},"author":{"type":"string"},"created":{"type":"string","format":"date"}}}},"description":"path is authoritative; commands, bounds, start, diagonals, grid are derived. Further semantic validation is mandatory: no zero segments, only axial or 45-degree motion, including pen-up moves. Coordinates y increase downwards."}