# GvH battle qualification rules (draft v2, Oct 30 2026)

Changes from v1: crude humor that's genuinely funny can pass with a content flag, group debates get credit, and pointed contradiction questions count as debating posts.

A battle is one branch of a thread: a chain of replies where one main human argues with Grok.

## Rules
1. **Clear debate required.** A branch needs at least 3 debating posts from the human side, each arguing a point *with Grok*, with a Grok reply between each pair (H→G→H→G→H, with Grok usually answering last). There must be substantive disagreement: the human disputes a claim, offers counter-evidence or reasoning, or exposes a contradiction. Neutral questions ("is that true?", "any video?") are not disagreement, but a **pointed question that exposes a contradiction counts** (e.g. "So a mixture of?" after Grok says it's privately funded, or "Rare because it's hard to prove, or because it doesn't happen?").
   - **Group debates:** posts from several humans count toward the same 3 if they push the *same line of argument* against Grok (same claim and same direction). Humans arguing opposite sides, or about different points, are separate branches. Every human on that line gets credit: the title uses `Grok vs. @a & @b: topic` for 2 or `Grok vs. @a +2: topic` for 3 or more, and the human vote button names them all (full list shown under the button).
2. **Trolling disqualifies a branch**, with two exceptions:
   - (a) *Contradiction trolling*: sarcasm or mockery that points at a real inconsistency in a point Grok or another party made (e.g. "you said X is privately funded, but half comes from the Secret Service?").
   - (b) *Genuinely funny*: wit that works on its own and is about the topic. **Funny overrides low-brow:** a crude bit that is genuinely funny can pass, but it must carry a content flag (`crude`).
3. **Low-brow trolling is excluded unless it's genuinely funny**: insults or slurs, crude/sexual/scatological or shock content as the main content, spam or promo, emoji or one-liner replies, and repetitive goalpost-moving that restates the same bit without a new point. If it's unfunny, it fails.
4. **Content flags** (shown as a badge and used for filtering): `crude` (sexual or scatological humor) and `insults` (a qualifying branch where a debater insults someone). A flagged branch can still be featured, but admins see the flag in the queue.

The 3-post minimum is counted on *qualifying* human posts. Pure questions, emoji, insults and off-topic posts don't count toward it.

## Cheap pre-filters (no AI, no extra reads)
Run them in order on each candidate chain built from `conversation_id:` search results:
1. Group replies into chains via `referenced_tweets.replied_to`, rooted at a Grok reply.
2. Human side = every non-Grok author in the chain. Group candidates are those with at least 1 post replying to Grok (the AI decides if they share a line).
3. Drop a chain if `sum(human posts replying to Grok) < 3` or `grok_posts < 2`, or if there are fewer than 2 human→Grok→human transitions.
4. A post doesn't count if its text, with @mentions and URLs stripped, is < 25 chars, is emoji-only, or is >50% emoji/punctuation.
5. Crude/insult wordlist matches **don't drop** a chain any more. They set a provisional `crude` or `insults` flag and pass a hint to the AI.
6. Drop the chain if counted human posts are near-duplicates (trigram Jaccard > 0.6), a sign of goalpost repetition.
7. Drop the chain if **all** counted human posts are questions with no pushback cues ("but", "so", "wrong", "false", "actually", "you said", "obtuse", "evidence", "no,", "rare because"). Pointed questions survive for the AI to judge.
8. Cap: send at most 6 chains per thread to the AI, choosing the longest first.

## AI scoring prompt (Workers AI binding)
```
You judge whether an X reply chain is a real debate between a human and Grok, for a site where people vote on who won.
Score 0-10 using the rubric. Return only JSON:
{"score":int,"debate_posts":int,"disagreement":bool,"humans":["handle",...],"same_line":bool,
 "troll":"none|contradiction|funny|lowbrow","flags":["crude"|"insults"],
 "kind":"informative|funny","title":"Grok vs. <@a | @a & @b | @a +N>: <topic, <=60 chars>","reason":"<=25 words"}

Rubric:
- humans: every human pushing the SAME line against Grok (same claim and same direction). Exclude humans who agree with Grok or argue a different point.
- Count debate_posts across those humans: posts that dispute, rebut or challenge Grok, including pointed questions that expose a contradiction, each followed by a Grok reply. Neutral questions don't count.
- 0-2  No debate: Q&A, single exchange, emoji, spam, off-topic.
- 3-4  Low-brow trolling that is NOT funny: insults, crude/shock content, repeating the same bit, goalpost-moving with no new argument.
- 5    Some pushback but fewer than 3 debate_posts, or the disagreement is vague.
- 6-7  At least 3 debate_posts with real disagreement, OR contradiction trolling that lands, OR a genuinely funny on-topic bit with at least 3 rounds (crude is OK if it's funny; add the crude flag).
- 8-10 Strong: each human turn adds a new argument or evidence, Grok engages specifically, and a reader could fairly vote either way.
Hard rules: debate_posts < 3 means score <= 5. troll == "lowbrow" (unfunny) means score <= 4. A crude "funny" branch scores at most 7 unless it also makes a real argument. same_line == false means score each line as a separate branch.

Examples:
- Human: "Protesters admitted being paid." Grok: "No reports show that." (no further reply) -> 5, debate_posts 1.
- Human asks "taxpayer money?", Grok answers, human asks "so a mixture of?" -> 2, questions only.
- Human repeats "but could it fit up his ass" 3 times with no new angle -> 3, lowbrow. If the premises escalate into a bit that lands ("what if it's a portal to an idiot dimension?" / Grok: "local geometry doesn't care about the residents") -> 6, funny, flags [crude].
- @a and @b both argue "rare cases just means nobody checks" in sibling replies, 2 posts each -> humans [a,b], same_line true, debate_posts 4 -> 7.
- @a asks Grok leading "explain why X" questions to rebut ANOTHER human, and Grok agrees -> 2, no disagreement with Grok.
- Human: "You said the ballroom is private, yet half the $600M is Secret Service. Which is it?" Grok explains, human cites the bunker contract, Grok concedes part -> 8, contradiction troll OK.
- Human argues 3 rounds that firing hecklers violates the 1A, citing cases; Grok distinguishes private events -> 8, informative.
```
Thresholds: 7 or higher goes to the admin queue as recommended, 6 goes to the queue as borderline, 5 or lower is auto-rejected. Rejects are logged with their reason for spot checks.
