Skip to content

Merge five thin guides into their survivors and deepen the skills guides - #235

Merged
Programcode merged 4 commits into
mainfrom
seo/merge-thin-guides
Oct 26, 2026
Merged

Programcode merged 4 commits into
mainfrom
seo/merge-thin-guides

Conversation

@Programcode

@Programcode Programcode commented Oct 26, 2026 •

Copy link
Copy Markdown
Owner

Spec 2, part 2 of 2. Stacked on #233. Merge #233 first. This PR targets main, so until #233 merges, GitHub also shows #233's commits here. This PR's own changes are the diff seo/deepen-thin-guides...seo/merge-thin-guides.

What changed

5 weak pages merged into their survivors. Each gets a 301 in vercel.json and an entry in retiredGuides in src/test/vercel-deployment-config.test.ts. Its PAGES and ANSWERS entries and its public/<slug>/ folder are removed, and its best material is folded into the survivor:

Retired 301 to What the survivor gained
/debate-collapsing-strategy /debate-clash-points Now "Clash and collapse", with a section on where each format collapses
/debate-prep-time-management /how-to-prepare-for-a-debate-tournament A prep-time-by-format table and a section on spending prep in round
/debate-block-file-guide /how-to-practice-rebuttals A "Build a block file" section with an example block
/debate-pronunciation-and-delivery /debate-speech-structure Now "speech structure and delivery", with a delivery section
/ai-vs-traditional-debate-prep /ai-debate-practice An "AI vs traditional prep" section with a task table

Two tool pages linked to retired slugs: the timer page and the speech calculator page. Both now link to the survivors. scripts/gsc_submit.py lists none of the retired URLs. It now includes the 3 survivors it was missing.

6 skills pages deepened. These are clash points, tournament prep, speech structure, fallacies, motion analysis and judge adaptation. Each one has:

  • a worked example on an original practice motion
  • a table
  • "Common mistakes" and a 12 to 15-minute drill
  • 4 FAQs of its own
  • a rewritten lead answer that the sections don't repeat

Prep times and speech times come from src/lib/free-tools/formats.ts. Primary sources I opened:

  • the NSDA High School Unified Manual and the WUDC manual, on tournament prep
  • the WUDC manual's "squirrel" rule, on motion analysis
  • the WUDC manual's "ordinary intelligent voter" standard, on judge adaptation
  • the Stanford Encyclopedia of Philosophy entry on fallacies

Drills name only real modes by their UI labels: Case Generator, Brainstorm, Factoids, Flowchart, Case Attacker, Ask Coach, Crossfire and Sparring. They also say where Sparring doesn't run a format.

The shared default FAQs are gone. FAQS and FAQS_DATE are deleted, and the generator now refuses a guide that has no FAQs of its own. The FAQPage JSON-LD is built from the same list as the visible FAQs.

New guard test: src/test/seo/guide-content.test.ts. It runs in npm test and reads public/<slug>/index.html, which the build copies to dist/ unchanged. It checks two things:

  • Every guide has at least 700 words in <main> outside the related and About blocks.
  • No sentence longer than 60 characters appears on more than 3 guides. The check leaves out nav, the breadcrumb, the footer and the related block.

I confirmed it fails on #233's pages, where it caught 11 thin pages and the shared FAQ sentences on 15 pages, and passes here.

One decision for Adam. Three pages are exempt from the 700-word floor:

  • /debatelab-pricing (558 words)
  • /debatelab-vs-debateclub (529)
  • /debatelab-vs-windebate (654)

The spec didn't scope them, and padding them would mean adding pricing or competitor claims we can't source. The exemption is one Set in the test, so it's easy to remove once those pages get real content.

Word counts

Same method as #233: visible words in <main>, leaving out the breadcrumb, related links and About aside.

Page Before After
/debate-clash-points 248 1,222
/how-to-prepare-for-a-debate-tournament 230 1,259
/debate-speech-structure 246 1,215
/debate-fallacies 235 1,099
/debate-motion-analysis 245 1,040
/debate-judge-adaptation 231 1,040
/ai-debate-practice 1,458 1,695
/how-to-practice-rebuttals 1,731 2,033

With #233, all 10 pages in the spec now have more than 1,000 words. Of the 31 remaining guides, only the 3 exempt pages are under 700.

301s, curled locally

I built and served this branch with vercel dev, linked to the staging project, on 127.0.0.1, so vercel.json redirects ran as they do on Vercel:

/debate-collapsing-strategy -> 301 /debate-clash-points
/debate-prep-time-management -> 301 /how-to-prepare-for-a-debate-tournament
/debate-block-file-guide -> 301 /how-to-practice-rebuttals
/debate-pronunciation-and-delivery -> 301 /debate-speech-structure
/ai-vs-traditional-debate-prep -> 301 /ai-debate-practice

All 5 survivors returned 200, and an existing rule (/debate-weighing-guide) still returned 301. Under vercel dev the bare survivor paths served the SPA shell, because Vite handles them. The generated guide HTML is what dist/ serves in production, and check-site resolves every internal link against it.

Sitemap

The build lists 40 URLs, down from 45, so 5 fewer. check-site covers 43 HTML files with no problems.

For Spec 1 (seo/internal-links-brand-entity)

The cluster list in Spec 1 already leaves out all 5 retired slugs, so no cluster changes are needed. Two things to watch:

  • Every survivor stays in its cluster: clash points, tournament prep and speech structure in Skills; ai-debate-practice and how-to-practice-rebuttals in Practice and Skills.
  • The sections for all 10 rewritten slugs now live in scripts/seo_guides.py, and GUIDES replaces sections wholesale. Add in-body links there, not in PAGES, or they will be silently dropped.

internal_links() is unchanged in both PRs.

Review follow-up

Verification

npm run verify ran locally at this head (c349293) and passed. GitHub Actions is billing-blocked, so this is a local pass, not a CI pass.

  • docs:check, lint and typecheck passed.
  • vitest: 654 passed, including the new guide test. Collaboration tests: 30 passed. Edge tests: 482 passed.
  • The build passed. The sitemap has 40 URLs, and check-site found no problems across 43 HTML files.
  • test:sw passed, and the Playwright smoke run passed 47 of 47.

In a real browser I checked the stacked tables at 390px and the BP table at 1280px, and confirmed that /tools/debate-timer?format=bp opens with British Parliamentary selected. I didn't run the agentic e2e suite or the verify-debatelab recipes: this PR changes no app flow, and the tool-page edits only change two link targets.

🤖 Generated with Claude Code

Retire /debate-collapsing-strategy, /debate-prep-time-management,
/debate-block-file-guide, /debate-pronunciation-and-delivery and
/ai-vs-traditional-debate-prep with 301s to the guides that absorb them,
and repoint the two tool pages that linked to them.

Clash points, tournament prep, speech structure, fallacies, motion
analysis and judge adaptation each get a worked example on an original
motion, a table, common mistakes, a drill and their own FAQs. AI practice
gains an "AI vs traditional prep" section and rebuttal practice a "Build
a block file" section.

The two shared default FAQs are gone: every guide must have its own, and
a new test fails on a guide under 700 words or a sentence repeated on more
than three guides.

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

coderabbitai Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Caution

Review failed

The pull request is closed.

  • 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 3 commits October 26, 2026 17:51
scripts/__pycache__/seo_guides.cpython-312.pyc came in by mistake with
the guide changes. Ignore __pycache__/ and *.pyc so a script run that
imports the generator modules cannot add it again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Programcode
Programcode marked this pull request as ready for review October 26, 2026 18:10
Copilot AI balanced review requested due to automatic review settings October 26, 2026 18:10
@Programcode
Programcode merged commit 04e1a78 into main Oct 26, 2026
3 of 10 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.

Programcode added a commit that referenced this pull request Oct 26, 2026
#233 and #235 deepened the guides and retired five of them. The generator
keeps main's per-page FAQs, primary-source links, tables, short About block
and CONTENT_DATE floor, and this branch's clusters, in-body links and entity
JSON-LD. LINKS_DATE is gone: CONTENT_DATE already dates every page from
2026-10-26, which covers the shared related links.

The retired slugs leave CLUSTERS; their phrases now link the guides their
301s point to. In-body links also go in list and step items, since the
deepened guides put much of their prose there. GuideHub renders nothing on
/es and /hu routes, which do not exist yet on main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Programcode added a commit that referenced this pull request Oct 26, 2026
Conflicts resolved:
- i18n.ts: keep both default variable sets, product/brand/host from
  main and trialDays/proMonthly from this branch.
- en/es/hu.json: main's new hero headline and subheadline, this
  branch's {{trialDays}} trial badge.
- prerender/entry.tsx, check-site.mjs, docs/operations.md: keep both
  sides (main's entity graph and FAQ checks, this branch's localized
  pages and hreflang check).

GuideHub on /hu and /es now shows only the free tools at their
localized addresses, plus one link to the English guides on the home
page ("Angol nyelvű útmutatók", "Guías en inglés"). The Hungarian tool
labels use this branch's names (Vitaidőmérő, Vitatétel-generátor,
Jegyzetlap), and "cáfolást" follows the review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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