Implements INT-1370 with plugin interface extensions, cache transparency,
and standardized error handling for rate limits.
- Add `RateLimitInfo` interface for quota tracking
- Add `RateLimitError` class with structured error data
- Add `getRateLimitStatus()` optional method to SCM and Tracker interfaces
- Track `cachedAt` timestamp in cache entries
- Add `getWithMetadata()` method returning cache age and staleness
- Support cache transparency UX ("Updated 5m ago" indicators)
- Add `cacheAge`, `lastFetched`, `stale` fields to `DashboardPR`
- Add `rateLimitStatus` field with reset time and retry guidance
- Use cache metadata for transparency
- Populate cache age fields on DashboardPR
- Add rate limit status when API calls fail
- Implement `getRateLimitStatus()` using `gh api rate_limit`
- Return status for 3 resources: core, graphql, search
- Include remaining quota and reset times
- Comprehensive design doc covering architecture, types, cache strategy
- UX patterns for rate limit messaging and cache age indicators
- Future enhancements: lazy loading, request batching, quota manager
- Add RateLimitError tests (packages/core/src/__tests__/rate-limit.test.ts)
- Add TTLCache.getWithMetadata() tests (packages/web/src/lib/__tests__/cache.test.ts)
1. **Plugin-agnostic**: Works for GitHub, GitLab, Linear, Jira, etc.
2. **Explicit errors**: Show "Rate limit hit. Resets at 4:35 AM" not silent failures
3. **Cache transparency**: Indicate data age ("Updated 2m ago")
4. **Fail-safe**: Apply partial data when some API calls fail
Dashboard UI implementation (INT-1370 task 6):
- Show cache age indicators on PR cards
- Display rate limit banner when plugin is limited
- Add staleness visual cues (gray out stale data)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>