--- gsd_state_version: 1.0 milestone: v2.1 milestone_name: Public Discovery status: verifying stopped_at: Completed 27-03-PLAN.md last_updated: "2026-04-10T21:52:24.791Z" last_activity: 2026-04-10 progress: total_phases: 14 completed_phases: 4 total_plans: 11 completed_plans: 11 percent: 0 --- # Project State ## Project Reference See: .planning/PROJECT.md (updated 2026-04-09) **Core value:** Help people make better gear decisions — discover what others use, compare real-world data, and see how a potential buy affects your setup before committing. **Current focus:** Phase 27 — top-nav-restructure-and-search-bar-rethink ## Current Position Phase: 999.1 Plan: Not started Status: Phase complete — ready for verification Last activity: 2026-04-10 Progress: [░░░░░░░░░░] 0% ## Performance Metrics **Velocity:** - Total plans completed: 55 (all milestones through v2.0) - v1.3: 6 plans across 4 phases (2026-03-16 to 2026-04-08) - v2.0: 32 plans across 10 phases (2026-03-17 to 2026-04-08) *Updated after each plan completion* ## Accumulated Context ### Decisions Key decisions carried forward from v2.0: - External auth provider: Logto (self-hosted OIDC) — RESOLVED - Structured UGC only — ratings and predefined fields, no freeform text — ACTIVE - Separate globalItems table — not a flag on user items table — RESOLVED - COALESCE merge for reference items — RESOLVED - Detail pages replacing slide-out panels — RESOLVED v2.1 decisions: - Product images: manufacturer images with attribution and source link, honor takedown requests — RESOLVED - Catalog data: open datasets + manufacturer specs + agent MCP enrichment — RESOLVED - Public-first: auth model rework before content features — RESOLVED - Phase 999.3 (Public Access Auth Model backlog item) is now Phase 24 — PROMOTED - [Phase 24-public-access-infrastructure]: createRateLimit factory pattern for configurable rate limiting per endpoint tier - [Phase 24-public-access-infrastructure]: Browse tier 120/min, detail tier 60/min — same limits for auth and anon users - [Phase 24]: Both auth prompt CTAs go to /login — Logto handles sign-in and sign-up at the same OIDC endpoint - [Phase 24]: Soft navigate() replaces hard window.location.href for private route redirect — defers until auth resolves - [Phase 25-catalog-enrichment-agent-tools]: Three-way tag sync: undefined=leave untouched, []=clear all, [names]=replace — enables selective tag updates from catalog agents - [Phase 25-catalog-enrichment-agent-tools]: unique(brand, model) constraint on globalItems: enables safe ON CONFLICT DO UPDATE for catalog enrichment agents - [Phase 25-catalog-enrichment-agent-tools]: Catalog MCP tools use registerCatalogTools(db) without userId — shared catalog needs no user scoping - [Phase 25-catalog-enrichment-agent-tools]: Attribution spacing: image div removes mb-6, attribution paragraph takes mb-6, fallback div ensures consistent spacing - [Phase 26-discovery-landing-page]: Composite cursor for setups uses itemCount_id format filtered post-query in JS for simplicity with grouped SQL - [Phase 26-discovery-landing-page]: No cursor pagination for getTrendingCategories — bounded small list, simple limit is sufficient - [Phase 26]: discoveryRoutes registered with browseTier rate limiting (120 req/min) for all GET discovery endpoints - [Phase 26-discovery-landing-page]: PublicSetupCard itemCount/creatorName fields are optional for backward compatibility with users/$userId usage - [Phase 26-discovery-landing-page]: Discovery sections hide entirely (return null) when not loading and data is empty — avoids empty grid layouts - [Phase 27]: Setups elevated to top-level /setups route; Collection page reduced to Gear and Planning tabs with .catch(gear) fallback for legacy URLs - [Phase 27]: Wave 0 tests use test.fixme for removed dashboard cards — preserves test intent for future reference - [Phase 27]: Old setups tab test replaced with fallback-to-gear assertion matching the Zod .catch('gear') behavior planned in Plans 01-03 - [Phase 27]: Used 'house' icon instead of plan-specified 'home': lucide-react has no Home icon, only House — prevents Package fallback rendering in navigation ### Pending Todos None active. ### Blockers/Concerns None. ## Session Continuity Last session: 2026-04-10T21:48:34.542Z Stopped at: Completed 27-03-PLAN.md Resume file: None