From a3b046a6b02c669d070355571c3ce14e161cf8cf Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Fri, 6 Nov 2026 17:10:57 -0600 Subject: [PATCH] fix: make ROSTER.md a dated snapshot and fix grid separators --- EMERITUS.md | 96 +++++++++++----------- ROSTER.md | 134 ++++++++++++++++--------------- test/roster_validation_test.dart | 67 +++++++++++++++- tool/generate_roster.dart | 74 +++++++++++++---- 4 files changed, 242 insertions(+), 129 deletions(-) diff --git a/EMERITUS.md b/EMERITUS.md index 6d1e161..9f88a8b 100644 --- a/EMERITUS.md +++ b/EMERITUS.md @@ -3,6 +3,8 @@ > [!IMPORTANT] > **Pending Q4 Audit:** No contributor roles or organization memberships have been changed yet. The Emeritus transitions listed below are pending the Q4 audit, which will be subject to a 30-day community review period before being finalized. +**Last updated:** 2026-10-27 + This directory honors **Dasher Emeritus** alumni—former Flutter Reviewers, Committers, and Maintainers who previously held roles on the contributor ladder and have stepped back from active contribution (< 10 contributions over the preceding 12 months). To maintain repository security, Dasher Emeriti do not remain members of the `flutter` GitHub organization. Instead, their contributions are recognized here, and they retain access to Flutter contributor channels on Discord (including `#hidden-chat`) and the announcement-only `flutter-contributors` Google Group (for project announcements and calendar invites to our recurring Flutter Contributor Roundtable and the Dash Forum, where contributors can present and get feedback on their [RFCs](https://github.com/flutter/rfc); the registration form is pinned in `#hidden-chat` on Discord) so they can stay in touch and more easily ramp back up onto the project if and when they choose to return. @@ -15,51 +17,51 @@ Returning Emeriti who resume contributing are automatically identified during qu ## Honored Alumni -[@0xZOne](https://github.com/0xZOne) • [@324mao](https://github.com/324mao) • [@a14n](https://github.com/a14n) • [@aaron-sf](https://github.com/aaron-sf) -[@adarshprabhu](https://github.com/adarshprabhu) • [@adicahyono](https://github.com/adicahyono) • [@akrwb](https://github.com/akrwb) • [@albertodev01](https://github.com/albertodev01) -[@alestiago](https://github.com/alestiago) • [@AlexV525](https://github.com/AlexV525) • [@allisonryan0002](https://github.com/allisonryan0002) • [@almasryalyoum](https://github.com/almasryalyoum) -[@alxp1982](https://github.com/alxp1982) • [@AnnaPS](https://github.com/AnnaPS) • [@antonellof](https://github.com/antonellof) • [@ANTONINEUTRON](https://github.com/ANTONINEUTRON) -[@AntonyKiragu](https://github.com/AntonyKiragu) • [@atrope](https://github.com/atrope) • [@AustinGTI](https://github.com/AustinGTI) • [@AyushBherwani1998](https://github.com/AyushBherwani1998) -[@azchohfi](https://github.com/azchohfi) • [@bartekpacia](https://github.com/bartekpacia) • [@BerkSpar](https://github.com/BerkSpar) • [@bernaferrari](https://github.com/bernaferrari) -[@brianegan](https://github.com/brianegan) • [@bruno-garcia](https://github.com/bruno-garcia) • [@bselwe](https://github.com/bselwe) • [@btobin](https://github.com/btobin) -[@budikhafiKLY](https://github.com/budikhafiKLY) • [@burakkasikci](https://github.com/burakkasikci) • [@CareF](https://github.com/CareF) • [@chenglu](https://github.com/chenglu) -[@chinmoy12c](https://github.com/chinmoy12c) • [@chriscraws](https://github.com/chriscraws) • [@cityxsuperapp](https://github.com/cityxsuperapp) • [@CoffeeDevUK](https://github.com/CoffeeDevUK) -[@ColdPaleLight](https://github.com/ColdPaleLight) • [@collinjackson](https://github.com/collinjackson) • [@dam-ease](https://github.com/dam-ease) • [@danagbemava-nc](https://github.com/danagbemava-nc) -[@darshankawar](https://github.com/darshankawar) • [@dclark-disney](https://github.com/dclark-disney) • [@diarmaidlindsay](https://github.com/diarmaidlindsay) • [@diegogawenda](https://github.com/diegogawenda) -[@diegoveloper](https://github.com/diegoveloper) • [@djol](https://github.com/djol) • [@dominikIncibit](https://github.com/dominikIncibit) • [@eda-nagao](https://github.com/eda-nagao) -[@eggfly](https://github.com/eggfly) • [@egoe](https://github.com/egoe) • [@Ehesp](https://github.com/Ehesp) • [@emma-roudabush-disney](https://github.com/emma-roudabush-disney) -[@emrebuyukozkan](https://github.com/emrebuyukozkan) • [@ened](https://github.com/ened) • [@enzoftware](https://github.com/enzoftware) • [@erickzanardo](https://github.com/erickzanardo) -[@eseidel](https://github.com/eseidel) • [@exaby73](https://github.com/exaby73) • [@farshad1489](https://github.com/farshad1489) • [@felangel](https://github.com/felangel) -[@FirentisTFW](https://github.com/FirentisTFW) • [@FlutterIssues](https://github.com/FlutterIssues) • [@FXschwartz](https://github.com/FXschwartz) • [@gastonliz](https://github.com/gastonliz) -[@gianfrancopapa](https://github.com/gianfrancopapa) • [@gnprice](https://github.com/gnprice) • [@guoguo338](https://github.com/guoguo338) • [@hamdikahloun](https://github.com/hamdikahloun) -[@harri35](https://github.com/harri35) • [@hbatagelo](https://github.com/hbatagelo) • [@helinanever](https://github.com/helinanever) • [@hgraceb](https://github.com/hgraceb) -[@HidenoriMatsubayashi](https://github.com/HidenoriMatsubayashi) • [@hillelcoren](https://github.com/hillelcoren) • [@Hiroaki-Kanai](https://github.com/Hiroaki-Kanai) • [@horiaciu](https://github.com/horiaciu) -[@IanSimpson](https://github.com/IanSimpson) • [@ihorkozar](https://github.com/ihorkozar) • [@irmasantoso](https://github.com/irmasantoso) • [@itsjen](https://github.com/itsjen) -[@ja-dfir](https://github.com/ja-dfir) • [@Jan-Stepien](https://github.com/Jan-Stepien) • [@jcollins-disney](https://github.com/jcollins-disney) • [@JErazo7](https://github.com/JErazo7) -[@jeroen-meijer](https://github.com/jeroen-meijer) • [@Jhon-Aires](https://github.com/Jhon-Aires) • [@jingshao-code](https://github.com/jingshao-code) • [@jnschulze](https://github.com/jnschulze) -[@jomblocoder](https://github.com/jomblocoder) • [@jorgecoca](https://github.com/jorgecoca) • [@jpnurmi](https://github.com/jpnurmi) • [@JsouLiang](https://github.com/JsouLiang) -[@Justian-SopraSteria](https://github.com/Justian-SopraSteria) • [@kaiceyd](https://github.com/kaiceyd) • [@kenvandine](https://github.com/kenvandine) • [@kevinburns426](https://github.com/kevinburns426) -[@kinla004](https://github.com/kinla004) • [@Kirpal](https://github.com/Kirpal) • [@kmillikin](https://github.com/kmillikin) • [@kokoro-team](https://github.com/kokoro-team) -[@kondoakio](https://github.com/kondoakio) • [@KristinBi](https://github.com/KristinBi) • [@kwg4](https://github.com/kwg4) • [@laramartin](https://github.com/laramartin) -[@leoafarias](https://github.com/leoafarias) • [@linxuebin1990](https://github.com/linxuebin1990) • [@LinXunFeng](https://github.com/LinXunFeng) • [@lucavenir](https://github.com/lucavenir) -[@luckysmg](https://github.com/luckysmg) • [@MacarenaSantos](https://github.com/MacarenaSantos) • [@magicianA](https://github.com/magicianA) • [@maheshj01](https://github.com/maheshj01) -[@martinduva](https://github.com/martinduva) • [@MaruQuarky](https://github.com/MaruQuarky) • [@marwfair](https://github.com/marwfair) • [@matiasleyba](https://github.com/matiasleyba) -[@matsuda-shota](https://github.com/matsuda-shota) • [@matthew-carroll](https://github.com/matthew-carroll) • [@matthewshahi](https://github.com/matthewshahi) • [@mattmartelnz](https://github.com/mattmartelnz) -[@MauriPastorini](https://github.com/MauriPastorini) • [@maxp89](https://github.com/maxp89) • [@mchudy](https://github.com/mchudy) • [@Menshoz](https://github.com/Menshoz) -[@mhadaily](https://github.com/mhadaily) • [@milezabaleta](https://github.com/milezabaleta) • [@miquelbeltran](https://github.com/miquelbeltran) • [@moffatman](https://github.com/moffatman) -[@MrUnfunny](https://github.com/MrUnfunny) • [@msangalli](https://github.com/msangalli) • [@mvanbeusekom](https://github.com/mvanbeusekom) • [@nikosportolos](https://github.com/nikosportolos) -[@nirunirosha401-personal](https://github.com/nirunirosha401-personal) • [@noboru-i](https://github.com/noboru-i) • [@nt4f04uNd](https://github.com/nt4f04uNd) • [@okursoftware](https://github.com/okursoftware) -[@omartinma](https://github.com/omartinma) • [@omatt](https://github.com/omatt) • [@pedromassango](https://github.com/pedromassango) • [@pingbird](https://github.com/pingbird) -[@PoojaB26](https://github.com/PoojaB26) • [@QMAshfaqAli](https://github.com/QMAshfaqAli) • [@rahulan](https://github.com/rahulan) • [@rajayogan](https://github.com/rajayogan) -[@renefloor](https://github.com/renefloor) • [@Rexios80](https://github.com/Rexios80) • [@rzambroni](https://github.com/rzambroni) • [@Salakar](https://github.com/Salakar) -[@scarletteliza](https://github.com/scarletteliza) • [@scutlight](https://github.com/scutlight) • [@SenseiMinimal](https://github.com/SenseiMinimal) • [@shirbayat](https://github.com/shirbayat) -[@simpson-peter](https://github.com/simpson-peter) • [@slightfoot](https://github.com/slightfoot) • [@SofiaRey](https://github.com/SofiaRey) • [@spideythewebhead](https://github.com/spideythewebhead) -[@spjass](https://github.com/spjass) • [@spratt-disney](https://github.com/spratt-disney) • [@ssmitienko](https://github.com/ssmitienko) • [@sushanthmshetty](https://github.com/sushanthmshetty) -[@swavkulinski](https://github.com/swavkulinski) • [@Swiftaxe](https://github.com/Swiftaxe) • [@tanercc](https://github.com/tanercc) • [@tcannon-disney](https://github.com/tcannon-disney) -[@tfabacher-dp](https://github.com/tfabacher-dp) • [@tgucio](https://github.com/tgucio) • [@thekorn](https://github.com/thekorn) • [@TimoPieti](https://github.com/TimoPieti) -[@tomgilder](https://github.com/tomgilder) • [@tpiaggio](https://github.com/tpiaggio) • [@trevorplant](https://github.com/trevorplant) • [@tsurumotokdi](https://github.com/tsurumotokdi) -[@udayon](https://github.com/udayon) • [@vaind](https://github.com/vaind) • [@valentinallavayol](https://github.com/valentinallavayol) • [@Vanethos](https://github.com/Vanethos) -[@vickyduran](https://github.com/vickyduran) • [@wakita181009](https://github.com/wakita181009) • [@wangying3426](https://github.com/wangying3426) • [@werainkhatri](https://github.com/werainkhatri) -[@whesse](https://github.com/whesse) • [@workerbee22](https://github.com/workerbee22) • [@wprater](https://github.com/wprater) • [@xm0128](https://github.com/xm0128) -[@xu-baolin](https://github.com/xu-baolin) • [@YeungKC](https://github.com/YeungKC) • [@yiiim](https://github.com/yiiim) • [@ymgn-dev](https://github.com/ymgn-dev) +[@0xZOne](https://github.com/0xZOne) • [@324mao](https://github.com/324mao) • [@a14n](https://github.com/a14n) • [@aaron-sf](https://github.com/aaron-sf) • +[@adarshprabhu](https://github.com/adarshprabhu) • [@adicahyono](https://github.com/adicahyono) • [@akrwb](https://github.com/akrwb) • [@albertodev01](https://github.com/albertodev01) • +[@alestiago](https://github.com/alestiago) • [@AlexV525](https://github.com/AlexV525) • [@allisonryan0002](https://github.com/allisonryan0002) • [@almasryalyoum](https://github.com/almasryalyoum) • +[@alxp1982](https://github.com/alxp1982) • [@AnnaPS](https://github.com/AnnaPS) • [@antonellof](https://github.com/antonellof) • [@ANTONINEUTRON](https://github.com/ANTONINEUTRON) • +[@AntonyKiragu](https://github.com/AntonyKiragu) • [@atrope](https://github.com/atrope) • [@AustinGTI](https://github.com/AustinGTI) • [@AyushBherwani1998](https://github.com/AyushBherwani1998) • +[@azchohfi](https://github.com/azchohfi) • [@bartekpacia](https://github.com/bartekpacia) • [@BerkSpar](https://github.com/BerkSpar) • [@bernaferrari](https://github.com/bernaferrari) • +[@brianegan](https://github.com/brianegan) • [@bruno-garcia](https://github.com/bruno-garcia) • [@bselwe](https://github.com/bselwe) • [@btobin](https://github.com/btobin) • +[@budikhafiKLY](https://github.com/budikhafiKLY) • [@burakkasikci](https://github.com/burakkasikci) • [@CareF](https://github.com/CareF) • [@chenglu](https://github.com/chenglu) • +[@chinmoy12c](https://github.com/chinmoy12c) • [@chriscraws](https://github.com/chriscraws) • [@cityxsuperapp](https://github.com/cityxsuperapp) • [@CoffeeDevUK](https://github.com/CoffeeDevUK) • +[@ColdPaleLight](https://github.com/ColdPaleLight) • [@collinjackson](https://github.com/collinjackson) • [@dam-ease](https://github.com/dam-ease) • [@danagbemava-nc](https://github.com/danagbemava-nc) • +[@darshankawar](https://github.com/darshankawar) • [@dclark-disney](https://github.com/dclark-disney) • [@diarmaidlindsay](https://github.com/diarmaidlindsay) • [@diegogawenda](https://github.com/diegogawenda) • +[@diegoveloper](https://github.com/diegoveloper) • [@djol](https://github.com/djol) • [@dominikIncibit](https://github.com/dominikIncibit) • [@eda-nagao](https://github.com/eda-nagao) • +[@eggfly](https://github.com/eggfly) • [@egoe](https://github.com/egoe) • [@Ehesp](https://github.com/Ehesp) • [@emma-roudabush-disney](https://github.com/emma-roudabush-disney) • +[@emrebuyukozkan](https://github.com/emrebuyukozkan) • [@ened](https://github.com/ened) • [@enzoftware](https://github.com/enzoftware) • [@erickzanardo](https://github.com/erickzanardo) • +[@eseidel](https://github.com/eseidel) • [@exaby73](https://github.com/exaby73) • [@farshad1489](https://github.com/farshad1489) • [@felangel](https://github.com/felangel) • +[@FirentisTFW](https://github.com/FirentisTFW) • [@FlutterIssues](https://github.com/FlutterIssues) • [@FXschwartz](https://github.com/FXschwartz) • [@gastonliz](https://github.com/gastonliz) • +[@gianfrancopapa](https://github.com/gianfrancopapa) • [@gnprice](https://github.com/gnprice) • [@guoguo338](https://github.com/guoguo338) • [@hamdikahloun](https://github.com/hamdikahloun) • +[@harri35](https://github.com/harri35) • [@hbatagelo](https://github.com/hbatagelo) • [@helinanever](https://github.com/helinanever) • [@hgraceb](https://github.com/hgraceb) • +[@HidenoriMatsubayashi](https://github.com/HidenoriMatsubayashi) • [@hillelcoren](https://github.com/hillelcoren) • [@Hiroaki-Kanai](https://github.com/Hiroaki-Kanai) • [@horiaciu](https://github.com/horiaciu) • +[@IanSimpson](https://github.com/IanSimpson) • [@ihorkozar](https://github.com/ihorkozar) • [@irmasantoso](https://github.com/irmasantoso) • [@itsjen](https://github.com/itsjen) • +[@ja-dfir](https://github.com/ja-dfir) • [@Jan-Stepien](https://github.com/Jan-Stepien) • [@jcollins-disney](https://github.com/jcollins-disney) • [@JErazo7](https://github.com/JErazo7) • +[@jeroen-meijer](https://github.com/jeroen-meijer) • [@Jhon-Aires](https://github.com/Jhon-Aires) • [@jingshao-code](https://github.com/jingshao-code) • [@jnschulze](https://github.com/jnschulze) • +[@jomblocoder](https://github.com/jomblocoder) • [@jorgecoca](https://github.com/jorgecoca) • [@jpnurmi](https://github.com/jpnurmi) • [@JsouLiang](https://github.com/JsouLiang) • +[@Justian-SopraSteria](https://github.com/Justian-SopraSteria) • [@kaiceyd](https://github.com/kaiceyd) • [@kenvandine](https://github.com/kenvandine) • [@kevinburns426](https://github.com/kevinburns426) • +[@kinla004](https://github.com/kinla004) • [@Kirpal](https://github.com/Kirpal) • [@kmillikin](https://github.com/kmillikin) • [@kokoro-team](https://github.com/kokoro-team) • +[@kondoakio](https://github.com/kondoakio) • [@KristinBi](https://github.com/KristinBi) • [@kwg4](https://github.com/kwg4) • [@laramartin](https://github.com/laramartin) • +[@leoafarias](https://github.com/leoafarias) • [@linxuebin1990](https://github.com/linxuebin1990) • [@LinXunFeng](https://github.com/LinXunFeng) • [@lucavenir](https://github.com/lucavenir) • +[@luckysmg](https://github.com/luckysmg) • [@MacarenaSantos](https://github.com/MacarenaSantos) • [@magicianA](https://github.com/magicianA) • [@maheshj01](https://github.com/maheshj01) • +[@martinduva](https://github.com/martinduva) • [@MaruQuarky](https://github.com/MaruQuarky) • [@marwfair](https://github.com/marwfair) • [@matiasleyba](https://github.com/matiasleyba) • +[@matsuda-shota](https://github.com/matsuda-shota) • [@matthew-carroll](https://github.com/matthew-carroll) • [@matthewshahi](https://github.com/matthewshahi) • [@mattmartelnz](https://github.com/mattmartelnz) • +[@MauriPastorini](https://github.com/MauriPastorini) • [@maxp89](https://github.com/maxp89) • [@mchudy](https://github.com/mchudy) • [@Menshoz](https://github.com/Menshoz) • +[@mhadaily](https://github.com/mhadaily) • [@milezabaleta](https://github.com/milezabaleta) • [@miquelbeltran](https://github.com/miquelbeltran) • [@moffatman](https://github.com/moffatman) • +[@MrUnfunny](https://github.com/MrUnfunny) • [@msangalli](https://github.com/msangalli) • [@mvanbeusekom](https://github.com/mvanbeusekom) • [@nikosportolos](https://github.com/nikosportolos) • +[@nirunirosha401-personal](https://github.com/nirunirosha401-personal) • [@noboru-i](https://github.com/noboru-i) • [@nt4f04uNd](https://github.com/nt4f04uNd) • [@okursoftware](https://github.com/okursoftware) • +[@omartinma](https://github.com/omartinma) • [@omatt](https://github.com/omatt) • [@pedromassango](https://github.com/pedromassango) • [@pingbird](https://github.com/pingbird) • +[@PoojaB26](https://github.com/PoojaB26) • [@QMAshfaqAli](https://github.com/QMAshfaqAli) • [@rahulan](https://github.com/rahulan) • [@rajayogan](https://github.com/rajayogan) • +[@renefloor](https://github.com/renefloor) • [@Rexios80](https://github.com/Rexios80) • [@rzambroni](https://github.com/rzambroni) • [@Salakar](https://github.com/Salakar) • +[@scarletteliza](https://github.com/scarletteliza) • [@scutlight](https://github.com/scutlight) • [@SenseiMinimal](https://github.com/SenseiMinimal) • [@shirbayat](https://github.com/shirbayat) • +[@simpson-peter](https://github.com/simpson-peter) • [@slightfoot](https://github.com/slightfoot) • [@SofiaRey](https://github.com/SofiaRey) • [@spideythewebhead](https://github.com/spideythewebhead) • +[@spjass](https://github.com/spjass) • [@spratt-disney](https://github.com/spratt-disney) • [@ssmitienko](https://github.com/ssmitienko) • [@sushanthmshetty](https://github.com/sushanthmshetty) • +[@swavkulinski](https://github.com/swavkulinski) • [@Swiftaxe](https://github.com/Swiftaxe) • [@tanercc](https://github.com/tanercc) • [@tcannon-disney](https://github.com/tcannon-disney) • +[@tfabacher-dp](https://github.com/tfabacher-dp) • [@tgucio](https://github.com/tgucio) • [@thekorn](https://github.com/thekorn) • [@TimoPieti](https://github.com/TimoPieti) • +[@tomgilder](https://github.com/tomgilder) • [@tpiaggio](https://github.com/tpiaggio) • [@trevorplant](https://github.com/trevorplant) • [@tsurumotokdi](https://github.com/tsurumotokdi) • +[@udayon](https://github.com/udayon) • [@vaind](https://github.com/vaind) • [@valentinallavayol](https://github.com/valentinallavayol) • [@Vanethos](https://github.com/Vanethos) • +[@vickyduran](https://github.com/vickyduran) • [@wakita181009](https://github.com/wakita181009) • [@wangying3426](https://github.com/wangying3426) • [@werainkhatri](https://github.com/werainkhatri) • +[@whesse](https://github.com/whesse) • [@workerbee22](https://github.com/workerbee22) • [@wprater](https://github.com/wprater) • [@xm0128](https://github.com/xm0128) • +[@xu-baolin](https://github.com/xu-baolin) • [@YeungKC](https://github.com/YeungKC) • [@yiiim](https://github.com/yiiim) • [@ymgn-dev](https://github.com/ymgn-dev) • [@zhongwuzw](https://github.com/zhongwuzw) • [@Zudah228](https://github.com/Zudah228) diff --git a/ROSTER.md b/ROSTER.md index 8868855..e2622c1 100644 --- a/ROSTER.md +++ b/ROSTER.md @@ -3,71 +3,73 @@ > [!IMPORTANT] > **Pending Q4 Audit:** No contributor roles or permissions have been changed yet. The placements listed below are initial baseline assignments pending the Q4 audit, which will be subject to a 30-day community review period before being finalized. +**Last updated:** 2026-10-27 + This directory lists active Flutter Contributor Ladder members. Honorary alumni who have stepped back from active contribution and exited the GitHub organization are listed in [EMERITUS.md](EMERITUS.md). Governance details and tier qualifications are specified in [docs/LADDER.md](docs/LADDER.md). > [!NOTE] -> This file is automatically generated from `data/contributors.yaml`. +> This file is automatically generated from `data/contributors.yaml` and reflects 12-month activity counts at the time the roster was last updated. > To update, edit `data/contributors.yaml` and run `dart run tool/generate_roster.dart`. ## Maintainers (`@flutter/maintainers`) Maintainers hold GitHub Write permissions and organization moderation privileges, and belong to `@flutter/maintainers` (a child team of `@flutter/flutter-hackers`). -[@aam](https://github.com/aam) • [@abdallahshaban557](https://github.com/abdallahshaban557) • [@alexmarkov](https://github.com/alexmarkov) • [@amcasari](https://github.com/amcasari) -[@ananci](https://github.com/ananci) • [@anderdobo](https://github.com/anderdobo) • [@andrewkolos](https://github.com/andrewkolos) • [@andywolff](https://github.com/andywolff) -[@another-rex](https://github.com/another-rex) • [@apwilson](https://github.com/apwilson) • [@arbreng](https://github.com/arbreng) • [@athomas](https://github.com/athomas) -[@b-luk](https://github.com/b-luk) • [@bdero](https://github.com/bdero) • [@biggs0125](https://github.com/biggs0125) • [@bkonyi](https://github.com/bkonyi) -[@bparrishMines](https://github.com/bparrishMines) • [@brianquinlan](https://github.com/brianquinlan) • [@bwilkerson](https://github.com/bwilkerson) • [@camsim99](https://github.com/camsim99) -[@CarlosMendonca](https://github.com/CarlosMendonca) • [@caroqliu](https://github.com/caroqliu) • [@catharp](https://github.com/catharp) • [@cbracken](https://github.com/cbracken) -[@chandarrengoog](https://github.com/chandarrengoog) • [@chaselatta](https://github.com/chaselatta) • [@chingjun](https://github.com/chingjun) • [@chloestefantsova](https://github.com/chloestefantsova) -[@chrisraygill](https://github.com/chrisraygill) • [@ChristianEdwardPadilla](https://github.com/ChristianEdwardPadilla) • [@chunhtai](https://github.com/chunhtai) • [@cj-radcliff](https://github.com/cj-radcliff) -[@cligh](https://github.com/cligh) • [@conooi](https://github.com/conooi) • [@cpsloal](https://github.com/cpsloal) • [@craiglabenz](https://github.com/craiglabenz) -[@danielleon-cmd](https://github.com/danielleon-cmd) • [@DanTup](https://github.com/DanTup) • [@danxorzum](https://github.com/danxorzum) • [@davidmorgan](https://github.com/davidmorgan) -[@DBowen33](https://github.com/DBowen33) • [@dcharkes](https://github.com/dcharkes) • [@di](https://github.com/di) • [@Dipakkumarjena](https://github.com/Dipakkumarjena) -[@ditman](https://github.com/ditman) • [@dkbharti-glitch](https://github.com/dkbharti-glitch) • [@dkwingsmt](https://github.com/dkwingsmt) • [@domesticmouse](https://github.com/domesticmouse) -[@dsmcl](https://github.com/dsmcl) • [@dustingreen](https://github.com/dustingreen) • [@eieio](https://github.com/eieio) • [@elliette](https://github.com/elliette) -[@emckean](https://github.com/emckean) • [@ericwindmill](https://github.com/ericwindmill) • [@essjay05](https://github.com/essjay05) • [@ethanalee-work](https://github.com/ethanalee-work) -[@everyplace](https://github.com/everyplace) • [@eyebrowsoffire](https://github.com/eyebrowsoffire) • [@flar](https://github.com/flar) • [@flutter-zl](https://github.com/flutter-zl) -[@gaaclarke](https://github.com/gaaclarke) • [@GemmaJAy](https://github.com/GemmaJAy) • [@gitrey](https://github.com/gitrey) • [@gmackall](https://github.com/gmackall) -[@goderbauer](https://github.com/goderbauer) • [@grouma](https://github.com/grouma) • [@gspencergoog](https://github.com/gspencergoog) • [@guidezpl](https://github.com/guidezpl) -[@h9jiang](https://github.com/h9jiang) • [@hannah-hyj](https://github.com/hannah-hyj) • [@harryterkelsen](https://github.com/harryterkelsen) • [@helin24](https://github.com/helin24) -[@hellohuanlin](https://github.com/hellohuanlin) • [@Hixie](https://github.com/Hixie) • [@ievdokdm](https://github.com/ievdokdm) • [@iinozemtsev](https://github.com/iinozemtsev) -[@InMatrix](https://github.com/InMatrix) • [@itsjustkevin](https://github.com/itsjustkevin) • [@jacob314](https://github.com/jacob314) • [@jacobsimionato](https://github.com/jacobsimionato) -[@jaeheon](https://github.com/jaeheon) • [@jakemac53](https://github.com/jakemac53) • [@jalseth](https://github.com/jalseth) • [@jensjoha](https://github.com/jensjoha) -[@jesskuras](https://github.com/jesskuras) • [@jesswrd](https://github.com/jesswrd) • [@jiahaog](https://github.com/jiahaog) • [@jmagman](https://github.com/jmagman) -[@joefspiro](https://github.com/joefspiro) • [@johnmccutchan](https://github.com/johnmccutchan) • [@johnniwinther](https://github.com/johnniwinther) • [@johnpryan](https://github.com/johnpryan) -[@johnsonmh](https://github.com/johnsonmh) • [@jokerttu](https://github.com/jokerttu) • [@jonasfj](https://github.com/jonasfj) • [@jonathanmetzman](https://github.com/jonathanmetzman) -[@josemontespg](https://github.com/josemontespg) • [@joshualitt](https://github.com/joshualitt) • [@jq129398](https://github.com/jq129398) • [@jrwang](https://github.com/jrwang) -[@jtmcdole](https://github.com/jtmcdole) • [@juan-mora-google](https://github.com/juan-mora-google) • [@justinmc](https://github.com/justinmc) • [@jwill](https://github.com/jwill) -[@jwren](https://github.com/jwren) • [@jyameo](https://github.com/jyameo) • [@kallentu](https://github.com/kallentu) • [@keertip](https://github.com/keertip) -[@kentnguyen99](https://github.com/kentnguyen99) • [@kenzieschmoll](https://github.com/kenzieschmoll) • [@kevmoo](https://github.com/kevmoo) • [@kevya-google](https://github.com/kevya-google) -[@khanhnwin](https://github.com/khanhnwin) • [@kkboateng](https://github.com/kkboateng) • [@knopp](https://github.com/knopp) • [@lamek](https://github.com/lamek) -[@leafpetersen](https://github.com/leafpetersen) • [@liamappelbe](https://github.com/liamappelbe) • [@loic-sharma](https://github.com/loic-sharma) • [@LongCatIsLooong](https://github.com/LongCatIsLooong) -[@LouiseHsu](https://github.com/LouiseHsu) • [@mariamhas](https://github.com/mariamhas) • [@Markzipan](https://github.com/Markzipan) • [@MaryaBelanger](https://github.com/MaryaBelanger) -[@maryx](https://github.com/maryx) • [@mattkae](https://github.com/mattkae) • [@mbcorona](https://github.com/mbcorona) • [@mboetger](https://github.com/mboetger) -[@mbrase](https://github.com/mbrase) • [@mdebbar](https://github.com/mdebbar) • [@michaelkedar](https://github.com/michaelkedar) • [@mikaelkomu](https://github.com/mikaelkomu) -[@mit-mit](https://github.com/mit-mit) • [@mkustermann](https://github.com/mkustermann) • [@mmohankrishna-lab](https://github.com/mmohankrishna-lab) • [@mosuem](https://github.com/mosuem) -[@mraleph](https://github.com/mraleph) • [@munificent](https://github.com/munificent) • [@muralikrishmt](https://github.com/muralikrishmt) • [@MuthuGCodes](https://github.com/MuthuGCodes) -[@nan-yu](https://github.com/nan-yu) • [@natebosch](https://github.com/natebosch) • [@nickyringland](https://github.com/nickyringland) • [@nshahan](https://github.com/nshahan) -[@nuritzi](https://github.com/nuritzi) • [@okorohelijah](https://github.com/okorohelijah) • [@oliverchang](https://github.com/oliverchang) • [@omerlevran46](https://github.com/omerlevran46) -[@parlough](https://github.com/parlough) • [@paul-geoghegan](https://github.com/paul-geoghegan) • [@peixinli](https://github.com/peixinli) • [@pennzht](https://github.com/pennzht) -[@Piinks](https://github.com/Piinks) • [@pjkammer](https://github.com/pjkammer) • [@polina-c](https://github.com/polina-c) • [@pq](https://github.com/pq) -[@precision](https://github.com/precision) • [@preethi0228-git](https://github.com/preethi0228-git) • [@puneetkukreja98](https://github.com/puneetkukreja98) • [@QuncCccccc](https://github.com/QuncCccccc) -[@ranbeuer](https://github.com/ranbeuer) • [@redbrogdon](https://github.com/redbrogdon) • [@reidbaker](https://github.com/reidbaker) • [@renaudd](https://github.com/renaudd) -[@renyou](https://github.com/renyou) • [@Renzo-Olivares](https://github.com/Renzo-Olivares) • [@rmacnak-google](https://github.com/rmacnak-google) • [@robert-ancell](https://github.com/robert-ancell) -[@rodydavis](https://github.com/rodydavis) • [@ronit-cloudsufi](https://github.com/ronit-cloudsufi) • [@rspier](https://github.com/rspier) • [@Rusino](https://github.com/Rusino) -[@samuli-codemate](https://github.com/samuli-codemate) • [@saurabh-mirajkar](https://github.com/saurabh-mirajkar) • [@Saviq](https://github.com/Saviq) • [@scheglov](https://github.com/scheglov) -[@schultek](https://github.com/schultek) • [@sethladd](https://github.com/sethladd) • [@sfshaza2](https://github.com/sfshaza2) • [@shanecglass](https://github.com/shanecglass) -[@sigmundch](https://github.com/sigmundch) • [@sigurdm](https://github.com/sigurdm) • [@snikiche](https://github.com/snikiche) • [@sokoloff06](https://github.com/sokoloff06) -[@srawlins](https://github.com/srawlins) • [@srujzs](https://github.com/srujzs) • [@sstrickl](https://github.com/sstrickl) • [@stef-luo](https://github.com/stef-luo) -[@stereotype441](https://github.com/stereotype441) • [@stevemessick](https://github.com/stevemessick) • [@studgeek](https://github.com/studgeek) • [@suertreus](https://github.com/suertreus) -[@suryaKommana2662](https://github.com/suryaKommana2662) • [@szakarias](https://github.com/szakarias) • [@tarobins](https://github.com/tarobins) • [@tarrinneal](https://github.com/tarrinneal) -[@tasnim-khan](https://github.com/tasnim-khan) • [@thagomizer](https://github.com/thagomizer) • [@thkim1011](https://github.com/thkim1011) • [@timothyhoang-google](https://github.com/timothyhoang-google) -[@twerske](https://github.com/twerske) • [@utopicnarwhal](https://github.com/utopicnarwhal) • [@uysalere](https://github.com/uysalere) • [@vashworth](https://github.com/vashworth) -[@victogomez-cs](https://github.com/victogomez-cs) • [@victorsanni](https://github.com/victorsanni) • [@vivahome2](https://github.com/vivahome2) • [@vsmenon](https://github.com/vsmenon) -[@walley892](https://github.com/walley892) • [@xster](https://github.com/xster) • [@yjbanov](https://github.com/yjbanov) • [@zanderso](https://github.com/zanderso) +[@aam](https://github.com/aam) • [@abdallahshaban557](https://github.com/abdallahshaban557) • [@alexmarkov](https://github.com/alexmarkov) • [@amcasari](https://github.com/amcasari) • +[@ananci](https://github.com/ananci) • [@anderdobo](https://github.com/anderdobo) • [@andrewkolos](https://github.com/andrewkolos) • [@andywolff](https://github.com/andywolff) • +[@another-rex](https://github.com/another-rex) • [@apwilson](https://github.com/apwilson) • [@arbreng](https://github.com/arbreng) • [@athomas](https://github.com/athomas) • +[@b-luk](https://github.com/b-luk) • [@bdero](https://github.com/bdero) • [@biggs0125](https://github.com/biggs0125) • [@bkonyi](https://github.com/bkonyi) • +[@bparrishMines](https://github.com/bparrishMines) • [@brianquinlan](https://github.com/brianquinlan) • [@bwilkerson](https://github.com/bwilkerson) • [@camsim99](https://github.com/camsim99) • +[@CarlosMendonca](https://github.com/CarlosMendonca) • [@caroqliu](https://github.com/caroqliu) • [@catharp](https://github.com/catharp) • [@cbracken](https://github.com/cbracken) • +[@chandarrengoog](https://github.com/chandarrengoog) • [@chaselatta](https://github.com/chaselatta) • [@chingjun](https://github.com/chingjun) • [@chloestefantsova](https://github.com/chloestefantsova) • +[@chrisraygill](https://github.com/chrisraygill) • [@ChristianEdwardPadilla](https://github.com/ChristianEdwardPadilla) • [@chunhtai](https://github.com/chunhtai) • [@cj-radcliff](https://github.com/cj-radcliff) • +[@cligh](https://github.com/cligh) • [@conooi](https://github.com/conooi) • [@cpsloal](https://github.com/cpsloal) • [@craiglabenz](https://github.com/craiglabenz) • +[@danielleon-cmd](https://github.com/danielleon-cmd) • [@DanTup](https://github.com/DanTup) • [@danxorzum](https://github.com/danxorzum) • [@davidmorgan](https://github.com/davidmorgan) • +[@DBowen33](https://github.com/DBowen33) • [@dcharkes](https://github.com/dcharkes) • [@di](https://github.com/di) • [@Dipakkumarjena](https://github.com/Dipakkumarjena) • +[@ditman](https://github.com/ditman) • [@dkbharti-glitch](https://github.com/dkbharti-glitch) • [@dkwingsmt](https://github.com/dkwingsmt) • [@domesticmouse](https://github.com/domesticmouse) • +[@dsmcl](https://github.com/dsmcl) • [@dustingreen](https://github.com/dustingreen) • [@eieio](https://github.com/eieio) • [@elliette](https://github.com/elliette) • +[@emckean](https://github.com/emckean) • [@ericwindmill](https://github.com/ericwindmill) • [@essjay05](https://github.com/essjay05) • [@ethanalee-work](https://github.com/ethanalee-work) • +[@everyplace](https://github.com/everyplace) • [@eyebrowsoffire](https://github.com/eyebrowsoffire) • [@flar](https://github.com/flar) • [@flutter-zl](https://github.com/flutter-zl) • +[@gaaclarke](https://github.com/gaaclarke) • [@GemmaJAy](https://github.com/GemmaJAy) • [@gitrey](https://github.com/gitrey) • [@gmackall](https://github.com/gmackall) • +[@goderbauer](https://github.com/goderbauer) • [@grouma](https://github.com/grouma) • [@gspencergoog](https://github.com/gspencergoog) • [@guidezpl](https://github.com/guidezpl) • +[@h9jiang](https://github.com/h9jiang) • [@hannah-hyj](https://github.com/hannah-hyj) • [@harryterkelsen](https://github.com/harryterkelsen) • [@helin24](https://github.com/helin24) • +[@hellohuanlin](https://github.com/hellohuanlin) • [@Hixie](https://github.com/Hixie) • [@ievdokdm](https://github.com/ievdokdm) • [@iinozemtsev](https://github.com/iinozemtsev) • +[@InMatrix](https://github.com/InMatrix) • [@itsjustkevin](https://github.com/itsjustkevin) • [@jacob314](https://github.com/jacob314) • [@jacobsimionato](https://github.com/jacobsimionato) • +[@jaeheon](https://github.com/jaeheon) • [@jakemac53](https://github.com/jakemac53) • [@jalseth](https://github.com/jalseth) • [@jensjoha](https://github.com/jensjoha) • +[@jesskuras](https://github.com/jesskuras) • [@jesswrd](https://github.com/jesswrd) • [@jiahaog](https://github.com/jiahaog) • [@jmagman](https://github.com/jmagman) • +[@joefspiro](https://github.com/joefspiro) • [@johnmccutchan](https://github.com/johnmccutchan) • [@johnniwinther](https://github.com/johnniwinther) • [@johnpryan](https://github.com/johnpryan) • +[@johnsonmh](https://github.com/johnsonmh) • [@jokerttu](https://github.com/jokerttu) • [@jonasfj](https://github.com/jonasfj) • [@jonathanmetzman](https://github.com/jonathanmetzman) • +[@josemontespg](https://github.com/josemontespg) • [@joshualitt](https://github.com/joshualitt) • [@jq129398](https://github.com/jq129398) • [@jrwang](https://github.com/jrwang) • +[@jtmcdole](https://github.com/jtmcdole) • [@juan-mora-google](https://github.com/juan-mora-google) • [@justinmc](https://github.com/justinmc) • [@jwill](https://github.com/jwill) • +[@jwren](https://github.com/jwren) • [@jyameo](https://github.com/jyameo) • [@kallentu](https://github.com/kallentu) • [@keertip](https://github.com/keertip) • +[@kentnguyen99](https://github.com/kentnguyen99) • [@kenzieschmoll](https://github.com/kenzieschmoll) • [@kevmoo](https://github.com/kevmoo) • [@kevya-google](https://github.com/kevya-google) • +[@khanhnwin](https://github.com/khanhnwin) • [@kkboateng](https://github.com/kkboateng) • [@knopp](https://github.com/knopp) • [@lamek](https://github.com/lamek) • +[@leafpetersen](https://github.com/leafpetersen) • [@liamappelbe](https://github.com/liamappelbe) • [@loic-sharma](https://github.com/loic-sharma) • [@LongCatIsLooong](https://github.com/LongCatIsLooong) • +[@LouiseHsu](https://github.com/LouiseHsu) • [@mariamhas](https://github.com/mariamhas) • [@Markzipan](https://github.com/Markzipan) • [@MaryaBelanger](https://github.com/MaryaBelanger) • +[@maryx](https://github.com/maryx) • [@mattkae](https://github.com/mattkae) • [@mbcorona](https://github.com/mbcorona) • [@mboetger](https://github.com/mboetger) • +[@mbrase](https://github.com/mbrase) • [@mdebbar](https://github.com/mdebbar) • [@michaelkedar](https://github.com/michaelkedar) • [@mikaelkomu](https://github.com/mikaelkomu) • +[@mit-mit](https://github.com/mit-mit) • [@mkustermann](https://github.com/mkustermann) • [@mmohankrishna-lab](https://github.com/mmohankrishna-lab) • [@mosuem](https://github.com/mosuem) • +[@mraleph](https://github.com/mraleph) • [@munificent](https://github.com/munificent) • [@muralikrishmt](https://github.com/muralikrishmt) • [@MuthuGCodes](https://github.com/MuthuGCodes) • +[@nan-yu](https://github.com/nan-yu) • [@natebosch](https://github.com/natebosch) • [@nickyringland](https://github.com/nickyringland) • [@nshahan](https://github.com/nshahan) • +[@nuritzi](https://github.com/nuritzi) • [@okorohelijah](https://github.com/okorohelijah) • [@oliverchang](https://github.com/oliverchang) • [@omerlevran46](https://github.com/omerlevran46) • +[@parlough](https://github.com/parlough) • [@paul-geoghegan](https://github.com/paul-geoghegan) • [@peixinli](https://github.com/peixinli) • [@pennzht](https://github.com/pennzht) • +[@Piinks](https://github.com/Piinks) • [@pjkammer](https://github.com/pjkammer) • [@polina-c](https://github.com/polina-c) • [@pq](https://github.com/pq) • +[@precision](https://github.com/precision) • [@preethi0228-git](https://github.com/preethi0228-git) • [@puneetkukreja98](https://github.com/puneetkukreja98) • [@QuncCccccc](https://github.com/QuncCccccc) • +[@ranbeuer](https://github.com/ranbeuer) • [@redbrogdon](https://github.com/redbrogdon) • [@reidbaker](https://github.com/reidbaker) • [@renaudd](https://github.com/renaudd) • +[@renyou](https://github.com/renyou) • [@Renzo-Olivares](https://github.com/Renzo-Olivares) • [@rmacnak-google](https://github.com/rmacnak-google) • [@robert-ancell](https://github.com/robert-ancell) • +[@rodydavis](https://github.com/rodydavis) • [@ronit-cloudsufi](https://github.com/ronit-cloudsufi) • [@rspier](https://github.com/rspier) • [@Rusino](https://github.com/Rusino) • +[@samuli-codemate](https://github.com/samuli-codemate) • [@saurabh-mirajkar](https://github.com/saurabh-mirajkar) • [@Saviq](https://github.com/Saviq) • [@scheglov](https://github.com/scheglov) • +[@schultek](https://github.com/schultek) • [@sethladd](https://github.com/sethladd) • [@sfshaza2](https://github.com/sfshaza2) • [@shanecglass](https://github.com/shanecglass) • +[@sigmundch](https://github.com/sigmundch) • [@sigurdm](https://github.com/sigurdm) • [@snikiche](https://github.com/snikiche) • [@sokoloff06](https://github.com/sokoloff06) • +[@srawlins](https://github.com/srawlins) • [@srujzs](https://github.com/srujzs) • [@sstrickl](https://github.com/sstrickl) • [@stef-luo](https://github.com/stef-luo) • +[@stereotype441](https://github.com/stereotype441) • [@stevemessick](https://github.com/stevemessick) • [@studgeek](https://github.com/studgeek) • [@suertreus](https://github.com/suertreus) • +[@suryaKommana2662](https://github.com/suryaKommana2662) • [@szakarias](https://github.com/szakarias) • [@tarobins](https://github.com/tarobins) • [@tarrinneal](https://github.com/tarrinneal) • +[@tasnim-khan](https://github.com/tasnim-khan) • [@thagomizer](https://github.com/thagomizer) • [@thkim1011](https://github.com/thkim1011) • [@timothyhoang-google](https://github.com/timothyhoang-google) • +[@twerske](https://github.com/twerske) • [@utopicnarwhal](https://github.com/utopicnarwhal) • [@uysalere](https://github.com/uysalere) • [@vashworth](https://github.com/vashworth) • +[@victogomez-cs](https://github.com/victogomez-cs) • [@victorsanni](https://github.com/victorsanni) • [@vivahome2](https://github.com/vivahome2) • [@vsmenon](https://github.com/vsmenon) • +[@walley892](https://github.com/walley892) • [@xster](https://github.com/xster) • [@yjbanov](https://github.com/yjbanov) • [@zanderso](https://github.com/zanderso) • [@zhenqiu1101](https://github.com/zhenqiu1101) • [@zijiehe-google-com](https://github.com/zijiehe-google-com) • [@zoeyfan](https://github.com/zoeyfan) ## Committers (`@flutter/committers`) @@ -76,14 +78,14 @@ Committers hold GitHub Write permissions (merge rights) and provide authoritativ | Contributor | GitHub profile | 12m merged PRs | 12m total activity | | :--- | :--- | :--- | :--- | -| @AbdeMohlbi | [github.com/AbdeMohlbi](https://github.com/AbdeMohlbi) | 133 | 231 | -| @huycozy | [github.com/huycozy](https://github.com/huycozy) | 10 | 32 | -| @JavadAsadi | [github.com/JavadAsadi](https://github.com/JavadAsadi) | 46 | 52 | -| @ksokolovskyi | [github.com/ksokolovskyi](https://github.com/ksokolovskyi) | 18 | 31 | +| @AbdeMohlbi | [github.com/AbdeMohlbi](https://github.com/AbdeMohlbi) | 138 | 236 | +| @huycozy | [github.com/huycozy](https://github.com/huycozy) | 11 | 33 | +| @JavadAsadi | [github.com/JavadAsadi](https://github.com/JavadAsadi) | 43 | 49 | +| @ksokolovskyi | [github.com/ksokolovskyi](https://github.com/ksokolovskyi) | 21 | 34 | | @Mairramer | [github.com/Mairramer](https://github.com/Mairramer) | 28 | 43 | -| @navaronbracke | [github.com/navaronbracke](https://github.com/navaronbracke) | 43 | 335 | -| @rkishan516 | [github.com/rkishan516](https://github.com/rkishan516) | 47 | 73 | -| @ValentinVignal | [github.com/ValentinVignal](https://github.com/ValentinVignal) | 30 | 43 | +| @navaronbracke | [github.com/navaronbracke](https://github.com/navaronbracke) | 43 | 334 | +| @rkishan516 | [github.com/rkishan516](https://github.com/rkishan516) | 50 | 76 | +| @ValentinVignal | [github.com/ValentinVignal](https://github.com/ValentinVignal) | 30 | 45 | ## Reviewers (`@flutter/reviewers`) @@ -91,16 +93,16 @@ Reviewers hold GitHub Triage permissions, triage issues, and conduct first-pass | Contributor | GitHub profile | 12m merged PRs | 12m total activity | | :--- | :--- | :--- | :--- | -| @bleroux | [github.com/bleroux](https://github.com/bleroux) | 14 | 20 | -| @csells | [github.com/csells](https://github.com/csells) | 10 | 20 | +| @bleroux | [github.com/bleroux](https://github.com/bleroux) | 15 | 23 | +| @csells | [github.com/csells](https://github.com/csells) | 11 | 21 | | @davidhicks980 | [github.com/davidhicks980](https://github.com/davidhicks980) | 12 | 24 | -| @filiph | [github.com/filiph](https://github.com/filiph) | 0 | 9 | +| @filiph | [github.com/filiph](https://github.com/filiph) | 0 | 10 | | @Hari-07 | [github.com/Hari-07](https://github.com/Hari-07) | 9 | 30 | -| @htrolle-epam | [github.com/htrolle-epam](https://github.com/htrolle-epam) | 17 | 17 | +| @htrolle-epam | [github.com/htrolle-epam](https://github.com/htrolle-epam) | 15 | 15 | | @jwinarske | [github.com/jwinarske](https://github.com/jwinarske) | 4 | 23 | | @piedcipher | [github.com/piedcipher](https://github.com/piedcipher) | 6 | 15 | | @RobertOdrowaz | [github.com/RobertOdrowaz](https://github.com/RobertOdrowaz) | 7 | 12 | -| @stuartmorgan | [github.com/stuartmorgan](https://github.com/stuartmorgan) | 5 | 15 | +| @stuartmorgan | [github.com/stuartmorgan](https://github.com/stuartmorgan) | 4 | 13 | | @tirth-patel-nc | [github.com/tirth-patel-nc](https://github.com/tirth-patel-nc) | 0 | 10 | | @wolfenrain | [github.com/wolfenrain](https://github.com/wolfenrain) | 0 | 16 | | @zemanux | [github.com/zemanux](https://github.com/zemanux) | 6 | 24 | diff --git a/test/roster_validation_test.dart b/test/roster_validation_test.dart index 96b3a95..2ae43b6 100644 --- a/test/roster_validation_test.dart +++ b/test/roster_validation_test.dart @@ -202,10 +202,19 @@ dash_emeritus: final emeritusFile = File('${tempDir.path}/EMERITUS.md'); yamlFile.writeAsStringSync(''' +# Flutter Contributor Ladder Roster +# Last updated: 2026-10-27 + maintainers: googlers: - username: Piinks role: maintainer + - username: m2 + role: maintainer + - username: m3 + role: maintainer + - username: m4 + role: maintainer partners: - username: robert-ancell team: "@flutter/canonical" @@ -226,13 +235,25 @@ dash_emeritus: summaryFile.writeAsStringSync( '{"alice": {"merged_prs": 15, "total": 40}, "bob": {"merged_prs": 3, "total": 12}}'); - final parsedYaml = loadYaml(yamlFile.readAsStringSync()) as YamlMap; + final rawYaml = yamlFile.readAsStringSync(); + expect(extractLastUpdated(rawYaml), equals('2026-10-27')); + expect(extractLastUpdated('maintainers: {}'), isNull); + + final parsedYaml = loadYaml(rawYaml) as YamlMap; expect(validateContributorsYaml(parsedYaml), isEmpty); expect(buildRosterMarkdown(parsedYaml, {}), contains('## Committers (`@flutter/committers`)')); expect( buildEmeritusMarkdown(parsedYaml), contains('# Dasher Emeritus')); + final gridRows = formatGridRows(['u1', 'u2', 'u3', 'u4', 'u5']); + expect(gridRows, hasLength(2)); + expect(gridRows[0].endsWith(' •'), isTrue, + reason: + 'Non-final grid rows must end with " •" so soft line wraps still render a separator'); + expect(gridRows[1].endsWith(' •'), isFalse, + reason: 'Final grid row must not end with a trailing separator'); + // --check should fail before ROSTER.md and EMERITUS.md exist final checkBefore = Process.runSync('dart', [ 'run', @@ -267,7 +288,12 @@ dash_emeritus: expect(emeritusFile.existsSync(), isTrue); final rosterMd = rosterFile.readAsStringSync(); + expect(rosterMd, contains('**Last updated:** 2026-10-27')); expect(rosterMd, contains('[@Piinks](https://github.com/Piinks)')); + expect( + rosterMd, + contains( + '[@Piinks](https://github.com/Piinks) •\n[@robert-ancell]')); expect(rosterMd, contains('[@robert-ancell](https://github.com/robert-ancell)')); expect( @@ -277,6 +303,7 @@ dash_emeritus: expect(rosterMd, isNot(contains('Prospective new joiners'))); final emeritusMd = emeritusFile.readAsStringSync(); + expect(emeritusMd, contains('**Last updated:** 2026-10-27')); expect(emeritusMd, contains('[@formerDasher](https://github.com/formerDasher)')); expect(emeritusMd, contains('https://github.com/flutter/rfc')); @@ -296,6 +323,44 @@ dash_emeritus: emeritusFile.path, ]); expect(checkAfter.exitCode, equals(0)); + + // --check should continue to pass when activity_summary.json advances + // during nightly syncs between roster updates + summaryFile.writeAsStringSync( + '{"alice": {"merged_prs": 19, "total": 52}, "bob": {"merged_prs": 4, "total": 16}}'); + final checkAfterActivitySync = Process.runSync('dart', [ + 'run', + 'tool/generate_roster.dart', + '--check', + '--contributors', + yamlFile.path, + '--summary', + summaryFile.path, + '--roster', + rosterFile.path, + '--emeritus', + emeritusFile.path, + ]); + expect(checkAfterActivitySync.exitCode, equals(0)); + + // --check should fail if `Last updated` changes in contributors.yaml + // without regenerating ROSTER.md and EMERITUS.md + yamlFile.writeAsStringSync( + rawYaml.replaceFirst('2026-10-27', '2026-11-06')); + final checkAfterDateChange = Process.runSync('dart', [ + 'run', + 'tool/generate_roster.dart', + '--check', + '--contributors', + yamlFile.path, + '--summary', + summaryFile.path, + '--roster', + rosterFile.path, + '--emeritus', + emeritusFile.path, + ]); + expect(checkAfterDateChange.exitCode, equals(1)); } finally { tempDir.deleteSync(recursive: true); } diff --git a/tool/generate_roster.dart b/tool/generate_roster.dart index 18800cc..ca00114 100644 --- a/tool/generate_roster.dart +++ b/tool/generate_roster.dart @@ -7,6 +7,30 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:yaml/yaml.dart'; +/// Extracts the `# Last updated: YYYY-MM-DD` header value from [yamlContent], +/// or returns `null` if not present. +String? extractLastUpdated(String yamlContent) { + final match = RegExp( + r'^#\s*Last updated:\s*(\S+)\s*$', + multiLine: true, + ).firstMatch(yamlContent); + return match?.group(1); +} + +/// Normalizes the 12-month activity snapshot columns in `ROSTER.md` table rows +/// so `--check` verifies roster membership, ordering, links, `Last updated` +/// metadata, and structure against `data/contributors.yaml` without failing CI +/// when `data/activity_summary.json` advances during nightly syncs. +String normalizeRosterForCheck(String rosterMarkdown) { + return rosterMarkdown.replaceAllMapped( + RegExp( + r'^(\| @([A-Za-z0-9_-]+) \| \[github\.com/\2\]\(https://github\.com/\2\) \| )(?:\d+|-) \| (?:\d+|-) \|$', + multiLine: true, + ), + (match) => '${match.group(1)}- | - |', + ); +} + void main(List args) { final parser = ArgParser() ..addFlag('check', @@ -35,7 +59,9 @@ void main(List args) { exit(1); } - final doc = loadYaml(yamlFile.readAsStringSync()) as YamlMap; + final yamlRaw = yamlFile.readAsStringSync(); + final doc = loadYaml(yamlRaw) as YamlMap; + final lastUpdated = extractLastUpdated(yamlRaw); final summaryFile = File(summaryPath); var summary = {}; @@ -60,14 +86,19 @@ void main(List args) { final rosterFile = File(rosterPath); final emeritusFile = File(emeritusPath); - final rosterContent = - preservePendingAuditBanner(rosterFile, buildRosterMarkdown(doc, summary)); - final emeritusContent = - preservePendingAuditBanner(emeritusFile, buildEmeritusMarkdown(doc)); + final rosterContent = preservePendingAuditBanner( + rosterFile, + buildRosterMarkdown(doc, summary, lastUpdated: lastUpdated), + ); + final emeritusContent = preservePendingAuditBanner( + emeritusFile, + buildEmeritusMarkdown(doc, lastUpdated: lastUpdated), + ); if (isCheck) { final rosterOutOfSync = !rosterFile.existsSync() || - rosterFile.readAsStringSync() != rosterContent; + normalizeRosterForCheck(rosterFile.readAsStringSync()) != + normalizeRosterForCheck(rosterContent); final emeritusOutOfSync = !emeritusFile.existsSync() || emeritusFile.readAsStringSync() != emeritusContent; if (rosterOutOfSync || emeritusOutOfSync) { @@ -85,19 +116,24 @@ void main(List args) { } } -List _formatGridRows(List usernames, {int columns = 4}) { +List formatGridRows(List usernames, {int columns = 4}) { final rows = []; for (var i = 0; i < usernames.length; i += columns) { final row = [ for (var j = 0; j < columns && i + j < usernames.length; j++) '[@${usernames[i + j]}](https://github.com/${usernames[i + j]})', ]; - rows.add(row.join(' • ')); + final isLastRow = i + columns >= usernames.length; + rows.add('${row.join(' • ')}${isLastRow ? '' : ' •'}'); } return rows; } -String buildRosterMarkdown(YamlMap doc, Map summary) { +String buildRosterMarkdown( + YamlMap doc, + Map summary, { + String? lastUpdated, +}) { final maintainers = doc['maintainers'] as YamlMap?; final allMaintainers = { if (maintainers != null) ...[ @@ -109,7 +145,7 @@ String buildRosterMarkdown(YamlMap doc, Map summary) { }; final sortedMaintainers = allMaintainers.toList() ..sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase())); - final maintainerRows = _formatGridRows(sortedMaintainers); + final maintainerRows = formatGridRows(sortedMaintainers); final committers = doc['committers'] as YamlList? ?? []; final committerRows = [ @@ -135,15 +171,19 @@ String buildRosterMarkdown(YamlMap doc, Map summary) { }(), ]; + final lastUpdatedLine = (lastUpdated != null && lastUpdated.trim().isNotEmpty) + ? '\n**Last updated:** ${lastUpdated.trim()}\n' + : ''; + return ''' # Contributor Roster - +$lastUpdatedLine This directory lists active Flutter Contributor Ladder members. Honorary alumni who have stepped back from active contribution and exited the GitHub organization are listed in [EMERITUS.md](EMERITUS.md). Governance details and tier qualifications are specified in [docs/LADDER.md](docs/LADDER.md). > [!NOTE] -> This file is automatically generated from `data/contributors.yaml`. +> This file is automatically generated from `data/contributors.yaml` and reflects 12-month activity counts at the time the roster was last updated. > To update, edit `data/contributors.yaml` and run `dart run tool/generate_roster.dart`. ## Maintainers (`@flutter/maintainers`) @@ -174,15 +214,19 @@ Former ladder members who have stepped back from active contribution do not rema '''; } -String buildEmeritusMarkdown(YamlMap doc) { +String buildEmeritusMarkdown(YamlMap doc, {String? lastUpdated}) { final emeriti = doc['dash_emeritus'] as YamlList? ?? []; final sortedEmeriti = emeriti.map((e) => e['username'] as String).toList() ..sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase())); - final emeritusRows = _formatGridRows(sortedEmeriti); + final emeritusRows = formatGridRows(sortedEmeriti); + + final lastUpdatedLine = (lastUpdated != null && lastUpdated.trim().isNotEmpty) + ? '\n**Last updated:** ${lastUpdated.trim()}\n' + : ''; return ''' # Dasher Emeritus - +$lastUpdatedLine This directory honors **Dasher Emeritus** alumni—former Flutter Reviewers, Committers, and Maintainers who previously held roles on the contributor ladder and have stepped back from active contribution (< 10 contributions over the preceding 12 months). To maintain repository security, Dasher Emeriti do not remain members of the `flutter` GitHub organization. Instead, their contributions are recognized here, and they retain access to Flutter contributor channels on Discord (including `#hidden-chat`) and the announcement-only `flutter-contributors` Google Group (for project announcements and calendar invites to our recurring Flutter Contributor Roundtable and the Dash Forum, where contributors can present and get feedback on their [RFCs](https://github.com/flutter/rfc); the registration form is pinned in `#hidden-chat` on Discord) so they can stay in touch and more easily ramp back up onto the project if and when they choose to return.