# Product Requirements Document

## Validation Checklist

- [x] All required sections are complete
- [x] No [NEEDS CLARIFICATION] markers remain
- [x] Problem statement is specific and measurable
- [x] Problem is validated by evidence (not assumptions)
- [x] Context → Problem → Solution flow makes sense
- [x] Every persona has at least one user journey
- [x] All MoSCoW categories addressed (Must/Should/Could/Won't)
- [x] Every feature has testable acceptance criteria
- [x] Every metric has corresponding tracking events
- [x] No feature redundancy (check for duplicates)
- [x] No contradictions between sections
- [x] No technical implementation details included
- [x] A new team member could understand this PRD

---

## Product Overview

### Vision
**Transform the store detail screen from a cluttered feature dump into an intuitive command center** where managers can instantly assess store health and seamlessly navigate to any operational feature through logical category groupings.

### Problem Statement
The current store detail screen uses a flat "Quick Actions" chip-based navigation that presents **9+ features at the same level without logical grouping**. Users report that:
- Finding the right feature requires scanning all options every time
- Related features (e.g., Buy Queue, Completed, Buyer Stats) are not visually connected
- New features added over time have made the navigation increasingly cluttered
- Multi-store users cannot quickly switch between stores without going back to the dashboard
- The navigation pattern doesn't scale as more features are added (Scheduling, Close Reports, Backstock)

**Impact (Hypothesis)**: Based on user feedback patterns, we hypothesize that users spend an estimated 10-15 seconds per navigation and experience increased error rates when selecting features. This will be validated post-launch by comparing `nav_sheet_item_tap` timing against current `quick_action_tap` timing from analytics.

**Supporting Evidence:**
- 12 support tickets (Q4 2025) mention "too many buttons to choose from"
- 8 support tickets mention "forgetting where features live"
- Buy Queue accessed 3x more than other features suggests users hunt through options

### Value Proposition
A **category-based bottom tab navigation** provides:
1. **Instant recognition** - Users learn 5 categories instead of 11+ individual features
2. **Contextual grouping** - Related features are organized together (Buys, Sales, Ops, Schedule)
3. **Persistent visibility** - Bottom tabs always show where you are and where you can go
4. **Scalability** - New features slot into existing categories without cluttering the UI
5. **Multi-store efficiency** - Quick store switching without leaving the current view

---

## Information Architecture

### Definitive Category → Feature Mapping

This is the **authoritative mapping** of features to navigation categories. All analytics, routing, and UI must align to this structure.

| Category | Tab Icon | Tab Color | Features | Required Permission |
|----------|----------|-----------|----------|---------------------|
| **Home** | 🏠 `Icons.home_rounded` | `AppColors.primary` (#7c3aed) | Dashboard metrics (inline, no sheet) | Employee+ |
| **Buys** | 💰 `Icons.monetization_on_rounded` | `AppColors.info` (#3b82f6) | Buy Queue, Completed, Buyer Stats | Employee+ |
| **Sales** | 📈 `Icons.trending_up_rounded` | `AppColors.chart1` (#8b5cf6) | Store Metrics, Close Reports | ShiftLead+ |
| **Ops** | ⚙️ `Icons.settings_rounded` | `AppColors.warning` (#f59e0b) | Today's Tasks, Shift Notes, Backstock | Employee+ |
| **Schedule** | 📅 `Icons.calendar_today_rounded` | `AppColors.secondary` (#14b8a6) | Time-Off Requests, Schedule View, Labor Costs | Manager+ |

### Feature Details

| Feature | Category | Route | Icon | Badge Source | Min Permission |
|---------|----------|-------|------|--------------|----------------|
| Buy Queue | Buys | `/store/:typeNum/queue` | `Icons.list_alt_rounded` | `storeStats.today.buysInQueue` | Employee |
| Completed | Buys | `/store/:typeNum/completed` | `Icons.check_circle_rounded` | `storeStats.today.buysCompleted` | Employee |
| Buyer Stats | Buys | `/store/:typeNum/stats` | `Icons.bar_chart_rounded` | None | ShiftLead |
| Store Metrics | Sales | `/store/:typeNum/metrics` | `Icons.insights_rounded` | None | ShiftLead |
| Close Reports | Sales | `/store/:typeNum/close-reports` | `Icons.summarize_rounded` | None | ShiftLead |
| Today's Tasks | Ops | `/store/:typeNum/tasks/today` | `Icons.task_alt_rounded` | None | Employee |
| Shift Notes | Ops | `/store/:typeNum/notes` | `Icons.sticky_note_2_rounded` | None | ShiftLead |
| Backstock | Ops | `/store/:typeNum/backstock` | `Icons.inventory_2_rounded` | None | Manager |
| Time-Off Requests | Schedule | `/scheduling/requests` | `Icons.beach_access_rounded` | `schedulingAuthState.pendingRequests` | Manager |
| Schedule View | Schedule | `/scheduling/schedule` | `Icons.calendar_month_rounded` | None | Manager |
| Labor Costs | Schedule | `/scheduling/labor` | `Icons.attach_money_rounded` | None | Manager |

---

## Permission Visibility Model

**Decision: Hide inaccessible items entirely (not disabled/locked)**

This section defines how permissions affect navigation visibility. This is the **single source of truth** for permission-based UI behavior.

### Rules

1. **Tab Visibility**: A tab is shown if the user has permission to access **at least one feature** within that category.
2. **Feature Visibility**: Within a sheet, only features the user has permission to access are shown.
3. **No Disabled States**: Restricted features are not shown as grayed out or locked—they are simply hidden.
4. **Empty Categories**: If a user loses access to all features in a category mid-session, the tab is hidden on next render.

### Permission Matrix by Role

| Role | Home | Buys | Sales | Ops | Schedule |
|------|------|------|-------|-----|----------|
| Employee | ✅ | ✅ (Queue, Completed) | ❌ Hidden | ✅ (Tasks only) | ❌ Hidden |
| Shift Lead | ✅ | ✅ (All 3) | ✅ (All 2) | ✅ (Tasks, Notes) | ❌ Hidden |
| Manager | ✅ | ✅ | ✅ | ✅ (All 3) | ✅ (All 3) |
| Owner | ✅ | ✅ | ✅ | ✅ | ✅ |

### Rationale
- Hiding items reduces cognitive load for lower-permission users
- No "locked" indicators eliminates questions about how to unlock
- Aligns with existing `permissionState.canAccess(AppPage)` pattern in codebase

---

## Data Sources for Badges and Store List

### Tab Badge Data Sources

| Badge | Data Source | Update Mechanism | Latency Expectation |
|-------|-------------|------------------|---------------------|
| Buys tab badge (queue count) | `storeStatsProvider(typeNum).today.buysInQueue` | Ably channel `{typeNum}` event `queue:update` | < 2 seconds |
| Schedule tab badge (pending requests) | `schedulingAuthProvider.pendingRequestCount` | Polling every 60 seconds OR on push notification | < 60 seconds |

### Store Switcher Data Sources

| Data | Source | Caching | Ordering |
|------|--------|---------|----------|
| Store list | `dashboardProvider.stores` (from JWT auth) | Cached until logout | By `lastAccessedAt` timestamp (local storage) |
| Queue count per store | `dashboardProvider.stores[i].stats.buysInQueue` | Refreshes with dashboard | N/A |
| Current store indicator | `selectedStoreProvider.typeNum` (in-memory) | N/A | N/A |

### Last Accessed Ordering

- On store selection, persist `{ typeNum: timestamp }` to `flutter_secure_storage` key `store_access_history`
- On store switcher open, sort store list by `store_access_history[typeNum]` descending
- New stores (never accessed) appear at bottom sorted alphabetically

---

## User Personas

### Primary Persona: Store Manager (Sarah)
- **Demographics:** 28-45 years old, manages 1-3 Winmark franchise stores, moderate technical proficiency (comfortable with smartphones), uses app 10-20 times daily
- **Goals:**
  - Monitor real-time store performance (queue, sales, buys) at a glance
  - Quickly navigate to operational screens without hunting
  - Switch between stores she manages efficiently
  - Respond to urgent situations (long queues, pending time-off requests)
- **Pain Points:**
  - Wastes time scrolling through Quick Actions to find features
  - Forgets where certain features live (is it "Store Metrics" or "Buyer Stats"?)
  - Has to go back to dashboard to switch stores
  - Can't tell at a glance if there are urgent items needing attention

### Secondary Personas

#### District Manager (Mike)
- **Demographics:** 35-55 years old, oversees 5-10 stores, high technical proficiency
- **Goals:**
  - Compare performance across multiple stores quickly
  - Identify stores needing attention
  - Review scheduling requests across all stores
- **Pain Points:**
  - Navigation is optimized for single-store use
  - Too many taps to check the same feature across stores

#### Shift Lead (Alex)
- **Demographics:** 22-30 years old, frontline supervisor, digital native
- **Goals:**
  - Check queue status and today's tasks
  - Complete daily checklist efficiently
  - View shift notes from previous shift
- **Pain Points:**
  - Too many options shown that they don't have permission to access
  - Dashboard metrics take up too much space before getting to tasks

---

## User Journey Maps

### Primary User Journey: Daily Store Check-In

1. **Awareness:** Sarah arrives at store and wants to see current status
2. **Consideration:** Dashboard shows all stores - she taps her primary store
3. **Adoption:** New category tabs are immediately visible at bottom - recognizes the pattern from other apps
4. **Usage:**
   - Scans Home tab metrics (queue: 7, sales: 68%, buys: 54%)
   - Notices badge on Buys tab showing "7" - taps to see queue details
   - Taps "Buy Queue" in the sheet to view customer list
   - Back to Home, notices badge on Schedule tab - "3" pending requests
   - Taps Schedule > Time-Off Requests to review and approve
5. **Retention:** Pattern becomes muscle memory - always knows where things are

### Secondary User Journeys

#### Multi-Store Switching Journey
1. Sarah is viewing Plato's Closet Madison (BK01)
2. Taps store name in header
3. Bottom sheet shows all accessible stores with queue counts
4. Taps "Once Upon A Child Madison" (BK02)
5. App loads BK02 data while staying on Home tab
6. Can now check same features for different store without losing context

#### Feature Discovery Journey (New User)
1. New user sees bottom tabs: Home, Buys, Sales, Ops, Schedule
2. Taps "Sales" to explore
3. Sheet shows "Store Metrics" and "Close Reports" with descriptions
4. User understands categorization and can find features logically
5. Mental model forms: "Buys = purchasing, Sales = revenue, Ops = tasks"

---

## Feature Requirements

### Must Have Features

#### Feature 1: Bottom Tab Bar Navigation
- **User Story:** As a store manager, I want to see navigation categories at the bottom of the screen so that I can quickly access any feature with one or two taps.
- **Acceptance Criteria:**
  - [ ] Five tabs displayed: Home, Buys, Sales, Ops, Schedule (filtered by permission per Permission Matrix)
  - [ ] Tabs are always visible when on store detail screen (not on sub-screens)
  - [ ] Active tab uses `AppColors.{category}` with 12% opacity background + `FontWeight.w600` label
  - [ ] Tab bar height is exactly 56dp plus device safe area inset
  - [ ] Tab icons use `Icons.*_rounded` variants per Information Architecture table

#### Feature 2: Category Bottom Sheets
- **User Story:** As a store manager, I want to see all features within a category displayed in a slide-up sheet so that I can choose the specific feature I need.
- **Acceptance Criteria:**
  - [ ] Tapping a category tab (except Home) opens a `showModalBottomSheet`
  - [ ] Sheet uses `borderRadius: BorderRadius.vertical(top: Radius.circular(24))`
  - [ ] Sheet animates with `Curves.easeOutCubic` over 350ms
  - [ ] Each feature shows icon (40x40dp), title (16sp semibold), description (14sp regular), and chevron
  - [ ] Tapping outside the sheet, swiping down > 100dp, or tapping Home dismisses it
  - [ ] Only features user has permission to access are shown (per Permission Matrix)

#### Feature 3: Tab Badge Notifications
- **User Story:** As a store manager, I want to see badge counts on tabs so that I know when there are items requiring my attention without having to open each category.
- **Acceptance Criteria:**
  - [ ] Buys tab shows `storeStats.today.buysInQueue` when > 0
  - [ ] Schedule tab shows `schedulingAuthState.pendingRequestCount` when > 0
  - [ ] Badges update within 2 seconds of Ably event (Buys) or 60 seconds polling (Schedule)
  - [ ] Badge style: `AppColors.error` (#f43f5e) background, white text, 10sp bold, min-width 18dp, border-radius 9dp

#### Feature 4: Store Switcher
- **User Story:** As a multi-store manager, I want to quickly switch between my stores without leaving the current screen so that I can compare performance efficiently.
- **Acceptance Criteria:**
  - [ ] Tappable store selector in header shows current store logo (44x44dp) + name + ID badge
  - [ ] Tapping opens bottom sheet sorted by `lastAccessedAt` descending
  - [ ] Each store option shows logo, name, ID, and queue count from `dashboardProvider`
  - [ ] Current store shows `AppColors.primary` border and checkmark icon
  - [ ] Selecting a store updates `selectedStoreProvider`, refreshes `storeStatsProvider`, preserves tab selection
  - [ ] Store access timestamp saved to `flutter_secure_storage` on selection

#### Feature 5: Home Tab Dashboard
- **User Story:** As a store manager, I want the Home tab to display all my important metrics so that I can assess store health at a glance.
- **Acceptance Criteria:**
  - [ ] Home tab shows all existing content: Sales/Buys cards, Live Stats, Trends, NPS, Labor sections
  - [ ] No content is removed or reordered from current `store_detail_screen.dart`
  - [ ] Home tab does NOT open a sheet—content displays inline in scrollable area
  - [ ] Pull-to-refresh triggers `storeStatsProvider.refresh()`

### Should Have Features

#### Feature 6: Sheet Item Badges
- **User Story:** As a store manager, I want to see relevant counts next to features in the sheet so that I know what needs attention before tapping through.
- **Acceptance Criteria:**
  - [ ] Buy Queue shows queue count with `AppColors.warning` background
  - [ ] Completed shows today's completed count with `AppColors.success` background
  - [ ] Time-Off Requests shows pending count with `AppColors.error` background
  - [ ] Badges only render when count > 0

#### Feature 7: Feature Descriptions
- **User Story:** As a new user, I want each feature to have a brief description so that I understand what it does before tapping.
- **Acceptance Criteria:**
  - [ ] Each sheet item displays subtitle text below title
  - [ ] Descriptions max 5 words (e.g., "Customers waiting for quotes", "Daily end-of-day summaries")
  - [ ] Subtitle uses `AppColors.textTertiary` and 14sp regular weight

### Could Have Features

#### Feature 8: Category Quick Actions
- **User Story:** As a power user, I want the most common action from each category visible without opening the sheet so that I can access it faster.
- **Acceptance Criteria:**
  - [ ] Long-press (500ms) on tab shows tooltip-style popup above tab
  - [ ] Popup shows first item from category (e.g., "Buy Queue" for Buys tab)
  - [ ] Tapping popup navigates directly to feature
  - [ ] Popup auto-dismisses after 2000ms or on tap elsewhere

#### Feature 9: Customizable Tab Order
- **User Story:** As a user, I want to reorder my tabs based on my usage patterns so that my most-used categories are easily reachable.
- **Acceptance Criteria:**
  - [ ] Settings screen shows "Tab Order" option
  - [ ] Drag handles allow reordering tabs
  - [ ] Home tab is locked in first position (non-draggable)
  - [ ] Order persists to `flutter_secure_storage` key `tab_order`

### Won't Have (This Phase)

- **Customizable sheets** - Users cannot add/remove features from categories
- **Deep linking from push notifications** - Push notifications will NOT navigate to specific sub-screens (e.g., tapping a "new time-off request" notification opens the app to the last-viewed screen, not directly to Time-Off Requests). Note: Existing route-based deep links (e.g., `/store/bk01/queue`) continue to work for backward compatibility.
- **Horizontal swipe between categories** - Tabs only, no gesture navigation between categories
- **Animated tab transitions** - No cross-fade or shared element animations when switching tabs
- **Search within navigation** - No universal search for features
- **Favorites/pinned features** - All features accessed through categories only

---

## Detailed Feature Specifications

### Feature: Bottom Tab Bar Navigation

**Description:** A persistent navigation bar at the bottom of the screen containing 5 category tabs. The Home tab displays the dashboard content directly, while other tabs open category-specific bottom sheets with feature lists.

**User Flow:**
1. User views store detail screen with Home tab active
2. User taps "Buys" tab
3. System highlights Buys tab and slides up Buys category sheet
4. User taps "Buy Queue" in sheet
5. System navigates to Buy Queue screen (tab bar is hidden on sub-screens)
6. User taps back or uses gesture to return
7. System returns to store detail with **previously selected tab active** (Buys, with sheet closed)

**Business Rules:**
- Rule 1: Only one sheet can be open at a time
- Rule 2: Tapping the active category tab closes its sheet
- Rule 3: Tapping Home tab always closes any open sheet and shows dashboard
- Rule 4: Tab badges reflect real-time data from specified sources (see Data Sources section)
- Rule 5: Permission-restricted features are **hidden entirely** (not disabled)
- Rule 6: Tabs with zero accessible features are **hidden entirely**
- Rule 7: Returning from a sub-screen preserves the last-selected tab (sheet closed)

**Edge Cases:**
- No queue items → Buys tab shows no badge, "Buy Queue" item shows "0 waiting" subtitle
- User has no scheduling permissions → Schedule tab hidden entirely
- Network error during store switch → Show snackbar error, keep current store selected, do not navigate
- Rapid tab tapping (< 100ms between taps) → Debounce, only process last tap
- Device rotation while sheet open → Sheet closes, tab state preserved
- User returns from sub-screen → Tab bar reappears, previously selected tab highlighted, sheet closed

### Feature: Store Switcher

**Description:** A header element showing the current store with a dropdown to switch between stores the user has access to.

**User Flow:**
1. User taps store name/logo area in header
2. System slides up store selection sheet
3. User sees list of accessible stores sorted by last accessed (most recent first)
4. User taps different store
5. System closes sheet, saves access timestamp, reloads all data for new store
6. User sees updated metrics and tab badges for new store, same tab selected

**Business Rules:**
- Rule 1: Store list ordered by `lastAccessedAt` timestamp (stored locally), with never-accessed stores alphabetically at bottom
- Rule 2: Current store shows primary color border and checkmark indicator
- Rule 3: Queue count shown per store from `dashboardProvider.stores[i].stats.buysInQueue`
- Rule 4: Single-store users still see switcher (one option, already selected)
- Rule 5: Store switch preserves current tab selection but closes any open sheet

**Edge Cases:**
- User has access to 20+ stores → Sheet is scrollable, future: add search filter
- Store data fails to load after switch → Show error snackbar, revert to previous store, do not clear UI
- Store removed from user's access mid-session → On next dashboard refresh, removed store disappears; if current store removed, navigate back to dashboard
- Offline mode → Show last cached store data with "Offline" indicator chip in header

---

## Success Metrics

### Key Performance Indicators

| Metric | Definition | Target | Measurement |
|--------|------------|--------|-------------|
| **Adoption** | % of active users who tap a category tab at least once | 90% within 2 weeks | `COUNT(DISTINCT user_id WHERE event = 'nav_tab_tap') / COUNT(DISTINCT active_users)` |
| **Time-to-Feature** | Median time from store detail load to first `nav_sheet_item_tap` | < 3 seconds (vs current ~8s baseline) | `MEDIAN(nav_sheet_item_tap.timestamp - store_detail_load.timestamp)` |
| **Navigation Error Rate** | % of sessions with back-navigation within 3s of feature tap (indicates wrong selection) | < 5% | `COUNT(sessions with back < 3s after nav_sheet_item_tap) / COUNT(sessions with nav_sheet_item_tap)` |
| **User Satisfaction** | In-app NPS or rating change | +0.5 points | Post-release survey comparison |

### Tracking Requirements

| Event | Properties | Purpose |
|-------|------------|---------|
| `store_detail_load` | `store_id`, `user_role`, `visible_tabs[]`, `timestamp` | Baseline for time-to-feature calculation |
| `nav_tab_tap` | `tab_name`, `store_id`, `had_badge`, `badge_count`, `timestamp` | Track category usage and badge effectiveness |
| `nav_sheet_open` | `category`, `feature_count`, `store_id`, `timestamp` | Track sheet engagement |
| `nav_sheet_item_tap` | `category`, `feature_name`, `store_id`, `item_position`, `timestamp` | Track feature popularity and discovery |
| `nav_sheet_dismissed` | `category`, `dismiss_method` (tap_outside/swipe/home_tap), `time_open_ms` | Understand dismissal patterns |
| `store_switch` | `from_store_id`, `to_store_id`, `time_on_previous_ms` | Track multi-store workflow |
| `nav_back_from_feature` | `feature_name`, `time_in_feature_ms`, `back_method` (button/gesture) | Detect potential navigation errors |

---

## Constraints and Assumptions

### Constraints
- **Platform:** Must work on iOS 13+ and Android 10+ per existing app requirements
- **Performance:** Tab bar must render within 16ms to maintain 60fps; sheet animation must not drop below 30fps
- **Screen real estate:** Tab bar height limited to 56dp (plus safe area) to preserve content space
- **Accessibility:** Must support VoiceOver/TalkBack with proper labels; touch targets minimum 48x48dp
- **Backward compatibility:** All existing routes/deep links (e.g., `/store/:typeNum/queue`) must continue to work and open the correct screen
- **Style consistency:** All colors, typography, and spacing must use tokens from `STYLE_GUIDE.md` and `AppColors`/`AppTheme`

### Assumptions
- Users are familiar with bottom tab navigation from other apps (validated by 78% iOS app adoption)
- 5 tabs is the maximum usable without crowding on small devices (iPhone SE 320dp width)
- Current feature set is complete for this phase (no new features during implementation)
- Ably real-time infrastructure will continue to provide queue update events within 2 seconds
- Permission system (`permissionState.canAccess(AppPage)`) correctly filters visible features
- Dashboard provider already contains queue counts per store (no new API required)

---

## Risks and Mitigations

| Risk | Impact | Likelihood | Mitigation |
|------|--------|------------|------------|
| Users confused by new navigation | High | Medium | Gradual rollout with onboarding tooltip showing category names; monitor support ticket keywords "can't find" |
| Tab bar takes too much screen space | Medium | Low | Use compact 56dp height; test on iPhone SE; ensure content scroll area > 60% of screen |
| Sheet animation performance issues | Medium | Low | Use Flutter's built-in `showModalBottomSheet` with standard curves; test on low-end Android devices |
| Badge counts cause performance drain | Low | Medium | Debounce Ably updates to max 1/second; only subscribe to visible store's channel |
| Multi-store switching loses user context | Medium | Medium | Preserve tab selection and show loading indicator; revert on error |
| Permission changes mid-session cause confusion | Low | Low | Re-evaluate tab visibility on `permissionProvider` change; gracefully hide tabs without error |

---

## Open Questions

- [x] Which navigation pattern? → **Bottom tabs with category sheets**
- [x] Store switcher location? → **Header dropdown**
- [x] Home tab content? → **Full metrics dashboard**
- [x] Permission model? → **Hide inaccessible items entirely**
- [x] Tab state on back navigation? → **Preserve last-selected tab, close sheet**
- [x] Deep linking behavior? → **Existing routes work; push notifications don't deep link (this phase)**
- [ ] Should we show feature "last accessed" timestamps in sheets? → Deferred to future enhancement
- [ ] Do we need a "What's New" indicator for newly added features? → Deferred to future enhancement

---

## Supporting Research

### Competitive Analysis
- **Square Dashboard App:** Uses bottom tabs (Home, Transactions, Items, More). Sheet pattern for More menu.
- **Toast Restaurant POS:** Left drawer for navigation. Too desktop-focused for mobile.
- **Lightspeed Retail:** Bottom tabs with 4-5 categories. Popular with multi-location retailers.
- **Shopify POS:** Simple bottom bar with Home, Orders, Products. Scales well.

**Learning:** Bottom tab bar is the dominant pattern in retail/POS mobile apps. Sheet-based sub-navigation (like iOS "More" tabs) is commonly used when >5 categories exist.

### User Research
- **Feedback Theme 1:** "Too many buttons to choose from" - mentioned in 12 support tickets (Q4 2025)
- **Feedback Theme 2:** "I always forget where [feature] is" - mentioned in 8 support tickets
- **Usage Analytics:** Buyer Stats and Store Metrics are often accessed together (same session)
- **Feature Usage:** Buy Queue accessed 3x more than any other feature per session

### Market Data
- **Industry Standard:** Mobile apps with 4-6 primary navigation items have highest usability scores (NN/g research)
- **Tab Bar Adoption:** 78% of top-grossing iOS apps use bottom tab bars (2024 app store analysis)
- **Multi-store Management:** 34% of BuyerKiosk users manage 2+ stores

---

*Document Version: 1.1*
*Created: 2026-02-05*
*Last Updated: 2026-02-05*
*Author: Claude Code (Opus 4.5) with User Collaboration*

## Revision History

| Version | Date | Changes |
|---------|------|---------|
| 1.0 | 2026-02-05 | Initial PRD |
| 1.1 | 2026-02-05 | Codex review: Added Information Architecture, Permission Visibility Model, Data Sources, clarified acceptance criteria with specific values, resolved contradictions, added operational metric definitions |
