chore: archive v2.3 milestone files
Archive setup sharing, currency system, and i18n foundation milestone. Reorganize ROADMAP.md with v2.3 details block, update PROJECT.md, MILESTONES.md, STATE.md deferred items, and RETROSPECTIVE.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,49 @@
|
||||
|
||||
*A living document updated after each milestone. Lessons feed forward into future planning.*
|
||||
|
||||
## Milestone: v2.3 — Global & Social Ready
|
||||
|
||||
**Shipped:** 2026-04-19
|
||||
**Phases:** 3 (32-34) | **Plans:** 18 | **Commits:** 99
|
||||
|
||||
### What Was Built
|
||||
- Setup visibility system replacing boolean isPublic with private/link/public, share tokens with 128-bit entropy, and visibility-transition side effects
|
||||
- ShareModal with Google Docs-style UX — visibility picker, link creation/expiry, revoke, deactivation warning
|
||||
- Shared setup viewer with short URL redirect, read-only mode, and three-way data source logic
|
||||
- Multi-currency pricing: ECB exchange rates with 24h cache, market_prices and community_prices tables, ownership-validated submissions, median aggregation
|
||||
- Market-aware MSRP on catalog detail pages with collapsible "Other Markets" section
|
||||
- i18n framework: react-i18next, 7 namespaces, English + German translations, language detection, language picker
|
||||
|
||||
### What Worked
|
||||
- Phased schema approach: do the migration first (32-01), service layer next, UI last — no mid-phase schema surprises
|
||||
- Dynamic import to break circular dependency (setup.service.ts → share.service.ts) was clean and discovered quickly
|
||||
- ECB exchange rate module-level cache is dead simple and effective for a single-process Bun app
|
||||
- Namespace-per-feature for i18n matches the existing file-based routing structure naturally
|
||||
|
||||
### What Was Inefficient
|
||||
- Phase 32 progress table in ROADMAP.md showed 0/4 Planned despite all plans being complete — tracking drift not caught until milestone close
|
||||
- Several todos from early in the milestone (April 10) accumulated and weren't cleared before close — 6 deferred items
|
||||
- REQUIREMENTS.md was never refreshed for v2.2 or v2.3; requirements were tracked informally in STATE.md decisions
|
||||
|
||||
### Patterns Established
|
||||
- `visibility` text enum over boolean flags for any future toggle-able states (shareable, public, featured)
|
||||
- Shares as a separate table with revocation semantics — reusable pattern for future permission systems
|
||||
- Community aggregation floor (3 reports minimum) before surfacing median — prevents single-user stat manipulation
|
||||
- i18n namespace per feature domain matches the codebase's existing routing and component organization
|
||||
|
||||
### Key Lessons
|
||||
1. Keep REQUIREMENTS.md current across milestones — informal tracking in STATE.md decisions is not a substitute
|
||||
2. Todo triage at milestone close works, but earlier triage (mid-milestone) would reduce the deferred backlog
|
||||
3. The shares deactivate/reactivate pattern (not destroy) gives users a better experience at near-zero complexity cost
|
||||
4. Language detection: localStorage-first is the right call — user preference must win over browser default
|
||||
|
||||
### Cost Observations
|
||||
- Model mix: sonnet throughout
|
||||
- Sessions: ~18 plan executions across 6 days
|
||||
- Notable: Phase 34 (i18n) was the heaviest at 8 plans — string extraction across the full app touches every component
|
||||
|
||||
---
|
||||
|
||||
## Milestone: v1.0 — MVP
|
||||
|
||||
**Shipped:** 2026-03-15
|
||||
|
||||
Reference in New Issue
Block a user