Mark, it's not clear to me whether you understood my comment. The reason your one-liner works and your roseEncode method doesn't is that your rose2 structure contains no strings. Your one-liner is applied to Symbols, and rose2 does contain some matching Symbols. Your roseEncode function is applied to a String, and rose2 contains no Strings (no Characters), so it reports Missing. In other words, both your one-liner and your function are working.
To simplify your function, let's start with your hard-coded one-liner (slightly simplified for clarity):
FirstPosition[rose2, #] & /@ {s, t, a, r, t}
The algorithm is clear, we just need to replace the specific, hard-coded values with variables. Basically, you're trying to create a FirstPosition function that works with a list of patterns (FirstPosition would look for an actual list if you passed it a list as a pattern). Let's name it FirstPositions.
FirstPositions[structure_, patterns_List] := FirstPosition[structure, #] & /@ patterns
By calling out _List this way, I can create an alternate version that works with a string.
FirstPositions[structure_, patterns_String] := FirstPositions[structure, Characters[patterns]]
We can check how FirstPositions works:
In[8]:= FirstPositions[rose2, {s, t, a, r, t}]
Out[8]= {{6, 3}, {6, 2}, {4, 3}, {6, 4}, {6, 2}}
In[9]:= FirstPositions[rose2, "start"]
Out[9]= {Missing["NotFound"], Missing["NotFound"],
Missing["NotFound"], Missing["NotFound"], Missing["NotFound"]}
In[10]:= FirstPositions[Map[ToString, rose2, {-1}], "start"]
Out[10]= {{6, 3}, {6, 2}, {4, 3}, {6, 4}, {6, 2}}
From here, you can add the checking you want (ignoring spaces, normalizing to lowercase, etc).