Skip to main content

Quality Gate

Phase 2 + 2.5 update (May 2026): the quality gate logic is unchanged in Phase 2. What changes is the consequence of passing — quality messages now feed the Activity Score quality_msg family (uncapped by spec — gate is the natural cap) and trigger engagement-bounty tracking when a passed message attracts ≥3 engagers within 24h. The H1/H3/H4 heuristics + composite scoring below operate identically.

The quality gate is the function the bot runs against every candidate quality event to decide whether the message is rewarded. It is the single most important guardrail in any brand program: without it, members earn for any message; with it tuned poorly, members either earn for slop or fail to earn for legitimate participation. The Phase 1 rebalance tightened the gate substantially, mostly by introducing three context-aware heuristics on top of the existing composite-score system.

The composite score

For each candidate message, the gate computes five signals (X1–X5, plus an X6 anti-promo cap), normalizes each to 0–100, takes a weighted average, and compares the result to a threshold. The five signals:

SignalWhat it measures
X1 — structural qualityLength, vocabulary diversity, punctuation, capitalization sanity. The "looks like a well-formed sentence" baseline.
X2 — slopPattern matches against well-known low-effort phrases ("gm", "lfg", "wagmi"-class), excessive emoji, single-word filler.
X3 — self-similarityJaccard similarity between this message and the member's recent messages. High self-similarity = the member is repeating themselves.
X4 — cross-similarityJaccard similarity to other members' recent messages in the same server. High cross-similarity = the member is parroting what others just said.
X5 — behavioralThe member's recent message cadence, channel diversity, reaction reciprocity. Bot-shaped patterns score low.

A sixth signal, X6 — promoPatternPenalty, isn't a 0–100 score but a cap on the composite. If the message contains promo-spam patterns (telegram bot mentions, short-link aggregators, ALL-CAPS lines, SHOUTED keywords like "AIRDROP"/"PUMP"/"FREE"), X6 caps the composite below the threshold no matter how good the other signals look.

The composite is then compared to a per-server threshold. The Phase 1 formula is:

threshold = 40 + strictnessLevel * 6

where strictnessLevel is an admin setting per server, range 1 to 10. The 40-point floor means even a strictness-1 server has a meaningful gate (threshold 46) — there is no longer a "wide open" mode.

Strictness levels

The strictness level controls both the threshold and the per-level scoring parameters (minimum word count, minimum X1 score, maximum slop, similarity ceilings). The full table:

LevelThresholdmin_wordsqualifying_scoremax_slopmax_cross-simmax_self-sim
14600000.9
25230900.90.8
358410800.80.7
464515700.70.6
5701060280.300.25
6761470230.250.22
7821680180.220.20
8882085150.200.18
9942490130.180.15
101003095100.150.12

Levels 1–4 are entry-level — appropriate for brands just starting out. The Phase 1 changes were concentrated at levels 5–10; below 5, the parameters were left intact so existing low-strictness brands didn't suddenly see member earnings collapse. Resonance Official runs at strictness 7.

Minimum-drag

After the weighted composite is computed, a minimum-drag rule pulls the score toward whatever the weakest signal was:

const minSignal = Math.min(X1, X2, X3, X4, X5, X6);
if (minSignal < composite - 20) {
composite = Math.round(composite * 0.5 + minSignal * 0.5);
}

In plain English: if any single signal is more than 20 points below the average, mix the composite 50/50 with that worst signal. The effect is that one weak signal drags the score hard. A message scoring [95, 95, 95, 95, 50] averages around 86, but the minimum-drag pulls it to about 68 — under the L7 threshold. Good content can no longer mask a systematic weakness.

The three heuristics: H1, H3, H4

These are the Phase 1 additions that move the gate from "well-formed message" to "engaged participation". They each adjust the composite after the weighted average and minimum-drag, before the threshold comparison.

H1 — Anchor

A message anchors to context if any one of these is true:

  • It is a reply (referenced_message_id is set)
  • It contains at least one user @mention
  • It contains a channel mention (<#channel_id>)
  • It contains a URL on the *.rsnc.network allowlist (see below)
  • It shares at least one content-word with the channel's rolling top-20 vocabulary (stored in channel:{id}:top_words, 24h TTL)

If zero anchors are present, the composite gets −30. This is the single largest penalty in the gate, deliberately. A high-vocabulary, low-slop, behaviorally-clean drive-by post in #general that doesn't reference anything in the room cannot pass strictness 7.

H3 — Chain context

The bot maintains a per-channel rolling buffer of the last five qualifying message previews in channel:{id}:chain_msgs (1h TTL). For a candidate message:

  • Compute Jaccard similarity to each of the previous five; take the max.
  • If max_chain_sim > 0.6: subtract a penalty scaling 0 → 30 as similarity grows 0.6 → 0.9.

This kills "I agree" / "Same!" / "💯 this" reply chains. Even when each individual message is short enough to dodge min_words, the chain-similarity penalty catches them.

Additionally, replies inherit context from their parent:

  • If parent passed the gate, the candidate gets +10 (engagement bonus).
  • If parent failed the gate, the candidate's composite is capped at the parent's composite — you can't ride a junk chain.

H4 — Dead-channel penalty

In servers with member_count ≥ 100:

  • If the channel's last qualifying message was more than 30 minutes ago, apply −10 to the composite.

The reasoning: in an active server, a sudden flurry of posts in an otherwise-dead channel is a near-perfect signature of farming. The penalty is small (−10) so legitimate first-message-of-the-day posts in less-trafficked channels can still pass when they're substantive — and the dawn_patrol unlock event at L90 is explicitly designed to reward such messages once they've crossed the quality bar.

URL allowlist

A new anti-spam rule for the H1 anchor check: only URLs on the *.rsnc.network allowlist count as a strong "anchor" signal. Any other URL is treated as a weak anchor — present but not enough by itself to satisfy the H1 check unless combined with another anchor (a reply, a mention, or topic overlap).

This closes the obvious exploit of pasting a single random link to satisfy the anchor requirement. It also concentrates external link-rewards into the resonance_beacon (L70) and social_link events, both of which have their own per-event guards (reactor counts, weekly caps).

promoPatternPenalty

The X6 cap is enforced via a small library of patterns:

  • Telegram bot mentions (t.me/<bot>, @<somebot>_bot)
  • Short-link aggregators (bit.ly, tinyurl, cutt.ly, etc.)
  • ALL-CAPS lines longer than ~15 characters
  • SHOUTED promotional keywords (AIRDROP, PUMP, FREE, MOON, etc.)
  • Patterns of <emoji><money><emoji> ("🚀💰🚀")

Each pattern caps the composite — a message hitting two patterns can't score above ~30. Promo-spam doesn't pass the gate at any strictness level.

Reaction gating

The quality gate also affects the reaction_threshold (Popular Content) event indirectly, via two new rules:

  1. Voter-reward gating. When a reaction_threshold rule includes a voter_reward > 0 (a small payout to the reactor, not just the message author), it now fires only when the parent message passed the quality gate. This prevents reactor-farming on slop.
  2. Credibility filter on reactors. When counting toward the reactor_threshold, only reactors with credScore ≥ 40 count. The credibility score is a separate per-user metric maintained by the credibility-service based on recent reward history.
  3. Burst-window collapsing. Reactions arriving within 30 seconds of the first reaction on a message collectively count as one effective reactor. Beyond that window, distinct reactors count individually. This is the "five friends pile-on" anti-farm.
  4. Default reactor_threshold raised from 3 to 5.

Worked examples

A passing message — substantive reply in an active channel

A member replies to a newcomer's "How do I get started?" question in #welcome:

"Start with /cooldowns to see what's earnable today, then check the Tune-In ladder under /profile. The L0 events are most accessible — gm_checkin and quality are great starters."

Scoring (illustrative):

  • X1 (structural): 88 — multi-sentence, well-formed.
  • X2 (slop): 95 — no spam patterns.
  • X3 (self-sim): 90 — not similar to author's recent.
  • X4 (cross-sim): 88 — distinct from other recent messages.
  • X5 (behavioral): 85 — author has clean cadence.
  • X6 cap: none.
  • H1: reply + @mention of newcomer = strong anchor. No penalty.
  • H3: dissimilar from chain. No penalty. Parent (newcomer's question) likely failed the gate (too short), so reply's composite is capped at parent's — but parent's composite is around the threshold itself, so this is roughly neutral.
  • H4: active channel, no penalty.

Composite ~89 → above L7 threshold of 82 → PASSES.

A borderline message — vocabulary-rich monologue in a quiet channel

A member posts a 200-word reflection on "the essence of community" in a quiet #general at 3am:

  • X1 (structural): 92 — long and well-formed.
  • X2 (slop): 88 — vocabulary is fine.
  • X3 (self-sim): 75 — author has posted similar before.
  • X4 (cross-sim): 85 — original to the room.
  • X5 (behavioral): 70 — solo posting late at night.
  • X6 cap: none.
  • H1: no reply, no mention, no link, no topic overlap → −30 (no anchors).
  • H3: no chain in 1h → no penalty.
  • H4: dead channel, member_count 800 → −10.

Weighted composite ~84, after H1 (−30) and H4 (−10) → ~44 → below L7 threshold of 82 → REJECTED.

The same message in #philosophy-talk during an active discussion (anchor via topic overlap, no dead-channel penalty) would pass comfortably.

A clearly-failing promo message

A member posts: 🚀🚀 FREE AIRDROP 🚀🚀 join t.me/megapump_bot for the next 100x 💰💰

  • X1 (structural): 35 — emoji-heavy, no real prose.
  • X2 (slop): 20 — multiple slop patterns.
  • X6 promoPatternPenalty: caps composite at ~25 (telegram bot + ALL-CAPS + SHOUTED keyword + emoji-money pattern).

Composite ~25 → below threshold at any strictness → REJECTED. Heuristics aren't even consulted; X6 already pinned it.