Title Casing
How a page's
title:frontmatter (and its matching# H1) are capitalized. Enforced bynpm run normalize:titles/scripts/normalize-wiki-titles.ts. Source: User, 2026-06-13; User correction, 2026-06-22
Prose pages (Title Case)
All reader-facing page/article titles use Title Case, including skills and tools whose executable slug is lowercase:
- Capitalize the first and last word and all principal words (nouns, verbs incl. forms of "to be" like Is/Are, adjectives, adverbs, pronouns).
- Lowercase short function words mid-title only:
a, an, the, and, but, or, nor, for, of, to, in, on, at, by, vs, as, from, with, into, over, per. - Use display spaces for lowercase slug titles:
ai-seo (skill)becomesAI SEO (Skill). Keep the real slug inaliases:, source URLs, and body code.
Good: Staying in the Loop with Agents · The Eval Loop (Slop Is an Output Problem) · AI SEO (Skill) · Agent Browser -- Browser Automation for Agents.
Bad: Staying in the Loop With Agents · Resolver Vs Skill Resolver · ai-seo (skill) · agent-browser -- Browser Automation for Agents.
Preserve brand and acronym casing
Preserve known acronym and brand casing when it is part of a polished title:
AI, MCP, SDK, UI, UX, API, CSS, YC, LLM, 3D, CoTCodec, ReAct, iMessage, GSAP, PGlite, PostHog, OpenRouter, Next.js, arXiv, npm, v0.
Do not preserve lowercase slugs as display titles. skills/personal/<slug>/
and source URLs remain lowercase; wiki article titles do not. A title that starts
with a slug-like product or tool name still gets reader-facing article casing:
json-render -- Generative UI Framework becomes JSON Render -- Generative UI Framework.
H1 matches the title
The body # H1 should match the frontmatter title: exactly.
Enforcement
Run npm run normalize:titles after adding or importing pages. The script updates
frontmatter title: and the first matching Markdown # H1, preserving slugs and
aliases. New captures must pass this before rebuild/search steps.
Title Contract
| Surface | Default | Exception |
|---|---|---|
Frontmatter title: |
Reader-facing Title Case | Preserve exact brand/acronym casing |
| H1 | Matches frontmatter exactly | None for ordinary pages |
| Slugs and executable names | Stay lowercase in paths, URLs, aliases, and code | Display title still becomes reader-facing |
| Skill/tool articles | Title Case display, slug preserved in aliases/source | None unless brand casing demands it |
Proof
Run npm run normalize:titles, then npx tsx scripts/build-index.ts. The proof is that the generated index and H1/title pairs agree while slugs remain stable.
Style Rule Contract
This page follows Style Rule Contract: name the default pattern, banned pattern, reason, exception, proof, and codification path clearly enough that the next agent can apply the rule without asking Kevin again. If a local repo has a stricter rule, follow the local rule and update the wiki when the decision becomes durable.
Timeline
- 2026-07-01 | Aligned this page with Style Rule Contract so style guidance names default behavior, banned patterns, exceptions, proof, and codification expectations. Source: User request, 2026-07-01
- 2026-07-01 | Added a title contract and proof rule for frontmatter/H1 agreement, brand casing, slug preservation, and generated index validation. Source: User request, 2026-07-01
- 2026-06-22 | Removed the old skill/tool lowercase carve-out after Kevin clarified that every reader-facing page/article title should be properly capitalized regardless of executable slug casing. Added
scripts/normalize-wiki-titles.ts/npm run normalize:titles. Source: User correction, 2026-06-22 - 2026-06-13 | Page created for article title hygiene. Source: User directive, 2026-06-13