I figured out WHAT is causing the problem, but I would like to know if there is a reason for this. I'll explain.
In the .cfp file created by Crossfire, the ACROSS clue ID numbers are sequential, but the DOWN ID numbers are not. (see screenshot below)
When I created the puzzles, I did not add the clues via the CrossFire app; I did this in Excel. I then programmatically made the entire clue row inside the <WORD </WORD> brackets, and my program added these lines to the .cfp file. However, ALL the ID numbers were sequentially generated by my program. For some reason, CrossFire will not accept my ID numbers and is using a mysterious hidden ID number order list, so my DOWN ID numbers point to different words.
This problem can be resolved by opening the .cpf files and saving a second copy, which will keep the clues in the same order but will correct the order of the DOWN ID numbers. Problem solved.
I want to know where I can find the actual ID number order list that CrossFire expects - the one it creates when I save a second copy of the file.
The ID order that CF forces for DOWN:
https://bit.ly/3qRxx3h