Keep the top level simple: format version, module identity, and an array of entries. Give each entry a stable ID and a locations array, with each location having a kind that tells the reader which other fields to expect.
For example, a cached location could have a value, while a pattern location has a pattern and a result description. I'd make result an object consistently rather than allowing both a string and an object. A little extra JSON is easier to parse and document than multiple shorthand forms.
Reusing names like kind is fine when the surrounding object makes their meaning clear. Reusing value for several unrelated things is less helpful than naming those fields pattern, offset, or address.
e513~corkscrew_2:
It would also help to specify whether the locations array is ordered by priority or whether consumers can choose among the methods.