Skip to the content.

Scoring System

A release announcement and an engineering deep dive earn their place for different reasons. Horizon routes each item to one profile and scores it from 0 to 10 using that profile’s rubric. You choose the threshold for each profile in the runtime configuration.

Pipeline

  1. Profile resolution — An explicit source profile is used directly. A missing profile or "auto" is matched by AI using all loaded match.md prompts; a candidate array limits that choice to the listed profiles.
  2. Content preparation — The profile’s content.analysis_max_chars and content.sampling control how much article text reaches the model. Sampling keeps either the opening or excerpts from the beginning, middle, and end. Available comments and engagement metadata are added separately.
  3. Profile analysis — The selected profile’s analysis.md prompt evaluates the item and returns a score, reason, one-sentence summary, and tags.
  4. Validation and retry — Responses are parsed as JSON. Failed AI calls are retried with exponential backoff. An invalid analysis response gets one repair attempt; if it still fails validation, the analysis is stored with a null score.
  5. Profile filtering — If a runtime threshold is configured for the resolved profile, only items meeting it continue. Without a threshold, analyzed items continue without score filtering.
  6. Digest selection — Topic deduplication runs within each profile. Optional category quotas and a final item cap select the items to enrich.

Analysis and enrichment concurrency are configured through ai.analysis_concurrency and ai.enrichment_concurrency. Result order is preserved during analysis.

Profile Rubrics

Each profile defines its own rubric in analysis.md. The built-in tech-news profile uses this scale:

Score Tier Description
9-10 Groundbreaking Major breakthroughs, paradigm shifts, major versions, significant research, or industry-changing announcements
7-8 High value Important developments, technical deep-dives, novel approaches, insightful analysis, or valuable tools
5-6 Interesting Incremental improvements, useful tutorials, moderate community interest, or useful but non-urgent developments
3-4 Low priority Routine updates, common knowledge, shallow treatment, or promotion-dominated content
0-2 Noise Spam, off-topic material, trivial updates, or purely promotional content

Its prompt considers technical depth, novelty, likely impact, source quality, relevance, concrete evidence, and substantive community discussion. Other profiles can define different criteria for different content forms.

Filtering

Thresholds belong to the runtime configuration and are keyed by profile ID:

{
  "processing": {
    "profile_settings": {
      "tech-news": {
        "threshold": 8.0
      }
    }
  }
}

threshold accepts values from 0 to 10. Items at or above the threshold continue. To analyze content without dropping it by score, use null or omit the profile’s settings:

{
  "processing": {
    "profile_settings": {
      "tech-news": {
        "threshold": null
      }
    }
  }
}

A threshold passed to an MCP operation overrides all configured profile thresholds for that operation. Analysis still produces scores when filtering is disabled; only score-based filtering is bypassed. Topic deduplication and digest limits still apply when configured.

Collection and balanced digest settings remain in the runtime configuration:

{
  "collection": {
    "time_window_hours": 24
  },
  "digest": {
    "max_items": 20,
    "category_groups": {
      "ai": {
        "limit": 5,
        "categories": ["ai-news", "ai-tools", "machine-learning"]
      }
    },
    "default_group": "other",
    "default_group_limit": 3
  }
}

collection.time_window_hours controls the fetch window. category_groups limits each configured category group independently, and max_items caps the merged result. These digest limits run after per-profile filtering and topic deduplication, but before enrichment.

Enrichment And Output

Selected items are enriched according to the profile’s enrichment.md prompt and block contract. A block can call a tool only when that tool is declared in the block’s tools list. The only built-in tool is web_search.

For every configured language, Horizon produces a localized title, section blocks, and references when tool sources are cited. The renderer groups these artifacts by profile and builds the Markdown briefing without a final AI call. See Processing Profiles for the complete schema and output behavior.