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-05 07:00 to 2026-09-12 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: 53 of 60 merged MRs (88.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: 87.9% of active open MRs are already older than 48 working hours. The oldest example is adservio/web!2091 at 301.6d open.
  • Visible review capacity is thin and concentrated: only 8 visible review touches were detected in the whole window, and the top 3 reviewers handled 50.0% of them.
  • adservio/frontend is the highest-volume review surface with 14 merged MRs and only 14.3% visible review coverage. adservio/web is the next meaningful flow at 13 merges and 15.4% visible review coverage.
  • MR size is not the main story: median changed files were 5.0, and only 11.7% of merged MRs were above 20 files. Even the slowest merged example, adservio/billing/backend!266, took 27.7d with 872 changed files, so the dominant problem still looks like review discipline and queue ownership rather than consistently oversized MRs.

Leadership Analysis

  • This does not read like a slow-review system. The median last-author-commit to first-review time was 2.1h, so the dominant weakness is decision recording and merge discipline, not reviewer reaction speed.
  • With 87.9% of active MRs already stale, the open list is functioning more like inventory than prioritization support. adservio/web!2091 being open for 301.6d is a strong sign that ownership and review handoffs are not being actively reset.
  • The spread between a 5.0-file median MR and a 27.7d longest merged cycle (adservio/billing/backend!266, 872 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/web!2091 and the rest of the oldest backlog because their age now obscures whether they are still real priorities.
  • Put adservio/helm2 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 Marian Andrei 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/helm2: 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.

Supporting Evidence

  • 53 of 60 merged MRs (88.3%) had no visible non-author review comment in GitLab.
  • 26 of 60 merged MRs (43.3%) carried the `CR - Approved` label.
  • 20 merged MRs (33.3%) were labeled `CR - Approved` without any visible non-author review comment.
  • 11.7% of merged MRs changed more than 20 files, while 5.0% changed more than 50 files.
  • Among MRs with visible review discussion, the median last-author-commit to first-review time was 2.1h.
  • The median last-author-commit to `CR - Approved` time was 2.7d.
  • The top 3 reviewers accounted for 50.0% of visible review touches.
  • 51 of 58 active open MRs (87.9%) were older than 48 working hours.
Merged MRs
Merged MRs inside the analysis window.
60
Open MRs
All currently open group MRs.
79
Active open MRs
Open MRs excluding drafts.
58
Draft open MRs
Open MRs marked draft/WIP.
21
Visible review rate
Merged MRs with at least one visible non-author GitLab comment.
11.7%
Merged without visible review comment
Merged MRs with zero visible non-author comments.
88.3%
CR - Approved label coverage
Merged MRs carrying the CR-approved label.
43.3%
Approval API coverage
Merged MRs with at least one approver in the GitLab approvals API.
20.0%
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.
39.7h
Median last author commit -> first review
Working time from last author commit before review to first visible non-author comment.
2.1h
Median first review -> CR - Approved
Working time from first visible comment to CR-approved label after review start, else merge.
29.3h
Median MR created -> CR - Approved
Working time from MR creation to CR-approved label after review start, else merge.
5.0d
Median last author commit -> CR - Approved
Working time from last author commit before review to CR-approved label after review start, else merge.
2.7d
Median MR created -> merged
Working time from MR creation to merge.
4.6h
Median changed files
Median GitLab `changes_count` value.
5.0
MRs > 5 files
Merged MRs where `changes_count` is above 5.
46.7%
MRs > 10 files
Merged MRs where `changes_count` is above 10.
25.0%
MRs > 20 files
Merged MRs where `changes_count` is above 20.
11.7%
MRs > 50 files
Merged MRs where `changes_count` is above 50.
5.0%
Top 3 reviewer touch share
Share of visible review touches handled by the top 3 reviewers.
50.0%
Active open backlog rate
Non-draft open MRs older than 48 working hours.
87.9%

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

Median MR created -> first review39.7h
Median last author commit -> first review2.1h
Median MR created -> CR - Approved5.0d
Median first review -> CR - Approved29.3h
Median last author commit -> CR - Approved2.7d
Median MR created -> merged4.6h
Marian Andrei2325.0%
Andrei Dragan11212.5%
Achim Stefan1212.5%
Alex Murarescu11212.5%
George Murgoci1312.5%
Ioana Ivan1112.5%
Edgar Alexa1112.5%
adservio/frontend1414.3%78.6%6.5
adservio/web1315.4%46.2%1
adservio/uni/backend812.5%0.0%6.0
adservio/billing/backend714.3%71.4%13
adservio/helm270.0%14.3%2
adservio/docgen2/backend425.0%25.0%6.0
adservio/devops/iac30.0%0.0%3
adservio/subscriptions/backend20.0%50.0%14.5
adservio/services/backend-for-frontend10.0%0.0%2
adservio/social10.0%100.0%5

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/web!2760[ADS-8638]: Use ascID for userInfo if ascID is not active.3/5 Solid0.1h0.1h1.5h
adservio/frontend!2107[ADS-8643] Rute mobile coduri înregistrare3/5 Solid3.7d0.1h5.0d
adservio/web!2725[S: ADS-8297][ADS-8345] [BE] Api medii generale anuale5/5 Deep24.9h2.1h5.0d
adservio/billing/backend!266[ADS-8383] - initalize nest project/local cache4/5 Strong10.9d2.1h18.7d
adservio/uni/backend!247[ADS-8383][ADS-8562]: Actualizare structură evenimente uni.student.* / uni.staff.*2/5 Light26.4h22.7h11.0d
adservio/docgen2/backend!170[ADS-8642]: Incadrare dubla la dirigentie se afiseaza ca materie obisnuita2/5 Light39.7h39.7h39.8h
adservio/frontend!2109[ADS-8641]: Observations page for students - lose sanID filter3/5 Solid47.3h47.4h2.7d

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 MRs53
With CR Label20
With Approval API11
  • 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 (53 MRs). Click again to collapse.
adservio/frontend!2120adservio/frontend[ADS-8669] Ramane un rand liber la copierea claselor din anul trecut scolarPetronel Pavel2026-09-07Yes
adservio/helm2!382adservio/helm2[S: ADS-8297][ADS-8345] Deploy tenant migrations and averages snapshotDaniel Onisoru2026-09-07Yes
adservio/web!2744adservio/web[S: ADS-8297][ADS-8345] [BE] Api medii generale anualeCatalin Cojan2026-09-07
adservio/frontend!2121adservio/frontend[ADS_8579] Permisune Acces secțiunea DocumenteAchim Stefan2026-09-07YesYes
adservio/billing/backend!283adservio/billing/backend[ads-5654] - moved tests on nestGeorge Murgoci2026-09-08
adservio/frontend!2101adservio/frontend[ADS-5654] - moved nest endpoints to point to /v2/billing/coreGeorge Murgoci2026-09-08
adservio/subscriptions/backend!126adservio/subscriptions/backend[ADS-5654] - routed nest endpoints to /backend/coreGeorge Murgoci2026-09-08
adservio/billing/backend!280adservio/billing/backend[ADS-5654] - fastify to nest migrationGeorge Murgoci2026-09-08
adservio/docgen2/backend!169adservio/docgen2/backend[ADS-5654] migrate nest endpointsGeorge Murgoci2026-09-08
adservio/uni/backend!249adservio/uni/backend[ADS-5654] - fastify to nest migrationGeorge Murgoci2026-09-08
adservio/helm2!378adservio/helm2[ADS-5654]: fastify tonest migrationGeorge Murgoci2026-09-08
adservio/uni/backend!251adservio/uni/backendDraft: [ADS-5654] - taxe scolarizareGeorge Murgoci2026-09-08
adservio/frontend!2122adservio/frontend[ADS-8704] Incadrare improvementPetronel Pavel2026-09-08Yes
adservio/docgen2/backend!172adservio/docgen2/backend[ADS-8702] Denumirea materiei in catalogul PDF nu este afisata completPetronel Pavel2026-09-08
adservio/billing/backend!284adservio/billing/backend[ads-5654] - extend Billign Permissions guardGeorge Murgoci2026-09-08Yes
adservio/uni/backend!252adservio/uni/backend[ADS-8667] State de functii - UpdatesAndrei Alexandru2026-09-08Yes
adservio/docgen2/backend!171adservio/docgen2/backend[ADS-8667] State de funcțiiAchim Stefan2026-09-08
adservio/frontend!2119adservio/frontend[ADS-8667] State de funcțiiPetronel Pavel2026-09-08
adservio/web!2742adservio/web[ADS-8681] Use MariaDB-compatible certificate filtersValentin Pal2026-09-09Yes
adservio/web!2749adservio/web[hotfix-migrations] Copy data from migrations table when new school is addedCatalin Cojan2026-09-09Yes
adservio/web!2751adservio/web[ADS-8731] removed db ping from load liceuIonut Ciolan2026-09-09
adservio/uni/backend!253adservio/uni/backend[ADS-8448] State de functii - PermisiuniAndrei Alexandru2026-09-09
adservio/frontend!2126adservio/frontend[ADS-8448] State de functii - PermisiuniAchim Stefan2026-09-09YesYes
adservio/frontend!2127adservio/frontend[ADS-8730] Încadrare improvement 2Petronel Pavel2026-09-09Yes
adservio/web!2754adservio/web[Prod][AWS][Web] Route bootstrap reads missing AI summaries translation keyAlex Murarescu2026-09-10Yes
adservio/social!40adservio/social[ADS-8737] News visibility indexAlex Murarescu2026-09-10Yes
adservio/helm2!388adservio/helm2ADS-8739: restore social-api and uni PHP-FPM memory requests in productionRojan Shrestha2026-09-10
adservio/helm2!387adservio/helm2ADS-8655: bound job history retention on adservio chart cronjobsRojan Shrestha2026-09-10Yes
adservio/web!2750adservio/web[ADS-8381] Restore school transfer filtersValentin Pal2026-09-10
adservio/web!2738adservio/web[ADS-8641]: Remove sanID from get observationsIoana Ivan2026-09-10YesYes
adservio/frontend!2130adservio/frontend[ADS-8740] Search roluri și permisiuniPetronel Pavel2026-09-10Yes
adservio/web!2745adservio/web[ADS-8629] Timetables generator - fixed activities room restrictionIonut Ciolan2026-09-10
adservio/web!2755adservio/web[ADS-8594]: Allow parents Tel for SVC UserIoana Ivan2026-09-10Yes
adservio/helm2!389adservio/helm2ADS-8736: give BFF a real heap ceiling and resource reservationRojan Shrestha2026-09-10Yes
adservio/helm2!390adservio/helm2ADS-8738: stop duplicate critical alerts to slack-criticalRojan Shrestha2026-09-10Yes
adservio/devops/iac!83adservio/devops/iacADS-8749: untrack terraform.exe and fix the gitignore rules that let it inRojan Shrestha2026-09-10
adservio/uni/backend!254adservio/uni/backend[ADS-8722] State de funcții Updates 2Andrei Alexandru2026-09-10
adservio/frontend!2131adservio/frontend[ADS-8722] Configurare nr semigrupe, filtru departament in planul de invatamantAchim Stefan2026-09-10Yes
adservio/devops/iac!81adservio/devops/iacreconcile production eks state after the 1.34 to 1.36 upgradeRojan Shrestha2026-09-10
adservio/frontend!2123adservio/frontendAlign copied class row countValentin Pal2026-09-10
adservio/devops/iac!82adservio/devops/iacdeclare and pin the eks addon variables in the apps root moduleRojan Shrestha2026-09-10
adservio/uni/backend!255adservio/uni/backend[ADS-8534] Situatie scolara - trunchi comunAndrei Alexandru2026-09-11Yes
adservio/billing/backend!287adservio/billing/backendtracing on nestGeorge Murgoci2026-09-11Yes
adservio/billing/backend!286adservio/billing/backendnest permissions cleanup/siruta migration to nest (for new env)George Murgoci2026-09-11Yes
adservio/web!2758adservio/web[ADS-8720] Preserve vacation study-year prefixesValentin Pal2026-09-11Yes
adservio/billing/backend!285adservio/billing/backend[ADS-8725] [Prod][Billing] Nightly penalty generation fails, leaving expected penalties unrecordedEdgar Alexa2026-09-11Yes
adservio/uni/backend!256adservio/uni/backend[ADS-8675] Situație Școlară - recaluclare medii la scimbarea numarului de credite pe o disciplinaAndrei Alexandru2026-09-11Yes
adservio/subscriptions/backend!127adservio/subscriptions/backend[ADS-8694]: Separate marketing banner and popup fieldsDragoș Ivan2026-09-11Yes
adservio/frontend!2125adservio/frontend[ADS-8694]: Separate marketing banner and popup fieldsDragoș Ivan2026-09-11Yes
adservio/helm2!392adservio/helm2ADS-8747: improve ingress histogram resolutionValentin Pal2026-09-11
adservio/web!2761adservio/web[HOTFIX] GDPR CodeExec: purge students/parents by school yearMarian Andrei2026-09-11
adservio/frontend!2135adservio/frontend[ADS-8638]: Send ascID for userInfoIoana Ivan2026-09-11Yes
adservio/services/backend-for-frontend!18adservio/services/backend-for-frontendfix(bff): add 1.5s global axios timeout and sanitize error logsStefan Musat2026-09-11

Oldest Active Open MRs (> 48 Working Hours)

adservio/web!2091adservio/webAndrei Dragan301.6d5
adservio/helm2!137adservio/helm2Raul Popovici277.6d0
adservio/services/websocket!8adservio/services/websocketRaul Popovici274.6d0
adservio/services/videothumb!5adservio/services/videothumbRaul Popovici274.6d0
adservio/services/fet-generator!9adservio/services/fet-generatorRaul Popovici274.6d0
adservio/frontend!1556adservio/frontendGeorge Murgoci166.3d0
adservio/web!2344adservio/webGeorge Murgoci165.4d0
adservio/library/backend!26adservio/library/backendRaul Popovici145.5d0
adservio/subscriptions/backend!103adservio/subscriptions/backendEdgar Alexa143.5d4
adservio/admission/backend!104adservio/admission/backendEdgar Alexa143.4d0
adservio/billing/backend!266adservio/billing/backendGeorge Murgoci27.7d87212
adservio/uni/backend!247adservio/uni/backendAndrei Alexandru11.0d53
adservio/devops/iac!81adservio/devops/iacRojan Shrestha5.9d30
adservio/devops/iac!82adservio/devops/iacRojan Shrestha5.9d50
adservio/frontend!2101adservio/frontendGeorge Murgoci5.8d270
adservio/subscriptions/backend!126adservio/subscriptions/backendGeorge Murgoci5.8d140
adservio/frontend!2109adservio/frontendIoana Ivan5.8d61
adservio/web!2738adservio/webIoana Ivan5.8d20
adservio/web!2725adservio/webCatalin Cojan5.1d3914
adservio/frontend!2107adservio/frontendPetronel Pavel5.0d131

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.