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
- Profile resolution — An explicit source profile is used directly. A
missing profile or
"auto"is matched by AI using all loadedmatch.mdprompts; a candidate array limits that choice to the listed profiles. - Content preparation — The profile’s
content.analysis_max_charsandcontent.samplingcontrol 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. - Profile analysis — The selected profile’s
analysis.mdprompt evaluates the item and returns a score, reason, one-sentence summary, and tags. - 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.
- 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.
- 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.