Skip to content

feat(ux): IA & navigation — judgments index, per-page titles, first-run fixes#619

Merged
SoundMindsAI merged 1 commit into
mainfrom
feat_ux_ia_navigation
Jul 11, 2026
Merged

feat(ux): IA & navigation — judgments index, per-page titles, first-run fixes#619
SoundMindsAI merged 1 commit into
mainfrom
feat_ux_ia_navigation

Conversation

@SoundMindsAI

Copy link
Copy Markdown
Owner

Fourth UX-audit fix PR. Scope: information architecture, navigation, and first-run content.

Changes

  • Judgments index (highest-severity IA finding) — judgment lists were a core object with no list route, not in the nav, and every detail page shipped a "← All judgment lists" back-link that 404'd. Added /judgments (new JudgmentListsTable + column config) and a "Judgments" nav item. Filterless list (the useJudgmentLists hook is cursor/limit only). Fixes the 404 + the discoverability gap.
  • Per-page titles — every tab previously read "RelyLoop". New useDocumentTitle hook applied to all list pages, plus a new DetailPageShell documentTitle prop wired into all 6 detail pages, so tabs/history/bookmarks read " · RelyLoop".
  • Query-set → cluster traversal — the cluster on the query-set detail is now a link (was a raw, non-clickable UUID → a dead end).
  • First-run copy — the dashboard subtitle now says what RelyLoop is (auto-tune relevance → ship a PR) instead of "Recent activity"; the chat example-prompt chips are capability-shaped ("Summarize one of my clusters") instead of naming demo entities (prod-es, trial 47) that don't exist on a fresh install.

Deferred (tracked follow-up)

Empty-state CTA parity (studies/query-sets/templates), cluster-tree breadcrumb consistency (F5), and reverse "used by" links (F7) — all low-severity; kept out to keep this PR reviewable.

Testing

useDocumentTitle + JudgmentListsTable (link + empty state) tests. The top-nav test iterates NAV_ITEMS, so the new item is auto-covered. Full suite green (1325); tsc + eslint + prettier clean (ran prettier across src).

🤖 Generated with Claude Code

…un fixes

UX-audit "information architecture & navigation" + first-run content pass:

- Judgments index: new /judgments list route (+ JudgmentListsTable / column
  config) and a "Judgments" nav item. Fixes the highest-severity IA finding —
  judgment lists were a core object with no index and a "← All judgment lists"
  back-link that 404'd. Simple filterless list (the hook is cursor/limit only).
- Per-page titles: new useDocumentTitle hook; every list page and all 6 detail
  pages (via a new DetailPageShell documentTitle prop) now set
  "<name> · RelyLoop" so tabs/history/bookmarks are distinguishable instead of
  every tab reading "RelyLoop".
- Query-set → cluster traversal: the cluster on the query-set detail is now a
  link to the cluster (was a raw, non-clickable UUID — a dead end).
- First-run copy: the dashboard subtitle now says what RelyLoop *is* (auto-tune
  relevance → ship a PR) instead of a generic "Recent activity"; the chat
  example-prompt chips are capability-shaped ("Summarize one of my clusters")
  instead of naming demo entities ("prod-es", "trial 47") that don't exist on
  a fresh install.

Deferred to a follow-up (tracked): empty-state CTA parity (studies/query-sets/
templates), cluster-tree breadcrumb consistency, reverse "used by" links.

Tests: useDocumentTitle + JudgmentListsTable (link + empty state). The top-nav
test iterates NAV_ITEMS so Judgments is auto-covered. Full suite green (1325);
tsc + lint + prettier clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: SoundMindsAI <eric.starr@soundminds.ai>

@gemini-code-assist gemini-code-assist 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.

Code Review

This pull request introduces a new useDocumentTitle hook to dynamically set the browser document title across various pages and detail views (via DetailPageShell). It also adds a new "Judgments" page, including the JudgmentListsTable component, its column configuration, and associated tests. Additionally, navigation is updated to include Judgments, dashboard copy is improved, and chat example prompts are generalized. Feedback is provided regarding a potential hydration mismatch issue in Next.js when using toLocaleString() on a Date object in judgment-lists-table.column-config.tsx, suggesting the use of suppressHydrationWarning or client-side formatting.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +51 to +55
<span className="whitespace-nowrap">
{new Date(row.original.created_at).toLocaleString()}
</span>
),
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Using toLocaleString() on a Date object during server-side pre-rendering in Next.js can lead to hydration mismatches if the server's locale or timezone differs from the client's browser settings. To prevent this, add suppressHydrationWarning to the wrapping element, or format the date only after the component has mounted on the client.

    cell: ({ row }) => (
      <span className="whitespace-nowrap" suppressHydrationWarning>
        {new Date(row.original.created_at).toLocaleString()}
      </span>
    ),

@SoundMindsAI

Copy link
Copy Markdown
Owner Author

Review adjudication

Gemini — 1 finding, rejected with counter-evidence:

Finding Verdict Reasoning
judgment-lists-table.column-config.tsx:55toLocaleString() may cause SSR hydration mismatch Reject This is a 'use client' table whose rows come from a client-side useQuery — the rows do not exist during SSR (the server renders the loading skeleton), so toLocaleString never runs server-side and no hydration mismatch is possible. The identical pattern is used across every existing list table (query-sets-table, etc.) without suppressHydrationWarning; adding it only here would be inconsistent cargo-culting. Centralizing date formatting (a real but separate polish item, visual-audit L4) is deferred to the theming/polish PR.

Only remaining red is the pre-existing backend (contract+integration) UBI test (#610). Merge-skew: clean.

@SoundMindsAI
SoundMindsAI merged commit a716b45 into main Jul 11, 2026
17 of 20 checks passed
@SoundMindsAI
SoundMindsAI deleted the feat_ux_ia_navigation branch July 11, 2026 13:10
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