Looks like that clarified the issue, thank you.
Your step about inserting the correct string address--I don't actually know how to determine a specific string address since the Atlas script lumps them into groups. I think there are 20 total. How do you pinpoint the address of one specific string? Something we never discussed.
I actually said string index (e.g. 0, 1, 2, ...), not string address (e.g. $8000, $8001, $8002, ...). The game mostly doesn't care what the string's address is, it just takes the string index, divides by 16 (a.k.a. LSR x 4) to get the pointer index, then looks that pointer up in the pointer table, follows the pointer to a group of strings, and then starts counting end tokens inside the group of strings until it finds the right string. For instance, that "Unfortunately, it is empty." string is the 218th (DA-th) string in the game (counting from 0), or the 10th string inside the 13th group of strings (still counting from 0). If you like counting from 1 instead, it's the 219th string or the 11th string inside the 14th group.
Anyway, basically all we're doing with the trace log is following the flow of data in reverse, starting from where it gets used and going all the way backwards until we find out where in the ROM it came from. Much of the time you can just search the trace log for specific addresses (e.g. searching for the text "$801C", then "$0031", etc.), but you will need to know at least enough ASM to recognize when the game is manipulating data you care about in ways that don't show up as addresses, like in the first snippet of code:
$FCF1:A5 31 LDA $0031 = #$0E A:00 X:9F Y:02 S:EF P:nvUBdIZc
$FCF3:0A ASL A:0E X:9F Y:02 S:EF P:nvUBdIzc
$FCF4:AA TAX A:1C X:9F Y:02 S:EF P:nvUBdIzc
$FCF5:BD 00 80 LDA $8000,X @ $801C = #$2E A:1C X:1C Y:02 S:EF P:nvUBdIzc
For that, you need to know that the game loading $801C depends on the value of X (via LDA $8000,X), that X got its value from A (via TAX), that A had its value multiplied by 2 (via ASL), and then that the value of A came from $0031.