# Almost every function differs between two builds, though the game behaves the same

## Symptoms

Matching two releases finds few identical functions: in POD, 374 of 2,942 by masked bytes,
and GameFrame's decompile matcher 384 exact. The diffs show `nop` or `lea eax, [eax]` added,
registers swapped, function exits duplicated, branches inverted.

## Cause

The later build was compiled with other settings (*observed* in POD Gold: code section at
`0x401000` named `AUTO` instead of `0x410000` `BEGTEXT`, jump targets padded with `nop`,
`lea r, [r]` and `mov r, r`, other register allocation). Most "changes" are the compiler's.

## Evidence

Aligned instruction diffs of close pairs (`difflib` on masked instructions): the only
differences were padding and register choice.

## What to do

Grade each pair in steps: same bytes once relocated words, call displacements and padding
instructions are masked; same pseudocode once addresses and generated names are removed; else
compare what the two functions use (numeric constants, strings, mapped globals and callees).
Pairs that use the same things are the same logic. In POD that turned 1,551 "changed" pairs
into 267 same-logic and 1,267 with a concrete note (`labels/gold/changes.tsv`), and the
rule constants of the race could be checked one by one.

## Tried

- Masking relocated words only: 374 exact matches.
- Dropping trailing padding only: no change (the padding is inside functions).
