GitLab-backed analysis

Adservio Code Review Analysis

A read-only analysis of recent merge request review behavior in GitLab, focused on visible review discussion, reviewer distribution, queue health, MR size, and traceability gaps.

Period: 2026-09-19 07:00 to 2026-09-26 07:00
Primary source: GitLab merge request metadata, notes, labels, commits, and approvals endpoints.

Bottom line: review throughput is not the main risk here; traceability and queue hygiene are. The team is still merging code, but most merges leave no durable visible review trail and the open queue is overwhelmingly stale.

What Matters

  • Traceability is the clearest control gap: 61 of 75 merged MRs (81.3%) showed no visible non-author review comment in GitLab.
  • `CR - Approved` is currently too weak as evidence on its own: 33.3% of merged MRs carried that label without any visible review discussion.
  • Queue health is poor: 88.1% of active open MRs are already older than 48 working hours. The oldest example is adservio/billing/helm-deletion_scheduled-108!15 at 689.4d open.
  • Visible review capacity is thin and concentrated: only 15 visible review touches were detected in the whole window, and the top 3 reviewers handled 86.7% of them.
  • adservio/web is the highest-volume review surface with 18 merged MRs and only 16.7% visible review coverage. adservio/frontend is the next meaningful flow at 17 merges and 29.4% visible review coverage.
  • MR size is not the main story: median changed files were 4, and only 13.3% of merged MRs were above 20 files. Even the slowest merged example, adservio/web!2589, took 69.1d with 10 changed files, so the dominant problem still looks like review discipline and queue ownership rather than consistently oversized MRs.

Leadership Analysis

  • The operating rhythm is serviceable at the median (21.4h created-to-merged), which means the biggest leverage is improving process fidelity rather than pushing for even more raw throughput.
  • With 88.1% of active MRs already stale, the open list is functioning more like inventory than prioritization support. adservio/billing/helm-deletion_scheduled-108!15 being open for 689.4d is a strong sign that ownership and review handoffs are not being actively reset.
  • Reviewer concentration is now a resilience issue, not just a fairness issue. When the top 3 reviewers carry 86.7% of visible touches, review quality, continuity, and queue health all become sensitive to a very small set of people.
  • The spread between a 4-file median MR and a 69.1d longest merged cycle (adservio/web!2589, 10 changed files) suggests a few ownership-heavy exceptions are dragging on outside normal flow. Those should be managed as explicit escalations, not left to age inside the common queue.

Recommended Actions

  • Make one durable review artifact mandatory before merge: a substantive non-author GitLab review comment, a recorded approval, or both. A label alone should no longer count as sufficient evidence. The approval API coverage is also low, so the fix should include tooling or policy that leaves an auditable trace by default.
  • Run a stale-MR reset on anything older than 48 working hours: close abandoned work, re-confirm owner and reviewer on the rest, and turn the open list back into a real queue instead of a parking lot. Start with adservio/billing/helm-deletion_scheduled-108!15 and the rest of the oldest backlog because their age now obscures whether they are still real priorities.
  • Put adservio/admission/backend under explicit review guardrails for the next cycle. It combines enough volume with weak visible review coverage, which makes it the best place to tighten the process and see impact quickly.
  • Broaden the reviewer bench beyond Dragoș Ivan and the current small reviewer set. The present concentration is a continuity risk and will keep queue health fragile when one person is away.

Improvement Ideas

  • Set explicit operating standards for the next quarter: require one auditable peer-review artifact before merge, target first review inside one working day for active MRs, and keep the stale active backlog below 15%. What gets measured this clearly is far more likely to improve.
  • Run a four-week process experiment on adservio/admission/backend: dedicated reviewer-of-the-week coverage, explicit reviewer assignment at MR creation, and a lightweight weekly audit of silent merges. It is the highest-yield place to test whether better ownership changes the data.
  • Create a reviewer rotation with named backup coverage for the busiest repos. Good review systems depend on redundancy, not heroics, and rotation is the fastest way to lower reviewer bus factor without slowing delivery.

Supporting Evidence

  • 61 of 75 merged MRs (81.3%) had no visible non-author review comment in GitLab.
  • 39 of 75 merged MRs (52.0%) carried the `CR - Approved` label.
  • 25 merged MRs (33.3%) were labeled `CR - Approved` without any visible non-author review comment.
  • 13.3% of merged MRs changed more than 20 files, while 2.7% changed more than 50 files.
  • Among MRs with visible review discussion, the median last-author-commit to first-review time was 25.1h.
  • The median last-author-commit to `CR - Approved` time was 34.5h.
  • The top 3 reviewers accounted for 86.7% of visible review touches.
  • 59 of 67 active open MRs (88.1%) were older than 48 working hours.
Merged MRs
Merged MRs inside the analysis window.
75
Open MRs
All currently open group MRs.
94
Active open MRs
Open MRs excluding drafts.
67
Draft open MRs
Open MRs marked draft/WIP.
27
Visible review rate
Merged MRs with at least one visible non-author GitLab comment.
18.7%
Merged without visible review comment
Merged MRs with zero visible non-author comments.
81.3%
CR - Approved label coverage
Merged MRs carrying the CR-approved label.
52.0%
Approval API coverage
Merged MRs with at least one approver in the GitLab approvals API.
9.3%
CR - Approved without visible review comment
CR-approved MRs with no visible non-author comment.
33.3%
Median MR created -> first review
Working time from MR creation to first visible non-author comment.
2.1d
Median last author commit -> first review
Working time from last author commit before review to first visible non-author comment.
25.1h
Median first review -> CR - Approved
Working time from first visible comment to CR-approved label after review start, else merge.
3.0h
Median MR created -> CR - Approved
Working time from MR creation to CR-approved label after review start, else merge.
3.4d
Median last author commit -> CR - Approved
Working time from last author commit before review to CR-approved label after review start, else merge.
34.5h
Median MR created -> merged
Working time from MR creation to merge.
21.4h
Median changed files
Median GitLab `changes_count` value.
4
MRs > 5 files
Merged MRs where `changes_count` is above 5.
44.0%
MRs > 10 files
Merged MRs where `changes_count` is above 10.
20.0%
MRs > 20 files
Merged MRs where `changes_count` is above 20.
13.3%
MRs > 50 files
Merged MRs where `changes_count` is above 50.
2.7%
Top 3 reviewer touch share
Share of visible review touches handled by the top 3 reviewers.
86.7%
Active open backlog rate
Non-draft open MRs older than 48 working hours.
88.1%

These headline timing medians bring back the anchor-to-anchor numbers directly, using working time with weekends excluded.

Median MR created -> first review2.1d
Median last author commit -> first review25.1h
Median MR created -> CR - Approved3.4d
Median first review -> CR - Approved3.0h
Median last author commit -> CR - Approved34.5h
Median MR created -> merged21.4h
Dragoș Ivan81553.3%
George Murgoci4626.7%
Edgar Alexa116.7%
Marian Andrei116.7%
Andrei Dragan1156.7%
adservio/web1816.7%33.3%4.0
adservio/frontend1729.4%64.7%4
adservio/helm2911.1%11.1%1
adservio/admission/backend40.0%75.0%2.5
adservio/platform/iac40.0%0.0%2.5
adservio/accommodations/backend30.0%0.0%2
adservio/ai333.3%66.7%6
adservio/billing/backend366.7%100.0%6
adservio/docgen2/backend333.3%100.0%33
adservio/services/mcp20.0%100.0%42.0
adservio/services/notifications20.0%100.0%4.0
adservio/audit10.0%100.0%6

Visible Review Discussion MRs

Compact by default: key CR metrics stay visible, and each row expands inline for the full audit trail. The table starts sorted by Last Commit -> First Review.

Details
adservio/frontend!2154[ADS-8583] Sortare medie anuala2/5 Light1.2h1.3h1.4h
adservio/frontend!2153[ADS-8356] Banner - Web3/5 Solid1.8h1.9h2.1h
adservio/billing/backend!290[ads-7279-setup] Stripe4/5 Strong5.0h2.6h10.4h
adservio/subscriptions/backend!130[ADS-8787] - added redis santinel functionality3/5 Solid25.1h2.8h2.0d
adservio/frontend!2149[ADS-8177][State de functii] - Rapoarte 20 sept3/5 Solid4.2h3.8h26.1h
adservio/billing/backend!275[ADS-7279] Implementare stripe + google pay + apple pay4/5 Strong18.0d23.3h20.1d
adservio/frontend!2146[ADS-7559] Adeverinte de student3/5 Solid27.8h25.0h28.4h
adservio/docgen2/backend!173[ADS-7559] Adeverinte de student2/5 Light28.1h25.3h28.3h
adservio/frontend!2124[ADS-8343] Integrate student summaries3/5 Solid5.9d41.8h5.9d
adservio/helm2!394[ADS-8343] Integrate student summaries2/5 Light3.0d2.9d4.8d
adservio/ai!82[ADS-8343] Integrate student summaries4/5 Strong7.1d2.9d7.1d
adservio/web!2589[ADS-7852]: Enhance grade validation and locking logic4/5 Strong3.1d3.1d69.0d
adservio/web!2762[S: ADS-8404][ADS-8406] [Elev][Parinte] - Redesign - Rapoarte4/5 Strong4.1d4.1d6.1d
adservio/web!2747[ADS-8343] Integrate student summaries2/5 Light7.1d5.2d7.1d

No Visible Review Comment Audit

These merged MRs had no visible non-author GitLab comment under the current heuristic. Use this section to audit whether the gap is a real review-process issue or a GitLab traceability issue.

Total MRs61
With CR Label25
With Approval API4
  • Open the MR link and check the Overview tab for CR - Approved and any approval widget signal.
  • Check Activity / Discussions for real human reviewer comments.
  • If you only see system notes, merge notes, mentions, or bot activity, it stays in this audit set.
  • If you find a genuine reviewer comment from someone other than the author, treat that MR as a false positive of this heuristic.
full audit table (61 MRs). Click again to collapse.
adservio/accommodations/backend!87adservio/accommodations/backend[HOTFIX] Acommodation events - update student study eventIonut Ciolan2026-09-21
adservio/services/mcp!6adservio/services/mcp[ADS-8343] Integrate student summariesAlex Murarescu2026-09-21Yes
adservio/services/notifications!21adservio/services/notifications[ADS-8343] Integrate student summariesAlex Murarescu2026-09-21Yes
adservio/helm2!415adservio/helm2ADS-8739: scale social-api on cpu only and drop the memory triggerRojan Shrestha2026-09-21
adservio/platform/iac!86adservio/platform/iac[ADS-8748] Helpdesk AWS foundations — RDS, IRSA, Identity Center, db-usersDaniel Onisoru2026-09-21
adservio/accommodations/backend!88adservio/accommodations/backend[HOTFIX] Accommodations - available rooms + sync students commandIonut Ciolan2026-09-21
adservio/frontend!2148adservio/frontend[ADS-8624] Show localized 2FA password errorsValentin Pal2026-09-21
adservio/web!2785adservio/web[HOTFIX] Delete users that have messagesMarian Andrei2026-09-21
adservio/admission/backend!186adservio/admission/backend[ADS-8865] - order by created atGeorge Murgoci2026-09-21
adservio/docgen2/backend!174adservio/docgen2/backend[ADS-8177][State de functii] - Rapoarte 20 septAchim Stefan2026-09-21Yes
adservio/helm2!414adservio/helm2ADS-8854: run ten single-replica production API services on two replicasRojan Shrestha2026-09-21
adservio/helm2!419adservio/helm2ADS-8864: enable latency and platform alerts on tuiasiRojan Shrestha2026-09-21
adservio/frontend!2143adservio/frontend[ADS-7279] Implementare stripe + google pay + apple payEdgar Alexa2026-09-21Yes
adservio/social!41adservio/social[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/services/notifications!24adservio/services/notifications[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/services/mcp!7adservio/services/mcp[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/services/backend-for-frontend!19adservio/services/backend-for-frontend[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/library!36adservio/library[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/forms!19adservio/forms[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/billing/backend!288adservio/billing/backend[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/ai!83adservio/ai[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/admission/backend!185adservio/admission/backend[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/audit!13adservio/audit[ADS-8787] - added redis santinel functionalityGeorge Murgoci2026-09-21Yes
adservio/web!2787adservio/web[HOTFIX] SIIIR: match students to the newest record when several share a code or CNPMarian Andrei2026-09-21
adservio/web!2786adservio/web[HOTFIX] Update the summary for deleting usersMarian Andrei2026-09-21
adservio/web!2788adservio/web[ADS-8872] Add GET /async-jobs: list a school's async jobs by type, with ETAMarian Andrei2026-09-21
adservio/web!2789adservio/web[HOTFIX] merge SIIIR duplicates into the kept student and add a combined students+parents commandMarian Andrei2026-09-21
adservio/platform/iac!91adservio/platform/iacADS-8873: raise RDS storage autoscaling ceilings and sync allocated_storage to live sizesRojan Shrestha2026-09-21
adservio/platform/iac!93adservio/platform/iacADS-8870: set skip_name_resolve and innodb_print_all_deadlocks on the four production MySQL instancesRojan Shrestha2026-09-21
adservio/helm2!416adservio/helm2ADS-8859: right-size cpu requests on social-api and subscriptions-api and lower the social-api ceilingRojan Shrestha2026-09-22
adservio/helm2!420adservio/helm2Name the cluster in the platform-wide latency alert summariesRojan Shrestha2026-09-22
adservio/helm2!421adservio/helm2ADS-8878: name the cluster in the platform-wide 5xx alert summariesRojan Shrestha2026-09-22
adservio/helm2!422adservio/helm2Align traefik latency histogram buckets with the alert thresholdsRojan Shrestha2026-09-22
adservio/helm2!423adservio/helm2Stop PagerDuty truncating the description when a group has more than one alertRojan Shrestha2026-09-22
adservio/web!2795adservio/web[HOTFIX] Set all jobs as deleted when one siiir sync was succeedMarian Andrei2026-09-22
adservio/admission/backend!187adservio/admission/backend[ADS-8885] - presign aws urlGeorge Murgoci2026-09-23Yes
adservio/frontend!2156adservio/frontend[ADS-8901] - fix for new billing profileGeorge Murgoci2026-09-23Yes
adservio/web!2796adservio/web[ADS-8806] Normalize SIIIR phone numbers to the +40 formatMarian Andrei2026-09-23
adservio/docgen2/backend!175adservio/docgen2/backend[ADS-8802] Ordine absente gresita catalog pdfPetronel Pavel2026-09-23Yes
adservio/admission/backend!188adservio/admission/backend[ADS-8885] - removed limit for raport exportsGeorge Murgoci2026-09-23Yes
adservio/frontend!2158adservio/frontend[ADS-8885] - removed limit from reportGeorge Murgoci2026-09-23Yes
adservio/frontend!2152adservio/frontend[ADS-8751] Import note bulk are success dar nu importa noteleAchim Stefan2026-09-23
adservio/web!2799adservio/web[HOTFIX] SIIIR: move stale-job cleanup from sync completion to confirm completionMarian Andrei2026-09-23
adservio/web!2800adservio/web[ADS-8908] Add a 4th parent-matching tier: word set, for split-field mismatchesMarian Andrei2026-09-23
adservio/web!2797adservio/web[ADS-8806]: SIIIR improvementsIoana Ivan2026-09-23
adservio/platform/iac!94adservio/platform/iacADS-8887: add Andrei Petrescu to SRE and extend MonitoringUser to all six accountsRojan Shrestha2026-09-24
adservio/accommodations/backend!92adservio/accommodations/backend[HOTFIX] Accommodations - student studies statusIonut Ciolan2026-09-24
adservio/frontend!2163adservio/frontend[ADS-8721]: Allow personal Auxiliar to sign attendanceIoana Ivan2026-09-24
adservio/ai!85adservio/aiAdd Wellbeing AI feature flag to the required flags for notificationsAlex Murarescu2026-09-24
adservio/web!2802adservio/web[S: ADS-8806][ADS-8853] Persist SIIIR class id and use it as the primary class-match keyMarian Andrei2026-09-24
adservio/web!2801adservio/web[ADS-8853] Persist SIIIR class id and use it as the primary class-match keyMarian Andrei2026-09-24
adservio/frontend!2162adservio/frontend[ADS-8806]: SIIIR ImprovementsIoana Ivan2026-09-24
adservio/frontend!2164adservio/frontend[ADS-8943]: UI improvementsIoana Ivan2026-09-24
adservio/frontend!2165adservio/frontend[ADS-8968] Mesagerie lipsă dirigintePetronel Pavel2026-09-25
adservio/web!2752adservio/webADS-8713 Block invitations for suspended teachersValentin Pal2026-09-25YesYes
adservio/frontend!2129adservio/frontend[ADS-8713] Explain rejected registration invitationsValentin Pal2026-09-25Yes
adservio/frontend!2166adservio/frontend[Acommodations] Fix repartition faculties selector for unique study valuesAchim Stefan2026-09-25Yes
adservio/uni/backend!262adservio/uni/backend[ADS-8896] Import Studenti - fixesAndrei Alexandru2026-09-25Yes
adservio/frontend!1950adservio/frontend[ADS-7852]: Show BE validationsIoana Ivan2026-09-25YesYes
adservio/web!2791adservio/web[ADS-8861] Guard referenced allocation deletionValentin Pal2026-09-25YesYes
adservio/web!2768adservio/web[ADS-8569][ADS-8758][ADS-8570] copy classes dataIonut Ciolan2026-09-25Yes

Oldest Active Open MRs (> 48 Working Hours)

adservio/billing/helm-deletion_scheduled-108!15adservio/billing/helm-deletion_scheduled-108Robert689.4d0
adservio/subscriptions/helm-deletion_scheduled-125!4adservio/subscriptions/helm-deletion_scheduled-125Daniel Onisoru627.4d0
adservio/web!2091adservio/webAndrei Dragan316.6d5
adservio/helm2!137adservio/helm2Raul Popovici292.7d0
adservio/videothumb!5adservio/videothumbRaul Popovici289.6d0
adservio/timetables-generator!9adservio/timetables-generatorRaul Popovici289.6d0
adservio/web!2344adservio/webGeorge Murgoci180.4d0
adservio/library!26adservio/libraryRaul Popovici160.5d0
adservio/subscriptions/backend!103adservio/subscriptions/backendEdgar Alexa158.5d4
adservio/admission/backend!104adservio/admission/backendEdgar Alexa158.4d0
adservio/web!2589adservio/webAndrei Dragan69.1d102
adservio/frontend!1950adservio/frontendIoana Ivan67.9d190
adservio/billing/backend!275adservio/billing/backendEdgar Alexa20.1d243
adservio/frontend!2129adservio/frontendValentin Pal11.4d80
adservio/web!2752adservio/webValentin Pal11.4d80
adservio/web!2762adservio/webCatalin Cojan9.1d1615
adservio/services/mcp!6adservio/services/mcpAlex Murarescu8.9d760
adservio/frontend!2124adservio/frontendAlex Murarescu8.9d281
adservio/web!2747adservio/webAlex Murarescu8.9d31
adservio/ai!82adservio/aiAlex Murarescu8.9d1073

Methodology And Limits

  • This report uses visible non-author GitLab comments as the strongest review-start proxy.
  • GitLab approval API coverage is shown separately; missing approval API data should be read as traceability gap, not proof that no approval happened.
  • Review completion uses the first `CR - Approved` label-add event after review starts when GitLab label history provides one; otherwise it falls back to merge time.
  • Last-author-commit metrics use the latest non-merge MR commit authored by the MR author strictly before review starts.
  • Timing metrics in this report exclude Saturday and Sunday hours using the Europe/Bucharest calendar.
  • Review-quality scoring is heuristic: it rewards visible substantive comments, multiple reviewers, and post-review pushes, and it penalizes large MRs with shallow visible discussion.
  • `Active open backlog rate` excludes draft MRs and uses a > 48 working-hour age threshold.
  • Open MR backlog age is a queue-health signal, not proof that every old open MR is actively waiting for review right now.