🔵 MINOR — debounceTimer not cleared on component destroy
Bug: actorName is never set — will always be null in every API response.
N+1: same issue as notifyReply — findById in a loop.
Avoid returning the Notification entity directly from the controller.
Layering violation: CommentService directly injects AppUserRepository.
Dead code: the List<Notification> overload is never called.
Hardcoded German strings bypass Paraglide.
href="#" scrolls the page to the top on click.
QA Review — @saraholt
Simple feature, but two things will silently break if not encoded as tests.
🟡 Section anchors must be verified by a test, not just specified
Leonie flagged…
QA Review — @saraholt
The spec is clean and Leonie's UX comments cover the critical interaction gaps. Two things need to be encoded as tests, not just implementation notes.
🔴 High…
QA Review — @saraholt
The architect and Leonie have flagged the two biggest risks. I want to add the test coverage dimension to both.
🔴 Blocking — XSS fix needs a regression test…
QA Review — @saraholt
The implementation plan is thorough and the TDD checkpoint table is a good start. Several critical test cases are missing that must be in this PR before merge.
###…
UX Review — @leonievoss
The URL scheme is clean, the annotationId discriminator from the architect's comment is the right call. Two UX gaps to address.
🔴 High — 2-second highlight…
UX Review — @leonievoss
The architect has already flagged the XSS blocker and the contenteditable question. I want to add the UX and accessibility layer to both.
🔴 Blocker —…
UX Review — @leonievoss
The backend design (confirmed clean by the architect) and the functional scope are solid. Accessibility and senior usability gaps need addressing on the frontend…