The plan was to clock the data register of the receiving FPGA at the middle of the 4ns data window, with 2 ns of margin both ways. Instead it got clocked at the edge, just about the time the data was changing. It's astounding that it usually worked; I had to freeze spray the ADC to break it reliably.
The ADC is the smaller BGA near the center, and the big chip is the FPGA. All the data and clocks are LVDS.