Sprint Plan

Q3 2026 execution plan — epics to stories across tech and non-tech, with maturity, owners, machine-readiness, and the cash position.

This is the team's execution plan for the quarter — every epic we're moving, tech and non-tech, as epics → stories you can act on. Each epic carries a maturity badge and a tracker; the stories under it are the open work.

Epics is the companion page: it's the GitHub tracker map, where each issue is the source of truth. This page is the execution plan — the machine-readiness prerequisites, the cash position, and the non-tech tracks (sales, fundraising, content) the tracker doesn't carry. Per-feature truth lives in the hogwarts docs — MVP and Roadmap; if anything here conflicts, those win.

Reconciled 2026-06-20 against hogwarts origin/main @ febb7da3b. Since the last reconcile a large amount shipped — transportation Phase 2–5 (route optimization, live GPS, hazards), the conference notification/attendance integration, the public features + community hubs, exam-and-grade automation, the stream/LMS optimize pass, saas-dashboard de-fabrication, and timetable production-readiness — so most tech epics are now code-complete. The quarter therefore narrows to a single launch sprint below: four weeks of correctness fixes, database confirmation, ops/credential activation, and a QA pass, ending with a launch gate for King Fahad, public SaaS, and Aldar at once. The hogwarts-side execution-truth version (with file-level evidence) is hogwarts/sprint. The per-epic backlog below is the open work that feeds the sprint — and the long tail after it.

Everyone: the warm-intro list

The fastest path to a pilot is someone we already know — a warm intro from a real relationship converts far better than any scraped or cold lead. So this one is on everyone, not just sales. The sales block now has a one-click Network filter — add/edit every school owner, principal, or manager you personally know.

Get your machine ready

Every block ships through the kun engine and one workflow — issue → branch → PR → merge. Full detail in Onboarding.

1. Install everything — one paste (macOS / Linux):

curl -fsSL https://kun.databayt.org/install | bash

Windows (PowerShell or cmd.exe):

powershell -ExecutionPolicy Bypass -Command "iwr https://kun.databayt.org/install.ps1 | iex"

2. Verify green:

bash ~/.claude/scripts/health.sh && claude doctor

3. Start work:

c "/issue"

Pick a task

Every item under Epics is a tiny piece of the quarter — each one is ~half-day to ~1-day of work, shippable as a single PR. Find one that interests you, comment "I'll take this" on the linked issue, then run c "/issue" to start. Nothing fits? Open one with /idea.

Tasks marked needs issue don't have a GitHub issue yet — open one with /issue before claiming. Tasks marked needs discussion are open team questions — start a thread under databayt/hogwarts Discussions, gather input, then summarize the decision back on the thread.

Epics at a glance

#EpicTrackBetMaturityDetail
01Finance & billingTech1Built+Polishhogwarts#313
02AdmissionTech1Built+Polishhogwarts#314
03Exams & gradingTechBuilt+Polishexams
04AttendanceTechBuilt+Polishattendance
05LMS / StreamTechBuilt+Polishcatalog
06Communication / MessagingTechBuilt+Polishmessages
06bTransportationTechBuilt+Polishtransportation
07Role-aware UI sweepTechBuilt+Polish
08Internationalization & translationTechBuilt+Polishtranslation
09Mobile API LayerTech2Built+Polishhogwarts#315
10iOS appTech2Built (stalled)swift-app#3
11Android appTech2Vaporwarekotlin-app (repo TBD)
12Sales & PilotsNon-techbothBuilt+Polishhogwarts#316
13FundraisingNon-techIn Progressfundraising
14Content & MarketingNon-techIn Progress
15Global CatalogTechBuilt+Polishcatalog
16Letters & ProposalsNon-techbothIn Progressproposal · outreach
17CommunityNon-techIn Progresscommunity

Owner-by-epic mapping lives in Epics — that's the GitHub tracker map. This page is interest-first: pick by topic, not by name.

Launch sprint (4 weeks)

The epics above are mostly Built+Polish — code-complete, deployed, tested. So the quarter's spine is one focused sprint that ends with launch for all three audiences at once: the King Fahad pilot (Sudan, Sept 2026), the public SaaS at ed.databayt.org, and the Aldar enterprise pilot (UAE). File-level evidence for every line lives in hogwarts/sprint; this is the org view.

Five tracks run in parallel across all four weeks: A Code, B Data, C Ops/Infra, D QA/Proof, E Polish.

WeekThemeExit gate
1Reachable & TruthfulEvery shipped feature has a URL, CI runs e2e, prod has error visibility, DB confirmed
2Money & MessagingEvery financial event posts a balanced ledger entry; real-time + WhatsApp live for all tenants
3Conference & ProofLiveKit live (network-test scheduled), e2e green in CI, Arabic RTL clean
4Harden & LaunchLaunch gate green for all three audiences

Week 1 — Reachable & Truthful. Fix the Playwright CI command (playwright testsplaywright test, playwright.yml:52) so e2e actually runs · make STRIPE_API_KEY optional in /api/health so school-only deploys report healthy · add the manage/ + paper/ exam index pages · audit Neon prod vs Prisma and apply any additive drift Neon-branch-first (transportation + conference DB already landed at their 2026-06-20 deploys) · set Sentry + Upstash env in Vercel.

Week 2 — Money & Messaging. Finance-ledger investigation reframed this: of the four "orphaned" posters only postFeeAssignment had a real call site, and wiring it (assignFee + bulkAssignFees, done 2026-06-20) was a correctness fix — the accrual model recognizes revenue at assignment, so with only payment wired the receivable was driven negative and revenue never recognized. The other three are blocked beyond wiring (no payment-recording flow for invoice/expense; the salary posting rule is unbalanced). The debit=credit invariant test already existed — and it surfaced, and we fixed in code, a pre-existing toCents ×100 ledger-inflation P0 (rules now store whole units, matching Payment.amount + the Decimal(12,2) column + reconciliation; posting-rules.test.ts green). The finance/content.tsx + salary/content.tsx 1/100 display bug is also fixed. Payroll tax is now progressive (replaces the flat 15% in payroll + salary, unit-tested). The ÷100 ledger migration is a verified no-op safety net (a read-only prod check found zero inflated rows — all seeded whole-units — so the code fix deploys safely alone; the script is now self-verifying/fees-scoped). Invoice PDF + branded RTL email are done (logo into the PDF; email rebuilt on react-email with RTL/branding/itemized/signature). Invoice + expense payment flows are done, and the salary poster is too — the salary posting rule was rebalanced and postSalaryPayment wired in processPayments, so all 6 ledger posters are wired (the double-entry ledger reflects every finance money event). Week-2 finance code is complete, and an adversarial multi-agent review of the finance diff found + fixed 12 money-path defects (multi-tenant scoping, concurrent double-post races + a JournalEntry @@unique idempotency constraint, salary tax base, invoice partial-payment, a permission gate, dashboard display, RTL sign). Remaining is ops: stand up the Oracle VM + Evolution API (real-time + WhatsApp for every tenant; per-school QR for King Fahad + Albayan) · set Tap (AED) + FCM env · file the ADEK eSIS inquiry now (longest external lead time).

Week 3 — Conference & Proof. LiveKit 6-gate provisioning (conference/RUNBOOK.md); schedule the in-school network test to a King Fahad / Aldar site visit · real e2e pass now that CI runs (triage the test.skip backlog, add a named section-grid case, give assertion-less specs real expect()s) · i18n RTL Arabic pass + parent-portal dictionary migration · exams schema cleanup (bilingual → lang, reconcile Result/ExamResult, harden the certificate cascade).

Week 4 — Harden & Launch. Drain the highest-value saas-dashboard backlog (delete the dead Kanban/Products route pages, invoice state-machine guard, catalog TOCTOU, i18n sweep) · exams RBAC + calculator test coverage + AI cost cap · per-pilot smoke on King Fahad + Albayan · load + rate-limit verification · final security pass · wire the hardcoded-string ratchet into the PR gate · run the launch gate.

Launch gate — the sprint ends when this is green. All critical-path code merged · Neon prod confirmed against Prisma · Sentry + Upstash + FCM set and Sentry receiving · playwright test green in CI · finance ledger correct (toCents ×100 bug resolved + wireable posters wired; invoice/expense/salary pending their flows) · King Fahad + Albayan smoke-clean · Oracle VM live + WhatsApp QR scanned · Tap keys set (UAE/Aldar) · LiveKit network-test passes inside school WiFi (Aldar) · ADEK status acceptable — DRY_RUN is fine for King Fahad/SaaS; live submission only gates Aldar compliance (Aldar).

External blockers (outside the team's keyboard — launch is not falsely gated on them): ADEK eSIS credentials (Aldar compliance team; DRY_RUN meanwhile), the LiveKit in-school network test (needs physical school WiFi; external pasted-link conferencing works meanwhile), and per-school WhatsApp QR scans (each school admin).

Epics

01 — Finance & billing · Tech · Built+Polish

finance · Epic hogwarts#313

The 14-sub-block finance system — fees, invoice, salary, payroll, ledger, the lot. Block-level ~88% ready (self-reported in the block's ISSUE.md, 2026-06-13; see the honest status matrix). Top blockers: 4 of 6 ledger posting functions are still orphaned (postFeePayment + postWalletTopup are wired — and the ledger now actually posts after a fix to a silent bug where postFeePayment queried a non-existent accountCode column and wrote nothing), no finance Prisma model has a lang field, 11 sub-modules still need the ValidationHelper migration, and 11 sub-modules have zero tests. Every line below is a step toward making this block fully production-ready end-to-end.

Fees · 85%

fees

The most feature-rich sub-block — structures, assignments, payments, fines, scholarships, sibling-discount calc, dictionary-driven notifications. What's left is hardening + the long tail of polish.

  • Migrate validation.ts to ValidationHelper · needs issue
  • Fee defaulters list · needs issue
  • Add lang field to Fine so reason can use getDisplayText() · needs issue
  • Translate fine-type enum badges (LATE FEE, DAMAGE FINE, LIBRARY FINE, DISCIPLINE FINE) on AR via dictionary.finance.fees.fineTypes.* · needs issue
  • Translate fines overview card titles (currently hardcoded English in content.tsx) · needs issue
  • Installment-plan UI flow — schema FeePaymentPlan exists, no UI yet · needs issue
  • Scholarship auto-apply based on merit / need criteria · needs issue
  • Fee-waiver workflow distinct from scholarship · needs issue
  • Per-grade / per-class fee templates · needs issue
  • Fee refund on withdrawal · needs issue
  • Late-fee auto-calculation cron · needs issue
  • Wire postFeeAssignment to the ledger (today: orphaned) · needs issue
  • Roll back fee-payment ledger post on failure — today it's fire-and-forget · needs issue
  • Test: sibling-discount edge cases (3+ siblings, partial enrollment) · needs issue
  • Test: scholarship coverage types (percentage / fixed / full) · needs issue
  • Test: partial → full payment transition · needs issue
  • Test: fine waive vs. delete rules · needs issue
  • Fee forecast vs. actual report · needs issue
  • Class-level collection-rate dashboards · needs issue

Invoice · 90%

invoice

131 tests passing, multi-tenant via getTenantContext(), RBAC wired. What's left is PDF + print, an email-template upgrade, and closing the ledger gap.

  • PDF adapter: mapInvoiceToGenerateData() mapping Prisma UserInvoiceInvoiceData · needs issue
  • PDF: "Download" + "Print" buttons on view-content.tsx · needs issue
  • PDF: wire school logo (UserInvoiceSettings.invoiceLogo) into header · needs issue
  • PDF: wire signature (UserInvoiceSignature) into footer · needs issue
  • PDF: add download action to the DataTable action menu · needs issue
  • Email: school name + logo in header, itemized table in body, signature in footer · needs issue
  • Email: replace hardcoded Invoice App <onboarding@resend.dev> with a school-specific verified sender · needs issue
  • Email: RTL + Rubik font for Arabic recipients · needs issue
  • Email: migrate plain JSX to @react-email/components · needs issue
  • CSV export — wire Export button in all.tsx to existing exportInvoiceToCSV() · needs issue
  • Bulk invoice generation from FeeAssignment records for a class / year · needs issue
  • Wire postInvoicePayment to the ledger (today: zero callers) · needs issue
  • Migrate InvoiceSchemaZod consumers to createInvoiceSchema(dictionary) (6 files) · needs issue
  • Migrate onboardingSchema consumers to createOnboardingSchema(dictionary) (2 files) · needs issue
  • Recurring-invoice scheduling (data model already in util.ts.calculatePaymentSchedule) · needs issue
  • Invoice duplication (clone existing) · needs issue
  • Invoice preview before email send · needs issue
  • Public share-link generation · needs issue
  • Localize page metadata — generateMetadata needs a locale arg (titles like "Fees & Penalties" still English) · needs issue
  • E2E tests for the full invoice workflow · needs issue
  • Component tests for form.tsx multi-step flow · needs issue
  • Audit logging for invoice mutations · needs issue
  • Rate limiting on sendInvoiceEmail · needs issue

Reminders & dunning

Today: WhatsApp reminder hooks exist in src/lib/whatsapp/ but aren't scheduled; the invoice backlog has email-reminder automation flagged as still-todo. Production dunning needs all three channels (email, WhatsApp, in-app) with policy + schedule + locale-aware templates.

  • Reminder-policy schema: days-before-due, days-after-due, escalation tiers (per school) · needs issue
  • Reminder cron — daily sweep over overdue invoices + unpaid fee assignments, dispatch per policy · needs issue
  • Email reminder templates (AR + EN) via getDictionary(school.preferredLanguage) · needs issue
  • WhatsApp reminder dispatch through the Evolution-API bridge (cross-link Epic 06) · needs issue
  • In-app reminder notification on overdue invoices · needs issue
  • In-app notification on invoice creation (recipient-side) · needs issue
  • In-app notification on payment received · needs issue
  • Reminder log + delivery tracking (open / click via Resend webhooks) · needs issue
  • Per-guardian quiet hours + opt-out switch · needs issue
  • Snooze-reminder action on the invoice / fee-assignment detail page · needs issue
  • Reminder analytics — open-rate, payment-after-reminder lift · needs issue

Salary · 75%

finance-salary

Structures, allowances, deductions, calculator. Creating a new structure deactivates the prior one — there is no history yet.

  • Salary-revision approval workflow · needs issue
  • Salary history — track structure changes per staff over time · needs issue
  • Pay-scale management UI · needs issue
  • Dedicated salary-structure form component (today: inline in content.tsx) · needs issue
  • lang field on salary-component names (allowance / deduction types) for AR display · needs issue
  • Test coverage for compensation-calculator edge cases (mid-cycle changes, prorations) · needs issue

Payroll · 65%

finance-payroll

Run processing, payslip generation, approval → disbursement. Tax is hardcoded flat 15% at actions.ts:286; the progressive brackets in config.ts are unused. No payslip PDF yet.

  • Replace flat 15% tax with the progressive brackets already in config.ts · needs issue
  • Social-security rate calculation from config.ts constants · needs issue
  • Payslip PDF generation (mirror the invoice PDF pattern) · needs issue
  • Build dedicated table.tsx / columns.tsx / form.tsx — UI is all in content.tsx today · needs issue
  • ✅ Wire postSalaryPayment to the ledger on disbursement — done 2026-06-21 (salary posting rule rebalanced + wired in processPayments; all 6 posters now wired)
  • W-2 / per-country compliance reports · needs issue
  • Test coverage for the payroll-run lifecycle (draft → approved → disbursed → posted) · needs issue
  • Bulk-payslip email dispatch on disbursement · needs issue
  • Bank-transfer file export (per-country format — SWIFT, local clearing) · needs issue

Accounts & ledger · 75%

finance-accounts

Chart of accounts + the double-entry engine. Only postFeePayment reaches the ledger today; the other 5 posting functions are tracked in their consuming sub-blocks above.

  • lang field on ChartOfAccount so account names work with getDisplayText() · needs issue
  • Journal-entry audit-trail UI · needs issue
  • Trial-balance + balance-sheet generation from the ledger · needs issue
  • Period close (lock prior period, block back-posting) · needs issue
  • Manual journal-entry form for accountants (debit / credit with balance assertion) · needs issue
  • Validation migration + test coverage (today: 10 tests, partial) · needs issue

Banking & reconciliation · 80%

finance-banking

  • Bank-statement import (CSV / OFX / camt.053) · needs issue
  • Auto-match imported transactions to ledger entries · needs issue
  • Reconciliation report (matched / unmatched / disputed) · needs issue
  • Multi-bank-account support per school · needs issue
  • Migrate banking validation strings to the dictionary · needs issue

Wallet · 75%

finance-wallet

  • Make the wired postWalletTopup ledger post transactional with rollback (today: fire-and-forget) · needs issue
  • Wallet-to-wallet transfer (parent → child) · needs issue
  • Wallet auto-top-up rules · needs issue
  • Transaction-history export per wallet · needs issue
  • Validation migration + test coverage (today: zero tests) · needs issue

Expenses · 80%

finance-expenses

  • Wire postExpensePayment to the ledger (today: orphaned) · needs issue
  • lang field on ExpenseCategory so names use getDisplayText() · needs issue
  • Multi-level approval workflow · needs issue
  • Receipt-upload + OCR amount-capture · needs issue
  • Validation migration + test coverage · needs issue

Budget · 85%

finance-budget

  • Variance report (budget vs. actual, with per-category drill-down) · needs issue
  • Multi-year budget rollover · needs issue
  • Department-level budgets · needs issue
  • Test coverage (today: zero tests) · needs issue

Receipt · 85%

finance-receipt

  • Receipt-template editor (per-school branded receipts) · needs issue
  • Email + WhatsApp delivery on payment · needs issue
  • Bulk re-print of historical receipts · needs issue
  • Test coverage (today: zero tests) · needs issue

Reports · 75%

finance-reports

  • Replace dashboard mock trends with real ledger reads · needs issue
  • Revenue report — collected vs. due, per period, per fee category · needs issue
  • Outstanding-fees report with aging buckets (0–30 / 31–60 / 61–90 / 90+) · needs issue
  • Collection-rate report per class / grade / homeroom · needs issue
  • Payment-method breakdown (cash / Stripe / wallet / bank transfer) · needs issue
  • Cash-flow forecast based on FeeAssignment due dates · needs issue
  • PDF + CSV export on every report · needs issue
  • Validation migration · needs issue

Timesheet · 75%

finance-timesheet

  • Approval workflow — staff submit → manager approve → payroll consumes · needs issue
  • Geofencing on clock-in (per-school location boundary) · needs issue
  • Mobile clock-in via iOS / Android (cross-link Epic 09) · needs issue
  • Validation migration · needs issue
  • Test coverage · needs issue

Permissions · 75%

finance-permissions

  • Audit log of permission changes per FinancePermission row · needs issue
  • Bulk-assign permissions by role template · needs issue
  • Validation migration · needs issue
  • Test coverage · needs issue

Dashboard · 80%

finance-dashboard

  • Replace mock trends with real ledger reads · needs issue
  • Per-role default landing widgets · needs issue
  • Configurable widget set per school · needs issue
  • Test coverage · needs issue

Cross-cutting hardening

  • Add lang field across every finance Prisma model (Fine, Scholarship, ExpenseCategory, ChartOfAccount, FeeStructure) — unblocks getDisplayText() everywhere · needs issue
  • Migrate validation.ts to ValidationHelper across the 11 remaining sub-modules · needs issue
  • E2E happy path: fee → invoice → pay → receipt → ledger entry · needs issue
  • E2E happy path: salary → timesheet → payroll-run → payslip → disbursement → ledger entry · needs issue
  • ✅ Per-school currency on School model + propagate to invoices, salary, payroll — #305 (closed 2026-05-26; School.currency + currency snapshots on FeeStructure/FeeAssignment/Payment/Receipt)
  • ✅ Currency selector in school settings — landed in the onboarding form + price step with MENA currencies (61c2f470a)
  • Field-level encryption for sensitive financial data · needs issue

Payment gateways

  • ✅ Payment-umbrella P0 — gateway abstraction — #263 (closed 2026-05-30): src/lib/payment/provider.ts registry behind one PaymentProvider interface, 6 providers (stripe, tap, bank-transfer, bankak, cash, mobile-money)
  • ✅ Auto-provision default fee structures on school create — #264 (closed 2026-05-30): completeOnboarding() + repairProvisioning(), PricingRule model added
  • Fee-structure preview screen at onboarding — #269
  • Playwright the fee-lifecycle happy path (create → invoice → pay → receipt) · needs issue — the manual QA walkthrough #273 closed 2026-06-02, but no automated spec exists yet (e2e/lifecycle stops at 06-attendance)
  • Apple Pay on the mobile gateway (cross-link Epic 09) · needs issue
  • Local MENA gateway integrations — Tap is live (src/lib/payment/providers/tap.ts, with MADA/KNET); HyperPay / Moyasar still · needs issue
  • Webhook idempotency hardening — partially done at the data layer (@@unique([schoolId, transactionId]) on Payment, idempotent createJournalEntry, per-tenant journal numbering); finish the remaining providers · needs issue

02 — Admission · Tech · Built+Polish

admission · Epic hogwarts#314

Kill the onboarding friction the pilot reported first-hand — make a few users love you. The friction sweep is done; the epic moved into the admission↔finance integration.

  • ✅ Walk #298–307 and fix each pilot-reported friction one PR at a time — all closed (last #306 on 2026-06-05); OTP/onboarding fixes shipped (incl. #332 MENA currencies)
  • ✅ Resolve the #254 blocker — #254 (closed 2026-05-29)
  • ✅ Compute the merit score from the application form + section-placement UI on enrollment — shipped via the production-ready admission+application flow with full finance wiring (9db3523c0)
  • Tick or close the #314 epic — every child issue is closed but its checklist boxes are still unchecked · needs cleanup
  • Re-test the full admission flow on staging after the friction fixes land

03 — Exams & grading · Tech · Built+Polish

exams · Epic hogwarts#321

Production audit: 9 P0 / 22 P1 / 18 P2 (was 14 P0 — Phase-1 correctness fixes applied, ~70% complete per the block's PRODUCTION-AUDIT.md). Grade-certificates shipped prod-ready alongside (public verify at /certificate/[shareToken], favorite template, auto-generate + PDF cron, ~215 tests); an exam-reminders cron landed too.

  • ✅ Fix the User.id-as-Student.id submission bug — fixed 2026-05-08, now transactional
  • ✅ Replace the in-memory rate limiter — fixed with distributed Redis + in-memory fallback
  • ✅ RBAC test coverage on the grade-entry endpoints — #342 merged 2026-05-26
  • ✅ Unit tests for the grade calculator edge cases — #334 merged 2026-05-26 (22 fns, 61 cases)
  • Add bilingual / lang fields to the exam + qbank content models still missing them (school-exam.prisma, school-qbank.prisma) — remaining audit P0 · #321
  • Reconcile the two parallel writable result models (Result & ExamResult) on one exam — remaining audit P0 · #321
  • Tighten the Class → SchoolExam → ExamResult → ExamCertificate all-Cascade delete chain — remaining audit P0 · #321
  • Fix the ExamResult.marksObtained Int vs MarkingResult.pointsAwarded Decimal(5,2) mismatch — remaining audit P0 · #321

04 — Attendance · Tech · Built+Polish

attendance

The section-centric migration is deployed and DB-migrated — sectionId is now the primary reference (b2272a146, b741e8ea1), threaded through bulk / manual / analytics / period marking with new hot-path indexes. Timetable is now production-ready in its own right (section-first slot lifecycle, student visibility, classId retirement, cross-tenant fixes, atomic transactions — merged to main). What's left is live e2e coverage: the Playwright specs were authored and merged but every test is test.skipd on a dev-environment "Protocol mismatch", so the harness exists but does not yet run.

  • Resolve the dev-environment "Protocol mismatch" that test.skips every attendance e2e spec (admin-marks-manual, overview-rbac, student-views-records, compliance-settings, 06-attendance) · needs issue
  • Add a true section-grid Playwright case (the current specs cover generic manual-marking + RBAC, none target the section grid by name) · needs issue
  • Polish any rough edges the QA pass surfaces · needs issue per finding

05 — LMS / Stream · Tech · Built+Polish

catalog · Epic hogwarts#323

The school-scoped LMS is shipped — courses, chapters, lessons, enrollment, completion certificates, per-school storage quota. "ClickView" terminology has been retired repo-wide (the surface is now the catalog/stream block; clickview* columns renamed to subjectGroupId/sourceUrl/coverId). The asset wave terminated on our own CDN and quota enforcement is live; what's left is content uploads + the admin meter.

  • ✅ Finish the ClickView CDN asset-download wave — done: curriculum/concept art now resolves from cdn.databayt.org; the only residual gap is external content uploads (real mp4s, textbook PDFs, book covers — AWS-creds-gated) · #323
  • ✅ Verify per-school storage quota enforcement (videoStorageUsedBytes / videoStorageQuotaBytes) — checkSchoolVideoQuota wired + tested (ba2945277)
  • Storage quota indicator in the school admin surface · needs issue

06 — Communication / Messaging · Tech · Built+Polish

messages · Epic hogwarts#324

Announcements, in-app + email notifications, and the messaging / Socket.io + WhatsApp Evolution code are all shipped (incl. group delivery, FTS message search, webhook hardening). Push is scaffolded only (FCM-creds-gated — push-fcm.ts throws until firebase-admin is installed). The real-time + WhatsApp surface is code-ready but ops-gated on the Oracle Always-Free VM (DNS + TLS + per-school QR + Vercel prod secrets). What's left is that activation + handover.

  • ✅ WhatsApp Evolution-API retry + exponential backoff — done: 5-attempt backoff (5m base, ×2) + dead-letter marker in lib/whatsapp/dispatch.ts
  • Stand up the Oracle VM activation path (socket-server + Evolution API v2.1.1 + Postgres + Redis compose, multi-tenant CORS) — the true blocker · needs issue
  • Scheduled-notification cron delivery test — in-app + email cron + test landed (bc0c2f86a); push still pending FCM creds · needs issue
  • Demo the announcement + messaging surfaces to the pilot and capture feedback · needs issue
  • One-page user guide for school admins on broadcasts vs. direct messages · needs issue

06b — Transportation · Tech · Built+Polish

transportation

Fleet management shipped (merged to main, 63316257c) — vehicles, routes, stops, drivers, student-route assignments, trips with a state machine, geofence-boarding webhook, transportation fees, reports, and a parent/driver me surface. The Phase 2–5 advanced upgrade then shipped 2026-06-20 (febb7da3b): Mapbox + Haversine route optimization, per-student transport profiles, bell-time ETAs, guardian skip-pickup + approvals, live GPS tracking (driver + guardian maps + location ingest), road hazards, and 2 new crons. Multi-tenant (schoolId on every model), 331 tests, hardened across 6 security dimensions (IDOR, trip-strand recovery, CSV-injection guard, webhook rate-limit). Additive DB landed on Neon prod at deploy.

  • Open a master tracker issue (the block currently has none) · needs issue
  • Set MAPBOX_SERVER_TOKEN for paid traffic-aware ETA tiers (Haversine fallback works without it) · needs issue
  • Mobile / driver clock-in surface (cross-link Epic 09/10) · needs issue
  • Weather-aware routing (designed, needs OPENWEATHER_API_KEY) · deferred
  • Long-tail polish from a QA pass · needs issue per finding

07 — Role-aware UI sweep · Tech · Built+Polish

Sidebar / PageNav / Toolbar / row-action gating across the school dashboard. Backed by src/lib/rbac/ui-permissions.ts + per-block permissions.ts (finance, sales, admission, exams, school, attendance, timetable, conference, notifications).

  • ✅ Gate the finance surfaces against permissions.ts — 12+ finance route layouts use FINANCE_VIEW_ROLES / getFinanceRootTabs
  • ✅ Gate the school-settings surfaces against permissions.tsschool/layout.tsxgetTabsForRole
  • ✅ Gate the sales surfaces against permissions.tssales/layout.tsxgetTabsForRole
  • ✅ Role-matrix test: log in as each role — #342 merged 2026-05-26
  • Extend gating to any remaining surfaces a role-matrix screenshot pass flags · needs issue per finding

08 — Internationalization & translation · Tech · Built+Polish

translation

Infrastructure is shipped and hardened — two-tier system (per-feature ar/en dictionaries for static UI; the batched localize() engine — LRU → Translation table → Google Translate, with prewarm-on-write — for dynamic content, replacing the old per-row getDisplayText() N+1s). Drift can no longer ship: en/ar key parity, untranslated placeholders, hardcoded-string ratchets, and RTL physical-class counts are all gated in pnpm test + CI. The work left is the long-tail hardcoded-string sweep (ratchet baselines) and a 3rd-language readiness plan.

Infra hardening

  • ✅ Audit locale routing for edge cases (middleware redirects, RSC streaming, dynamic segments) — middleware.test.ts merged, ambient x-locale resolution shipped, #261 closed
  • ✅ Document the dictionary contract so contributors can add strings safely — translation-guide.mdx (en+ar): generic field naming, parity gate, pnpm i18n:fix scaffold
  • Translator workflow doc: how a non-developer proposes string changes (issue → PR with a dictionary patch) — In Progress: contract + tooling documented; the non-developer issue→PR prose is still unwritten
  • ✅ Tooling: a script that flags missing AR keys when EN is touched (and vice versa) — dev-i18n-sync.ts (--check/--fix/--verify) + dictionary-parity.test.ts CI gate, #343 closed
  • ✅ RTL framework polish — repo-wide RTL ratchet at ZERO physical classes (rtl-physical-class.test.ts); per-page visual passes under #326
  • Plan a 3rd-language readiness pass (e.g., French for Maghreb / Urdu for South Asia) — no commitment, just a gap-list · needs discussion

String sweepEpic hogwarts#326 (owner Samia)

  • ✅ Sweep the finance pages for hardcoded English — finance dictionary wired (en/ar), Tier-1 routes incl. receipt/manage-plan fixed
  • ✅ Sweep the admission pages for hardcoded English — admission + listings covered per AUDIT.md
  • ✅ Sweep the LMS pages for hardcoded English — stream/LMS dictionary-wired (teacher dashboard, lesson-player, batched localize)
  • ✅ Sweep the messaging pages for hardcoded English — messaging dictionary-wired (error codes, mobile previews, RTL-verified)
  • RTL visual pass on each swept page (Arabic side-by-side with English) — under #326
  • Add Arabic equivalents for any T1–T19 outreach templates still English-only — In Progress: whatsapp/sales dictionaries exist; T1–T19 Arabic equivalence is part of #326 exit criteria · cross-link to Epic 16

09 — Mobile API Layer · Tech · Built+Polish

Epic hogwarts#315

The backend API layer the iOS + Android apps consume — 95 /api/mobile/* routes are shipped on main. Shares the finance domain (payments + invoices) with Bet 1. Scope change (2026-06-03): the entire store-gate compliance suite (account export/delete, consent, mobile invoices, universal search) was closed NOT_PLANNED — it no longer blocks App Store submission and is removed from the plan below.

  • ✅ Auth, dashboard, attendance, grades, fees (read), exams, report-cards, conversations, guardian-children, teacher schedule, admin — all on main
  • ✅ Grade-entry + online-exam + teacher-attendance write endpoints — POST .../teacher/classes/:id/{grades,attendance}, POST .../exams/:id/answers, GET .../report-cards all on main (issues #282/#283 still OPEN despite shipped code — close them)
  • Apple Pay + Stripe payment endpoint (store-gate) — the genuine remaining work · needs issue
  • Guardian write-action endpoints · needs issue
  • Account export/delete, consent capture, invoice list, universal searchdescoped NOT_PLANNED 2026-06-03 (#274/#275/#278/#279/#288)

10 — iOS app · Tech · Built (stalled — last commit 2026-02-10)

swift-app#3

Ship the Hogwarts app to the public App Store. The app is well past skeleton — 99 Swift files across 9 feature modules (Sprint-1..7 + Phase 1–6, offline-first, CI, privacy manifest, TestFlight distribution) — but no commits since 2026-02-10, so this is built-but-stalled, not actively progressing.

  • ✅ App shell + bottom navigation (TabView in app/hogwarts-app.swift)
  • ✅ Auth + dashboard + attendance + grades + profile + timetable + messages screens consuming the API layer
  • Fees screen consuming the API layer · Vaporware — not built yet
  • Privacy + account export/delete + consent screens for store reviewblocked / descoped: backing endpoints cut NOT_PLANNED (Epic 09)
  • App Store submission package + first review reply — In Progress: TestFlight distribution set up; public submission remains · needs issue

11 — Android app · Tech · Vaporware

⚠️ The Android repo databayt/kotlin-app does not exist yet — create and push it first.

  • Create databayt/kotlin-app with the standard databayt repo template · needs issue
  • Kotlin app shell + navigation · needs issue
  • Auth + dashboard screens (Kotlin) on the API layer · needs issue
  • Attendance + fees screens (Kotlin) on the API layer · needs issue
  • Play Store compliance screens (privacy, export/delete, consent) · needs issue
  • Play Store submission package + first review reply · needs issue

12 — Sales & Pilots · Non-tech · Built+Polish

Sales · Pilot · Epic hogwarts#316

Two free MENA-10 pilots — King Fahad (Sudan, 3 branches, Sept 2026 go-live) and Albayan (البيان · Khartoum · onboarded 2026-06-03 · albayan.databayt.org) — being driven to actively use finance + mobile, toward a documented PMF signal that feeds the Q4 cash decision. The track's tooling is built; the #316 workstreams (re-engagement, usage tracking, PMF write-up) are still open. The team's own network is the top of the funnel — start with Everyone: the warm-intro list above.

  • Send the King Fahad re-engagement message and book a call · needs issue
  • Run the King Fahad JTBD interview and write up the notes · needs issue
  • Build a 3–5 school pipeline of warm-intro candidates from the Network filter · needs issue
  • ✅ Source + onboard the 2nd free pilot — Albayan onboarded 2026-06-03 (live on main: US curriculum + timetable seeds + sidebar gating + live classes)
  • First-touch WhatsApp message to each Tier-A candidate (Outreach T20 template)
  • Discovery call with one new school + onboarding kickoff
  • Wire usage tracking on both pilots (login frequency, feature touches) · needs issue
  • PMF write-up + case-study draft → Q4 cash brief · needs issue
  • Hold the weekly cadence — warm prospects, outreach, discovery calls (see Sales)

13 — Fundraising · Non-tech · In Progress

Get support

Non-dilutive first — vendor credits and grants before any equity. We're in Phase 2 (MENA-10 conversion): zero-equity accelerators plus a SAFE-cap only after the non-dilutive routes. See Cash and runway below.

  • Claim Microsoft for Startups credits · needs issue
  • Claim Google for Startups credits · needs issue
  • Claim AWS Activate credits · needs issue
  • Claim Anthropic startup credits · needs issue
  • Claim OpenAI startup credits · needs issue
  • Claim GitHub for Startups credits · needs issue
  • Claim Vercel for Startups credits · needs issue
  • Draft + submit the NTDP grant application · needs issue
  • Draft + submit the Mastercard Foundation EdTech grant · needs issue
  • Draft + submit the UNESCO Sudan TEP grant · needs issue
  • Apply to Sanabil 500 (zero-equity track) · needs issue
  • Apply to Misk500 · needs issue
  • Apply to Orange Corners · needs issue
  • Apply to MSAR incubator · needs issue

14 — Content & Marketing · Non-tech · In Progress

The creative that unblocks every sales conversation downstream. The pipeline runs brainstorm → decide → produce → publish — pick from whichever stage matches your interest. Brand-curious folks start at the top, video editors and designers land in the middle, distribution-minded folks finish it.

Brainstorm & references

Gather inspiration first. Output of each task is a short doc / Notion / GitHub Discussion that the production tasks downstream can lean on.

  • Demo-video moodboard: 5 inspiration links (Linear, Notion, Vercel, plus 2 EdTech — ClassDojo, Brightwheel) with a one-line note on what each does well · needs discussion
  • Screenshot-pack moodboard: how Linear, Vercel, and Notion frame product shots (light/dark, device chrome vs. raw, gradients vs. flat) · needs discussion
  • Tagline brainstorm: 10 English + 10 Arabic candidates with rationale; thread becomes the shortlist for the "lock the tagline" tasks below · needs discussion
  • Brand-voice doc: "How does Hogwarts sound?" — concise, builder-y, Arabic-first warm; 6–8 dos / don'ts with sample lines · needs discussion
  • Case-study layout references: pull Stripe customer stories, Plaid, Ramp — note structure (hero metric → quote → before/after → call to action) · needs discussion

Decide the toolkit

Each item below is a Discussion thread. Whoever claims it lists 3+ candidates with cost, Arabic support, and a single recommendation; the thread closes with the team's call.

  • AI video toolkit selection: evaluate Runway, Pika, Sora, Veo, Synthesia, HeyGen — Arabic-voiceover support is a hard constraint · needs discussion
  • Build vs. buy: Envato Elements / Motion Array / Storyblocks template subscription vs. starting in Adobe Premiere from scratch — compare cost, time-to-first-cut, and how much each locks our look · needs discussion
  • Outsource path: brief two MENA freelance editors on Upwork / Khamsat with the moodboard, collect quotes + sample reels, compare against the in-house path · needs discussion
  • AI image stack for hero art + social cards: Midjourney vs. Ideogram vs. Recraft vs. Flux — pick one for the quarter · needs discussion
  • B-roll & motion source: Pexels vs. Coverr vs. Envato Elements (free vs. paid trade-offs) · needs discussion
  • Voiceover: ElevenLabs Arabic vs. native VO talent on Khamsat — sample both, compare on dialect + warmth · needs discussion

Produce

Once decisions land above, this is the actual making. Production tasks reference the toolkit thread so the picker inherits the decision.

  • Publish the King Fahad case study with real numbers and real screenshots · needs issue
  • 2-minute demo video script (English) · blocked until the video-toolkit + brand-voice threads land · needs issue
  • Arabic adaptation of the demo script (not a literal translation — adapt for warmth) · needs issue
  • Record the voiceover (English + Arabic) using the chosen VO path · needs issue
  • Edit + publish the demo video using the chosen toolkit / template / editor · needs issue
  • Screenshot pack — light theme, English · needs issue
  • Screenshot pack — light theme, Arabic · needs issue
  • Screenshot pack — dark theme, English + Arabic · needs issue
  • Hero illustrations + social cards using the chosen AI image stack · needs issue
  • Lock the English tagline from the brainstorm shortlist (3 finalists → pick one) · needs issue
  • Lock the Arabic tagline from the brainstorm shortlist (3 finalists → pick one) · needs issue

Publish & distribute

The artifacts only matter once they're in front of someone. These are the last-mile tasks.

  • Publish the case study on the marketing site (English + Arabic) · needs issue
  • Cut a 30-second social version of the demo (vertical for Instagram / TikTok / Reels) · needs issue
  • Update the hogwarts + kun READMEs with the new screenshots and tagline · needs issue
  • Schedule the Arabic + English social rollout (X, LinkedIn, WhatsApp Status) · needs issue
  • Drop the demo + screenshots into the sales deck and re-export · needs issue

15 — Global Catalog · Tech · Built+Polish

catalog

A platform-wide content catalog — curriculums, subjects, chapters, lessons, videos, textbooks, mock exams, qbanks — that any school can bridge into its own data. This shipped to main this quarter (post-dating the last sprint reconcile): the global catalog_* tables (no schoolId), the school_* bridge rows, 12 seeded curricula, the operator + school bridge UI, a proposal→approval governance layer, and the public community surface are all wired in production (catalog.mdx self-reports "Wired — production"). Strong upstream of Epic 17 (Community), which now exposes the catalog free to the public.

Schema & data model

  • ✅ Global catalog Prisma schema — Curriculum, Subject, Chapter, Lesson + Resource models (Video, Material, Question/qbank, Book/Textbook); catalog_* tables carry no schoolId (platform-scoped), school_* bridges carry it (migration 20250814_add_catalog_system)
  • ✅ Bridging model — a school links a grade/stream to a catalog Subject and inherits the tree (SubjectSelection + ContentOverride / InstructorPreference / BookSelection; toggleSubjectSelection / bulkSelectSubjects actions)
  • Migration plan: re-attach the King Fahad pilot's per-school content where it overlaps the platform catalog — In Progress (general bridge re-attach + backfill script exist; the King-Fahad-specific overlap migration is not separately evidenced) · needs issue

Content seed

  • ✅ Seed the Sudan national curriculum — full subjects + chapters + lessons tree (sd.ts, the authoritative seed)
  • ✅ Seed the Saudi curriculum — subjects-only (sa.ts); chapter/lesson tree still to author · needs issue
  • ✅ Seed the IGCSE / IB skeleton — IGCSE (caie-igcse.ts) + IB-DP (ib.ts); 12 curricula total (also AE, CBSE, EG, GB, JO, KW, QA, US)
  • Source the first mock-exam pack (Arabic — math, Arabic, science — grades 6–9) — exam templates seeded (exam-templates.ts: ExamBlueprint/ExamTemplate/PaperTemplate); a discrete Arabic grade-6–9 pack is not yet broken out · needs issue

UI to consume the catalog

  • ✅ Catalog browse + bridge UI — school side at /s/<subdomain>/subjects/catalog (subject picker, topic overrides, school customization) + an operator catalog dashboard at /catalog (subjects, books, materials, questions, approvals, analytics, proposals, assignments)
  • ✅ Lesson detail consuming Resource items (video / pdf / qbank) — via the stream/LMS lesson player
  • "Add to my class" — toggleSubjectSelection bridges at the grade/stream level today; an explicit per-lesson → section-timetable attach is the residual · needs issue

Ops

  • ✅ Storage strategy for catalog video/PDF — concept/curriculum art served from cdn.databayt.org (the clickview-keys asset wave); paid videos via signed CloudFront + null-URL gating
  • /docs/catalog page on hogwarts — shipped (en + ar): consolidated hub covering what it is, full schema (global + bridge), provisioning, proposal→approval, paid content; five older pages folded in with redirects

Beyond the original scope (also shipped)

  • Proposal → approval workflow — schools propose subjects/content, operator review queue, publish + notify + pinned picker
  • Per-curriculum academic provisioning (setupCatalogForSchool, infer + 4-step fallback + lazy self-heal) + a provisioning "doctor" that repairs partial provisioning
  • Mobile catalog API (/api/mobile/catalog/subjects) feeding the iOS app; a 12-test catalog suite

16 — Letters & Proposals · Non-tech · In Progress

Proposal · Outreach T1–T19

The templates library is mature. This epic is the specific drafts going out this quarter — each task names the target and the template it inherits from, so the work is fill-in-the-blanks, not write-from-scratch.

Schools (pilot conversion)

  • Draft the King Fahad paid-conversion proposal using the "paid-conversion" template · needs issue
  • Draft a free-pilot proposal (Arabic) for the next Tier-A warm-intro school · needs issue
  • Draft a multi-school bundle proposal for the Sudan diaspora school network · needs issue

Investors (Phase 2)

  • Investor letter for the Sanabil 500 application using T7 · needs issue
  • Investor letter for Misk500 using T7 · needs issue
  • Cold-investor letter (3 MENA-aware angels, T6 variant) · needs issue

Grants (non-dilutive)

Sibling to Epic 13 — there we apply; here we draft the narrative.

  • NTDP grant narrative draft (impact + budget + timeline) · needs issue
  • Mastercard Foundation EdTech narrative draft · needs issue
  • UNESCO Sudan TEP narrative draft · needs issue

Sponsors & ecosystem

  • Sponsor letter for one MENA EdTech NGO using T11 · needs issue
  • Press / advisor outreach using T15 to one MENA EdTech journalist · needs issue

Library maintenance

  • Arabic versions of any T1–T19 still English-only · cross-link to Epic 08 · needs issue

17 — Community · Non-tech · In Progress

community

Offer the Catalog content (textbooks, mock exams, qbanks) free at /en/community. Free users come for the content, talk about it, and the school version converts. The Epic 15 (Catalog) precondition is now met — schema + 12-curriculum seed are merged and a no-auth public browse hub already ships on main; remaining work is the dedicated readers/runners, the conversion funnel, and distribution.

Free-content surface

  • ✅ Public community browse UI (no auth) consuming the platform-scoped catalog — shipped on main: /[lang]/community hub + [slug] subject detail (MVP — public deep links into school-only routes still 404)
  • Free textbook reader (PDF + bookmarks) · needs issue
  • Free mock-exam runner (timed, no auth, share-result page) · needs issue
  • Free qbank practice mode (topic filter, immediate feedback) · needs issue

Conversion funnel

  • "Use this in your school" CTA on every public lesson/exam → routes to the pilot intake form · needs issue
  • Track community-→-school conversions in analytics (which free user converted which school) · needs issue
  • Onboarding email for free users who sign up (lightweight account, optional) · needs issue

Marketing & word of mouth

  • Shareable result cards for mock exams ("I scored 87% on the Grade 9 Math mock") — Arabic + English · needs issue
  • Brief one teacher influencer in Sudan + one in KSA on the free offering for a launch post · needs discussion
  • /docs/community doc on hogwarts: what's free, who's behind it, and the school product · needs issue

Open-source contributor lane

  • Publish CONTRIBUTING.md across hogwarts + kun (good-first-issue labels, dev-setup link) — ✅ done on hogwarts (CONTRIBUTING.md + content/docs-{en,ar}/contributing.mdx); kun side still · needs issue
  • Stand up a Discord or Slack as the chat home — pick one, link from /en/community · needs discussion
  • Monthly contributor spotlight on the marketing site · needs issue

Cash and runway

We do not monetize this quarter — that is a Q4 decision. The plan is to prove product-market fit on two free pilots first, then choose how to fund the next leg.

We're in Phase 2 (MENA-10 conversion) and raise non-dilutive first — vendor credits and grants before any equity instrument. A small SAFE-cap from MENA-aware investors comes only after the non-dilutive routes are exhausted; a priced seed waits for 10 paying schools and meaningful MRR.

Once PMF is proven, Q4 opens the cash decision — light monetization, a pre-seed bridge, a sponsored build, or cutting burn. The full instrument ladder, use-of-funds, and posture live in Get support.

Not built yet

ModuleStatusNotes
HealthSchema OnlyHealthRecord on the student profile, no clinic UI
HostelVaporwareDictionary mentions only
CafeteriaVaporwareDictionary mentions only

Native iOS / Android is Vaporware in the hogwarts roadmap (deferred to 2027+); we promote it to a Q3 bet as epics 09–11 above. The divergence is deliberate. The Global Catalog shipped to production this quarter — see Epic 15 above.

See also

  • hogwarts MVP — shipped state across 14 epics with maturity badges
  • hogwarts Roadmap — quarter outlook + active initiatives
  • hogwarts PRD — requirements, role model, NFRs
  • hogwarts Sales · Get support — the non-tech execution detail
  • kun Epics — the GitHub tracker map · Onboarding · Issue pipeline · master tracker kun#76