<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Collaboration on Daffa Abhipraya</title><link>https://blog.abhipraya.dev/tags/collaboration/</link><description>Recent content in Collaboration on Daffa Abhipraya</description><generator>Hugo</generator><language>en-us</language><copyright>© Daffa Abhipraya</copyright><lastBuildDate>Fri, 13 Mar 2026 00:00:00 +0700</lastBuildDate><atom:link href="https://blog.abhipraya.dev/tags/collaboration/index.xml" rel="self" type="application/rss+xml"/><item><title>PPL: Code Review [Sprint 1, Week 3]</title><link>https://blog.abhipraya.dev/ppl/part-b/s1w3-code-review/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0700</pubDate><guid>https://blog.abhipraya.dev/ppl/part-b/s1w3-code-review/</guid><description>&lt;h2 id="what-i-worked-on">
 &lt;a class="anchor" href="#what-i-worked-on" data-anchor="what-i-worked-on" aria-hidden="true">#&lt;/a>
 What I Worked On
&lt;/h2>
&lt;p>This week I reviewed &lt;strong>10 teammates&amp;rsquo; merge requests&lt;/strong>, leaving substantive comments with code samples, performance suggestions, and architectural fixes. Three reviews included fix commits that I pushed directly to the teammate&amp;rsquo;s branch to unblock merging.&lt;/p>
&lt;h2 id="review-summary">
 &lt;a class="anchor" href="#review-summary" data-anchor="review-summary" aria-hidden="true">#&lt;/a>
 Review Summary
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>MR&lt;/th>
 &lt;th>Author&lt;/th>
 &lt;th>Feature&lt;/th>
 &lt;th>Review Type&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>!75&lt;/td>
 &lt;td>soydoradesu&lt;/td>
 &lt;td>Client management pages&lt;/td>
 &lt;td>Duplicate code + missing field&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!72&lt;/td>
 &lt;td>hl&lt;/td>
 &lt;td>Dashboard stale data fix&lt;/td>
 &lt;td>TanStack Query invalidation gap&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!64&lt;/td>
 &lt;td>soydoradesu&lt;/td>
 &lt;td>Frontend foundation&lt;/td>
 &lt;td>Comprehensive review + fix commits&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!49&lt;/td>
 &lt;td>qenthm&lt;/td>
 &lt;td>Overdue detection worker&lt;/td>
 &lt;td>Consistency + naming review&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!45&lt;/td>
 &lt;td>froklax&lt;/td>
 &lt;td>Staff management&lt;/td>
 &lt;td>Auth/DB desync risk&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!46&lt;/td>
 &lt;td>adipppp&lt;/td>
 &lt;td>Auth deadlock fix&lt;/td>
 &lt;td>Correctness verification&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!50&lt;/td>
 &lt;td>dafandikri&lt;/td>
 &lt;td>Dev environment fix&lt;/td>
 &lt;td>Review + 4 fix commits pushed&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!40&lt;/td>
 &lt;td>soydoradesu&lt;/td>
 &lt;td>Frontend foundation&lt;/td>
 &lt;td>Cleanup commits pushed&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!52&lt;/td>
 &lt;td>adipppp&lt;/td>
 &lt;td>Payment seeder&lt;/td>
 &lt;td>FK resolution review&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>!63&lt;/td>
 &lt;td>adipppp&lt;/td>
 &lt;td>JWT alg:none hardening&lt;/td>
 &lt;td>Security review&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="how-i-conduct-code-reviews">
 &lt;a class="anchor" href="#how-i-conduct-code-reviews" data-anchor="how-i-conduct-code-reviews" aria-hidden="true">#&lt;/a>
 How I Conduct Code Reviews
&lt;/h2>
&lt;p>Reviewing 10 MRs in a single week is only feasible because of a structured AI-assisted workflow. I use two Claude Code plugins depending on the MR type, then manually filter and post the findings.&lt;/p></description></item><item><title>PPL: Code Review Across Architecture and Runtime Bugs [Sprint 1, Week 2]</title><link>https://blog.abhipraya.dev/ppl/part-b/s1w2-code-review/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0700</pubDate><guid>https://blog.abhipraya.dev/ppl/part-b/s1w2-code-review/</guid><description>&lt;h2 id="overview">
 &lt;a class="anchor" href="#overview" data-anchor="overview" aria-hidden="true">#&lt;/a>
 Overview
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>MR&lt;/th>
 &lt;th>Feature&lt;/th>
 &lt;th>Issues&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://gitlab.lab.local/joint-research/ui/smart-invoice-reminder/SIRA/-/merge_requests/10">!10&lt;/a> - SIRA-31&lt;/td>
 &lt;td>Payment recording (dafandikri)&lt;/td>
 &lt;td>2&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://gitlab.lab.local/joint-research/ui/smart-invoice-reminder/SIRA/-/merge_requests/12">!12&lt;/a> - SIRA-30&lt;/td>
 &lt;td>Invoice management (froklax)&lt;/td>
 &lt;td>7&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://gitlab.lab.local/joint-research/ui/smart-invoice-reminder/SIRA/-/merge_requests/17">!17&lt;/a> - SIRA-29&lt;/td>
 &lt;td>Client management (fadhli)&lt;/td>
 &lt;td>1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://gitlab.lab.local/joint-research/ui/smart-invoice-reminder/SIRA/-/merge_requests/20">!20&lt;/a> - SIRA-27&lt;/td>
 &lt;td>Layout and dashboard (haliza)&lt;/td>
 &lt;td>1&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>11 issues total. Each review included specific file and line references.&lt;/p>
&lt;hr>
&lt;h2 id="mr-10---payment-recording-2-issues">
 &lt;a class="anchor" href="#mr-10---payment-recording-2-issues" data-anchor="mr-10---payment-recording-2-issues" aria-hidden="true">#&lt;/a>
 MR !10 - Payment Recording (2 issues)
&lt;/h2>
&lt;p>&lt;strong>Issue 1: &lt;code>.single()&lt;/code> causes an unhandled 500 on missing records.&lt;/strong>&lt;/p>
&lt;p>&lt;code>get_payment_by_id&lt;/code> used &lt;code>.single()&lt;/code> which throws &lt;code>PostgRESTError (PGRST116)&lt;/code> when no row is found, making the &lt;code>if payment is None&lt;/code> guard below it dead code. The fix is &lt;code>.maybe_single()&lt;/code>, which returns &lt;code>None&lt;/code> cleanly. The same fix was already applied in MR !23 for &lt;code>app_users.py&lt;/code>.&lt;/p></description></item></channel></rss>