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-05-23 07:00 to 2026-05-30 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: 67 of 75 merged MRs (89.3%) showed no visible non-author review comment in GitLab.
  • `CR - Approved` is currently too weak as evidence on its own: 42.7% of merged MRs carried that label without any visible review discussion.
  • Queue health is poor: 87.5% of active open MRs are already older than 48 working hours. The oldest example is adservio/web!2091 at 228.1d 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 100.0% of them.
  • adservio/frontend is the highest-volume review surface with 27 merged MRs and only 11.1% visible review coverage. adservio/web is the next meaningful flow at 17 merges and 0.0% visible review coverage.
  • MR size is not the main story: median changed files were 2, and only 14.7% of merged MRs were above 20 files. Even the slowest merged example, adservio/frontend!1792, took 14.1d with 39 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 1.2h, so the dominant weakness is decision recording and merge discipline, not reviewer reaction speed.
  • With 87.5% of active MRs already stale, the open list is functioning more like inventory than prioritization support. adservio/web!2091 being open for 228.1d 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 100.0% of visible touches, review quality, continuity, and queue health all become sensitive to a very small set of people.
  • The spread between a 2-file median MR and a 14.1d longest merged cycle (adservio/frontend!1792, 39 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/web 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/web: 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

  • 67 of 75 merged MRs (89.3%) had no visible non-author review comment in GitLab.
  • 39 of 75 merged MRs (52.0%) carried the `CR - Approved` label.
  • 32 merged MRs (42.7%) were labeled `CR - Approved` without any visible non-author review comment.
  • 14.7% of merged MRs changed more than 20 files, while 4.0% changed more than 50 files.
  • Among MRs with visible review discussion, the median last-author-commit to first-review time was 1.2h.
  • The median last-author-commit to `CR - Approved` time was 1.9h.
  • The top 3 reviewers accounted for 100.0% of visible review touches.
  • 56 of 64 active open MRs (87.5%) were older than 48 working hours.
Merged MRs
Merged MRs inside the analysis window.
75
Open MRs
All currently open group MRs.
73
Active open MRs
Open MRs excluding drafts.
64
Draft open MRs
Open MRs marked draft/WIP.
9
Visible review rate
Merged MRs with at least one visible non-author GitLab comment.
10.7%
Merged without visible review comment
Merged MRs with zero visible non-author comments.
89.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.
10.7%
CR - Approved without visible review comment
CR-approved MRs with no visible non-author comment.
42.7%
Median MR created -> first review
Working time from MR creation to first visible non-author comment.
10.5h
Median last author commit -> first review
Working time from last author commit before review to first visible non-author comment.
1.2h
Median first review -> CR - Approved
Working time from first visible comment to CR-approved label after review start, else merge.
0.5h
Median MR created -> CR - Approved
Working time from MR creation to CR-approved label after review start, else merge.
13.3h
Median last author commit -> CR - Approved
Working time from last author commit before review to CR-approved label after review start, else merge.
1.9h
Median MR created -> merged
Working time from MR creation to merge.
4.9h
Median changed files
Median GitLab `changes_count` value.
2
MRs > 5 files
Merged MRs where `changes_count` is above 5.
32.0%
MRs > 10 files
Merged MRs where `changes_count` is above 10.
22.7%
MRs > 20 files
Merged MRs where `changes_count` is above 20.
14.7%
MRs > 50 files
Merged MRs where `changes_count` is above 50.
4.0%
Top 3 reviewer touch share
Share of visible review touches handled by the top 3 reviewers.
100.0%
Active open backlog rate
Non-draft open MRs older than 48 working hours.
87.5%

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

Median MR created -> first review10.5h
Median last author commit -> first review1.2h
Median MR created -> CR - Approved13.3h
Median first review -> CR - Approved0.5h
Median last author commit -> CR - Approved1.9h
Median MR created -> merged4.9h
Dragoș Ivan51362.5%
Achim Stefan2225.0%
Andrei Alexandru1212.5%
adservio/frontend2711.1%59.3%2
adservio/web170.0%70.6%2
adservio/helm2812.5%25.0%2.0
adservio/admission/backend40.0%50.0%9.5
adservio/billing/backend425.0%25.0%2.5
adservio/uni/backend425.0%75.0%12.5
adservio/social30.0%0.0%9
adservio/accommodations/backend20.0%0.0%3.0
adservio/subscriptions/backend250.0%50.0%11.0
adservio/devops/iac10.0%0.0%2
adservio/docgen2/backend1100.0%100.0%30
adservio/library/backend10.0%0.0%26

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/billing/backend!249[ADS-5007] Early bird2/5 Light4.6h0.2h4.7h
adservio/frontend!1875[ADS-7320][Stiri] - Antivirus [ADS-7677] News gallery images skeleton fix3/5 Solid0.3h0.3h0.6h
adservio/subscriptions/backend!113[ADS-5007] Early bird4/5 Strong3.0d0.7h3.0d
adservio/helm2!252[TEST-INFRA] Standardize test_* jobs; add test_admission; switch to npm run ci:run2/5 Light4.0h1.1h4.0h
adservio/frontend!1874[ADS-7643] - bugs on admission1/5 Very light2.0h1.3h2.5h
adservio/frontend!1856[TEST-INFRA] Migrate Cypress.env() → Cypress.expose() (Cypress 15)2/5 Light16.3h8.8h21.9h
adservio/docgen2/backend!126[ADS-7719]: Display Special exams grades4/5 Strong22.9h22.9h24.8h
adservio/uni/backend!202[TEST-INFRA] Add Cypress test infrastructure3/5 Solid24.5h24.6h25.1h

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 MRs67
With CR Label32
With Approval API8
  • 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 (67 MRs). Click again to collapse.
adservio/frontend!1849adservio/frontendFix Cypress exemption label importMarian Andrei2026-05-24
adservio/frontend!1848adservio/frontendFix Cypress exemption label importMarian Andrei2026-05-24
adservio/frontend!1841adservio/frontendRefactor Cypress configuration and cleanupDaniel Onisoru2026-05-24
adservio/web!2505adservio/web[ADS-6037] Dispare butonul ”descărcare”Petronel Pavel2026-05-25Yes
adservio/services/public-schools!92adservio/services/public-schools[ADS-4385] Broken link pentru solicitarePetronel Pavel2026-05-25Yes
adservio/frontend!1782adservio/frontend[ADS-7488] Posibilitatea de vizualizare/editare preferinte contAchim Stefan2026-05-25Yes
adservio/frontend!1853adservio/frontend[ADS-7650] Obligatiile trimise au label 'Netrimis'Achim Stefan2026-05-25Yes
adservio/web!2503adservio/web[ADS-4400] Nu functioneaza filtrele de la Conduita- Punctaje eleviPetronel Pavel2026-05-25Yes
adservio/frontend!1842adservio/frontend[ADS-7645] Certificates API fails when cerReason exceeds...Petronel Pavel2026-05-25Yes
adservio/frontend!1854adservio/frontend[ADS-4388] Descrierea nu pastreaza spatierea in taskPetronel Pavel2026-05-25Yes
adservio/frontend!1855adservio/frontend[ADS-7675]: Allow inactive schools to clear school infoIoana Ivan2026-05-25
adservio/uni/backend!199adservio/uni/backend[ADS-7600][ADS-7603] Rezultate Absolvire la nivel de Persoana + SerieAndrei Alexandru2026-05-25YesYes
adservio/web!2506adservio/web[ADS-6778][ADS-7384] Download file type exemption perm + absences validationsIonut Ciolan2026-05-26Yes
adservio/frontend!1858adservio/frontend[ADS-7693]: Check permission before calling time_off endpointIoana Ivan2026-05-26
adservio/helm2!254adservio/helm2upgrade max hpa for web and docgen2 api podsRojan Shrestha2026-05-26Yes
adservio/frontend!1859adservio/frontend[ADS-7693]: Check feature flag in staff attendance callsIoana Ivan2026-05-26
adservio/frontend!1860adservio/frontend[ADS-7619]: Check gradebook permissionIoana Ivan2026-05-26
adservio/web!2509adservio/web[ADS-7460] Export absences statisticsMarian Andrei2026-05-26
adservio/web!2510adservio/web[ADS-7460] StatisticsMarian Andrei2026-05-26
adservio/web!2511adservio/web[ADS-7685] download certificate from PortofolioMarian Andrei2026-05-26Yes
adservio/uni/backend!200adservio/uni/backend[ADS-7681] Import StudentAndrei Alexandru2026-05-26Yes
adservio/web!2508adservio/web[ADS-7674]: Fix logical condition in afiseazaMedie functionAndrei Dragan2026-05-26Yes
adservio/helm2!253adservio/helm2fix(dns): set kubednsIpAddress to actual kube-dns Service IP per envRojan Shrestha2026-05-26
adservio/admission/backend!146adservio/admission/backend[TEST-INFRA] Add Cypress test infrastructure for admissionDaniel Onisoru2026-05-26
adservio/billing/backend!247adservio/billing/backend[TEST-INFRA] Align Cypress tests with platform pattern; bump to 15.xDaniel Onisoru2026-05-26
adservio/web!2507adservio/web[TEST-INFRA] Align Cypress tests with platform pattern; bump to 15.xDaniel Onisoru2026-05-26Yes
adservio/library/backend!29adservio/library/backend[TEST-INFRA] Align Cypress tests with platform pattern; bump to 15.xDaniel Onisoru2026-05-26
adservio/social!21adservio/social[TEST-INFRA] Align Cypress tests; migrate Cypress.env() → Cypress.expose() / cy.env()Daniel Onisoru2026-05-26
adservio/subscriptions/backend!115adservio/subscriptions/backend[TEST-INFRA] Add Cypress test infrastructure with new tests/ + tests/cypress/ layoutDaniel Onisoru2026-05-26
adservio/helm2!255adservio/helm2fix(dns): set kubednsIpAddress to actual kube-dns Service IP per envRojan Shrestha2026-05-26
adservio/frontend!1819adservio/frontend[ADS-7262]: Catalog PHP fixesIoana Ivan2026-05-26Yes
adservio/web!2496adservio/web[ADS-7262]: Open React modals without IFrameIoana Ivan2026-05-26YesYes
adservio/social!23adservio/socialUsers classes hotfixAlex Murarescu2026-05-27
adservio/frontend!1866adservio/frontend[ADS-7676] La incheierea situatiei la materia PURTARE este afisat gresit...Petronel Pavel2026-05-27Yes
adservio/helm2!257adservio/helm2Set memory requests across charts (dev idle baseline)Daniel Onisoru2026-05-27
adservio/frontend!1865adservio/frontend[ADS-7709]: CleanupIoana Ivan2026-05-27
adservio/web!2512adservio/web[ADS-7709]: Open react modals, not mobile ones.Ioana Ivan2026-05-27
adservio/social!22adservio/socialCypress fixesAlex Murarescu2026-05-27
adservio/web!2514adservio/web[ADS-7695]: Enhance student average calculation with cycle filteringAndrei Dragan2026-05-27Yes
adservio/billing/backend!250adservio/billing/backend[local-processor-invoices] FixEdgar Alexa2026-05-27
adservio/devops/iac!32adservio/devops/iacprod RDS: catalog2 downgrade + tune only the firing alarmsRojan Shrestha2026-05-27
adservio/helm2!258adservio/helm2fix(redis): pin all Redis pods to corepoolRojan Shrestha2026-05-27
adservio/helm2!256adservio/helm2[TEST-INFRA] Wire test_uni into the deploy + notify orchestrationDaniel Onisoru2026-05-27
adservio/frontend!1864adservio/frontend[TEST-INFRA] Enhance test scripts for sharded reportingDaniel Onisoru2026-05-27
adservio/admission/backend!148adservio/admission/backend[ADS-7373-fixes] - Entity managerr instead of InjectRepoGeorge Murgoci2026-05-28Yes
adservio/frontend!1871adservio/frontendAccommodations payments fixesAchim Stefan2026-05-28Yes
adservio/accommodations/backend!67adservio/accommodations/backend[ADS-7710][ADS-7711] Delete refund payment bug fixed + student payment bug fixedIonut Ciolan2026-05-28
adservio/frontend!1867adservio/frontend[ADS-7706]: Fix mixture between insertDate and date.Ioana Ivan2026-05-28YesYes
adservio/frontend!1852adservio/frontend[ADS-5159] Questionnaires - Tests - completion deadlinePetronel Pavel2026-05-28Yes
adservio/accommodations/backend!68adservio/accommodations/backend[ADS-7711] Student payment event changesIonut Ciolan2026-05-28
adservio/frontend!1851adservio/frontend[ADS-5007] Early birdEdgar Alexa2026-05-28Yes
adservio/web!2516adservio/web[HOTFIX][ADS-7536] perm elev get/put - check user existsIonut Ciolan2026-05-28
adservio/helm2!259adservio/helm2fix(subscriptions-api): add preStop sleep for graceful shutdown during scale-downRojan Shrestha2026-05-28YesYes
adservio/web!2517adservio/web[ADS-2171] Apare numerotarea peste 100 pe doua randuriPetronel Pavel2026-05-28Yes
adservio/web!2518adservio/web[ADS-1184] Class absences statistics - added students to exportIonut Ciolan2026-05-28Yes
adservio/web!2520adservio/web[ADS-7614]: Ignore suspended teachers on login and sending notifications.Ioana Ivan2026-05-28Yes
adservio/billing/backend!251adservio/billing/backend[ADS-7426]: Session Application FeesDragoș Ivan2026-05-28
adservio/frontend!1857adservio/frontend[ADS-7426]: Candidate Apply PaymentsDragoș Ivan2026-05-28
adservio/admission/backend!147adservio/admission/backend[ADS-7426]: Candidate Application PaymentsDragoș Ivan2026-05-28
adservio/web!2515adservio/web[ADS-7230] Adaugare campuri filiera, profil si specializare in fisa scolaraPetronel Pavel2026-05-29Yes
adservio/frontend!1868adservio/frontend[ADS-7230] Adaugare campuri filiera, profil si specializare in fisa scolaraPetronel Pavel2026-05-29Yes
adservio/admission/backend!149adservio/admission/backend[ADS-7643] - admission bugsGeorge Murgoci2026-05-29Yes
adservio/uni/backend!203adservio/uni/backend[S: ADS-7636][ADS-7472] Ajustari UNMB - Ordine Structura universitarăAndrei Alexandru2026-05-29Yes
adservio/frontend!1870adservio/frontend[S: ADS-7636][ADS-7472] Ajustari UNMB - Ordine Structura universitarăAchim Stefan2026-05-29YesYes
adservio/web!2522adservio/web[HOTFIX] Get accounts/adservio - candidate infoIonut Ciolan2026-05-29Yes
adservio/frontend!1876adservio/frontendAccommodations - disable student payments 01.06.2026 – 31.10.2026Achim Stefan2026-05-29Yes
adservio/frontend!1792adservio/frontend[ADS-7476]: Plan de Invatamant - teste e2eDana Mihaela Maritca2026-05-29Yes

Oldest Active Open MRs (> 48 Working Hours)

adservio/web!2091adservio/webAndrei Dragan228.1d5
adservio/helm2!137adservio/helm2Raul Popovici204.2d0
adservio/services/websocket!8adservio/services/websocketRaul Popovici201.1d0
adservio/services/videothumb!5adservio/services/videothumbRaul Popovici201.1d0
adservio/services/fet-generator!9adservio/services/fet-generatorRaul Popovici201.1d0
adservio/ai/backend!62adservio/ai/backendRobert102.2d0
adservio/frontend!1556adservio/frontendGeorge Murgoci92.9d0
adservio/web!2344adservio/webGeorge Murgoci92.0d0
adservio/library/backend!26adservio/library/backendRaul Popovici72.0d0
adservio/subscriptions/backend!103adservio/subscriptions/backendEdgar Alexa70.0d4
adservio/frontend!1792adservio/frontendDana Mihaela Maritca14.1d390
adservio/frontend!1782adservio/frontendAchim Stefan11.9d110
adservio/frontend!1819adservio/frontendIoana Ivan6.2d290
adservio/web!2496adservio/webIoana Ivan6.2d40
adservio/subscriptions/backend!113adservio/subscriptions/backendEdgar Alexa4.0d46
adservio/frontend!1851adservio/frontendEdgar Alexa4.0d30
adservio/frontend!1852adservio/frontendPetronel Pavel3.1d10
adservio/admission/backend!147adservio/admission/backendDragoș Ivan3.0d500
adservio/frontend!1857adservio/frontendDragoș Ivan2.9d860
adservio/frontend!1842adservio/frontendPetronel Pavel2.0d30

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.