CINXE.COM
Community Tech/Development - Meta
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Community Tech/Development - Meta</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )metawikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat": "dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"937fde04-f290-421b-a5e1-6ec55d6102e6","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Community_Tech/Development","wgTitle":"Community Tech/Development","wgCurRevisionId":27024493,"wgRevisionId":27024493,"wgArticleId":9217621,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Community Tech","Workflows","Community Tech/Maintenance"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Community_Tech/Development","wgRelevantArticleId":9217621,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"meta","wgCiteReferencePreviewsActive":false,"wgMediaViewerOnClick":true, "wgMediaViewerEnabledByDefault":true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":10000,"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgDiscussionToolsFeaturesEnabled":{"replytool":true,"newtopictool":true,"sourcemodetoolbar":true,"topicsubscription":false,"autotopicsub":false,"visualenhancements":false,"visualenhancements_reply":false,"visualenhancements_pageframe":false},"wgDiscussionToolsFallbackEditMode":"source","wgULSPosition":"personal","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready", "user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.discussionTools.init.styles":"ready","oojs-ui-core.styles":"ready","oojs-ui.styles.indicators":"ready","mediawiki.widgets.styles":"ready","oojs-ui-core.icons":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.pt":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.AddTopic","ext.gadget.formWizard","ext.gadget.ReferenceTooltips","ext.gadget.WishlistTranslation","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.discussionTools.init", "ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","ext.checkUser.clientHints"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.discussionTools.init.styles%7Cext.uls.pt%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediaBadges%7Cext.wikimediamessages.styles%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.indicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Community Tech/Development - Meta"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//meta.m.wikimedia.org/wiki/Community_Tech/Development"> <link rel="alternate" type="application/x-wiki" title="Edit" href="/w/index.php?title=Community_Tech/Development&action=edit"> <link rel="icon" href="/static/favicon/community.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Meta (en)"> <link rel="EditURI" type="application/rsd+xml" href="//meta.wikimedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://meta.wikimedia.org/wiki/Community_Tech/Development"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"> <link rel="alternate" type="application/atom+xml" title="Meta Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="ext-discussiontools-replytool-enabled ext-discussiontools-newtopictool-enabled ext-discussiontools-sourcemodetoolbar-enabled skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Community_Tech_Development rootpage-Community_Tech skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Main_Page" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-wikimedia-news-label" class="mw-list-item"><a href="/wiki/Wikimedia_News"><span>Wikimedia News</span></a></li><li id="n-translations-text" class="mw-list-item"><a href="/wiki/Special:LanguageStats"><span>Translations</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random page</span></a></li><li id="n-help" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Help:Help" title="The place to find out"><span>Help</span></a></li><li id="n-Babel-text" class="mw-list-item"><a href="/wiki/Meta:Babel"><span>Babel</span></a></li> </ul> </div> </div> <div id="p-community" class="vector-menu mw-portlet mw-portlet-community" > <div class="vector-menu-heading"> Community </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-WikimediaResourceCenter-text" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Wikimedia_Resource_Center"><span>Wikimedia Resource Center</span></a></li><li id="n-WikimediaForum-text" class="mw-list-item"><a href="/wiki/Wikimedia_Forum"><span>Wikimedia Forum</span></a></li><li id="n-mailinglists-text" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Mailing_lists/Overview"><span>Mailing lists</span></a></li><li id="n-Requests-text" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Meta:Requests_and_proposals"><span>Requests</span></a></li><li id="n-Babylon-text" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Meta:Babylon"><span>Babylon</span></a></li><li id="n-Reports-text" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Wikimedia_Affiliates_Data_Portal"><span>Reports</span></a></li><li id="n-Research-text" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Research:Index"><span>Research</span></a></li><li id="n-planet" class="mw-list-item"><a href="//en.planet.wikimedia.org/" title="Weblog aggregator of Wikimedia-related posts"><span>Planet Wikimedia</span></a></li> </ul> </div> </div> <div id="p-beyond_the_web" class="vector-menu mw-portlet mw-portlet-beyond_the_web" > <div class="vector-menu-heading"> Beyond the Web </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-Meetup-text" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Meetup"><span>Meet Wikimedians</span></a></li><li id="n-Events-text" class="mw-list-item"><a href="/wiki/Events"><span>Events</span></a></li><li id="n-wikimedia-movement-affiliates-shortlabel" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Wikimedia_movement_affiliates"><span>Movement affiliates</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Special:MyLanguage/Main_Page" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/metawiki.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikimedia Meta-Wiki" src="/static/images/mobile/copyright/metawiki-wordmark.svg" style="width: 7.5em; height: 1.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search Meta [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search Meta" aria-label="Search Meta" autocapitalize="sentences" title="Search Meta [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-uls" class="mw-list-item active user-links-collapsible-item"><a data-mw="interface" href="#" class="uls-trigger cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet"><span class="vector-icon mw-ui-icon-wikimedia-language mw-ui-icon-wikimedia-wikimedia-language"></span> <span>English</span></a> </li> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_meta.wikimedia.org&uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=Community+Tech%2FDevelopment" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=Community+Tech%2FDevelopment" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out user-links-collapsible-item" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_meta.wikimedia.org&uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Community+Tech%2FDevelopment" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Community+Tech%2FDevelopment" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Beginning</div> </a> </li> <li id="toc-Development_workflow" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Development_workflow"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Development workflow</span> </div> </a> <button aria-controls="toc-Development_workflow-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Development workflow subsection</span> </button> <ul id="toc-Development_workflow-sublist" class="vector-toc-list"> <li id="toc-Estimation" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Estimation"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.1</span> <span>Estimation</span> </div> </a> <ul id="toc-Estimation-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Working_on_a_ticket" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Working_on_a_ticket"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.2</span> <span>Working on a ticket</span> </div> </a> <ul id="toc-Working_on_a_ticket-sublist" class="vector-toc-list"> <li id="toc-Working_on_a_ticket_that's_not_on_the_kanban_board" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#Working_on_a_ticket_that's_not_on_the_kanban_board"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.2.1</span> <span>Working on a ticket that's not on the kanban board</span> </div> </a> <ul id="toc-Working_on_a_ticket_that's_not_on_the_kanban_board-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Reviewing_others'_work" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Reviewing_others'_work"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.3</span> <span>Reviewing others' work</span> </div> </a> <ul id="toc-Reviewing_others'_work-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Communication_expectations" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Communication_expectations"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.4</span> <span>Communication expectations</span> </div> </a> <ul id="toc-Communication_expectations-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-How_to_prepare_work_for_QA?" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#How_to_prepare_work_for_QA?"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.5</span> <span>How to prepare work for QA?</span> </div> </a> <ul id="toc-How_to_prepare_work_for_QA?-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-GitHub_workflow" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#GitHub_workflow"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>GitHub workflow</span> </div> </a> <button aria-controls="toc-GitHub_workflow-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle GitHub workflow subsection</span> </button> <ul id="toc-GitHub_workflow-sublist" class="vector-toc-list"> <li id="toc-Process" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Process"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span> <span>Process</span> </div> </a> <ul id="toc-Process-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Tools_Deployment_workflow" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Tools_Deployment_workflow"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Tools Deployment workflow</span> </div> </a> <ul id="toc-Tools_Deployment_workflow-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Expectations_from_investigation_tickets" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Expectations_from_investigation_tickets"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Expectations from investigation tickets</span> </div> </a> <button aria-controls="toc-Expectations_from_investigation_tickets-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Expectations from investigation tickets subsection</span> </button> <ul id="toc-Expectations_from_investigation_tickets-sublist" class="vector-toc-list"> <li id="toc-Expected_preliminary_results" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Expected_preliminary_results"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.1</span> <span>Expected preliminary results</span> </div> </a> <ul id="toc-Expected_preliminary_results-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Expected_next_steps" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Expected_next_steps"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.2</span> <span>Expected next steps</span> </div> </a> <ul id="toc-Expected_next_steps-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Community_Tech_Maintenance" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Community_Tech_Maintenance"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Community Tech Maintenance</span> </div> </a> <ul id="toc-Community_Tech_Maintenance-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Community Tech/Development</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="This article exist only in this language. Add the article for other languages" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-0" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">Add languages</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-add wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:NewItem?site=metawiki&page=Community+Tech%2FDevelopment" title="Add interlanguage links" class="wbc-editpage">Add links</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Community_Tech/Development" title="View the content page [c]" accesskey="c"><span>Content page</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Talk:Community_Tech/Development" rel="discussion" class="mw-redirect" title="Discussion about the content page [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Community_Tech/Development"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Community_Tech/Development&action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Community_Tech/Development&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Community_Tech/Development"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Community_Tech/Development&action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Community_Tech/Development&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Community_Tech/Development" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Community_Tech/Development" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Community_Tech/Development&oldid=27024493" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Community_Tech/Development&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&page=Community_Tech%2FDevelopment&id=27024493&wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fmeta.wikimedia.org%2Fwiki%2FCommunity_Tech%2FDevelopment"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fmeta.wikimedia.org%2Fwiki%2FCommunity_Tech%2FDevelopment"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Special:Book&bookcmd=book_creator&referer=Community+Tech%2FDevelopment"><span>Create a book</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=Community_Tech%2FDevelopment&action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Community_Tech/Development&printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects emptyPortlet" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">From Meta, a Wikimedia project coordination wiki</div> </div> <div id="contentSub"><div id="mw-content-subtitle"><div class="subpages">< <bdi dir="ltr"><a href="/wiki/Community_Tech" title="Community Tech">Community Tech</a></bdi></div></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p>This is a page for Community Tech developers to share information about coding conventions, workflows, etc. This is intended to supplement the <a href="https://www.mediawiki.org/wiki/Manual:Contents" class="extiw" title="mw:Manual:Contents">manual</a> on MediaWiki.org, and applies to all of the projects listed on <a href="/wiki/Community_Tech/Maintenance" title="Community Tech/Maintenance">Community Tech/Maintenance</a>. </p> <meta property="mw:PageProp/toc"/> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Development_workflow" data-mw-thread-id="h-Development_workflow"><span data-mw-comment-start="" id="h-Development_workflow"></span>Development workflow<span data-mw-comment-end="h-Development_workflow"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=1" title="Edit section: Development workflow"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Development_workflow","replies":["h-Estimation-Development_workflow","h-Working_on_a_ticket-Development_workflow","h-Reviewing_others'_work-Development_workflow","h-Communication_expectations-Development_workflow","h-How_to_prepare_work_for_QA?-Development_workflow"]}}--></div> <p>This section describes our development workflow, based around our <a href="https://phabricator.wikimedia.org/project/view/6261/" class="extiw" title="phab:project/view/6261/">kanban board</a> on Phabricator and code review on both Gerrit and GitHub. Once a ticket is assigned to someone, it stays with them until it's closed. We'll try to reduce the number if tickets in progress. </p> <div class="mw-heading mw-heading3"><h3 id="Estimation" data-mw-thread-id="h-Estimation-Development_workflow"><span data-mw-comment-start="" id="h-Estimation-Development_workflow"></span>Estimation<span data-mw-comment-end="h-Estimation-Development_workflow"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=2" title="Edit section: Estimation"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>In our planning/discussion meetings, engineers vote on tickets and discuss them so that the product trio can prioritize the work accordingly. We use the Fibonacci scale. While there's no finite definition, here's a rough guideline: </p> <ul><li>0 – never used, unless the work is already done (?)</li> <li>1 – very trivial amount of work, say copy edits or configuration changes</li> <li>2 – an hour or so of work</li> <li>3 – a few hours of work</li> <li>5 – a day or two of work</li> <li>8 – up to a week or more</li></ul> <p>Tasks deemed to be higher than 8 should probably be broken up into smaller tasks. </p> <div class="mw-heading mw-heading3"><h3 id="Working_on_a_ticket" data-mw-thread-id="h-Working_on_a_ticket-Development_workflow"><span data-mw-comment-start="" id="h-Working_on_a_ticket-Development_workflow"></span>Working on a ticket<span data-mw-comment-end="h-Working_on_a_ticket-Development_workflow"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=3" title="Edit section: Working on a ticket"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ol><li>If you don't find a ticket to work and are moving one into the Kanban mention @product-trio and let them know you started working on it.</li> <li>Before taking a new ticket to work on, make sure that no progress can be made on anything you're already working on.</li> <li>Take a ticket from the top of the <i>Ready</i> column (this column is manually kept arranged in priority order).</li> <li>Assign it to yourself, and move it to the <i>In Development</i> column.</li> <li>Work on the ticket, and upload patches to Gerrit or GitHub as appropriate. When a patch is ready for review, make sure there's a link to it on the ticket (Gerrit does this automatically; you have to do it manually for GitHub; and in both cases it might be good to make a comment about the patch), and move the ticket to the <i>Needs Review/Feedback</i> column.</li> <li>After receiving feedback that suggests changes, move the ticket back to <i>In Development</i> (even if you're not going to be working on it right away; this makes it obvious to other reviewers that they don't need to look at this yet). (See below for the process for a patch that passes review and is merged.)</li> <li>If the work you did ended up being drastically more or less than the "Estimated Story Points" value, feel free to edit the task and set the "Final Story Points" field.</li></ol> <div class="mw-heading mw-heading4"><h4 id="Working_on_a_ticket_that's_not_on_the_kanban_board" data-mw-thread-id="h-Working_on_a_ticket_that's_not_on_the_kanban_board-Working_on_a_ticket"><span id="Working_on_a_ticket_that.27s_not_on_the_kanban_board"></span><span data-mw-comment-start="" id="h-Working_on_a_ticket_that's_not_on_the_kanban_board-Working_on_a_ticket"></span>Working on a ticket that's not on the kanban board<span data-mw-comment-end="h-Working_on_a_ticket_that's_not_on_the_kanban_board-Working_on_a_ticket"></span></h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=4" title="Edit section: Working on a ticket that's not on the kanban board"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>As an open source organization, we often do work that hasn't been prioritized yet. This should probably only be done when there's no need for prior product or design oversight (such as bug fixes). At any rate, in order to track everyone's work and the team's velocity, try to remember to: </p> <ul><li>Create a ticket first if one doesn't already exist.</li> <li>If a ticket already exists, claim it and move it to the current kanban board, removing it from the main Community Tech board.</li></ul> <p>Then follow the above workflow for working on a ticket. If you've already done the work too, edit the task and retroactively give it a point value in the "Final story points" field, then move the task to the QA column. </p> <div class="mw-heading mw-heading3"><h3 id="Reviewing_others'_work" data-mw-thread-id="h-Reviewing_others'_work-Development_workflow"><span id="Reviewing_others.27_work"></span><span data-mw-comment-start="" id="h-Reviewing_others'_work-Development_workflow"></span>Reviewing others' work<span data-mw-comment-end="h-Reviewing_others'_work-Development_workflow"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=5" title="Edit section: Reviewing others' work"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ol><li>Work down the <i>Needs Review/Feedback</i> column from top to bottom.</li> <li>For each ticket, do whatever is required to review the patch (see <a href="https://www.mediawiki.org/wiki/Gerrit/Code_review" class="extiw" title="mw:Gerrit/Code review">mw:Gerrit/Code review</a> for more about this process; that page is about Gerrit, but we apply similar principles on GitHub).</li> <li> <ul><li>If the patch is not ready for merging, leave comments and mark it as such (this is a similar process on Gerrit and GitHub).</li> <li>If it is ready, merge it (and for GitHub patches, leave a comment on the ticket)</li> <li>The assignee of the ticket will move the ticket to the <i>Product/QA review</i> column on the Phabricator kanban board.</li> <li>The assignee is responsible for getting the change deployed to the relevant environment(s) for QA.</li></ul></li></ol> <div class="mw-heading mw-heading3"><h3 id="Communication_expectations" data-mw-thread-id="h-Communication_expectations-Development_workflow"><span data-mw-comment-start="" id="h-Communication_expectations-Development_workflow"></span>Communication expectations<span data-mw-comment-end="h-Communication_expectations-Development_workflow"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=6" title="Edit section: Communication expectations"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The Phabricator ticket should be updated in any of the following situations: </p> <ul><li>A Pull Request is created on GitHub (note that no comment is required for Gerrit patches because Gerrit-bot will post on the ticket automatically).</li> <li>When the ticket moves to <i>QA</i> there needs to be an explicit explanation about how the ticket can be QA'd (i.e. where to find it in staging, production, etc.).</li> <li>When work for the ticket has been deployed a comment should be added to specify that.</li></ul> <p>In addition, the <code>CHANGELOG.md</code> file should be updated (following the guidelines of <a rel="nofollow" class="external text" href="https://keepachangelog.com/">keepachangelog.com</a>), listing anything added, changed, deprecated, removed, fixed, or that are security vulnerabilities. Merge conflicts can be resolved by reviewers when required (rather than waiting for the patch author to do it). </p> <div class="mw-heading mw-heading3"><h3 id="How_to_prepare_work_for_QA?" data-mw-thread-id="h-How_to_prepare_work_for_QA?-Development_workflow"><span id="How_to_prepare_work_for_QA.3F"></span><span data-mw-comment-start="" id="h-How_to_prepare_work_for_QA?-Development_workflow"></span>How to prepare work for QA?<span data-mw-comment-end="h-How_to_prepare_work_for_QA?-Development_workflow"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=7" title="Edit section: How to prepare work for QA?"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>When moving a ticket to QA make sure you add instructions with compassion, imagine you are new or don’t know the background/history of the issue. Make sure you add: </p> <ul><li>instructions on how to recreate the issue</li> <li>acceptance criteria and QA notes</li></ul> <p>Here's some good examples of tickets that make the transition into QA and the work of our Quality and Test Engineers easier: <a href="https://phabricator.wikimedia.org/T316609" class="extiw" title="phab:T316609">T316609</a>, <a href="https://phabricator.wikimedia.org/T326397" class="extiw" title="phab:T326397">T326397</a>. </p> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="GitHub_workflow" data-mw-thread-id="h-GitHub_workflow"><span data-mw-comment-start="" id="h-GitHub_workflow"></span>GitHub workflow<span data-mw-comment-end="h-GitHub_workflow"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=8" title="Edit section: GitHub workflow"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-GitHub_workflow","replies":["h-Process-GitHub_workflow"]}}--></div> <p>Many tools and bots are hosted on GitHub, outside of the WMF's Gerrit patch review system. The intent of this process is to enable work on projects hosted on GitHub to be reviewed and merged quickly when colleagues may not be receiving notifications automatically, as they would through the integrated Phabricator/Gerrit/git review system. </p><p>Our GitHub projects should have the following tags: <span style="border-radius: 3px; font-weight: 600; padding: 0 8px; background-color:#cc317c; color:white">WIP</span> (#cc317c) <span style="border-radius: 3px; font-weight: 600; padding: 0 8px; background-color:#33aa3f; color:black">Ready for review</span> (#33aa3f). </p> <div class="mw-heading mw-heading3"><h3 id="Process" data-mw-thread-id="h-Process-GitHub_workflow"><span data-mw-comment-start="" id="h-Process-GitHub_workflow"></span>Process<span data-mw-comment-end="h-Process-GitHub_workflow"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=9" title="Edit section: Process"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>Developer forks the project in question.</li> <li>Developer may handle branches as they like, although they should strongly consider starting a branch for each task worked on with <a href="https://www.mediawiki.org/wiki/Gerrit/Tutorial#Create_a_branch" class="extiw" title="mw:Gerrit/Tutorial">a descriptive name</a>.</li> <li>When work is complete, submit a Pull Request to the main repository.</li> <li>After all Continuous Integration tests pass for the PR, add relevant people as reviewers.</li> <li>Each PR should contain a single commit, amended as many times as is required (this is to match the Gerrit model, and results in a clean history for the repository).</li> <li>After a PR is merged, the person who merged it is responsible for making a comment on the Phabricator task and moving the task to the relevant column.</li> <li>The process for task management should be paid attention to as there is no automatic notification between GitHub and Phabricator. We have to rely on humans to communicate with each other on Phabricator to ensure the status is correctly reflected.</li></ul> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Tools_Deployment_workflow" data-mw-thread-id="h-Tools_Deployment_workflow"><span data-mw-comment-start="" id="h-Tools_Deployment_workflow"></span>Tools Deployment workflow<span data-mw-comment-end="h-Tools_Deployment_workflow"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=10" title="Edit section: Tools Deployment workflow"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Tools_Deployment_workflow","replies":[]}}--></div> <p>The Community Tech team works on several tools that live outside Wikimedia's general deployment environment, like Wikimedia Cloud Services. These tools require having a separate deployment workflow. Each tool has two accounts: the main "production" instance, and a 2nd "staging" account of the same name with (usually) <code>-test</code> appended. </p><p>For tools whose <b>code is hosted on GitHub</b>, the deployment process is: </p> <ol><li>"Staging" instance is kept up to date with the current master branch. The latest code is pulled into the staging instance as soon as a PR is merged (by a cronjob running every 10 minutes).</li> <li>When the state of staging instance is ready (post QA and Product Review) we "cut" a release: <ol><li>Add an annotated version tag to the repo (in the <a rel="nofollow" class="external text" href="https://semver.org/">SemVer</a> format of <code>major.minor.patch</code>)</li> <li>A script running on production will automatically update to the latest version — updating the production instance</li></ol></li></ol> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Expectations_from_investigation_tickets" data-mw-thread-id="h-Expectations_from_investigation_tickets"><span data-mw-comment-start="" id="h-Expectations_from_investigation_tickets"></span>Expectations from investigation tickets<span data-mw-comment-end="h-Expectations_from_investigation_tickets"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=11" title="Edit section: Expectations from investigation tickets"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Expectations_from_investigation_tickets","replies":["h-Expected_preliminary_results-Expectations_from_investigation_tickets","h-Expected_next_steps-Expectations_from_investigation_tickets"]}}--></div> <p>Investigations done by Engineers should cover the requested topic and lead towards some actionable direction; either a solution proposed, or a conclusion about the feasibility of the feature investigated. </p> <div class="mw-heading mw-heading3"><h3 id="Expected_preliminary_results" data-mw-thread-id="h-Expected_preliminary_results-Expectations_from_investigation_tickets"><span data-mw-comment-start="" id="h-Expected_preliminary_results-Expectations_from_investigation_tickets"></span>Expected preliminary results<span data-mw-comment-end="h-Expected_preliminary_results-Expectations_from_investigation_tickets"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=12" title="Edit section: Expected preliminary results"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><i>Until this stage, the ticket is "In progress". When the preliminary results are written, it should move to "In Review"</i> </p><p>Preliminary results should include: </p> <ul><li>Summary of the investigation itself; what was checked, what should be considered, the challenges taken into consideration, etc.</li> <li>Conclusion of the preliminary results</li> <li>Available options to take forward</li> <li>If possible -- a recommendation for a next step.</li></ul> <p>After the preliminary results are posted, the team can review the results and discuss on the ticket. Once a decision of next-steps is made, it should be documented. </p> <div class="mw-heading mw-heading3"><h3 id="Expected_next_steps" data-mw-thread-id="h-Expected_next_steps-Expectations_from_investigation_tickets"><span data-mw-comment-start="" id="h-Expected_next_steps-Expectations_from_investigation_tickets"></span>Expected next steps<span data-mw-comment-end="h-Expected_next_steps-Expectations_from_investigation_tickets"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=13" title="Edit section: Expected next steps"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><i>At this stage, a new ticket should be created, and the investigation ticket is resolved.</i> </p> <ul><li>When an investigation is done and some agreement is made, it is to be summarized</li> <li>A new actionable ticket should be created (and linked from the investigation)</li> <li>The results (along with a brief summary) should be copied into the investigation ticket's description so it is not lost in comments.</li></ul> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Community_Tech_Maintenance" data-mw-thread-id="h-Community_Tech_Maintenance"><span data-mw-comment-start="" id="h-Community_Tech_Maintenance"></span>Community Tech Maintenance<span data-mw-comment-end="h-Community_Tech_Maintenance"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Community_Tech/Development&action=edit&section=14" title="Edit section: Community Tech Maintenance"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Community_Tech_Maintenance","replies":[]}}--></div> <dl><dd><i>For the list of projects that we maintain, see <a href="/wiki/Community_Tech/Maintenance" title="Community Tech/Maintenance">Community Tech/Maintenance</a>.</i></dd></dl> <p><span typeof="mw:File"><a href="/wiki/File:Maintenance_CommTech.png" class="mw-file-description"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Maintenance_CommTech.png/1000px-Maintenance_CommTech.png" decoding="async" width="1000" height="88" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Maintenance_CommTech.png/1500px-Maintenance_CommTech.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Maintenance_CommTech.png/2000px-Maintenance_CommTech.png 2x" data-file-width="3534" data-file-height="310"/></a></span> </p> <dl><dt><i>Prioritization</i></dt> <dt>During prioritization stage we are considering maintenance</dt> <dd>If we can estimate that a feature will require an immense amount of maintenance we might have reduce the prioritization score, as we might not be capable of keeping all functionalities intact in the future.</dd></dl> <dl><dt><i>Consultation across teams</i></dt> <dt>We will to consult with other teams about implementation details</dt> <dd>Our hope is that it makes it more likely that other teams continue maintaining our work, if we implement it in a way that matches the expectations of other teams for example regarding code style or standards.</dd></dl> <dl><dt><i>Maintenance Period</i></dt> <dt>We agree about how long we will maintain wishes as a team</dt> <dd>We will work hard on finding maintainers for our work and make it clear who continues maintaining our work, it can be teams or any interested members of the community. We do not maintain all tools we have implemented forever by default as we are not able to handle the load of bug requests. We want to be honest with ourselves about what we can achieve. A default maintenance time will be between 6–12 months.</dd></dl> <dl><dt><i>Further Agreements</i></dt></dl> <ul><li>We encourage to resubmit wishes or propose maintenance requests.</li> <li>We will make transparent what the maintenance status is.</li> <li>Besides active and passive development, there is also "Unsupported by CommTech”.</li></ul> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐7dfb9d98f5‐h927h Cached time: 20241125205056 Cache expiry: 2592000 Reduced expiry: false Complications: [show‐toc] DiscussionTools time usage: 0.009 seconds CPU time usage: 0.028 seconds Real time usage: 0.038 seconds Preprocessor visited node count: 54/1000000 Post‐expand include size: 0/2097152 bytes Template argument size: 0/2097152 bytes Highest expansion depth: 2/100 Expensive parser function count: 0/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 0/5000000 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 0.000 1 -total --> <!-- Saved in parser cache with key metawiki:pcache:idhash:9217621-0!canonical and timestamp 20241125205056 and revision id 27024493. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://meta.wikimedia.org/w/index.php?title=Community_Tech/Development&oldid=27024493">https://meta.wikimedia.org/w/index.php?title=Community_Tech/Development&oldid=27024493</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:Categories" title="Special:Categories">Categories</a>: <ul><li><a href="/wiki/Category:Community_Tech" title="Category:Community Tech">Community Tech</a></li><li><a href="/wiki/Category:Workflows" title="Category:Workflows">Workflows</a></li><li><a href="/wiki/Category:Community_Tech/Maintenance" title="Category:Community Tech/Maintenance">Community Tech/Maintenance</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 28 June 2024, at 07:03.</li> <li id="footer-info-copyright">Text is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-ShareAlike License</a>; additional terms may apply. See <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> for details.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Meta:About">About Meta</a></li> <li id="footer-places-disclaimers"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/meta.wikimedia.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//meta.m.wikimedia.org/w/index.php?title=Community_Tech/Development&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-7dfb9d98f5-h927h","wgBackendResponseTime":194,"wgDiscussionToolsPageThreads":[{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Development_workflow","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Estimation-Development_workflow","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Working_on_a_ticket-Development_workflow","replies":[{"headingLevel":4,"name":"h-","type":"heading","level":0,"id":"h-Working_on_a_ticket_that's_not_on_the_kanban_board-Working_on_a_ticket","replies":[]}]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Reviewing_others'_work-Development_workflow","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Communication_expectations-Development_workflow","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-How_to_prepare_work_for_QA?-Development_workflow","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-GitHub_workflow","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Process-GitHub_workflow","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Tools_Deployment_workflow","replies":[]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Expectations_from_investigation_tickets","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Expected_preliminary_results-Expectations_from_investigation_tickets","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Expected_next_steps-Expectations_from_investigation_tickets","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Community_Tech_Maintenance","replies":[]}],"wgPageParseReport":{"discussiontools":{"limitreport-timeusage":"0.009"},"limitreport":{"cputime":"0.028","walltime":"0.038","ppvisitednodes":{"value":54,"limit":1000000},"postexpandincludesize":{"value":0,"limit":2097152},"templateargumentsize":{"value":0,"limit":2097152},"expansiondepth":{"value":2,"limit":100},"expensivefunctioncount":{"value":0,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":0,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 0.000 1 -total"]},"cachereport":{"origin":"mw-web.codfw.main-7dfb9d98f5-h927h","timestamp":"20241125205056","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>