Guest memory, and two driver faults that a builder could have caught

Loads and stores now translate and run. s_load_dword, global_load_dword and global_store_dword join the supported list, a translated module binds a second storage buffer for guest memory, and dispatch returns both buffers so a test can assert on what a store left behind. Both fidelity levels implement the memory path, and the_models_agree_about_memory runs the same shader through each and compares - the differential oracle doing the job it was built for. Sixteen execution tests, all against a real device.

Getting there cost two driver faults, and both are worth recording because they share a shape.

The common shape: a driver handed a well-formed module that means nothing does not diagnose it, it faults - and the fault carries no information about what was wrong. Every minute spent on both was spent finding where, not fixing it. So the builder now checks that its identifiers resolve before the module leaves the crate, and a failure is a named TranslateError rather than a process death. The builder allocates every identifier, so it is the only place that can say which were never given a meaning.

A third layout bug surfaced on the way: decorations must all precede types, and the builder had one undifferentiated preamble, so that was a property of the order calls were written in. It is now four sections concatenated in the order the format requires, and the method chosen determines the section. That class of bug cannot recur.

Surprises.

Not done. Fidelity::Subgroup is still a stub. The Lane model remains unmasked, so control flow and the execution mask together - the largest unbuilt part of D098 - is still ahead. s_load_dwordx4, s_load_dwordx2, s_mov_b64 and exp remain on the worklist, and three encoding families (SOPK, MTBUF, VINTRP) are still unverified against a reference.