# Fair post-engagement comparison recipe

A pre-analysis contract for defining candidates, formula, shared horizon, and acceptable coverage before comparing Telegram posts.

## Calculation

- Mode: normalized_engagement_ranking
- Formula: one selected metric / one declared denominator, measured for every included post at the same target_age_seconds.

## Query

Compare [exact candidate posts] using [metric] divided by [views or historical audience] at one shared post-age horizon. Preserve the inherited source and period scope. Return underlying values, rate, rank, horizon, eligible/measured counts, per-post exclusions, readiness time, and citations; do not declare an overall winner for incomplete coverage.

## Inputs

- **Frozen candidates:** Exact posts or a reproducible selected-source publication query.
- **Numerator:** One captured metric applied identically to all rows.
- **Denominator:** Views from the same row or time-aligned source audience.
- **Decision threshold:** Coverage and score difference required before interpreting a leader.

## Expected output

- Comparable formula and horizon
- Underlying numerator and denominator
- Ordered measured rows
- Per-post coverage ledger
- Evidence citations and limitations

## Coverage checks

- [ ] Never change candidate scope silently
- [ ] Never mix post-age horizons
- [ ] Never zero-fill unavailable fields
- [ ] Never name a global winner from partial data
- [ ] Review content separately from numerical rank
