Skip to content

Blackhole (Fallback) Analyzer

Name (URL slug): blackhole

A generic, content-type-agnostic analyzer. It doesn’t parse any particular format — it exists so that auto-routing never dead-ends with “no analyzer found.” When neither a diff file’s path (file_globs) nor a pasted blob’s content (sniff()) is claimed by any dedicated analyzer, auto-routing sends the content here instead of silently skipping it.


Unlike every other analyzer, this one is never a candidate in normal file_globs glob-matching or sniff() confidence scoring — file_globs is empty and sniff() stays at BaseAnalyzer’s opt-out default (0.0). It’s reached exclusively through content_router.py’s explicit fallback branches, after every real analyzer has already had a chance to claim the content and none did.

A Detection routed here has fallback: true, so callers (the dashboard, a GitHub PR job record) can tell “the safety net caught this” apart from “a real analyzer matched.”

ingest() treats the entire input as a single opaque unit — there’s no format-specific structure to split on. name is taken from the first non-blank line (falls back to (blob) for all-whitespace input); type and action are both "unknown".

There is no domain-specific rule library behind this analyzer (rules/generic.md). It instructs the LLM to:

  • Look only for issues a careful human reviewer would catch regardless of format — hardcoded secrets, destructive operations stated in plain language, wide-open access control, obvious syntax breakage.
  • Never invent format-specific best practices for content it can’t confirm the type of.
  • Cap confidence at MEDIUM — this analyzer has no ground truth for what “correct” looks like here.
  • Return a single INFO finding recommending a dedicated analyzer be built, when nothing else qualifies.

An org that would rather fail loudly than receive a best-effort result can disable blackhole the same way as any other analyzer (the existing per-org installed-analyzer toggle). With it disabled, auto-routing reverts to the plain “no analyzer available” skip behavior it had before this analyzer existed.

This analyzer is intentionally limited. If you’re seeing it show up regularly for a particular content type, that’s the signal to build a dedicated analyzer for it — see Adding an Analyzer.