high priority low complexity frontend pending frontend specialist Tier 6

Acceptance Criteria

Every form field (date, time, duration, activity type, notes, mentor selector) has a Semantics widget with a non-empty label property that reads as a complete instruction (e.g., 'Activity date, required, tap to open date picker')
Validation error messages are announced by the screen reader immediately upon appearance without requiring the user to re-focus the field (use SemanticsService.announce() or a liveRegion Semantics node)
The mentor selector Semantics node includes a hint property describing the expected action (e.g., 'Double-tap to search and select a mentor')
FocusTraversalOrder or FocusTraversalGroup assigns logical tab/swipe order: header → mentor selector → date → time → duration → activity type → notes → submit button
All interactive elements (buttons, selectors, checkboxes) have a minimum touch target of 44×44 dp verified via the Flutter accessibility scanner or manual measurement
The submit button's Semantics label reflects its current state: 'Submit proxy registration' when enabled, 'Submitting, please wait' when loading
Running flutter analyze with --dart-define=FLUTTER_ACCESSIBILITY=true produces zero accessibility-related warnings on this screen
Manual VoiceOver (iOS) walkthrough confirms all fields are reachable in logical order and all labels are meaningful

Technical Requirements

frameworks
Flutter
flutter Semantics API
flutter accessibility scanner (package:flutter_test)
apis
SemanticsService.announce()
FocusTraversalOrder
FocusScopeNode
performance requirements
Semantics wrappers must not cause measurable frame-time regression (< 1 ms additional per frame)
security requirements
Semantics labels must not expose sensitive data (e.g., do not include mentor's personal ID in the screen-reader label)
ui components
Semantics
ExcludeSemantics
MergeSemantics
FocusTraversalGroup
FocusTraversalOrder
MinimumInteractiveSize (44dp enforcement via SizedBox or GestureDetector constraints)

Execution Context

Execution Tier
Tier 6

Tier 6 - 158 tasks

Can start after Tier 5 completes

Implementation Notes

Prefer wrapping existing widgets with Semantics() over restructuring the widget tree — minimise scope of changes. For LiveRegion announcements on validation errors, use SemanticsService.announce(message, TextDirection.ltr) inside the BlocListener when a validation error state is emitted. To enforce 44dp touch targets on custom widgets, wrap with ConstrainedBox(constraints: BoxConstraints(minWidth: 44, minHeight: 44)). Use FocusTraversalGroup with OrderedTraversalPolicy and assign FocusTraversalOrder.order to each field widget.

Test with TalkBack on Android if the target audience includes Android users (NHF/HLF user base spans both platforms). Given this project's strong WCAG 2.2 AA requirement across all three workshop organisations (NHF, Blindeforbundet, HLF), treat this task as a quality gate — the screen should not ship without passing the VoiceOver walkthrough.

Testing Requirements

Write flutter_test widget tests using tester.getSemantics() to assert that each form field node has the expected label and hint. Use the flutter accessibility scanner (AccessibilityGuideline) to programmatically check contrast ratios and touch target sizes. Write a golden-free semantic tree snapshot test that serialises the SemanticsNode tree for ProxyRegistrationScreen in its default state and asserts expected node labels — this catches regressions when widget tree changes. Manually verify with VoiceOver on a real iOS device or simulator before marking complete.

Component
Proxy Registration Screen
ui medium
Epic Risks (3)
medium impact medium prob technical

The 2-hour window duplicate detection logic requires querying existing proxy records with compound key matching (mentor + date + activity type within time range). If the query is too broad it produces false positives that frustrate coordinators; if too narrow it misses genuine duplicates that corrupt Bufdir data.

Mitigation & Contingency

Mitigation: Define the duplicate detection window as a configurable parameter from the start. Prototype the Supabase query with representative data covering edge cases (midnight boundaries, different activity types same day, same activity type different mentors) before finalising the implementation.

Contingency: If the detection produces excessive false positives in UAT, allow coordinators to explicitly acknowledge and bypass the duplicate warning with a reason field, preserving safety while reducing friction.

high impact medium prob scope

If the proxy registration form does not clearly distinguish between the acting coordinator and the attributed mentor, coordinators may submit records attributing activities to themselves, causing inaccurate Bufdir reporting and potential funding issues.

Mitigation & Contingency

Mitigation: Conduct UAT with at least one real coordinator via TestFlight before release. Use distinct visual treatment (different card colours, explicit 'Registering on behalf of:' label) and require the confirmation screen to show both identities prominently.

Contingency: Add a mandatory confirmation checkbox on the confirmation screen that explicitly names the attributed mentor, preventing accidental self-attribution from slipping through.

high impact medium prob security

Coordinators with multi-chapter access must select an active chapter context before the mentor list is filtered correctly. If chapter scope resolution fails or is bypassed, cross-org proxy registrations could occur, violating data isolation between chapters.

Mitigation & Contingency

Mitigation: Reuse the existing active-chapter-state and hierarchy-service components established by the org hierarchy feature. Add a guard that blocks entry to the proxy flow if no chapter context is active, prompting chapter selection first.

Contingency: If the chapter resolution service is unavailable, default to the most restrictive scope (no mentors visible) and surface a clear error message rather than showing an unfiltered mentor list.