Maps a rule ID to its template section (via section_for_rule_id) and
looks up the span through the given SpanProvider. Returns UNKNOWN_SPAN
if the rule has no associated section or the section has no span.
Looks up the RuleOrigin for a rule ID from the registry.
Panics if the rule is not registered - every built-in rule must be in the registry.
For custom/guard rules (not in the registry), callers must set source directly.