Some software is not obsolete, it is only stranded. The engine still computes what it always computed, correctly; what has aged is the reference data it reads, because the world has been measured better since the data was written. Replacing the engine throws away a working implementation and everything that was ever validated against it. Rebuilding its inputs does not.
That is only available if the application’s reads can be separated from its writes, which is a question of evidence rather than of hope. Establishing it means inventorying every file the application consumes and demonstrating which of them it only ever reads — because a reference layer that the program also writes to is not a reference layer, it is state, and replacing it underneath a running system corrupts it.
The formats are usually undocumented, which makes the verification the hard part rather than the parsing. A converter that produces a file the application opens without complaint has proved almost nothing: the failure mode that matters is the one where it opens, runs, and returns a subtly different answer. So the acceptance test is an exact byte-for-byte round trip — decode the original, re-encode it, and require the result to be identical to what you started with. A converter that can reproduce the original exactly is one that has understood the format rather than approximated it.
Delivery is its own constraint where the machine is not on a network and should not be. Read-only media across an air gap means the artifact has to be complete and correct when it leaves, because there is no channel for a patch and no telemetry coming back.
See modernizing legacy industrial systems with AI for the worked instance, including the seven failure modes it cataloged. That engagement sits under nondisclosure, so it is described by method rather than by client or application.
Applied in
- Modernizing Legacy Industrial Systems with AIAn unsupported industrial application whose analysis was still right and whose reference data was not — rebuilt from its inputs, without altering a line of its code.