Created: July 29, 2026
Branch: feature/security-and-features-overhaul
Status: Ready for Implementation
This branch contains a comprehensive security hardening and feature enhancement initiative spanning 4 epics with ~50+ implementation tasks. All work is designed to be non-breaking, well-tested, and production-safe with phased rollout capabilities.
Risk: Compromised admin JWT = full access to escrow refunds, dispute resolution, user deletion without 2FA
Solution: Mandatory MFA for admins + fresh TOTP verification for sensitive operations
Key Files:
src/middleware/require-mfa.middleware.ts- Enforce MFA enabled for adminssrc/middleware/step-up-auth.middleware.ts- Verify fresh TOTP for high-value opssrc/services/admin.service.ts- Gating for sensitive operationssrc/routes/admin.routes.ts- Apply MFA middleware to admin endpointsdatabase/migrations/XXX_admin_mfa_enforcement.sql- Redis-backed lockout tracking
Acceptance Criteria:
- ✅ Admin without MFA → HTTP 403 on all admin routes
- ✅ Step-up without code → HTTP 428
- ✅ Invalid code → HTTP 401
- ✅ 5 failures in 5 min → 15-min lockout (HTTP 429)
- ✅ Grace period: MFA verified < 5 min → skip step-up
Deliverables: 2 middleware, 3 service updates, migration, documentation
Risk: 30s restart = 10–50 missed payment events; bookings stuck in pending
Solution: Persist cursor, handle outages, bulk recovery, automatic reconnection
Key Files:
src/utils/stellar-cursor.utils.ts- Persist/load cursor from Redissrc/services/stellar.service.ts- Add transaction history fetchingsrc/services/stellar-stream.service.ts- Rewrite with reconnection logicsrc/jobs/stellar-polling.job.ts- Fallback polling if stream fails 10xsrc/metrics/stellar-metrics.ts- Prometheus counters & gaugestests/e2e/stellar-resilience.e2e.test.ts- Chaos testing
Acceptance Criteria:
- ✅ After restart, stream resumes from last cursor
- ✅ Missed txs within 24h recovered retroactively
- ✅ Auto-reconnect within 60s (exponential backoff: 1s, 2s, 4s, max 60s)
- ✅ 10+ failed reconnects → polling mode
- ✅ No duplicate tx processing
- ✅ Health endpoint reports status accurately
Deliverables: 3 utilities, 2 service rewrites, 1 new job, metrics, tests, documentation
Risk: Circular dependencies (A→B→C→A) cause infinite loops → timeouts, CPU spikes
Solution: DAG implementation with Kahn's algorithm for cycle detection & topological sorting
Key Files:
src/utils/dag.utils.ts- Generic DAG with cycle detectionsrc/services/prerequisite-validator.service.ts- Rewrite with Kahn's algorithmsrc/services/learning-path.service.ts- Validate on prerequisite creationdatabase/migrations/XXX_learning_path_prerequisites_dag.sql- Adjacency tabletests/unit/prerequisite-validator.test.ts- Comprehensive cycle tests
Acceptance Criteria:
- ✅ Circular prerequisite → HTTP 422 with cycle path (e.g.,
[A, B, C, A]) - ✅ Topological sort correct for 50+ node DAG
- ✅ Ineligible enrollment → HTTP 403 with unmet prerequisites list
- ✅ Tree query < 200ms for 50-node DAG
- ✅ All cycle patterns handled: self-ref, 2-node, transitive
- ✅ Cache invalidates on graph mutation
Deliverables: 1 DAG utility, 2 service rewrites, migration, comprehensive tests
Problem: Mentors can't declare availability; booking assumes 24/7
Solution: Weekly availability slots with timezone support; calendar filtering
Key Files:
src/types/availability.types.ts- AvailabilitySlot interfacesrc/services/availability.service.ts- Availability logic & queriessrc/routes/mentors.routes.ts- Availability endpointssrc/services/bookings.service.ts- Integrate availability checkssrc/utils/timezone.utils.ts- Timezone conversion helperstests/unit/availability.service.test.ts- Timezone edge cases
Frontend Contract (Frontend repo):
- AvailabilityEditor component - 24-hour grid for weekly slots
- Calendar component enhancement - Show only available slots
- "Contact to schedule" message - If no availability set
Acceptance Criteria:
- ✅ Mentor sets availability via API
- ✅ Booking calendar shows only available slots
- ✅ Timezone conversion correct (Nigeria UTC+1 ↔ EST UTC-5)
- ✅ Mentors without availability show "Contact to schedule"
- ✅ Booking to unavailable slot → HTTP 409
- ✅ Available slots endpoint < 200ms for 7-day range
Deliverables: 1 type file, 2 services, 3 route updates, timezone utilities, frontend contract
| Phase | Week | Focus | Deliverables |
|---|---|---|---|
| Foundation | 1-2 | Schemas, types, base utilities | Migrations, types, DAG, cursor utils |
| Core Logic | 3-4 | Services, middleware, endpoints | All service logic, routes, controllers |
| Testing & Monitoring | 5 | E2E tests, metrics, documentation | Tests, Prometheus metrics, health endpoint |
| Integration & Rollout | 6 | Frontend integration, feature flags | Component development, soft launch |
| Risk | Epic | Mitigation |
|---|---|---|
| Admin lockout if MFA wrong | 1 | Test thoroughly; backup codes; feature flag |
| Cursor loss on crash | 2 | Redis replication; immediate persistence |
| DAG performance on 100+ nodes | 3 | Cache aggressively; profile with real data |
| Timezone off-by-one errors | 4 | Comprehensive UTC offset tests; DST handling |
| Stellar stream missing events | 2 | Run dual-stream for 1 week before cutover |
- Admin MFA: Feature flag (default off) → sandbox → limited admins → all admins
- Stellar monitoring: Dual-stream 1 week → validate event parity → cutover
- Learning paths: Non-breaking; cycle check on creation only
- Mentor availability: Optional; defaults to 24/7 if not set
Middleware:
src/middleware/require-mfa.middleware.ts
src/middleware/step-up-auth.middleware.ts
Services:
src/services/availability.service.ts
Jobs:
src/jobs/stellar-polling.job.ts
Utilities:
src/utils/stellar-cursor.utils.ts
src/utils/dag.utils.ts
Types:
src/types/availability.types.ts
Metrics:
src/metrics/stellar-metrics.ts
Tests:
tests/e2e/stellar-resilience.e2e.test.ts
tests/unit/prerequisite-validator.test.ts
tests/unit/availability.service.test.ts
Database:
database/migrations/XXX_admin_mfa_enforcement.sql
database/migrations/XXX_learning_path_prerequisites_dag.sql
database/migrations/XXX_mentor_availability.sql
Documentation:
docs/ADMIN_MFA.md
docs/STELLAR_RESILIENCE.md
docs/LEARNING_PATH_DAG.md
docs/MENTOR_AVAILABILITY.md
IMPLEMENTATION_PLAN.md
BRANCH_SUMMARY.md
src/utils/jwt.utils.ts - Add mfa_verified_at claim
src/utils/timezone.utils.ts - Enhance timezone conversion
src/utils/cache-key.utils.ts - Add cache keys
src/services/admin.service.ts - Gate sensitive operations
src/services/learning-path.service.ts - Validate prerequisites
src/services/prerequisite-validator.service.ts - Complete rewrite
src/services/stellar.service.ts - Add history fetching
src/services/stellar-stream.service.ts - Rewrite with reconnection
src/services/bookings.service.ts - Check availability
src/services/stellar.service.ts - Add transaction history
src/controllers/health.controller.ts - Stellar stream status
src/controllers/users.controller.ts - Include availability
src/routes/admin.routes.ts - Apply MFA middleware
src/routes/learning-path.routes.ts - DAG endpoints
src/routes/mentors.routes.ts - Availability endpoints
src/types/api.types.ts - Update AuthenticatedRequest
- Cycle detection (all patterns): self-ref, 2-node, transitive
- Topological sort correctness
- Timezone conversion edge cases (DST, day boundaries)
- Availability slot validation
- Rate limiting & lockout logic
- Stellar: Stream restart, reconnection, bulk recovery, idempotency
- Admin: MFA enforcement, step-up, grace period, lockout
- Learning paths: Enrollment eligibility, unmet prerequisites listing
- Availability: Booking conflicts, timezone display
- Kill Redis → Stellar stream recovery
- Horizon API failure → Exponential backoff, fallback to polling
- Admin repeated failed auth → Lockout mechanism
- Concurrent availability updates → Last-write-wins consistency
| Metric | Target | Epic |
|---|---|---|
| Admin unauthorized actions | 0 in 30 days | 1 |
| Missed payment events | 0 in 30 days | 2 |
| Stellar reconnect time | <5s median | 2 |
| Prerequisite query latency | <150ms p95 (50-node DAG) | 3 |
| Cycles in production | 0 (prevented at creation) | 3 |
| Mentor availability adoption | 80% within 60 days | 4 |
- Review this plan - Confirm 4 epics are aligned with business priorities
- Assign team members - 4 engineers (1 per epic) + reviewers
- Create feature branches - One per epic from this branch
- Begin Phase 1 - Migrations, types, utilities (Week 1-2)
- Weekly syncs - Track progress, unblock issues
- Security Epic Lead (Admin MFA): TBD
- DevOps Epic Lead (Stellar Monitoring): TBD
- Backend Architecture Lead (Learning Paths): TBD
- Product Owner (Mentor Availability): TBD
- QA Lead: TBD
- Security Review: TBD
IMPLEMENTATION_PLAN.md- Detailed task-by-task breakdowndocs/ADMIN_MFA.md- MFA enforcement policy & flowdocs/STELLAR_RESILIENCE.md- Stream recovery architecturedocs/LEARNING_PATH_DAG.md- Algorithm complexity & examplesdocs/MENTOR_AVAILABILITY.md- Availability schema & integration
Status: ✅ Ready for Review & Implementation
Last Updated: July 29, 2026
Branch Created: July 29, 2026