D090 - The compatibility table is generated from reports, because a hand-written one would be stale by tomorrow

Status: decided.

docs/EMULATORS.md said what each loader is and nothing about what each loader did - which is the question anybody arrives with, and the one whose answer changes every time the suite grows or an emulator is updated.

scripts/compat.py renders it from the reports themselves into a marked region, and --check runs in verify.sh. Same contract as counts.py, for the same reason (D069).

It does not rank loaders and says so. A pass count is not a quality score: a loader resolving everything to a stub scores well on presence and badly on behaviour, and one that refuses to load scores nothing while being the most honest of the three. Per-section tallies are kept rather than merged, because "fails everything in one section" and "fails one check in each of eight" are different platforms.

Kyty is included despite producing no records, because "produced nothing and did not reach the end" is a fact about a loader and belongs in a compatibility table rather than only in prose.

And it repeated a mistake I had already fixed once

The first version listed 000-boot among the sections the loaders disagree on - with both reporting loaders showing exactly 4/0/0/0. Kyty had no entry for it, and its absence was being counted as a differing opinion.

That is precisely the skip-handling bug found in obscene-tool consensus four hours earlier (D072), in a different file, written by the same hand, after writing the decision record explaining it. Absence is not an opinion appears to need enforcing rather than remembering, and both places now say so in a comment pointing at the other.