That is correct.
Candicaine is item #5632. It is a siphoned spirit from the Happy Medium.
Candycaine was a drink offered in Crimbo Town in 2005 and 2006. It was item #-5. Which is to say, a pseudo item.
If you try to coerce "candycaine" into an item, it does not find an exact match on the non-item #-5, since that's not in the data files, but, instead, fuzzy matching returns item #5413 - "candycaine powder".
Which is to say, fuzzy matching is working correctly.
Edit: Look at this:
> ash ( to_string( to_item( "candicaine" ) ) == "candicaine" )
Returned: true
> ash ( to_string( to_item( "candycaine" ) ) == "candycaine" )
Returned: false
You can tell that fuzzy matching kicked in for "candycaine".
> ash to_int( to_item( "candycaine po" ) )
Returned: 5413
> ash to_int( $item[ candycaine po ] )
Returned: 5413
You can also tell that ASH does fuzzy matching even in $item constants. That surprises me. I could have sworn that we it do exact matching a while ago, since not using the exact name in a script is, basically, laziness; I can see the point in user input, but putting a fuzzy string into a script is begging for trouble when a new item is introduced that invalidates the fuzzy string.
I could have sworn we fixed that. I remember the discussion. Huh.
Edit 2: Well, perhaps I was remembering disallowing non-ASCII characters in $[] constants. The ASH parser just calls DataTypes.parseValue( type, input, false ) to parse those constants. That is the function which is also used to parse user input and in to_item() and such, so it does fuzzy matching.
Fixing ASH to disallow fuzzy matching for $[] constants would undoubtedly cause screams of outrage, at this point.