3 months ago
bf48513custom rules rendered as bare generated refs everywhere a human reads them, and skipped steps printed no reason at all — the invisible-failure class that let every custom rule sit inert in prod for days. - name resolution (run view + comment): resolve rule refs through the MERGED catalog — built-ins via ruleDisplayName, custom refs via the repo's stored name. resolved once server-side in run-view.ts and set as `ruleName` on the step (the :resume-label pattern), so the run page and the pure markdown serializer both read it with no per-surface resolver. the PR comment resolves custom names + evidence in buildCommentReasons the same slot summarize fills. - skip reasons: withPublicProjection surfaces a skipped step's reason into the public summary — for custom AND built-in, one place, no branch. sanitized: operational reasons pass through, bug-class ones (a thrown rule, a schema error, the muzzle) collapse to a generic line so a stack trace never reaches a contributor (§10). the verbatim reason stays on the gated output. - custom evidence: already wired (customRuleSummary in withPublicProjection); now fires for evaluated custom rules once the worker redeploys. §10 holds: public shows the observed value, never the configured threshold. custom and built-in go through the same path. evaluator + rule model untouched. built-in comment/markdown goldens unchanged (built-ins resolve identically).
Parent574017b