a custom rule is a rule defined in data: the stored definition is the
serialized sdk shape, one jsonb column (migration 0015), deserializing
straight into evaluateSignalRule. resolveCatalog merges built-ins with a
repo's custom rows at read time; validateWorkflowForEnable takes the
catalog as a parameter. the worker's makeEvaluator is a two-source
resolver: custom refs evaluate through the github forge's producers over
one shared memoized signal ctx, emitting the same RuleResult envelope a
built-in does. evidence is the observed value only; thresholds stay
gated. safe verbs enforced in the schema; nothing branches on isCustom
for behavior.