Skip to content

Commit 17e5a4d

Browse files
committed
chore: complete v2.3 Dashboard Polish milestone
Archive milestone artifacts (roadmap, requirements, audit, phases) to milestones/v2.3-*. Update PROJECT.md with validated requirements and key decisions. Reorganize ROADMAP.md with collapsed v2.3 details. Update RETROSPECTIVE.md with v2.3 section and cross-milestone trends. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent f9db8c2 commit 17e5a4d

19 files changed

Lines changed: 384 additions & 61 deletions

.planning/MILESTONES.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
11
# Milestones: Lumio
22

3+
## v2.3 Dashboard Polish (Shipped: 2026-03-05)
4+
5+
**Delivered:** Compact, visually coherent dashboard with 2x2 stat card grid, verbose localized relative time, and circular icon-only study button.
6+
7+
**Phases completed:** 34-35 (2 plans total)
8+
9+
**Key accomplishments:**
10+
11+
- Dashboard 2x2 stat card grid: Repository, Cards, Last Studied, Due Today side-by-side at half width
12+
- Verbose localized relative time for Last Studied in both IT and EN ("ieri", "2 giorni fa", "yesterday", "2 days ago")
13+
- Last Studied card made non-tappable (removed study history navigation from dashboard)
14+
- Circular 60px play button replacing rectangular text CTA for study sessions
15+
- i18n cleanup: 24 verbose time keys added, unused button text keys removed
16+
17+
**Stats:**
18+
19+
- 15 files changed (+911 / -110 lines)
20+
- 2 phases, 2 plans, 4 tasks
21+
- 1 day (2026-03-05)
22+
23+
**Git range:** `26a12aa``f9db8c2` (9 commits: 3 feat + 1 fix + 2 test + 2 docs + 1 chore)
24+
25+
**What's next:** TBD
26+
27+
---
28+
329
## v2.2 Session Limits (Shipped: 2026-03-05)
430

531
**Delivered:** Session card limit enforcement end-to-end — RPC caps cards to user-chosen limit with overdue-first priority, dashboard counter reflects session-limited count, and "Auto" label replaces infinity symbol.

.planning/PROJECT.md

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## What This Is
44

5-
Lumio è una piattaforma di studio basata su flashcard che sfrutta l'AI per trasformare concetti in sessioni di apprendimento interattive con ripetizione spaziata. App nativa Android (React Native/Expo) bilingue IT/EN con branding Lumio, ripetizione spaziata SM-2 (carte scadute prima, nuove dopo), sessioni di studio configurabili, counter "carte da ripassare oggi" sulla dashboard, navigazione carte nei repository, storico sessioni con conteggio carte, gestione errori sync con aggiornamento token in-app, autenticazione dual-mode (Google OAuth + email/password con verifica OTP), account linking bidirezionale (Google ↔ email), password reset via OTP, e landing page con versione dinamica per il download dell'APK. Il contenuto viene dai repository Git, le domande sono pre-generate dal sistema. Il versioning è derivato da STATE.md (GSD milestone) tramite CI pipeline.
5+
Lumio è una piattaforma di studio basata su flashcard che sfrutta l'AI per trasformare concetti in sessioni di apprendimento interattive con ripetizione spaziata. App nativa Android (React Native/Expo) bilingue IT/EN con branding Lumio, ripetizione spaziata SM-2 (carte scadute prima, nuove dopo), sessioni di studio configurabili con cap RPC, dashboard compatta con griglia 2x2 stat cards e tempo relativo, pulsante studio circolare icon-only, navigazione carte nei repository, storico sessioni con conteggio carte, gestione errori sync con aggiornamento token in-app, autenticazione dual-mode (Google OAuth + email/password con verifica OTP), account linking bidirezionale (Google ↔ email), password reset via OTP, e landing page con versione dinamica per il download dell'APK. Il contenuto viene dai repository Git, le domande sono pre-generate dal sistema. Il versioning è derivato da STATE.md (GSD milestone) tramite CI pipeline.
66

77
## Core Value
88

@@ -89,18 +89,14 @@ Gli utenti studiano concetti tramite quiz generati dall'AI — il contenuto vien
8989
- ✓ Dashboard counter mostra carte della prossima sessione (LEAST capping), non debito totale — v2.2
9090
- ✓ Selettore "Auto" con icona sparkles al posto di "Tutte/∞" — v2.2
9191
- ✓ Backward-compatible AsyncStorage migration da 'all' a 'auto' — v2.2
92+
- ✓ Dashboard 2x2 stat card grid: "Ultimo studio" e "Da ripassare oggi" sulla stessa riga a metà larghezza — v2.3
93+
- ✓ Tempo relativo localizzato IT/EN su "Ultimo studio" ("ieri", "2 giorni fa", "yesterday", "2 days ago") — v2.3
94+
- ✓ "Ultimo studio" non navigabile (rimosso tap → storico sessioni) — v2.3
95+
- ✓ Pulsante studio circolare centrato con sola icona play (60px, nessun testo) — v2.3
9296

9397
### Active
9498

95-
## Current Milestone: v2.3 Dashboard Polish
96-
97-
**Goal:** Rendere la dashboard visivamente coerente e compatta con layout a griglia uniforme, tempo relativo, e pulsante studio minimale.
98-
99-
**Target features:**
100-
- Layout 2-colonne per "Ultimo studio" e "Da ripassare oggi" (come Repository/Schede)
101-
- Tempo relativo su "Ultimo studio" ("ieri", "2 giorni fa", "un'ora fa")
102-
- Rimozione navigazione storico sessioni da "Ultimo studio"
103-
- Pulsante studio circolare centrale con sola icona play
99+
(None — planning next milestone)
104100

105101
### Out of Scope
106102

@@ -131,16 +127,16 @@ Gli utenti studiano concetti tramite quiz generati dall'AI — il contenuto vien
131127

132128
## Context
133129

134-
**Stato attuale (post v2.2):**
130+
**Stato attuale (post v2.3):**
135131
- Monorepo pnpm: apps/android (Expo/React Native), apps/landing (static HTML), packages/core, packages/shared
136132
- Backend Supabase: auth (Google OAuth + email/password), DB, storage, edge functions, Docora webhook + study_sessions + card_review_schedule tables
137133
- Tech stack: Expo SDK 54, React Native 0.81, react-navigation, @lumio/core, i18n-js, react-native-marked, supermemo@2.0.23, vitest@4.0.18
138134
- CI/CD: lint → build-apk → deploy-landing → deploy-migrations → deploy-functions (version from STATE.md)
139135
- Versioning: STATE.md milestone → extract-version.cjs → version.ts, APK versionName, landing page, edge function
140136
- Auth: dual-mode Google OAuth + email/password con OTP verification, password reset, account linking bidirezionale
141-
- App bilingue IT/EN con branding Lumio, ripetizione spaziata SM-2, sessioni configurabili con cap RPC, card browse, study history con conteggio carte, studio forward-only, sync error handling con token update in-app, dashboard session-aware
142-
- ~19,800 LOC (TS/TSX/SQL)
143-
- 10 milestones shipped: v1.1 (native app), v1.2 (polish & i18n), v1.3 (bugfix & UX), v1.4 (card browse & stats), v1.5 (study UX fixes), v1.6 (sync error handling), v1.7 (GSD versioning), v2.0 (spaced repetition), v2.1 (email auth), v2.2 (session limits)
137+
- App bilingue IT/EN con branding Lumio, ripetizione spaziata SM-2, sessioni configurabili con cap RPC, dashboard compatta 2x2 con tempo relativo e pulsante circolare, card browse, study history con conteggio carte, studio forward-only, sync error handling con token update in-app
138+
- ~20,600 LOC (TS/TSX/SQL)
139+
- 11 milestones shipped: v1.1 (native app), v1.2 (polish & i18n), v1.3 (bugfix & UX), v1.4 (card browse & stats), v1.5 (study UX fixes), v1.6 (sync error handling), v1.7 (GSD versioning), v2.0 (spaced repetition), v2.1 (email auth), v2.2 (session limits), v2.3 (dashboard polish)
144140

145141
## Constraints
146142

@@ -220,6 +216,11 @@ Gli utenti studiano concetti tramite quiz generati dall'AI — il contenuto vien
220216
| LEAST(total, p_limit) for count capping | Simpler than IF/ELSE with separate queries for scalar cap | ✓ Good — v2.2 |
221217
| Hardcoded 'Auto' label (universal across languages) | "Auto" is understood in both IT and EN, no translation needed | ✓ Good — v2.2 |
222218
| AsyncStorage backward-compat migration 'all' → 'auto' | Read old value, return new enum value silently | ✓ Good — v2.2 |
219+
| Verbose relative time keys alongside abbreviated | Backwards compat for StudyHistoryScreen, new verbose keys for dashboard | ✓ Good — v2.3 |
220+
| justNow threshold extended to <5min | Less jittery display for recent sessions | ✓ Good — v2.3 |
221+
| Always relative time (no absolute date fallback) | Simpler code, consistent UX — even "years ago" is relative | ✓ Good — v2.3 |
222+
| 60px circular play button (borderRadius 30) | Middle of 56-64 range, visually prominent centered CTA | ✓ Good — v2.3 |
223+
| Removed unused i18n keys after button text removal | Clean codebase, no orphaned translations | ✓ Good — v2.3 |
223224

224225
---
225-
*Last updated: 2026-03-05 after v2.3 milestone start*
226+
*Last updated: 2026-03-05 after v2.3 milestone completion*

.planning/RETROSPECTIVE.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,44 @@
126126

127127
---
128128

129+
## Milestone: v2.3 — Dashboard Polish
130+
131+
**Shipped:** 2026-03-05
132+
**Phases:** 2 | **Plans:** 2 | **Sessions:** ~1
133+
134+
### What Was Built
135+
- Dashboard 2x2 stat card grid with compact StatCard variant for half-width layout
136+
- Verbose localized relative time for Last Studied in both IT and EN (24 new i18n keys)
137+
- Last Studied card made non-tappable (removed study history navigation from dashboard)
138+
- Circular 60px play button replacing rectangular text CTA for study sessions
139+
- i18n cleanup: removed unused button text keys
140+
141+
### What Worked
142+
- Minimal scope (2 phases, 4 requirements) — shipped same day as v2.2, zero deviations
143+
- Compact StatCard prop is reusable for future half-width card layouts
144+
- justNow threshold extension (5min) reduces jitter for "just studied" display
145+
- Phase 35 UAT caught vertical centering and disabled state issues — fixed in single commit
146+
147+
### What Was Inefficient
148+
- Nothing notable — clean execution, same-day completion
149+
150+
### Patterns Established
151+
- compact StatCard prop: fontSize 18 value, wider skeleton — use for half-width cards
152+
- Verbose relative time i18n: singular (oneMinuteAgo) vs plural (minutesAgo) key pattern
153+
- Circular CTA: wrap TouchableOpacity in centering View container with generous vertical spacing
154+
155+
### Key Lessons
156+
1. Pure UI polish milestones are fast and low-risk — 2 phases in ~4 minutes total execution
157+
2. Keeping abbreviated time keys for backwards compat avoids breaking existing screens
158+
3. UAT on UI changes catches visual issues (centering, disabled state) that code review misses
159+
160+
### Cost Observations
161+
- Model mix: 80% opus, 20% sonnet (quality profile)
162+
- Sessions: ~1 (same day as v2.2)
163+
- Notable: Fastest milestone — 2 phases, 2 plans, 4 tasks, ~4 minutes total execution time
164+
165+
---
166+
129167
## Cross-Milestone Trends
130168

131169
### Process Evolution
@@ -135,6 +173,7 @@
135173
| v2.0 | ~4 | 4 | First milestone with audit-before-complete workflow; gap closure pattern |
136174
| v2.1 | ~5 | 5 | Largest since v1.1; post-ship quick fixes revealed UAT gaps |
137175
| v2.2 | ~2 | 2 | Cleanest milestone — zero deviations, zero issues |
176+
| v2.3 | ~1 | 2 | Fastest milestone — pure UI polish, same-day ship |
138177

139178
### Cumulative Quality
140179

@@ -143,6 +182,7 @@
143182
| v2.0 | 10 (SM-2 unit) | SRS module only | supermemo@2.0.23, vitest@4.0.18 |
144183
| v2.1 || Auth flows (manual) ||
145184
| v2.2 || Session limit (manual) ||
185+
| v2.3 || UI polish (UAT) ||
146186

147187
### Top Lessons (Verified Across Milestones)
148188

@@ -151,3 +191,4 @@
151191
3. Small gap closure plans are more efficient than trying to get everything right in the first pass (v2.0)
152192
4. Small, focused milestones execute cleanly with near-zero overhead (v2.2)
153193
5. Reusing patterns across phases in the same milestone accelerates development (v2.2)
194+
6. Pure UI polish milestones are fast, low-risk, and benefit most from UAT (v2.3)

.planning/ROADMAP.md

Lines changed: 11 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -129,46 +129,17 @@ Full details: `.planning/milestones/v2.2-ROADMAP.md`
129129

130130
</details>
131131

132-
### v2.3 Dashboard Polish (Complete)
133-
134-
**Milestone Goal:** Rendere la dashboard visivamente coerente e compatta con layout a griglia uniforme, tempo relativo, e pulsante studio minimale.
135-
136-
- [x] **Phase 34: Dashboard Stat Cards** - Two-column layout with relative time and non-navigable last-studied card (completed 2026-03-05)
137-
- [x] **Phase 35: Study Button Redesign** - Circular centered play button replacing text button (completed 2026-03-05)
138-
139-
## Phase Details
140-
141-
### Phase 34: Dashboard Stat Cards
142-
**Goal**: Users see a compact, uniform dashboard with stat cards on a single row and human-friendly timestamps
143-
**Depends on**: Nothing (first phase of v2.3)
144-
**Requirements**: DASH-01, DASH-02, DASH-03
145-
**Success Criteria** (what must be TRUE):
146-
1. "Ultimo studio" and "Da ripassare oggi" cards sit side-by-side on the same row, each at half width, matching the existing Repository/Schede row layout
147-
2. "Ultimo studio" card shows localized relative time (IT: "ieri", "2 giorni fa"; EN: "yesterday", "2 days ago") instead of absolute date
148-
3. Tapping "Ultimo studio" card does nothing -- no navigation to study history
149-
4. Both cards render correctly in light and dark mode at various text lengths
150-
**Plans**: 1 plan
151-
152-
Plans:
153-
- [x] 34-01-PLAN.md — Two-column stat layout with verbose relative time and compact cards
154-
155-
### Phase 35: Study Button Redesign
156-
**Goal**: Users start study sessions from a clean, icon-only circular button
157-
**Depends on**: Nothing (independent of Phase 34)
158-
**Requirements**: STUD-01
159-
**Success Criteria** (what must be TRUE):
160-
1. Study button is a centered circle with only a play icon (no text label)
161-
2. Tapping the button starts a study session (same behavior as current button)
162-
3. Button is visually prominent and centered below the stat cards in both themes
163-
**Plans**: 1 plan
164-
165-
Plans:
166-
- [x] 35-01-PLAN.md — Circular play button with i18n cleanup
132+
<details>
133+
<summary>✅ v2.3 Dashboard Polish (Phases 34-35) — SHIPPED 2026-03-05</summary>
167134

168-
## Progress
135+
- [x] Phase 34: Dashboard Stat Cards (1 plan) — completed 2026-03-05
136+
- [x] Phase 35: Study Button Redesign (1 plan) — completed 2026-03-05
137+
138+
Full details: `.planning/milestones/v2.3-ROADMAP.md`
169139

170-
**Execution Order:**
171-
Phases execute in numeric order: 34 -> 35
140+
</details>
141+
142+
## Progress
172143

173144
| Phase | Milestone | Plans Complete | Status | Completed |
174145
|-------|-----------|----------------|--------|-----------|
@@ -182,9 +153,8 @@ Phases execute in numeric order: 34 -> 35
182153
| 23-26. Spaced Repetition | v2.0 | 8/8 | Complete | 2026-02-26 |
183154
| 27-31. Email Auth | v2.1 | 10/10 | Complete | 2026-03-02 |
184155
| 32-33. Session Limits | v2.2 | 2/2 | Complete | 2026-03-05 |
185-
| 34. Dashboard Stat Cards | v2.3 | 1/1 | Complete | 2026-03-05 |
186-
| 35. Study Button Redesign | v2.3 | Complete | 2026-03-05 | 2026-03-05 |
156+
| 34-35. Dashboard Polish | v2.3 | 2/2 | Complete | 2026-03-05 |
187157

188158
---
189159
*Roadmap created: 2026-01-29*
190-
*v2.3 roadmap added: 2026-03-05*
160+
*Last updated: 2026-03-05 after v2.3 milestone completion*

.planning/STATE.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ milestone: v2.3
44
milestone_name: Dashboard Polish
55
status: completed
66
stopped_at: Completed 35-01-PLAN.md
7-
last_updated: "2026-03-05T17:37:25.269Z"
7+
last_updated: "2026-03-05T18:09:23.987Z"
88
last_activity: 2026-03-05 — Completed 35-01 Study Button Redesign plan
99
progress:
1010
total_phases: 2
@@ -21,7 +21,7 @@ progress:
2121
See: .planning/PROJECT.md (updated 2026-03-05)
2222

2323
**Core value:** Gli utenti studiano concetti tramite quiz generati dall'AI -- il contenuto viene dai repository Git, le domande vengono generate e pre-cachate dal sistema.
24-
**Current focus:** v2.3 Dashboard Polish — Phase 35 Plan 01 complete (milestone complete)
24+
**Current focus:** Planning next milestone
2525

2626
## Current Position
2727

@@ -36,7 +36,7 @@ Progress: [██████████] 100%
3636

3737
**Velocity:**
3838
- Total plans completed: 70 (across v1.1-v2.3)
39-
- Total milestones shipped: 10
39+
- Total milestones shipped: 11
4040
- Timeline: 35 days (2026-01-29 to 2026-03-05)
4141

4242
| Phase | Plan | Duration | Tasks | Files |
@@ -64,7 +64,7 @@ None.
6464

6565
### Blockers/Concerns
6666

67-
None — v2.2 milestone audit passed with 5/5 requirements satisfied.
67+
None — v2.3 milestone audit passed with 4/4 requirements satisfied.
6868

6969
### Quick Tasks Completed
7070

.planning/config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"workflow": {
77
"research": false,
88
"plan_check": true,
9-
"verifier": true
9+
"verifier": true,
10+
"_auto_chain_active": false
1011
},
1112
"granularity": "standard"
1213
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
---
2+
milestone: v2.3
3+
audited: 2026-03-05T18:10:00Z
4+
status: passed
5+
scores:
6+
requirements: 4/4
7+
phases: 2/2
8+
integration: 4/4
9+
flows: 4/4
10+
gaps:
11+
requirements: []
12+
integration: []
13+
flows: []
14+
tech_debt: []
15+
nyquist:
16+
compliant_phases: []
17+
partial_phases: []
18+
missing_phases: [34-dashboard-stat-cards, 35-study-button-redesign]
19+
overall: MISSING
20+
---
21+
22+
# v2.3 Dashboard Polish — Milestone Audit
23+
24+
**Audited:** 2026-03-05T18:10:00Z
25+
**Status:** passed
26+
**Milestone Goal:** Rendere la dashboard visivamente coerente e compatta con layout a griglia uniforme, tempo relativo, e pulsante studio minimale.
27+
28+
## Requirements Coverage (4/4 Satisfied)
29+
30+
### 3-Source Cross-Reference
31+
32+
| REQ-ID | VERIFICATION.md | SUMMARY Frontmatter | REQUIREMENTS.md | Final Status |
33+
|--------|----------------|---------------------|-----------------|-------------|
34+
| DASH-01 | SATISFIED (34-VERIFICATION) | Listed (34-01-SUMMARY) | [x] Complete | **satisfied** |
35+
| DASH-02 | SATISFIED (34-VERIFICATION) | Listed (34-01-SUMMARY) | [x] Complete | **satisfied** |
36+
| DASH-03 | SATISFIED (34-VERIFICATION) | Listed (34-01-SUMMARY) | [x] Complete | **satisfied** |
37+
| STUD-01 | SATISFIED (35-VERIFICATION) | Listed (35-01-SUMMARY) | [x] Complete | **satisfied** |
38+
39+
**Orphaned requirements:** None
40+
**Unsatisfied requirements:** None
41+
42+
## Phase Verifications (2/2 Passed)
43+
44+
| Phase | Status | Score | Gaps | Anti-Patterns |
45+
|-------|--------|-------|------|---------------|
46+
| 34 — Dashboard Stat Cards | passed | 5/5 | None | None |
47+
| 35 — Study Button Redesign | passed | 4/4 | None | None |
48+
49+
## Cross-Phase Integration (4/4 Wired)
50+
51+
| Requirement | Integration Path | Status |
52+
|-------------|-----------------|--------|
53+
| DASH-01 | `secondStatRow` layout → two `StatCard compact` children → `flex: 1` half-width | WIRED |
54+
| DASH-02 | `formatLastStudied()``t('dashboard.*Ago')` → en.ts/it.ts verbose keys → StatCard value | WIRED |
55+
| DASH-03 | Last Studied StatCard has no TouchableOpacity, no onPress, no StudyHistory reference | WIRED |
56+
| STUD-01 | `studyButtonContainer` → 60px circular TouchableOpacity → `handleStudyPress``navigation.navigate('Study')` | WIRED |
57+
58+
**Cross-phase conflict check:** Both phases modify DashboardScreen.tsx. Final file shows clean sequential composition — Phase 34 fills stat grid, Phase 35 adds circle button below. No collisions.
59+
60+
**Orphaned exports:** 0
61+
**Missing connections:** 0
62+
63+
## E2E Flows (4/4 Complete)
64+
65+
| Flow | Path | Status |
66+
|------|------|--------|
67+
| User sees 2x2 stat grid | MainNavigator → DashboardScreen → statRow + secondStatRow | Complete |
68+
| Last Studied shows relative time | AsyncStorage read → formatLastStudied → i18n keys → StatCard value | Complete |
69+
| Last Studied not tappable | No TouchableOpacity, no onPress, no StudyHistory | Complete |
70+
| Circular play button starts study | Circle button → handleStudyPress → navigate('Study') → StudyScreen | Complete |
71+
72+
## Tech Debt
73+
74+
None. The backward-compat i18n keys (mAgo, hAgo, dAgo) are still actively used by StudyHistoryScreen.
75+
76+
## Nyquist Compliance
77+
78+
| Phase | VALIDATION.md | Compliant | Action |
79+
|-------|---------------|-----------|--------|
80+
| 34 — Dashboard Stat Cards | missing || `/gsd:validate-phase 34` |
81+
| 35 — Study Button Redesign | missing || `/gsd:validate-phase 35` |
82+
83+
---
84+
*Audited: 2026-03-05T18:10:00Z*
85+
*Auditor: Claude (audit-milestone)*
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
# Requirements Archive: v2.3 Dashboard Polish
2+
3+
**Archived:** 2026-03-05
4+
**Status:** SHIPPED
5+
6+
For current requirements, see `.planning/REQUIREMENTS.md`.
7+
8+
---
9+
110
# Requirements: Lumio
211

312
**Defined:** 2026-03-05

0 commit comments

Comments
 (0)