Fix Summary — User guide — speaker portal
Fixed: 2026-03-09
Last updated:
March 10, 2026
Reading time:
3 minutes
File size:
2.99 KB
Changes made
None. The audit found zero mismatches and zero undocumented behaviours. All doc files are internally consistent and no test assertions contradicted existing claims.
Skipped — needs manual decision (UNTESTED)
All 22 items below are test gaps — the documentation is correct, but no automated test verifies the claimed behaviour. These require new tests to be written in services/speaker-coordination-service/src/test/java, not doc changes.
- U1: “RESPOND token is single-use” — no test exists; security risk (token replay attack)
- U2: “VIEW token is reusable” — no test exists; may silently break after first click if accidentally single-use
- U3: “Token validity period is 30 days” — no test exists; expired tokens could be accepted indefinitely
- U4: “Only SHA-256 hash stored in DB, not raw token” — no test exists; DB breach risk if raw token persisted
- U5: “Rate limiting: 5 requests/minute per IP” — no test exists; rate-limit threshold unverified
- U6: “Accept transitions INVITED → ACCEPTED” — no test exists; core state machine transition
- U7: “Decline transitions INVITED → DECLINED” — no test exists; core state machine transition
- U8: “Decline reason is required” — no test exists; empty decline reason accepted silently
- U9: “
change_reason = 'SPEAKER_PORTAL_RESPONSE'recorded in status history” — no test exists; audit trail unverified - U10: “Confirmation email sent on acceptance” — no test exists; email handler may be missing
- U11: “Organiser notified in-app on accept and decline” — no test exists; async notification silently broken
- U12: “Title max 200 chars (required), abstract max 1000 chars (required)” — no test exists; oversized content enters DB
- U13: “Abstract warning shown when under 200 characters” — no test exists; UX-level check, low risk
- U14: “File types restricted to PPTX/PDF/KEY; max 50 MB” — no test exists; arbitrary files could reach S3
- U15: “Files uploaded directly to S3 via presigned URL, never proxied” — no test exists; architecture regression risk
- U16: “Draft auto-saved every 30 seconds; restored on re-visit” — no test exists; data loss risk on browser close
- U17: “Content submission transitions ACCEPTED → CONTENT_SUBMITTED” — no test exists; organiser Phase C depends on this
- U18: “Each resubmission increments version number; all versions stored” — no test exists; organiser review history unverified
- U19: “Reminder tiers: Tier 1 = 14 days, Tier 2 = 7 days, Tier 3 = 3 days before deadline” — no test exists; wrong thresholds send reminders at wrong times
- U20: “Reminders skipped if speaker already responded or submitted” — no test exists; accepted/submitted speakers receive spam
- U21: “After Tier 3, in-app notification created for organiser” — no test exists; escalation path silently broken
- U22: “Dashboard upcoming/past event filter logic” — no test exists; wrong filter shows cancelled speakers or hides valid past events