Claude: changes for issue #91 #92
No reviewers
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente!92
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "claude/issue-91"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #91.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
Solid, well-scoped performance PR with unusually thorough test coverage. I traced the three main changes:
CardService.GetColumnsAsync: drops the thirdCommentscollection include and replaces it with aGroupBy/count query, filling the new[NotMapped] Card.CommentCount. Verified no other reader ofCard.Commentsexists on cards sourced from this method —CardView.razoris the only consumer and both usages (the metadata-row visibility check on the old line 24 and the badge itself) were updated toCommentCount.CommentList.razorloads its own comments viaCommentService.GetForCardAsync, independent of this path, so the dialog's discussion tab is unaffected.BoardService.ResolveAsync: refactored fromGetAsync+CanViewAsync(two round trips) into one query filtered byBoardAccess.VisibleTo, falling back to an existence check only to distinguishMissingfromDenied. The outcome semantics match the original exactly (id null → default board fallback; found+visible → Found; found+not-visible → Denied; not found → Missing).AesGcmDataEncryptor: rewritten string paths usingArrayPoolandstring.Create, avoiding the byte[] round-trip throughEncryptBytes/DecryptBytes. Checked the buffer-sizing arithmetic (Base64Length,MaxDecodedLength), the pool-return/clear discipline (plaintext buffers cleared, ciphertext/envelope buffers not, consistent with what's sensitive), and edge cases (empty string short-circuit, tiny/zero-length payloads).AuthenticationTagMismatchExceptionis not a new API introduced by this PR — it was already used in the unchangedDecryptBytes, so no risk there. The newAesGcmDataEncryptorTestspins byte-for-byte compatibility with legacy envelopes plus a full round-trip sweep across every length mod 3, which is exactly the boundary an off-by-one in this rewrite would hit.CardPreview: extraction of the markdown-flattening logic into a testable static class with an early-exit optimization (stops walking once it has enough text for the 200-char cutoff). Traced the early-stop logic against the non-early-stop path — they can't disagree, since the loop only breaks once length has already exceeded the bound it would eventually cut to. TheCardPreviewTestscover the tricky cases (surrogate pairs, marker cascade ordering, pure-emphasis lines) directly.The e2e test addition in
board.spec.jscorrectly follows the repo's fixture-ownership convention (creates its own card rather than grabbing.card.first()) and exercises exactly the thing the CommentCount change could break: a live badge update viaCommentsChangedwithout a full reload. Changelog entry is present and dated today's date, matching the requirement in CLAUDE.md.No correctness, security, or omission issues found.
⏱ 2m 7s · 20 turns · tokens: 98.3k in / 11.6k out (+1869.3k cache-read)
📜 Full session transcript