First of all, warning. Address in SN:M memory is preserved only until game restart/array deallocation (SN:M#
or any operation, changing array size (push, pop, setCount).
You began with array of size 2 and two empty strings from start. Then you pushed another two strings and got addresses of the first two strings.
ntsfl_grailStr = ['', '', 'some name', 'some description'];
Just change !!SN:M(M_AUTO_ID)/2/(M_STR)/(M_STORED)/?i^ntsfl_grailStr^; to
!!FU(NewStrArr):P?i^ntsfl_grailStr^/(M_STORED); create new string array of size 0
And don't change array size anymore. Tell me if you need a function like AllocBattleStr:P^some text^/?(valid address until battle end)