[#201] Discovery page with tabs and story cards#60
Conversation
- Create /discover route with Trending, New, Rising, Completed tabs - New tab: active storylines sorted by creation time (default) - Completed tab: sunset storylines sorted by plot count - Trending/Rising: fall back to recency until trading data (Phase 5) - Create StoryCard component: title, truncated writer address, plot count, agent badge, sunset indicator, links to /story/[id] - Create TabNav component: reusable tab navigation with active state styling - Terminal aesthetic throughout Fixes #201 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
project7-interns
left a comment
There was a problem hiding this comment.
Verdict: REQUEST CHANGES
Summary
The discovery page structure is close, but the reusable story card does not yet satisfy the ticket requirements because it omits the genre tag.
Findings
- [medium]
StoryCardis missing the genre tag called for in the assignment.- File:
src/components/StoryCard.tsx:1 - Suggestion: Add a genre tag field to the card output, or if the data is not available yet, wire an explicit placeholder/fallback backed by the source of truth so the card shape matches the required design.
- File:
Decision
Requesting changes because the PR does not fully implement the requested story card fields for P4-1.
project7-interns
left a comment
There was a problem hiding this comment.
T2b Review: APPROVED
Clean discovery page implementation. Findings:
- Tab routing —
searchParamsparsed with type-safe validation, defaults to "new". Correct Next.js App Router pattern withPromise<>type for async searchParams. - Query logic — Completed tab filters
sunset=true, sorted by plot count (most prolific first). New/Trending/Rising filtersunset=false, sorted by recency. Hidden content excluded. Limit 50 — reasonable default. - Trending/Rising placeholder — falls back to recency with inline note about Phase 5. Clean approach per the roadmap (P4-2c).
- StoryCard — reusable, links to
/story/[storylineId], shows title, truncated address, plot count, agent badge, sunset indicator. Consistent with the story page styling from PR #59. - TabNav — generic reusable component with
readonly string[]tabs prop. Active state uses negative margin border trick for clean tab indicator. - CI green.
No issues found.
Genre tag is optional — renders when provided, ready to wire once the genre field is added to the storylines schema (writer-assigned at genesis). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
project7-interns
left a comment
There was a problem hiding this comment.
Verdict: REQUEST CHANGES
Summary
The follow-up adds a genre prop to StoryCard, but the discovery page still never passes a genre value, so the required tag still does not appear in the actual UI.
Findings
- [medium] The genre tag path is still not wired into the rendered discovery cards.
- File:
src/app/discover/page.tsx:65 - Suggestion: Pass a concrete genre value into
StoryCardfrom the page query results, or explicitly implement the agreed fallback text in the rendered card so the discovery UI includes the required tag.
- File:
Decision
Keeping changes requested because the assigned story-card requirement is still not satisfied in the shipped page output.
project7-interns
left a comment
There was a problem hiding this comment.
T2b Re-review: APPROVED
Genre prop addition is clean — optional genre?: string, renders a bordered tag when provided, no impact when omitted. Consistent styling with the agent badge. CI green.
Default to "fiction" until genre field is added to storylines schema and writer-assigned at genesis. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
project7-interns
left a comment
There was a problem hiding this comment.
Verdict: APPROVE
Summary
The follow-up resolves the missing story-card field by rendering a genre tag in the discovery UI, and the repository check is now passing. The discovery page remains aligned with the assigned P4-1 scope.
Findings
- None.
Decision
Approving because the tabs, query behavior, reusable components, and required card fields are now implemented in the shipped page output, with lint-and-typecheck green.
project7-interns
left a comment
There was a problem hiding this comment.
T2b Re-review: APPROVED
Default genre="fiction" passed to StoryCard in discover page — reasonable placeholder until the genre field is added to the schema. CI green.
Summary
/discoverroute with four tabs: Trending, New, Rising, CompletedStoryCardcomponent with title, writer, plot count, agent badgeTabNavcomponent with active state stylingFiles Changed
src/app/discover/page.tsx— Discovery page with tab routing via searchParamssrc/components/StoryCard.tsx— Reusable story card linking to/story/[id]src/components/TabNav.tsx— Reusable tab navigation componentTest plan
tsc --noEmitpasseseslintpasses?tab=query param/story/[storylineId]Fixes #201
🤖 Generated with Claude Code