Skip to content

Merge 13 overlapping guide pages into 10 survivors - #155

Merged
Programcode merged 3 commits into
mainfrom
seo/consolidate-duplicate-guides
Oct 20, 2026
Merged

Programcode merged 3 commits into
mainfrom
seo/consolidate-duplicate-guides

Conversation

@Programcode

@Programcode Programcode commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

Thirteen guide pages targeted the same search as another page, each with about 1,700 characters of shared template copy. This PR folds each one into a single surviving page and 301-redirects the old URL there. The sitemap drops from 52 to 39 URLs.

Preview (staging project, same vercel.json): https://debatelab-staging-hr2xgrs4x-adam-gaborjanis-projects.vercel.app (Vercel protection on; agents use the bypass header from docs/staging.md)

Redirects

Each old URL 301-redirects path-exact, in one hop, to its survivor. With a trailing slash, Vercel's trailingSlash: false 308 runs before any redirect rule, so /debate-weighing-guide/ takes two permanent hops (308, then 301) and needs no rule of its own. I first added /<slug>/ rules, saw on the preview that they never match, and removed them. The existing /debatelab/ brand rules have the same dead slash variants; I left those alone. The survivor is the page that was already deep, or else the URL with the clearest search intent.

Removed URL Redirects to
/online-debate-timer-tool /online-debate-timer
/debate-argument-flowchart-tool /argument-flowchart
/debate-weighing-guide /how-to-weigh-in-debate
/debate-impact-calculus /how-to-weigh-in-debate
/debate-cross-examination-tips /how-to-cross-examine-in-debate
/debate-note-taking-flowing /how-to-flow-in-debate
/debate-case-generator /ai-debate-case-generator
/how-to-write-a-rebuttal-speech /how-to-practice-rebuttals
/wsdc-debate-practice /world-schools-debate
/ai-debate-evidence-research /debate-evidence-finder
/debate-evidence-verification /debate-evidence-finder
/debatelab-alternatives /best-ai-debate-tools
/ai-tools-for-debate-students /best-ai-debate-tools

Sitemap: 52 URLs before, 39 after (36 guides plus /, /terms and /privacy). No retired slug appears in the built sitemap, any built page, llms.txt, humans.txt or the JS bundles.

Changes from the suggested clusters:

  • I added /ai-tools-for-debate-students to the /best-ai-debate-tools cluster. Its title, lead and headings ask the same question ("which AI tools help with debate"), and the deep page already covers everything it said.
  • For weighing I kept /how-to-weigh-in-debate, the phrasing people search, over /debate-weighing-guide. For WSDC I kept /world-schools-debate, which matches the other format pages (/public-forum-debate, /policy-debate and so on).
  • /debate-evidence-verification merges into /debate-evidence-finder, because checking a source is part of finding evidence. The survivor now has a full verification checklist.

Survivors I deepened

The seven thin survivors get entries in scripts/seo_guides.py that combine what each merged page said. They also describe the tools as they exist in the app: the timer's four presets (Standard 4-6-6-3, LD, PF, Policy) and its signals, the flowchart's node and link types, Crossfire's modes and opponent styles, Factoids and the Library. I checked each product claim against src/. The old timer copy promised prep timers and format presets the app doesn't have; the new copy says what is missing.

Visible characters, measured as text outside <head>, scripts and styles:

Page Before After
/online-debate-timer 1,675 4,551
/argument-flowchart 1,774 4,802
/how-to-weigh-in-debate 1,825 5,591
/how-to-cross-examine-in-debate 1,736 5,595
/how-to-flow-in-debate 1,690 4,690
/world-schools-debate 1,727 4,996
/debate-evidence-finder 1,875 5,270
/how-to-practice-rebuttals 9,285 10,131
/best-ai-debate-tools 7,993 8,278

/how-to-practice-rebuttals gains a short "shape of a rebuttal speech" section (select, attack the warrant, extend, frame the ballot), the one thing /how-to-write-a-rebuttal-speech had that it lacked. /best-ai-debate-tools gains an FAQ on alternatives. /ai-debate-case-generator needed nothing from the page it absorbed. The new copy names the product with {product}. Each deepened guide's FAQ list feeds both the visible FAQ and the FAQPage JSON-LD; I checked that they match on all nine pages.

What else changed

  • A guide entry can set its own modified date. Only the nine deepened pages move dateModified and sitemap lastmod to 2026-10-20. Every other page keeps 2026-10-19.
  • /ai-debate-case-generator takes the retired /debate-case-generator's place in PAGES and in the guide nav, so it keeps the sitewide links that page had. Removing 13 pages shifts the position-based "Related guides" block on every page. On the other 27 guides, I diffed the <head> (title, description, canonical, JSON-LD) and body against main: they are identical apart from the nav and related-links blocks.
  • llms.txt and humans.txt now point at /ai-debate-case-generator.
  • src/test/vercel-deployment-config.test.ts limits the brand-redirect assertion to the brand rules. A new check pins the 13 expected redirects and fails if one is dropped or changed, if a survivor page is missing, if a retired page's folder is left in public/, or if any page links to a retired slug. I confirmed it fails for a dropped redirect, a leftover folder and a stale related link.
  • docs/operations.md describes the guide redirects, the per-page date and how to retire a guide.

Left alone

  • /debate-rebuttal-practice and /how-to-practice-rebuttals are the closest remaining pair. Both are deep and were written on purpose in Give five guide pages their own content and one brand config #152 and Give six more guide pages their own content #154. The first covers rebuttal practice with the Attack analyzer, and the second is a weekly training plan with drills. I kept both, but they share material (the five ways to answer an argument, per-format notes) and are the next candidates if Search Console shows them competing.
  • scripts/gsc_submit.py still lists /debate-case-generator, /debate-weighing-guide and /wsdc-debate-practice. It is an ops submission list that already includes the brand-redirect URLs on purpose, so I did not change it.
  • No titles changed, and no new brand or domain strings. /app, the legal pages and plan/rebrand-rebuttl are untouched.

Checks

GitHub Actions can't run on this account right now (billing), so these are local results at this branch's head, not CI:

  • npm run docs:check, npm run lint, npm run typecheck: pass.
  • npm test: 37 files, 305 tests pass.
  • npm run build: passes. sitemap: 39 URLs, 39 with lastmod.
  • npm run verify: passes, including the service worker check and 30 desktop Chromium @smoke tests.

Preview proof at 9be85b6 (the last commit that touched vercel.json), curl with the bypass header:

  • All 13 old URLs return 301 with location set to the survivor in the table. Each /<slug>/ ends on the survivor with 200.
  • /online-debate-timer, /how-to-weigh-in-debate, /world-schools-debate, /debate-evidence-finder, /ai-debate-case-generator and /best-ai-debate-tools return 200.
  • /sitemap.xml lists 39 URLs and none of the retired slugs.
  • In Chromium, /debate-impact-calculus lands on /how-to-weigh-in-debate with the new sections and FAQs, and /wsdc-debate-practice/ lands on /world-schools-debate, with no console errors.

Review

CodeRabbit was rate-limited and Copilot was out of quota. A Codex review of eea9607 found five low-severity issues, all fixed in de84234:

  • The evidence finder told readers to turn on web research in Generate, which has no such switch; case generation always researches the motion.
  • The World Schools page said third speakers may not add arguments and to accept one or two POIs. WSDC rules 9.2 and 15.3 allow a small announced part of the case and ask for at least two POIs.
  • The weighing guide implied British Parliamentary has a reply speech.
  • The redirect test read the retired slugs from vercel.json, so deleting a rule also deleted its check.

The wrong "turn on web research" claim also appears three times on /ai-debate-case-generator, written in #152. That page is outside this PR, so it needs a follow-up fix.

Not proven: production behaviour (nothing deployed) and whether Google indexes more pages after this, which only Search Console can show over the coming weeks.

🤖 Generated with Claude Code

Thirteen guide pages repeated the search intent of another page with
about 1,700 characters of shared template copy. Each now 301-redirects,
path-exact and with or without a trailing slash, to the page that
covers the same search:

- online-debate-timer-tool -> online-debate-timer
- debate-argument-flowchart-tool -> argument-flowchart
- debate-weighing-guide, debate-impact-calculus -> how-to-weigh-in-debate
- debate-cross-examination-tips -> how-to-cross-examine-in-debate
- debate-note-taking-flowing -> how-to-flow-in-debate
- debate-case-generator -> ai-debate-case-generator
- how-to-write-a-rebuttal-speech -> how-to-practice-rebuttals
- wsdc-debate-practice -> world-schools-debate
- ai-debate-evidence-research, debate-evidence-verification
  -> debate-evidence-finder
- debatelab-alternatives, ai-tools-for-debate-students
  -> best-ai-debate-tools

The sitemap drops from 52 to 39 URLs.

The seven thin survivors get long-form copy in seo_guides.py that
combines what the merged pages said and describes the real tools: the
timer's four presets and signals, the flowchart's node and link types,
Crossfire, Factoids and the Library. how-to-practice-rebuttals gains a
section on the shape of a rebuttal speech, and best-ai-debate-tools an
FAQ on alternatives. Each changed guide sets its own "modified" date,
so dateModified and sitemap lastmod move only on those nine pages.

ai-debate-case-generator takes the retired case generator's place in
PAGES and in the nav, so it keeps that page's sitewide links. Removing
pages shifts the related-guide links on every page; titles, canonicals
and JSON-LD of the other pages are unchanged. llms.txt and humans.txt
point at the surviving case generator.

The Vercel config test now also checks that each guide redirect lands
on a live page in one hop, and that no page is left behind or links
to a retired slug.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 20, 2026 15:29
@vercel

vercel Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
debate-navigator Ready Ready Preview Oct 20, 2026 3:38pm UTC
debatelab-staging Ready Ready Preview Oct 20, 2026 3:38pm UTC

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 reached their quota limit.

@coderabbitai

coderabbitai Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

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 52 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
  • Configuration used: Repository YAML (base), Organization UI (inherited)
  • Review profile: CHILL
  • Plan: Free
  • Run ID: 663fec0a-746b-4f48-8130-6f0767c258f0
📥 Commits

Reviewing files that changed from the base of the PR and between eea9607 and de84234.

📒 Files selected for processing: 7
  • docs/operations.md
  • public/debate-evidence-finder/index.html
  • public/how-to-weigh-in-debate/index.html
  • public/world-schools-debate/index.html
  • scripts/seo_guides.py
  • src/test/vercel-deployment-config.test.ts
  • vercel.json
ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository YAML (base), Organization UI (inherited)
  • Review profile: CHILL
  • Plan: Free
  • Run ID: e102c41e-a887-4f7c-a433-4afdad5e55d2
📥 Commits

Reviewing files that changed from the base of the PR and between 0e21055 and eea9607.

📒 Files selected for processing: 56
  • docs/operations.md
  • public/ai-debate-case-generator/index.html
  • public/ai-debate-coach/index.html
  • public/ai-debate-evidence-research/index.html
  • public/ai-debate-practice/index.html
  • public/ai-rebuttal-generator/index.html
  • public/ai-tools-for-debate-students/index.html
  • public/ai-vs-traditional-debate-prep/index.html
  • public/argument-flowchart/index.html
  • public/best-ai-debate-tools/index.html
  • public/british-parliamentary-debate/index.html
  • public/congress-debate/index.html
  • public/debate-argument-flowchart-tool/index.html
  • public/debate-block-file-guide/index.html
  • public/debate-case-generator/index.html
  • public/debate-clash-points/index.html
  • public/debate-collapsing-strategy/index.html
  • public/debate-cross-examination-tips/index.html
  • public/debate-evidence-finder/index.html
  • public/debate-evidence-verification/index.html
  • public/debate-fallacies/index.html
  • public/debate-impact-calculus/index.html
  • public/debate-judge-adaptation/index.html
  • public/debate-motion-analysis/index.html
  • public/debate-note-taking-flowing/index.html
  • public/debate-prep-time-management/index.html
  • public/debate-pronunciation-and-delivery/index.html
  • public/debate-rebuttal-practice/index.html
  • public/debate-speech-structure/index.html
  • public/debate-topics-for-students/index.html
  • public/debate-weighing-guide/index.html
  • public/debatelab-alternatives/index.html
  • public/debatelab-pricing/index.html
  • public/debatelab-vs-chatgpt/index.html
  • public/debatelab-vs-debateclub/index.html
  • public/debatelab-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/how-to-write-a-rebuttal-speech/index.html
  • public/humans.txt
  • public/lincoln-douglas-debate/index.html
  • public/llms.txt
  • public/online-debate-timer-tool/index.html
  • public/online-debate-timer/index.html
  • public/policy-debate/index.html
  • public/public-forum-debate/index.html
  • public/world-schools-debate/index.html
  • public/wsdc-debate-practice/index.html
  • scripts/generate_seo_content.py
  • scripts/seo_guides.py
  • src/test/vercel-deployment-config.test.ts
  • vercel.json
💤 Files with no reviewable changes: 13
  • public/debate-evidence-verification/index.html
  • public/ai-debate-evidence-research/index.html
  • public/debate-cross-examination-tips/index.html
  • public/debate-weighing-guide/index.html
  • public/wsdc-debate-practice/index.html
  • public/ai-tools-for-debate-students/index.html
  • public/debate-note-taking-flowing/index.html
  • public/how-to-write-a-rebuttal-speech/index.html
  • public/online-debate-timer-tool/index.html
  • public/debate-impact-calculus/index.html
  • public/debate-case-generator/index.html
  • public/debatelab-alternatives/index.html
  • public/debate-argument-flowchart-tool/index.html

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📝 Walkthrough

The SEO guide catalog and published content were revised. Links now point to the AI case-generator route and updated guides. Retired pages were removed, and 301 redirects were added for legacy paths.

Changes: SEO guide and route updates

Layer / File(s) Summary
Guide catalog and source content
scripts/generate_seo_content.py, scripts/seo_guides.py, docs/operations.md
The generator supports per-guide modified dates with a fallback to CONTENT_DATE. The catalog and guide source include revised entries, new long-form guides, and updated FAQ content. Operations guidance documents date overrides and guide retirement steps.
Published guide content
public/argument-flowchart/*, public/debate-evidence-finder/*, public/how-to-cross-examine-in-debate/*, public/how-to-flow-in-debate/*, public/how-to-practice-rebuttals/*, public/how-to-weigh-in-debate/*, public/online-debate-timer/*, public/world-schools-debate/*, public/best-ai-debate-tools/*
These pages now contain expanded debate guidance and topic-specific visible and structured FAQs.
Guide links and retired pages
public/*/index.html, public/humans.txt, public/llms.txt
Navigation and related-guide links use the AI case-generator route and updated guide paths. Several former SEO pages were removed. The public page indexes now list the AI case-generator route.
Legacy redirects and validation
vercel.json, src/test/vercel-deployment-config.test.ts, docs/operations.md
Legacy guide paths, with and without trailing slashes, redirect to replacement pages with status 301. Tests check redirect destinations and links in generated pages.

Estimated code review effort: 3 (Moderate) | ~25 minutes

  • 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.

On the preview, /debate-weighing-guide/ gets the trailingSlash 308 to
/debate-weighing-guide before any redirect rule runs, then the 301 to
/how-to-weigh-in-debate. The /<slug>/ rules never fire, so remove
them and say in operations.md how slash URLs reach the survivor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the Codex review of #155:

- Case generation always researches the motion; there is no web
  research switch to turn on. The evidence finder now says so.
- WSDC rule 9.2 lets a third speaker present a small part of the team
  case if the first speaker announced it, and rule 15.3 says a speaker
  should accept at least two POIs. The World Schools page said
  otherwise.
- British Parliamentary has no reply speech, so the weighing guide no
  longer pairs it with WSDC's.
- The redirect test took the retired slugs from vercel.json, so
  deleting a rule also deleted its check. It now lists the 13 expected
  redirects.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Programcode
Programcode merged commit 4f9e0a0 into main Oct 20, 2026
8 of 15 checks passed
@Programcode
Programcode deleted the seo/consolidate-duplicate-guides branch October 20, 2026 15:45
Programcode added a commit that referenced this pull request Oct 22, 2026
The case generator guide told readers to turn on web research, but
Generate researches every motion and has no switch. It also put format
and instructions in Generate, where they live in the Current Debate.
Eight other guides claimed things the app does not do: Sparring reading
Library sources, a debate notes field, saved rebuttal blocks, sources
used in every answer, and a prep-timer use for the speech timer.

gsc_submit.py now inspects the survivors of the four guide slugs that
#155 retired. The brand-redirect URLs stay on purpose.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

2 active deployments
Preview – debatelab-staging — de84234f Deployed Oct 20, 2026 by vercel[bot]
Preview – debate-navigator — de84234f Deployed Oct 20, 2026 by vercel[bot]
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