critical priority low complexity backend pending backend specialist Tier 0

Acceptance Criteria

`MentorStatus` enum is defined with exactly four values: `active`, `expiringSoon`, `expired`, `paused` (Dart camelCase convention)
`CertificationStatusResult` is an immutable value object (using `@immutable` annotation or `const` constructor) with fields: `MentorStatus status` and `int daysRemaining`
`daysRemaining` is documented: positive means days until expiry, zero means expiring today, negative means days since expiry
`CertificationStatusResult` implements `==` and `hashCode` (or uses `package:equatable`) so two results with the same status and days are considered equal in tests
Both types live in `lib/features/peer_mentor/domain/certification_status.dart` (or equivalent domain layer path) — no Flutter imports in this file
A Dart doc comment (`///`) on each enum value explains the business condition that triggers it
The file compiles with zero warnings under `dart analyze --fatal-infos`

Technical Requirements

frameworks
Dart (pure — no Flutter dependency)
data models
CertificationStatusResult
MentorStatus
performance requirements
Value object construction is O(1) and allocation-light (two fields)

Execution Context

Execution Tier
Tier 0

Tier 0 - 440 tasks

Implementation Notes

Keep this file as pure Dart with zero package imports beyond optionally `package:equatable` or `package:meta`. Using Dart's built-in record types (`(MentorStatus, int)`) is an alternative to a named class but reduces readability at call sites — prefer the explicit named class. If `equatable` is not already a project dependency, implement `==` and `hashCode` manually using `status` and `daysRemaining`. Avoid adding helper methods (e.g., `isWarning`) to these types at this stage — such logic belongs in `CertificationStatusService` (task-006) or UI mappers, not in the domain value object.

The `daysRemaining` sign convention (positive=future, negative=past) must be documented clearly since UI countdown widgets will depend on it.

Testing Requirements

Pure Dart unit tests (no widget pump needed). Test 1: `MentorStatus.values` has exactly 4 elements. Test 2: two `CertificationStatusResult` instances with identical fields are equal (`==`) and share the same `hashCode`. Test 3: two instances with differing `daysRemaining` are not equal.

Test 4: `daysRemaining` can be negative (construct with -5 and assert field value is -5). Tests must run without Flutter test runner (`dart test`) to confirm no accidental Flutter dependency.

Epic Risks (2)
high impact medium prob integration

The design token theme extension may conflict with existing ThemeData extensions already registered in the app, causing runtime assertion errors or token resolution failures across all screens that consume the tokens.

Mitigation & Contingency

Mitigation: Audit all existing ThemeData extensions before implementation. Use a unique extension key namespace and add integration tests that instantiate the combined theme in a test app harness.

Contingency: If conflicts arise, isolate design tokens behind a dedicated provider singleton (Riverpod) rather than a ThemeData extension, updating all consuming widgets to read from the provider instead.

medium impact medium prob scope

The 30-day warning threshold for expiring_soon status may differ between HLF's stated requirement in workshops (60 days mentioned in user stories) and the 30-day value in component documentation, causing disagreement during acceptance testing.

Mitigation & Contingency

Mitigation: Explicitly confirm the threshold value with HLF stakeholder before implementation. Make the threshold a named constant (kCertificationWarnDays) so it can be updated without logic changes.

Contingency: If stakeholder confirms 60 days post-implementation, update the constant and re-run the unit test suite — no architectural change required.