medium priority low complexity frontend pending frontend specialist Tier 4

Acceptance Criteria

Every mentor row in CertificationsExpiringWidget is tappable and navigates to CertificationStatusScreen for the corresponding mentor
The tap target covers the full width of the row and has a minimum height of 48dp (WCAG 2.2 AA)
A ripple (InkWell splash) effect is visible on tap, using the design token ripple/highlight color
Navigation passes the correct mentor ID to CertificationStatusScreen as a route argument
CertificationStatusScreen correctly loads and displays data for the tapped mentor after navigation
Rows are navigable via accessibility actions (screen reader double-tap activates navigation)
Each row has a Semantics label combining mentor name and cert expiry info for screen reader announcement
Navigation uses the app's named route system — no direct MaterialPageRoute pushes

Technical Requirements

frameworks
Flutter
data models
PeerMentor
Certification
performance requirements
Navigation push must complete within one frame — no blocking operations on tap
security requirements
Mentor ID passed via route argument must be the database ID, not a display name, to prevent route spoofing
ui components
InkWell wrapping each row (full width)
Semantics widget with label and onTap action on each row
Minimum 48dp row height enforced via ConstrainedBox or SizedBox

Execution Context

Execution Tier
Tier 4

Tier 4 - 323 tasks

Can start after Tier 3 completes

Implementation Notes

Wrap each row widget in an InkWell (not GestureDetector — InkWell provides the Material ripple). Set `onTap` to call `context.pushNamed(Routes.certificationStatus, extra: mentorId)` using the app router. To guarantee 48dp minimum height, wrap the row content in `ConstrainedBox(constraints: BoxConstraints(minHeight: 48))` inside the InkWell child. For Semantics, use `Semantics(label: '$mentorName — ${certType}, ${expiryLabel}', button: true, child: ...)` to give screen readers a complete row description.

Avoid using ListTile's default tap behaviour if it does not match the design token ripple color — override `splashColor` and `highlightColor` with token values if needed.

Testing Requirements

Widget tests: (1) tap a mentor row → verify Navigator pushes the correct named route with the expected mentor ID argument (use NavigatorObserver mock); (2) verify InkWell renders on each row; (3) verify row height is at least 48dp via tester.getSize(). Accessibility test: verify Semantics tree on each row has a non-empty label combining mentor name and expiry info. Test with multiple rows to ensure each row navigates to its own mentor (not all to the same one).

Epic Risks (3)
high impact medium prob technical

Flutter date pickers have historically poor screen reader support (VoiceOver/TalkBack), which is especially critical for this feature given that HLF peer mentors may have hearing impairment and the broader user base includes people with visual impairments. An inaccessible date picker on RecordRenewalScreen could block coordinator workflows entirely.

Mitigation & Contingency

Mitigation: Evaluate and adopt a third-party accessible date picker widget with verified WCAG 2.2 AA support, or build a custom picker using Flutter Semantics wrappers following the pattern established by the accessibility epic. Test all date pickers against VoiceOver on iOS and TalkBack on Android before UI sign-off.

Contingency: If no accessible date picker is available in time, provide a manual text field fallback for date entry (ISO format with clear labelling) alongside the picker, ensuring keyboard and screen reader users are never blocked.

medium impact high prob scope

Course enrolment initiation may redirect the user to the external HLF course portal (deep link or browser), which breaks the in-app flow and may confuse users expecting a seamless experience. The course data structure from Dynamics may also not be available in a machine-readable format in time for the initial release.

Mitigation & Contingency

Mitigation: Agree with HLF on whether enrolment is in-app or via deep link before UI design begins. If course data is not available from Dynamics at launch, design the enrolment prompt as a placeholder CTA that links to the HLF course portal homepage with a clear label indicating the user is leaving the app.

Contingency: Ship the course enrolment prompt as a configurable deep link per org. If Dynamics integration is delayed, the feature flag for the enrolment section can be disabled without affecting the rest of the certification status screen.

medium impact medium prob scope

Coordinators may attempt to record a renewal with an expiry date earlier than the previous certification's expiry (e.g., data entry error), or attempt to back-date a renewal. Without strict validation, the renewal history timeline could become chronologically inconsistent and mislead peer mentors about their coverage.

Mitigation & Contingency

Mitigation: CertificationManagementService validates that new expiry_date > current date and new issue_date >= previous renewal's issue_date before persisting. Surface validation errors as plain-language messages on RecordRenewalScreen using the error_message_registry pattern.

Contingency: If invalid renewal entries are discovered in production (from pre-validation data), provide a coordinator-only correction flow (edit renewal entry) behind an admin feature flag to fix historical records without requiring a full reset.