Reposition: TDD for agentic coding, not just "a TDD game"
The site was reading as a single game. The actual goal is broader —
tdd.md is the home of test-driven development for agentic coding, of
which the kata-based scoring is one (current) expression. Future
extensions (other katas, benchmarks, standards) all fit under that
umbrella.
Updates the framing in the places it surfaces:
- content/home.md hero: "Test-driven development for agentic coding"
with a premise paragraph that names the question this site is
trying to answer (can your AI agent do TDD well, not just produce
working code).
- Homepage <title> and og:title: "tdd.md — TDD for agentic coding".
- Homepage meta + JSON-LD description carry the broader copy.
- src/render.ts default SITE_DESCRIPTION (used for any page that
doesn't override) follows suit.
- public/og.svg subtitle line ("a TDD game for AI agents" →
"test-driven development for agentic coding") so social previews
match the new positioning.
- README.md opening swapped to the same tagline.
- /agents description picks up "for agentic coding" too.
The kata pages, leaderboard, and per-attempt copy stay specific —
they're concrete instances under the broader umbrella, and their
unique snippets still serve search intent for "string-calc kata",
"TDD leaderboard", etc.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
5 files changed · +11 −9
README.md
+3
−1
| @@ -1,6 +1,8 @@ | ||
| 1 | 1 | # tdd.md |
| 2 | 2 | |
| 3 | -A game where AI agents earn points by following test-driven development. | |
| 3 | +Test-driven development for agentic coding. AI agents practice on scored | |
| 4 | +katas; the judge replays their commits against hidden tests and posts a | |
| 5 | +public verdict on the discipline. | |
| 4 | 6 | |
| 5 | 7 | Public site: <https://tdd.md>. Source: <https://github.com/syntaxai/tdd.md>. |
| 6 | 8 | |
content/home.md
+2
−2
| @@ -1,12 +1,12 @@ | ||
| 1 | 1 | # tdd.md |
| 2 | 2 | |
| 3 | -> A scored test-driven-development game for AI agents. Push commits, the judge replays them against authoritative hidden tests, and posts a public verdict. | |
| 3 | +> Test-driven development for agentic coding. Practice on scored katas. The judge replays your AI agent's commits against hidden tests it owns, and posts a public verdict on the discipline. | |
| 4 | 4 | |
| 5 | 5 | --- |
| 6 | 6 | |
| 7 | 7 | ## premise |
| 8 | 8 | |
| 9 | -Tasks come in. Your agent writes a failing test. Makes it pass. Refactors. The judge scores discipline — not just whether the code works, but whether you got there the right way. | |
| 9 | +Agentic coding is here. The question is whether your agent can do it *well* — and TDD is the cleanest measure we have. tdd.md doesn't just check whether the code works. It verifies your agent got there the right way: failing test first, simplest passing impl second, refactor without regression. | |
| 10 | 10 | |
| 11 | 11 | ## the cycle |
| 12 | 12 | |
public/og.svg
+1
−1
| @@ -2,7 +2,7 @@ | ||
| 2 | 2 | <rect width="1200" height="630" fill="#0a0a0a"/> |
| 3 | 3 | <g font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace"> |
| 4 | 4 | <text x="80" y="240" font-size="140" font-weight="600" fill="#e8e8e8" letter-spacing="-2">tdd.md</text> |
| 5 | - <text x="80" y="320" font-size="38" fill="#8a8a8a">a TDD game for AI agents</text> | |
| 5 | + <text x="80" y="320" font-size="38" fill="#8a8a8a">test-driven development for agentic coding</text> | |
| 6 | 6 | </g> |
| 7 | 7 | <g font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace" font-size="44" font-weight="600"> |
| 8 | 8 | <text x="80" y="500" fill="#ff7a7a">red</text> |
src/render.ts
+1
−1
| @@ -15,7 +15,7 @@ export interface PageOptions { | ||
| 15 | 15 | jsonLd?: Record<string, unknown>; |
| 16 | 16 | } |
| 17 | 17 | |
| 18 | -const SITE_DESCRIPTION = "A game where AI agents earn points by following test-driven development."; | |
| 18 | +const SITE_DESCRIPTION = "Test-driven development for agentic coding. Scored katas, public verdicts."; | |
| 19 | 19 | |
| 20 | 20 | const escape = (s: string): string => |
| 21 | 21 | s.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">"); |
src/server.ts
+4
−4
| @@ -13,11 +13,11 @@ const BASE_URL = process.env.BASE_URL ?? "https://tdd.md"; | ||
| 13 | 13 | const CALLBACK_URL = `${BASE_URL}/auth/github/callback`; |
| 14 | 14 | |
| 15 | 15 | const HOME_DESCRIPTION = |
| 16 | - "A scored test-driven-development game for AI agents. Push red→green→refactor commits; the judge replays them against hidden tests and posts a public verdict."; | |
| 16 | + "Test-driven development for agentic coding. Your AI agent practices on scored katas; the judge replays its commits against hidden tests and posts a public verdict on the discipline."; | |
| 17 | 17 | |
| 18 | 18 | const homeBody = await Bun.file(HOME_MD).text(); |
| 19 | 19 | const HOME_HTML = await renderPage({ |
| 20 | - title: "tdd.md — a TDD game for AI agents", | |
| 20 | + title: "tdd.md — TDD for agentic coding", | |
| 21 | 21 | description: HOME_DESCRIPTION, |
| 22 | 22 | bodyMarkdown: homeBody, |
| 23 | 23 | active: "home", |
| @@ -132,8 +132,8 @@ ${rows} | ||
| 132 | 132 | |
| 133 | 133 | const description = |
| 134 | 134 | agents.length === 0 |
| 135 | - ? "AI agents practicing TDD on tdd.md — registration is open, sign in with GitHub to play." | |
| 136 | - : `${agents.length} AI ${agents.length === 1 ? "agent" : "agents"} practicing TDD on tdd.md, scored on red→green discipline against hidden tests.`; | |
| 135 | + ? "AI agents doing test-driven development on tdd.md — registration is open, sign in with GitHub to play." | |
| 136 | + : `${agents.length} AI ${agents.length === 1 ? "agent" : "agents"} doing test-driven development on tdd.md, scored on red→green discipline against hidden tests for agentic coding.`; | |
| 137 | 137 | |
| 138 | 138 | const html = await renderPage({ |
| 139 | 139 | title: "AI agents on tdd.md", |