Skip to content

Rewrite the generic debate guides in plain language - #260

Merged
Programcode merged 5 commits into
mainfrom
seo/plain-guides
Oct 28, 2026
Merged

Programcode merged 5 commits into
mainfrom
seo/plain-guides

Conversation

@Programcode

@Programcode Programcode commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Stacked on #259: merge #259 first, then this PR. npm run verify now runs scripts/check_jargon.py --max 1, and that gate passes only with #259's product-page copy. Rebasing wasn't an option, so seo/case-format-everywhere is merged into this branch with a normal merge (5ee4af62). Until #259 lands, this PR's diff also shows #259's changes.

Task 3 from the 28 Oct site spec: a plain-language pass on the generic guides, so the text AI answers quote no longer teaches DebateOwl's case in the old contention/warrant model.

What changed

  • Guide copy in the generator sources only: scripts/seo_guides.py (bodies, FAQs feeding FAQPage, definitions), scripts/seo_answers.py (the short answer under each H1) and the PAGES description and lead fields in scripts/generate_seo_content.py. public/ was regenerated with python3 scripts/generate_seo_content.py. Nothing in public/ was hand-edited, and a second run is byte-identical.
  • Plain words.
    • warrant → "the reason (why it's true)"
    • contention → "argument"
    • impact calculus → "weighing (comparing which harm or benefit matters more)"
    • framework → "how the judge should decide"
  • One searchable term per page at most. Where a searcher might use the jargon, it appears once in parentheses after the plain phrase, e.g. "the reason it is true (debaters call this the warrant)". FAQ questions keep a jargon term only where it is the real query ("How many contentions should a PF case have?"), and the answers are plain.
  • /how-to-write-a-debate-case. The first answer sentence and the main structure section describe the DebateOwl format: an opening, two to four arguments each with an explanation, evidence and why it matters, "If they say… we answer…" replies, a closing line and sources. The "claim vs warrant" FAQ is now "What goes into each argument?" with a plain answer.
  • /how-to-weigh-in-debate. The H1 subtitle is now "Compare which harm or benefit matters more, and give the judge a reason to prefer your side." The meta description had no "impact calculus" and is unchanged. The term stays once in the body as the other name for weighing.
  • /lincoln-douglas-debate keeps value, criterion and framework, the format's own rules. Each gets a plain gloss on first use. /policy-debate has none of these terms, so there was nothing to gloss.
  • llms.txt blurbs for /how-to-practice-rebuttals and /how-to-cross-examine-in-debate now use plain words. They come from those pages' descriptions.
  • New scripts/check_jargon.py (stdlib only). It counts the terms in each guide's visible text and JSON-LD. --max N exits 1 when a non-exempt page goes over N, and --json prints machine output.
  • Jargon gate in npm run verify. npm run seo:jargon runs check_jargon.py --max 1, with /lincoln-douglas-debate and /policy-debate exempt, right after the docs check. docs/testing.md lists it in the gate ladder. On this branch's own commits it fails on coach, rebuttal generator and best-tools, which Describe the DebateOwl case format on the home page, llms.txt and JSON-LD #259 rewrites, hence the stacking above.
  • No repeated sentence on /how-to-write-a-debate-case. "What a debate case is" no longer repeats the short answer's format sentence. It now says every case DebateOwl writes follows the shape the paragraph before it lays out, so you can compare a generated draft with your own part by part.
  • Dates. The 12 guides whose text changed and that weren't already dated 2026-10-28 move to 2026-10-28: clash-points, fallacies, judge-adaptation, motion-analysis, speech-structure, cross-examine, flow, prepare-for-a-tournament, weigh, lincoln-douglas, public-forum, world-schools. Six other changed guides already carried 2026-10-28 from Describe the new case format on the public guides #252. CONTENT_DATE is unchanged, and no unchanged page moved.

Jargon counts (scripts/check_jargon.py)

\b(frameworks?|contentions?|warrants?|impact calculus)\b, visible text / JSON-LD.

Page Before After
/how-to-write-a-debate-case 8 / 4 1 / 1
/public-forum-debate 15 / 5 1 / 1
/how-to-practice-rebuttals 14 / 4 1 / 0
/debate-rebuttal-practice 11 / 4 1 / 0
/debate-evidence-finder 7 / 2 1 / 0
/debate-speech-structure 7 / 1 1 / 0
/how-to-cross-examine-in-debate 6 / 3 1 / 0
/how-to-flow-in-debate 6 / 2 1 / 0
/debate-judge-adaptation 6 / 0 1 / 0
/debate-clash-points 5 / 1 1 / 0
/how-to-weigh-in-debate 4 / 2 1 / 0
/world-schools-debate 3 / 1 1 / 0
/debate-motion-analysis 3 / 0 0 / 0
/ai-debate-practice 1 / 0 1 / 0
/debate-fallacies 1 / 0 0 / 0
/debate-topics-for-students 1 / 0 0 / 0
/how-to-prepare-for-a-debate-tournament 1 / 0 0 / 0
/ai-debate-coach 5 / 0 5 / 0 (→ 1 / 0 in #259)
/ai-rebuttal-generator 6 / 0 6 / 0 (→ 0 / 0 in #259)
/best-ai-debate-tools 6 / 0 6 / 0 (→ 1 / 0 in #259)

Every other guide was 0 / 0 before and after.

Format pages that keep their own terms, listed separately: /lincoln-douglas-debate 28 / 8 → 26 / 8 (glossed on first use), /policy-debate 0 / 0.

Acceptance criteria

  • 1. Plain words in the generator sources. LD keeps its terms with a plain gloss on first use; Policy has none to keep.
  • 2. Jargon kept at most once per page, in parentheses after the plain phrase. FAQ answers are plain.
  • 3. Every non-exempt guide is ≤ 1 visible and ≤ 1 JSON-LD, with Describe the DebateOwl case format on the home page, llms.txt and JSON-LD #259 merged in: coach, rebuttal generator and best-tools are 1, 0 and 1. The script is in scripts/, runs in npm run verify, and produced the before/after table above.
  • 4. /how-to-write-a-debate-case: the first answer sentence and the structure section describe the format, and the FAQ is "What goes into each argument?".
  • 5. /how-to-weigh-in-debate subtitle and meta description have no "impact calculus". The body keeps it once.
  • 6. llms.txt blurbs for the rebuttal and cross-ex guides are plain.
  • 7. Only English guides exist; no HU or ES guide is generated from this data, so there was nothing to translate. Dates moved only where text changed. A stand-in for the spec's audit.py, which isn't on this VPS, ran against a local vite preview of this build. It checked all 52 sitemap URLs: every one returns 200 with a one-sentence 70–160 character description, no duplicates, a self-canonical and the favicon link, and every subpage title ends | DebateOwl. The three home pages keep their brand-first titles, the same as on main.

Verification

  • npm run verify, Node 22.23.2, NODE_OPTIONS=--max-old-space-size=3072, local, at head e8b6cf53 (with Describe the DebateOwl case format on the home page, llms.txt and JSON-LD #259 merged in and the jargon gate wired in): exit 0. seo:jargon passed, unit 96 files / 714 tests, collaboration 30, edge 493 passed / 0 failed, build with prerender, sitemap (52 URLs), check-site and check-links clean, Playwright @smoke desktop Chromium 47 passed. The earlier head, 8d81a5f9, also passed. GitHub Actions is billing-blocked, so this is a local pass, not CI.
  • python3 scripts/generate_seo_content.py run twice gives a byte-identical public/.
  • All JSON-LD blocks in public/*/index.html parse. No <title>, canonical, hreflang or H1 text changed. The <h1> lines in the diff move only because the "Updated" date sits on the same line.
  • Screenshots at 1440 px and 390 px: ~/.t3/scratch/debateowl-site-1028/shots/how-to-write-a-debate-case-{desktop,mobile}.png on the VPS.

Relation to the other two PRs

Stacked on #259 (see the top), so it must merge after #259. Independent of #258 (About and Contact). The three branches trial-merge with 0 conflicts. If a merge conflicts in public/, rerun python3 scripts/generate_seo_content.py.

🤖 Generated with Claude Code

Programcode and others added 3 commits October 28, 2026 17:09
site.json now holds one sentence for what a DebateOwl case contains and
one for "no free plan, but the /tools pages are free". The home page FAQ
(EN, HU, ES), the SoftwareApplication JSON-LD on / and the guides, and
llms.txt quote them. The case generator card, How it works and the hero
demo use the new section names (Opening, Argument, Evidence, If they
say..., Closing). The rebuttal generator, coach and best-tools guides
describe DebateOwl's output in plain words instead of warrants,
contentions and frameworks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stack the demo's form and sample so the case sections get the full
width, shorten the sample lines, and move the owl clear of the text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration
Commits

Reviewing files that changed from the base of the PR and between cb37e2d and e8b6cf5.

Files selected for processing: 42
  • docs/testing.md
  • package.json
  • public/ai-debate-coach/index.html
  • public/ai-debate-practice/index.html
  • public/ai-rebuttal-generator/index.html
  • public/best-ai-debate-tools/index.html
  • public/debate-clash-points/index.html
  • public/debate-evidence-finder/index.html
  • public/debate-fallacies/index.html
  • public/debate-judge-adaptation/index.html
  • public/debate-motion-analysis/index.html
  • public/debate-rebuttal-practice/index.html
  • public/debate-speech-structure/index.html
  • public/debate-topics-for-students/index.html
  • public/debateowl-pricing/index.html
  • public/debateowl-vs-chatgpt/index.html
  • public/debateowl-vs-debateclub/index.html
  • public/debateowl-vs-windebate/index.html
  • public/how-to-cross-examine-in-debate/index.html
  • public/how-to-flow-in-debate/index.html
  • public/how-to-practice-rebuttals/index.html
  • public/how-to-prepare-for-a-debate-tournament/index.html
  • public/how-to-weigh-in-debate/index.html
  • public/how-to-write-a-debate-case/index.html
  • public/lincoln-douglas-debate/index.html
  • public/llms.txt
  • public/public-forum-debate/index.html
  • public/world-schools-debate/index.html
  • scripts/check_jargon.py
  • scripts/generate_seo_content.py
  • scripts/seo_answers.py
  • scripts/seo_guides.py
  • src/components/landing/FAQ.tsx
  • src/components/landing/Hero.tsx
  • src/config/site.json
  • src/i18n.ts
  • src/lib/seo/pages.ts
  • src/lib/seo/site-text.ts
  • src/locales/en.json
  • src/locales/es.json
  • src/locales/hu.json
  • src/prerender/entry.tsx
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Essentials by visiting https://app.coderabbit.ai/settings/billing.

Comment @coderabbitai help to get the list of available commands.

Programcode and others added 2 commits October 28, 2026 17:52
The jargon gate in npm run verify passes only with #259's product-page
copy, so #260 stacks on #259 and must merge after it.
npm run seo:jargon runs scripts/check_jargon.py --max 1, and verify runs
it after the docs check. The case-writing guide no longer repeats its
short answer's format sentence in "What a debate case is".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Programcode
Programcode marked this pull request as ready for review October 28, 2026 18:22
Copilot AI balanced review requested due to automatic review settings October 28, 2026 18:22
@Programcode
Programcode merged commit b30c53b into main Oct 28, 2026
3 of 11 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants