The rules are confusing, and this seems to be due to how helpers are supposed to work in Mustache (which is my 2nd hand understanding from can.Mustache which passes mustache's tests).
The rules are mostly defined here:
If something looks like {{foo bar}}, isHelper will be true and then look for a helper (scopeAndOptions.options).
Then you will notice this code:
// Use helper over the found value if the found value isn't in the current contextif( (initialValue === undefined || computeData.scope != scopeAndOptions.scope) && Mustache.getHelper(key, options) ){return key}
Basically, if the current context does not have the value, the helper wins. Maybe Andy Kant can weigh in on this.