Fifty pages about fifty tests, 210 sources, and the 29 tests we refused to write a page about
CogniPrep simulates employer assessments. Until last week the site had two kinds of page for them: a hub per vendor (/games/shl, covering the whole suite) and a guide per employer. What it did not have was a page per tes
CogniPrep simulates employer assessments. Until last week the site had two kinds of page for them: a hub per vendor (/games/shl, covering the whole suite) and a guide per employer. What it did not have was a page per test, and that is what candidates actually type. Somebody invited to "Aon gapChallenge" or "SHL Verify Numerical Reasoning" searches those words. The practice games themselves sit behind a login and are noindex, so nothing on the site answered the query directly.
So: 50 new pages at /games/<provider>/<test>. Here is what the content type looks like counted, rather than described.
One registry, ten files, one file per provider
lib/games/test-pages/ is twelve files and about 342 KB: a types file, an index, and ten content files, one per provider. The split is not aesthetic. Ten workers filled these in parallel on ten branches, and one file per provider is the only shape where none of them ever edits the same file.
Aon 9 pages, pymetrics 8, Test Partnership 7, SHL 6, Criteria 5, HireVue 4, Arctic Shores 3, Korn Ferry 3, Revelian 3, Cappfinity 2.
Each route file is eight lines:
import { TestPageShell, testPageMetadata } from '@/components/games/TestPageShell';
import { requireTestPage } from '@/lib/games/test-pages';
const entry = requireTestPage('aon', 'gapchallenge');
export const metadata = testPageMetadata(entry);
export default function Page() {
return <TestPageShell entry={entry} />;
}
requireTestPage throws rather than returning undefined, with a one-line comment saying why: a typo in a page.tsx should fail the build, not ship a page with no content.
Totals across the 50: 201 body sections, 303 key-fact rows, 183 FAQs, 28,757 rendered words, between 339 and 882 words per page. The most common fact row is "What it measures" (43 of 50 pages), then "Time" (30), "Scoring" (17).
Every factual line resolves to a URL somebody opened
The entry type carries sources and a reviewed date, and the shell prints both at the foot of the page. 210 sources across the 50 pages, 2 to 12 per page, over 37 distinct domains. The domain histogram is the interesting part:
- criteriacorp.com 23, pymetrics.zendesk.com 21, shl.com 17, help.arcticshores.com 16, testpartnership.com 16, aon.com 10 plus assets.aon.com 6, kornferry.com 9, hirevue.com 7. Vendor documentation is the bulk of it, which is the only honest basis for a page describing a vendor's test.
- web.archive.org 24. Six of the 50 pages depend on at least one archive snapshot, because vendors reorganise their sites and a help-centre article about a test from 2023 is often only reachable through the Wayback Machine. No page is archive-only.
- patents.google.com 8. For a few game-based tests the clearest first-party statement of what is being measured is the vendor's own patent filing.
Two keyword collisions survived across 286 keyword strings (284 distinct), and both are correct rather than careless: "balloon analogue risk task" appears on two different vendors' balloon tasks, and "aon deductive reasoning test" on the two Aon tests that are both deductive.
The 29 pages we did not build
The plan set a floor: four sourceable facts, or no page. Twenty-nine planned pages failed it and were written up as skipped rather than filled with hedged prose: 11 Arctic Shores tasks, HireVue Pathfinder, Digitspan, Flashback, Puzzle, E-Motions, Portrait, Teamchat and CodeVue, SHL Verbal and the SHL SJT, pymetrics Keypress, Lengths and Cards, and three Cognify subgames that only make sense as part of the whole.
A page that says "this test is believed to be around 20 minutes" six times is worse than no page. It ranks for a while, disappoints everyone who lands on it, and commits you to maintaining a claim you cannot check.
The guard test, including the one assertion nobody expects
Nothing renders these pages until someone visits them, so the mistakes that matter are invisible in review. The test file asserts:
- a route folder for every registry entry, and a registry entry for every route folder (both directions, by reading the directory)
- every
gameIdsentry exists and belongs to the same provider -
metaTitleat most 48 characters, because the root layout appends " | CogniPrep" to reach the 60-character budget. Exactly one page sits on the limit: "Criteria UCAT: Universal Cognitive Aptitude Test", at 48 -
metaDescriptionunder 160. The 50 land between 139 and 158 - no em dash anywhere in any string, by walking the whole entry object
- every
relatedhref resolves to a realapp/<path>/page.tsx - and the odd one: no new page path may start with a
Disallowprefix in our own robots.txt
That last one exists because /games/<id> is a game route and we block all 372 of them, which is 744 of the 796 Disallow lines in the file. The new pages live one segment deeper under the same prefix. Today no collision exists, but a future game id that matched a provider id would silently de-index a whole family of pages, and nobody reads robots.txt when adding content.
Two small layout decisions
The desktop layout is one grid with three children, so the practice panel exists exactly once in the DOM: on a phone it sits straight after the key facts, and on desktop the grid moves it into a sticky right column. Rendering it twice behind hidden md:block would have been faster to write and would have doubled the panel in the HTML.
And the breadcrumb separator is a chevron rather than a slash, for a reason you only find by looking: several vendor labels contain a slash themselves. "Practice tests / Aon / cut-e / gapChallenge" is unreadable.
49 of the 50 pages give h1 and <title> different wording on purpose, because the two are read in different places: the title competes in a result list, the h1 confirms you landed in the right place.
See it
Open cogniprep.app/games/aon/gapchallenge and scroll to the bottom. Every fact row above it rests on the two Aon URLs listed under "Sources", including the scoring row, which says plainly that no rule is published for this specific test and quotes what Aon does say about its performance tests in general.
Then open cogniprep.app/games/shl/verify-numerical-reasoning and compare the footer line: same shape, same review date, different sources. If you want the inverse, cogniprep.app/games/hirevue lists four test pages for a vendor with a dozen products, and the eight missing ones are the skipped list above.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.