Skip to content

Canonicalize create and recovery route paths#366

Closed
njrini99-code wants to merge 2 commits into
test-hardening/free-production-readiness-stackfrom
route-renames/canonical-create-recover-compare
Closed

Canonicalize create and recovery route paths#366
njrini99-code wants to merge 2 commits into
test-hardening/free-production-readiness-stackfrom
route-renames/canonical-create-recover-compare

Conversation

@njrini99-code

@njrini99-code njrini99-code commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Summary

Validation

  • npm run routes:check
  • npm run test:business
  • npm run typecheck
  • git diff --check

Notes

Greptile Summary

This PR canonicalizes legacy create and recovery route paths across the app. The main changes are:

  • Renamed Golf, Baseball, and CoachHelm route directories.
  • Updated app links and route error metadata.
  • Added permanent redirects from legacy URLs.
  • Updated route tests, route-intelligence tables, and memory docs.

Confidence Score: 4/5

These route fixes should be corrected before merging.

  • Several updated test fixtures still point at routes that do not exist.
  • The normalized route table can still publish dead recovery and Genome Compare URLs.
  • The feature registry still misses the real recovery route directory.

scripts route tests, route normalizer, and memory registry

Important Files Changed

Filename Overview
scripts/tests/genome-fluid.test.mjs Updates the Genome compare route fixture, but it still points at a non-existent page path.
scripts/tests/coachhelm-hub.test.mjs Updates the CoachHelm hub route expectation, but it still expects a dead Genome Compare URL.
scripts/tests/cmd-k-coverage.test.mjs Updates Cmd+K route expectations, but recovery and Genome Compare still use dead route strings.
scripts/ui-intelligence/normalize-devin-routes.ts Updates normalized route data, but it still emits dead recovery and Genome Compare URLs.
memory/registry.yml Updates round lifecycle route mapping, but the recovery glob no longer matches the real route directory.
next.config.mjs Adds redirects from legacy route paths to the canonical destinations.

Fix All in Claude Code

Reviews (2): Last reviewed commit: "fix(ui): keep button primary classes sta..." | Re-trigger Greptile

Greptile also left 7 inline comments on this PR.

Context used (5)

  • Context used - .greptile/instructions.md (source)
  • Context used - .greptile/config.json (source)
  • Context used - CLAUDE.md (source)
  • Context used - .cursorrules (source)
  • Context used - AGENTS.md (source)

@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
helmv3 Ready Ready Preview, Comment Jun 30, 2026 1:39pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (3)
  • main
  • develop
  • release/*

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4b33ec30-9452-442e-a77d-77fa25873c69

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch route-renames/canonical-create-recover-compare

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

join(
REPO_ROOT,
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare/page.tsx',
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare-players-players-players/page.tsx',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing Genome Route File

This changed path points to compare-players-players-players/page.tsx, but the renamed App Router page exists at compare-players/page.tsx. The test asserts each consumer file exists before checking the source, so this test will fail before it reaches the genome layout checks.

Suggested change
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare-players-players-players/page.tsx',
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare-players/page.tsx',

Context Used: .greptile/instructions.md (source)

Fix in Claude Code

{ name: 'analytics/coachhelm', href: '/golf/dashboard/analytics/coachhelm' },
{ name: 'chat', href: '/golf/dashboard/coachhelm/chat' },
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare' },
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare-players-players-players' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Hub Expectation Uses Dead Route

This expected href was over-expanded to /compare-players-players-players, while the actual hub link and App Router page use /compare-players. The exact-string check will fail whenever the production CoachHelm hub points at the real Genome Compare route.

Suggested change
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare-players-players-players' },
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare-players' },

Context Used: .greptile/instructions.md (source)

Fix in Claude Code

],
[
'/golf/dashboard/rounds/recover',
'/golf/dashboard/rounds/recover-draft-draft',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Stale Recovery Allowlist Entry

The allowlist now names /golf/dashboard/rounds/recover-draft-draft, but the renamed recovery route is /golf/dashboard/rounds/recover-draft. The stale-entry assertion derives routes from real page.tsx files, so this allowlist key will fail that check.

Suggested change
'/golf/dashboard/rounds/recover-draft-draft',
'/golf/dashboard/rounds/recover-draft',

Context Used: .greptile/instructions.md (source)

Fix in Claude Code

'/golf/dashboard/analytics/coachhelm',
'/golf/dashboard/coachhelm/chat',
'/golf/dashboard/coachhelm/genome/compare',
'/golf/dashboard/coachhelm/genome/compare-players-players-players',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Palette Check Requires Dead Route

This required route string expects /compare-players-players-players, but CommandPalette.tsx was updated to the real /compare-players route. The manifest assertion will fail even though the palette links to the canonical page.

Suggested change
'/golf/dashboard/coachhelm/genome/compare-players-players-players',
'/golf/dashboard/coachhelm/genome/compare-players',

Context Used: .greptile/instructions.md (source)

Fix in Claude Code

{ route: '/golf/dashboard/qualifiers/create', role: 'coach', category: 'qualifiers', criticality: 'medium' },
{ route: '/golf/dashboard/stats/team', role: 'coach', category: 'stats', criticality: 'high' },
{ route: '/golf/dashboard/coachhelm/genome/compare', role: 'coach', category: 'coachhelm', criticality: 'medium' },
{ route: '/golf/dashboard/coachhelm/genome/compare-players-players-players', role: 'coach', category: 'coachhelm', criticality: 'medium' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Normalized Genome Route Is Dead

This route table now emits /golf/dashboard/coachhelm/genome/compare-players-players-players, which has no matching page. Any route audit or generated manifest using this table will publish a broken CoachHelm Genome URL instead of the canonical compare page.

Suggested change
{ route: '/golf/dashboard/coachhelm/genome/compare-players-players-players', role: 'coach', category: 'coachhelm', criticality: 'medium' },
{ route: '/golf/dashboard/coachhelm/genome/compare-players', role: 'coach', category: 'coachhelm', criticality: 'medium' },

Context Used: .greptile/instructions.md (source)

Fix in Claude Code

{ route: '/golf/dashboard/rounds/new', role: 'player', category: 'rounds', criticality: 'high' },
{ route: '/golf/dashboard/rounds/recover', role: 'player', category: 'rounds', criticality: 'low' },
{ route: '/golf/dashboard/rounds/create', role: 'player', category: 'rounds', criticality: 'high' },
{ route: '/golf/dashboard/rounds/recover-draft-draft', role: 'player', category: 'rounds', criticality: 'low' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Normalized Recovery Route Is Dead

This route table now emits /golf/dashboard/rounds/recover-draft-draft, but the real offline recovery page is /golf/dashboard/rounds/recover-draft. Consumers of the normalized list will crawl or publish a non-existent recovery URL and miss the actual route.

Suggested change
{ route: '/golf/dashboard/rounds/recover-draft-draft', role: 'player', category: 'rounds', criticality: 'low' },
{ route: '/golf/dashboard/rounds/recover-draft', role: 'player', category: 'rounds', criticality: 'low' },

Context Used: .greptile/instructions.md (source)

Fix in Claude Code

Comment thread memory/registry.yml
- src/app/golf/(dashboard)/dashboard/rounds/create/**
- src/app/golf/(dashboard)/dashboard/rounds/continue/**
- src/app/golf/(dashboard)/dashboard/rounds/recover/**
- src/app/golf/(dashboard)/dashboard/rounds/recover-draft-draft/**

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Registry Misses Recovery Route

The feature registry glob points at recover-draft-draft/**, while the actual route directory is recover-draft/**. Registry-based feature mapping will not attach the real recovery page to the round lifecycle docs or checks.

Suggested change
- src/app/golf/(dashboard)/dashboard/rounds/recover-draft-draft/**
- src/app/golf/(dashboard)/dashboard/rounds/recover-draft/**

Context Used: AGENTS.md (source)

Fix in Claude Code

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f9f3ee1311

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

join(
REPO_ROOT,
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare/page.tsx',
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare-players-players-players/page.tsx',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use the canonical genome compare path

The renamed route exists at /golf/dashboard/coachhelm/genome/compare-players, but this test now points to compare-players-players-players, which has no page. Running node --test scripts/__tests__/genome-fluid.test.mjs fails with “Expected source file to exist”, and the same duplicated string makes the CoachHelm/Cmd+K route guards expect a dead route instead of the actual command-palette link. Change this constant to the real compare-players path.

Useful? React with 👍 / 👎.

],
[
'/golf/dashboard/rounds/recover',
'/golf/dashboard/rounds/recover-draft-draft',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Allowlist the real recovery route

The physical route and redirects use /golf/dashboard/rounds/recover-draft, but this allowlist entry has an extra -draft. With this value, the Cmd+K coverage guard reports the real recovery page as missing from both the manifest and allowlist and separately flags this entry as stale, so the route guard fails whenever it is run. Point the entry at /recover-draft.

Useful? React with 👍 / 👎.

for (const route of routes) {
test(`critical route has no severe accessibility violations: ${route}`, async ({ page }) => {
await page.goto(route);
await page.goto(route, { waitUntil: 'networkidle', timeout: 30_000 }).catch(() => {});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don't ignore failed critical-route navigations

Catching and discarding every page.goto failure means that if /, /golf, or /baseball times out or fails to load, Axe will run against the previous/blank document and the test can pass without ever scanning the critical route. Redirects should still resolve from goto, so keep the navigation failure visible or assert the final URL before analyzing.

Useful? React with 👍 / 👎.

join(
REPO_ROOT,
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare/page.tsx',
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare-players-players-players/page.tsx',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing Genome Route
This path still points to compare-players-players-players/page.tsx, but the renamed App Router page is compare-players/page.tsx. The test reads each consumer file before it checks the Genome layout, so npm run test:business can fail on this missing file instead of validating the real compare page.

Suggested change
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare-players-players-players/page.tsx',
'src/app/golf/(dashboard)/dashboard/coachhelm/genome/compare-players/page.tsx',

Fix in Claude Code

{ name: 'analytics/coachhelm', href: '/golf/dashboard/analytics/coachhelm' },
{ name: 'chat', href: '/golf/dashboard/coachhelm/chat' },
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare' },
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare-players-players-players' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Hub Uses Dead Route
This expected href is still /compare-players-players-players, while the App Router page and internal links use /compare-players. The exact-string hub test can fail when the production component links to the canonical Genome Compare page.

Suggested change
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare-players-players-players' },
{ name: 'genome', href: '/golf/dashboard/coachhelm/genome/compare-players' },

Fix in Claude Code

],
[
'/golf/dashboard/rounds/recover',
'/golf/dashboard/rounds/recover-draft-draft',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Stale Recovery Allowlist
This allowlist entry still uses /recover-draft-draft, but the actual route and redirect destination are /recover-draft. The stale-route check derives routes from real page.tsx files, so this key can still fail the Cmd+K coverage test.

Suggested change
'/golf/dashboard/rounds/recover-draft-draft',
'/golf/dashboard/rounds/recover-draft',

Fix in Claude Code

'/golf/dashboard/analytics/coachhelm',
'/golf/dashboard/coachhelm/chat',
'/golf/dashboard/coachhelm/genome/compare',
'/golf/dashboard/coachhelm/genome/compare-players-players-players',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Palette Requires Dead Route
This required route still names /compare-players-players-players. The command palette and App Router page use /golf/dashboard/coachhelm/genome/compare-players, so the manifest assertion can fail even when the palette links to the canonical page.

Suggested change
'/golf/dashboard/coachhelm/genome/compare-players-players-players',
'/golf/dashboard/coachhelm/genome/compare-players',

Fix in Claude Code

{ route: '/golf/dashboard/qualifiers/create', role: 'coach', category: 'qualifiers', criticality: 'medium' },
{ route: '/golf/dashboard/stats/team', role: 'coach', category: 'stats', criticality: 'high' },
{ route: '/golf/dashboard/coachhelm/genome/compare', role: 'coach', category: 'coachhelm', criticality: 'medium' },
{ route: '/golf/dashboard/coachhelm/genome/compare-players-players-players', role: 'coach', category: 'coachhelm', criticality: 'medium' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Normalized Dead Route
This route table still emits /compare-players-players-players, which has no matching page.tsx and no redirect. Route audit output generated from this table can publish or crawl a dead Genome Compare URL instead of /compare-players.

Suggested change
{ route: '/golf/dashboard/coachhelm/genome/compare-players-players-players', role: 'coach', category: 'coachhelm', criticality: 'medium' },
{ route: '/golf/dashboard/coachhelm/genome/compare-players', role: 'coach', category: 'coachhelm', criticality: 'medium' },

Fix in Claude Code

{ route: '/golf/dashboard/rounds/new', role: 'player', category: 'rounds', criticality: 'high' },
{ route: '/golf/dashboard/rounds/recover', role: 'player', category: 'rounds', criticality: 'low' },
{ route: '/golf/dashboard/rounds/create', role: 'player', category: 'rounds', criticality: 'high' },
{ route: '/golf/dashboard/rounds/recover-draft-draft', role: 'player', category: 'rounds', criticality: 'low' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Normalized Recovery Dead
This table still emits /recover-draft-draft, but the offline recovery page is /golf/dashboard/rounds/recover-draft. Consumers of the normalized route list can crawl a non-existent recovery URL and miss the real page.

Suggested change
{ route: '/golf/dashboard/rounds/recover-draft-draft', role: 'player', category: 'rounds', criticality: 'low' },
{ route: '/golf/dashboard/rounds/recover-draft', role: 'player', category: 'rounds', criticality: 'low' },

Fix in Claude Code

Comment thread memory/registry.yml
- src/app/golf/(dashboard)/dashboard/rounds/create/**
- src/app/golf/(dashboard)/dashboard/rounds/continue/**
- src/app/golf/(dashboard)/dashboard/rounds/recover/**
- src/app/golf/(dashboard)/dashboard/rounds/recover-draft-draft/**

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Registry Misses Recovery
This registry glob still targets recover-draft-draft/**, while the renamed route directory is recover-draft/**. Feature mapping for round recovery will not match the real recovery page, so registry-based context checks can miss this route.

Suggested change
- src/app/golf/(dashboard)/dashboard/rounds/recover-draft-draft/**
- src/app/golf/(dashboard)/dashboard/rounds/recover-draft/**

Fix in Claude Code

@njrini99-code

Copy link
Copy Markdown
Owner Author

Superseded by the clean-slate + unification trains (#740/#762/#763/#768); route inventory re-audited in the 237-route sweep.

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.

1 participant