Streets of Rage graphics recovery

All image pixels and colour values derive from the supplied SOR.SMD. The original
524800-byte SMD is unchanged; source/streets-of-rage.md is its deinterleaved
524288-byte cartridge image. Hashes appear in manifest.json.

This main bundle contains 1014 mapped sprite frames across the three players,
five ordinary enemy families, five other boss families and both twins palette
variants; 16 complete static stage planes; 219 native player-DMA upload windows;
75 other referenced art tile sheets; and the original title-screen capture.
The manifest counts files rather than distinct visual poses; mirrored frames
and the two twins colour variants remain separate. Some boss frame images are
linked sprite pieces, as the original engine composes those objects at runtime.

Every57-row art bundle,31 counted incremental-art cues,14 story Kosinski
records,6 Enigma bundle rows and219 player-DMA descriptors is audited in
table-audit.json. One stale Enigma row points to Kosinski data and is excluded
from Enigma exports. The actual Kosinski bad-ending stream remains available.

The116 valid compressed streams were independently decoded and compared
byte-for-byte with the original cartridge's68000 codec routines executing in
the pinned Genesis Plus GX core. All396850 decoded bytes match. The complete
16 stage blockmaps and all65 sparse palette records were also compared with
the cartridge's actual routines. A visible sample from every sprite family
matched the original sprite-attribute-table output exactly. Proof files are
native-codec-proof.json and native-graphics-proof.json.

Tile sheets marked diagnostic grayscale preserve original4-bit pixel indices;
they are not asserted to have a universal scene palette. Player-DMA windows use
the ROM's common player palette and preserve the original fixed upload length,
which may include bytes beyond the currently mapped frame. Stage planes use
their original sparse scene palettes, omit palette/tile animation and do not
simulate scroll or parallax. The default enemy preview palette is a named ROM
palette composed over the shared enemy colours; other packed palette variants
are retained in palettes/palettes.json.

This is an audited recovery of referenced graphics, not a claim that every
possible final scene, animation timing, palette phase, or runtime composition
is represented by a standalone PNG. Additional UI/story compositions may appear
in a separately labeled supplement. No generated or redrawn graphics are used.

Reproduction: tools/graphics/extract.py, native-verify.py,
native-graphics-verify.py and finalize.py. Independent codec source is adapted
from RuiNelson/StreetsOfRageRecompilation commit
370414b422130a248736b35a07a2006e51e6a92e under MIT; its license is retained.
Primary original data-table labels were reconciled against
https://github.com/gsaurus/sor-disassemblies . All game art retains original
SEGA/Ancient rights and attribution.
