Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 100 additions & 1 deletion .bmad/bmm-workflow-status.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,107 @@ project:
completed_points: 431 # All V1 completed
active_track: prod # V2 retired into prod series

# Release Phases (active) — overlay on top of the 28-epic prod roadmap
# Pilot v1 → MENA-10 → Public Launch
# Manifests: epics/phase-1-pilot-v1.md, phase-2-mena10.md, phase-3-launch.md
release_phases:
phase_1_pilot_v1:
sprints: [P1, P2, P3]
weeks: 7
points: 296
target_date: 2026-07-12
status: not-started
pilot_tenant: "King Fahad Schools (Sudan)"
manifest: epics/phase-1-pilot-v1.md
success_criteria:
- "King Fahad converts to paid in Jun/Jul 2026 conversation"
- "Play Internal Testing track live with admin + parent test cohort"
- "Crash-free user rate >= 99% on internal track"
- "Arabic translation audit rated >= 95% natural by native-speaker review"

phase_2_mena10:
sprints: [P4, P5, P6, P7, P8]
weeks: 10
points: 411
target_date: 2026-09-15
status: not-started
manifest: epics/phase-2-mena10.md
success_criteria:
- "10 pilot schools onboarded"
- ">= 1 paid conversion"
- "Admission flow used by >= 3 schools for Sep 2026 intake"
- "Crash-free user rate >= 99%"
- "Unit test coverage >= 35%"

phase_3_launch:
sprints: [P9, P10, P11, P12, P13, P14, P15, P16]
weeks: 16
points: 408
target_date: 2026-12-20
status: not-started
manifest: epics/phase-3-launch.md
success_criteria:
- "v1.0.0 in Play Store production (staged rollout to 100%)"
- "Unit test coverage >= 80%; crash-free users >= 99.5%"
- "TalkBack + WCAG AA audit clean"

# Per-story release-phase mapping (Phase 1 enumerated; Phase 2/3 see manifests).
# Pick next work from phase_1_story_ids in dependency order — full AC in epics/epic-prod-NN-*.md.
phase_1_story_ids:
E01: [S01, S02, S03, S04, S05, S06, S07]
E02: [S01, S02, S06, S08, S09]
E03: [S01, S04, S05, S06, S08]
E04: [S01, S02, S05, S06]
E05: [S01, S02, S04, S05]
E06: [S01, S02, S03, S05, S07, S10]
E07: [S01, S02, S03]
E08: [S01, S02, S03, S04, S05, S06, S07, S11, S12, S14, S16, S17, S20] # S20 admission portion only
E09: [S06, S07]
E10: [S01, S05, S08, S09]
E11: [S01, S03, S07]
E19: [S01, S02, S03, S04, S05, S06]
E25: [S01, S08]
E26: [S01, S02, S03, S04]
E27: [S01, S03, S04]
# Total: 71 stories ~296 points

# Epics whose pilot/MENA-10/launch work concentration drives staffing focus.
# (A single epic can contribute to multiple phases; this lists where the *bulk* lives.)
release_phase_concentration:
primarily_phase_1_pilot:
- epic-prod-01 # foundation: 26/42 pts in P1
- epic-prod-07 # locale formatting: 13/18 pts in P1
primarily_phase_2_mena10:
- epic-prod-02 # tenancy RBAC
- epic-prod-03 # auth hardening
- epic-prod-04 # UI i18n
- epic-prod-06 # DB translation
- epic-prod-08 # API contract
- epic-prod-09 # real-time layer
- epic-prod-10 # auth/profile UI
- epic-prod-13 # attendance behaviour
- epic-prod-14 # grading exams
- epic-prod-16 # fees finance
- epic-prod-18 # communications
- epic-prod-19 # admission (P1) + library/idcard/wallet (P3) — mixed
- epic-prod-22 # test infra
- epic-prod-25 # security hardening
- epic-prod-26 # observability
- epic-prod-27 # release pipeline
primarily_phase_3_launch:
- epic-prod-05 # RTL — most polish in P3
- epic-prod-11 # dashboard
- epic-prod-12 # SIS
- epic-prod-15 # timetable curriculum
- epic-prod-17 # LMS
- epic-prod-20 # role portals
- epic-prod-21 # settings
- epic-prod-23 # performance
- epic-prod-24 # accessibility
- epic-prod-28 # Play Store launch

# Production-Readiness Roadmap (active)
# Source plan: ~/.claude/plans/typed-wobbling-giraffe.md
# Source plan: ~/.claude/plans/take-web-app-as-precious-turtle.md (refresh of typed-wobbling-giraffe.md)
# Overview: epics/epic-prod-overview.md
prod_epics:
total_epics: 28
Expand Down
46 changes: 46 additions & 0 deletions .bmad/epics/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Hogwarts Android — Production Roadmap

This directory holds the **active** production roadmap for `databayt/android-app`. Two coordinate axes describe each story: a **build phase** (dependency order) and a **release phase** (ship order).

## Two-axis model

| Axis | Phases | What it tells you |
|---|---|---|
| **Build phase** (existing) | A Foundation · B i18n · C Backend · D Features · E Quality · F Production | Which work must complete before which other work |
| **Release phase** (new overlay) | 1 Pilot v1 · 2 MENA-10 · 3 Public Launch | Which customer milestone the work serves |

A story like `E13.S04` (mark attendance bulk) lives in **build phase D** (it depends on backend endpoints from C) and **release phase 2** (it ships to support the 10 pilot schools, not the first one). The two phases are orthogonal — read each story's header for both.

## Start here

| File | Purpose |
|---|---|
| [`epic-prod-overview.md`](./epic-prod-overview.md) | Master roadmap. 28 epics, 1115 points, 16 sprints, both axes summarised. |
| [`phase-1-pilot-v1.md`](./phase-1-pilot-v1.md) | **The next ~7 weeks.** King Fahad Schools (Sudan) pilot conversion target. |
| [`phase-2-mena10.md`](./phase-2-mena10.md) | MENA-10 program — scale from 1 to 10 schools. |
| [`phase-3-launch.md`](./phase-3-launch.md) | Public Play Store launch (v1.0.0). |

## Individual epic files

`epic-prod-01-*.md` through `epic-prod-28-*.md` — one file per epic, ~10 stories each, with acceptance criteria + file refs + estimates. Each story's header marks both its build phase and its release phase.

## Status

`../bmm-workflow-status.yaml` is the canonical source of "what's done / in progress / not started" per story and per epic. Update it as work lands.

## Archive

`./archive/` holds:

- `epic-01..17-*.md` — V1 epics (the completed UI shell; 431 points; superseded).
- `epic-v2-01-backend-api.md` — V2 backend API draft (folded into `epic-prod-08`).
- `docs-epics/epic-1..7-*.md` — Earlier `docs/epics/` mirrors (stale).

These remain readable for historical reference; do not pick up stories from them.

## How to use this directory

- **Picking next work:** read the active phase manifest (`phase-1-pilot-v1.md` today). Find the next story whose dependencies are merged. Follow [`.claude/rules/github-workflow.md`](../../.claude/rules/github-workflow.md).
- **Adding a story:** add it to the relevant `epic-prod-NN-*.md` file. Tag it with `**Phase: <Pilot v1 | MENA-10 | Launch>**` and a sprint. Update `bmm-workflow-status.yaml`.
- **Shifting a story between release phases:** edit its header marker, move it in the relevant phase manifest, update `bmm-workflow-status.yaml`. Don't renumber.
- **Closing an epic:** mark all stories `completed` in the YAML; tick the epic's DoD; leave the epic file in place.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
14 changes: 7 additions & 7 deletions .bmad/epics/epic-prod-01-foundation-hardening.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ The MVP shell ships with several silent stubs that would corrupt user data, drop

## 2. Stories

### Story E01.S01: Commit `google-services.json` for debug + staging + release [2 pts]
### Story E01.S01: Commit `google-services.json` for debug + staging + release [2 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** new contributor, **I want** the Firebase plugin to find its config, **So that** a fresh checkout builds without manual setup.
Expand All @@ -48,7 +48,7 @@ The MVP shell ships with several silent stubs that would corrupt user data, drop

---

### Story E01.S02: Replace `fallbackToDestructiveMigration()` with explicit migrations [8 pts]
### Story E01.S02: Replace `fallbackToDestructiveMigration()` with explicit migrations [8 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** user upgrading the app, **I want** my offline data to survive schema bumps, **So that** I don't lose attendance, messages, or grades on every release.
Expand All @@ -68,7 +68,7 @@ The MVP shell ships with several silent stubs that would corrupt user data, drop

---

### Story E01.S03: Wire mutation queue to actually transmit [8 pts]
### Story E01.S03: Wire mutation queue to actually transmit [8 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** teacher marking attendance offline, **I want** the marks to reach the server when I'm back online, **So that** my work isn't lost.
Expand All @@ -89,7 +89,7 @@ The MVP shell ships with several silent stubs that would corrupt user data, drop

---

### Story E01.S04: Upload FCM token to backend [3 pts]
### Story E01.S04: Upload FCM token to backend [3 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** server operator, **I want** every device's FCM token registered, **So that** push notifications can reach the right device.
Expand All @@ -106,7 +106,7 @@ The MVP shell ships with several silent stubs that would corrupt user data, drop

---

### Story E01.S05: Reconcile `BuildConfigHelper` drift with compiled `BuildConfig` [2 pts]
### Story E01.S05: Reconcile `BuildConfigHelper` drift with compiled `BuildConfig` [2 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** future reader of `BuildConfigHelper`, **I want** one source of truth for the API base URL, **So that** I don't have to chase down two divergent constants.
Expand All @@ -121,7 +121,7 @@ The MVP shell ships with several silent stubs that would corrupt user data, drop

---

### Story E01.S06: Reconcile `app/strings.xml` parity drift [1 pt]
### Story E01.S06: Reconcile `app/strings.xml` parity drift [1 pt] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** CI runner, **I want** `:app:checkStringParity` to be green, **So that** the build doesn't fail on a single missing translation.
Expand All @@ -134,7 +134,7 @@ The MVP shell ships with several silent stubs that would corrupt user data, drop

---

### Story E01.S07: Wire `AppStartupInitializer` into `HogwartsApplication.onCreate` [2 pts]
### Story E01.S07: Wire `AppStartupInitializer` into `HogwartsApplication.onCreate` [2 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** developer triaging startup issues, **I want** the existing initializer skeleton actually invoked, **So that** I have one place to add startup hooks.
Expand Down
10 changes: 5 additions & 5 deletions .bmad/epics/epic-prod-02-multi-tenancy-rbac.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Production-grade tenant isolation and 8-role permission enforcement. Every Room

## 2. Stories

### Story E02.S01: Expand `UserRole` enum to 8 roles [2 pts]
### Story E02.S01: Expand `UserRole` enum to 8 roles [2 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** mobile user with the ACCOUNTANT role on the web, **I want** my role to be honored on mobile, **So that** I can do my job from the field.
Expand All @@ -48,7 +48,7 @@ Production-grade tenant isolation and 8-role permission enforcement. Every Room

---

### Story E02.S02: Move `SessionManagerImpl` from `app/.../di/repository-module.kt` into `core/security` [3 pts]
### Story E02.S02: Move `SessionManagerImpl` from `app/.../di/repository-module.kt` into `core/security` [3 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 1

**As a** developer auditing security primitives, **I want** session storage in `core/security`, **So that** the auditable surface is one module.
Expand Down Expand Up @@ -115,7 +115,7 @@ Production-grade tenant isolation and 8-role permission enforcement. Every Room

---

### Story E02.S06: Rewrite `TenantContext` to surface tenant + role + scoping helpers [5 pts]
### Story E02.S06: Rewrite `TenantContext` to surface tenant + role + scoping helpers [5 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 2

**As a** repository, **I want** a single source of truth for the active tenant + user scope, **So that** I never have to manually thread `schoolId`, `userId`, `classIds`, etc. through method parameters.
Expand Down Expand Up @@ -149,7 +149,7 @@ Production-grade tenant isolation and 8-role permission enforcement. Every Room

---

### Story E02.S08: `TenantInterceptor` reads from flow-backed `TenantContext` [2 pts]
### Story E02.S08: `TenantInterceptor` reads from flow-backed `TenantContext` [2 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** UI, **I want** network requests to reflect the current tenant within 1 frame of switch, **So that** stale-tenant requests don't fly after logout.
Expand All @@ -163,7 +163,7 @@ Production-grade tenant isolation and 8-role permission enforcement. Every Room

---

### Story E02.S09: Logout fully clears tenant + ability + DataStore + secure prefs + Room [3 pts]
### Story E02.S09: Logout fully clears tenant + ability + DataStore + secure prefs + Room [3 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** shared-device user, **I want** logout to leave no trace of my data, **So that** the next user starts clean.
Expand Down
10 changes: 5 additions & 5 deletions .bmad/epics/epic-prod-03-auth-session-hardening.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Production-grade auth that mirrors hogwarts' Auth.js v5 patterns: cross-subdomai

## 2. Stories

### Story E03.S01: Migrate to Credential Manager API for password autofill [5 pts]
### Story E03.S01: Migrate to Credential Manager API for password autofill [5 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 2

**As a** returning user, **I want** my saved password to autofill on the login screen, **So that** I sign in with one tap.
Expand Down Expand Up @@ -83,7 +83,7 @@ Production-grade auth that mirrors hogwarts' Auth.js v5 patterns: cross-subdomai

---

### Story E03.S04: Implement `whoami` post-login + post-onboarding refresh [5 pts]
### Story E03.S04: Implement `whoami` post-login + post-onboarding refresh [5 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 2

**As a** newly-onboarded school admin, **I want** my session to immediately reflect my new schoolId, **So that** I don't need to log out and back in.
Expand All @@ -101,7 +101,7 @@ Production-grade auth that mirrors hogwarts' Auth.js v5 patterns: cross-subdomai

---

### Story E03.S05: Biometric re-login [5 pts]
### Story E03.S05: Biometric re-login [5 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** returning user on a trusted device, **I want** to log back in with my fingerprint / face, **So that** I skip typing my password.
Expand All @@ -120,7 +120,7 @@ Production-grade auth that mirrors hogwarts' Auth.js v5 patterns: cross-subdomai

---

### Story E03.S06: Forgot-password OTP flow end-to-end [5 pts]
### Story E03.S06: Forgot-password OTP flow end-to-end [5 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** user who forgot their password, **I want** to reset it via email OTP, **So that** I can regain access without contacting support.
Expand Down Expand Up @@ -156,7 +156,7 @@ Production-grade auth that mirrors hogwarts' Auth.js v5 patterns: cross-subdomai

---

### Story E03.S08: Tenant selector before login (multi-school users) [3 pts]
### Story E03.S08: Tenant selector before login (multi-school users) [3 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** parent with kids in two schools, **I want** to choose which school to sign into, **So that** the right tenant context loads.
Expand Down
8 changes: 4 additions & 4 deletions .bmad/epics/epic-prod-04-ui-internationalization.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Every UI string in every Composable, dialog, notification, and snackbar is keyed

## 2. Stories

### Story E04.S01: Audit existing 1,820 EN / 1,819 AR strings for translation quality [8 pts]
### Story E04.S01: Audit existing 1,820 EN / 1,819 AR strings for translation quality [8 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** native Arabic-speaking user, **I want** strings that read naturally, **So that** I trust the app for my school's daily work.
Expand All @@ -47,7 +47,7 @@ Every UI string in every Composable, dialog, notification, and snackbar is keyed

---

### Story E04.S02: Fix all `Text("literal")` violations after Detekt rule lands [8 pts]
### Story E04.S02: Fix all `Text("literal")` violations after Detekt rule lands [8 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** non-English user, **I want** every UI string available in my language, **So that** I'm not surprised by random English text.
Expand Down Expand Up @@ -101,7 +101,7 @@ Every UI string in every Composable, dialog, notification, and snackbar is keyed

---

### Story E04.S05: Locale switch without app restart [5 pts]
### Story E04.S05: Locale switch without app restart [5 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 4

**As a** user, **I want** to switch language and see immediate effect, **So that** I don't have to kill the app.
Expand All @@ -117,7 +117,7 @@ Every UI string in every Composable, dialog, notification, and snackbar is keyed

---

### Story E04.S06: Plurals audit and fix for Arabic six-form rule [3 pts]
### Story E04.S06: Plurals audit and fix for Arabic six-form rule [3 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 4

**As a** native Arabic speaker, **I want** counts rendered with grammatical plurals, **So that** "1 student" / "2 students" / "11 students" all read correctly in Arabic.
Expand Down
8 changes: 4 additions & 4 deletions .bmad/epics/epic-prod-05-rtl-layout-typography.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Pixel-perfect mirror layouts in Arabic. Every padding, alignment, icon, and anim

## 2. Stories

### Story E05.S01: Audit and fix 100% of `Modifier.padding(start|end)` correctness [8 pts]
### Story E05.S01: Audit and fix 100% of `Modifier.padding(start|end)` correctness [8 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** developer, **I want** zero `left`/`right` padding violations, **So that** RTL just works.
Expand All @@ -46,7 +46,7 @@ Pixel-perfect mirror layouts in Arabic. Every padding, alignment, icon, and anim

---

### Story E05.S02: Auto-mirroring icons via `autoMirrored = true` [3 pts]
### Story E05.S02: Auto-mirroring icons via `autoMirrored = true` [3 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 3

**As a** Arabic user, **I want** the back arrow to point right (toward where I came from), **So that** navigation icons feel native.
Expand Down Expand Up @@ -81,7 +81,7 @@ Pixel-perfect mirror layouts in Arabic. Every padding, alignment, icon, and anim

---

### Story E05.S04: Font-swap correctness audit [3 pts]
### Story E05.S04: Font-swap correctness audit [3 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 4

**As a** Arabic user, **I want** Arabic text rendered with the proper Arabic font, **So that** ligatures and diacritics look right.
Expand All @@ -96,7 +96,7 @@ Pixel-perfect mirror layouts in Arabic. Every padding, alignment, icon, and anim

---

### Story E05.S05: Bidi-safe number rendering [2 pts]
### Story E05.S05: Bidi-safe number rendering [2 pts] · **Phase: Pilot v1**
**Status:** Not Started · **Sprint:** 4

**As a** Arabic user reading a phone number or invoice number, **I want** the digits in their original order (not mirrored), **So that** I can read and dial correctly.
Expand Down
Loading