Answer
The attribute type on the entity being Boolean isn't enough on its own — the projection action's own parameter declaration (and the matching method signature in the .plsvc file) also needs to be declared as a Boolean type, not Text/String. If the action parameter is still typed as Text while the entity attribute is Boolean, the framework tries to deserialize an incoming JSON boolean value into a string parameter and fails with exactly this error; updating both the action parameter type and its .plsvc method declaration to Boolean resolves it.