diff --git a/docs/operations.md b/docs/operations.md index 84f62d23d..bec724261 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -58,15 +58,15 @@ The free tools under `/tools` ([`src/pages/tools/`](../src/pages/tools/)) are pr [`scripts/sitemap.mjs`](../scripts/sitemap.mjs) then writes `dist/sitemap.xml` from every page in `dist/` that names itself as canonical and is not `noindex`. Each `` is the `dateModified` the page declares in its JSON-LD: the guide pages' `CONTENT_DATE` in [`scripts/generate_seo_content.py`](../scripts/generate_seo_content.py), the legal pages' "last updated" dates, the tool pages' `TOOL_PAGES_MODIFIED`, and the landing page's last source commit. A page without a date is listed without ``. -[`scripts/check-site.mjs`](../scripts/check-site.mjs) runs next and fails the build when an internal link, a `#fragment`, a sitemap URL or an `llms.txt` URL does not resolve (it applies the `vercel.json` redirects and rewrites), when JSON-LD does not parse or carries HTML entities, when an indexed page other than `/terms`, `/privacy`, and `/expocit/sources` lacks its question H2 (`#short-answer`) as the first H2, or when an image has no alt text, a button has no name or a form field has no label. +[`scripts/check-site.mjs`](../scripts/check-site.mjs) runs next and fails the build when an internal link, a `#fragment`, a sitemap URL or an `llms.txt` URL does not resolve (it applies the `vercel.json` redirects and rewrites), when JSON-LD does not parse or carries HTML entities, when an indexed page other than `/terms`, `/privacy`, and `/expocit/sources` lacks its question H2 (`#short-answer`) as the first H2, when a page's first heading is not its H1 or a heading skips a level (H1 to H3), or when an image has no alt text, a button has no name or a form field has no label. -The guide pages in `public//index.html` are generated, not hand-edited: run `python3 scripts/generate_seo_content.py` and commit its output. Short pages live in its `PAGES` list; pages with long-form copy, their own highlight-card descriptions, and their own FAQs (which also feed the page's FAQPage JSON-LD) live in [`scripts/seo_guides.py`](../scripts/seo_guides.py). Keep `PAGES` in order, because each page's related-guide links are picked by position. A guide entry can set its own `modified` date, which overrides `CONTENT_DATE` for that page alone. +The guide pages in `public//index.html` are generated, not hand-edited: run `python3 scripts/generate_seo_content.py` and commit its output. Short pages live in its `PAGES` list; pages with long-form copy, their own highlight-card descriptions, and their own FAQs (which also feed the page's FAQPage JSON-LD) live in [`scripts/seo_guides.py`](../scripts/seo_guides.py). Keep `PAGES` in order, because each page's related-guide links are picked by position. A guide entry can set its own `modified` date, which overrides `CONTENT_DATE` for that page alone. Pages that show the shared `FAQS` are dated no earlier than `FAQS_DATE`, so move it when those questions change. Every guide opens with the reader's main question as its first H2 and an answer of at most 100 words, kept in [`scripts/seo_answers.py`](../scripts/seo_answers.py); the generator refuses a page without one or with a longer answer. Each guide shows visible "Published" and "Updated" dates (`PUBLISHED_DATE` or a `published` key, and the `modified` date) that match its Article JSON-LD. Prices and plan facts are stated "as of" the month in `factsCheckedOn` in `src/config/site.json`; move that date when you recheck them, and the generated About line on every guide, `llms.txt` and the landing page follow. Copy in `seo_guides.py` and `seo_answers.py` that names the month itself (prices and competitor facts) needs the same edit: search those files for "As of". The generator also writes `public/llms.txt`, the plain summary for AI agents. `public/robots.txt` allows AI crawlers by name in their own group, which repeats the private-route rules because a crawler that matches a named group ignores `*`. To retire a guide, delete its `PAGES` entry and its `public//` folder (the generator never deletes), add its redirects to `vercel.json`, and repoint any link to it. Two guides that answer the same search should become one page, not two thin ones. -The site origin, product name, brand line, and organization name live in [`src/config/site.json`](../src/config/site.json). The app's head tags, the prerender and sitemap scripts, and the guide generator all read it, and guide copy names the product with a `{product}` token. Do not hardcode those strings in new code or copy. +The site origin, product name, brand line, and organization name live in [`src/config/site.json`](../src/config/site.json). The app's head tags, the prerender and sitemap scripts, and the guide generator all read it, and guide copy names the product with a `{product}` token and the Pro price with `{pro_price}`. The number of prep modes comes from the tool lists in [`tool-links.tsx`](../src/components/features/tools/tool-links.tsx): the app's copy reads `PREP_MODE_COUNT` and `UTILITY_COUNT`, and guide copy uses `{mode_count}`, `{mode_names}` and `{utility_names}`. Do not hardcode those strings in new code or copy. [`src/test/vercel-deployment-config.test.ts`](../src/test/vercel-deployment-config.test.ts) guards these rules. Update it together with `vercel.json`, and do not paste the full configuration into another guide. diff --git a/docs/testing.md b/docs/testing.md index 8200a4ce1..ffbf05e79 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -102,7 +102,7 @@ This sends one tiny typed choice to OpenRouter's Decisions endpoint using the pi npm run build ``` -This proves the Vite production bundle compiles, prerenders the public pages, checks the built site's links, fragments, JSON-LD and basic accessibility with `scripts/check-site.mjs`, and then walks the emitted Vite manifest to reject feature-only PDF, DOCX, chart, ReactFlow, export, and Admin modules, the Spanish and Hungarian catalogs, and the signed-in layout from the static `index.html` dependency graph. It does not prove authentication, database behavior, provider access, or production deployment. +This proves the Vite production bundle compiles, prerenders the public pages, checks the built site's links, fragments, JSON-LD and basic accessibility (including heading order) with `scripts/check-site.mjs`, and then walks the emitted Vite manifest to reject feature-only PDF, DOCX, chart, ReactFlow, export, and Admin modules, the Spanish and Hungarian catalogs, and the signed-in layout from the static `index.html` dependency graph. It does not prove authentication, database behavior, provider access, or production deployment. ## Production service-worker smoke diff --git a/public/ai-debate-case-generator/index.html b/public/ai-debate-case-generator/index.html index 242298b8f..36025f782 100644 --- a/public/ai-debate-case-generator/index.html +++ b/public/ai-debate-case-generator/index.html @@ -22,7 +22,7 @@ - +
diff --git a/public/ai-debate-coach/index.html b/public/ai-debate-coach/index.html index 1bb6973ae..a3cdeea25 100644 --- a/public/ai-debate-coach/index.html +++ b/public/ai-debate-coach/index.html @@ -22,7 +22,7 @@ - +
diff --git a/public/ai-debate-practice/index.html b/public/ai-debate-practice/index.html index 4dcaf918f..fd244a00f 100644 --- a/public/ai-debate-practice/index.html +++ b/public/ai-debate-practice/index.html @@ -22,7 +22,7 @@ - +
diff --git a/public/ai-rebuttal-generator/index.html b/public/ai-rebuttal-generator/index.html index 26b135157..ea51f48d1 100644 --- a/public/ai-rebuttal-generator/index.html +++ b/public/ai-rebuttal-generator/index.html @@ -22,7 +22,7 @@ - +
diff --git a/public/ai-vs-traditional-debate-prep/index.html b/public/ai-vs-traditional-debate-prep/index.html index f5ffe1f3a..f967437bb 100644 --- a/public/ai-vs-traditional-debate-prep/index.html +++ b/public/ai-vs-traditional-debate-prep/index.html @@ -17,12 +17,12 @@ - + - +
@@ -31,11 +31,11 @@
-
Comparison

AI vs Traditional Debate Prep

AI speeds up structure; traditional research and coaching provide depth and judgment.

Published · Updated

+
Comparison

AI vs Traditional Debate Prep

AI speeds up structure; traditional research and coaching provide depth and judgment.

Published · Updated

Is AI debate prep better than traditional research and coaching?

Neither replaces the other. AI is faster at structure: case outlines, rebuttal blocks, topic brainstorming and evidence leads, which saves time on the repetitive parts of prep. Traditional prep does better at original source reading, real coaching feedback, tournament-specific strategy and adapting to a specific opponent, because those need human judgment. The practical answer is to combine them: use AI for scaffolding, traditional research for depth and coaching for strategy.

Speed and structure

Research depth

Human judgment

What AI does well

AI generates structure fast: case outlines, rebuttal blocks, topic brainstorming, and evidence leads. It saves time on the repetitive parts of prep.

What traditional prep does better

Original source reading, real coaching feedback, tournament-specific strategy, and adapting to a specific opponent all require human judgment.

How to combine them

Use AI for scaffolding, use traditional research for depth, and use coaching for strategy. DebateLab supports the AI scaffolding step.

-

Frequently asked questions

Is DebateLab an AI debate practice platform?

Yes. DebateLab focuses on debate prep workflows such as cases, rebuttals, evidence, flowcharts, coaching, and timing.

Can Google index private DebateLab app pages?

No. Private dashboards and account routes should remain noindexed while public guides provide crawlable context.

Should students verify AI-generated debate evidence?

Yes. AI can suggest research leads, but students should check original sources before using evidence in round.

+

Frequently asked questions

Is DebateLab an AI debate practice platform?

Yes. DebateLab focuses on debate prep workflows such as cases, rebuttals, evidence, flowcharts, coaching, and timing.

Should students verify AI-generated debate evidence?

Yes. AI can suggest research leads, but students should check original sources before using evidence in round.