// c21 — handlers: the /reports cluster. Demo mockup pages plus the // live readout assembled from the deploy-time commit + test bundles. // Extracted from c21_app.ts per the SAMA Atomic rule. import { renderPage, renderNotFound, htmlResponse, } from "./b51_render_layout.ts"; import { reportsLandingMd, execSummaryMd, agentDrilldownMd, testsOverviewMd, } from "./b51_render_reports.ts"; import { DEMO_REPORTS, DEMO_PERIOD, DEMO_ORG, DEMO_REPOS, DEMO_SNAPSHOTS, DEMO_STABILITY, } from "./a31_reports_demo.ts"; import { buildLiveReports } from "./c14_real_reports.ts"; import { buildLiveTestData } from "./c14_real_tests.ts"; import { LIVE_REPO_OWNER, LIVE_REPO_NAME, LIVE_FETCH_COUNT, } from "./a31_site_config.ts"; // -------- shared banners + context builders -------- const DEMO_BANNER_HTML = `
demo data — design preview with synthetic numbers. Want the real readout? /reports/live renders the same shape from live tdd.md commits. why tdd.md needs this
`; const LIVE_BANNER_HTML = `
live data — sourced from ${LIVE_REPO_OWNER}/${LIVE_REPO_NAME} via the public commits API (5-min cache). Agent attribution comes from Co-Authored-By: footers; commits without one are excluded. Phase coverage measures % of commits tagged red:/green:/refactor:.
`; const demoContext = () => ({ reports: DEMO_REPORTS, period: DEMO_PERIOD, scopeLabel: `${DEMO_REPOS} repos · ${DEMO_ORG}`, bannerHtml: DEMO_BANNER_HTML, narrative: { changedHeading: "what changed this quarter", changedBody: "Cursor's score dropped 15 points after agent-mode became default in March; test-deletion incidents climbed from 2% to 14% of refactor commits, concentrated in the `api-gateway` repo. Claude Code's score rose after a phase-tagged commit prefix was added to CLAUDE.md at the end of January. Aider stays steadily high — auto-commit-per-edit prevents most cross-phase cheating on its own.", doingHeading: "what we're doing", doingBody: "- **Cursor in `api-gateway`**: agent-mode disabled for refactor prompts, CONVENTIONS rule \"never delete a test in a refactor commit\" pinned ([details →](/reports/demo/agents/cursor)).\n- **Roll out Claude Code**: copy the CLAUDE.md template that worked in `billing-service` to the other three repos.\n- **Next reading**: 2026-04-30, mid-Q2, to check whether the Cursor fix holds.", }, footerLinks: "[per-agent drill-down: Claude Code](/reports/demo/agents/claude-code) · [Cursor](/reports/demo/agents/cursor) · [Aider](/reports/demo/agents/aider) · [tests overview](/reports/demo/tests) · [back to /reports](/reports)", }); const liveContext = async () => { const live = await buildLiveReports(LIVE_REPO_OWNER, LIVE_REPO_NAME, LIVE_FETCH_COUNT); const period = live.earliest && live.latest ? `${live.earliest.slice(0, 10)} → ${live.latest.slice(0, 10)}` : "no commits fetched"; const drillLinks = live.reports .map((r) => `[${r.name}](/reports/live/agents/${r.slug})`) .join(" · "); return { reports: live.reports, period, scopeLabel: `${LIVE_REPO_OWNER}/${LIVE_REPO_NAME} · ${live.totalCommits} commits sampled${live.unknownCount > 0 ? ` (${live.unknownCount} unattributed, excluded)` : ""}`, bannerHtml: LIVE_BANNER_HTML, footerLinks: `${drillLinks ? drillLinks + " · " : ""}[tests overview](/reports/live/tests) · [demo preview](/reports/demo) · [back to /reports](/reports)`, }; }; // -------- /reports landing -------- export const reportsLandingHandler = async (): Promise => { const html = await renderPage({ title: "Reports — tdd.md", description: "Per-agent TDD-discipline reporting over real project repos: trend, failure-mode breakdown, and an exec summary fit for a quarterly readout.", bodyMarkdown: reportsLandingMd(), ogPath: "https://tdd.md/reports", noindex: true, }); return htmlResponse(html); }; // -------- /reports/demo -------- export const reportsDemoHandler = async (): Promise => { const ctx = demoContext(); const html = await renderPage({ title: "TDD-discipline report · Q1 2026 (demo) — tdd.md", description: "Mockup of the management-level TDD-discipline report — single page, three agents, with trend and narrative.", bodyMarkdown: execSummaryMd(ctx), ogPath: "https://tdd.md/reports/demo", noindex: true, }); return htmlResponse(html); }; export const reportsDemoTestsHandler = async (): Promise => { const html = await renderPage({ title: "Tests overview (demo) — tdd.md", description: "Mockup of the per-test overview: current pass/fail snapshot per repo plus test stability over the quarter.", bodyMarkdown: testsOverviewMd({ period: DEMO_PERIOD, bannerHtml: DEMO_BANNER_HTML, snapshots: DEMO_SNAPSHOTS, stability: DEMO_STABILITY, }), ogPath: "https://tdd.md/reports/demo/tests", noindex: true, }); return htmlResponse(html); }; export const reportsDemoAgentHandler = async (req: { params: { slug: string } }): Promise => { const slug = req.params.slug as (typeof DEMO_REPORTS)[number]["slug"]; const ctx = demoContext(); const md = agentDrilldownMd(slug, ctx); if (!md) { const html = await renderNotFound(`/reports/demo/agents/${slug}`); return htmlResponse(html, 404); } const entry = DEMO_REPORTS.find((r) => r.slug === slug)!; const html = await renderPage({ title: `${entry.name} drill-down (demo) — tdd.md`, description: `Per-agent drill-down mockup for ${entry.name}: trend, failure-mode breakdown, recent flagged commits with coaching links.`, bodyMarkdown: md, ogPath: `https://tdd.md/reports/demo/agents/${slug}`, noindex: true, }); return htmlResponse(html); }; // -------- /reports/live -------- export const reportsLiveHandler = async (): Promise => { const ctx = await liveContext(); const html = await renderPage({ title: "TDD-discipline report · live — tdd.md", description: `Live discipline report built from the real commit history of syntaxai/tdd.md (last ${LIVE_FETCH_COUNT} commits, 5-min cache).`, bodyMarkdown: execSummaryMd(ctx), ogPath: "https://tdd.md/reports/live", noindex: true, }); return htmlResponse(html); }; export const reportsLiveTestsHandler = async (): Promise => { const data = await buildLiveTestData(LIVE_REPO_OWNER, LIVE_REPO_NAME); const ranOn = data.ranAt ? new Date(data.ranAt).toISOString().slice(0, 10) : null; const period = data.runsCount === 0 ? "no runs in bundle" : `last run ${ranOn} · ${data.runsCount} run${data.runsCount === 1 ? "" : "s"} cumulative`; const unavailableNote = data.runsCount === 0 ? "No test runs bundled yet. The next deploy will run `bun test --reporter=junit` on the current HEAD and publish the result here. Stability (flaky %, deletion) builds up as more runs land in the bundle — the demo at [/reports/demo/tests](/reports/demo/tests) shows where this is heading." : undefined; const html = await renderPage({ title: "Tests overview · live — tdd.md", description: `Live test snapshot of ${LIVE_REPO_OWNER}/${LIVE_REPO_NAME} — ${data.runsCount} run${data.runsCount === 1 ? "" : "s"} bundled.`, bodyMarkdown: testsOverviewMd({ period, bannerHtml: LIVE_BANNER_HTML, snapshots: data.snapshots, stability: data.stability, unavailableNote, placeholderTests: data.placeholderTests, }), ogPath: "https://tdd.md/reports/live/tests", }); return htmlResponse(html); }; export const reportsLiveAgentHandler = async (req: { params: { slug: string } }): Promise => { const ctx = await liveContext(); const slug = req.params.slug as (typeof DEMO_REPORTS)[number]["slug"]; const md = agentDrilldownMd(slug, ctx); if (!md) { const html = await renderNotFound(`/reports/live/agents/${slug}`); return htmlResponse(html, 404); } const entry = ctx.reports.find((r) => r.slug === slug)!; const html = await renderPage({ title: `${entry.name} drill-down · live — tdd.md`, description: `Live drill-down for ${entry.name} on syntaxai/tdd.md — trend, failure-mode breakdown, recent commits.`, bodyMarkdown: md, ogPath: `https://tdd.md/reports/live/agents/${slug}`, noindex: true, }); return htmlResponse(html); };