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 | bashWindows (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 doctor3. 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
| # | Epic | Track | Bet | Maturity | Detail |
|---|---|---|---|---|---|
| 01 | Finance & billing | Tech | 1 | Built+Polish | hogwarts#313 |
| 02 | Admission | Tech | 1 | Built+Polish | hogwarts#314 |
| 03 | Exams & grading | Tech | — | Built+Polish | exams |
| 04 | Attendance | Tech | — | Built+Polish | attendance |
| 05 | LMS / Stream | Tech | — | Built+Polish | catalog |
| 06 | Communication / Messaging | Tech | — | Built+Polish | messages |
| 06b | Transportation | Tech | — | Built+Polish | transportation |
| 07 | Role-aware UI sweep | Tech | — | Built+Polish | — |
| 08 | Internationalization & translation | Tech | — | Built+Polish | translation |
| 09 | Mobile API Layer | Tech | 2 | Built+Polish | hogwarts#315 |
| 10 | iOS app | Tech | 2 | Built (stalled) | swift-app#3 |
| 11 | Android app | Tech | 2 | Vaporware | kotlin-app (repo TBD) |
| 12 | Sales & Pilots | Non-tech | both | Built+Polish | hogwarts#316 |
| 13 | Fundraising | Non-tech | — | In Progress | fundraising |
| 14 | Content & Marketing | Non-tech | — | In Progress | — |
| 15 | Global Catalog | Tech | — | Built+Polish | catalog |
| 16 | Letters & Proposals | Non-tech | both | In Progress | proposal · outreach |
| 17 | Community | Non-tech | — | In Progress | community |
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.
| Week | Theme | Exit gate |
|---|---|---|
| 1 | Reachable & Truthful | Every shipped feature has a URL, CI runs e2e, prod has error visibility, DB confirmed |
| 2 | Money & Messaging | Every financial event posts a balanced ledger entry; real-time + WhatsApp live for all tenants |
| 3 | Conference & Proof | LiveKit live (network-test scheduled), e2e green in CI, Arabic RTL clean |
| 4 | Harden & Launch | Launch gate green for all three audiences |
Week 1 — Reachable & Truthful. Fix the Playwright CI command (playwright tests → playwright 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
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%
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.tstoValidationHelper· needs issue - Fee defaulters list · needs issue
- Add
langfield toFinesoreasoncan usegetDisplayText()· needs issue - Translate fine-type enum badges (
LATE FEE,DAMAGE FINE,LIBRARY FINE,DISCIPLINE FINE) on AR viadictionary.finance.fees.fineTypes.*· needs issue - Translate fines overview card titles (currently hardcoded English in
content.tsx) · needs issue - Installment-plan UI flow — schema
FeePaymentPlanexists, 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
postFeeAssignmentto 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%
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 PrismaUserInvoice→InvoiceData· 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.tsxto existingexportInvoiceToCSV()· needs issue - Bulk invoice generation from
FeeAssignmentrecords for a class / year · needs issue - Wire
postInvoicePaymentto the ledger (today: zero callers) · needs issue - Migrate
InvoiceSchemaZodconsumers tocreateInvoiceSchema(dictionary)(6 files) · needs issue - Migrate
onboardingSchemaconsumers tocreateOnboardingSchema(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 —
generateMetadataneeds alocalearg (titles like "Fees & Penalties" still English) · needs issue - E2E tests for the full invoice workflow · needs issue
- Component tests for
form.tsxmulti-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%
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 langfield 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%
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.tsconstants · needs issue - Payslip PDF generation (mirror the invoice PDF pattern) · needs issue
- Build dedicated
table.tsx/columns.tsx/form.tsx— UI is all incontent.tsxtoday · needs issue - ✅ Wire
postSalaryPaymentto the ledger on disbursement — done 2026-06-21 (salary posting rule rebalanced + wired inprocessPayments; 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%
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.
langfield onChartOfAccountso account names work withgetDisplayText()· 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%
- 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%
- Make the wired
postWalletTopupledger 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%
- Wire
postExpensePaymentto the ledger (today: orphaned) · needs issue langfield onExpenseCategoryso names usegetDisplayText()· needs issue- Multi-level approval workflow · needs issue
- Receipt-upload + OCR amount-capture · needs issue
- Validation migration + test coverage · needs issue
Budget · 85%
- 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%
- 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%
- 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
FeeAssignmentdue dates · needs issue - PDF + CSV export on every report · needs issue
- Validation migration · needs issue
Timesheet · 75%
- 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%
- Audit log of permission changes per
FinancePermissionrow · needs issue - Bulk-assign permissions by role template · needs issue
- Validation migration · needs issue
- Test coverage · needs issue
Dashboard · 80%
- 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
langfield across every finance Prisma model (Fine,Scholarship,ExpenseCategory,ChartOfAccount,FeeStructure) — unblocksgetDisplayText()everywhere · needs issue - Migrate
validation.tstoValidationHelperacross 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
Schoolmodel + 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.tsregistry behind onePaymentProviderinterface, 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(),PricingRulemodel 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/lifecyclestops at06-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])onPayment, idempotentcreateJournalEntry, per-tenant journal numbering); finish the remaining providers · needs issue
02 — Admission · Tech · Built+Polish
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
#254blocker — #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
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.idsubmission 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 /
langfields 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 → ExamCertificateall-Cascadedelete chain — remaining audit P0 · #321 - Fix the
ExamResult.marksObtained IntvsMarkingResult.pointsAwarded Decimal(5,2)mismatch — remaining audit P0 · #321
04 — Attendance · Tech · Built+Polish
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
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) —checkSchoolVideoQuotawired + tested (ba2945277) - Storage quota indicator in the school admin surface · needs issue
06 — Communication / Messaging · Tech · Built+Polish
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
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_TOKENfor 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 useFINANCE_VIEW_ROLES/getFinanceRootTabs - ✅ Gate the school-settings surfaces against
permissions.ts—school/layout.tsx→getTabsForRole - ✅ Gate the sales surfaces against
permissions.ts—sales/layout.tsx→getTabsForRole - ✅ 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
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.tsmerged, ambientx-localeresolution 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:fixscaffold - 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.tsCI 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 sweep — Epic 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
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-cardsall 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 search— descopedNOT_PLANNED2026-06-03 (#274/#275/#278/#279/#288)
10 — iOS app · Tech · Built (stalled — last commit 2026-02-10)
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 (
TabViewinapp/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 review— blocked / descoped: backing endpoints cutNOT_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-appdoes not exist yet — create and push it first.
- Create
databayt/kotlin-appwith 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
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
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 noschoolId(platform-scoped),school_*bridges carry it (migration20250814_add_catalog_system) - ✅ Bridging model — a school links a grade/stream to a catalog
Subjectand inherits the tree (SubjectSelection+ContentOverride/InstructorPreference/BookSelection;toggleSubjectSelection/bulkSelectSubjectsactions) - 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" —
toggleSubjectSelectionbridges 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/catalogpage 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
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
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]/communityhub +[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/communitydoc on hogwarts: what's free, who's behind it, and the school product · needs issue
Open-source contributor lane
- Publish
CONTRIBUTING.mdacross 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
| Module | Status | Notes |
|---|---|---|
| Health | Schema Only | HealthRecord on the student profile, no clinic UI |
| Hostel | Vaporware | Dictionary mentions only |
| Cafeteria | Vaporware | Dictionary 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
On This Page
Everyone: the warm-intro listGet your machine readyPick a taskEpics at a glanceLaunch sprint (4 weeks)Epics01 — Finance & billing · Tech ·Built+PolishFees · 85%Invoice · 90%Reminders & dunningSalary · 75%Payroll · 65%Accounts & ledger · 75%Banking & reconciliation · 80%Wallet · 75%Expenses · 80%Budget · 85%Receipt · 85%Reports · 75%Timesheet · 75%Permissions · 75%Dashboard · 80%Cross-cutting hardeningPayment gateways02 — Admission · Tech · Built+Polish03 — Exams & grading · Tech · Built+Polish04 — Attendance · Tech · Built+Polish05 — LMS / Stream · Tech · Built+Polish06 — Communication / Messaging · Tech · Built+Polish06b — Transportation · Tech · Built+Polish07 — Role-aware UI sweep · Tech · Built+Polish08 — Internationalization & translation · Tech · Built+Polish09 — Mobile API Layer · Tech · Built+Polish10 — iOS app · Tech · Built (stalled — last commit 2026-02-10)11 — Android app · Tech · Vaporware12 — Sales & Pilots · Non-tech · Built+Polish13 — Fundraising · Non-tech · In Progress14 — Content & Marketing · Non-tech · In ProgressBrainstorm & referencesDecide the toolkitProducePublish & distribute15 — Global Catalog · Tech · Built+PolishSchema & data modelContent seedUI to consume the catalogOpsBeyond the original scope (also shipped)16 — Letters & Proposals · Non-tech · In ProgressSchools (pilot conversion)Investors (Phase 2)Grants (non-dilutive)Sponsors & ecosystemLibrary maintenance17 — Community · Non-tech · In ProgressFree-content surfaceConversion funnelMarketing & word of mouthOpen-source contributor laneCash and runwayNot built yetSee also