Skip to content

feat(retro): features, metadata, about, privacy drafts and the claims register (#300) - #327

Merged
spokvulcan merged 1 commit into
mainfrom
feat/300-site
Sep 6, 2026
Merged

feat(retro): features, metadata, about, privacy drafts and the claims register (#300)#327
spokvulcan merged 1 commit into
mainfrom
feat/300-site

Conversation

@spokvulcan

Copy link
Copy Markdown
Owner

Part (b) of #300, stacked on #326. Spec: docs/spec/retro.md §18.3–§18.4, §20, §21.1; ADR-0014, ADR-0019, ADR-0020, ADR-0024.

What changed

  • /features is one page anchored #planning-poker and #retro, with a retro section of eight facts. The page title drops "Planning Poker". Copy lives in src/app/features/copy.ts.
  • Metadata: site default title is "Free Planning Poker & Retros Online | AgileKit" (also OG and Twitter). Blog subtitle and short description read from src/lib/site-copy.ts.
  • About carries the position sentence from the spec; copy in src/app/about/copy.ts.
  • Pricing page copy moved to src/app/pricing/copy.ts; "insights" replaced per the words rule.
  • Claims register test (src/lib/claims-register.test.ts, node project) now walks every exported line of the six copy modules: no AI, no workspace/org product, no outcome claims, no anonymity claims, no effect sizes, no "X% of action items", no retro pricing tiers, no team-measuring numbers, "Retro" in UI labels, "Session" only inside planning poker, "notification"/"insights" never, "ceremony" docs-only. A fixture self-check proves each rule bites.
  • Privacy drafts: PRIVACY_POLICY_DRAFTS exported, unrendered, keyed by section title, with a reviewer note. Nothing on the live privacy page changes.

Manual follow-up

Verification

  • vitest: 127 files, 1193 passed (claims register 18/18); Playwright: 87 passed, 1 pre-existing skip; tsc --noEmit and eslint clean.

Closes #300.

https://claude.ai/code/session_01G9bjAL6awe9ayTe8X2MnqS

@vercel

vercel Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
agilekit Ready Ready Preview, v0 Sep 6, 2026 2:03am UTC

@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown

Review of #327

Reviewed the diff (about/features/pricing copy extraction, site metadata, privacy drafts, claims-register expansion). Overall this is a clean, well-organized refactor: hardcoded strings are consistently extracted into copy.ts modules with id-keyed lookups for icons/visuals, and the claims-register test is a genuinely clever piece of engineering (per-sentence retro-scoping, a self-test proving the checker itself catches every rule). A few notes:

Nit: duplicated CTA button styling loses visual hierarchy

In both src/app/about/about-content.tsx (bottom CTA section, ~line 199-213) and src/app/features/features-content.tsx (~line 594-599), the "Start estimating" and "Start a retro" buttons are both rendered with the primary (solid black/white) style, so two identical-looking primary buttons sit side by side with no visual hierarchy between them.

This is inconsistent with the Hero section in both files, which correctly pairs a primary style (primaryCta) with a secondary/outline style (secondaryCta) for the same two CTAs. Worth aligning the bottom CTA section the same way, or intentionally documenting why both should be primary there.

Also, about-content.tsx still inlines the long Tailwind class string three times (hero button, CTA estimate, CTA retro) rather than extracting primaryCta/secondaryCta constants the way features-content.tsx now does — minor DRY inconsistency between the two files after this refactor.

Nit: About hero reuses STACK.link.href for an unrelated CTA

In about-content.tsx, the Hero's "Star on GitHub" button reads its href from STACK.link.href (about/copy.ts), which is really the Architecture section's "View the architecture" link. They happen to point to the same URL today, but borrowing a differently-scoped copy field for the hero CTA is a bit surprising to a future reader — a dedicated field (or reusing a shared GITHUB_URL constant) would make the coupling less accidental.

Code quality / test coverage

  • The claims-register.test.ts additions (site metadata, features, about, pricing modules) look thorough, and the fixture self-check in "the checker itself" is a nice safety net against a checker that silently stops catching violations.
  • PRIVACY_POLICY_DRAFTS is clearly marked NOT RENDERED with a reviewer note about the [N] backup-retention figure — a good, low-risk way to stage draft copy without publishing unreviewed legal claims.
  • No security concerns spotted: no new user input handling, no new auth-sensitive code paths — this PR is copy/content only.
  • Didn't find functional bugs in the id-keyed icon/visual lookup tables (ICONS, POKER_VISUALS, VALUE_ICONS, STACK_ICONS) — checked for key collisions across the merged id namespaces in features-content.tsx and didn't find any.

Nothing here blocks merging — the two CTA-styling nits are cosmetic and easy to follow up on.

@spokvulcan
spokvulcan changed the base branch from feat/300-homepage to main September 6, 2026 02:01
… register (#300)

/features is one page with two anchored sections, `#planning-poker` and
`#retro`; its title and Open Graph title drop "Planning Poker". The retro
section says only what the storage backs: six formats, cards written in
parallel and before the meeting, anonymous or named per team, dots and
the discussion walk, action items that carry over, history kept by the
team with Markdown and JSON export, join by link. The roadmap lists Retros
as shipped; "Smart Analytics" is rewritten under the words rule.

Site default title becomes "Free Planning Poker & Retros Online |
AgileKit", with the description and social cards to match, read from
`lib/site-copy.ts`; keywords are untouched, SEO being out of scope. The About page takes the position: "the
free, open-source way for distributed Scrum teams to estimate and reflect
in writing, everyone at once, with nothing forgotten between sprints."
The pricing page's comparison and hero lose "insights"; the blog
subtitle too.

Every register-checked string on these pages moves into plain copy
modules (`app/features/copy.ts`, `app/about/copy.ts`,
`app/pricing/copy.ts`, `lib/site-copy.ts`) and the node test
`lib/claims-register.test.ts` now reads all of them, the pricing page
included. The retro rules are sentence-scoped, so a mixed metadata line
may describe poker's analytics in one sentence and the retro in the next;
the roadmap lists Retros as shipped.

The privacy policy drafts (spec §20) land as an exported, unrendered
`PRIVACY_POLICY_DRAFTS` constant beside the live sections in the privacy
content module, keyed by section title, with the reviewer step and the
`[N]` backup-retention placeholder named in its comment. Nothing on the
live page changes.

Manual step, not in this commit: capture the retro board, light and
dark, and commit the images; the app-preview retro slot ships with the
poker image until then.

Claude-Session: https://claude.ai/code/session_01G9bjAL6awe9ayTe8X2MnqS
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown

Review

Solid PR — the copy-extraction pattern (id-keyed data in copy.ts, Record<Id, Icon> maps in the component) is applied consistently across about, features, and pricing, and TypeScript's exhaustiveness checking on those Record types means a copy id can't silently go unmapped to an icon/visual. The claims-register.test.ts expansion is the highlight: the retroScoped/retroSentences/uiLabel helpers correctly scope the "words rule" to retro-specific text (verified by tracing the sentence-splitting logic and the RETRO_NEVER patterns against the new copy), and the "checker itself" fixture test that proves each rule actually fires is a good defense against a rule silently becoming dead code.

A few things worth a look:

Test coverage

  • The claims register only validates copy strings, not that the pages render correctly. Nothing exercises the new /features anchors (#planning-poker, #retro) or the POKER_VISUALS/ICONS/VALUE_ICONS/STACK_ICONS maps at runtime — a Playwright smoke test hitting /features#retro (or just asserting the sections/CTAs render) would catch a real rendering regression that tsc + the register can't (e.g. a key collision or a broken anchor scroll target).

Minor consistency nit

  • features-content.tsx factors the repeated CTA button classes into primaryCta/secondaryCta constants, but about-content.tsx and pricing-content.tsx still inline the same long Tailwind strings. Not introduced by this PR, but since one file just adopted the cleaner pattern, might be worth applying it to the other two while it's fresh (or filing a follow-up).

Design nit (non-blocking)

  • In about-content.tsx's closing CTA, "Start estimating" and "Start a retro" now render as two identical black/primary buttons side by side, with no visual hierarchy between them (previously there was a single primary CTA). features-content.tsx's CTA section has the same pattern. Worth a quick look in a browser to confirm that's the intended look for two equally-weighted ceremonies.

Verified by reading, not execution (sandbox blocked running vitest/tsc here): the MODULES list in claims-register.test.ts correctly includes all new copy modules (site, features, about, pricing, siteConfig), and I didn't find any stale references to old copy strings (e.g. "Analytics & Insights", "Smart Analytics", "View on GitHub" in the features page) left in tests/ or src/.

Nothing here blocks merging — the manual follow-ups called out in the description (privacy draft review, retro screenshots) are the real gating items.

@spokvulcan
spokvulcan merged commit 2f5cd91 into main Sep 6, 2026
4 checks passed
@spokvulcan
spokvulcan deleted the feat/300-site branch September 6, 2026 02:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Retro: positioning — homepage, features, metadata, privacy drafts

1 participant